diff --git a/Server_Install_Pack/@epochhive/addons/Epoch_server_RyanZ_Spawner.pbo b/Server_Install_Pack/@epochhive/addons/Epoch_server_RyanZ_Spawner.pbo new file mode 100644 index 00000000..807bfd5a Binary files /dev/null and b/Server_Install_Pack/@epochhive/addons/Epoch_server_RyanZ_Spawner.pbo differ diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server.pbo index 2bb9f163..e687c1b8 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 cb04c6a5..096bb13e 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 994108f4..2a8f548f 100644 --- a/Server_Install_Pack/@epochhive/epochconfig.hpp +++ b/Server_Install_Pack/@epochhive/epochconfig.hpp @@ -8,7 +8,7 @@ forceRestartTime = 14400; // 4 hour restarts // Loot (Check CfgBuildingLootPos.hpp in mission file for more settings) lootMultiplier = 1; // 1 = normal loot multiplier. This controls how much loot can payout per loot container. - UseLootHelper = "true"; // GroundLoot will get a visible sphere for better loot identification + UseLootHelper = "false"; // GroundLoot will get a visible sphere for better loot identification // Events WeatherChances[] = { diff --git a/Server_Install_Pack/mpmissions/epoch.Altis.pbo b/Server_Install_Pack/mpmissions/epoch.Altis.pbo index 0199dfc3..cba83afc 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 314e853c..38a3b1a3 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 37bce262..b902ff9c 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 0cb742ce..e05d3754 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 45589d89..a0679844 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 cec61056..1b071f17 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 ffc14ea7..e5b1b445 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 8eb752d1..1e254abe 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.Enoch.pbo b/Server_Install_Pack/mpmissions/epoch.Enoch.pbo index 34642197..875b520e 100644 Binary files a/Server_Install_Pack/mpmissions/epoch.Enoch.pbo and b/Server_Install_Pack/mpmissions/epoch.Enoch.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.Esseker.pbo b/Server_Install_Pack/mpmissions/epoch.Esseker.pbo index 8b8cffa7..217cf085 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 346029b8..4571cf69 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 e7b7cbb8..d2e33c41 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 b0558293..954ed915 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 ee8f2006..94bcb0bc 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 0b95fdba..0e7da643 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 7c4cfec6..ed4c73df 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 641f6c2e..88459166 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 c63d0aaa..1a7bb742 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 70d3f8bb..dcf6c20e 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 c13aebee..145707d8 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 724d1518..b49dceea 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 352d6d7e..864790b6 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 26abfbfa..dc14f194 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 ccc4a1f2..672067c4 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 ffcb2033..dac6e110 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 1458347c..35c1a4f6 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 8dcf09a7..feb5acea 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 9bf12cda..c7205044 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 20ae47d6..d125354e 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._ChangeMe.pbo b/Server_Install_Pack/mpmissions/epoch._ChangeMe.pbo index 6d2d772e..08f29b73 100644 Binary files a/Server_Install_Pack/mpmissions/epoch._ChangeMe.pbo and b/Server_Install_Pack/mpmissions/epoch._ChangeMe.pbo differ diff --git a/Server_Install_Pack/mpmissions/epoch.abramia.pbo b/Server_Install_Pack/mpmissions/epoch.abramia.pbo index 004fd394..b85cadb1 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 7f709b57..70986cfd 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 07d1cccf..4d3e7167 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 ec15b36f..4b548854 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 53d448ab..b3ce7604 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 2a1dd94e..55d7b334 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|putcrypto|paintvehicle|spawnLoot) \[.+\]" +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|zedspawner) \[.+\]" !="cup_fnc_handletow \[.+\]" !="bis_fnc_reviveinitaddplayer \[.+\]" !="epoch_server_(setfinalplayerpos|defusebomb|putcrypto|paintvehicle|spawnLoot) \[.+\]" diff --git a/Server_Install_Pack/sc/battleye/setdamage.txt b/Server_Install_Pack/sc/battleye/setdamage.txt index 69d9ecda..204d0590 100644 --- a/Server_Install_Pack/sc/battleye/setdamage.txt +++ b/Server_Install_Pack/sc/battleye/setdamage.txt @@ -1 +1 @@ -5 "" \ No newline at end of file +5 "" !"0.700000" \ No newline at end of file diff --git a/Sources/Epoch_server_RyanZ_Spawner/$PREFIX$ b/Sources/Epoch_server_RyanZ_Spawner/$PREFIX$ new file mode 100644 index 00000000..6c1c8080 --- /dev/null +++ b/Sources/Epoch_server_RyanZ_Spawner/$PREFIX$ @@ -0,0 +1 @@ +Epoch_RyanZ_Spawner \ No newline at end of file diff --git a/Sources/Epoch_server_RyanZ_Spawner/PboPrefix.txt b/Sources/Epoch_server_RyanZ_Spawner/PboPrefix.txt new file mode 100644 index 00000000..6c1c8080 --- /dev/null +++ b/Sources/Epoch_server_RyanZ_Spawner/PboPrefix.txt @@ -0,0 +1 @@ +Epoch_RyanZ_Spawner \ No newline at end of file diff --git a/Sources/Epoch_server_RyanZ_Spawner/ZedSpawner/Epoch_ZombieSpawn.sqf b/Sources/Epoch_server_RyanZ_Spawner/ZedSpawner/Epoch_ZombieSpawn.sqf new file mode 100644 index 00000000..fab2d131 --- /dev/null +++ b/Sources/Epoch_server_RyanZ_Spawner/ZedSpawner/Epoch_ZombieSpawn.sqf @@ -0,0 +1,114 @@ +waituntil {uisleep 1; !isnil "Ryanzombiesdamage" && !isnil "Ryanzombieshealth" && !isnil "Ryanzombieslimit" && !isnil "RZ_fnc_zombie_attackHuman" && !isnil "RZ_CrawlerAggressiveArray"}; +uisleep 15; + +params [ + ["_Ryanzombiesdamage",0.018], + ["_Ryanzombieshealth",0.95], + ["_ryanzombiesinfectedchance",0], + ["_ryanzombiesinfectedrate",0], + ["_ryanzombiesinfectedsymptoms",0], + ["_ryanzombiesinfecteddeath",0], + ["_ryanzombiesantivirusduration",0], + ["_NoZedAreas",[]], + ["_MaxOverallZeds",50], + ["_BlackListedVehicles",["SHIP","AIR"]], + ["_ZedSpawnArr", + [ + [0,15,0,2,3], + [2,15,1,2,4], + [4,20,1,3,5], + [6,20,2,4,6], + [8,25,2,4,7], + [10,25,3,5,8], + [15,30,3,6,10], + [20,30,4,7,10], + [25,35,5,7,15] + ] + ], + ["_ZedCheckTimer",50] +]; + + +Ryanzombiesdamage = _Ryanzombiesdamage; +Ryanzombieshealth = _Ryanzombieshealth; +ryanzombiesinfectedchance = _ryanzombiesinfectedchance; +ryanzombiesinfectedrate = _ryanzombiesinfectedrate; +ryanzombiesinfectedsymptoms = _ryanzombiesinfectedsymptoms; +ryanzombiesinfecteddeath = _ryanzombiesinfecteddeath; +ryanzombiesantivirusduration = _ryanzombiesantivirusduration; +NoZedAreas = _NoZedAreas; +MaxOverallZeds = _MaxOverallZeds; +BlackListedVehicles = _BlackListedVehicles; +ZedSpawnArr = _ZedSpawnArr; + +ryanzombiesglow = nil; // Do not change it here! Just in the config! +ryanzombiesglowdemondisable = false; + +RZ_CrawlerAggressiveArray = RZ_NormalZombieAggressiveArray; + +Epoch_ZedAttack = { + _soundEffectFinal = "A3\sounds_f\weapons\silenced\silent-23.wss"; + _unit = player; + _soundEffectRange = 0; + playSound3D [_soundEffectFinal, _unit, false, getPosASL _unit, 1, 1, _soundEffectRange]; + addCamShake [3,0.5,30]; + player setdamage (damage player + Ryanzombiesdamage); +}; + +reverse ZedSpawnArr; +_ZedSpawnCheckTime = diag_ticktime; +_ZedSpawnCheck = { + params [["_target",objnull]]; + _output = []; + if (!isnull _target && alive _target) then { + if (isobjecthidden _target) exitwith {}; + if ({vehicle _target iskindof _x} count BlackListedVehicles > 0) exitwith {}; + if (speed (vehicle _target) > 25) exitwith {}; + if ({_x distance2d _target < 150} count (missionnamespace getvariable ["Epoch_Plotpoles",[]]) > 0) exitwith {}; + if ({_x distance2d _target < 300} count NoZedAreas > 0) exitwith {}; + _OverallZeds = (entities [["EPOCH_RyanZombie_1","RyanZombieCivilian_F"],[],true,false]); + _AliveZeds = _OverallZeds select {alive _x}; + if ((count _AliveZeds) <= MaxOverallZeds) then { + _NearHouses = (_target nearObjects ["house", 100]) select {!((_x buildingPos -1) isEqualTo [])}; + _housecount = count _NearHouses; + _spawnArray = [0,0,0,0,0]; + { + _x params ["_HousesInRange"]; + if (_housecount >= _HousesInRange) exitwith { + _spawnArray = _x; + }; + } foreach ZedSpawnArr; + _spawnArray params ["_HousesInRange","_SpawnChance","_MinSpawn","_MaxSpawn","_maxZedsInRange"]; + _Spawncount = _MinSpawn + (round (random (_MaxSpawn - _MinSpawn))); + if (_SpawnChance > (random 100)) then { + _nearplayer = count ((_target nearEntities 100) select {isplayer _x}); + _Spawncount = round (_Spawncount / _nearplayer); + if (_Spawncount > 0) then { + _NearZeds = count (_OverallZeds select {_target distance _x < 200}); + if (_NearZeds < _maxZedsInRange) then { + _pos = [_target, 50, 100, 1, 0, 50, 0] call BIS_fnc_findSafePos; + if (count _pos == 2) then { + _Spawncount = (_Spawncount min (_maxZedsInRange - _NearZeds) min (MaxOverallZeds - (count _OverallZeds))); + _output = [_target,_Spawncount,_pos,_NearHouses]; + }; + }; + }; + }; + }; + }; + _output +}; + + +if (!isserver && hasinterface) exitwith { + while {true} do { + if (diag_ticktime > _ZedSpawnCheckTime) then { + _output = [player] call _ZedSpawnCheck; + if !(_output isEqualto []) then { + [_output] remoteexec ["Epoch_ZedSpawner",2]; + }; + _ZedSpawnCheckTime = diag_ticktime + _ZedCheckTimer; + }; + uisleep 0.5; + }; +}; diff --git a/Sources/Epoch_server_RyanZ_Spawner/ZedSpawner/Epoch_ZombieSpawnConfig.hpp b/Sources/Epoch_server_RyanZ_Spawner/ZedSpawner/Epoch_ZombieSpawnConfig.hpp new file mode 100644 index 00000000..4f6e8d52 --- /dev/null +++ b/Sources/Epoch_server_RyanZ_Spawner/ZedSpawner/Epoch_ZombieSpawnConfig.hpp @@ -0,0 +1,93 @@ +class Epoch_ZedSpawner { + Ryanzombiesdamage = 0.018; // How much damage should one hit by a Zombie do on a Player - default = 0.1 + Ryanzombieshealth = 0.95; // Health (Damage) of Zombies on Spawn - Make them easy to kill -> 0.9 + ryanzombiesinfectedchance = 0; // Not used here - Default = 50 + ryanzombiesinfectedrate = 0; // Not used here - Default = 0.1 + ryanzombiesinfectedsymptoms = 0; // Not used here - Default = 1 + ryanzombiesinfecteddeath = 0; // Not used here - Default = 1 + ryanzombiesantivirusduration = 0; // Not used here - Default = 300 + ryanzombiesglow = 1; // Enable / Disable Glowing Eyes for Zombies + Ryanzombieslimit = 200; // Internal check distance for RyanScripts (to engage with Players). Reduced for performance - default = 5000 + + NoZedAreas[] = { // Array of coords, where no Zeds can Spawn + + }; + MaxOverallZeds = 50; // Limit for Overall Zeds on the Map + DeleteDistance = 200; // If no Player is within x meters, the Zed will get deleted + StuckOrDeadCheckTime = 180; // Stucked or Dead Zeds will be deleted after about x seconds + + BlackListedVehicles[] = { // Players inside these VehicleTypes will not spawn any Zeds. Can be ["Landvehicle","SHIP","AIR","TANK"] + "SHIP", + "AIR" + }; + ZedCheckTimer = 50; // Timer, how often the script should check for a ZombieSpawn + ZedSpawnArr[] = { + // [HousesInRange, SpawnChance, MinSpawn, MaxSpawn, MaxZedsInRange] + {0, 15, 0, 2, 3 }, + {2, 15, 1, 2, 4 }, + {4, 20, 1, 3, 5 }, + {6, 20, 2, 4, 6 }, + {8, 25, 2, 4, 7 }, + {10, 25, 3, 5, 8 }, + {15, 30, 3, 6, 10 }, + {20, 30, 4, 7, 10 }, + {25, 35, 5, 7, 15 } + }; + ZedClasses[] = { + // Fast RyanZ CIV + /* + "RyanZombieC_man_1","RyanZombieC_man_polo_1_F","RyanZombieC_man_polo_2_F","RyanZombieC_man_polo_4_F","RyanZombieC_man_polo_5_F","RyanZombieC_man_polo_6_F","RyanZombieC_man_p_fugitive_F","RyanZombieC_man_w_worker_F", + "RyanZombieC_scientist_F","RyanZombieC_man_hunter_1_F","RyanZombieC_man_pilot_F","RyanZombieC_journalist_F","RyanZombieC_Orestes","RyanZombieC_Nikos","RyanZombie15","RyanZombie16","RyanZombie17","RyanZombie18", + "RyanZombie19","RyanZombie20","RyanZombie21","RyanZombie22","RyanZombie23","RyanZombie24","RyanZombie25","RyanZombie26","RyanZombie27","RyanZombie28","RyanZombie29","RyanZombie30","RyanZombie31","RyanZombie32", +*/ + + // Mid RyanZ CIV +/* + "RyanZombieC_man_1medium","RyanZombieC_man_polo_1_Fmedium","RyanZombieC_man_polo_2_Fmedium","RyanZombieC_man_polo_4_Fmedium","RyanZombieC_man_polo_5_Fmedium","RyanZombieC_man_polo_6_Fmedium","RyanZombieC_man_p_fugitive_Fmedium", + "RyanZombieC_man_w_worker_Fmedium","RyanZombieC_scientist_Fmedium","RyanZombieC_man_hunter_1_Fmedium","RyanZombieC_man_pilot_Fmedium","RyanZombieC_journalist_Fmedium","RyanZombieC_Orestesmedium","RyanZombieC_Nikosmedium", + "RyanZombie15medium","RyanZombie16medium","RyanZombie17medium","RyanZombie18medium","RyanZombie19medium","RyanZombie20medium","RyanZombie21medium","RyanZombie22medium","RyanZombie23medium","RyanZombie24medium", + "RyanZombie25medium","RyanZombie26medium","RyanZombie27medium","RyanZombie28medium","RyanZombie29medium","RyanZombie30medium","RyanZombie31medium","RyanZombie32medium", +*/ + + // Slow RyanZ CIV + "RyanZombieC_man_1slow","RyanZombieC_man_polo_1_Fslow","RyanZombieC_man_polo_2_Fslow","RyanZombieC_man_polo_4_Fslow","RyanZombieC_man_polo_5_Fslow","RyanZombieC_man_polo_6_Fslow","RyanZombieC_man_p_fugitive_Fslow", + "RyanZombieC_man_w_worker_Fslow","RyanZombieC_scientist_Fslow","RyanZombieC_man_hunter_1_Fslow","RyanZombieC_man_pilot_Fslow","RyanZombieC_journalist_Fslow","RyanZombieC_Orestesslow","RyanZombieC_Nikosslow", + "RyanZombie15slow","RyanZombie16slow","RyanZombie17slow","RyanZombie18slow","RyanZombie19slow","RyanZombie20slow","RyanZombie21slow","RyanZombie22slow","RyanZombie23slow","RyanZombie24slow", + "RyanZombie25slow","RyanZombie26slow","RyanZombie27slow","RyanZombie28slow","RyanZombie29slow","RyanZombie30slow","RyanZombie31slow","RyanZombie32slow", + + // Walker RyanZ CIV + "RyanZombieC_man_1Walker","RyanZombieC_man_polo_1_FWalker","RyanZombieC_man_polo_2_FWalker","RyanZombieC_man_polo_4_FWalker","RyanZombieC_man_polo_5_FWalker","RyanZombieC_man_polo_6_FWalker", + "RyanZombieC_man_p_fugitive_FWalker","RyanZombieC_man_w_worker_FWalker","RyanZombieC_scientist_FWalker","RyanZombieC_man_hunter_1_FWalker","RyanZombieC_man_pilot_FWalker","RyanZombieC_journalist_FWalker", + "RyanZombieC_OrestesWalker","RyanZombieC_NikosWalker","RyanZombie15walker","RyanZombie16walker","RyanZombie17walker","RyanZombie18walker","RyanZombie19walker","RyanZombie20walker","RyanZombie21walker", + "RyanZombie22walker","RyanZombie23walker","RyanZombie24walker","RyanZombie25walker","RyanZombie26walker","RyanZombie27walker","RyanZombie28walker","RyanZombie29walker","RyanZombie30walker","RyanZombie31walker", + "RyanZombie32walker", + + // Spider RyanZ CIV + "RyanZombieSpider1","RyanZombieSpider2","RyanZombieSpider3","RyanZombieSpider4","RyanZombieSpider5","RyanZombieSpider6","RyanZombieSpider7","RyanZombieSpider8","RyanZombieSpider9","RyanZombieSpider10", + "RyanZombieSpider11","RyanZombieSpider12","RyanZombieSpider13","RyanZombieSpider14","RyanZombieSpider15","RyanZombieSpider16","RyanZombieSpider17","RyanZombieSpider18","RyanZombieSpider19","RyanZombieSpider20", + "RyanZombieSpider21","RyanZombieSpider22","RyanZombieSpider23","RyanZombieSpider24","RyanZombieSpider25","RyanZombieSpider26","RyanZombieSpider27","RyanZombieSpider28","RyanZombieSpider29","RyanZombieSpider30", + "RyanZombieSpider31","RyanZombieSpider32", + + // Crawler RyanZ CIV + "RyanZombieCrawler1","RyanZombieCrawler2","RyanZombieCrawler3","RyanZombieCrawler4","RyanZombieCrawler5","RyanZombieCrawler6","RyanZombieCrawler7","RyanZombieCrawler8","RyanZombieCrawler9","RyanZombieCrawler10", + "RyanZombieCrawler11","RyanZombieCrawler12","RyanZombieCrawler13","RyanZombieCrawler14","RyanZombieCrawler15","RyanZombieCrawler16","RyanZombieCrawler17","RyanZombieCrawler18","RyanZombieCrawler19","RyanZombieCrawler20", + "RyanZombieCrawler21","RyanZombieCrawler22","RyanZombieCrawler23","RyanZombieCrawler24","RyanZombieCrawler25","RyanZombieCrawler26","RyanZombieCrawler27","RyanZombieCrawler28","RyanZombieCrawler29","RyanZombieCrawler30", + "RyanZombieCrawler31","RyanZombieCrawler32", + + // Epoch RyanZ +/* + "EPOCH_RyanZombie_1","EPOCH_RyanZombie_2","EPOCH_RyanZombie_3","EPOCH_RyanZombie_4","EPOCH_RyanZombie_5", + "EPOCH_RyanZombie_1_C","EPOCH_RyanZombie_2_C","EPOCH_RyanZombie_3_C","EPOCH_RyanZombie_4_C","EPOCH_RyanZombie_5_C", + "EPOCH_RyanZombie_1_Sp","EPOCH_RyanZombie_2_Sp","EPOCH_RyanZombie_3_Sp","EPOCH_RyanZombie_4_Sp","EPOCH_RyanZombie_5_Sp", + "EPOCH_RyanZombie_1_B","EPOCH_RyanZombie_2_B","EPOCH_RyanZombie_3_B","EPOCH_RyanZombie_4_B","EPOCH_RyanZombie_5_B", + "EPOCH_RyanZombie_1_W","EPOCH_RyanZombie_2_W","EPOCH_RyanZombie_3_W","EPOCH_RyanZombie_4_W","EPOCH_RyanZombie_5_W", + "EPOCH_RyanZombie_1_S","EPOCH_RyanZombie_2_S","EPOCH_RyanZombie_3_S","EPOCH_RyanZombie_4_S","EPOCH_RyanZombie_5_S", + "EPOCH_RyanZombie_1_M","EPOCH_RyanZombie_2_M","EPOCH_RyanZombie_3_M","EPOCH_RyanZombie_4_M","EPOCH_RyanZombie_5_M", + "EPOCH_RyanZombie_1","EPOCH_RyanZombie_2","EPOCH_RyanZombie_3","EPOCH_RyanZombie_4","EPOCH_RyanZombie_5", + "EPOCH_RyanZombie_1_C","EPOCH_RyanZombie_2_C","EPOCH_RyanZombie_3_C","EPOCH_RyanZombie_4_C","EPOCH_RyanZombie_5_C", + "EPOCH_RyanZombie_1_Sp","EPOCH_RyanZombie_2_Sp","EPOCH_RyanZombie_3_Sp","EPOCH_RyanZombie_4_Sp","EPOCH_RyanZombie_5_Sp", + "EPOCH_RyanZombie_1_W","EPOCH_RyanZombie_2_W","EPOCH_RyanZombie_3_W","EPOCH_RyanZombie_4_W","EPOCH_RyanZombie_5_W", + "EPOCH_RyanZombie_1_S","EPOCH_RyanZombie_2_S","EPOCH_RyanZombie_3_S","EPOCH_RyanZombie_4_S","EPOCH_RyanZombie_5_S" +*/ + }; +}; diff --git a/Sources/Epoch_server_RyanZ_Spawner/config.cpp b/Sources/Epoch_server_RyanZ_Spawner/config.cpp new file mode 100644 index 00000000..6bfa71e0 --- /dev/null +++ b/Sources/Epoch_server_RyanZ_Spawner/config.cpp @@ -0,0 +1,28 @@ +class CfgPatches +{ + class Epoch_RyanZ_Spawner + { + requiredVersion = 0.1; + requiredAddons[] = {}; + units[] = {}; + weapons[] = {}; + magazines[] = {}; + ammo[] = {}; + author[]= {"He-Man"}; + }; +}; + +class CfgFunctions +{ + class Epoch_RyanZ_Spawner + { + class main { + file = "Epoch_RyanZ_Spawner"; + class init { + preInit = 1; + }; + }; + }; +}; + +#include "ZedSpawner\Epoch_ZombieSpawnConfig.hpp" diff --git a/Sources/Epoch_server_RyanZ_Spawner/fn_init.sqf b/Sources/Epoch_server_RyanZ_Spawner/fn_init.sqf new file mode 100644 index 00000000..5fd1c9f9 --- /dev/null +++ b/Sources/Epoch_server_RyanZ_Spawner/fn_init.sqf @@ -0,0 +1,199 @@ +if !(isclass (configFile >> "CfgPatches" >> "Ryanzombies")) exitwith { + diag_log "Epoch Debug: RyanZ Spawner skipped - RyanZombies seems to not run on this Server"; +}; +[] spawn { + waituntil {uisleep 1; !isnil "Ryanzombiesdamage" && !isnil "Ryanzombieshealth" && !isnil "Ryanzombieslimit" && !isnil "RZ_fnc_zombie_attackHuman" && !isnil "RZ_CrawlerAggressiveArray"}; + uisleep 15; + + RZ_fnc_zombie_attackHuman = { + params ["_zombie","_target"]; + _dir = _zombie getDir _target; + _zombie setdir _dir; + [_zombie, "AwopPercMstpSgthWnonDnon_throw"] remoteExecCall ["fnc_RyanZombies_SwitchMove"]; + _attackSound = selectRandom ([_zombie,"attack"] call RZ_fnc_zombie_getZombieSoundArray); + playsound3d [_attackSound, _zombie, false, getPosASL _zombie, 1, pitch _zombie]; + _target allowfleeing 1; + sleep 0.3; + _attackSpeed = [Ryanzombiesattackspeed,0.3] select (_zombie getVariable "RZ_isDemon"); + if ([_zombie,_target] call RZ_fnc_zombie_canAttackHuman) then { + _hitSound = selectRandom ([_zombie,"hit"] call RZ_fnc_zombie_getZombieSoundArray); + playsound3d [_hitSound, _target, false, getPosASL _target, 1, pitch _zombie]; + if (isnil "ryanzombiesdisablebleeding") then { + [_target, 10] remoteExecCall ["fnc_RyanZombies_Bleeding"]; + }; + _scream = selectRandom RZ_HumanScreamArray; + [_target, _scream] remoteExecCall ["say3d"]; + _vel = velocity _target; + _dir = direction _zombie; + _strength = _zombie call RZ_fnc_zombie_getHumanVelocityStrength; + [_target, [(_vel select 0) + (sin _dir * _strength), (_vel select 1) + (cos _dir * _strength), (_vel select 2) + random 1]] remoteExecCall ["fnc_RyanZombies_Velocity"]; + [] remoteexec ['Epoch_ZedAttack',_target]; + }; + sleep _attackSpeed; + }; + RZ_fnc_zombie_checkForNewTarget = + { + private _zombie = _this; + private _civilians = []; + if !(isnil "ryanzombiescivilianattacks") then + { + _civilians = nearestobjects [_zombie, ["Civilian"], 100 min Ryanzombieslimit]; + _civsToDelete = []; + { + if (!alive _x || _x getvariable ["ace_medical_inReviveState",false] || lifeState _x == "INCAPACITATED") then + { + _civsToDelete pushback _x; + }; + } foreach _civilians; + _civilians = _civilians - _civsToDelete; + }; + + private _target = _zombie findNearestEnemy _zombie; + if (count _civilians != 0) then + { + _civiliantarget = _civilians select 0; + if (!isNull _target && ((_target distance _zombie) < (_civiliantarget distance _zombie))) exitwith {}; + if (_zombie knowsabout _civiliantarget > 0.5) then + { + _target = _civiliantarget; + }; + }; + if(!isNull _target) then + { + if(_zombie distance _target > Ryanzombieslimit) exitWith { _target = objNull; }; + }; + _zombie setVariable ["RZ_Target",_target]; + _target + }; + RZ_fnc_zombie_canAttackHuman = + { + params ["_zombie","_target"]; + if(!alive _zombie || !alive _target || _target getvariable ["ace_medical_inReviveState",false] || lifeState _target == "INCAPACITATED") exitWith { false }; + _maxAttackDistance = _zombie call RZ_fnc_zombie_maxAttackDistanceToHuman; + ((_zombie distance _target) < _maxAttackDistance && !(lineIntersects [eyepos _zombie, eyepos _target,_zombie,_target])) + }; + MyZeds = []; + Epoch_ZedSpawner = { + params [["_output",[]]]; + if !(_output isequalto []) then { + _output params ["_target","_Spawncount","_pos","_NearHouses"]; + _group = creategroup [RESISTANCE,true]; + for "_i" from 1 to _Spawncount do { + _randomPos = [_pos,random 15,random 360] call BIS_fnc_relPos; + _Zed = _group createUnit [selectrandom ZedClasses, _randomPos, [], 5, "NONE"]; + if (Epoch_ryanzombiesglow isEqualTo 1) then { + _Zed setface (selectrandom RZ_FaceArray); + }; + MyZeds pushback _Zed; + uisleep 0.15; + }; + _FirstWp = [_target, 10, 50, 1, 0, 50, 0] call BIS_fnc_findSafePos; + if (count _FirstWp == 2) then { + _FirstWp pushback 0; + _wp = _group addwaypoint [_FirstWp,5]; + _wp setWaypointSpeed "LIMITED"; + { + _x domove _FirstWp; + } foreach (units _group); + }; + _NearHouses = _NearHouses call Bis_fnc_ArrayShuffle; + { + if (!isnull _x) then { + _wp = _group addwaypoint [_x,5]; + _wp setWaypointSpeed "LIMITED"; + }; + } foreach _NearHouses; + if (count (waypoints _group) < 20) then { + for "_1" from 1 to 20 do { + _randomPos = [_pos,60,random 360] call BIS_fnc_relPos; + _wp = _group addwaypoint [_randomPos,5]; + _wp setWaypointSpeed "LIMITED"; + }; + }; + _group setCurrentWaypoint [_group, 1]; + }; + }; + + [] spawn { + _Ryanzombiesdamage = getnumber (configfile >> "Epoch_ZedSpawner" >> "Ryanzombiesdamage"); + _Ryanzombieshealth = getnumber (configfile >> "Epoch_ZedSpawner" >> "Ryanzombieshealth"); + _ryanzombiesinfectedchance = getnumber (configfile >> "Epoch_ZedSpawner" >> "ryanzombiesinfectedchance"); + _ryanzombiesinfectedrate = getnumber (configfile >> "Epoch_ZedSpawner" >> "ryanzombiesinfectedrate"); + _ryanzombiesinfectedsymptoms = getnumber (configfile >> "Epoch_ZedSpawner" >> "ryanzombiesinfectedsymptoms"); + _ryanzombiesinfecteddeath = getnumber (configfile >> "Epoch_ZedSpawner" >> "ryanzombiesinfecteddeath"); + _ryanzombiesantivirusduration = getnumber (configfile >> "Epoch_ZedSpawner" >> "ryanzombiesantivirusduration"); + _ryanzombiesglow = getnumber (configfile >> "Epoch_ZedSpawner" >> "ryanzombiesglow"); + _Ryanzombieslimit = getnumber (configfile >> "Epoch_ZedSpawner" >> "Ryanzombieslimit"); + _NoZedAreas = getarray (configfile >> "Epoch_ZedSpawner" >> "NoZedAreas"); + _MaxOverallZeds = getnumber (configfile >> "Epoch_ZedSpawner" >> "MaxOverallZeds"); + _DeleteDistance = getnumber (configfile >> "Epoch_ZedSpawner" >> "DeleteDistance"); + _StuckOrDeadCheckTime = getnumber (configfile >> "Epoch_ZedSpawner" >> "StuckOrDeadCheckTime"); + _BlackListedVehicles = getarray (configfile >> "Epoch_ZedSpawner" >> "BlackListedVehicles"); + _ZedSpawnArr = getarray (configfile >> "Epoch_ZedSpawner" >> "ZedSpawnArr"); + _ZedClasses = getarray (configfile >> "Epoch_ZedSpawner" >> "ZedClasses"); + _ZedCheckTimer = getnumber (configfile >> "Epoch_ZedSpawner" >> "ZedCheckTimer"); + + _params = [ + _Ryanzombiesdamage, + _Ryanzombieshealth, + _ryanzombiesinfectedchance, + _ryanzombiesinfectedrate, + _ryanzombiesinfectedsymptoms, + _ryanzombiesinfecteddeath, + _ryanzombiesantivirusduration, + _NoZedAreas, + _MaxOverallZeds, + _BlackListedVehicles, + _ZedSpawnArr, + _ZedCheckTimer + ]; + Epoch_ryanzombiesglow = _ryanzombiesglow; + Ryanzombieslimit = _Ryanzombieslimit; + ZedClasses = _ZedClasses; + RZ_FaceArray = ["RyanZombieFace1_Glowing","RyanZombieFace2_Glowing","RyanZombieFace3_Glowing","RyanZombieFace4_Glowing","RyanZombieFace5_Glowing","RyanZombieFace6_Glowing"]; + + _ZombieSpawn = compilefinal preprocessfilelinenumbers "Epoch_RyanZ_Spawner\ZedSpawner\Epoch_ZombieSpawn.sqf"; + [_params,_ZombieSpawn] remoteExec ["BIS_fnc_spawn", -2, "Epoch_ZedSpawner"]; + [] spawn _ZombieSpawn; + + _ZedCleanup = { + params [["_target",objnull]]; + if !(MyZeds isEqualto []) then { + _Zed = MyZeds deleteat 0; + _del = (_Zed nearEntities _DeleteDistance) select {isplayer _x} isEqualto []; + if !(_del) then { + _Checktime = _Zed getvariable ["Epoch_RyanZ_StuckCheck",0]; + if (diag_ticktime > _Checktime) then { + _LastPos = _Zed getvariable ["Epoch_RyanZ_LastPos",[0,0,0]]; + if ((getposATL _Zed) distance _lastpos < 2) exitwith { + _del = true; + }; + _Zed setvariable ["Epoch_RyanZ_StuckCheck",diag_ticktime + _StuckOrDeadCheckTime]; + }; + if (_del) exitwith {}; + { + if (_Zed distance2d _x < 150) exitwith { + _del = true; + }; + } foreach (missionnamespace getvariable ["Epoch_PlotPoles",[]]); + _Zed setvariable ["Epoch_RyanZ_LastPos",getposATL _Zed]; + }; + if (_del) then { + deletevehicle _Zed; + } + else { + MyZeds pushback _Zed; + }; + }; + }; + _run2sec = diag_ticktime; + while {true} do { + if (diag_ticktime > _run2sec) then { + [objnull] call _ZedCleanup; + _run2sec = diag_ticktime + 2; + }; + uisleep 0.5; + }; + }; + diag_log "Epoch Debug: RyanZ Spawner Started"; +}; \ No newline at end of file diff --git a/Sources/epoch_code/compile/EPOCH_mineRocks.sqf b/Sources/epoch_code/compile/EPOCH_mineRocks.sqf index 0839fe38..50dbe019 100644 --- a/Sources/epoch_code/compile/EPOCH_mineRocks.sqf +++ b/Sources/epoch_code/compile/EPOCH_mineRocks.sqf @@ -25,6 +25,7 @@ if ((diag_tickTime - EPOCH_lastMineRocks) >= 2) then { }; _objects = lineIntersectsWith[eyePos player, _currentPos, player, objNull, true]; + reverse _objects; _object = objNull; _found = false; diff --git a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf index 62648d2e..99b560f2 100644 --- a/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf +++ b/Sources/epoch_code/compile/servicepoint/EPOCH_SP_Start.sqf @@ -18,10 +18,7 @@ private ["_Ignatz_SP_Array","_AmmoConfig","_VehiclesWithAmmo","_VehicleAmmo","_a //[[[end]]] Ignatz_Refuel = nil; Ignatz_Repair = nil; -Ignatz_Rearm0 = nil; -Ignatz_Rearm1 = nil; -Ignatz_Rearm2 = nil; -Ignatz_Rearm3 = nil; +Ignatz_Rearm = []; params ["_myturret"]; @@ -106,8 +103,5 @@ if (player == driver _vehicle) then { _actionTitle = [format['Repair %1',getText (configFile >> 'Cfgvehicles' >> typeOf _vehicle >> 'displayName')], _costs] call _fnc_actionTitle; Ignatz_Repair = [_actionTitle,[_vehicle,[_costs, _repairTime]]]; }; -if (count _Ignatz_SP_Array > 0) then {Ignatz_Rearm0 = _Ignatz_SP_Array select 0;}; -if (count _Ignatz_SP_Array > 1) then {Ignatz_Rearm1 = _Ignatz_SP_Array select 1;}; -if (count _Ignatz_SP_Array > 2) then {Ignatz_Rearm2 = _Ignatz_SP_Array select 2;}; -if (count _Ignatz_SP_Array > 3) then {Ignatz_Rearm3 = _Ignatz_SP_Array select 3;}; +Ignatz_Rearm = _Ignatz_SP_Array; true diff --git a/Sources/epoch_code/compile/traders/EPOCH_NPCTraderMenuFilter.sqf b/Sources/epoch_code/compile/traders/EPOCH_NPCTraderMenuFilter.sqf index 9730b4c2..c5622637 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_NPCTraderMenuFilter.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_NPCTraderMenuFilter.sqf @@ -24,15 +24,38 @@ _PlayerItemsBox = 41500; _PlayerItemsOutBox = 41501; _TraderItemsBox = 41503; _TraderItemsOutBox = 41502; +_isPlayerFilter = (ctrlIDC _control == _PlayerFilerDropDown); +_LbText = _control lbText _index; _config = 'CfgItemSort' call EPOCH_returnConfig; _MainCategoriearray = getarray (_config >> "MainCategories" >> "Classes"); _FilterArray = []; -if (_index != 0) then { +if !((tolower _LbText) isEqualTo "all") then { + if (!_isPlayerFilter && _LbText in + [ + format ["Fits your %1",(primaryweapon player) call EPOCH_itemDisplayName], + format ["Fits your %1",(secondaryweapon player) call EPOCH_itemDisplayName], + format ["Fits your %1",(handgunweapon player) call EPOCH_itemDisplayName] + ] + ) exitwith { + _CheckWpnClass = switch _LbText do { + case (format ["Fits your %1",(primaryweapon player) call EPOCH_itemDisplayName]) : {primaryweapon player}; + case (format ["Fits your %1",(secondaryweapon player) call EPOCH_itemDisplayName]) : {secondaryweapon player}; + case (format ["Fits your %1",(handgunweapon player) call EPOCH_itemDisplayName]) : {handgunweapon player}; + }; + _possiblemags = getarray (configfile >> "CfgWeapons" >> _CheckWpnClass >> "magazines"); + _possibleMuzzles = getarray (configfile >> "CfgWeapons" >> _CheckWpnClass >> "WeaponSlotsInfo" >> "MuzzleSlot" >> "compatibleItems"); + _possibleScopes = getarray (configfile >> "CfgWeapons" >> _CheckWpnClass >> "WeaponSlotsInfo" >> "CowsSlot" >> "compatibleItems"); + _possiblePointers = getarray (configfile >> "CfgWeapons" >> _CheckWpnClass >> "WeaponSlotsInfo" >> "PointerSlot" >> "compatibleItems"); + _possibleUnderBarrel = getarray (configfile >> "CfgWeapons" >> _CheckWpnClass >> "WeaponSlotsInfo" >> "UnderBarrelSlot" >> "compatibleItems"); + { + _FilterArray pushback (tolower _x); + } foreach (_possiblemags + _possibleMuzzles + _possibleScopes + _possiblePointers + _possibleUnderBarrel); + }; { _MainCategorie = _x; - if (_index == (_MainCategorie select 0)) then { - _subcategories = _MainCategorie select 2; + _MainCategorie params ["_category","_subcategories"]; + if (_LbText isEqualTo _category) then { { _SubCategorieItems = getArray (_config >> "SubCatergories" >> _x); { @@ -45,7 +68,6 @@ if (_index != 0) then { if !(isNull EPOCH_lastNPCtradeTarget) then { _slot = EPOCH_lastNPCtradeTarget getVariable["AI_SLOT", -1]; if (_slot != -1) then { - _isPlayerFilter = (ctrlIDC _control == _PlayerFilerDropDown); if (_isPlayerFilter) then { lbClear _PlayerItemsBox; { @@ -71,7 +93,7 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { if (_qty < 1) then { _tooltip = format ["%1 rounds left in Magazine",_rounds]; }; - if (_index == 0 || (tolower _item) in _FilterArray) then { + if ((tolower _LbText) isEqualTo "all" || (tolower _item) in _FilterArray) then { _id = lbAdd [_PlayerItemsBox, (_item call EPOCH_itemDisplayName) + (if (_onHand) then {" (in Hand)"} else {""})]; lbSetData [_PlayerItemsBox, _id, _item]; lbSetValue [_PlayerItemsBox, _id, _rounds]; @@ -102,7 +124,7 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { { if (local _x) then { _type = typeOf _x; - if (_index == 0 || (tolower _type) in _FilterArray) then { + if ((tolower _LbText) isEqualTo "all" || (tolower _type) in _FilterArray) then { _itemCount = { typeOf _x == _type } count _vehicles; _itemOfferCount = { _x == _type } count _VehOfferArray; if (_itemCount > _itemOfferCount) then { @@ -133,7 +155,7 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { { _x params ["_displayname","_item","_rounds"]; if !(_item isequalto "") then { - if (_index == 0 || (tolower _item) in _FilterArray) then { + if ((tolower _LbText) isEqualTo "all" || (tolower _item) in _FilterArray) then { _maxrnd = 1; _tooltip = ""; if ([_item,"cfgMagazines"] call Epoch_fnc_isAny) then { diff --git a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf index e7955c9e..0ef71452 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd.sqf @@ -120,11 +120,24 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { _CurControl lbDelete _id; _cryptoCount = 0; _sizeOut = lbSize _PlayerItemsOutBox; + + _BlackMarketPurchaseMulti = ["CfgBlackMarket", "BlackMarketPurchaseMulti", 1] call EPOCH_fnc_returnConfigEntryV2; + _BlackMarketSellMulti = ["CfgBlackMarket", "BlackMarketSellMulti", 1] call EPOCH_fnc_returnConfigEntryV2; + _Blackmarket_SpecialPrices = ["CfgBlackMarket", "Blackmarket_SpecialPrices", []] call EPOCH_fnc_returnConfigEntryV2; + if (_sizeOut > 0) then { for "_i" from 0 to (_sizeOut - 1) do { _item = lbData [_PlayerItemsOutBox, _i]; _rounds = lbValue [_PlayerItemsOutBox, _i]; _worth = getNumber (_config >> _item >> "price"); + if (EPOCH_lastNPCtradeTarget getvariable ["Epoch_BlackMarketTrader",false]) then { + _worth = _worth * _BlackMarketSellMulti; + { + if (_item isEqualTo (_x select 0)) exitwith { + _worth = _x select 1; + }; + } foreach _Blackmarket_SpecialPrices; + }; _maxrnd = 1; if ([_item,"cfgMagazines"] call Epoch_fnc_isAny) then { _maxrnd = getnumber (configfile >> "cfgMagazines" >> _item >> "count"); @@ -144,6 +157,14 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { _itemTax = getNumber (_config >> _item >> "tax"); _tax = _worth * (EPOCH_taxRate + _itemTax); _worth = ceil(_worth + _tax); + if (EPOCH_lastNPCtradeTarget getvariable ["Epoch_BlackMarketTrader",false]) then { + _worth = _worth * _BlackMarketPurchaseMulti; + { + if (_item isEqualTo (_x select 0)) exitwith { + _worth = _x select 2; + }; + } foreach _Blackmarket_SpecialPrices; + }; _maxrnd = 1; if ([_item,"cfgMagazines"] call Epoch_fnc_isAny) then { _maxrnd = getnumber (configfile >> "cfgMagazines" >> _item >> "count"); diff --git a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd2.sqf b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd2.sqf index f6832e3e..ebac3ac9 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd2.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd2.sqf @@ -67,6 +67,10 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { }; }; if (_allowAdd) then { + _BlackMarketPurchaseMulti = ["CfgBlackMarket", "BlackMarketPurchaseMulti", 1] call EPOCH_fnc_returnConfigEntryV2; + _BlackMarketSellMulti = ["CfgBlackMarket", "BlackMarketSellMulti", 1] call EPOCH_fnc_returnConfigEntryV2; + _Blackmarket_SpecialPrices = ["CfgBlackMarket", "Blackmarket_SpecialPrices", []] call EPOCH_fnc_returnConfigEntryV2; + _maxrnd = 1; if ([_uiItem,"cfgMagazines"] call Epoch_fnc_isAny) then { _maxrnd = getnumber (configfile >> "cfgMagazines" >> _uiItem >> "count"); @@ -138,6 +142,14 @@ if !(isNull EPOCH_lastNPCtradeTarget) then { _itemTax = getNumber (_config >> _item >> "tax"); _tax = _worth * (EPOCH_taxRate + _itemTax); _worth = ceil(_worth + _tax); + if (EPOCH_lastNPCtradeTarget getvariable ["Epoch_BlackMarketTrader",false]) then { + _worth = _worth * _BlackMarketPurchaseMulti; + { + if (_item isEqualTo (_x select 0)) exitwith { + _worth = _x select 2; + }; + } foreach _Blackmarket_SpecialPrices; + }; _maxrnd = 1; if ([_item,"cfgMagazines"] call Epoch_fnc_isAny) then { _maxrnd = getnumber (configfile >> "cfgMagazines" >> _item >> "count"); diff --git a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd3.sqf b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd3.sqf index a120e5a7..62eb2ac0 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd3.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_npcTraderAdd3.sqf @@ -53,6 +53,9 @@ if (isClass (_config >> _uiItem)) then { _cryptoCount = 0; _sizeOut = lbSize _TraderItemsOutBox; if (_sizeOut > 0) then { + _BlackMarketPurchaseMulti = ["CfgBlackMarket", "BlackMarketPurchaseMulti", 1] call EPOCH_fnc_returnConfigEntryV2; + _BlackMarketSellMulti = ["CfgBlackMarket", "BlackMarketSellMulti", 1] call EPOCH_fnc_returnConfigEntryV2; + _Blackmarket_SpecialPrices = ["CfgBlackMarket", "Blackmarket_SpecialPrices", []] call EPOCH_fnc_returnConfigEntryV2; for "_i" from 0 to (_sizeOut - 1) do { _item = lbData [_TraderItemsOutBox, _i]; _rounds = lbValue [_TraderItemsOutBox, _i]; @@ -60,6 +63,14 @@ if (isClass (_config >> _uiItem)) then { _itemTax = getNumber (_config >> _item >> "tax"); _tax = _worth * (EPOCH_taxRate + _itemTax); _worth = ceil (_worth + _tax); + if (EPOCH_lastNPCtradeTarget getvariable ["Epoch_BlackMarketTrader",false]) then { + _worth = _worth * _BlackMarketPurchaseMulti; + { + if (_item isEqualTo (_x select 0)) exitwith { + _worth = _x select 2; + }; + } foreach _Blackmarket_SpecialPrices; + }; _maxrnd = 1; if ([_item,"cfgMagazines"] call Epoch_fnc_isAny) then { _maxrnd = getnumber (configfile >> "cfgMagazines" >> _item >> "count"); diff --git a/Sources/epoch_code/compile/traders/EPOCH_startNPCTraderMenu.sqf b/Sources/epoch_code/compile/traders/EPOCH_startNPCTraderMenu.sqf index 6fa3bdfe..6e369660 100644 --- a/Sources/epoch_code/compile/traders/EPOCH_startNPCTraderMenu.sqf +++ b/Sources/epoch_code/compile/traders/EPOCH_startNPCTraderMenu.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_code/compile/traders/EPOCH_startNPCTraderMenu.sqf */ -private ["_config","_MainCategoriearray","_target","_slot","_index","_ok","_categorie"]; +private ["_config","_MainCategoriearray","_target","_slot","_index","_ok","_categorie","_idx"]; _config = 'CfgItemSort' call EPOCH_returnConfig; _MainCategoriearray = getarray (_config >> "MainCategories" >> "Classes"); _target = cursorTarget; @@ -46,12 +46,28 @@ if (alive _target) then { if (!_ok) exitWith {}; 9992 cutRsc["EpochGameUI2", "PLAIN", 2, false]; ((uiNamespace getVariable "EPOCH_EpochGameUI2") displayCtrl 21208) ctrlSetText format["%1", EPOCH_playerCrypto]; + _idx = 0; + if !(primaryweapon player isEqualTo "") then { + lbAdd [42101,format ["Fits your %1",(primaryweapon player) call EPOCH_itemDisplayName]]; + lbSetColor [42101, _idx, [1, 1, 0, 1]]; + _idx = _idx + 1; + }; + if !(secondaryweapon player isEqualTo "") then { + lbAdd [42101,format ["Fits your %1",(secondaryweapon player) call EPOCH_itemDisplayName]]; + lbSetColor [42101, _idx, [1, 1, 0, 1]]; + _idx = _idx + 1; + }; + if !(handgunweapon player isEqualTo "") then { + lbAdd [42101,format ["Fits your %1",(handgunweapon player) call EPOCH_itemDisplayName]]; + lbSetColor [42101, _idx, [1, 1, 0, 1]]; + _idx = _idx + 1; + }; { - _categorie = _x select 1; + _categorie = _x select 0; lbAdd [42100,_categorie]; - lbAdd [42101,_categorie] + lbAdd [42101,_categorie]; } forEach _MainCategoriearray; lbSetCurSel [42100, 0]; - lbSetCurSel [42101, 0]; + lbSetCurSel [42101, _idx]; }; }; diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp index 2afd7bc7..e7b45b6c 100644 --- a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp +++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp @@ -150,24 +150,45 @@ class ServicePoint }; class Rearm0 { - condition = "!isnil 'Ignatz_Rearm0'"; - action = "(Ignatz_Rearm0 select 1) call EPOCH_SP_Rearm"; + condition = "count Ignatz_Rearm > 0"; + action = "(Ignatz_Rearm select 0 select 1) call EPOCH_SP_Rearm"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; - tooltipcode = "Ignatz_Rearm0 select 0"; + tooltipcode = "Ignatz_Rearm select 0 select 0"; }; class Rearm1 { - condition = "!isnil 'Ignatz_Rearm1'"; - action = "(Ignatz_Rearm1 select 1) call EPOCH_SP_Rearm"; + condition = "count Ignatz_Rearm > 1"; + action = "(Ignatz_Rearm select 1 select 1) call EPOCH_SP_Rearm"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; - tooltipcode = "Ignatz_Rearm1 select 0"; + tooltipcode = "Ignatz_Rearm select 1 select 0"; }; class Rearm2 { - condition = "!isnil 'Ignatz_Rearm2'"; - action = "(Ignatz_Rearm2 select 1) call EPOCH_SP_Rearm"; + condition = "count Ignatz_Rearm > 2"; + action = "(Ignatz_Rearm select 2 select 1) call EPOCH_SP_Rearm"; icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; - tooltipcode = "Ignatz_Rearm2 select 0"; + tooltipcode = "Ignatz_Rearm select 2 select 0"; + }; + class Rearm3 + { + condition = "count Ignatz_Rearm > 3"; + action = "(Ignatz_Rearm select 3 select 1) call EPOCH_SP_Rearm"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; + tooltipcode = "Ignatz_Rearm select 3 select 0"; + }; + class Rearm4 + { + condition = "count Ignatz_Rearm > 4"; + action = "(Ignatz_Rearm select 4 select 1) call EPOCH_SP_Rearm"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; + tooltipcode = "Ignatz_Rearm select 4 select 0"; + }; + class Rearm5 + { + condition = "count Ignatz_Rearm > 5"; + action = "(Ignatz_Rearm select 5 select 1) call EPOCH_SP_Rearm"; + icon = "x\addons\a3_epoch_code\Data\UI\buttons\Rearm.paa"; + tooltipcode = "Ignatz_Rearm select 5 select 0"; }; }; class veh_Rearm1 diff --git a/Sources/epoch_config/Configs/CfgBlackMarket.hpp b/Sources/epoch_config/Configs/CfgBlackMarket.hpp new file mode 100644 index 00000000..8993bcde --- /dev/null +++ b/Sources/epoch_config/Configs/CfgBlackMarket.hpp @@ -0,0 +1,27 @@ +class CfgBlackMarket +{ + StaticBlackMarketIdx[] = {}; // Static Traders with this index (starts from 0) defined in epoch_server_settings\configs\maps\worldname -> staticNpcPos + // will always get set to BlackMarkets + // Example: {0,2} will set the 1st and 3rd defined static trader as a BlackMarket + + BlackMarketTraderCount[] = {1,2}; // {min,max} Random Traders will be set to BlackMarkets (change every Restart) + ShowBlackMarketTraders = "true"; // Show Marker for Blackmarket Traders? + BlackMarketMarkerColor = "ColorRed"; // Marker color for Blackmarket Traders (if ShowBlackMarketTraders = "true") + BlackMarketPurchaseMulti = 5; // Multi on purchase on top of the default price + BlackMarketSellMulti = 0.8; // Multi on Sell for the default price + BlackMarketItemsCount = 50; // Count of items for each class (will get refilled after each purchase anyway!) + + BlackMarketUseLootList = "true"; // Use the Epoch LootList to prepare the available Items within the BlackMarket + BlackMarketExtraItems[] = { // Items in BlackMarket, that are not within the LootTable +// "MBK_01_EPOCH", // Can be a Vehicle +// "ItemComboLock" // Or Items / Magazines + }; + + Blackmarket_SpecialPrices[] = { // Do not use the default Multis, but this special prices for listed items +// {"SatchelCharge_Remote_Mag",50,500} // Sell Price = 50 | Purchase Price = 500 + }; + + Blackmarket_BlackList[] = { // These classes are not listed in Blackmarket (doesnt matter if in Loot or not) +// "ItemGoldBar10oz" + }; +}; \ No newline at end of file diff --git a/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp b/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp index 3642823e..98ec29ca 100644 --- a/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp +++ b/Sources/epoch_config/Configs/CfgBuildingLootPos.hpp @@ -1683,7 +1683,7 @@ class CfgBuildingLootPos lockerPos[] = {{{0.811523,-3.3418,-9.49701},269.999},{{19.0117,0.613281,-9.49701},90.2636},{{18.9961,-1.15674,-9.49704},89.3234},{{19.042,-2.92578,-9.49701},87.0602}}; toolRackPos[] = {{{7.23633,3.84961,-9.4968},359.928}}; shoeboxPos[] = {{{-0.743164,-8.33643,-0.0702209},110.554},{{19.1836,-7.53174,-9.49701},105.566}}; - palletPos[] = {{{2.03418,1.7915,-9.49701},289.015},{{-6.86621,3.25586,-0.534332},"3.05176e-005"},{{13.0293,-7.22363,-9.49701},90},{{15.542,-4.56006,-4.53433},"6.10352e-005"}}; + palletPos[] = {{{2.03418,1.7915,-9.49701},289.015},{{-6.86621,3.25586,-0.534332},0},{{13.0293,-7.22363,-9.49701},90},{{15.542,-4.56006,-4.53433},0}}; freezerPos[] = {{{-4.1084,-7.31787,-9.49701},268.732}}; }; class Land_Mil_ControlTower : Default @@ -2086,9 +2086,9 @@ class CfgBuildingLootPos { lootType = "church"; GroundSpawnChance = 80; - tablePos[] = {{{-0.952637,2.83398,-2.48343},"1.52588e-005"}}; - toolRackPos[] = {{{-0.880371,-3.7002,-2.37343},"1.52588e-005"}}; - shoeboxPos[] = {{{0.770508,-3.40137,-1.69343},"1.52588e-005"},{{-2.49805,-3.33887,-1.69343},"1.52588e-005"}}; + tablePos[] = {{{-0.952637,2.83398,-2.48343},0}}; + toolRackPos[] = {{{-0.880371,-3.7002,-2.37343},0}}; + shoeboxPos[] = {{{0.770508,-3.40137,-1.69343},0},{{-2.49805,-3.33887,-1.69343},0}}; }; class Land_House_L_1_EP1 : Default { @@ -2149,10 +2149,10 @@ class CfgBuildingLootPos class Land_House_L_7_EP1 : Default { shelfPos[] = {{{-2.28809,-2.28809,-0.939278},87.8875}}; - fridgePos[] = {{{-5.4751,3.71777,-0.639275},"1.52588e-005"}}; + fridgePos[] = {{{-5.4751,3.71777,-0.639275},0}}; bedPos[] = {{{3.79248,2.42188,-0.269272},270}}; wardrobePos[] = {{{5.65527,0.724609,-0.269272},90}}; - cookerPos[] = {{{-4.51172,3.5752,-0.609276},"1.52588e-005"}}; + cookerPos[] = {{{-4.51172,3.5752,-0.609276},0}}; chairPos[] = {{{-0.388672,3.22656,-0.269272},290}}; filingPos[] = {{{-5.10986,-2.08984,-0.939278},350}}; tablePos[] = {{{1.99707,-1.52637,-0.239273},180}}; @@ -2191,7 +2191,7 @@ class CfgBuildingLootPos wardrobePos[] = {{{5.73877,2.78125,0.786659},90}}; chairPos[] = {{{-2.6167,-1.23535,0.603081},170},{{-4.00146,-1.05664,0.603081},220}}; filingPos[] = {{{5.95459,-0.53418,-2.31334},104},{{6.07373,2.55176,-2.31334},80}}; - tablePos[] = {{{2.34131,2.0918,0.763084},"1.52588e-005"}}; + tablePos[] = {{{2.34131,2.0918,0.763084},0}}; lockerPos[] = {{{-1.74707,2.39355,-2.31334},89.8}}; toolRackPos[] = {{{-1.31445,0.375,-2.31334},89.8}}; shoeboxPos[] = {{{-0.350098,2.94238,-2.28334},180},{{5.8457,-1.50684,1.57308},180}}; @@ -2209,10 +2209,10 @@ class CfgBuildingLootPos couchPos[] = {{{4.57666,-1.00195,3.16163},270},{{-5.02783,2.07422,-1.38837},270}}; cookerPos[] = {{{-2.74414,1.1748,-1.38837},90}}; chairPos[] = {{{1.5708,-1.56641,3.16163},320},{{3.31299,-1.47852,-1.35837},40},{{6.86572,-0.859375,3.16163},30}}; - filingPos[] = {{{6.08252,2.9502,-1.35837},"1.52588e-005"}}; + filingPos[] = {{{6.08252,2.9502,-1.35837},0}}; tablePos[] = {{{4.56787,-2.96875,3.16163},180},{{7.90332,1.12305,-1.35837},90}}; shoeboxPos[] = {{{-8.38037,-0.833008,-0.93837},270}}; - freezerPos[] = {{{5.20557,2.90332,-1.35837},"1.52588e-005"}}; + freezerPos[] = {{{5.20557,2.90332,-1.35837},0}}; }; class Land_House_C_5_V1_EP1 : Default { @@ -2262,11 +2262,11 @@ class CfgBuildingLootPos shelfPos[] = {{{0.881836,0.848633,1.42705},180}}; fridgePos[] = {{{2.83398,5.10059,-1.48295},0.999985}}; bedPos[] = {{{-1.33838,-0.811523,-1.48295},0.999985}}; - wardrobePos[] = {{{4.41846,1.59082,1.42705},90},{{-2.9209,3.87598,-1.48295},"1.00179e-005"}}; + wardrobePos[] = {{{4.41846,1.59082,1.42705},90},{{-2.9209,3.87598,-1.48295},0}}; chairPos[] = {{{-3.97998,1.91797,-1.48295},289},{{-1.0791,-4.83398,1.12706},130}}; filingPos[] = {{{-4.45752,-5.25781,-1.49295},269}}; - shoeboxPos[] = {{{4.48828,1.01172,-1.40295},"1.00179e-005"},{{0.500977,4.9834,-0.672951},30}}; - palletPos[] = {{{-1.72168,-1.9375,1.17705},"1.00179e-005"}}; + shoeboxPos[] = {{{4.48828,1.01172,-1.40295},0},{{0.500977,4.9834,-0.672951},30}}; + palletPos[] = {{{-1.72168,-1.9375,1.17705},0}}; }; class Land_House_C_5_V2_EP1 : Default { @@ -2801,7 +2801,7 @@ class CfgBuildingLootPos lockerPos[] = {{{3.24707,-0.168457,-12.9662},180.509}}; toolRackPos[] = {{{-2.06592,-0.598389,-12.9654},180.956}}; shoeboxPos[] = {{{-8.35303,-7.32837,-3.51317},29.0581}}; - palletPos[] = {{{2.58789,-6.03125,-3.51315},"1.43912e-005"},{{0.29248,-18.708,-3.51315},"1.43571e-005"}}; + palletPos[] = {{{2.58789,-6.03125,-3.51315},0},{{0.29248,-18.708,-3.51315},0}}; }; class Land_Repair_center : Default { diff --git a/Sources/epoch_config/Configs/CfgItemSort.hpp b/Sources/epoch_config/Configs/CfgItemSort.hpp index fc71b01f..a52978c7 100644 --- a/Sources/epoch_config/Configs/CfgItemSort.hpp +++ b/Sources/epoch_config/Configs/CfgItemSort.hpp @@ -5,14 +5,14 @@ class CfgItemSort class MainCategories { classes[] = { - {0,"All",{}}, - {1,"Clothings / Backpacks",{"Uniforms","Vests","HeadGear","Backpacks"}}, - {2,"Weapons",{"Weapons","Handweapons"}}, - {3,"Magazines / Attachments",{"Magazines","Attachments"}}, - {4,"Equipment / Explosives",{"Equipment","Explosive","Hand"}}, - {5,"Medical / Food",{"Medical","Food","Drink"}}, - {6,"Items / Basebuilding",{"Basebuilding","Items"}}, - {7,"Vehicles",{"Vehicles_Land","Vehicles_Air","Vehicles_Ship"}} + {"All",{}}, // Category "All" is hardcoded and do not need an array of subcategories! + {"Clothings / Backpacks",{"Uniforms","Vests","HeadGear","Backpacks"}}, + {"Weapons",{"Weapons","Handweapons"}}, + {"Magazines / Attachments",{"Magazines","Attachments"}}, + {"Equipment / Explosives",{"Equipment","Explosive","Hand"}}, + {"Medical / Food",{"Medical","Food","Drink"}}, + {"Items / Basebuilding",{"Basebuilding","Items"}}, + {"Vehicles",{"Vehicles_Land","Vehicles_Air","Vehicles_Ship"}} }; }; class SubCatergories @@ -1003,7 +1003,7 @@ class CfgItemSort "muzzle_snds_H_snd_F", "muzzle_snds_m_khk_F", "muzzle_snds_m_snd_F", - "uzzle_snds_B_khk_F", + "muzzle_snds_B_khk_F", "muzzle_snds_B_snd_F", "muzzle_snds_65_TI_ghex_F", "muzzle_snds_65_TI_blk_F", @@ -1063,7 +1063,7 @@ class CfgItemSort Food[] = { "ItemPowderMilk", - "ItemRicebox", + "ItemRiceBox", "ItemCereals", "Pumpkin", "FoodBioMeat", diff --git a/Sources/epoch_config/Configs/CfgObjectInteractions.hpp b/Sources/epoch_config/Configs/CfgObjectInteractions.hpp index ca3f103f..67e38152 100644 --- a/Sources/epoch_config/Configs/CfgObjectInteractions.hpp +++ b/Sources/epoch_config/Configs/CfgObjectInteractions.hpp @@ -308,6 +308,200 @@ class CfgObjectInteractions class EPOCH_RyanZombie_3_S : EPOCH_RyanZombie_1 {}; class EPOCH_RyanZombie_4_S : EPOCH_RyanZombie_1 {}; class EPOCH_RyanZombie_5_S : EPOCH_RyanZombie_1 {}; + + class RyanZombieC_man_1 : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_1_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_2_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_4_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_5_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_6_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_p_fugitive_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_w_worker_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_scientist_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_hunter_1_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_pilot_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_journalist_F : EPOCH_RyanZombie_1 {}; + class RyanZombieC_Orestes : EPOCH_RyanZombie_1 {}; + class RyanZombieC_Nikos : EPOCH_RyanZombie_1 {}; + class RyanZombie15 : EPOCH_RyanZombie_1 {}; + class RyanZombie16 : EPOCH_RyanZombie_1 {}; + class RyanZombie17 : EPOCH_RyanZombie_1 {}; + class RyanZombie18 : EPOCH_RyanZombie_1 {}; + class RyanZombie19 : EPOCH_RyanZombie_1 {}; + class RyanZombie20 : EPOCH_RyanZombie_1 {}; + class RyanZombie21 : EPOCH_RyanZombie_1 {}; + class RyanZombie22 : EPOCH_RyanZombie_1 {}; + class RyanZombie23 : EPOCH_RyanZombie_1 {}; + class RyanZombie24 : EPOCH_RyanZombie_1 {}; + class RyanZombie25 : EPOCH_RyanZombie_1 {}; + class RyanZombie26 : EPOCH_RyanZombie_1 {}; + class RyanZombie27 : EPOCH_RyanZombie_1 {}; + class RyanZombie28 : EPOCH_RyanZombie_1 {}; + class RyanZombie29 : EPOCH_RyanZombie_1 {}; + class RyanZombie30 : EPOCH_RyanZombie_1 {}; + class RyanZombie31 : EPOCH_RyanZombie_1 {}; + class RyanZombie32 : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_1medium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_1_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_2_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_4_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_5_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_6_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_p_fugitive_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_w_worker_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_scientist_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_hunter_1_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_pilot_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_journalist_Fmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_Orestesmedium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_Nikosmedium : EPOCH_RyanZombie_1 {}; + class RyanZombie15medium : EPOCH_RyanZombie_1 {}; + class RyanZombie16medium : EPOCH_RyanZombie_1 {}; + class RyanZombie17medium : EPOCH_RyanZombie_1 {}; + class RyanZombie18medium : EPOCH_RyanZombie_1 {}; + class RyanZombie19medium : EPOCH_RyanZombie_1 {}; + class RyanZombie20medium : EPOCH_RyanZombie_1 {}; + class RyanZombie21medium : EPOCH_RyanZombie_1 {}; + class RyanZombie22medium : EPOCH_RyanZombie_1 {}; + class RyanZombie23medium : EPOCH_RyanZombie_1 {}; + class RyanZombie24medium : EPOCH_RyanZombie_1 {}; + class RyanZombie25medium : EPOCH_RyanZombie_1 {}; + class RyanZombie26medium : EPOCH_RyanZombie_1 {}; + class RyanZombie27medium : EPOCH_RyanZombie_1 {}; + class RyanZombie28medium : EPOCH_RyanZombie_1 {}; + class RyanZombie29medium : EPOCH_RyanZombie_1 {}; + class RyanZombie30medium : EPOCH_RyanZombie_1 {}; + class RyanZombie31medium : EPOCH_RyanZombie_1 {}; + class RyanZombie32medium : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_1slow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_1_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_2_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_4_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_5_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_6_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_p_fugitive_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_w_worker_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_scientist_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_hunter_1_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_pilot_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_journalist_Fslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_Orestesslow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_Nikosslow : EPOCH_RyanZombie_1 {}; + class RyanZombie15slow : EPOCH_RyanZombie_1 {}; + class RyanZombie16slow : EPOCH_RyanZombie_1 {}; + class RyanZombie17slow : EPOCH_RyanZombie_1 {}; + class RyanZombie18slow : EPOCH_RyanZombie_1 {}; + class RyanZombie19slow : EPOCH_RyanZombie_1 {}; + class RyanZombie20slow : EPOCH_RyanZombie_1 {}; + class RyanZombie21slow : EPOCH_RyanZombie_1 {}; + class RyanZombie22slow : EPOCH_RyanZombie_1 {}; + class RyanZombie23slow : EPOCH_RyanZombie_1 {}; + class RyanZombie24slow : EPOCH_RyanZombie_1 {}; + class RyanZombie25slow : EPOCH_RyanZombie_1 {}; + class RyanZombie26slow : EPOCH_RyanZombie_1 {}; + class RyanZombie27slow : EPOCH_RyanZombie_1 {}; + class RyanZombie28slow : EPOCH_RyanZombie_1 {}; + class RyanZombie29slow : EPOCH_RyanZombie_1 {}; + class RyanZombie30slow : EPOCH_RyanZombie_1 {}; + class RyanZombie31slow : EPOCH_RyanZombie_1 {}; + class RyanZombie32slow : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_1Walker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_1_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_2_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_4_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_5_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_polo_6_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_p_fugitive_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_w_worker_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_scientist_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_hunter_1_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_man_pilot_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_journalist_FWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_OrestesWalker : EPOCH_RyanZombie_1 {}; + class RyanZombieC_NikosWalker : EPOCH_RyanZombie_1 {}; + class RyanZombie15walker : EPOCH_RyanZombie_1 {}; + class RyanZombie16walker : EPOCH_RyanZombie_1 {}; + class RyanZombie17walker : EPOCH_RyanZombie_1 {}; + class RyanZombie18walker : EPOCH_RyanZombie_1 {}; + class RyanZombie19walker : EPOCH_RyanZombie_1 {}; + class RyanZombie20walker : EPOCH_RyanZombie_1 {}; + class RyanZombie21walker : EPOCH_RyanZombie_1 {}; + class RyanZombie22walker : EPOCH_RyanZombie_1 {}; + class RyanZombie23walker : EPOCH_RyanZombie_1 {}; + class RyanZombie24walker : EPOCH_RyanZombie_1 {}; + class RyanZombie25walker : EPOCH_RyanZombie_1 {}; + class RyanZombie26walker : EPOCH_RyanZombie_1 {}; + class RyanZombie27walker : EPOCH_RyanZombie_1 {}; + class RyanZombie28walker : EPOCH_RyanZombie_1 {}; + class RyanZombie29walker : EPOCH_RyanZombie_1 {}; + class RyanZombie30walker : EPOCH_RyanZombie_1 {}; + class RyanZombie31walker : EPOCH_RyanZombie_1 {}; + class RyanZombie32walker : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider1 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider2 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider3 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider4 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider5 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider6 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider7 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider8 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider9 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider10 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider11 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider12 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider13 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider14 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider15 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider16 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider17 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider18 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider19 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider20 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider21 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider22 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider23 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider24 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider25 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider26 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider27 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider28 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider29 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider30 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider31 : EPOCH_RyanZombie_1 {}; + class RyanZombieSpider32 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler1 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler2 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler3 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler4 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler5 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler6 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler7 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler8 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler9 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler10 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler11 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler12 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler13 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler14 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler15 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler16 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler17 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler18 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler19 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler20 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler21 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler22 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler23 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler24 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler25 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler26 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler27 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler28 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler29 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler30 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler31 : EPOCH_RyanZombie_1 {}; + class RyanZombieCrawler32 : EPOCH_RyanZombie_1 {}; + class IG_Box_s : Default { interactMode = 4; diff --git a/Sources/epoch_config/Configs/CfgPricing.hpp b/Sources/epoch_config/Configs/CfgPricing.hpp index 1e7a1120..ce413adc 100644 --- a/Sources/epoch_config/Configs/CfgPricing.hpp +++ b/Sources/epoch_config/Configs/CfgPricing.hpp @@ -2014,7 +2014,7 @@ class CfgPricing { price = 2; }; - class ItemRicebox + class ItemRiceBox { price = 3; }; @@ -5985,7 +5985,7 @@ class CfgPricing { price = 7; }; - class U_C_ConstructionCoverall_vrana_F + class U_C_ConstructionCoverall_Vrana_F { price = 7; }; diff --git a/Sources/epoch_config/Configs/CfgRemoteExec.hpp b/Sources/epoch_config/Configs/CfgRemoteExec.hpp index 2647e4e7..801c9fe5 100644 --- a/Sources/epoch_config/Configs/CfgRemoteExec.hpp +++ b/Sources/epoch_config/Configs/CfgRemoteExec.hpp @@ -26,6 +26,10 @@ class CfgRemoteExec { mode = 1; jip = 0; + class Epoch_ZedSpawner { + allowedTargets=2; + jip = 0; + }; class EPOCH_server_spawnLoot { allowedTargets=2; diff --git a/Sources/epoch_config/sandbox_config.hpp b/Sources/epoch_config/sandbox_config.hpp index b5d44af7..26d81507 100644 --- a/Sources/epoch_config/sandbox_config.hpp +++ b/Sources/epoch_config/sandbox_config.hpp @@ -66,6 +66,7 @@ showHUD[] = true // Vehicle display panels }; +#include "Configs\CfgBlackMarket.hpp" #include "Configs\CfgServicePoint.hpp" #include "Configs\CfgItemSort.hpp" #include "Configs\CfgTraderMissions.hpp" 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 344c124c..bd193232 100644 --- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf +++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf @@ -159,6 +159,7 @@ for "_i" from 0 to (_maxTraderLimit-1) do { _markers = ["StaticTrader",_pos] call EPOCH_server_createGlobalMarkerSet; _agent setVariable["MARKER_REF", _markers]; }; + EPOCH_StaticTraders pushback _agent; } else { // Spawn dynamic traders @@ -200,6 +201,7 @@ for "_i" from 0 to (_maxTraderLimit-1) do { _markers = ["DynamicTrader",_pos] call EPOCH_server_createGlobalMarkerSet; _agent setVariable["MARKER_REF", _markers]; }; + Epoch_DynamicTraders pushback _agent; } else { // diag_log format ["EPOCH_DEBUG: TraderSlot: %1 | Supressed Trader Load - Too much items (%2) and will respawn",_i,count (_arr select 0)]; 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 5c423ccd..24780ea1 100644 --- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf +++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_spawnTraders.sqf @@ -120,6 +120,7 @@ for "_i" from 1 to _spawnCount do { }; EPOCH_Traders pushback _agent; _Traderblocks pushback [getpos _agent, _TraderMinDistance]; + Epoch_DynamicTraders pushback _agent; }; }; }; diff --git a/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf b/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf index 01882696..83f14c05 100644 --- a/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf +++ b/Sources/epoch_server/compile/epoch_trading/EPOCH_server_makeNPCTrade.sqf @@ -24,6 +24,10 @@ params ["_trader","_itemsIn","_itemsOut","_player",["_token","",[""]] ]; _playerUID = getplayeruid _player; _EnableTempVehTrade = ["CfgEpochClient", "EnableTempVehTrade", false] call EPOCH_fnc_returnConfigEntryV2; +_BlackMarketPurchaseMulti = ["CfgBlackMarket", "BlackMarketPurchaseMulti", 1] call EPOCH_fnc_returnConfigEntryV2; +_BlackMarketSellMulti = ["CfgBlackMarket", "BlackMarketSellMulti", 1] call EPOCH_fnc_returnConfigEntryV2; +_Blackmarket_SpecialPrices = ["CfgBlackMarket", "Blackmarket_SpecialPrices", []] call EPOCH_fnc_returnConfigEntryV2; + _serverSettingsConfig = configFile >> "CfgEpochServer"; _vehicleSold = false; _vehicleBought = false; @@ -63,6 +67,14 @@ if (_slot != -1) then { _x params ["_item","_itemQty"]; if (isClass (_config >> _item)) then { _itemWorth = getNumber(_config >> _item >> "price"); + if (_trader getvariable ["Epoch_BlackMarketTrader",false]) then { + _itemWorth = _itemWorth * _BlackMarketSellMulti; + { + if (_item isEqualTo (_x select 0)) exitwith { + _itemWorth = _x select 1; + }; + } foreach _Blackmarket_SpecialPrices; + }; _maxrnd = 1; if ([_item,"cfgMagazines"] call Epoch_fnc_isAny) then { _maxrnd = getnumber (configfile >> "cfgMagazines" >> _item >> "count"); @@ -157,6 +169,14 @@ if (_slot != -1) then { _itemTax = getNumber(_config >> _item >> "tax"); _tax = _itemWorth * (EPOCH_taxRate + _itemTax); _itemWorth = ceil (_itemWorth + _tax); + if (_trader getvariable ["Epoch_BlackMarketTrader",false]) then { + _itemWorth = _itemWorth * _BlackMarketPurchaseMulti; + { + if (_item isEqualTo (_x select 0)) exitwith { + _itemWorth = _x select 2; + }; + } foreach _Blackmarket_SpecialPrices; + }; _maxrnd = 1; if ([_item,"cfgMagazines"] call Epoch_fnc_isAny) then { _maxrnd = getnumber (configfile >> "cfgMagazines" >> _item >> "count"); @@ -191,6 +211,14 @@ if (_slot != -1) then { } } forEach _helipad; }; + _blacklistpositions = []; + { + _blacklistpositions pushback [getposatl _x, 5]; + } foreach (nearestobjects [_player,["Landvehicle","SHIP","AIR"],50]); + { + _x params ["_blacklistpos","_blacklistradius"]; + _helipads = _helipads select {_x distance _blacklistpos > _blacklistradius}; + } foreach _blacklistpositions; if !(_helipads isEqualTo[]) then { _foundSmoke = false; { @@ -217,17 +245,20 @@ if (_slot != -1) then { } else { _tmpposition = []; - if (_item isKindOf "Ship") then { - _tmpposition = [_position, 20, 150, 5, 0, 1000, 1] call BIS_fnc_findSafePos; - _tmpposition = [_tmpposition, 0, 60, 10, 2, 1000, 0] call BIS_fnc_findSafePos; - } - else { - _tmpposition = [_position, 20, 120, 5, 0, 2000, 0] call BIS_fnc_findSafePos; + for "_i" from 1 to 5 do { + if (_item isKindOf "Ship") then { + _tmpposition = [_position, 20, 150, 5, 0, 1000, 1] call BIS_fnc_findSafePos; + _tmpposition = [_tmpposition, 0, 60, 10, 2, 1000, 0, _blacklistpositions] call BIS_fnc_findSafePos; + } + else { + _tmpposition = [_position, 20, 120, 5, 0, 2000, 0, _blacklistpositions] call BIS_fnc_findSafePos; + }; + if ((count _tmpposition) == 2) exitwith {}; }; if ((count _tmpposition) == 2) then { _tmpposition set [2, 0]; if (surfaceIsWater _tmpposition) then { - _tmpposition = ATLtoASL _tmpposition; + _tmpposition = ASLtoATL _tmpposition; }; _position = _tmpposition; } @@ -323,9 +354,11 @@ if (_slot != -1) then { }; _tradeTotal = _tradeIn + _tradeOut; if !(_returnIn isequalto [] && _returnOut isEqualTo []) then { - _trader setVariable["AI_ITEMS", [_itemClasses, _itemQtys], true]; - _objHiveKey = format["%1:%2", (call EPOCH_fn_InstanceID), _slot]; - ["AI_ITEMS", _objHiveKey, EPOCH_expiresAIdata, [_itemClasses, _itemQtys]] call EPOCH_fnc_server_hiveSETEX; + if !(_trader getvariable ["Epoch_BlackMarketTrader",false]) then { + _trader setVariable["AI_ITEMS", [_itemClasses, _itemQtys], true]; + _objHiveKey = format["%1:%2", (call EPOCH_fn_InstanceID), _slot]; + ["AI_ITEMS", _objHiveKey, EPOCH_expiresAIdata, [_itemClasses, _itemQtys]] call EPOCH_fnc_server_hiveSETEX; + }; if !(_tradeTotal isequalto 0) then { _playerCryptoLimit = EPOCH_customVarLimits select _cIndex; _playerCryptoLimit params ["_playerCryptoLimitMax","_playerCryptoLimitMin"]; diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockVehicle.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockVehicle.sqf index 37d0222d..4b620537 100644 --- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockVehicle.sqf +++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockVehicle.sqf @@ -13,7 +13,7 @@ https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockVehicle.sqf */ //[[[cog import generate_private_arrays ]]] -private ["_VehLockMessages","_msg","_crew","_driver","_isLocked","_lockOwner","_lockedOwner","_logic","_playerGroup","_playerUID","_response","_vehLockHiveKey","_vehSlot","_nearhome"]; +private ["_VehLockMessages","_msg","_crew","_driver","_isLocked","_lockOwner","_lockedOwner","_logic","_playerGroup","_playerUID","_response","_vehLockHiveKey","_vehSlot","_nearhome","_lockArr"]; //[[[end]]] params [ ["_vehicle",objNull,[objNull]], @@ -33,8 +33,10 @@ _playerUID = getPlayerUID _player; _playerGroup = _player getVariable["GROUP", ""]; _lockOwner = _playerUID; +_lockArr = [_playerUID]; if (_playerGroup != "") then { _lockOwner = _playerGroup; + _lockArr pushbackunique _playerGroup; }; _lockedOwner = "-1"; @@ -68,14 +70,14 @@ _crew = []; _logic = if !(_crew isEqualTo []) then { if (_player in _crew) then { // allow unlock if player is the driver or is inside the vehicle with out a driver. - (_player isEqualTo _driver || isNull(_driver) || _lockedOwner == _lockOwner || !alive _driver) + (_player isEqualTo _driver || isNull(_driver) || _lockedOwner in _lockArr || !alive _driver) } else { // allow only if player is already the owner as they are not inside the occupied vehicle. - (_lockedOwner == _lockOwner) + (_lockedOwner in _lockArr) }; } else { // vehicle has no crew, so allow only if: unlocked, is already the owner, vehicle has no owner. - (!_isLocked || _lockedOwner == _lockOwner || _lockedOwner == "-1") + (!_isLocked || _lockedOwner in _lockArr || _lockedOwner == "-1") }; // Lockout mech diff --git a/Sources/epoch_server/init/server_init.sqf b/Sources/epoch_server/init/server_init.sqf index a2dad2f6..98c873b5 100644 --- a/Sources/epoch_server/init/server_init.sqf +++ b/Sources/epoch_server/init/server_init.sqf @@ -120,9 +120,9 @@ diag_log "Epoch: Init Connect/Disconnect handlers"; onPlayerConnected {}; // seems this is needed or addMissionEventHandler "PlayerConnected" does not work. as of A3 1.60 addMissionEventHandler ["PlayerConnected", { params ["_id","_uid","_name","_jip","_owner"]; - // TODO: diabled STEAMAPI - Vac ban check needs reworked. - // "epochserver" callExtension format["001|%1", _uid]; - // diag_log format["playerConnected:%1", _this]; + if !(missionNamespace getVariable ["EPOCH_SERVER_READY", false]) exitwith { + ['kick',_uid,'Server not fully loaded - retry in a few seconds!'] call EPOCH_serverCommand + }; ["PlayerData", _uid, EPOCH_expiresPlayer, [_name]] call EPOCH_fnc_server_hiveSETEX; ['Connected', [_uid, _name]] call EPOCH_fnc_server_hiveLog; }]; @@ -182,12 +182,115 @@ call EPOCH_server_createTeleport; diag_log "Epoch: Loading NPC traders"; EPOCH_Traders = []; +EPOCH_StaticTraders = []; +Epoch_DynamicTraders = []; EPOCH_NPCSlotsLimit call EPOCH_server_loadTraders; diag_log "Epoch: Spawning NPC traders"; call EPOCH_server_spawnTraders; publicvariable "EPOCH_Traders"; +// Start Black Market Traders +_StaticBlackMarketIdx = ["CfgBlackMarket", "StaticBlackMarketIdx", []] call EPOCH_fnc_returnConfigEntryV2; +_BlackMarketTraderCount = ["CfgBlackMarket", "BlackMarketTraderCount", [0,0]] call EPOCH_fnc_returnConfigEntryV2; +_ShowBlackMarketTraders = ["CfgBlackMarket", "ShowBlackMarketTraders", true] call EPOCH_fnc_returnConfigEntryV2; +_BlackMarketMarkerColor = ["CfgBlackMarket", "BlackMarketMarkerColor", "ColorRed"] call EPOCH_fnc_returnConfigEntryV2; +_BlackMarketItemsCount = ["CfgBlackMarket", "BlackMarketItemsCount", 100] call EPOCH_fnc_returnConfigEntryV2; +_BlackMarketUseLootList = ["CfgBlackMarket", "BlackMarketUseLootList", true] call EPOCH_fnc_returnConfigEntryV2; +_BlackMarketExtraItems = ["CfgBlackMarket", "BlackMarketExtraItems", []] call EPOCH_fnc_returnConfigEntryV2; +_Blackmarket_BlackList = ["CfgBlackMarket", "Blackmarket_BlackList", []] call EPOCH_fnc_returnConfigEntryV2; + + // Start Calculate The Items for BlackMarkets + _lootTableIndex = if (EPOCH_modCUPVehiclesEnabled) then {if (EPOCH_mod_madArma_Enabled) then {3} else {1}} else {if (EPOCH_mod_madArma_Enabled) then {2} else {0}}; + _lootTableClass = ["CfgLootTable","CfgLootTable_CUP","CfgLootTable_MAD","CfgLootTable_MADCUP"] select _lootTableIndex; + if !(EPOCH_forcedLootSpawnTable isEqualTo "") then { + _lootTableClass = EPOCH_forcedLootSpawnTable; + }; + _AllowedSpawnItemList = []; + _PricingList = (missionConfigFile >> "CfgPricing") call BIS_fnc_getCfgSubClasses; + if (_BlackMarketUseLootList) then { + _noprice = []; + _fncadditems = { + _itemsarray = getarray (_this >> "items"); + { + if !((_x select 1) isEqualTo 0) then { + if ((_x select 0 select 1) isequalto "CfgLootTable") then { + (configfile >> _lootTableClass >> (_x select 0 select 0)) call _fncadditems; + } + else { + if ((_x select 0 select 0) in _PricingList) then { + _AllowedSpawnItemList pushbackunique (_x select 0 select 0); + } + else { + if !((_x select 0 select 0) in _noprice) then { + diag_log format ["%1 is in your LootTable, but not have a price!!!",(_x select 0 select 0)]; + _noprice pushback (_x select 0 select 0); + }; + }; + }; + }; + } foreach _itemsarray; + }; + { + _tables = (getarray (_x >> "tables")); + { + _check = _x; + if !(_check isEqualType []) then { + _check = [_x]; + }; + (configfile >> _lootTableClass >> (_check select 0)) call _fncadditems; + } foreach _tables; + } foreach ("true" configclasses (configfile >> "CfgMainTable")); + }; + _arrtmp = +_AllowedSpawnItemList; + _arrtmp = _arrtmp + (_BlackMarketExtraItems select {_x in _PricingList}); + _arrtmp = _arrtmp - _Blackmarket_BlackList; + _arrcnttmp = []; + { + _arrcnttmp pushback _BlackMarketItemsCount; + } foreach _arrtmp; + // Convert Starter Trader Magazines from mags to rounds + { + _maxrnd = 1; + if ([_x,"cfgMagazines"] call Epoch_fnc_isAny) then { + _maxrnd = getnumber (configfile >> "cfgMagazines" >> _x >> "count"); + }; + if (_maxrnd > 1) then { + _currentStock = (_arrcnttmp select _foreachindex)*_maxrnd; + _arrcnttmp set [_foreachindex, _currentStock]; + }; + } foreach _arrtmp; + + // Check the spawned BlackMarket Traders and handle them + _BlackMarketTraders = []; + { + if (_foreachindex in _StaticBlackMarketIdx) then { + _BlackMarketTraders pushback _x; + }; + } foreach EPOCH_StaticTraders; + _BlackMarketTraderCount params [["_minmarkets",0],["_maxmarkets",0]]; + for "_i" from 1 to (round (_minmarkets + random (_maxmarkets - _minmarkets))) do { + if (count Epoch_DynamicTraders > 0) then { + _trader = selectrandom Epoch_DynamicTraders; + Epoch_DynamicTraders = Epoch_DynamicTraders - [_trader]; + _BlackMarketTraders pushback _trader; + }; + }; + + { + if (_ShowBlackMarketTraders) then { + { + deletemarker _x; + } foreach (_x getVariable["MARKER_REF", []]); + _markers = ["StaticTrader",getpos _x,"BlackMarket Trader"] call EPOCH_server_createGlobalMarkerSet; + _x setVariable["MARKER_REF", _markers]; + {_x setmarkercolor _BlackMarketMarkerColor;} foreach _markers; + }; + _x setVariable ["AI_ITEMS", [_arrtmp,_arrcnttmp], true]; + _x setvariable ["Epoch_BlackMarketTrader",true,true]; + } foreach _BlackMarketTraders; +// End Black Market Traders + if (([_serverSettingsConfig, "ReplaceCarService", false] call EPOCH_fnc_returnConfigEntry)) then { { private _shop = "paintshop" createvehicle (getpos _x); diff --git a/Sources/epoch_server/init/server_securityfunctions.sqf b/Sources/epoch_server/init/server_securityfunctions.sqf index 3ead1234..ae38e806 100644 --- a/Sources/epoch_server/init/server_securityfunctions.sqf +++ b/Sources/epoch_server/init/server_securityfunctions.sqf @@ -30,7 +30,7 @@ _cfg_remoteExecClient = (_config >> "remoteExecClient"); _remoteExecClient_NAMES = [_cfg_remoteExecClient, "functions", []] call EPOCH_fnc_returnConfigEntry; _cfg_limits = (_config >> "limits"); -_skn_playerCryptoLimit = [_cfg_limits, "playerCrypto", 250000] call EPOCH_fnc_returnConfigEntry; +_skn_playerCryptoLimit = [_cfg_limits, "playerCrypto", 1000000] call EPOCH_fnc_returnConfigEntry; _cfg_learning = (_config >> "learning"); _skn_trustedUsers = [_cfg_learning,"trustedUsers",[]] call EPOCH_fnc_returnConfigEntry; diff --git a/Sources/epoch_server/init/server_variables.sqf b/Sources/epoch_server/init/server_variables.sqf index 2da16c99..94fcb89f 100644 --- a/Sources/epoch_server/init/server_variables.sqf +++ b/Sources/epoch_server/init/server_variables.sqf @@ -26,6 +26,7 @@ EPOCH_staticNPCTraderPos = []; EPOCH_traderStoredVehicles = []; EPOCH_traderStoredVehiclesCnt = []; Epoch_LootedBuildings = []; +Epoch_BaseSpawnSkips = [[],[]]; private _configArray = [ ["serverRestart", false], diff --git a/Sources/epoch_server_settings/configs/CfgLootTable.h b/Sources/epoch_server_settings/configs/CfgLootTable.h index 4f93082f..73a630c7 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable.h @@ -471,7 +471,7 @@ class CfgLootTable { { "gyro_wrap_epoch", "magazine" }, 4 }, { { "icecream_epoch", "magazine" }, 3 }, { { "ItemPowderMilk", "magazine" }, 3 }, - { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemRiceBox", "magazine" }, 3 }, { { "ItemCereals", "magazine" }, 3 }, { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, @@ -1571,7 +1571,7 @@ class CfgLootTable { items[] = { { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, - { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Vrana_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, { { "U_C_Paramedic_01_F", "item" }, 1 }, @@ -2017,7 +2017,7 @@ class CfgLootTable items[] = { { { "Gems", "CfgLootTable" }, 10 }, { { "Throw", "CfgLootTable" }, 11 }, - { { "ThrowExplosive", "magazine" }, 12 }, + { { "ThrowExplosive", "CfgLootTable" }, 12 }, { { "MiniGrenade", "magazine" }, 20 }, { { "Medical", "CfgLootTable" }, 21 }, { { "Venom_EPOCH", "magazine" }, 26 } diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h b/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h index 23b365c2..2fb316bf 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_CUP.h @@ -471,7 +471,7 @@ class CfgLootTable_CUP { { "gyro_wrap_epoch", "magazine" }, 4 }, { { "icecream_epoch", "magazine" }, 3 }, { { "ItemPowderMilk", "magazine" }, 3 }, - { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemRiceBox", "magazine" }, 3 }, { { "ItemCereals", "magazine" }, 3 }, { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, @@ -1571,7 +1571,7 @@ class CfgLootTable_CUP { items[] = { { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, - { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Vrana_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, { { "U_C_Paramedic_01_F", "item" }, 1 }, @@ -2021,7 +2021,7 @@ class CfgLootTable_CUP items[] = { { { "Gems", "CfgLootTable" }, 10 }, { { "Throw", "CfgLootTable" }, 11 }, - { { "ThrowExplosive", "magazine" }, 12 }, + { { "ThrowExplosive", "CfgLootTable" }, 12 }, { { "MiniGrenade", "magazine" }, 20 }, { { "Medical", "CfgLootTable" }, 21 }, { { "Venom_EPOCH", "magazine" }, 26 } diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h b/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h index 4fd72a62..1780450c 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_MAD.h @@ -471,7 +471,7 @@ class CfgLootTable_MAD { { "gyro_wrap_epoch", "magazine" }, 4 }, { { "icecream_epoch", "magazine" }, 3 }, { { "ItemPowderMilk", "magazine" }, 3 }, - { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemRiceBox", "magazine" }, 3 }, { { "ItemCereals", "magazine" }, 3 }, { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, @@ -1571,7 +1571,7 @@ class CfgLootTable_MAD { items[] = { { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, - { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Vrana_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, { { "U_C_Paramedic_01_F", "item" }, 1 }, @@ -2020,7 +2020,7 @@ class CfgLootTable_MAD items[] = { { { "Gems", "CfgLootTable" }, 10 }, { { "Throw", "CfgLootTable" }, 11 }, - { { "ThrowExplosive", "magazine" }, 12 }, + { { "ThrowExplosive", "CfgLootTable" }, 12 }, { { "MiniGrenade", "magazine" }, 20 }, { { "Medical", "CfgLootTable" }, 21 }, { { "Venom_EPOCH", "magazine" }, 26 } diff --git a/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h b/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h index 72840ea4..e49650cd 100644 --- a/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h +++ b/Sources/epoch_server_settings/configs/CfgLootTable_MADCUP.h @@ -471,7 +471,7 @@ class CfgLootTable_MADCUP { { "gyro_wrap_epoch", "magazine" }, 4 }, { { "icecream_epoch", "magazine" }, 3 }, { { "ItemPowderMilk", "magazine" }, 3 }, - { { "ItemRicebox", "magazine" }, 3 }, + { { "ItemRiceBox", "magazine" }, 3 }, { { "ItemCereals", "magazine" }, 3 }, { { "ItemVitamins", "magazine" }, 3 }, { { "honey_epoch", "magazine" }, 5 }, @@ -1571,7 +1571,7 @@ class CfgLootTable_MADCUP { items[] = { { { "U_C_ConstructionCoverall_Red_F", "item" }, 1 }, - { { "U_C_ConstructionCoverall_vrana_F", "item" }, 1 }, + { { "U_C_ConstructionCoverall_Vrana_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Black_F", "item" }, 1 }, { { "U_C_ConstructionCoverall_Blue_F", "item" }, 1 }, { { "U_C_Paramedic_01_F", "item" }, 1 }, @@ -2020,7 +2020,7 @@ class CfgLootTable_MADCUP items[] = { { { "Gems", "CfgLootTable" }, 10 }, { { "Throw", "CfgLootTable" }, 11 }, - { { "ThrowExplosive", "magazine" }, 12 }, + { { "ThrowExplosive", "CfgLootTable" }, 12 }, { { "MiniGrenade", "magazine" }, 20 }, { { "Medical", "CfgLootTable" }, 21 }, { { "Venom_EPOCH", "magazine" }, 26 } diff --git a/Sources/epoch_server_settings/configs/security/security_checks.h b/Sources/epoch_server_settings/configs/security/security_checks.h index d1ba1f28..2eb80e96 100644 --- a/Sources/epoch_server_settings/configs/security/security_checks.h +++ b/Sources/epoch_server_settings/configs/security/security_checks.h @@ -16,6 +16,11 @@ class CfgSecConf { debug = "false"; + class limits + { + playerCrypto = 1000000; // Players with more than this amount get automatically banned + }; + class vehicles { safeVehicles[] = {"I_UAV_01_F","B_Heli_Transport_01_F","Steerable_Parachute_F","NonSteerable_Parachute_F","Land_Camping_Light_F","container_epoch"}; }; diff --git a/Tools/SQF/saveLootPositions_v2/saveLootPositions_v2_Codes.sqf b/Tools/SQF/saveLootPositions_v2/saveLootPositions_v2_Codes.sqf index e27c4c42..2d630194 100644 --- a/Tools/SQF/saveLootPositions_v2/saveLootPositions_v2_Codes.sqf +++ b/Tools/SQF/saveLootPositions_v2/saveLootPositions_v2_Codes.sqf @@ -91,7 +91,50 @@ if (isnil "LootMarkersPositions" && isnil "LootMarkers") then { "Land_Tyres_F", "Land_Ind_BoardsPack2", "Land_JunkPile_F", - "Land_CratesShabby_F" + "Land_CratesShabby_F", + "Land_PowerPoleWooden_L_F", + "Land_seno_balik", + "CinderFloor_EPOCH", + "Land_Shed_W02_EP1", + "clone_female_static_F", + "clone_female_static_F", + "CinderWall_EPOCH", + "CinderWallGarage_EPOCH", + "WoodFloor_EPOCH", + "Land_Zed_dira_civil", + "Land_Helfenburk_zed", + "Land_PowLines_ConcL", + "Land_Shed_M01_EP1", + "Land_Shed_W03", + "Land_Helfenburk_brana", + "Land_Vysilac_chodba", + "Land_Com_tower_ep1", + "Land_Fuelstation_army", + "Land_Ind_BoardsPack1", + "Land_OrlHot", + "Land_Dumruina_mini", + "TP_Booth_c_EPOCH", + "Land_popelnice", + "Land_Ind_Timbers", + "Epoch_LootHolder", + "Land_A_Crane_02b", + "paintshop", + "FirePlace_02_EPOCH", + "clone_male_static_F", + "Land_Atm_01_F", + "Land_TTowerSmall_1_F", + "Land_vodni_vez", + "Land_Kontejner", + "Land_Bench_04_F", + "Land_Sara_domek_zluty_bez", + "Land_Helfenburk_cimburi", + "CinderWallHalf_EPOCH", + "Land_A_statue02", + "CinderWall_window_EPOCH", + "Debug_static_F", + "Land_HouseV2_04", + "Goldenseal_EPOCH", + "Land_Vysilac_vez" ]; _skipstrings = [ "land_powerwire", diff --git a/changelog.md b/changelog.md index 42d010ed..1d35fff8 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,28 @@ # Change Log All changes for [Arma 3](https://arma3.com/) [Epoch Mod](https://epochmod.com) are listed in this changelog. +## [1.3.3.1] - 2020-09-01 +### Added +- Clear message that the server is not fully loaded when Players login to early +- Optional Black Market Traders +- Build in RyanZ Zombiespawner (when RyanZ is enabled on the Server) +- Trader Filter for useable items on currently equipped weapons + +### Fixed +- On farming wracks / cinder, sometimes the more far away object was looted instead of the nearest +- Purchased Boats from Traders sometimes spawned damaged +- In some cases, purchased Vehicles spawned on top of already existing vehicles -> crashed + +### Changed + +### Server Owners +- Added missing predefined variable "Epoch_BaseSpawnSkips" (no issues, just a rpt error) +- Krypto Limit from 250000 to 1000000 to prevent unwanted bans +- Some loot positions were not in correct syntax +- Black Market Traders can be configured within CfgBlackMarket.hpp (within the mission file) +- RyanZ Zombiespawner can be configured within epoch_server_RyanZ_Spawner.pbo (server side) + - To disable this spawner, you can remove this pbo from your Server + ## [1.3.3.0] - 2020-06-03 ### Added - Some Dupe fixes