diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server.pbo index 2f616f04..48eb8e92 100644 Binary files a/Server_Install_Pack/@epochhive/addons/epoch_server.pbo and b/Server_Install_Pack/@epochhive/addons/epoch_server.pbo differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo index 82629d0c..beede329 100644 Binary files a/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo and b/Server_Install_Pack/@epochhive/addons/epoch_server_settings.pbo differ diff --git a/Server_Install_Pack/@epochhive/epochconfig.hpp b/Server_Install_Pack/@epochhive/epochconfig.hpp index c243595b..d2fa5719 100644 --- a/Server_Install_Pack/@epochhive/epochconfig.hpp +++ b/Server_Install_Pack/@epochhive/epochconfig.hpp @@ -88,6 +88,7 @@ forceRestartTime = 14400; // 4 hour restarts // BaseBuilding StorageSlotsLimit = 1500; // Max storage slots allowed. Warning! Higher the number lower performance. BuildingSlotsLimit = 1500; // Max building slots allowed. Warning! Higher the number lower performance. + AutoLockStorages = "false"; // Auto Lock Lockable Storages on Server Start / Restart (if true, unlocked storages will get locked after restarts) UseIndestructible = "false"; // Enable / Disable Indestructible BaseObjects IndestructibleBaseObjects[] = { // Can be Names or Classes "Constructions_static_F", @@ -107,6 +108,8 @@ forceRestartTime = 14400; // 4 hour restarts UseDeSimulateObjects = "true"; // Disable Simulation for specifed Base Objects DeSimulateObjects[] = { // Base Objects to disable Simulation. Can be Names or Classes "PlotPole_EPOCH", + "PlotPole_L_EPOCH", + "PlotPole_XL_EPOCH", "WoodFoundation_EPOCH","Foundation_EPOCH", "WoodQuarterFloor_EPOCH","WoodHalfFloor_EPOCH","WoodFloor_EPOCH", "MetalQuarterFloor_EPOCH","MetalHalfFloor_EPOCH","MetalFloor_EPOCH", diff --git a/Server_Install_Pack/mpmissions/epoch.Altis.pbo b/Server_Install_Pack/mpmissions/epoch.Altis.pbo index 9e00e8c0..cb369f50 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Altis.pbo and b/Server_Install_Pack/mpmissions/epoch.Altis.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Australia.pbo b/Server_Install_Pack/mpmissions/epoch.Australia.pbo index c2f1e1d4..97e10a7b 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Australia.pbo and b/Server_Install_Pack/mpmissions/epoch.Australia.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo index 5bf54c4c..f5c0fd32 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo b/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo index 6cc50979..086e553b 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo and b/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo b/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo index eb4a33ef..c9e69322 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo and b/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.ChernarusRedux.pbo b/Server_Install_Pack/mpmissions/epoch.ChernarusRedux.pbo index d6c36d0b..5ba9bb5c 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.ChernarusRedux.pbo and b/Server_Install_Pack/mpmissions/epoch.ChernarusRedux.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo b/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo index 299d5a3c..38ad93dc 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo and b/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo b/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo index a1eceae4..89472500 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo and b/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Esseker.pbo b/Server_Install_Pack/mpmissions/epoch.Esseker.pbo index cdd1d467..bafb74f0 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Esseker.pbo and b/Server_Install_Pack/mpmissions/epoch.Esseker.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.IslaDuala3.pbo b/Server_Install_Pack/mpmissions/epoch.IslaDuala3.pbo index 8a5b3737..b3a979cb 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.IslaDuala3.pbo and b/Server_Install_Pack/mpmissions/epoch.IslaDuala3.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Kapaulio.pbo b/Server_Install_Pack/mpmissions/epoch.Kapaulio.pbo index 5ca7cfab..08984df3 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Kapaulio.pbo and b/Server_Install_Pack/mpmissions/epoch.Kapaulio.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Malden.pbo b/Server_Install_Pack/mpmissions/epoch.Malden.pbo index d2ec13d9..5bf42ab3 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Malden.pbo and b/Server_Install_Pack/mpmissions/epoch.Malden.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo index 10546c9c..02c941d5 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Napf.pbo b/Server_Install_Pack/mpmissions/epoch.Napf.pbo index a7893fda..8f5cf7c3 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Napf.pbo and b/Server_Install_Pack/mpmissions/epoch.Napf.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Panthera3.pbo b/Server_Install_Pack/mpmissions/epoch.Panthera3.pbo index c4193589..97dec986 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Panthera3.pbo and b/Server_Install_Pack/mpmissions/epoch.Panthera3.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Porto.pbo b/Server_Install_Pack/mpmissions/epoch.Porto.pbo index eea0f6e8..638a2c2a 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Porto.pbo and b/Server_Install_Pack/mpmissions/epoch.Porto.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo b/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo index ea6d1fb4..fb26c944 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo and b/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Sara.pbo b/Server_Install_Pack/mpmissions/epoch.Sara.pbo index c221801e..e5d4d35a 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Sara.pbo and b/Server_Install_Pack/mpmissions/epoch.Sara.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo b/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo index b3b1d438..343e650c 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo and b/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo b/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo index 8cf05686..37634833 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo and b/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo b/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo index e780e06b..27aba7cf 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo and b/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Stratis.pbo b/Server_Install_Pack/mpmissions/epoch.Stratis.pbo index 85fd11fc..bd6ade13 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Stratis.pbo and b/Server_Install_Pack/mpmissions/epoch.Stratis.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Takistan.pbo b/Server_Install_Pack/mpmissions/epoch.Takistan.pbo index 589dc090..f7a60e22 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Takistan.pbo and b/Server_Install_Pack/mpmissions/epoch.Takistan.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo b/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo index de4c6401..385034b3 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo and b/Server_Install_Pack/mpmissions/epoch.Tanoa.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.VR.pbo b/Server_Install_Pack/mpmissions/epoch.VR.pbo index 12725e24..a7276a37 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.VR.pbo and b/Server_Install_Pack/mpmissions/epoch.VR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Winthera3.pbo b/Server_Install_Pack/mpmissions/epoch.Winthera3.pbo index 32df313e..447d4810 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Winthera3.pbo and b/Server_Install_Pack/mpmissions/epoch.Winthera3.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo index 51e7e144..9c3c5425 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo b/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo index bb01fc50..315768e3 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo and b/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.abramia.pbo b/Server_Install_Pack/mpmissions/epoch.abramia.pbo index 133ff721..bb32c33b 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.abramia.pbo and b/Server_Install_Pack/mpmissions/epoch.abramia.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.dingor.pbo b/Server_Install_Pack/mpmissions/epoch.dingor.pbo index fcb790c0..f255f385 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.dingor.pbo and b/Server_Install_Pack/mpmissions/epoch.dingor.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.lingor3.pbo b/Server_Install_Pack/mpmissions/epoch.lingor3.pbo index 646e9d21..fc5e3ce4 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.lingor3.pbo and b/Server_Install_Pack/mpmissions/epoch.lingor3.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.utes.pbo b/Server_Install_Pack/mpmissions/epoch.utes.pbo index 79363079..e9c7f10c 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.utes.pbo and b/Server_Install_Pack/mpmissions/epoch.utes.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo b/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo index 8a6a5a16..fcfa21ae 100644 Binary files a/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo and b/Server_Install_Pack/mpmissions/epoch_RyanZed.Tanoa.pbo differ diff --git a/Server_Install_Pack/sc/battleye/remoteexec.txt b/Server_Install_Pack/sc/battleye/remoteexec.txt index ceb2e05f..109365ee 100644 --- a/Server_Install_Pack/sc/battleye/remoteexec.txt +++ b/Server_Install_Pack/sc/battleye/remoteexec.txt @@ -1 +1 @@ -5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_(checkplayer|save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player) \[.+\]" !="epoch_server_((upgrade|updateplayer|inviteplayer|create|delete)(Temp|)Group) \[.+\]" !="epoch_server_(deadplayerdetonate|triggerantagonist|playersetvariable|missioncomms|make(marker|SP)|removemarker) \[.+\]" !="epoch_server_(upgrade_vehicle|knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(paycrypto|tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer|client_bitePlayer|serverlootobject|fnc_updateplayerstats) \[.+\]" !="cup_fnc_handletow \[.+\]" !="bis_fnc_reviveinitaddplayer \[.+\]" !="epoch_server_(setfinalplayerpos|defusebomb) \[.+\]" +5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_(checkplayer|save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player) \[.+\]" !="epoch_server_((upgrade|updateplayer|inviteplayer|create|delete)(Temp|)Group) \[.+\]" !="epoch_server_(deadplayerdetonate|triggerantagonist|playersetvariable|missioncomms|make(marker|SP)|removemarker) \[.+\]" !="epoch_server_(upgrade_vehicle|knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(paycrypto|tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer|client_bitePlayer|serverlootobject|fnc_updateplayerstats) \[.+\]" !="cup_fnc_handletow \[.+\]" !="bis_fnc_reviveinitaddplayer \[.+\]" !="epoch_server_(setfinalplayerpos|defusebomb|putcrypto) \[.+\]" diff --git a/Server_Install_Pack/sc/battleye/scripts.txt b/Server_Install_Pack/sc/battleye/scripts.txt index 08a914c8..e2e2c165 100644 --- a/Server_Install_Pack/sc/battleye/scripts.txt +++ b/Server_Install_Pack/sc/battleye/scripts.txt @@ -2,12 +2,12 @@ 5 "BIS_fnc_dynamictext" !="\"BIS_fnc_dynamictext\"" !="'BIS_fnc_dynamictext'" 5 forceRespawn !="ForceRespawnDuration" !="reviveHandleForceRespawnAction" !="forcerespawn player;" 5 setWeaponReloadingTime !="_unit setWeaponReloadingTime [_unit,_weapon,1];" !="_unit setWeaponReloadingTime [_unit,_weapon,1];" !="player fire [_muzzle, _muzzle, _item];\nplayer setWeaponReloadingTime [player, _muzzle, 0];" -5 allMissionObjects !="[\"Epoch_Plotpoles\",allmissionobjects 'PlotPole_EPOCH']" !="allMissionObjects \"Timeline_F\"" +5 allMissionObjects !="[\"Epoch_Plotpoles\",allmissionobjects 'PlotPole_EPOCH']" !="allMissionObjects \"Timeline_F\"" !="_allplots append (allmissionobjects _x)" 5 showCommandingMenu !="showCommandingMenu '';" !="showCommandingMenu '#USER:" 5 setvelocity !="setVelocityTarget" !="_bolt setPosATL _pos;\n_bolt setVelocity [0, 0, -10];" !="EPOCH_target setvelocitytransformation" !="_currentTarget setVelocity [0,0,-0.01];" !="_head setVelocity [\n(sin _dir * _speed), \n(cos _dir * _speed)" !="_vel = velocity this; _dir = getDir player; this setVelocity[(_vel select 0)+(sin _dir * 2),(_vel select 1)+(cos _dir * 2),(_vel select 2)];" !="_head setVelocity [random 2,random 2,10];" !="_bobber setVelocity [0,-1,-10];" !="_x setvelocity [0,0,0.1];" !="_veh setVelocity [0,0,0];" !="_this select 0 setvelocity (_this select 1)" !="_zombie setVelocityTransformation [_aslPos,_aslPos,_unitV,_unitV,_unitvDir,_vDir,_unitvUp,_unitvUp,2];" !="_smokeg setVelocity _Gvel;" 5 assignAs !"assignAsCargo" !="_unit assignAsGunner _axeCopter;" !="_driver assignAsDriver _axeCopter;" !="axeVIP assignAsDriver vehicle axeVIP;" 5 assignAsCargo !="_x assignAsCargo axeGeneralsBoat;" !="axeVIP assignAsCargo vehicle player;" !="axeVIP assignAsCargo vehicle axeVIP;" -5 allowDamage !="_unit allowDamage false;" !="_unit allowDamage true;" !="player allowDamage true;" !="vehicle player allowDamage true;" !="player allowDamage false;" !="_target allowDamage true;" !="_cargo allowDamage false;" +5 allowDamage !="_unit allowDamage false;" !="_unit allowDamage true;" !="player allowDamage true;" !="vehicle player allowDamage true;" !="player allowDamage false;" !="_target allowDamage true;" !="_cargo allowDamage false;" !="if (_god) then {_vehicle allowdamage" 5 addWeaponCargo !="_acceptHolder addWeaponCargo [_wWeapon, 1] ;" !="CBA_fnc_addWeaponCargo" !="\\fnc_addWeaponCargo" !="\"addWeaponCargo" !="cba_fAddWeaponCargo" 5 onMapSingleClick !="onMapSingleClick '';" !="\"onmapsingleclick\"" 5 addMagazine !"addMagazineCargo" !="player addMagazine [_item,_count];" !="player addMagazine \"sledge_swing\";" !="player addMagazine \"Hatchet_swing\";" !="player addMagazine \"stick_swing\";" !="_wh addMagazineAmmoCargo[_item, 1, _count];" !="CBA_fnc_addMagazine" !="\\fnc_addMagazine" !="\"addMagazine" !="vehicle player addMagazineTurret" !="vehicle player addMagazineTurret" !="EPOCH_fnc_addMagazineOverflow" !="_vehicle addMagazineTurret [_ammotype, _turret, _ammocount]" @@ -23,16 +23,16 @@ 5 createVehicleLocal !="\"Sign_Arrow_Direction_Yellow_F\" createVehicleLocal" !="\"#particlesource\" createVehicleLocal" !="\"#lightpoint\" createVehicleLocal" !="\"BloodSplat\" createVehicleLocal" !="[\"lightning1_F\", \"lightning2_F\"] call BIS_fnc_selectRandom;\n_lighting = _class createVehicleLocal" !="SLX_XEH_DUMMY createVehicleLocal [0, 0, 0];" !="CBA_eventHandlers = \"Logic\" createVehicleLocal [0, 0];" 5 createUnit !="_driver = _grp createUnit[\"I_UAV_AI\", position _unit, [], 0, \"CAN_COLLIDE\"];" !="axeGeneral = grpVIPGeneral createUnit [\"I_officer_F\", axeGeneralPos, [], 1, \"CAN_COLLIDE\"];" !="bis_functions_mainscope = _grpLogic createunit [\"Logic\",[9,9,9],[],0,\"none\"];" !="_unit = _grp createUnit[selectRandom _arrUnits, _pos, [], 0, \"FORM\"];" !="_driver = (group player) createUnit[\"I_UAV_AI\", position axeUAV, [], 0, \"CAN_COLLIDE\"];" 5 createAgent !="bis_revive_ratioLethal = createAgent [\"Logic\", [10,10,0], [], 0, \"CAN_COLLIDE\"];" !="_unit = createAgent[_unitClass, _targetPos, [], 256, \"FORM\"];" !="_unit = createAgent [_unitClass, _targetPos, [], 120, \"FORM\"];" !="_animal = createAgent[_randomAIClass, _animalPos, [], 5, \"NONE\"];" !="_unit = createAgent [\"Epoch_Cloak_F\", _pos, [], 0, \"CAN_COLLIDE\"];" !="_unit = createAgent [\"Epoch_Sapper_F\", _targetPos, [], 180, \"FORM\"];" !="_sapper = createAgent [\"Epoch_Sapper_F\", getPos _cage2, [], 0, \"FORM\"];" !="_unit = createAgent[_unitClass, position player, [], _zRange, \"FORM\"];" !="_animal = createAgent[_randomAIClass, _animalPos, [], 0, \"CAN_COLLIDE\"];" !="_axeSapper = createAgent [\"Epoch_Sapper_F\", _pos, [], 12, \"FORM\"];" !="_nestMate = createAgent [\"Epoch_Sapper_F\", _garrPos, [], 0, \"FORM\"];" -5 createDialog !="createDialog 'server_info_picture'" !="createdialog 'epoch_tablet_gui'" !="createdialog 'Epoch_CamDialog'" !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog _tapDiag;" !="if !(createdialog \"Trade\") exitWith {};" !="_ok = createdialog \"Interact\";" !="_ok = createdialog \"TradeNPCMenu\";" !="createDialog \"Epoch_myGroup\";" !="createDialog (if ((Epoch_my_GroupUID == \"\") && (Epoch_my_Group isEqualTo [])) then {\"EPOCH_createGrp\"} else {\"Epoch_myGroup\"});" !="createDialog \"GroupRequests\";" !="_ok = createdialog \"MissionSelect\";" !="createDialog 'Skaronator_AdminMenu';" !="createDialog \"Epoch_myTempGroup\";" !="createDialog (if ((Epoch_my_tempGroupUID == \"\") && (Epoch_my_tempGroup isEqualTo [])) then {\"EPOCH_createTempGrp\"} else {\"Epoch_myTempGroup\"});" !="createDialog \"tempGroupRequests\";" +5 createDialog !="createDialog 'server_info_picture'" !="createdialog 'epoch_tablet_gui'" !="createdialog 'Epoch_CamDialog'" !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog _tapDiag;" !="if !(createdialog \"Trade\") exitWith {};" !="_ok = createdialog \"Interact\";" !="_ok = createdialog \"TradeNPCMenu\";" !="createDialog \"Epoch_myGroup\";" !="createDialog (if ((Epoch_my_GroupUID == \"\") && (Epoch_my_Group isEqualTo [])) then {\"EPOCH_createGrp\"} else {\"Epoch_myGroup\"});" !="createDialog \"GroupRequests\";" !="_ok = createdialog \"MissionSelect\";" !="createDialog 'Skaronator_AdminMenu';" !="createDialog \"Epoch_myTempGroup\";" !="createDialog (if ((Epoch_my_tempGroupUID == \"\") && (Epoch_my_tempGroup isEqualTo [])) then {\"EPOCH_createTempGrp\"} else {\"Epoch_myTempGroup\"});" !="createDialog \"tempGroupRequests\";" !="createdialog 'EPOCH_SimpleInput';" 5 createDisplay !="createDisplay \"rmx_dynamenu\";" !="createDisplay \"rmx_moveDynamicHUD\";" !="_parent createdisplay _displayClass;" !="finddisplay 151 createdisplay 'RscDisplayOptionsLayout'" !="_display createdisplay \"RscDisplayDLCPreview\";" 5 deleteMarker !="deleteMarkerLocal _mName;" 5 setMarker !="CBA_fnc_setMarkerPersistent\"" !="\\fnc_setMarkerPersistent" !="\"setMarkerPersistent" !="_mName setMarkerShapeLocal _mShape;" !="_mName setMarkerTypeLocal _mType;" !="(_x select 0) setMarkerPosLocal (position player);" !="_zoomMarker setMarkerSizeLocal" 5 createMarker !="CBA_fnc_createMarker\"" !="\\fnc_createMarker" !="\"createMarker" !="cba_fCreateMarker" !="createMarkerLocal [_mName, _mPos];" 5 assignItem !="axeVIP assignItem _item;" !="unassignItem" -5 ctrlSetEventHandler !="ctrlSetEventHandler [\"mouseButtonDown\", _action];" !="_ctrlButtonOK ctrlseteventhandler [\"buttonclick\"," !="ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn'," !="_ctrl ctrlSetEventHandler [\"mouseEnter\"" !="_ctrlBtn ctrlSetEventHandler [\"MouseButtonDblClick\", _verAct];" !="_button_gen ctrlSetEventHandler [\"ButtonClick\",_btn_code + \"(uiNamespace getVariable [\"" !="t \"#(rgb,8,8,3)color(1,1,1,0.1)\";\n_c ctrlCommit 0;\n_c ctrlSetEventHandler [\"MouseButtonUp\",format[\"['remove',%1,(_this select 1)" +5 ctrlSetEventHandler !="ctrlSetEventHandler [\"mouseButtonDown\", _action];" !="_ctrlButtonOK ctrlseteventhandler [\"buttonclick\"," !="ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn'," !="_ctrl ctrlSetEventHandler [\"mouseEnter\"" !="_ctrlBtn ctrlSetEventHandler [\"MouseButtonDblClick\", _verAct];" !="_button_gen ctrlSetEventHandler [\"ButtonClick\",_btn_code + \"(uiNamespace getVariable [\"" !="t \"#(rgb,8,8,3)color(1,1,1,0.1)\";\n_c ctrlCommit 0;\n_c ctrlSetEventHandler [\"MouseButtonUp\",format[\"['remove',%1,(_this select 1)" !="ctrlSetEventHandler [\"ButtonClick\",\"_slider = ((finddisplay 602) displayCtrl 654001);" 5 addEventHandler !"displayAddEventHandler" !"ctrlAddEventHandler" !="player addeventhandler [\"PostReset\",{BIS_EnginePPReset = true;} ];" !="player addEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="\"CBA_fnc_addEventHandler\"" !="\\fnc_addEventHandler" !="\"addEventHandler" !="_eventFunc = _eventFunc + \"(_this select 0) addEventHandler ['Respawn', \" + str _eventFunc + \"];\";" !="_unit addEventHandler [\"hitpart\"," !="CBA_fnc_addEventHandler" !="_unit addEventHandler [_x, format ['call cba_xeh_fnc_%1', _x]];" !="_ship addEventHandler [\"AttributesChanged3DEN\"" !="addEventHandler [\"HandleDamage\",bis_fnc_reviveOnPlayerHandleDamage];" !="_unit addEventHandler [\"FiredNear\"" !="_smokeEH = _plyr addEventHandler [\"FiredNear\", \"airDropHandle setFSMVariable" !="_onContactEH = _currentTarget addEventHandler[\"EpeContactStart"" !="_object addeventhandler [\"local\",{[[_this select 0],\"bis_fnc_objectVar\"" -5 displayAddEventHandler !="(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !="displayAddEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="displayaddeventhandler [\"mousemoving\"," !="_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'" !="_display displayaddeventhandler [_x,_fnc_animate];" !="Development\") then\n{\n_display displayaddeventhandler [\n\"keydown\"" !="CBA_fnc_addDisplayHandler" !="_display displayAddEventHandler [\"MouseMoving" !="private _handler = _display displayAddEventHandler [_key, _code];" !="_display displayAddEventHandler [\"KeyDown\", \"_this call cba_keybinding_fnc_onKeyDown\"" !="isplay 602};\n\n_display = (findDisplay 602);\n_display displayAddEventHandler [\"MouseButtonUp\",\"[] spawn {rmx_var_fav_selected = f" !="displayaddeventhandler\n[\n\"mousemoving\"" -5 ctrlAddEventHandler !="_control = _display displayctrl 37305; \n_control ctrladdeventhandler" !="_ctrlMap = _display displayctrl 101;\n_ctrlMap ctrladdeventhandler" !="_display displayctrl 21995;\n_assetsButton ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2406; \n_control ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2400;\n_control ctrladdeventhandler [\"buttonclick\"," !="ctrladdeventhandler [\"lbselchanged\"," !="ctrladdeventhandler [\n\"lbselchanged\"," !="_ButtonGeneral ctrladdeventhandler [\"buttonclick\"," !="_ctrlExecuteLocal ctrladdeventhandler [\"buttonclick\"," !="_bg ctrlAddEventHandler [\"MouseEnter\"," !="_container ctrlAddEventHandler [\"LBDblClick\",\"_this call EPOCH_itemInteractClick\"];" !="(uiNamespace getVariable 'ESP_map') ctrlAddEventHandler['Draw', '_esp_targets = EPOCH_ESPMAP_TARGETS;" !="ctrlAddEventHandler ['MouseButtonDown'" !="_ctrl ctrlSetEventHandler [\"mouseEnter\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseExit\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseButtonDown\", (format [\"call %1;\",(_buttonSettings select _e select 2)])];" !="_prevButton ctrlAddEventHandler [\"MouseButtonUp\", {_this call cba_diagnostic_fnc_debug" !="BIS_RscRespawnControlsMap_ctrlHeaderRespawnButton ctrlAddEventhandler [\"ButtonDown\"" !="_control = _display displayctrl 105;\n_control ctrladdeventhandler [\"MouseButtonUp\"" !="ctrlHeaderRespawnButton\", controlNull]) ctrlAddEventhandler [\"ButtonDown\"" !="_selected = false;\n{\n_c = _display displayCtrl _x;\n_c ctrlAddEventHandler [\"LBDrag\",\"rmx_var_favBar_Item = (_this call epoch_fav" !="_ctrlMouseArea ctrladdeventhandler [\"setfocus\",{with uinamespace do {[\"dlcClear\",[ctrlpar" !="13484 ctrlAddEventHandler [\"ButtonClick\", {[\"executeButton\"," +5 displayAddEventHandler !="(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !="displayAddEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="displayaddeventhandler [\"mousemoving\"," !="_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'" !="_display displayaddeventhandler [_x,_fnc_animate];" !="Development\") then\n{\n_display displayaddeventhandler [\n\"keydown\"" !="CBA_fnc_addDisplayHandler" !="_display displayAddEventHandler [\"MouseMoving" !="private _handler = _display displayAddEventHandler [_key, _code];" !="_display displayAddEventHandler [\"KeyDown\", \"_this call cba_keybinding_fnc_onKeyDown\"" !="isplay 602};\n\n_display = (findDisplay 602);\n_display displayAddEventHandler [\"MouseButtonUp\",\"[] spawn {rmx_var_fav_selected = f" !="displayaddeventhandler\n[\n\"mousemoving\"" !="_ctrlBohemia ctrlcommit 0;\n\n\n_display displayaddeventhandler" +5 ctrlAddEventHandler !="_control = _display displayctrl 37305; \n_control ctrladdeventhandler" !="_ctrlMap = _display displayctrl 101;\n_ctrlMap ctrladdeventhandler" !="_display displayctrl 21995;\n_assetsButton ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2406; \n_control ctrladdeventhandler [\"buttonclick\"," !="_display displayctrl 2400;\n_control ctrladdeventhandler [\"buttonclick\"," !="ctrladdeventhandler [\"lbselchanged\"," !="ctrladdeventhandler [\n\"lbselchanged\"," !="_ButtonGeneral ctrladdeventhandler [\"buttonclick\"," !="_ctrlExecuteLocal ctrladdeventhandler [\"buttonclick\"," !="_bg ctrlAddEventHandler [\"MouseEnter\"," !="_container ctrlAddEventHandler [\"LBDblClick\",\"_this call EPOCH_itemInteractClick\"];" !="(uiNamespace getVariable 'ESP_map') ctrlAddEventHandler['Draw', '_esp_targets = EPOCH_ESPMAP_TARGETS;" !="ctrlAddEventHandler ['MouseButtonDown'" !="_ctrl ctrlSetEventHandler [\"mouseEnter\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseExit\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseButtonDown\", (format [\"call %1;\",(_buttonSettings select _e select 2)])];" !="_prevButton ctrlAddEventHandler [\"MouseButtonUp\", {_this call cba_diagnostic_fnc_debug" !="BIS_RscRespawnControlsMap_ctrlHeaderRespawnButton ctrlAddEventhandler [\"ButtonDown\"" !="_control = _display displayctrl 105;\n_control ctrladdeventhandler [\"MouseButtonUp\"" !="ctrlHeaderRespawnButton\", controlNull]) ctrlAddEventhandler [\"ButtonDown\"" !="_selected = false;\n{\n_c = _display displayCtrl _x;\n_c ctrlAddEventHandler [\"LBDrag\",\"rmx_var_favBar_Item = (_this call epoch_fav" !="_ctrlMouseArea ctrladdeventhandler [\"setfocus\",{with uinamespace do {[\"dlcClear\",[ctrlpar" !="13484 ctrlAddEventHandler [\"ButtonClick\", {[\"executeButton\"," !="_ctrlButtonPurchase ctrladdeventhandler" 5 removeAllEventHandlers !"ctrlRemoveAllEventHandlers" !"displayRemoveAllEventHandlers" !="_vehicle removeAllEventHandlers \"GetOut\";" !="_sapper removeAllEventHandlers \"Hit\";\n_sapper removeAllEventHandlers \"FiredNear\";" !="_unit removeAllEventHandlers \"Hit\";\n_unit removeAllEventHandlers \"FiredNear\";" !="{_ship removeAllEventHandlers _x;} forEach [\"AttributesChanged3DEN\"" !="_zombie removeAllEventHandlers \"Hit\";" !="_zombie removeAllEventHandlers \"FiredNear\";" 5 displayRemoveAllEventHandlers !="_display displayRemoveAllEventHandlers _x;" !="if !(isMultiplayer) then { { (findDisplay 46) displayRemoveAllEventHandlers _x } forEach [\"KeyUp\", \"KeyDown\"] };" 5 removeAllMissionEventHandlers diff --git a/Sources/epoch_code/System/EPOCH_zombie_brain.fsm b/Sources/epoch_code/System/EPOCH_zombie_brain.fsm index 3bf5a9ce..15d02b8d 100644 --- a/Sources/epoch_code/System/EPOCH_zombie_brain.fsm +++ b/Sources/epoch_code/System/EPOCH_zombie_brain.fsm @@ -109,7 +109,6 @@ class FSM "_checkFreq = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""reflexSpeed"");" \n "_welcomeWait = random 4;" \n "_config = 'CfgEpochClient' call EPOCH_returnConfig;" \n - "_jammerRange = getNumber(_config >> ""buildingJammerRange"");" \n "_zSmell = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""smell"");" \n "_zSight = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""sight"");" \n "_zHear = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""hearing"");" \n @@ -251,7 +250,6 @@ class FSM "axeDebug = _doDebug ;" \n "if(_doDebug)then{" \n "axeDebug = true;" \n - "_jammerRange = 75;" \n "axeZed = _zombie;" \n "_debugDo = ""START"";" \n "_mkrName = """";" \n diff --git a/Sources/epoch_code/System/player_login.fsm b/Sources/epoch_code/System/player_login.fsm index f0a4d736..36cd8c36 100644 --- a/Sources/epoch_code/System/player_login.fsm +++ b/Sources/epoch_code/System/player_login.fsm @@ -1076,7 +1076,7 @@ class FSM "if (_playerCheck) then {" \n " _PlayerPosCheck = !((_playerObject getVariable [""FinalDest"",[]]) isequalto []);" \n " if (_PlayerPosCheck) then {" \n - " _playerCheckMass = (_loadabs == (loadabs _playerObject));" \n + " _playerCheckMass = ((_loadabs toFixed 2) isEqualTo ((loadabs _playerObject) toFixed 2));" \n " if (_playerCheckMass) then {" \n " _state = true;" \n " };" \n diff --git a/Sources/epoch_code/compile/EPOCH_CamUse.sqf b/Sources/epoch_code/compile/EPOCH_CamUse.sqf index 2d990108..c9308cce 100644 --- a/Sources/epoch_code/compile/EPOCH_CamUse.sqf +++ b/Sources/epoch_code/compile/EPOCH_CamUse.sqf @@ -12,12 +12,15 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_CamUse.sqf */ -private ["_mycams","_buildingJammerRange","_curcam"]; +private ["_mycams","_curcam"]; _mycams = EPOCH_BaseCams select {(_x getVariable["BUILD_OWNER", "-1"]) in [getPlayerUID player, Epoch_my_GroupUID]}; if (["CfgEpochClient", "BaseCamOnlyHome",true] call EPOCH_fnc_returnConfigEntryV2) then { - _buildingJammerRange = ["CfgEpochClient", "buildingJammerRange",75] call EPOCH_fnc_returnConfigEntryV2; - _mycams = _mycams select {!(((nearestobjects [_x,["Plotpole_EPOCH"],_buildingJammerRange]) select {(_x getVariable["BUILD_OWNER", "-1"]) in [getPlayerUID player, Epoch_my_GroupUID]}) isequalto [])}; + _mycams = _mycams select { + _cam = _x; + _jammer = (nearestObjects[player, call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) select {_cam distance _x < (getnumber (getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _x) >> "buildingJammerRange"))}; + !((_jammer select {(_x getVariable["BUILD_OWNER", "-1"]) in [getPlayerUID player, Epoch_my_GroupUID]}) isequalto []) + }; }; if !(_mycams isequalto []) then { _curcam = _mycams find Epoch_ActiveCam; diff --git a/Sources/epoch_code/compile/EPOCH_consumeItem.sqf b/Sources/epoch_code/compile/EPOCH_consumeItem.sqf index 15952c7d..a9d6d261 100644 --- a/Sources/epoch_code/compile/EPOCH_consumeItem.sqf +++ b/Sources/epoch_code/compile/EPOCH_consumeItem.sqf @@ -13,7 +13,7 @@ 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","_ghostClass","_highestDMG","_inputCount","_interactAttributes","_interactOption","_interactReturnOnUse","_isOk","_isStorage","_magazineSize","_magazineSizeMax","_magazinesAmmoFull","_msg","_newDMG","_newFuel","_object","_otherObjects","_output","_paintCanColor","_paintCanIndex","_partCheck","_pos","_removeItem","_transportFuel","_unifiedInteract","_vehicle","_vehicles"]; +private ["_buildClass","_buildingCountLimit","_canCapacity","_cfgBaseBuilding","_cfgItemInteractions","_color","_currentDMG","_currentFuel","_currentHIT","_fuelCapacity","_ghostClass","_highestDMG","_inputCount","_interactAttributes","_interactOption","_interactReturnOnUse","_isOk","_isStorage","_magazineSize","_magazineSizeMax","_magazinesAmmoFull","_msg","_newDMG","_newFuel","_object","_otherObjects","_output","_paintCanColor","_paintCanIndex","_partCheck","_pos","_removeItem","_transportFuel","_unifiedInteract","_vehicle","_vehicles"]; //[[[end]]] EPOCH_InteractedItem params ["_text","_item","_pic"]; @@ -114,8 +114,6 @@ switch _interactOption do { 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"); @@ -141,7 +139,7 @@ switch _interactOption do { if (_buildClass isKindOf "ThingX") then { // prevent spawning if another simulated object exists still - _otherObjects = nearestObjects[player, [_buildClass], _buildingJammerRange]; + _otherObjects = nearestObjects[player, [_buildClass], 100]; if (_otherObjects isEqualTo []) then { _object=createVehicle[_buildClass,_pos,[],0,"CAN_COLLIDE"]; _object setDir ((getDir player) - 180); diff --git a/Sources/epoch_code/compile/EPOCH_lootTrash.sqf b/Sources/epoch_code/compile/EPOCH_lootTrash.sqf index 53791cfd..88bf0af4 100644 --- a/Sources/epoch_code/compile/EPOCH_lootTrash.sqf +++ b/Sources/epoch_code/compile/EPOCH_lootTrash.sqf @@ -91,8 +91,7 @@ if (diag_tickTime - EPOCH_lastTrash > 2) then { }; if (!isNull _bankTerminal) then { _AtmBlockedAtPlot = ["CfgEpochClient", "AtmBlockedAtPlot", false] call EPOCH_fnc_returnConfigEntryV2; - _buildingJammerRange = getNumber(_config >> "buildingJammerRange"); - _jammer = nearestObjects[player, ["PlotPole_EPOCH"], _buildingJammerRange]; + _jammer = (nearestObjects[player, call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) select {player distance _x < (getnumber (getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _x) >> "buildingJammerRange"))}; if (!(_jammer isequalto []) && _AtmBlockedAtPlot) exitwith { ["Bank Terminal blocked by Jammer Signal",5] call Epoch_Message; }; diff --git a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf index c27c19ff..97511695 100644 --- a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf +++ b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_aiskill","_arrSkills","_arrUnits","_arrVals","_bomb","_config","_currentLimit","_disableAI","_driver","_grp","_index","_jammerRange","_jammers","_loop","_minAISkill","_missionConfig","_nonJammer","_nonTrader","_nonTraderAIRange","_playerSpawnArray","_playerSpawnArrayKeyFinal","_pos","_restricted","_sapperHndl","_sapperNum","_spawnLimit","_targetPos","_unit","_units"]; +private ["_aiskill","_arrSkills","_arrUnits","_arrVals","_bomb","_config","_currentLimit","_disableAI","_driver","_grp","_index","_jammers","_loop","_minAISkill","_missionConfig","_nonJammer","_nonTrader","_nonTraderAIRange","_playerSpawnArray","_playerSpawnArrayKeyFinal","_pos","_restricted","_sapperHndl","_sapperNum","_spawnLimit","_targetPos","_unit","_units"]; //[[[end]]] params ["_unitClass",["_trgt",player],["_doVariable",false],["_unitCount",1],["_extraData",[]] ]; @@ -41,9 +41,7 @@ _unit = objNull; _targetPos = getPosATL _trgt; _targetPos set [2,0]; -_config = 'CfgEpochClient' call EPOCH_returnConfig; -_jammerRange = getNumber(_config >> "buildingJammerRange"); -_jammers = nearestObjects[_targetPos, ["PlotPole_EPOCH"], _jammerRange]; +_jammers = (nearestObjects[_targetPos, call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) select {_targetPos distance _x < (getnumber (getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _x) >> "buildingJammerRange"))}; if(!(_jammers isEqualTo []) && (_unitClass in _nonJammer))exitWith{}; _restricted = nearestObjects [_targetPos, ["ProtectionZone_Invisible_F"], _nonTraderAIRange]; diff --git a/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf b/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf index 497ef9bb..dcb75630 100644 --- a/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_isBuildAllowed.sqf @@ -23,7 +23,7 @@ BOOL */ //[[[cog import generate_private_arrays ]]] -private ["_StorageClasses","_BuildingClasses","_CamCountLimit","_alljammer","_buildingAllowed","_buildingCountLeader","_buildingCountLimit","_buildingCountPerMember","_buildingJammerRange","_bypassJammer","_c","_cfgBaseBuilding","_config","_ghostClass","_isAllowed","_jammer","_jammerGLOnly","_jammerPerGroup","_limitNearby","_maxBuildingHeight","_membercount","_minJammerDistance","_myPosATL","_nearestJammer","_obj","_objType","_objectscount","_ownedJammerExists","_range","_restricted","_restrictedArray","_restrictedLocations","_restrictedLocationsArray","_restrictedLocationsRange","_simulClass","_staticClass","_storageCountLeader","_storageCountLimit","_storageCountPerMember","_useGroupCountLimits","_useSplitCountLimits"]; +private ["_StorageClasses","_BuildingClasses","_CamCountLimit","_alljammer","_buildingAllowed","_buildingCountLeader","_buildingCountLimit","_buildingCountPerMember","_buildingJammerRange","_bypassJammer","_c","_cfgBaseBuilding","_config","_ghostClass","_isAllowed","_jammer","_jammerGLOnly","_jammerPerGroup","_limitNearby","_maxBuildingHeight","_membercount","_myPosATL","_nearestJammer","_obj","_objType","_objectscount","_ownedJammerExists","_range","_restricted","_restrictedArray","_restrictedLocations","_restrictedLocationsArray","_restrictedLocationsRange","_simulClass","_staticClass","_storageCountLeader","_storageCountLimit","_storageCountPerMember","_useGroupCountLimits","_useSplitCountLimits"]; //[[[end]]] _buildingAllowed = true; @@ -38,32 +38,21 @@ if (vehicle player != player)exitWith{["Building Disallowed: Inside Vehicle", 5] // defaults _config = 'CfgEpochClient' call EPOCH_returnConfig; +_JammerConfig = (_config >> "CfgJammers"); _cfgBaseBuilding = 'CfgBaseBuilding' call EPOCH_returnConfig; -_buildingJammerRange = getNumber(_config >> "buildingJammerRange"); -_buildingCountLimit = getNumber(_config >> "buildingCountLimit"); -_storageCountLimit = getNumber(_config >> "storageCountLimit"); -_buildingCountLeader = getNumber(_config >> "buildingCountLeader"); -_buildingCountPerMember = getNumber(_config >> "buildingCountPerMember"); -_storageCountLeader = getNumber(_config >> "storageCountLeader"); -_storageCountPerMember = getNumber(_config >> "storageCountPerMember"); -_minJammerDistance = getNumber(_config >> "minJammerDistance"); -_maxBuildingHeight = getNumber(_config >> "maxBuildingHeight"); -_jammerPerGroup = getNumber(_config >> "jammerPerGroup"); -_CamCountLimit = getNumber(_config >> "maxCams"); if(getNumber(_config >> "useGroupCountLimits") == 0)then{_useGroupCountLimits=false}; if(getNumber(_config >> "splitCountLimits") == 1)then{_useSplitCountLimits=true}; if(getNumber(_config >> "jammerGLOnly") == 0)then{_jammerGLOnly=false}; -if(_buildingJammerRange == 0)then{_buildingJammerRange = 75}; -if(_buildingCountLimit == 0)then{_buildingCountLimit = 200}; -if(_buildingCountLeader == 0)then{_buildingCountLeader = _buildingCountLimit}; -if(_storageCountLeader == 0)then{_storageCountLeader = 100}; -if(_minJammerDistance == 0)then{_minJammerDistance = _buildingJammerRange*3}; -if(_maxBuildingHeight == 0)then{_maxBuildingHeight = 100}; -if(_jammerPerGroup == 0)then{_jammerPerGroup = 2}; -if(_CamCountLimit == 0)then{_CamCountLimit = 2}; -_StorageClasses = ["Buildable_Storage","Buildable_Storage_SIM","Buildable_Storage_Ghost","Constructions_lockedstatic_F","Secure_Storage_Temp"]; -_BuildingClasses = ["Constructions_static_F","Constructions_foundation_F","Const_Ghost_EPOCH"]; +_StorageClasses = ["CfgEpochClient", "StorageClasses", ["Buildable_Storage","Buildable_Storage_SIM","Buildable_Storage_Ghost","Constructions_lockedstatic_F","Secure_Storage_Temp"]] call EPOCH_fnc_returnConfigEntryV2; +_BuildingClasses = ["CfgEpochClient", "BuildingClasses", ["Constructions_static_F","Constructions_foundation_F","Const_Ghost_EPOCH"]] call EPOCH_fnc_returnConfigEntryV2; +_minJammerDistance = ["CfgEpochClient", "minJammerDistance", 650] call EPOCH_fnc_returnConfigEntryV2; +_maxBuildingHeight = ["CfgEpochClient", "maxBuildingHeight", 100] call EPOCH_fnc_returnConfigEntryV2; +_jammerPerGroup = ["CfgEpochClient", "jammerPerGroup", 1] call EPOCH_fnc_returnConfigEntryV2; + +_JammerClasses = call EPOCH_JammerClasses; +_JammerGhosts = call EPOCH_JammerGhosts; +_JammerCheckClasses = _JammerClasses + _JammerGhosts; // input params ["_objType"]; @@ -79,9 +68,9 @@ _ghostClass = getText(_cfgBaseBuilding >> _objType >> "GhostPreview"); _bypassJammer = getNumber(_cfgBaseBuilding >> _staticClass >> "bypassJammer"); // Jammer -_jammer = nearestObjects[player, ["PlotPole_EPOCH"], _minjammerdistance]; +_jammer = (nearestObjects[player, _JammerCheckClasses, _minJammerDistance]-[_obj]); if !(_jammer isEqualTo []) then { - if (_objType in ["PlotPole_EPOCH", "PlotPole_SIM_EPOCH"]) then { + if (_objType in _JammerCheckClasses) then { { if (alive _x) exitWith{ _buildingAllowed = false; @@ -91,8 +80,9 @@ if !(_jammer isEqualTo []) then { } else { { - if (alive _x && (_x distance player) <= _buildingJammerRange) exitWith{ + if (alive _x && player distance _x < (getnumber (_JammerConfig >> (typeof _x) >> "buildingJammerRange"))) exitWith{ _nearestJammer = _x; + _JammerConfig = (_JammerConfig >> (typeof _nearestJammer)); }; } foreach _jammer; if !(isNull _nearestJammer) then { @@ -101,19 +91,20 @@ if !(_jammer isEqualTo []) then { ["Building Disallowed: Frequency Blocked", 5] call Epoch_message; }; _ownedJammerExists = true; - if(_useGroupCountLimits)then{ - _membercount = 0; - Epoch_my_Group params [ - ["_groupName",""], - ["_leaderName",""], - ["_groupSize",0], - ["_modArray",[]], - ["_memberArray",[]] - ]; - _membercount = count _modArray + count _memberArray; - _storageCountLimit = _storageCountLeader + (_storageCountPerMember * _membercount); - _buildingCountLimit = _buildingCountLeader + (_buildingCountPerMember * _membercount); - }; + _membercount = 0; + Epoch_my_Group params [ + ["_groupName",""], + ["_leaderName",""], + ["_groupSize",0], + ["_modArray",[]], + ["_memberArray",[]] + ]; + _membercount = count _modArray + count _memberArray; + _buildingJammerRange = getnumber (_JammerConfig >> "buildingJammerRange"); + _storageCountLimit = (getnumber (_JammerConfig >> "storageCountLimit")) + ((getnumber (_JammerConfig >> "storageCountPerMember")) * _membercount); + _buildingCountLimit = (getnumber (_JammerConfig >> "buildingCountLimit")) + ((getnumber (_JammerConfig >> "buildingCountPerMember")) * _membercount); + _CamCountLimit = getnumber (_JammerConfig >> "maxCams"); + if (_useSplitCountLimits) then { if({_objType iskindof _x} count _StorageClasses > 0) then { if ((count (nearestObjects[_nearestJammer,_StorageClasses,_buildingJammerRange]-[_obj])) >= _storageCountLimit) exitwith { @@ -148,7 +139,7 @@ if !(_jammer isEqualTo []) then { }; } else { - if (_objType in ["PlotPole_EPOCH", "PlotPole_SIM_EPOCH"]) then { + if (_objType in _JammerCheckClasses) then { if (!(EPOCH_my_groupUID isequalto "") && !((getplayeruid player) isequalto EPOCH_my_groupUID) && _jammerGLOnly) exitwith { _buildingAllowed = false; ["The Group Leader must place the Jammer!", 5] call Epoch_message; @@ -158,7 +149,7 @@ else { if ((_x getVariable["BUILD_OWNER", "-1"]) in[getPlayerUID player, Epoch_my_GroupUID]) then { _c = _c+1; }; - } foreach (missionnamespace getvariable ["Epoch_Plotpoles",allmissionobjects 'PlotPole_EPOCH']); + } foreach (missionnamespace getvariable ["Epoch_Plotpoles",call {_allplots = [];{_allplots append (allmissionobjects _x)} foreach (call EPOCH_JammerClasses);_allplots}]); if (_c >= _jammerPerGroup) then { _buildingAllowed = false; [format["Building Disallowed: Max %1 Jammer per Group!", _jammerPerGroup], 5] call Epoch_message; @@ -173,7 +164,7 @@ if (!_ownedJammerExists) then{ if (_limitNearby > 0) then{ // remove current target from objects - _objectscount = count (nearestObjects[player, [_staticClass, _simulClass], _buildingJammerRange]-[_obj]); + _objectscount = count (nearestObjects[player, [_staticClass, _simulClass], 100]-[_obj]); if (_objectscount >= _limitNearby) then{ _buildingAllowed = false; [format["Building Disallowed: Limit %1", _limitNearby], 5] call Epoch_message; @@ -184,7 +175,7 @@ if !(_buildingAllowed)exitWith{ false }; // require jammer check if not found as owner of jammer if (getNumber(_config >> "buildingRequireJammer") == 1 && _bypassJammer == 0) then{ - if !(_objType in ["PlotPole_EPOCH", "PlotPole_SIM_EPOCH"]) then { + if !(_objType in _JammerCheckClasses) then { _buildingAllowed = _ownedJammerExists; if !(_buildingAllowed) then { ["Building Disallowed: Frequency Jammer Needed", 5] call Epoch_message; diff --git a/Sources/epoch_code/compile/building/EPOCH_lockCheck.sqf b/Sources/epoch_code/compile/building/EPOCH_lockCheck.sqf index 3bef7b05..354aea7a 100644 --- a/Sources/epoch_code/compile/building/EPOCH_lockCheck.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_lockCheck.sqf @@ -22,14 +22,10 @@ BOOL */ //[[[cog import generate_private_arrays ]]] -private ["_buildingJammerRange","_config","_jammed","_jammer"]; +private ["_jammed","_jammer"]; //[[[end]]] -_config = "CfgEpochClient" call EPOCH_returnConfig; -_buildingJammerRange = getNumber(_config >> "buildingJammerRange"); -if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; }; - -_jammer = nearestObjects[cameraon, ["PlotPole_EPOCH"], _buildingJammerRange]; +_jammer = (nearestObjects[player, call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) select {player distance _x < (getnumber (getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _x) >> "buildingJammerRange"))}; _jammed = false; if !(_jammer isEqualTo[]) then { { diff --git a/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf b/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf index 2bb0a6a4..149a7f0d 100644 --- a/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf @@ -22,13 +22,12 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_buildingJammerRange","_config","_maintainCount","_rnd"]; +private ["_buildingJammerRange","_maintainCount","_rnd"]; //[[[end]]] if !(isNil "EPOCH_maintainLockout") exitWith {["Already Maintaining a base.", 5] call Epoch_message;}; if (EPOCH_playerCrypto > 0) then { - _config = "CfgEpochClient" call EPOCH_returnConfig; - _buildingJammerRange = getNumber(_config >> "buildingJammerRange"); + _buildingJammerRange = getnumber (getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _this) >> "buildingJammerRange");; if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; }; _maintainCount = {(damage _x) > 0} count nearestObjects[_this, ["Constructions_static_F","Constructions_foundation_F","Buildable_Storage","Constructions_lockedstatic_F"], _buildingJammerRange]; diff --git a/Sources/epoch_code/compile/building/EPOCH_removeBUILD.sqf b/Sources/epoch_code/compile/building/EPOCH_removeBUILD.sqf index 76154630..377bb446 100644 --- a/Sources/epoch_code/compile/building/EPOCH_removeBUILD.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_removeBUILD.sqf @@ -22,19 +22,12 @@ BOOL - true if removed */ //[[[cog import generate_private_arrays ]]] -private ["_buildingAllowed","_buildingCountLimit","_buildingJammerRange","_config","_jammer","_nearestJammer","_objType","_ownedJammerExists","_removeParts","_return","_stability","_targeter"]; +private ["_buildingAllowed","_jammer","_nearestJammer","_objType","_ownedJammerExists","_removeParts","_return","_stability","_targeter"]; //[[[end]]] _buildingAllowed = true; _ownedJammerExists = false; _nearestJammer = objNull; -_config = 'CfgEpochClient' call EPOCH_returnConfig; -_buildingJammerRange = getNumber(_config >> "buildingJammerRange"); -_buildingCountLimit = getNumber(_config >> "buildingCountLimit"); - -// defaults -if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; }; -if (_buildingCountLimit == 0) then { _buildingCountLimit = 200; }; EPOCH_buildOption = 0; @@ -57,14 +50,14 @@ if (_stability > 0) exitWith{ }; }; -if (_objType == "PlotPole_EPOCH") then { +if (_objType in (call EPOCH_JammerClasses)) then { if ((_object getVariable["BUILD_OWNER", "-1"]) != getPlayerUID player) then{ _buildingAllowed = false; ["Remove Disallowed: Frequency Blocked", 5] call Epoch_message; }; } else { - _jammer = nearestObjects[player, ["PlotPole_EPOCH"], _buildingJammerRange]; + _jammer = (nearestObjects[player, call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) select {player distance _x < (getnumber (getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _x) >> "buildingJammerRange"))}; if !(_jammer isEqualTo[]) then{ { if (alive _x) exitWith{ diff --git a/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf b/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf index 72bd75e6..b88e5e78 100644 --- a/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf +++ b/Sources/epoch_code/compile/building/EPOCH_upgradeBUILD.sqf @@ -23,7 +23,7 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_buildingAllowed","_buildingCountLimit","_buildingJammerRange","_canUpgrade","_canUpgradePartCount","_config","_config2","_countdoors","_countgates","_doors","_gates","_jammer","_maxdoors","_maxgates","_missingCount","_missingParts","_nearestJammer","_ownedJammerExists","_part","_partCheck","_removedPartCount","_req","_return","_stability","_targeter","_upgrade","_upgradeParts","_upgrades","_upgradeto"]; +private ["_buildingAllowed","_canUpgrade","_canUpgradePartCount","_config","_config2","_countdoors","_countgates","_doors","_gates","_jammer","_maxdoors","_maxgates","_missingCount","_missingParts","_nearestJammer","_ownedJammerExists","_part","_partCheck","_removedPartCount","_req","_return","_stability","_targeter","_upgrade","_upgradeParts","_upgrades","_upgradeto","_buildingJammerRange","_JammerConfig","_CryptoCosts"]; //[[[end]]] params [ ["_object",objNull,[objNull]], @@ -37,13 +37,6 @@ if (isNull _object) exitWith {false}; _buildingAllowed = true; _ownedJammerExists = false; _nearestJammer = objNull; -_config = 'CfgEpochClient' call EPOCH_returnConfig; -_buildingJammerRange = getNumber(_config >> "buildingJammerRange"); -_buildingCountLimit = getNumber(_config >> "buildingCountLimit"); - -// defaults -if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; }; -if (_buildingCountLimit == 0) then { _buildingCountLimit = 200; }; EPOCH_buildOption = 1; @@ -58,38 +51,25 @@ if (_stability > 0) exitWith{ }; }; -_jammer = nearestObjects[player, ["PlotPole_EPOCH"], _buildingJammerRange]; +_jammer = (nearestObjects[_object, call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) select {alive _x && {_object distance _x < (getnumber (getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _x) >> "buildingJammerRange"))}}; if !(_jammer isEqualTo[]) then { - { - if (alive _x) exitWith{ - _nearestJammer = _x; - }; - } foreach _jammer; - - if !(isNull _nearestJammer) then { - if ((_nearestJammer getVariable["BUILD_OWNER", "-1"]) in[getPlayerUID player, Epoch_my_GroupUID]) then { - _ownedJammerExists = true; - } - else { - _buildingAllowed = false; - ["Upgrade Disallowed: Frequency Blocked", 5] call Epoch_message; - }; - }; + _nearestJammer = _jammer select 0; + if ((_nearestJammer getVariable["BUILD_OWNER", "-1"]) in[getPlayerUID player, Epoch_my_GroupUID]) then { + _ownedJammerExists = true; + } + else { + _buildingAllowed = false; + ["Upgrade Disallowed: Frequency Blocked", 5] call Epoch_message; + }; }; if !(_buildingAllowed)exitWith{ false }; -if (_object isKindOf "Constructions_static_F") then { +if (_object isKindOf "Constructions_static_F" || {(typeof _object) in (call EPOCH_JammerClasses)}) then { // take upgrade item from player here _config = 'CfgBaseBuilding' call EPOCH_returnConfig; - _config2 = 'CfgEpochClient' call EPOCH_returnConfig; - _buildingJammerRange = getNumber(_config2 >> "buildingJammerRange"); - _maxdoors = getNumber(_config2 >> "maxdoors"); - _maxgates = getNumber(_config2 >> "maxgates"); - if (_buildingJammerRange == 0) then {_buildingJammerRange = 150}; - if (_maxdoors == 0) then {_maxdoors = 12}; - if (_maxgates == 0) then {_maxgates = 10}; + _config2 = getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _object); _upgrades = getArray(_config >> (typeOf _object) >> "upgradeBuilding"); if !(_upgrades isEqualTo []) then { @@ -102,10 +82,17 @@ if (_object isKindOf "Constructions_static_F") then { _canUpgrade = true; _canUpgradePartCount = 0; _missingParts = "Missing: "; + _CryptoCosts = 0; { _part = _x select 0; _req = _x select 1; - _partCheck = {_x == _part} count (magazines player); + _partCheck = if (_part IsEqualTo "Krypto") then { + _CryptoCosts = _CryptoCosts + _req; + EPOCH_PlayerCrypto + } + else { + {_x == _part} count (magazines player) + }; if (_partCheck < _req) then { _missingCount = _req - _partCheck; @@ -116,9 +103,16 @@ if (_object isKindOf "Constructions_static_F") then { _canUpgradePartCount = _canUpgradePartCount + _req; } forEach _upgradeParts; - _doors = ["WoodLargeWallDoorL_EPOCH","WoodWall4_EPOCH","CinderWallDoorwHatch_EPOCH","WoodStairs3_EPOCH","JailWallDoor_EPOCH"]; - _gates = ["CinderWallGarage_EPOCH","WoodWallGarage_EPOCH","MetalWallGarage_EPOCH"]; if (_canUpgrade) then { + _doors = ["CfgEpochClient", "DoorClasses", ["WoodLargeWallDoorL_EPOCH","WoodWall4_EPOCH","CinderWallDoorwHatch_EPOCH","WoodStairs3_EPOCH","JailWallDoor_EPOCH"]] call EPOCH_fnc_returnConfigEntryV2; + _gates = ["CfgEpochClient", "GateClasses", ["CinderWallGarage_EPOCH","WoodWallGarage_EPOCH","MetalWallGarage_EPOCH"]] call EPOCH_fnc_returnConfigEntryV2; + _JammerConfig = getmissionconfig "CfgEpochClient" >> "CfgJammers" >> (typeof _nearestJammer); + _buildingJammerRange = getnumber (_JammerConfig >> "buildingJammerRange"); + _maxdoors = getnumber (_JammerConfig >> "maxdoors"); + _maxgates = getnumber (_JammerConfig >> "maxgates"); + if (_maxdoors == 0) then {_maxdoors = 12}; + if (_maxgates == 0) then {_maxgates = 10}; + _upgradeto = _upgrade select 0; if (_upgradeto in _doors) then { _countdoors = count (nearestobjects [_nearestJammer,_doors,_buildingJammerRange]); @@ -139,17 +133,23 @@ if (_object isKindOf "Constructions_static_F") then { _removedPartCount = 0; if (_canUpgrade) then { { - for "_i" from 1 to (_x select 1) do { - if ((_x select 0) in (magazines player)) then { - player removeMagazine (_x select 0); - _removedPartCount = _removedPartCount + 1; + _x params ["_part","_req"]; + if !(_part IsEqualTo "Krypto") then { + for "_i" from 1 to _req do { + if (_part in (magazines player)) then { + player removeMagazine _part; + _removedPartCount = _removedPartCount + 1; + }; }; + } + else { + _removedPartCount = _removedPartCount + _req; }; } forEach _upgradeParts; if (_canUpgradePartCount == _removedPartCount) then { // send to server for upgrade - [_object,player,Epoch_upgradeIndex,Epoch_personalToken] remoteExec ["EPOCH_server_upgradeBUILD",2]; + [_object,player,Epoch_upgradeIndex,Epoch_personalToken,_CryptoCosts] remoteExec ["EPOCH_server_upgradeBUILD",2]; Epoch_upgradeIndex = nil; _return = true; ["Upgraded", 5] call Epoch_message; diff --git a/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf b/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf index be56ec0b..c0601f65 100644 --- a/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf +++ b/Sources/epoch_code/compile/event_handlers/EPOCH_InventoryOpened.sqf @@ -52,14 +52,17 @@ else { _savecontainer = _sec; }; }; -if (!isnull _savecontainer && !_blocked) then { +if (!_blocked) then { _savecontainer spawn { waituntil {!isnull (findDisplay 602)}; - while {!isnull (findDisplay 602)} do { - _stored = [itemcargo _this, magazinecargo _this, backpackcargo _this]; - waituntil {uisleep 0.5; !(_stored isequalto [itemcargo _this, magazinecargo _this, backpackcargo _this]) || isnull (findDisplay 602)}; - if !(_stored isequalto [itemcargo _this, magazinecargo _this, backpackcargo _this]) then { - _this call EPOCH_interact; + call EPOCH_CryptoButtons; + if (!isnull _this) then { + while {!isnull (findDisplay 602)} do { + _stored = [itemcargo _this, magazinecargo _this, backpackcargo _this]; + waituntil {uisleep 0.5; !(_stored isequalto [itemcargo _this, magazinecargo _this, backpackcargo _this]) || isnull (findDisplay 602)}; + if !(_stored isequalto [itemcargo _this, magazinecargo _this, backpackcargo _this]) then { + _this call EPOCH_interact; + }; }; }; }; diff --git a/Sources/epoch_code/compile/event_handlers/EPOCH_getInMan.sqf b/Sources/epoch_code/compile/event_handlers/EPOCH_getInMan.sqf index dc2bb453..13db15bb 100644 --- a/Sources/epoch_code/compile/event_handlers/EPOCH_getInMan.sqf +++ b/Sources/epoch_code/compile/event_handlers/EPOCH_getInMan.sqf @@ -29,4 +29,9 @@ if (_unit == player) then { 1 fadeSound 0.15; }; }; + if (_vehicle getvariable ["Vehicle_Slot","-1"] isequalto "-1") then { + if (!(_vehicle iskindof "Paraglide") && !(_vehicle iskindof "Ejection_Seat_Base_F")) then { + ['WARNING! This is a temp Vehicle and will despawn after Restart!',5] call Epoch_Message; + }; + }; }; diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_AnimateScheduled.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_AnimateScheduled.sqf new file mode 100644 index 00000000..d6f31a36 --- /dev/null +++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_AnimateScheduled.sqf @@ -0,0 +1,47 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Run scheduled animations on objects + + 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/functions/EPOCH_fnc_AnimateScheduled.sqf + + Example: + [ + _object, // object + [ // animationarray + ['door1',1], + ['door2',1], + ['handle1',1], + ['handle2',1] + ], + [0,1,0] // delays + ] remoteexec ['EPOCH_fnc_AnimateScheduled',_player]; + + Parameter(s): + _this select 0: OBJ - Object for the animations + _this select 1: ARRAY - Array of animations and their final state + _this select 2: ARRAY - Array of delays between each animation + + Returns: + NOTHING +*/ + +private ["_ins","_target"]; +params [["_object",objnull], ["_animarray",[]], ["_delays",[]]]; +if (isnull _object) exitwith {}; +if !(_animarray isEqualType []) exitwith {}; +if !(_delays isEqualType []) exitwith {}; +{ + if (_x isEqualType []) then { + _x params [["_animation",""],["_state",0]]; + _object animate [_animation,_state]; + uisleep (_delays param [_foreachindex,0]); + }; +} foreach _animarray; diff --git a/Sources/epoch_code/compile/inventory/EPOCH_CryptoButtons.sqf b/Sources/epoch_code/compile/inventory/EPOCH_CryptoButtons.sqf new file mode 100644 index 00000000..ec1bf400 --- /dev/null +++ b/Sources/epoch_code/compile/inventory/EPOCH_CryptoButtons.sqf @@ -0,0 +1,82 @@ +/* + Author: He-Man - EpochMod.com + + Contributors: + + Description: Adds a Slider into the inventory to put Crypto on the Ground + + 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/inventory/EPOCH_CryptoButtons.sqf + + Usage: + on opened Inventory: call EPOCH_CryptoButtons + + RETURNS: NOTHING +*/ + + +private ["_display","_ctrl_ground","_ContainerBG","_PlayerBg","_ContainerBgPos","_ctrl_groundPos","_PlayerBgPos","_KryptoButton","_border","_slider1","_KryptoText"]; +_display = finddisplay 602; +_ctrl_ground = _display displayCtrl 6321; +_ContainerBG = _display displayCtrl 1001; +_PlayerBg = _display displayCtrl 1002; +_ContainerBgPos = ctrlPosition _ContainerBG; +_ctrl_groundPos = ctrlPosition _ctrl_ground; +_PlayerBgPos = ctrlPosition _PlayerBG; + +_KryptoButton = _display ctrlCreate['RSCButton', -1]; +_KryptoButton ctrlSetPosition [ + (_PlayerBgPos select 0)+(_PlayerBgPos select 2) + (_ctrl_groundPos select 3)/2, + (_ContainerBgPos select 1) + (_ctrl_groundPos select 3)*1.5 + (_ctrl_groundPos select 3)/2*0, + (_ContainerBgPos select 2)/2, + (_ctrl_groundPos select 3)*1.5 +]; +_KryptoButton ctrlCommit 0; +_KryptoButton ctrlSetText 'Crypto to Ground'; +_KryptoButton ctrlsettextcolor [1,1,0,1]; +_KryptoButton ctrlEnable true; +_KryptoButton ctrlSetEventHandler ["ButtonClick","_slider = ((finddisplay 602) displayCtrl 654001);_sliderPos = sliderPosition _slider;_value = round (epoch_playercrypto * (_sliderPos/10)); if (_value > 0 && _value <= Epoch_PlayerCrypto) then {finddisplay 602 closedisplay 0; [player,_value,Epoch_personalToken] remoteexec ['EPOCH_server_PutCrypto',2]};"]; +_border = _display ctrlCreate['RscFrame', -1]; +_border ctrlSetPosition [ + (_PlayerBgPos select 0)+(_PlayerBgPos select 2) + (_ctrl_groundPos select 3)/2, + (_ContainerBgPos select 1) + (_ctrl_groundPos select 3)*1.5 + (_ctrl_groundPos select 3)/2*0, + (_ContainerBgPos select 2)/2, + (_ctrl_groundPos select 3)*1.5 +]; +_border ctrlCommit 0; + +_slider1 = _display ctrlCreate['RscXSliderH', 654001]; +_slider1 ctrlSetPosition [ + (_PlayerBgPos select 0)+(_PlayerBgPos select 2) + (_ctrl_groundPos select 3)/2, + (_ContainerBgPos select 1) + (_ctrl_groundPos select 3)*1.5*2, + (_ContainerBgPos select 2)/2, + (_ctrl_groundPos select 3)*0.75 +]; +_slider1 ctrlCommit 0; + +_KryptoText = _display ctrlCreate['RSCText', 654002]; +_KryptoText ctrlSetPosition [ + (_PlayerBgPos select 0)+(_PlayerBgPos select 2) + (_ctrl_groundPos select 3)/2, + (_ContainerBgPos select 1) + (_ctrl_groundPos select 3)*1.5*2 + (_ctrl_groundPos select 3)*0.75, + (_ContainerBgPos select 2)/2, + (_ctrl_groundPos select 3)*0.75 +]; +_KryptoText ctrlSetBackgroundColor [0,0,0,1]; + +[] spawn { + disableSerialization; + _display = finddisplay 602; + _slider1 = (_display displayCtrl 654001); + _KryptoText = (_display displayCtrl 654002); + _slider1 sliderSetPosition 0; + while {!isNull _display} do { + _sliderPos = sliderPosition _slider1; + _value = round (epoch_playercrypto * (_sliderPos/10)); + _KryptoText ctrlSetText format['Put %1 Crypto',_value]; + _KryptoText ctrlCommit 0; + uiSleep 0.1; + }; +}; diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf index fc71d57e..d5717a6a 100644 --- a/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf +++ b/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf @@ -62,6 +62,10 @@ if !(alive player && alive _playerObject && !isPlayer _playerObject) then { if !(isNil "_playerBloodPKey") then {_playerBloodPKeyFinal = _playerBloodPKey}; missionNamespace setVariable [_playerBloodPKeyFinal, 120]; + _playerToxicityKeyFinal = "EPOCH_playerToxicity"; + if !(isNil "_playerToxicityKey") then {_playerToxicityKeyFinal = _playerToxicityKey}; + missionNamespace setVariable [_playerToxicityKeyFinal, 0]; + // Wait until _playerObject is local before adding Rating and EH's waituntil {local _playerObject}; diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf index ac1619d4..a8693d8b 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf @@ -31,7 +31,7 @@ if (!isNull _cursorTarget && {!(EPOCH_target isEqualTo _cursorTarget)}) then { if (_cursorTarget isKindOf "AllVehicles") then { _currentTarget = _cursorTarget; } else { - if (_cursorTarget isKindOf "Constructions_modular_F" || _cursorTarget isKindOf "Constructions_static_F") then { + if (_cursorTarget isKindOf "Constructions_modular_F" || {_cursorTarget isKindOf "Constructions_static_F"} || {(typeof _cursorTarget) in (call Epoch_JammerClasses)}) then { _currentTargetMode = 1; _currentTarget = _cursorTarget; }; diff --git a/Sources/epoch_code/compile/setup/masterLoop/init.sqf b/Sources/epoch_code/compile/setup/masterLoop/init.sqf index 5542c028..e22e036c 100644 --- a/Sources/epoch_code/compile/setup/masterLoop/init.sqf +++ b/Sources/epoch_code/compile/setup/masterLoop/init.sqf @@ -206,7 +206,6 @@ missionNamespace setVariable [_playerSpawnArrayKey, _playerSpawnArray]; } forEach assignedItems player; // lootBubble Init -_buildingJammerRange = ["CfgEpochClient", "buildingJammerRange", 75] call EPOCH_fnc_returnConfigEntryV2; _masterConfig = 'CfgBuildingLootPos' call EPOCH_returnConfig; _lootClasses = []; @@ -276,7 +275,7 @@ _lootBubble = { _objects resize 4; }; // diag_log format["DEBUG: loot objects %1",_objects]; - _jammer = (_lootLoc nearObjects ["PlotPole_EPOCH", _buildingJammerRange + 50]) + (_lootLoc nearObjects ["ProtectionZone_Invisible_F", 25]); + _jammer = ((nearestObjects [_lootLoc, call EPOCH_JammerClasses, ((call EPOCH_MaxJammerRange) + 50)]) select {_x distance _lootLoc < ((getnumber (getmissionconfig "cfgEpochClient" >> "CfgJammers" >> (typeof _x) >> "buildingJammerRange"))+50)}) + (_lootLoc nearObjects ["ProtectionZone_Invisible_F", 25]); if (!(_objects isEqualTo[]) && (_jammer isEqualTo[])) then { _building = selectRandom _objects; if (_building getvariable ["EPOCH_Skiploot",false]) exitwith {}; diff --git a/Sources/epoch_code/compile/traders/EPOCH_takeCrypto.sqf b/Sources/epoch_code/compile/traders/EPOCH_takeCrypto.sqf index 6034a420..0490fbb2 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_takeCrypto.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_takeCrypto.sqf @@ -1,17 +1,27 @@ //[[[cog import generate_private_arrays ]]] -private ["_getCrypto"]; +private ["_nearCrypto","_CryptoItems","_getCrypto","_addmoney"]; //[[[end]]] if !(isNil "EPOCH_takeCryptoLock") exitWith {}; EPOCH_takeCryptoLock = true; -if (!isNull _this) then { - _getCrypto = _this getVariable["Crypto", 0]; - if (_getCrypto > 0) then { - [player, Epoch_personalToken, _this] remoteExec ["EPOCH_server_takeCrypto",2]; - [format["You found %1 Crypto", _getCrypto], 5] call Epoch_message; - } else { - ["No Crypto found", 5] call Epoch_message; +_nearCrypto = (nearestobjects [player,[],5]) select {(_x getvariable ["Crypto",0]) > 0}; +_CryptoItems = []; +_getCrypto = 0; +{ + _addmoney = (_x getvariable ['Crypto',0]); + if (_addmoney > 0) then { + _CryptoItems pushback _x; }; + _getCrypto = _getCrypto + _addmoney; +} foreach _nearCrypto; + +if (_getCrypto > 0) then { + [player, Epoch_personalToken, _CryptoItems] remoteExec ["EPOCH_server_takeCrypto",2]; + [format['You found %1 Crypto', _getCrypto], 5] call Epoch_message; +} +else { + ['No Crypto found', 5] call Epoch_message; }; + [] spawn{ uiSleep 2; EPOCH_takeCryptoLock = nil; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf index 63f669f1..e4297222 100644 --- a/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf +++ b/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf @@ -13,10 +13,12 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/vehicles/EPOCH_client_repairVehicle.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_currentDMG"]; +private ["_currentDMG","_god"]; //[[[end]]] params ["_vehicle","_value"]; if (local _vehicle) then { + _god = !(isDamageAllowed _vehicle); + if (_god) then {_vehicle allowdamage true;}; { if ((_x select 0) isequaltype 0) then { _vehicle setHitIndex [_x select 0, _x select 1]; @@ -25,6 +27,7 @@ if (local _vehicle) then { _vehicle setHitPointDamage [_x select 0, _x select 1]; }; } foreach _value; + if (_god) then {_vehicle allowdamage false;}; if !({_x > 0} count ((getAllHitPointsDamage _vehicle) select 2) > 0) then { [_vehicle,["ALL",0],player,Epoch_personalToken] remoteExec ["EPOCH_server_repairVehicle",2]; diff --git a/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_ChangeLicensePlate.sqf b/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_ChangeLicensePlate.sqf new file mode 100644 index 00000000..a6d99c7d --- /dev/null +++ b/Sources/epoch_code/compile/vehicles/EPOCH_vehicle_ChangeLicensePlate.sqf @@ -0,0 +1,35 @@ +/* + Author: He-Man - EpochMod.com + + Contributors: + + Description: + change license plates from Vehicles + + 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/vehicles/EPOCH_vehicle_ChangeLicensePlate.sqf +*/ + +private ["_display","_maintxt","_txt","_bottomtxt","_savebutton"]; +params ['_vehicle',['_player',player]]; +if (isnull _vehicle) exitwith {}; +if (_player distance _vehicle > 10) exitwith {}; +if (!alive _vehicle) exitwith {}; +if (!local _vehicle) exitwith { + ['Go in as driver first',5] call Epoch_Message; +}; +Epoch_PlateVehicle = _vehicle; +createdialog 'EPOCH_SimpleInput'; +waituntil {!isnull (finddisplay -1200)}; +disableSerialization; +_display = (finddisplay -1200); +_maintxt = _display displayctrl 20; +_txt = _display displayctrl 23; +_bottomtxt = _display displayctrl 22; +_savebutton = _display displayctrl 30; +_maintxt ctrlSetText (format ['Change Licenseplate for %1',(typeof _vehicle) call Epoch_ItemDisplayName]); +_txt ctrlSetText 'New Plate:'; +_savebutton buttonSetAction 'if (player distance Epoch_PlateVehicle > 10) exitwith {}; Epoch_PlateVehicle setPlateNumber (ctrlText (finddisplay -1200 displayctrl 21)); closedialog 0; Epoch_PlateVehicle call EPOCH_interact; Epoch_PlateVehicle = nil'; diff --git a/Sources/epoch_code/init/both_init.sqf b/Sources/epoch_code/init/both_init.sqf index eb161e1a..12e4d087 100644 --- a/Sources/epoch_code/init/both_init.sqf +++ b/Sources/epoch_code/init/both_init.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/init/both_init.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_communityStatsInit","_customVarsInit","_dynSimToggle"]; +private ["_communityStatsInit","_customVarsInit","_dynSimToggle","_JammerConfig","_JammerClass","_preview"]; //[[[end]]] // Check if Advanced Vehicle Repair is enabled @@ -71,3 +71,34 @@ EPOCH_group_upgrade_lvl = ["CfgEpochClient", "group_upgrade_lvl", [4,"100",6,"30 // disable remote sensors on server and client as all Epoch AI is local to the side controlling it. disableRemoteSensors (["CfgEpochClient", "disableRemoteSensors", true] call EPOCH_fnc_returnConfigEntryV2); +// preload multiple used Jammer Configs +EPOCH_JammerClasses = []; +EPOCH_JammerGhosts = []; +EPOCH_MaxJammerRange = 75; +_JammerConfig = (getmissionconfig "CfgEpochClient" >> "CfgJammers"); +if !(isclass _JammerConfig) exitwith { + diag_log "EPOCH_debug: Error: No Jammerclasses defined in CfgEpochClient"; +}; +{ + private ["_JammerRangeX"]; + EPOCH_JammerClasses pushback (configname _x); + _JammerRangeX = getnumber (_x >> "buildingJammerRange"); + if (_JammerRangeX > EPOCH_MaxJammerRange) then { + EPOCH_MaxJammerRange = _JammerRangeX; + }; +} foreach ("true" configClasses _JammerConfig); +if (EPOCH_JammerClasses isEqualTo []) then { + diag_log "EPOCH_debug: Error: Jammerconfig in CfgEpochClient seems to be wrong"; +}; +{ + _JammerClass = _x; + { + _preview = gettext (getmissionconfig "CfgBaseBuilding" >> _JammerClass >> _x); + if !(_preview isEqualTo "" || _preview isEqualTo _JammerClass) then { + EPOCH_JammerGhosts pushBackUnique _preview; + }; + } foreach ["GhostPreview","simulClass"]; +} foreach EPOCH_JammerClasses; +EPOCH_JammerClasses = compilefinal (str EPOCH_JammerClasses); +EPOCH_MaxJammerRange = compilefinal (str EPOCH_MaxJammerRange); +EPOCH_JammerGhosts = compilefinal (str EPOCH_JammerGhosts) \ No newline at end of file diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp index 4082bb9e..464434dc 100644 --- a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp +++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp @@ -49,7 +49,7 @@ class CfgActionMenu dyna_deathMarkerAvail = "!(dyna_deathMarker isEqualTo [])"; dyna_mapDeathMarker = "(((getArray(('CfgMarkerSets' call EPOCH_returnConfig) >> 'DeathMarker' >> 'markerArray') select 0) select 0) in allMapMarkers)"; - dyna_AtHome = "call {_config = 'CfgEpochClient' call EPOCH_returnConfig;_buildingJammerRange = getNumber(_config >> 'buildingJammerRange');_nearjammers = nearestobjects [player,['Plotpole_EPOCH'],_buildingJammerRange];if (_nearjammers isEqualTo []) exitwith {false};_nearestJammer = _nearjammers select 0;((_nearestJammer getVariable['BUILD_OWNER', '-1']) in[getPlayerUID player, Epoch_my_GroupUID])}"; + dyna_AtHome = "call {_nearjammers = (nearestObjects[player, call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) select {player distance _x < (getnumber (getmissionconfig 'cfgEpochClient' >> 'CfgJammers' >> (typeof _x) >> 'buildingJammerRange'))};if (_nearjammers isEqualTo []) exitwith {false};_nearestJammer = _nearjammers select 0;((_nearestJammer getVariable['BUILD_OWNER', '-1']) in[getPlayerUID player, Epoch_my_GroupUID])}"; dyna_Watersource = "call {_nearObjects = nearestObjects [player, [], 2];_check = 'water';_ok = false;{if (alive _x) then {_ok = [_x, _check] call EPOCH_worldObjectType;};if (_ok) exitWith {};} forEach _nearObjects;_ok}"; }; diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp index 056d6639..384c97cb 100644 --- a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp +++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp @@ -78,7 +78,7 @@ class tra_shop class player_takeCrypto { - condition = "dyna_isDeadPlayer || (dyna_cursorTarget getVariable [""Crypto"",0]) > 0"; + condition = "dyna_isDeadPlayer || !(((nearestobjects [player,[],5]) select {(_x getvariable ['Crypto',0]) > 0}) isEqualTo [])"; action = "dyna_cursorTarget call EPOCH_takeCrypto;"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\krypto.paa"; tooltip = "Take Crypto"; @@ -101,14 +101,14 @@ class player_trade_accept //User action replacement class maintain_jammer { - condition = "dyna_cursorTargetType isEqualTo 'PlotPole_EPOCH' && (damage dyna_cursorTarget < 1)"; + condition = "dyna_cursorTargetType in (call EPOCH_JammerClasses) && (damage dyna_cursorTarget < 1)"; action = "dyna_cursorTarget call EPOCH_maintainIT;"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_maintain.paa"; tooltip = "Maintain"; }; class select_jammer { - condition = "dyna_cursorTargetType isEqualTo 'PlotPole_EPOCH' && (damage dyna_cursorTarget < 1)"; + condition = "dyna_cursorTargetType in (call EPOCH_JammerClasses) && (damage dyna_cursorTarget < 1)"; action = "[dyna_cursorTarget,player,Epoch_personalToken] remoteExec [""EPOCH_server_makeSP"",2];"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\spawnpoint.paa"; tooltip = "Make Spawnpoint"; @@ -131,14 +131,14 @@ class lock_lockbox }; class unlock_safe { - condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])"; + condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH','GunSafe_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])"; action = "dyna_cursorTarget call Epoch_secureStorageHandler"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_can_unlock.paa"; tooltip = "Unlock Safe"; }; class lock_safe { - condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH']) && !(dyna_cursorTarget getVariable ['EPOCH_Locked',false])"; + condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH','GunSafe_EPOCH']) && !(dyna_cursorTarget getVariable ['EPOCH_Locked',false])"; action = "dyna_cursorTarget call Epoch_secureStorageHandler"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_cannot_lock.paa"; tooltip = "Lock Safe"; @@ -154,7 +154,7 @@ class pack_lockbox }; class pack_safe { - condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])"; + condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH','GunSafe_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])"; action = "[dyna_cursorTarget,player,Epoch_personalToken] remoteExec ['EPOCH_server_packStorage',2];"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_pack.paa"; tooltip = "Pack Safe"; @@ -530,6 +530,13 @@ class VehMaintanance tooltipcode = "format ['Upgrade to %1 - %2',(Ignatz_VehicleUpgradeArray select 4 select 2),(Ignatz_VehicleUpgradeArray select 4 select 3)]"; }; }; + class ChangePlate + { + condition = "{dyna_cursorTarget iskindof _x} count ['Van_01_base_F','Van_02_base_F','SUV_01_base_F','Hatchback_01_base_F','Offroad_01_base_F','Offroad_02_base_F'] > 0"; + action = "[dyna_cursorTarget,player] spawn EPOCH_vehicle_ChangeLicensePlate"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Epoch_LicensePlate.paa"; + tooltip = "Change License Plate"; + }; }; //Groups diff --git a/Sources/epoch_config/Configs/CfgBaseBuilding.hpp b/Sources/epoch_config/Configs/CfgBaseBuilding.hpp index 5fb3287c..a566224d 100644 --- a/Sources/epoch_config/Configs/CfgBaseBuilding.hpp +++ b/Sources/epoch_config/Configs/CfgBaseBuilding.hpp @@ -187,6 +187,7 @@ class CfgBaseBuilding }; class PlotPole_EPOCH : Default { + upgradeBuilding[] = {{"PlotPole_M_EPOCH",{{"ItemCorrugatedLg",5},{"EnergyPackLg",2},{"CircuitParts",3},{"ItemBattery",3},{"ItemPipe",1}}}}; removeParts[] = {{"KitPlotPole",1}}; GhostPreview = "PlotPole_EPOCH"; staticClass = "PlotPole_EPOCH"; @@ -195,6 +196,63 @@ class CfgBaseBuilding }; class PlotPole_SIM_EPOCH : PlotPole_EPOCH { + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class PlotPole_M_EPOCH : Default + { + upgradeBuilding[] = {{"PlotPole_L_EPOCH",{{"ItemCorrugatedLg",5},{"EnergyPackLg",2},{"CircuitParts",3},{"ItemBattery",3},{"ItemPipe",1}}}}; + removeParts[] = {{"KitPlotPole_M",1}}; + GhostPreview = "PlotPole_M_EPOCH"; + staticClass = "PlotPole_M_EPOCH"; + simulClass = "PlotPole_M_SIM_EPOCH"; + bypassJammer = 1; + }; + class PlotPole_M_SIM_EPOCH : PlotPole_M_EPOCH + { + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class PlotPole_L_EPOCH : Default + { + upgradeBuilding[] = {{"PlotPole_XL_EPOCH",{{"ItemCorrugatedLg",5},{"EnergyPackLg",2},{"CircuitParts",3},{"ItemBattery",3},{"ItemPipe",1}}}}; + removeParts[] = {{"KitPlotPole_L",1}}; + GhostPreview = "PlotPole_L_EPOCH"; + staticClass = "PlotPole_L_EPOCH"; + simulClass = "PlotPole_L_SIM_EPOCH"; + bypassJammer = 1; + }; + class PlotPole_L_SIM_EPOCH : PlotPole_L_EPOCH + { + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class PlotPole_XL_EPOCH : Default + { + upgradeBuilding[] = {{"PlotPole_XXL_EPOCH",{{"ItemCorrugatedLg",5},{"EnergyPackLg",2},{"CircuitParts",3},{"ItemBattery",3},{"ItemPipe",1}}}}; + removeParts[] = {{"KitPlotPole_XL",1}}; + GhostPreview = "PlotPole_XL_EPOCH"; + staticClass = "PlotPole_XL_EPOCH"; + simulClass = "PlotPole_XL_SIM_EPOCH"; + bypassJammer = 1; + }; + class PlotPole_XL_SIM_EPOCH : PlotPole_XL_EPOCH + { + upgradeBuilding[] = {}; + removeParts[] = {}; + }; + class PlotPole_XXL_EPOCH : Default + { + upgradeBuilding[] = {}; + removeParts[] = {{"KitPlotPole_XXL",1}}; + GhostPreview = "PlotPole_XXL_EPOCH"; + staticClass = "PlotPole_XXL_EPOCH"; + simulClass = "PlotPole_XXL_SIM_EPOCH"; + bypassJammer = 1; + }; + class PlotPole_XXL_SIM_EPOCH : PlotPole_XXL_EPOCH + { + upgradeBuilding[] = {}; removeParts[] = {}; }; class WoodRamp_EPOCH : Default @@ -1356,6 +1414,36 @@ class CfgBaseBuilding { returnOnPack[] = {}; }; + class Safe_s_EPOCH : Default + { + returnOnPack[] = {{"ItemSafe_s",1}}; + simulClass = "Safe_s_SIM_EPOCH"; + staticClass = "Safe_s_EPOCH"; + weaponHolderProxy = "SafeProxy_EPOCH"; + GhostPreview = "Safe_s_EPOCH"; + bypassJammer = 1; + limitNearby = 2; + isSecureStorage = 1; + }; + class Safe_s_SIM_EPOCH : Safe_EPOCH + { + returnOnPack[] = {}; + }; + class GunSafe_EPOCH : Default + { + returnOnPack[] = {{"ItemGunSafe",1}}; + simulClass = "GunSafe_SIM_EPOCH"; + staticClass = "GunSafe_EPOCH"; + weaponHolderProxy = "SafeProxy_EPOCH"; + GhostPreview = "GunSafe_EPOCH"; + bypassJammer = 1; + limitNearby = 2; + isSecureStorage = 1; + }; + class GunSafe_SIM_EPOCH : GunSafe_EPOCH + { + returnOnPack[] = {}; + }; class Jack_EPOCH : Default { simulClass = "Jack_SIM_EPOCH"; diff --git a/Sources/epoch_config/Configs/CfgClientFunctions.hpp b/Sources/epoch_config/Configs/CfgClientFunctions.hpp index 54ed9cfa..b338363c 100644 --- a/Sources/epoch_config/Configs/CfgClientFunctions.hpp +++ b/Sources/epoch_config/Configs/CfgClientFunctions.hpp @@ -171,6 +171,7 @@ class CfgClientFunctions class fnc_setVariableLimited {}; class fnc_createLocalMarkerSet {}; class fnc_deleteLocalMarkerSet {}; + class fnc_AnimateScheduled {}; }; class environment { @@ -192,6 +193,7 @@ class CfgClientFunctions class client_VehicleMaintananceDo {}; class vehicle_checkTurretAmmo {}; class vehicle_removeTurretAmmo {}; + class vehicle_ChangeLicensePlate {}; }; class missions { @@ -213,6 +215,7 @@ class CfgClientFunctions class equip {}; class itemTypeSlot {}; class usedItemRepack {}; + class CryptoButtons {}; }; class servicepoint { diff --git a/Sources/epoch_config/Configs/CfgEpochClient.hpp b/Sources/epoch_config/Configs/CfgEpochClient.hpp index 34cd64b6..5c2e045f 100644 --- a/Sources/epoch_config/Configs/CfgEpochClient.hpp +++ b/Sources/epoch_config/Configs/CfgEpochClient.hpp @@ -14,7 +14,7 @@ /*[[[cog from arma_config_tools import *; json_to_arma()]]]*/ class CfgEpochClient { - epochVersion = "1.3.0"; + epochVersion = "1.3.1"; ArmAVersion = 176; debug = "true"; // true = enable extra rpt debug lines, false to disable @@ -40,24 +40,55 @@ class CfgEpochClient restrictedLocations[] = {"NameCityCapital"}; restrictedLocationsRange = 300; buildingRequireJammer = 1; //1 = require jammer to build - buildingJammerRange = 75; // jammer range in meters + buildingJammerRange = 125; // Unused by Epoch, but leave it to prevent issues with custom scripts (should be set to the max possible JammerRange from cfgJammers) jammerPerGroup = 1; // allowed number of jammers per group. jammerGLOnly = 1; // allow only group leader to place Jammer minJammerDistance = 650; // min distance to next Jammer maxBuildingHeight = 100; // Max Height, building is allowed. - buildingCountLimit = 200; //overall building limit in range of jammer (overridden if "useGroupCountLimits=1") - storageCountLimit = 100; //overall storage limit in range of jammer (triggers only if "splitCountLimits=1" & "useGroupCountLimits=0") splitCountLimits = 0; //1 = distinguish buildingCountLimit from storageCountLimit (ex.: buildingCountLimit=100, storageCountLimit=100 >> you can build 100 baseparts AND additional 100 storage objects like safes, lockboxes...) - useGroupCountLimits = 1; //1 = enable leader and member counts (doesn´t affect "splitCountLimits") - buildingCountLeader = 250; //ignore if "useGroupCountLimits=0" - buildingCountPerMember = 5; //ignore if "useGroupCountLimits=0" - storageCountLeader = 10; //ignore if "splitCountLimits=0" & "useGroupCountLimits=0" - storageCountPerMember = 5; //ignore if "splitCountLimits=0" & "useGroupCountLimits=0" - maxdoors = 10; // Max allowed doors per Group - maxgates = 5; // Max allowed Gates per Group - maxCams = 2; // Max allowed BaseCams per Group - MaxBuildingTilt = 180; // Max degrees players can tilt building elements + + class CfgJammers { + class PlotPole_EPOCH // Jammer Classname + { + buildingJammerRange = 75; // jammer range in meters + buildingCountLimit = 200; // Max Building Elements per Base + storageCountLimit = 100; // Max Storage Elements per Base + buildingCountPerMember = 5; // Additional Building elements per Member + storageCountPerMember = 5; // Additional Storage elements per Member + maxdoors = 10; // Max Doors per Base + maxgates = 5; // Max Gates per Base + maxCams = 2; // Max Cams per Base + }; + class PlotPole_M_EPOCH : PlotPole_EPOCH // inherits from "PlotPole_EPOCH" (not defined values will be taken from PlotPole_EPOCH) + { + buildingJammerRange = 100; // jammer range in meters + buildingCountLimit = 215; // Max Building Elements per Base + storageCountLimit = 115; // Max Storage Elements per Base + }; + class PlotPole_L_EPOCH : PlotPole_M_EPOCH + { + buildingJammerRange = 125; // jammer range in meters + buildingCountLimit = 230; // Max Building Elements per Base + storageCountLimit = 130; // Max Storage Elements per Base + }; + class PlotPole_XL_EPOCH : PlotPole_L_EPOCH + { + buildingJammerRange = 150; // jammer range in meters + buildingCountLimit = 245; // Max Building Elements per Base + storageCountLimit = 145; // Max Storage Elements per Base + }; + class PlotPole_XXL_EPOCH : PlotPole_XL_EPOCH + { + buildingJammerRange = 175; // jammer range in meters + buildingCountLimit = 260; // Max Building Elements per Base + storageCountLimit = 160; // Max Storage Elements per Base + }; + }; + StorageClasses[] = {"Buildable_Storage","Buildable_Storage_SIM","Buildable_Storage_Ghost","Constructions_lockedstatic_F","Secure_Storage_Temp"}; + BuildingClasses[] = {"Constructions_static_F","Constructions_foundation_F","Const_Ghost_EPOCH"}; + DoorClasses[] = {"WoodLargeWallDoorL_EPOCH","WoodWall4_EPOCH","CinderWallDoorwHatch_EPOCH","WoodStairs3_EPOCH","JailWallDoor_EPOCH"}; + GateClasses[] = {"CinderWallGarage_EPOCH","WoodWallGarage_EPOCH","MetalWallGarage_EPOCH"}; AtmBlockedAtPlot = "true"; // Block ATM's in Plotpole-Range disableRemoteSensors = "true"; // disableRemoteSensors true/false diff --git a/Sources/epoch_config/Configs/CfgItemInteractions.hpp b/Sources/epoch_config/Configs/CfgItemInteractions.hpp index c13f55fd..5080dcfb 100644 --- a/Sources/epoch_config/Configs/CfgItemInteractions.hpp +++ b/Sources/epoch_config/Configs/CfgItemInteractions.hpp @@ -249,6 +249,14 @@ class CfgItemInteractions { buildClass = "Safe_SIM_EPOCH"; }; + class ItemSafe_s : Item_Build_base + { + buildClass = "Safe_s_SIM_EPOCH"; + }; + class ItemGunSafe : Item_Build_base + { + buildClass = "GunSafe_SIM_EPOCH"; + }; class JackKit : Item_Build_base { buildClass = "Jack_SIM_EPOCH"; @@ -499,6 +507,22 @@ class CfgItemInteractions { buildClass = "PlotPole_SIM_EPOCH"; }; + class KitPlotPole_M : Item_Build_base + { + buildClass = "PlotPole_M_SIM_EPOCH"; + }; + class KitPlotPole_L : Item_Build_base + { + buildClass = "PlotPole_L_SIM_EPOCH"; + }; + class KitPlotPole_XL : Item_Build_base + { + buildClass = "PlotPole_XL_SIM_EPOCH"; + }; + class KitPlotPole_XXL : Item_Build_base + { + buildClass = "PlotPole_XXL_SIM_EPOCH"; + }; class KitCinderWall : Item_Build_base { buildClass = "CinderWallHalf_EPOCH"; diff --git a/Sources/epoch_config/Configs/CfgItemSort.hpp b/Sources/epoch_config/Configs/CfgItemSort.hpp index e302e3c5..40e908c2 100644 --- a/Sources/epoch_config/Configs/CfgItemSort.hpp +++ b/Sources/epoch_config/Configs/CfgItemSort.hpp @@ -726,7 +726,6 @@ class CfgItemSort "20Rnd_762x51_DMR", "20Rnd_762x51_FNFAL", "30Rnd_556x45_G36", - "a2_akyellow_mag_EPOCH", "10Rnd_303", "100Rnd_556x45_BetaCMag", "10Rnd_762x54_SVD", @@ -1132,6 +1131,10 @@ class CfgItemSort "KitWoodFoundation", "KitFoundation", "KitPlotPole", + "KitPlotPole_M", + "KitPlotPole_L", + "KitPlotPole_XL", + "KitPlotPole_XXL", "KitCinderWall", "KitSolarGen", "KitSolarCharger", @@ -1152,6 +1155,8 @@ class CfgItemSort "ItemLockbox", "Pelt_EPOCH", "ItemSafe", + "ItemSafe_s", + "ItemGunSafe", "ItemSolar", "ItemCables", "ItemBattery", diff --git a/Sources/epoch_config/Configs/CfgPricing.hpp b/Sources/epoch_config/Configs/CfgPricing.hpp index a0d974da..22c8f8ad 100644 --- a/Sources/epoch_config/Configs/CfgPricing.hpp +++ b/Sources/epoch_config/Configs/CfgPricing.hpp @@ -330,6 +330,16 @@ class CfgPricing price = 1250; tax = 0.5; }; + class ItemSafe_s + { + price = 1250; + tax = 0.5; + }; + class ItemGunSafe + { + price = 1250; + tax = 0.5; + }; class ItemCompass { price = 3; @@ -2766,11 +2776,6 @@ class CfgPricing price = 5; tax = 0.9; }; - class a2_akyellow_mag_EPOCH - { - price = 5; - tax = 0.9; - }; class 10Rnd_303 { price = 5; @@ -3434,6 +3439,22 @@ class CfgPricing { price = 250; }; + class KitPlotPole_M + { + price = 350; + }; + class KitPlotPole_L + { + price = 450; + }; + class KitPlotPole_XL + { + price = 550; + }; + class KitPlotPole_XXL + { + price = 650; + }; class KitSolarGen { price = 325; diff --git a/Sources/epoch_config/Configs/CfgRemoteExec.hpp b/Sources/epoch_config/Configs/CfgRemoteExec.hpp index 1fa7164a..01950c5e 100644 --- a/Sources/epoch_config/Configs/CfgRemoteExec.hpp +++ b/Sources/epoch_config/Configs/CfgRemoteExec.hpp @@ -26,6 +26,11 @@ class CfgRemoteExec { mode = 1; jip = 0; + class EPOCH_server_PutCrypto + { + allowedTargets=2; + jip = 0; + }; class EPOCH_server_SetFinalPlayerPos { allowedTargets=2; diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf index c52e3e9f..217870b6 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_Simulated","_DamageAllowed","_ExceptedBaseObjects","_IndestructibleBaseObjects","_UseIndestructible","_VAL","_ammoClass","_ammoObj","_anims","_animsData","_arr","_arrCount","_baseObj","_buildingJammerRange","_cfgBaseBuilding","_cfgEpochClient","_class","_color","_damage","_location","_marker","_maxTTL","_owner","_response","_serverSettingsConfig","_storageSlot","_textureSlot","_ttl","_vehHiveKey","_worldspace"]; +private ["_Simulated","_DamageAllowed","_ExceptedBaseObjects","_IndestructibleBaseObjects","_UseIndestructible","_VAL","_ammoClass","_ammoObj","_anims","_animsData","_arr","_arrCount","_baseObj","_cfgBaseBuilding","_class","_color","_damage","_location","_marker","_maxTTL","_owner","_response","_serverSettingsConfig","_storageSlot","_textureSlot","_ttl","_vehHiveKey","_worldspace"]; //[[[end]]] EPOCH_BaseCams = []; EPOCH_Plotpoles = []; @@ -27,10 +27,7 @@ _UseDeSimulateObjects = [_serverSettingsConfig, "UseDeSimulateObjects", true] ca _DeSimulateObjects = [_serverSettingsConfig, "DeSimulateObjects", []] call EPOCH_fnc_returnConfigEntry; _ExceptedDeSymObjects = [_serverSettingsConfig, "ExceptedDeSymObjects", []] call EPOCH_fnc_returnConfigEntry; _DisableDoorsOnObj = [_serverSettingsConfig, "DisableDoorsOnObj", []] call EPOCH_fnc_returnConfigEntry; -_cfgEpochClient = 'CfgEpochClient' call EPOCH_returnConfig; _cfgBaseBuilding = 'CfgBaseBuilding' call EPOCH_returnConfig; -_buildingJammerRange = getNumber(_cfgEpochClient >> "buildingJammerRange"); -if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; }; _VAL = ["", [], "", "", 0, []]; @@ -154,7 +151,7 @@ for "_i" from 0 to _this do { }; // Handle Jammers and create marker if EPOCH_SHOW_JAMMERS set true. - if (_class in ["PlotPole_EPOCH","BaseCam_EPOCH"]) then { + if (_class in ((call EPOCH_JammerClasses) + ["BaseCam_EPOCH"])) then { if (_owner != "-1") then { _baseObj setVariable ["BUILD_OWNER", _owner, true]; }; @@ -165,7 +162,7 @@ for "_i" from 0 to _this do { // Set PubVar later after all Cams are loaded in }; - if (_class isequalto "PlotPole_EPOCH") then { + if (_class in (call EPOCH_JammerClasses)) then { EPOCH_Plotpoles pushbackunique _baseObj; if (EPOCH_SHOW_JAMMERS) then { _marker = createMarker [str(_location), _location]; diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf index 1057e147..6f2f27e9 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf @@ -26,7 +26,7 @@ NOTHING */ //[[[cog import generate_private_arrays ]]] -private ["_buildingJammerRange","_cIndex","_cfgEpochClient","_counter","_current_crypto","_objSlot","_playerCryptoLimit","_playerUID","_storSlot","_vars"]; +private ["_cIndex","_counter","_current_crypto","_objSlot","_playerCryptoLimit","_playerUID","_storSlot","_vars"]; //[[[end]]] params [["_object",objNull],"_player","_maintCount",["_token","",[""]] ]; @@ -34,14 +34,10 @@ if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; if (isNull _object) exitWith{}; if (_player distance _object > 20) exitWith{}; -_cfgEpochClient = 'CfgEpochClient' call EPOCH_returnConfig; -_buildingJammerRange = getNumber(_cfgEpochClient >> "buildingJammerRange"); -if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; }; - _playerUID = getPlayerUID _player; _counter = 0; -if (typeOf _object == "PlotPole_EPOCH") then { +if (typeOf _object in (call EPOCH_JammerClasses)) then { _objSlot = _object getVariable["BUILD_SLOT", -1]; if (_objSlot != -1) then { @@ -76,7 +72,7 @@ if (typeOf _object == "PlotPole_EPOCH") then { }; }; if (_counter > _maintCount) exitWith{}; - } forEach nearestObjects[_object, ["Constructions_static_F","Constructions_foundation_F","Buildable_Storage","Constructions_lockedstatic_F"], _buildingJammerRange]; + } forEach nearestObjects[_object, ["Constructions_static_F","Constructions_foundation_F","Buildable_Storage","Constructions_lockedstatic_F"], call EPOCH_MaxJammerRange]; // effect crypto _playerCryptoLimit = EPOCH_customVarLimits select _cIndex; diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf index 3d1a92f7..bd47c6d4 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf @@ -53,6 +53,11 @@ if (isText _staticClassConfig) then { if (getNumber(_cfgBaseBuilding >> _staticClass >> "isSecureStorage") == 1) then{ _storageObj setVariable["EPOCH_Locked", false, true]; + if (_storageObj isKindOf "GunSafe_EPOCH") then { + { + _storageObj animate [_x,1]; + } foreach ["door1","door2","handle1","handle2"]; + }; }; _storageObj setVariable["STORAGE_OWNERS", [_playerUID]]; @@ -69,7 +74,7 @@ if (isText _staticClassConfig) then { } else { // TODO: optimize by using config var - if (_vehicle isKindOf "ThingX" || _vehicle isKindOf "Const_Ghost_EPOCH" || _vehicle isKindOf "PlotPole_EPOCH") then { + if (_vehicle isKindOf "ThingX" || _vehicle isKindOf "Const_Ghost_EPOCH" || ({_vehicle isKindOf _x} count (call EPOCH_JammerClasses) > 0)) then { _objSlot = _vehicle getVariable["BUILD_SLOT", -1]; if (_objSlot == -1) then{ @@ -100,7 +105,8 @@ if (isText _staticClassConfig) then { else { _newVehicle setVariable["BUILD_OWNER", _playerUID, true]; }; - if (_newVehicle isKindOf "PlotPole_EPOCH") then { + if ({_newVehicle isKindOf _x} count (call EPOCH_JammerClasses) > 0) then { + EPOCH_Plotpoles = EPOCH_Plotpoles - [ObjNull]; EPOCH_Plotpoles pushBackUnique _newVehicle; publicvariable "EPOCH_Plotpoles"; }; diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf index 767ea248..a692b57e 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf @@ -13,13 +13,30 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_cfgBaseBuilding","_class","_newObj","_objSlot","_objType","_upgrade","_upgrades"]; +private ["_cfgBaseBuilding","_class","_newObj","_objSlot","_objType","_upgrade","_upgrades","_Skip"]; //[[[end]]] -params ["_object","_player",["_index",0],["_token","",[""]] ]; +params ["_object","_player",["_index",0],["_token","",[""]],["_CryptoCosts",0]]; if (isNull _object) exitWith{}; if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; +_Skip = false; +if (_CryptoCosts > 0) then { + _cIndex = EPOCH_customVars find "Crypto"; + _vars = _player getVariable["VARS", call EPOCH_defaultVars_SEPXVar]; + _current_crypto = _vars select _cIndex; + if (_current_crypto < _CryptoCosts) Exitwith { + _Skip = true; + }; + _playerCryptoLimit = EPOCH_customVarLimits select _cIndex; + _playerCryptoLimit params ["_playerCryptoLimitMax","_playerCryptoLimitMin"]; + _current_crypto = ((_current_crypto - _CryptoCosts) min _playerCryptoLimitMax) max _playerCryptoLimitMin; + _current_crypto remoteExec ['EPOCH_effectCrypto',_player]; + _vars set[_cIndex, _current_crypto]; + _player setVariable["VARS", _vars]; +}; +if (_Skip) exitwith {}; + _objSlot = _object getVariable["BUILD_SLOT", -1]; _cfgBaseBuilding = 'CfgBaseBuilding' call EPOCH_returnConfig; if (_objSlot != -1) then { diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf index e1a5aeed..d159c501 100644 --- a/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf +++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_swapBuilding.sqf @@ -1,13 +1,29 @@ // _newObj = [_class,_object] call EPOCH_swapBuilding; //[[[cog import generate_private_arrays ]]] -private ["_newObj","_objectPos"]; +private ["_newObj","_objectPos","_owner","_UpdatePlots"]; //[[[end]]] -params [["_class",""],["_object",objNull],["_method",0]]; +params [["_class",""],["_object",objNull],["_method",1]]; _newObj = objNull; if (!isNull _object && !(_class isEqualTo "")) then { _objectPos = getPosWorld _object; _newObj = createVehicle [_class, ASLtoAGL _objectPos, [], 0, "CAN_COLLIDE"]; if (!isNull _newObj) then { + _owner = _object getvariable ["Build_Owner",""]; + if !(_owner isEqualTo "") then { + _newObj setVariable ["BUILD_OWNER", _owner, true]; + }; + _UpdatePlots = false; + if (_object in EPOCH_Plotpoles) then { + EPOCH_Plotpoles = EPOCH_Plotpoles - [_object]; + _UpdatePlots = true; + }; + if (_class in (call EPOCH_JammerClasses)) then { + EPOCH_Plotpoles pushback _newObj; + _UpdatePlots = true; + }; + if (_UpdatePlots) then { + publicvariable 'EPOCH_Plotpoles'; + }; _object hideObjectGlobal true; switch (_method) do { case 0: { @@ -17,6 +33,7 @@ if (!isNull _object && !(_class isEqualTo "")) then { }; case 1: { _newObj attachTo [_object,[0,0,0]]; + detach _newObj; }; /* case 2: { diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf index 4017fbe1..b850da0f 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf @@ -143,7 +143,7 @@ if (!isNull _player) then { if (surfaceiswater _newLocation) then { _CheckLocation = ATLToASL _newLocation; }; - _jammers = nearestObjects[_CheckLocation, ["PlotPole_EPOCH"], 6]; + _jammers = nearestObjects[_CheckLocation, call EPOCH_JammerClasses, 6]; if !(_jammers isEqualTo[]) then { // get nearby object _jammer = _jammers param [0,objNull]; diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_PutCrypto.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_PutCrypto.sqf new file mode 100644 index 00000000..855b0509 --- /dev/null +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_PutCrypto.sqf @@ -0,0 +1,46 @@ +/* + Author: He-Man - EpochMod.com + + Contributors: + + Description: Puts Crypto Items on the Ground + + 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_server\compile\epoch_server\EPOCH_server_PutCrypto.sqf + + Usage: + [player,_value,Epoch_personalToken] remoteexec ['EPOCH_server_PutCrypto',2] + + RETURNS: NOTHING +*/ + +private ["_cIndex","_vars","_current_crypto","_pos","_dist","_direction","_randomPos","_itemclass","_var","_item"]; +params ["_player","_Putcrypto",["_token","",[""]]]; +diag_log format ["PutCrypto Server Side - %1",_this]; +if !([_player, _token] call EPOCH_server_getPToken) exitWith{}; +_cIndex = EPOCH_customVars find 'Crypto'; +_vars = _player getVariable['VARS', call EPOCH_defaultVars_SEPXVar]; +_current_crypto = _vars select _cIndex; +if (_current_crypto < _Putcrypto) exitwith { + ["Not enough money",5] remoteexec ["Epoch_Message",_player]; +}; +_current_crypto = _current_crypto - _Putcrypto; +_vars set[_cIndex, _current_crypto]; +_player setVariable['VARS', _vars]; +_current_crypto remoteExec ['EPOCH_effectCrypto',_player]; +[format ["You put %1 Crypto on the Ground",_Putcrypto],5] remoteexec ["Epoch_Message",_player]; +[_player,_vars,_token] call EPOCH_fnc_savePlayer; +_pos = getposatl _player; +while {_Putcrypto > 0} do { + _itemclass = if (_Putcrypto >= 1000) then {"Land_Suitcase_F"} else {"Land_Money_F"}; + _var = if (_Putcrypto >= 1000) then {1000} else {_Putcrypto min 100}; + _Putcrypto = _Putcrypto - _var; + _item = createVehicle [_itemclass,_pos,[],1,"CAN_COLLIDE"]; + _item setvariable ["RemoveOnTake",true]; + _item allowdamage false; + _item enablesimulationglobal false; + _item setvariable ["Crypto",_var,true]; +}; diff --git a/Sources/epoch_server/compile/epoch_server/EPOCH_server_isNearChecks.sqf b/Sources/epoch_server/compile/epoch_server/EPOCH_server_isNearChecks.sqf index 13484ab0..7cb42cb3 100644 --- a/Sources/epoch_server/compile/epoch_server/EPOCH_server_isNearChecks.sqf +++ b/Sources/epoch_server/compile/epoch_server/EPOCH_server_isNearChecks.sqf @@ -8,7 +8,7 @@ _position - position on map _traderCheck - BOOL - check _position distance near ProtectionZone_Invisible_F - _jammerCheck - BOOL - check _position distance near PlotPole_EPOCH + _jammerCheck - BOOL - check _position distance near PlotPoles _playerCheck - BOOL - check _position distance near other Players _others - ARRAY - positions to check with _distFromOthers _distFromOthers - NUMBER - How far away from _others array in meters @@ -30,7 +30,7 @@ if(_traderCheck)then{ //CHECK FOR JAMMERS IN THE AREA WITHIN CONFIG RANGE if(_jammerCheck)then{ - _jammers = nearestObjects[_position, ["PlotPole_EPOCH"], _distFromJammers]; + _jammers = nearestObjects[_position, call EPOCH_JammerClasses, _distFromJammers]; if(count _jammers > 0) then { _return = false; }; diff --git a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf index 7497718f..4f19f190 100644 --- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf +++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf @@ -16,7 +16,7 @@ private [ "_TraderGodMode","_StaticTraderItemPurge","_DynamicTraderRespawnCount","_TraderItemsDeleteRestart","_TraderInit","_TraderItemsClean","_newstock","_agent","_aiTables", "_arr","_config","_currentStock","_existingStock","_indexStock","_markers","_objHiveKey","_pos","_randomAIUniform","_response","_response2","_schedule", "_serverSettingsConfig","_staticTrader","_staticTradersArrCount","_staticTradersArray","_storedVehicleLimit","_traderSlotIndex","_work","_arrchanged","_deleteat","_maxrnd", - "_WinterDeco","_HelloweenDeco","_buildingJammerRange","_TraderDeco" + "_WinterDeco","_HelloweenDeco","_TraderDeco" ]; //[[[end]]] params [["_maxTraderLimit",0]]; @@ -35,7 +35,6 @@ _DynamicTraderRespawnCount = [_serverSettingsConfig, "DynamicTraderRespawnCount" _TraderItemCountPerItem = [_serverSettingsConfig, "TraderItemCountPerItem", [100,100]] call EPOCH_fnc_returnConfigEntry; _TraderItemsDeleteRestart = [_serverSettingsConfig, "TraderItemsDeleteRestart", []] call EPOCH_fnc_returnConfigEntry; _TraderDeco = [_serverSettingsConfig, "TraderDeco", true] call EPOCH_fnc_returnConfigEntry; -_buildingJammerRange = ["CfgEpochClient", "buildingJammerRange", 75] call EPOCH_fnc_returnConfigEntryV2; _WinterDeco = (Epoch_ServerRealtime select 1) == 12 && (Epoch_ServerRealtime select 2) > 20 && _TraderDeco; _HelloweenDeco = (((Epoch_ServerRealtime select 1) == 10 && (Epoch_ServerRealtime select 2) >= 24) || ((Epoch_ServerRealtime select 1) == 11 && (Epoch_ServerRealtime select 2) <= 3)) && _TraderDeco; @@ -200,7 +199,7 @@ for "_i" from 0 to (_maxTraderLimit-1) do { if (daytime > (_schedule select 0) && daytime < (_schedule select 1)) then { _pos = (_work select 0); }; - if (!(count (_arr select 0) >= _DynamicTraderRespawnCount) && (nearestobjects [_pos,["Plotpole_EPOCH"],_buildingJammerRange]) isequalto []) then { + if (!(count (_arr select 0) >= _DynamicTraderRespawnCount) && (nearestobjects [_pos,call EPOCH_JammerClasses,call EPOCH_MaxJammerRange]) isequalto []) then { EPOCH_TraderSlots deleteAt _traderSlotIndex; _agent = createAgent [_class, _pos, [], 0, "NONE"]; if !(EPOCH_forceStaticTraders) then { diff --git a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf index 9a6c4f2b..732b5888 100644 --- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf +++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf @@ -15,7 +15,7 @@ //[[[cog import generate_private_arrays ]]] private [ "_serverSettingsConfig","_acceptableBlds","_agent","_aiClass","_aiTables","_buildingHome","_buildingWork","_buildings","_checkBuilding","_config","_endTime","_home", "_homes","_markers","_objHiveKey","_pos","_position","_randomAIUniform","_return","_schedule","_slot","_spawnCount","_startTime","_traderHomes","_usedBuildings","_work", - "_WinterDeco","_HelloweenDeco","_buildingJammerRange","_TraderDeco","_TraderMinDistance","_traderblockblds","_Traderblocks" + "_WinterDeco","_HelloweenDeco","_TraderDeco","_TraderMinDistance","_traderblockblds","_Traderblocks" ]; //[[[end]]] _serverSettingsConfig = configFile >> "CfgEpochServer"; @@ -30,11 +30,10 @@ if (_TraderMinDistance isEqualto 0) then { }; _traderblockblds = getArray(_config >> "traderblockblds"); if (_traderblockblds isEqualto []) then { - _traderblockblds = ["pier","bridge","fireescape","medevac_house","pillboxbunker"]; + _traderblockblds = ["pier","bridge","fireescape","medevac_house","pillboxbunker","containerine"]; }; _traderHomes = getArray(_config >> "traderHomes"); _TraderDeco = [_serverSettingsConfig, "TraderDeco", true] call EPOCH_fnc_returnConfigEntry; -_buildingJammerRange = ["CfgEpochClient", "buildingJammerRange", 75] call EPOCH_fnc_returnConfigEntryV2; _WinterDeco = (Epoch_ServerRealtime select 1) == 12 && (Epoch_ServerRealtime select 2) > 20 && _TraderDeco; _HelloweenDeco = (((Epoch_ServerRealtime select 1) == 10 && (Epoch_ServerRealtime select 2) >= 24) || ((Epoch_ServerRealtime select 1) == 11 && (Epoch_ServerRealtime select 2) <= 3)) && _TraderDeco; @@ -74,7 +73,7 @@ for "_i" from 1 to _spawnCount do { _usedBuildings pushBack _buildingWork; _home = selectRandom (_buildingHome buildingPos -1); _work = selectRandom (_buildingWork buildingPos -1); - if ((nearestobjects [_home,["Plotpole_EPOCH"],_buildingJammerRange]) isequalto [] && (nearestobjects [_work,["Plotpole_EPOCH"],_buildingJammerRange]) isequalto []) then { + if ((nearestobjects [_home,call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) isequalto [] && (nearestobjects [_work,call EPOCH_JammerClasses, call EPOCH_MaxJammerRange]) isequalto []) then { _startTime = floor(random 16); _endTime = _startTime + 8; _schedule = [_startTime, _endTime]; diff --git a/Sources/epoch_server/compile/epoch_trading/EPOCH_server_takeCrypto.sqf b/Sources/epoch_server/compile/epoch_trading/EPOCH_server_takeCrypto.sqf index 3bffdcf9..30bdcb53 100644 --- a/Sources/epoch_server/compile/epoch_trading/EPOCH_server_takeCrypto.sqf +++ b/Sources/epoch_server/compile/epoch_trading/EPOCH_server_takeCrypto.sqf @@ -15,21 +15,21 @@ //[[[cog import generate_private_arrays ]]] private ["_getCrypto"]; //[[[end]]] -params ["_player",["_token","",[""]],"_object"]; +params ["_player",["_token","",[""]],["_CryptoItems",[]]]; if !([_player,_token] call EPOCH_server_getPToken) exitWith {}; -if (isNull _object) exitWith {}; -if (_player distance _object > 10) exitWith {}; -_getCrypto = _object getVariable["Crypto", 0]; -if (_getCrypto > 0) then { - // remove crypto from object - _object setVariable["Crypto", nil, true]; - if (_object getvariable ["RemoveOnTake",false]) then { - deletevehicle _object; +_getCrypto = 0; +{ + if (_player distance _x < 10) then { + _getCrypto = _getCrypto + (_x getVariable ["Crypto", 0]); + _x setVariable ["Crypto", nil, true]; + if (_x getvariable ["RemoveOnTake",false]) then { + deletevehicle _x; + }; }; - // send data back to player +} foreach _CryptoItems; +if (_getCrypto > 0) then { [_player,_getCrypto] call EPOCH_server_effectCrypto; - // debug and logging. - diag_log format["Epoch: ADMIN: %1 picked up %2 Crypto from object %3 with puid %4 at %5", getPlayerUID _player, _getCrypto, [_object, typeOf _object],_object getVariable['PUID', ''],getposATL _object]; -}; + diag_log format["Epoch: ADMIN: %1 picked up %2 Crypto at %3", getPlayerUID _player, _getCrypto, getposATL _player]; +}; \ No newline at end of file diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf index 1bf132a6..219e5220 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_ExceptedBaseObjects","_IndestructibleBaseObjects","_UseIndestructible","_arr","_attachments","_availableColorsConfig","_cfgBaseBuilding","_class","_class_raw","_color","_colors","_count","_damage","_diag","_dir","_inventory","_location","_magazineName","_magazineSize","_magazineSizeMax","_marker","_objQty","_objType","_objTypes","_qty","_response","_selections","_serverSettingsConfig","_storageSlotIndex","_textureSelectionIndex","_textures","_vehHiveKey","_vehicle","_wMags","_wMagsArray","_worldspace","_wsCount"]; +private ["_ExceptedBaseObjects","_AutoLockStorages","_IndestructibleBaseObjects","_UseIndestructible","_arr","_attachments","_availableColorsConfig","_cfgBaseBuilding","_class","_class_raw","_color","_colors","_count","_damage","_diag","_dir","_inventory","_location","_magazineName","_magazineSize","_magazineSizeMax","_marker","_objQty","_objType","_objTypes","_qty","_response","_selections","_serverSettingsConfig","_storageSlotIndex","_textureSelectionIndex","_textures","_vehHiveKey","_vehicle","_wMags","_wMagsArray","_worldspace","_wsCount"]; //[[[end]]] params [["_maxStorageLimit",0]]; @@ -21,6 +21,7 @@ _serverSettingsConfig = configFile >> "CfgEpochServer"; _UseIndestructible = [_serverSettingsConfig, "UseIndestructible", false] call EPOCH_fnc_returnConfigEntry; _IndestructibleBaseObjects = [_serverSettingsConfig, "IndestructibleBaseObjects", []] call EPOCH_fnc_returnConfigEntry; _ExceptedBaseObjects = [_serverSettingsConfig, "ExceptedBaseObjects", []] call EPOCH_fnc_returnConfigEntry; +_AutoLockStorages = [_serverSettingsConfig, "AutoLockStorages", false] call EPOCH_fnc_returnConfigEntry; _diag = diag_tickTime; EPOCH_StorageSlots = []; @@ -136,8 +137,16 @@ for "_i" from 1 to _maxStorageLimit do { if (count _arr >= 6) then { if (_class isKindOf 'Constructions_lockedstatic_F') then{ // set locked state of secure storage - if ((_arr select 6) != -1) then { + if (((_arr select 6) != -1) || _AutoLockStorages) then { _vehicle setVariable["EPOCH_Locked", true, true]; + } + else { + _vehicle setVariable["EPOCH_Locked", false, true]; + if (_vehicle iskindof "GunSafe_EPOCH") then { + { + _vehicle animate _x; + } foreach [['handle1',1],['handle2',1],['door1',1],['door2',1]]; + }; }; _vehicle setVariable ["STORAGE_OWNERS", _arr select 5]; }; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf index 9e20959c..855acd67 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_actualHitpoints","_allHitpoints","_allVehicles","_allowDamage","_arr","_arrNum","_availableColorsConfig","_cfgEpochVehicles","_check","_class","_colors","_config","_count","_dataFormat","_dataFormatCount","_diag","_disableVehicleTIE","_dmg","_found","_immuneIfStartInBase","_jammerOwner","_jammerRange","_jammers","_location","_lockedOwner","_marker","_nearestJammer","_removemagazinesturret","_removeweapons","_response","_selections","_serverSettingsConfig","_textureSelectionIndex","_textures","_vehHiveKey","_vehLockHiveKey","_vehicle","_vehicleDynamicSimulationSystem","_vehicleSlotIndex"]; +private ["_actualHitpoints","_allHitpoints","_allVehicles","_allowDamage","_arr","_arrNum","_availableColorsConfig","_cfgEpochVehicles","_check","_class","_colors","_count","_dataFormat","_dataFormatCount","_diag","_disableVehicleTIE","_dmg","_found","_immuneIfStartInBase","_jammerOwner","_jammers","_location","_lockedOwner","_marker","_nearestJammer","_removemagazinesturret","_removeweapons","_response","_selections","_serverSettingsConfig","_textureSelectionIndex","_textures","_vehHiveKey","_vehLockHiveKey","_vehicle","_vehicleDynamicSimulationSystem","_vehicleSlotIndex"]; //[[[end]]] params [["_maxVehicleLimit",0]]; @@ -23,10 +23,6 @@ _dataFormatCount = count _dataFormat; EPOCH_VehicleSlots = []; _allVehicles = []; - -_config = 'CfgEpochClient' call EPOCH_returnConfig; -_jammerRange = getNumber(_config >> "buildingJammerRange"); - _serverSettingsConfig = configFile >> "CfgEpochServer"; _immuneIfStartInBase = [_serverSettingsConfig, "immuneIfStartInBase", true] call EPOCH_fnc_returnConfigEntry; _vehicleDynamicSimulationSystem = [_serverSettingsConfig, "vehicleDynamicSimulationSystem", true] call EPOCH_fnc_returnConfigEntry; @@ -191,7 +187,7 @@ for "_i" from 1 to _maxVehicleLimit do { // allow damage _allowDamage = true; if (_immuneIfStartInBase) then { - _jammers = nearestObjects[_vehicle, ["PlotPole_EPOCH"], _jammerRange]; + _jammers = nearestObjects[_vehicle, call EPOCH_JammerClasses,call EPOCH_MaxJammerRange]; if!(_jammers isEqualTo [])then { // get jammer owner _nearestJammer = _jammers select 0; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf index 98deb299..3d4403e7 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf @@ -27,6 +27,10 @@ _playerGroup = _player getVariable["GROUP", ""]; _fnc_Lock_Unlock = { _locked = !_locked; _unit setVariable ["EPOCH_Locked", _locked, true]; + if (_unit iskindof "GunSafe_EPOCH") then { + _animations = if (_locked) then {[['door1',0],['door2',0],['handle1',0],['handle2',0]]} else {[['handle1',1],['handle2',1],['door1',1],['door2',1]]}; + [_unit,_animations,[0,1,0]] remoteexec ['EPOCH_fnc_AnimateScheduled',_player]; + }; _LockStateChanged = true; }; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedBuilding.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedBuilding.sqf index 4175adb0..7af8c707 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedBuilding.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedBuilding.sqf @@ -34,7 +34,7 @@ if (!isNull _building) then { EPOCH_BaseCams = EPOCH_BaseCams - [_building]; publicvariable "EPOCH_BaseCams"; }; - if (_building iskindof "PlotPole_EPOCH") then { + if (_building in (call EPOCH_JammerClasses)) then { EPOCH_Plotpoles = EPOCH_Plotpoles - [_building]; publicvariable "EPOCH_Plotpoles"; }; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedVehicle.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedVehicle.sqf index cdfdb274..8cb89d52 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedVehicle.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_save_killedVehicle.sqf @@ -21,7 +21,7 @@ if (!isNull _vehicle) then { if (_vehSlot != "ABORT") then { _vehHiveKey = format ["%1:%2", (call EPOCH_fn_InstanceID), _vehSlot]; ["Vehicle", _vehHiveKey] call EPOCH_fnc_server_hiveDEL; - EPOCH_VehicleSlots pushBack _vehSlot; + EPOCH_VehicleSlots pushBackUnique _vehSlot; missionNamespace setVariable ['EPOCH_VehicleSlotCount', count EPOCH_VehicleSlots, true]; diff --git a/Sources/epoch_server/config.cpp b/Sources/epoch_server/config.cpp index 86120866..b1a59ed2 100644 --- a/Sources/epoch_server/config.cpp +++ b/Sources/epoch_server/config.cpp @@ -129,6 +129,7 @@ class CfgServerFunctions class server_deleteGlobalMarkerSet {}; class server_isNearChecks {}; class server_DefuseBomb {}; + class server_PutCrypto {}; }; class epoch_missions { class Server_createObject {}; @@ -148,7 +149,7 @@ class CfgServerFunctions }; class CfgServerVersion { - client = "1.3.0"; - config = "1.3.0"; + client = "1.3.1"; + config = "1.3.1"; hive = "0.6.0.0"; }; diff --git a/Sources/epoch_server/init/server_init.sqf b/Sources/epoch_server/init/server_init.sqf index 9a9a1d66..949d98db 100644 --- a/Sources/epoch_server/init/server_init.sqf +++ b/Sources/epoch_server/init/server_init.sqf @@ -289,14 +289,13 @@ if ([_serverSettingsConfig, "disableAutoRefuel", false] call EPOCH_fnc_returnCon else { // Remove Auto-Refuel in PlotPole-Range if ([_serverSettingsConfig, "disableFuelNearPlots", true] call EPOCH_fnc_returnConfigEntry) then { - _buildingJammerRange = ["CfgEpochClient", "buildingJammerRange", 75] call EPOCH_fnc_returnConfigEntryV2; _staticFuelSources = []; { { _staticFuelSources pushback _x; - } foreach (((_x nearObjects ['Building',_buildingJammerRange]) select {getFuelCargo _x > 0})); + } foreach (((_x nearObjects ['Building',call EPOCH_MaxJammerRange]) select {getFuelCargo _x > 0})); - } foreach (missionnamespace getvariable ["Epoch_Plotpoles",allmissionobjects 'PlotPole_EPOCH']); + } foreach (missionnamespace getvariable ["Epoch_Plotpoles",call {_allplots = [];{_allplots append (allmissionobjects _x)} foreach (call EPOCH_JammerClasses);_allplots}]); missionNamespace setVariable ["EPOCH_staticFuelSources", _staticFuelSources, true]; }; }; @@ -309,7 +308,7 @@ missionNamespace setVariable ["EPOCH_taxRate", [_serverSettingsConfig, "taxRate" // pick random radioactive locations _radioactiveLocations = getArray(_epochConfig >> worldName >> "radioactiveLocations"); -_blacklist = getArray(_epochConfig >> worldName >> "radioactiveLocBLObjects"); +_blacklist = (call EPOCH_JammerClasses) + (getArray(_epochConfig >> worldName >> "radioactiveLocBLObjects")); _distance = getNumber(_epochConfig >> worldName >> "radioactiveLocBLDistance"); _radioactiveLocationsTmp = []; if !(_radioactiveLocations isEqualTo []) then { diff --git a/Sources/epoch_server/init/server_securityfunctions.sqf b/Sources/epoch_server/init/server_securityfunctions.sqf index c78a6f16..5f5747f7 100644 --- a/Sources/epoch_server/init/server_securityfunctions.sqf +++ b/Sources/epoch_server/init/server_securityfunctions.sqf @@ -49,7 +49,7 @@ _skn_badAnimations = [_cfg_blacklistConfig, "animations", ['AmovPercMstpSnonWnon _cfg_variablesConfig = (_config >> "variables"); _skn_badVarCheckArray = [_cfg_variablesConfig, "badVars", ['EPOCH_GMODE','ESP_map','ESP_mainMap','ESP_adminMap','AntiAntiAntiAntiHax','fnc_usec_damageHandler','fnc_usec_unconscious','VAGINA_secret','yolo','VERSION','life_fnc_handleDamage','EPOCH_spawnVehicle_PVS','CLASS911_Menu','nuke_vars','JJMMEE_INIT_MENU','PLAYERON','PLAYERNEXT2','ALTISLIFEON','LY_Menu','PLAY','LY_SwaggerLikeUs','BIS_fnc_dbg_reminder_value','BIS_fnc_dbg_reminder']] call EPOCH_fnc_returnConfigEntry; _skn_nilVarCheckArray = [_cfg_variablesConfig, "nilVars", ['EPOCH_antiWallCount','EPOCH_playerEnergy','EPOCH_playerHunger','EPOCH_playerStamina','EPOCH_playerCrypto','EPOCH_target','EPOCH_ESP_TARGETS','EPOCH_ESPMAP_TARGETS','EPOCH_taxRate','EPOCH_ESP_VEHICLEPLAYER','EPOCH_ESP_PLAYER','EPOCH_ESP_VEHICLES']] call EPOCH_fnc_returnConfigEntry; -_skn_commandMenuArray = [(_config >> "commandMenu"), "menus",['','RscSelectTeam','RscTeam','RscMenuTeam','RscMoveHigh','#GETIN','#RscStatus','#WATCH0','RscCombatMode','RscMenuReply','RscCallSupport','#CUSTOM_RADIO','#User:BIS_fnc_addCommMenuItem_menu','RscRadio','RscReply','#ACTION','RscMenuFormations','#WATCH','RscGroupRootMenu','RscMainMenu','RscMenuMove','RscWatchDir','RscWatchMoveDir','#User:BIS_Menu_GroupCommunication','RscMenuStatus','RscFormations']] call EPOCH_fnc_returnConfigEntry; +_skn_commandMenuArray = [(_config >> "commandMenu"), "menus",['','RscMenuEngage','RscSelectTeam','RscTeam','RscMenuTeam','RscMoveHigh','#GETIN','#RscStatus','#WATCH0','RscCombatMode','RscMenuReply','RscCallSupport','#CUSTOM_RADIO','#User:BIS_fnc_addCommMenuItem_menu','RscRadio','RscReply','#ACTION','RscMenuFormations','#WATCH','RscGroupRootMenu','RscMainMenu','RscMenuMove','RscWatchDir','RscWatchMoveDir','#User:BIS_Menu_GroupCommunication','RscMenuStatus','RscFormations']] call EPOCH_fnc_returnConfigEntry; _skn_addEHConfig = (_config >> "addEventHandler"); _skn_displayAddEHChecks = [_skn_addEHConfig, "checks",[]] call EPOCH_fnc_returnConfigEntry; @@ -422,7 +422,7 @@ for "_i" from 1 to 3 do { }; if ("MAP-BASEBUILDING" in _case) then { _temp = _temp + " - ,[' Base Building Marker', [], {"+_skn_tg_map_basebuilding+" = !"+_skn_tg_map_basebuilding+"; if ("+_skn_tg_map_basebuilding+") then {waitUntil {"+_skn_mapBasesArray+" = ([worldSize/2,worldSize/2,0]) nearObjects['PlotPole_EPOCH', 12500];uiSleep 15;!"+_skn_tg_map_basebuilding+"};"+_skn_mapBasesArray+" = []}; ['Base Building MARKER',if ("+_skn_tg_map_basebuilding+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] + ,[' Base Building Marker', [], {"+_skn_tg_map_basebuilding+" = !"+_skn_tg_map_basebuilding+"; if ("+_skn_tg_map_basebuilding+") then {waitUntil {"+_skn_mapBasesArray+" = (Epoch_PlotPoles - [objnull]);uiSleep 15;!"+_skn_tg_map_basebuilding+"};"+_skn_mapBasesArray+" = []}; ['Base Building MARKER',if ("+_skn_tg_map_basebuilding+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []] "; }; }; diff --git a/Sources/epoch_server_settings/config.cpp b/Sources/epoch_server_settings/config.cpp index c6f0c9bd..3eb0688d 100644 --- a/Sources/epoch_server_settings/config.cpp +++ b/Sources/epoch_server_settings/config.cpp @@ -20,7 +20,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = 0.1; - epochVersion = "1.3.0"; + epochVersion = "1.3.1"; requiredAddons[] = {}; #include "build.hpp" }; @@ -66,7 +66,7 @@ class CfgEpoch radioactiveLocationsCount = 3; // BlackList radioactive locations spawn by object and distance - radioactiveLocBLObjects[] = {"PlotPole_EPOCH"}; + radioactiveLocBLObjects[] = {}; // PlotPoles are already blacklisted by script radioactiveLocBLDistance = 500; // Custom Locations for Radiation @@ -81,7 +81,7 @@ class CfgEpoch traderHomes[] = {"Building"}; traderUniforms[] = {"U_OG_leader", "U_C_Poloshirt_stripped", "U_C_Poloshirt_blue", "U_C_Poloshirt_burgundy", "U_C_Poloshirt_tricolour", "U_C_Poloshirt_salmon", "U_C_Poloshirt_redwhite", "U_C_Poor_1", "U_C_WorkerCoveralls", "U_C_Journalist", "U_C_Scientist", "U_OrestesBody", "U_Chav_EPOCH"}; // TraderMinDistance = 1500; // Min distance between Traders. If not defined, Server will calculate it by MapSize - traderblockblds[] = {"pier","bridge","fireescape","medevac_house","pillboxbunker"}; // If a building include this chars in the classname (tolower!!!) they will be blocked for Traders + traderblockblds[] = {"pier","bridge","fireescape","medevac_house","pillboxbunker","containerine"}; // If a building include this chars in the classname (tolower!!!) they will be blocked for Traders // Debug Box telePos[] = {}; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable.h b/Sources/epoch_server_settings/configs/CfgLootTable.h index fb45f140..6c374555 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable.h @@ -80,6 +80,14 @@ class CfgLootTable { { "FAK", "magazine" }, 20 } }; }; + class Safes + { + items[] = { + { { "ItemSafe", "magazine" }, 1 }, +// { { "ItemSafe_s", "magazine" }, 1 }, // Variant with less Load than the normal Safe + { { "ItemGunSafe", "magazine" }, 1 } + }; + }; class Repairs { items[] = { @@ -331,7 +339,7 @@ class CfgLootTable { { "ItemBattery", "magazine" }, 5 }, { { "ItemCables", "magazine" }, 5 }, { { "ItemPipe", "magazine" }, 5 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemBarrelE", "magazine" }, 1 } @@ -342,7 +350,7 @@ class CfgLootTable { items[] = { { { "VehicleDocs", "CfgLootTable" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, @@ -1001,7 +1009,7 @@ class CfgLootTable { { "KitCinderWall", "magazine" }, 5 }, { { "KitFoundation", "magazine" }, 5 }, { { "KitWoodFoundation", "magazine" }, 14 }, - { { "ItemSafe", "magazine" }, 1 } + { { "Safes", "CfgLootTable" }, 1 } }; }; @@ -1014,7 +1022,7 @@ class CfgLootTable { { "BaseBuilding", "CfgLootTable" }, 20 }, { { "GenericLarge", "CfgLootTable" }, 24 }, { { "ItemLockbox", "magazine" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "Generic", "CfgLootTable" }, 10 }, { { "Tools", "CfgLootTable" }, 19 } }; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h b/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h index a8e2c52f..14a0d550 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h @@ -80,6 +80,14 @@ class CfgLootTable_CUP { { "FAK", "magazine" }, 20 } }; }; + class Safes + { + items[] = { + { { "ItemSafe", "magazine" }, 1 }, +// { { "ItemSafe_s", "magazine" }, 1 }, // Variant with less Load than the normal Safe + { { "ItemGunSafe", "magazine" }, 1 } + }; + }; class Repairs { items[] = { @@ -424,7 +432,7 @@ class CfgLootTable_CUP { { "ItemBattery", "magazine" }, 5 }, { { "ItemCables", "magazine" }, 5 }, { { "ItemPipe", "magazine" }, 5 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemBarrelE", "magazine" }, 1 } }; }; @@ -433,7 +441,7 @@ class CfgLootTable_CUP { items[] = { { { "VehicleDocs", "CfgLootTable" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, @@ -1550,7 +1558,7 @@ class CfgLootTable_CUP { { "KitCinderWall", "magazine" }, 5 }, { { "KitFoundation", "magazine" }, 5 }, { { "KitWoodFoundation", "magazine" }, 14 }, - { { "ItemSafe", "magazine" }, 1 } + { { "Safes", "CfgLootTable" }, 1 } }; }; @@ -1563,7 +1571,7 @@ class CfgLootTable_CUP { { "BaseBuilding", "CfgLootTable" }, 20 }, { { "GenericLarge", "CfgLootTable" }, 24 }, { { "ItemLockbox", "magazine" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "Generic", "CfgLootTable" }, 10 }, { { "Tools", "CfgLootTable" }, 19 } }; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h b/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h index eb068af7..4de1e99d 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h @@ -80,6 +80,14 @@ class CfgLootTable_MAD { { "FAK", "magazine" }, 20 } }; }; + class Safes + { + items[] = { + { { "ItemSafe", "magazine" }, 1 }, +// { { "ItemSafe_s", "magazine" }, 1 }, // Variant with less Load than the normal Safe + { { "ItemGunSafe", "magazine" }, 1 } + }; + }; class Repairs { items[] = { @@ -329,7 +337,7 @@ class CfgLootTable_MAD { { "ItemBattery", "magazine" }, 5 }, { { "ItemCables", "magazine" }, 5 }, { { "ItemPipe", "magazine" }, 5 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemBarrelE", "magazine" }, 1 } @@ -340,7 +348,7 @@ class CfgLootTable_MAD { items[] = { { { "VehicleDocs", "CfgLootTable" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, @@ -990,7 +998,7 @@ class CfgLootTable_MAD { { "KitCinderWall", "magazine" }, 5 }, { { "KitFoundation", "magazine" }, 5 }, { { "KitWoodFoundation", "magazine" }, 14 }, - { { "ItemSafe", "magazine" }, 1 } + { { "Safes", "CfgLootTable" }, 1 } }; }; @@ -1003,7 +1011,7 @@ class CfgLootTable_MAD { { "BaseBuilding", "CfgLootTable" }, 20 }, { { "GenericLarge", "CfgLootTable" }, 24 }, { { "ItemLockbox", "magazine" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "Generic", "CfgLootTable" }, 10 }, { { "Tools", "CfgLootTable" }, 19 } }; diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h b/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h index 31f421e8..35a8f8cf 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h @@ -80,6 +80,14 @@ class CfgLootTable_MADCUP { { "FAK", "magazine" }, 20 } }; }; + class Safes + { + items[] = { + { { "ItemSafe", "magazine" }, 1 }, +// { { "ItemSafe_s", "magazine" }, 1 }, // Variant with less Load than the normal Safe + { { "ItemGunSafe", "magazine" }, 1 } + }; + }; class Repairs { items[] = { @@ -424,7 +432,7 @@ class CfgLootTable_MADCUP { { "ItemBattery", "magazine" }, 5 }, { { "ItemCables", "magazine" }, 5 }, { { "ItemPipe", "magazine" }, 5 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemBarrelE", "magazine" }, 1 } }; }; @@ -433,7 +441,7 @@ class CfgLootTable_MADCUP { items[] = { { { "VehicleDocs", "CfgLootTable" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "ItemLockbox", "magazine" }, 4 }, { { "jerrycan_epoch", "magazine" }, 5 }, { { "CircuitParts", "magazine" }, 6 }, @@ -1557,7 +1565,7 @@ class CfgLootTable_MADCUP { { "KitCinderWall", "magazine" }, 5 }, { { "KitFoundation", "magazine" }, 5 }, { { "KitWoodFoundation", "magazine" }, 14 }, - { { "ItemSafe", "magazine" }, 1 } + { { "Safes", "CfgLootTable" }, 1 } }; }; @@ -1570,7 +1578,7 @@ class CfgLootTable_MADCUP { { "BaseBuilding", "CfgLootTable" }, 20 }, { { "GenericLarge", "CfgLootTable" }, 24 }, { { "ItemLockbox", "magazine" }, 4 }, - { { "ItemSafe", "magazine" }, 1 }, + { { "Safes", "CfgLootTable" }, 1 }, { { "Generic", "CfgLootTable" }, 10 }, { { "Tools", "CfgLootTable" }, 19 } }; diff --git a/changelog.md b/changelog.md index dfcd1419..e4370c72 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,34 @@ # Change Log All changes for [Arma 3](https://arma3.com/) [Epoch Mod](https://epochmod.com) are listed in this changelog. +## [1.3.1.0] - 2019-03-28 +### Added +- Upgradeable PlotPoles (S/M/L/XL/XXL) with different Range / Limits + - https://plays.tv/video/5c9925a6770ac037e4 +- On entering temp Vehicles, Payers will get a hint "Vehicle will despawn after restart" +- 2nd Variant of a lockable Safe "GunSafe_EPOCH" + - https://plays.tv/video/5c9926466b9589c5c6 +- License Plates of Vehicles can now be changed by Dyna-Menu (Space-Menu) + - https://plays.tv/video/5c99293fdea086f319 +- Put Krypto to ground (within Inventory) + - https://plays.tv/video/5c992604c58e543366 +### Fixed +- Prevent Traders from spawning on containers +- Advanced Vehicle Repair was not working as expected within custom "SafeZones" +- Reset Toxic after revive +- Delay for accurate position on swap building while basebuilding +### Changed +### Server Owners +- Configs for upgradeable PlotPoles are located in ("CfgEpochclient" >> "CfgJammers") +- Fixed BE-Kicks in DLC Shop +- Another login stuck fix (Loadabs-Check) +- Added possibility the usage of "Krypto" as needed material for building upgrades + - Example CfgBaseBuilding: + - upgradeBuilding[] = {{"PlotPole_L_EPOCH",{{"Krypto",1500}}}}; +- Fixed Ban for "commandMenu - RscMenuEngage" +- New var "AutoLockStorages" in epochconfig.hpp to auto-lock storages on server start +- Added optional safe variant with less Load than the normal Safe "ItemSafe_s" + ## [1.3.0.0] - 2019-01-31 ### Added - Several A2 Vehicles ported into Epoch