mirror of
https://github.com/EpochModTeam/Epoch.git
synced 2024-08-30 18:22:13 +00:00
711e7aba06
Change call to configFile to new missionConfigFile CfgVehicleUpgrades. Add check for crypto client side before sent off to server for completion
359 lines
12 KiB
Plaintext
359 lines
12 KiB
Plaintext
/*
|
|
Author: Aaron Clark - EpochMod.com
|
|
|
|
Contributors:
|
|
|
|
Description:
|
|
Epoch consume item function
|
|
|
|
Licence:
|
|
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
|
|
|
|
Github:
|
|
https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_consumeItem.sqf
|
|
*/
|
|
//[[[cog import generate_private_arrays ]]]
|
|
private ["_buildClass","_buildingCountLimit","_buildingJammerRange","_canCapacity","_cfgBaseBuilding","_cfgItemInteractions","_color","_currentDMG","_currentFuel","_currentHIT","_fuelCapacity","_highestDMG","_inputCount","_interactAttributes","_interactOption","_interactReturnOnUse","_isOk","_isStorage","_magazineSize","_magazineSizeMax","_magazinesAmmoFull","_newDMG","_newFuel","_object","_otherObjects","_output","_paintCanColor","_paintCanIndex","_partCheck","_pos","_removeItem","_transportFuel","_unifiedInteract","_vehicle","_vehicles"];
|
|
//[[[end]]]
|
|
|
|
EPOCH_InteractedItem params ["_text","_item","_pic"];
|
|
|
|
_cfgBaseBuilding = 'CfgBaseBuilding' call EPOCH_returnConfig;
|
|
_cfgItemInteractions = ["CfgItemInteractions", _item] call EPOCH_returnConfigV2;
|
|
// _cfgItemInteractions = (('CfgItemInteractions' call EPOCH_returnConfig) >> _item);
|
|
|
|
_interactOption = getNumber(_cfgItemInteractions >> "interactAction");
|
|
_interactAttributes = getArray(_cfgItemInteractions >> "interactAttributes");
|
|
_interactReturnOnUse = getText(_cfgItemInteractions >> "interactReturnOnUse");
|
|
|
|
_inputCount = count _this;
|
|
if (_inputCount >= 1) then {
|
|
_interactOption = param [0,0];
|
|
};
|
|
if (_inputCount >= 2) then {
|
|
_interactAttributes = param [1,[]];
|
|
};
|
|
if (_inputCount >= 3) then {
|
|
_interactReturnOnUse = param [2,""];
|
|
};
|
|
|
|
// diag_log format["DEBUG: %1",[_interactOption,_interactAttributes,_interactReturnOnUse]];
|
|
|
|
_removeItem = {([player,_this] call BIS_fnc_invRemove) == 1};
|
|
|
|
_unifiedInteract = {
|
|
if (_item call _removeItem) then {
|
|
if (_interactReturnOnUse != "") then {
|
|
_interactReturnOnUse call EPOCH_fnc_addItemOverflow;
|
|
};
|
|
{
|
|
_output = _x call EPOCH_giveAttributes;
|
|
if (_output != "") then {
|
|
[_output, 5] call Epoch_message;
|
|
};
|
|
} foreach _interactAttributes;
|
|
};
|
|
};
|
|
|
|
switch _interactOption do {
|
|
case 0: {
|
|
_magazineSizeMax = getNumber (configfile >> "CfgMagazines" >> _item >> "count");
|
|
// allow repack for all magazines with greater than 1 bullet
|
|
if (_magazineSizeMax > 1) then {
|
|
|
|
_magazineSize = 0;
|
|
_magazinesAmmoFull = magazinesAmmoFull player;
|
|
{
|
|
if (_item isEqualTo (_x select 0)) then {
|
|
if (!(_x select 2)) then {
|
|
_magazineSize = _magazineSize + (_x select 1);
|
|
};
|
|
};
|
|
} forEach _magazinesAmmoFull;
|
|
|
|
// remove all
|
|
player removeMagazines _item;
|
|
|
|
// Add full magazines back to player
|
|
for "_i" from 1 to floor (_magazineSize / _magazineSizeMax) do
|
|
{
|
|
player addMagazine [_item, _magazineSizeMax];
|
|
};
|
|
// Add last non full magazine
|
|
if ((_magazineSize % _magazineSizeMax) > 0) then {
|
|
player addMagazine [_item, floor (_magazineSize % _magazineSizeMax)];
|
|
};
|
|
["Ammo Repacked", 5] call Epoch_message;
|
|
};
|
|
};
|
|
case 1: _unifiedInteract; // Eat 1
|
|
case 2: _unifiedInteract; //Drink 2
|
|
case 3: { // Build 3
|
|
closeDialog 0;
|
|
_buildingJammerRange = ["CfgEpochClient", "buildingJammerRange", 75] call EPOCH_fnc_returnConfigEntryV2;
|
|
_buildingCountLimit = ["CfgEpochClient", "buildingCountLimit", 200] call EPOCH_fnc_returnConfigEntryV2;
|
|
_partCheck = _item in (magazines player);
|
|
|
|
_buildClass = getText(_cfgItemInteractions >> "buildClass");
|
|
if (_buildClass != "" && _partCheck) then {
|
|
_isStorage = getNumber(_cfgItemInteractions >> "isStorage");
|
|
|
|
_isOk = if (_isStorage == 1 || _buildClass isKindOf "Secure_Storage_Temp") then { EPOCH_StorageSlotsCount > 0 } else { EPOCH_BuildingSlotCount > 0 };
|
|
|
|
if (isNil "EPOCH_simulSwap_Lock") then {
|
|
if !(isNil "_isOk") then {
|
|
if (_isOk) then {
|
|
|
|
if (_buildClass call EPOCH_isBuildAllowed) then {
|
|
|
|
if (EPOCH_playerEnergy > 0) then {
|
|
|
|
EPOCH_buildMode = 1;
|
|
EPOCH_buildDirection = 0;
|
|
|
|
// base building
|
|
_pos = player modelToWorldVisual[0, 5, 0];
|
|
_pos set[2, getPosATL player select 2];
|
|
|
|
if (_buildClass isKindOf "ThingX") then {
|
|
// prevent spawning if another simulated object exists still
|
|
_otherObjects = nearestObjects[player, [_buildClass], _buildingJammerRange];
|
|
if (_otherObjects isEqualTo []) then {
|
|
_object=createVehicle[_buildClass,_pos,[],0,"CAN_COLLIDE"];
|
|
_object setDir ((getDir player) - 180);
|
|
[format["Press '%1' to drop object.", "1"], 5] call Epoch_message;
|
|
if (([player, _item] call BIS_fnc_invRemove) == 1) then {
|
|
[_object] spawn EPOCH_simulSwap;
|
|
};
|
|
}
|
|
else {
|
|
["Building Disallowed: Frequency Unstable", 5] call Epoch_message;
|
|
};
|
|
}
|
|
else {
|
|
_object=createVehicle[_buildClass,_pos,[],0,"CAN_COLLIDE"];
|
|
_object setDir ((getDir player) - 180);
|
|
[format["Press '%1' to drop object.", "1"], 5] call Epoch_message;
|
|
[_object,_item] spawn EPOCH_staticMove;
|
|
};
|
|
}
|
|
else {
|
|
["Need Energy", 5] call Epoch_message;
|
|
};
|
|
};
|
|
} else {
|
|
["World limit reached", 5] call Epoch_message;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
case 4: { // Refuel 4
|
|
_vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30];
|
|
if (cursorTarget in _vehicles) then {
|
|
_vehicle = cursorTarget;
|
|
_currentFuel = fuel _vehicle;
|
|
_canCapacity = _interactAttributes param [0,10];
|
|
_fuelCapacity = getNumber (configfile >> "CfgVehicles" >> (typeOf _vehicle) >> "fuelCapacity");
|
|
_currentFuel = _currentFuel * _fuelCapacity;
|
|
_newFuel = _currentFuel + _canCapacity;
|
|
_newFuel = _newFuel / _fuelCapacity;
|
|
|
|
if (_item call _removeItem) then {
|
|
_interactReturnOnUse call EPOCH_fnc_addItemOverflow;
|
|
// send
|
|
[_vehicle,_newFuel,player,Epoch_personalToken] remoteExec ["EPOCH_server_fillVehicle",2];
|
|
|
|
["Fuel Added", 5] call Epoch_message;
|
|
};
|
|
};
|
|
};
|
|
case 5: {
|
|
_vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30];
|
|
_canCapacity = _interactAttributes param [0,10];
|
|
if (cursorTarget in _vehicles) then {
|
|
_vehicle = cursorTarget;
|
|
_fuelCapacity = getNumber (configfile >> "CfgVehicles" >> (typeOf _vehicle) >> "fuelCapacity");
|
|
_newFuel = (((fuel _vehicle) * _fuelCapacity) - _canCapacity) / _fuelCapacity;
|
|
if (_newFuel > 0) then {
|
|
if (_item call _removeItem) then {
|
|
_interactReturnOnUse call EPOCH_fnc_addItemOverflow;
|
|
[_vehicle,_newFuel,player,Epoch_personalToken] remoteExec ["EPOCH_server_fillVehicle",2];
|
|
["Fuel Siphoned", 5] call Epoch_message;
|
|
};
|
|
} else {
|
|
["Not Enough Fuel", 5] call Epoch_message;
|
|
};
|
|
} else {
|
|
|
|
// find any other nearby fuel sources
|
|
_transportFuel = 0;
|
|
{
|
|
_transportFuel = _transportFuel + getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "transportFuel");
|
|
} forEach (player nearObjects["ALL", 6]);
|
|
|
|
if (_transportFuel > _canCapacity) then {
|
|
if (_item call _removeItem) then {
|
|
_interactReturnOnUse call EPOCH_fnc_addItemOverflow;
|
|
["Fuel Siphoned", 5] call Epoch_message;
|
|
};
|
|
} else {
|
|
["Not Enough Fuel", 5] call Epoch_message;
|
|
};
|
|
};
|
|
};
|
|
case 6: _unifiedInteract; //Clean -25
|
|
case 7: _unifiedInteract; //Warm + 1
|
|
case 8: _unifiedInteract; //Cold -1
|
|
case 9: _unifiedInteract; //Energy 100
|
|
case 10: { // Repair 10 - Lite
|
|
_vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30];
|
|
_vehicle = cursorTarget;
|
|
if (_vehicle in _vehicles) then {
|
|
|
|
if (_item call _removeItem) then {
|
|
|
|
_highestDMG = 0;
|
|
_currentHIT = -1;
|
|
_currentDMG = 0;
|
|
{
|
|
_currentDMG = _x;
|
|
if (_currentDMG > _highestDMG) then {
|
|
_highestDMG = _currentDMG;
|
|
_currentHIT = _forEachIndex;
|
|
};
|
|
}forEach ((getAllHitPointsDamage _vehicle) param [2,[]]);
|
|
|
|
if (_highestDMG > 0) then {
|
|
|
|
_newDMG = ((_highestDMG - 0.5) max 0);
|
|
|
|
if (local _vehicle) then {
|
|
[_vehicle, [_currentHIT, _newDMG]] call EPOCH_client_repairVehicle;
|
|
} else {
|
|
[_vehicle,[_currentHIT,_newDMG],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2];
|
|
};
|
|
|
|
} else {
|
|
if ((damage _vehicle) > 0) then {
|
|
[_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2];
|
|
};
|
|
};
|
|
["Vehicle Partially Repaired", 5] call Epoch_message;
|
|
};
|
|
};
|
|
};
|
|
case 11: { // Repair 11 - Heavy
|
|
_vehicles = player nearEntities [["LandVehicle","Ship","Air","Tank"], 30];
|
|
_vehicle = cursorTarget;
|
|
if (_vehicle in _vehicles) then {
|
|
if (_item call _removeItem) then {
|
|
[_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2];
|
|
["Vehicle Fully Repaired", 5] call Epoch_message;
|
|
};
|
|
};
|
|
};
|
|
|
|
// case 12 consume paincan and set texture on base object (only if has slot and is static)
|
|
case 12: {
|
|
closeDialog 0;
|
|
_vehicles = player nearObjects["Const_WoodWalls_static_F", 5];
|
|
_vehicle = cursorTarget;
|
|
if (_vehicle in _vehicles) then {
|
|
if ("" call EPOCH_isBuildAllowed) then {
|
|
_color = getArray(_cfgBaseBuilding >> (typeOf _vehicle) >> "availableTextures");
|
|
if !(_color isEqualTo[]) then {
|
|
|
|
if (_item call _removeItem) then {
|
|
|
|
// find _paintCanIndex from config
|
|
_paintCanIndex = getNumber(_cfgItemInteractions >> "textureIndex");
|
|
_paintCanColor = getText(_cfgItemInteractions >> "colorName");
|
|
|
|
[_vehicle,_paintCanIndex,player,Epoch_personalToken] remoteExec ["EPOCH_server_paintBUILD",2];
|
|
|
|
[format["Wall Painted %1", _paintCanColor], 5] call Epoch_message;
|
|
};
|
|
};
|
|
}
|
|
else {
|
|
["Disallowed", 5] call Epoch_message;
|
|
};
|
|
};
|
|
};
|
|
|
|
case 13: { //Heal Player
|
|
_vehicles = player nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 6];
|
|
_vehicle = cursorTarget;
|
|
if (_vehicle in _vehicles) then {
|
|
if (damage _vehicle != 0 || {_x > 0} count ((getallhitpointsdamage _vehicle) select 2) > 0) then {
|
|
if (_item call _removeItem) then {
|
|
[_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2];
|
|
["Healed other player", 5] call Epoch_message;
|
|
};
|
|
};
|
|
} else {
|
|
if (damage player != 0 || {_x > 0} count ((getallhitpointsdamage player) select 2) > 0) then {
|
|
if (_item call _removeItem) then {
|
|
[player,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2];
|
|
["Healed yourself", 5] call Epoch_message;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
case 14: { // Unpack Backpack
|
|
if (_item call _removeItem) then {
|
|
[_interactReturnOnUse,player,Epoch_personalToken] remoteExec ["EPOCH_server_unpackBackpack",2];
|
|
["Unpacked backpack", 5] call Epoch_message;
|
|
};
|
|
};
|
|
|
|
case 15: { // Vehicle Upgrade
|
|
_canUpgrade = true;
|
|
_nearveh = nearestObjects[player,["Car","Truck","Heli","Boat","Plane"],15];
|
|
if (_nearveh isequalto []) exitwith {
|
|
["No Vehicle for upgrade found",5] call Epoch_message;_canUpgrade = false;
|
|
};
|
|
_veh = _nearveh select 0;
|
|
_vehType = typeOf _veh;
|
|
_classUpgrade = isClass(missionConfigFile >> "CfgVehicleUpgrades" >> _vehType);
|
|
if!(_classUpgrade)exitWith{
|
|
["Vehicle can't be upgraded",5] call Epoch_message;_canUpgrade = false;
|
|
};
|
|
_reqMaterials = getArray(missionConfigFile >> "CfgVehicleUpgrades" >> _vehType >> "ReqMaterials");
|
|
_crypto = 0;
|
|
if(_reqMaterials isEqualTo [])exitWith{
|
|
["Required Materials list not found, report this error to an admin",5] call Epoch_message;_canUpgrade = false;
|
|
};
|
|
{
|
|
if((_x select 1) isEqualTo "Crypto")then{
|
|
_crypto = _x select 0;
|
|
if(EPOCH_playerCrypto < _crypto)exitWith{
|
|
[format["You need %1 crypto to upgrade your %2", _crypto, _vehType],5] call Epoch_message;_canUpgrade = false;
|
|
};
|
|
};
|
|
if(!((_x select 1) in (magazines player)) && !((_x select 1) isEqualTo "Crypto"))exitWith{
|
|
[format["You do not have the required materials to upgrade your %1",_vehType],5] call Epoch_message;_canUpgrade = false;
|
|
};
|
|
}forEach _reqMaterials;
|
|
if(_canUpgrade)then{
|
|
{
|
|
_count = _x select 0;
|
|
_upgradeItem = _x select 1;
|
|
for "_i" from 1 to _count do{
|
|
if!(_upgradeItem isEqualTo "Crypto")then{
|
|
player removeItem _upgradeItem;
|
|
};
|
|
};
|
|
}forEach _reqMaterials;
|
|
_upgradeToVeh = getText(missionConfigFile >> "CfgVehicleUpgrades" >> _vehType >> "upgradeToVehicle");
|
|
[[_veh,_upgradeToVeh,_crypto],player,Epoch_personalToken] remoteExec ["EPOCH_server_upgrade_vehicle",2];
|
|
};
|
|
};
|
|
|
|
default {
|
|
["Found nothing", 5] call Epoch_message;
|
|
};
|
|
};
|