Merge pull request #1017 from EpochModTeam/experimental

release 1.3.3.1
This commit is contained in:
vbawol 2020-09-01 14:29:27 -05:00 committed by GitHub
commit d063b49de3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 1059 additions and 87 deletions

View File

@ -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[] = {

View File

@ -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) \[.+\]"

View File

@ -1 +1 @@
5 ""
5 "" !"0.700000"

View File

@ -0,0 +1 @@
Epoch_RyanZ_Spawner

View File

@ -0,0 +1 @@
Epoch_RyanZ_Spawner

View File

@ -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;
};
};

View File

@ -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"
*/
};
};

View File

@ -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"

View File

@ -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";
};

View File

@ -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;

View File

@ -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

View File

@ -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 {

View File

@ -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");

View File

@ -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");

View File

@ -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");

View File

@ -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];
};
};

View File

@ -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

View File

@ -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"
};
};

View File

@ -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
{

View File

@ -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",

View File

@ -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;

View File

@ -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;
};

View File

@ -26,6 +26,10 @@ class CfgRemoteExec
{
mode = 1;
jip = 0;
class Epoch_ZedSpawner {
allowedTargets=2;
jip = 0;
};
class EPOCH_server_spawnLoot
{
allowedTargets=2;

View File

@ -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"

View File

@ -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)];

View File

@ -120,6 +120,7 @@ for "_i" from 1 to _spawnCount do {
};
EPOCH_Traders pushback _agent;
_Traderblocks pushback [getpos _agent, _TraderMinDistance];
Epoch_DynamicTraders pushback _agent;
};
};
};

View File

@ -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 = [];
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] 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] call BIS_fnc_findSafePos;
_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 {
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"];

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -26,6 +26,7 @@ EPOCH_staticNPCTraderPos = [];
EPOCH_traderStoredVehicles = [];
EPOCH_traderStoredVehiclesCnt = [];
Epoch_LootedBuildings = [];
Epoch_BaseSpawnSkips = [[],[]];
private _configArray = [
["serverRestart", false],

View File

@ -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 }

View File

@ -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 }

View File

@ -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 }

View File

@ -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 }

View File

@ -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"};
};

View File

@ -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",

View File

@ -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