Conditional Loot table feature and reworking antagonist spawning

- We no longer spawn antagonists on opening loot containers or trash.
Instead we have the client spawn them from a new weighted array. Note:
Admins can control what AI are spawning by removing from array
(antagonistChances) or setting chance to 0
- moved EPOCH_spawnIndex and EPOCH_spawnLimits to master loop init
instead of both_init as it is only needed client side.
- loot table updates for extra logic condition.
This commit is contained in:
vbawol 2017-08-30 17:15:14 -05:00
parent f7f839abf8
commit 01c8641ff2
14 changed files with 464 additions and 417 deletions

View File

@ -1,14 +1,7 @@
_spawnChance = ((EPOCH_playerNuisance + EPOCH_playerSoiled)/2) max 1;
if (random _droneRndChance < _spawnChance) then {
"I_UAV_01_F" call EPOCH_unitSpawnIncrease;
};
if (EPOCH_mod_Ryanzombies_Enabled) then {
if (random _zombieRngChance < _spawnChance) then {
["EPOCH_RyanZombie_1",12] call EPOCH_unitSpawnIncrease;
};
};
if (random _sapperRndChance < _spawnChance) then {
"Epoch_Sapper_F" call EPOCH_unitSpawnIncrease;
// add more antagonist spawn chances
if (random _antagonistRndChance < _spawnChance) then {
(selectRandomWeighted _antagonistChances) call EPOCH_unitSpawnIncrease;
};
// diag_log format["DEBUG: _spawnChance %1",_spawnChance];

View File

@ -23,9 +23,8 @@ _panic = false;
_prevEnergy = EPOCH_playerEnergy;
// init config data
_sapperRndChance = ["CfgEpochClient", "sapperRngChance", 100] call EPOCH_fnc_returnConfigEntryV2;
_zombieRngChance = ["CfgEpochClient", "zombieRngChance", 50] call EPOCH_fnc_returnConfigEntryV2;
_droneRndChance = ["CfgEpochClient", "droneRngChance", 100] call EPOCH_fnc_returnConfigEntryV2;
_antagonistRndChance = ["CfgEpochClient", "antagonistRngChance", 100] call EPOCH_fnc_returnConfigEntryV2;
_baseHungerLoss = ["CfgEpochClient", "baseHungerLoss", 2] call EPOCH_fnc_returnConfigEntryV2;
_baseThirstLoss = ["CfgEpochClient", "baseThirstLoss", 2] call EPOCH_fnc_returnConfigEntryV2;
_energyCostNV = ["CfgEpochClient", "energyCostNV", 3] call EPOCH_fnc_returnConfigEntryV2;
@ -36,6 +35,47 @@ _hudConfigs = ["CfgEpochClient", "hudConfigs", []] call EPOCH_fnc_returnConfigEn
EPOCH_chargeRate = 0;
EPOCH_playerIsSwimming = false;
_antagonistChanceDefaults = [
"Epoch_Cloak_F",0.07,
"Epoch_Sapper_F",0.25,
"Epoch_SapperG_F",0.12,
"Epoch_SapperB_F",0.06,
"I_UAV_01_F",0.2,
"PHANTOM",0.01,
"EPOCH_RyanZombie_1",0.25
];
_antagonistChances = ["CfgEpochClient", "antagonistChances", _antagonistChanceDefaults] call EPOCH_fnc_returnConfigEntryV2;
// Init antagonist spawn limits
EPOCH_spawnIndex = [];
EPOCH_spawnLimits = [];
_antagonistSpawnDefaults = [
["Epoch_Cloak_F", 1],
["GreatWhite_F", 2],
["Epoch_Sapper_F",2],
["Epoch_SapperG_F",1],
["Epoch_SapperB_F",1],
["I_UAV_01_F",2],
["PHANTOM",1],
["B_Heli_Transport_01_F",1],
["EPOCH_RyanZombie_1",12]
];
_spawnLimits = ["CfgEpochClient", "antagonistSpawnIndex", _antagonistSpawnDefaults] call EPOCH_fnc_returnConfigEntryV2;
{
_x params ["_spawnName","_spawnLimit"];
if (_spawnName isEqualTo "EPOCH_RyanZombie_1") then {
if (EPOCH_mod_Ryanzombies_Enabled) then {
EPOCH_spawnIndex pushBack _spawnName;
EPOCH_spawnLimits pushBack _spawnLimit;
};
} else {
EPOCH_spawnIndex pushBack _spawnName;
EPOCH_spawnLimits pushBack _spawnLimit;
};
} forEach _spawnLimits;
// default data if mismatch
if !(EPOCH_playerSpawnArray isEqualTypeParams EPOCH_spawnIndex) then{
EPOCH_playerSpawnArray = [];

View File

@ -88,35 +88,6 @@ EPOCH_communityStatsDefaults = _communityStatsInit;
} forEach _communityStatsInit;
EPOCH_communityStatsCount = count EPOCH_communityStats;
// Init antagonist spawn limits
EPOCH_spawnIndex = [];
EPOCH_spawnLimits = [];
_antagonistSpawnDefaults = [
["Epoch_Cloak_F", 1],
["GreatWhite_F", 2],
["Epoch_Sapper_F",2],
["Epoch_SapperG_F",1],
["Epoch_SapperB_F",1],
["I_UAV_01_F",2],
["PHANTOM",1],
["B_Heli_Transport_01_F",1],
["EPOCH_RyanZombie_1",12]
];
_spawnLimits = ["CfgEpochClient", "antagonistSpawnIndex", _antagonistSpawnDefaults] call EPOCH_fnc_returnConfigEntryV2;
{
_x params ["_spawnName","_spawnLimit"];
if (_spawnName isEqualTo "EPOCH_RyanZombie_1") then {
if (EPOCH_mod_Ryanzombies_Enabled) then {
EPOCH_spawnIndex pushBack _spawnName;
EPOCH_spawnLimits pushBack _spawnLimit;
};
} else {
EPOCH_spawnIndex pushBack _spawnName;
EPOCH_spawnLimits pushBack _spawnLimit;
};
} forEach _spawnLimits;
//GroupSize (number) // Price (String)
EPOCH_group_upgrade_lvl = ["CfgEpochClient", "group_upgrade_lvl", [4,"100",6,"300",8,"500",10,"1000",12,"1500",13,"1750",14,"2000",15,"3000",16,"5000"]] call EPOCH_fnc_returnConfigEntryV2;

View File

@ -1,331 +1,353 @@
/*[[[cog from arma_config_tools import *; json_to_arma()]]]*/
/*
@author = "Aaron Clark - https://EpochMod.com";
@contributors[] = {"Raimonds Virtoss","Andrew Gregory"};
@description = "Custom Epoch Client Only functions";
@licence = "Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike";
@github = "https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_config/Configs/CfgClientFunctions.hpp";
@author = "Aaron Clark - https://EpochMod.com";
@contributors[] = {"Raimonds Virtoss","Andrew Gregory"};
@description = "Custom Epoch Client Only functions";
@licence = "Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike";
@github = "https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_config/Configs/CfgClientFunctions.hpp";
*/
class CfgClientFunctions
{
version = 1;
class A3E
{
tag = "EPOCH";
file = "epoch_code\compile";
class generic
{
file = "epoch_code\compile";
class localCleanup {};
class unitSpawnIncrease {};
class unitSpawnDecrease {};
class QuickTakeAll {};
class QuickTakeLoad {};
class effectCrypto {};
class handleServerMessage {};
class updateLoadingScreen {};
class EnterBuilding {};
class lootTrash {};
class debugMonitor {};
class interact {};
class chopWood {};
class fish {};
class mineRocks {};
class UnisexCheck {};
class PutHandler {};
class niteLight {};
class LootIT {};
class supportCopter {};
class consumeItem {};
class unitSpawn {};
class onEachFrame {};
class callSapperMigration {};
class zombieSpawn {};
class makeMarker {};
class removeMarker {};
version = 1;
class A3E
{
tag = "EPOCH";
file = "epoch_code\compile";
class generic
{
file = "epoch_code\compile";
class localCleanup {};
class unitSpawnIncrease {};
class unitSpawnDecrease {};
class QuickTakeAll {};
class QuickTakeLoad {};
class effectCrypto {};
class handleServerMessage {};
class updateLoadingScreen {};
class EnterBuilding {};
class lootTrash {};
class debugMonitor {};
class interact {};
class chopWood {};
class fish {};
class mineRocks {};
class UnisexCheck {};
class PutHandler {};
class niteLight {};
class LootIT {};
class supportCopter {};
class consumeItem {};
class unitSpawn {};
class onEachFrame {};
class callSapperMigration {};
class zombieSpawn {};
class makeMarker {};
class removeMarker {};
class unit_onKilledEH {};
};
class building
{
class maintainIT {};
class lockCheck {};
class countdown {};
class fnc_SelectTargetBuild {};
class isBuildAllowed {};
class simulSwap {};
class staticMove {};
class upgradeBUILD {};
class removeBUILD {};
class changeWallState {};
class checkBuild {};
};
class traders
{
class NpcTrade_return {};
class startInteract {};
class startInteractNPC {};
class npcTraderAdd {};
class npcTraderAdd2 {};
class npcTraderAdd3 {};
class startNPCTraderMenu {};
class NPCTraderMenuFilter {};
class startNpcTrade {};
class tradeFilter {};
class takeCrypto {};
class startBankTransfer {};
};
class building
{
class maintainIT {};
class lockCheck {};
class countdown {};
class fnc_SelectTargetBuild {};
class isBuildAllowed {};
class simulSwap {};
class staticMove {};
class upgradeBUILD {};
class removeBUILD {};
class changeWallState {};
class checkBuild {};
};
class traders
{
class NpcTrade_return {};
class startInteract {};
class startInteractNPC {};
class npcTraderAdd {};
class npcTraderAdd2 {};
class npcTraderAdd3 {};
class startNPCTraderMenu {};
class NPCTraderMenuFilter {};
class startNpcTrade {};
class tradeFilter {};
class takeCrypto {};
class startBankTransfer {};
class calcDamageCost {};
};
class interface_event_handlers
{
class KeyDown {};
class KeyUp {};
class onChar {};
};
class event_handlers
{
class getInMan {};
class getOutMan {};
class InventoryClosed {};
class InventoryOpened {};
};
class setup
{
class masterLoop {};
class clientInit {};
class clientRespawn {};
class clientRevive {};
class client_rejectPlayer {};
class clientKeyMap {};
};
class p2p_trading
{
class startTRADEREQ {};
class startTrade {};
class tradeRequest {};
class TradeLoop {};
class makep2pTrade {};
};
class functions
{
class worldObjectType {};
class returnConfig {};
class returnConfigV2 {};
class colorRange {};
class convertTemp {};
class fnc_playerDeath {};
class fnc_playerFired {};
class fnc_isInsideBuilding {};
class fnc_Weather {};
class fnc_findSafePos {};
class fnc_addItemOverflow {};
class pushCustomVar {};
class itemData {};
class itemPicture {};
class itemDisplayName {};
class SortArrayByDistance {};
class fnc_findRandomPosBehind {};
class fnc_stringLeft {};
class fnc_findSapperStalkLocation {};
class fnc_dirToFuzzy {};
class fnc_cursorTarget {};
class fnc_triggerAntagonist {};
class fnc_playerDeathDetonate {};
class fnc_playerDeathMorph {};
class fnc_playerSetVariable {};
class fnc_playerAttachToAntagonist {};
class fnc_dynamicFSM {};
class fnc_vectorDivide {};
class giveAttributes {};
class fnc_spawnEffects {};
class fnc_arrayStringToBool {};
class client_updatePlayerStat {};
class fnc_getHitPointsDamageAverage {};
};
class environment
{
class client_earthQuake {};
class client_loadAnimalBrain {};
class client_bitePlayer {};
};
class vehicles
{
class client_repairVehicle {};
class client_lockVehicle {};
class client_fillVehicle {};
class client_gearVehicle {};
};
class interface_event_handlers
{
class KeyDown {};
class KeyUp {};
class onChar {};
};
class event_handlers
{
class getInMan {};
class getOutMan {};
class InventoryClosed {};
class InventoryOpened {};
};
class setup
{
class masterLoop {};
class clientInit {};
class clientRespawn {};
class clientRevive {};
class client_rejectPlayer {};
class clientKeyMap {};
};
class p2p_trading
{
class startTRADEREQ {};
class startTrade {};
class tradeRequest {};
class TradeLoop {};
class makep2pTrade {};
};
class functions
{
class worldObjectType {};
class returnConfig {};
class returnConfigV2 {};
class colorRange {};
class convertTemp {};
class fnc_playerDeath {};
class fnc_playerFired {};
class fnc_isInsideBuilding {};
class fnc_Weather {};
class fnc_findSafePos {};
class fnc_addItemOverflow {};
class pushCustomVar {};
class itemData {};
class itemPicture {};
class itemDisplayName {};
class SortArrayByDistance {};
class fnc_findRandomPosBehind {};
class fnc_stringLeft {};
class fnc_findSapperStalkLocation {};
class fnc_dirToFuzzy {};
class fnc_cursorTarget {};
class fnc_arrayToLogic {};
class fnc_returnHudVar {};
class fnc_triggerAntagonist {};
class fnc_playerDeathDetonate {};
class fnc_playerDeathMorph {};
class fnc_playerSetVariable {};
class fnc_playerAttachToAntagonist {};
class fnc_dynamicFSM {};
class fnc_vectorDivide {};
class giveAttributes {};
class fnc_spawnEffects {};
class fnc_arrayStringToBool {};
class client_updatePlayerStat {};
class fnc_getHitPointsDamageAverage {};
};
class environment
{
class client_earthQuake {};
class client_loadAnimalBrain {};
class client_bitePlayer {};
};
class vehicles
{
class client_repairVehicle {};
class client_lockVehicle {};
class client_fillVehicle {};
class client_gearVehicle {};
class client_upgradeVehicle {};
class client_upgradeVehicleCheck {};
class client_VehicleMaintananceCheck {};
class client_VehicleMaintananceDo {};
};
class missions
{
class mission_accept {};
class mission_cage_sapper {};
class mission_returnObj {};
};
class inventory
{
class selectInventoryItem {};
class itemInteractClick {};
class itemInteractDblClick {};
class uniformArmorCalc {};
class gearArmorCalc {};
class factorArmor {};
class maxArmorInit {};
class initUI {};
class refeshUI {};
};
class missions
{
class mission_accept {};
class mission_cage_sapper {};
class mission_returnObj {};
};
class inventory
{
class selectInventoryItem {};
class itemInteractClick {};
class itemInteractDblClick {};
class uniformArmorCalc {};
class gearArmorCalc {};
class factorArmor {};
class maxArmorInit {};
class initUI {};
class refeshUI {};
class equip {};
class itemTypeSlot {};
};
class servicepoint
{
class SP_Check {};
class SP_Rearm {};
class SP_Refuel {};
class SP_Repair {};
class SP_Start {};
};
class customs
{
file = "epoch_code\customs";
class custom_EH_FiredMan {};
class custom_EH_GetInMan {};
class custom_EH_GetOutMan {};
class custom_EH_InventoryClosed {};
class custom_EH_InventoryOpened {};
class custom_EH_KeyDown {};
class custom_EH_KeyUp {};
class custom_EH_Killed {};
class custom_EH_Put {};
class custom_EH_Take {};
class custom_KeyMap {};
class custom_OnEachFrame {};
};
class servicepoint
{
class SP_Check {};
class SP_Rearm {};
class SP_Refuel {};
class SP_Repair {};
class SP_Start {};
};
class customs
{
file = "epoch_code\customs";
class custom_EH_FiredMan {};
class custom_EH_GetInMan {};
class custom_EH_GetOutMan {};
class custom_EH_InventoryClosed {};
class custom_EH_InventoryOpened {};
class custom_EH_KeyDown {};
class custom_EH_KeyUp {};
class custom_EH_Killed {};
class custom_EH_Put {};
class custom_EH_Take {};
class custom_KeyMap {};
class custom_OnEachFrame {};
class custom_radioActions {};
};
class messaging
{
file = "epoch_code\gui\scripts\messaging";
class message {};
class message_old1 {};
class message_old2 {};
};
class looting
{
class spawnLoot {};
};
class gui
{
file = "epoch_code\gui\scripts";
class onPause {};
class showStats {};
class 3DctrlPitchYaw {};
class 3DctrlSpin {};
class 3DctrlYaw {};
class InterruptConfig {};
class InterruptConfigActions {};
class getIDC {};
class guiObjHP {};
class secureStorageHandler {};
class genderSelection {};
class getColorScheme {};
class dragControl {};
};
class animations
{
file = "epoch_code\gui\scripts\animations";
class 2DCtrlShake {};
};
class messaging
{
file = "epoch_code\gui\scripts\messaging";
class message {};
class message_old1 {};
class message_old2 {};
};
class looting
{
class spawnLoot {};
};
class gui
{
file = "epoch_code\gui\scripts";
class onPause {};
class showStats {};
class 3DctrlPitchYaw {};
class 3DctrlSpin {};
class 3DctrlYaw {};
class InterruptConfig {};
class InterruptConfigActions {};
class getIDC {};
class guiObjHP {};
class secureStorageHandler {};
class genderSelection {};
class getColorScheme {};
class dragControl {};
};
class animations
{
file = "epoch_code\gui\scripts\animations";
class 2DCtrlShake {};
class 2DCtrlHeartbeat {};
};
class config
};
class config
{
file = "epoch_code\gui\scripts\config";
class config_keymap {};
};
class dynamenu
{
file = "epoch_code\gui\scripts\dynamenu";
class dynamicMenu {};
class dynamicMenuPopulate {};
class dynamicMenuCleanup {};
};
class dynamicHUD
{
file = "epoch_code\gui\scripts\dynamicHUD";
class dynamicHUD_adjust {};
class dynamicHUD_loadSave {};
class dynamicHUD_start {};
class getHUDCtrl {};
};
class gui_craft
{
file = "epoch_code\gui\scripts\craftingv2";
class crafting_animate {};
class crafting_ctrl_collector {};
class crafting_dev_toggle {};
class crafting_getConfig {};
class crafting_checkGear {};
class crafting_checkNearby {};
class crafting_checkResources {};
class crafting_craft {};
class crafting_progress {};
class crafting_load {};
class crafting_unload {};
class crafting_LB_click {};
class crafting_LB_defaults {};
class crafting_LB_doubleClick {};
class crafting_colorScheme {};
};
class group
{
file = "epoch_code\gui\scripts\group";
class Group_invitePlayer {};
class Group_BtnMod {};
class Group_BtnInvite {};
class Group_onLoad {};
class Group_List {};
class Group_Combo {};
class Group_BtnLeave {};
class Group_BtnKick {};
class cGroup_groupText {};
class cGroup_onLoad {};
class cGroup_BtnCreate {};
class iGroup_acceptInvite {};
class iGroup_onLoad {};
class iGroup_refresh {};
class Group_update {};
};
class groupTemp
{
file = "epoch_code\gui\scripts\config";
class config_keymap {};
};
class dynamenu
{
file = "epoch_code\gui\scripts\dynamenu";
class dynamicMenu {};
class dynamicMenuPopulate {};
class dynamicMenuCleanup {};
};
class dynamicHUD
{
file = "epoch_code\gui\scripts\dynamicHUD";
class dynamicHUD_adjust {};
class dynamicHUD_loadSave {};
class dynamicHUD_start {};
class getHUDCtrl {};
};
class gui_craft
{
file = "epoch_code\gui\scripts\craftingv2";
class crafting_animate {};
class crafting_ctrl_collector {};
class crafting_dev_toggle {};
class crafting_getConfig {};
class crafting_checkGear {};
class crafting_checkNearby {};
class crafting_checkResources {};
class crafting_craft {};
class crafting_progress {};
class crafting_load {};
class crafting_unload {};
class crafting_LB_click {};
class crafting_LB_defaults {};
class crafting_LB_doubleClick {};
class crafting_colorScheme {};
};
class group
{
file = "epoch_code\gui\scripts\group";
class Group_invitePlayer {};
class Group_BtnMod {};
class Group_BtnInvite {};
class Group_onLoad {};
class Group_List {};
class Group_Combo {};
class Group_BtnLeave {};
class Group_BtnKick {};
class cGroup_groupText {};
class cGroup_onLoad {};
class cGroup_BtnCreate {};
class iGroup_acceptInvite {};
class iGroup_onLoad {};
class iGroup_refresh {};
class Group_update {};
};
class gui_inventory
{
file = "epoch_code\gui\scripts\inventory";
class Inventory_Group {};
class Inventory_iGroup {};
};
class gui_missions
{
file = "epoch_code\gui\scripts\missions";
class mission_refresh {};
class mission_description {};
};
class gui_postProcessing
{
file = "epoch_code\gui\scripts\post_process";
class postprocessCreate {};
class postprocessAdjust {};
class postprocessDestroy {};
class setDrunk {};
class setRadiation {};
};
class worldToScreen
{
file = "epoch_code\gui\scripts\worldToScreen";
class gui3DCooldown {};
class gui3DCooldownEH {};
class gui3DWorldPos {};
class gui3DWorldPosEH {};
class gui3DModelPos {};
class gui3DModelPosEH {};
};
file = "epoch_code\gui\scripts\groupTemp";
class tempGroup_invitePlayer {};
class tempGroup_BtnMod {};
class tempGroup_BtnInvite {};
class tempGroup_onLoad {};
class tempGroup_List {};
class tempGroup_Combo {};
class tempGroup_BtnLeave {};
class tempGroup_BtnKick {};
class cTempGroup_onLoad {};
class cTempGroup_BtnCreate {};
class iTempGroup_acceptInvite {};
class iTempGroup_onLoad {};
class iTempGroup_refresh {};
class tempGroup_update {};
};
class gui_inventory
{
file = "epoch_code\gui\scripts\inventory";
class Inventory_Group {};
class Inventory_iGroup {};
class Inventory_tempGroup {};
class Inventory_itempGroup {};
};
class gui_missions
{
file = "epoch_code\gui\scripts\missions";
class mission_refresh {};
class mission_description {};
};
class gui_postProcessing
{
file = "epoch_code\gui\scripts\post_process";
class postprocessCreate {};
class postprocessAdjust {};
class postprocessDestroy {};
class setDrunk {};
class setRadiation {};
};
class worldToScreen
{
file = "epoch_code\gui\scripts\worldToScreen";
class gui3DCooldown {};
class gui3DCooldownEH {};
class gui3DWorldPos {};
class gui3DWorldPosEH {};
class gui3DModelPos {};
class gui3DModelPosEH {};
};
class favBar {
file = "epoch_code\gui\scripts\favBar";
class favBar_draw {};
@ -337,7 +359,7 @@ class CfgClientFunctions
class favBar_getGearItem {};
class favBar_modifier {};
};
};
};
};
/*[[[end]]]*/

View File

@ -18,9 +18,7 @@ class CfgEpochClient
ArmAVersion = 168;
debug = "false"; // true = enable extra rpt debug lines, false to disable
sapperRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100
droneRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100
zombieRngChance = 50; // increase number to reduce chances and reduce to increase. Default 50
antagonistRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100
baseHungerLoss = 2; // increase number to speed up rate of Hunger loss
baseThirstLoss = 2; // increase number to speed up rate of Thirst loss
@ -57,11 +55,70 @@ class CfgEpochClient
deathMorphClass[] = {"Epoch_Sapper_F","Epoch_SapperG_F","Epoch_SapperB_F","I_UAV_01_F","Epoch_Cloak_F"}; //Random selection of these classes when player morphs after death. Currently available: Epoch_Cloak_F, Epoch_SapperB_F, Epoch_Sapper_F, I_UAV_01_F
niteLight[] = {0,1.88,22}; // 0 = disabled or 1 = enabled, Set ambient lighting at night: {Brightness of light,Height of light}. Default (Low Ambient): {1.88,22} | Twilight: {7.2,88} | Distant: {12.8,142}
ryanZombiesEnabled = "true";
antagonistSpawnIndex[] = {{"Epoch_Cloak_F",1},{"GreatWhite_F",2},{"Epoch_Sapper_F",2},{"Epoch_SapperG_F",1},{"Epoch_SapperB_F",1},{"I_UAV_01_F",2},{"PHANTOM",1},{"B_Heli_Transport_01_F",1},{"EPOCH_RyanZombie_1",12},{"I_Soldier_EPOCH",1}}; // {"type", limit}
customVarsDefaults[] = {{"Temp",98.6,{106.7,95,102,105,96,95}},{"Hunger",1500,{5000,0,5001,5001,1250,0}},{"Thirst",750,{2500,0,2501,2501,625,0}},{"AliveTime",0,{-2,0}},{"Energy",0,{2500,0}},{"Wet",0,{100,0,35,55,-1,-1}},{"Soiled",0,{100,0,35,55,-1,-1}},{"Immunity",0,{100,0}},{"Toxicity",0,{100,0,35,55,-1,-1}},{"Stamina",100,{"EPOCH_playerStaminaMax",0}},{"Crypto",0,{250000,0}},{"HitPoints",{0,0,0,0},{1,0,0.5,1,-1,-1}},{"BloodP",100,{190,0,120,140,70,50}},{"SpawnArray",{},{}},{"Karma",0,{50000,-50000}},{"Alcohol",0,{100,0,35,55,-1,-1}},{"Radiation",0,{100,0,35,55,-1,-1}},{"Nuisance",0,{100,0}},{"MissionArray",{},{}}}; // EPOCH_player + varName, default value, {max,min,high-warn,high-critical,low-warn,low-critical}
antagonistChances[] = {
// {"type", chance}
"Epoch_Cloak_F",0.06,
"GreatWhite_F",0,
"Epoch_Sapper_F",0.12,
"Epoch_SapperG_F",0.06,
"Epoch_SapperB_F",0.03,
"I_UAV_01_F",0.12,
"PHANTOM",0.03,
"B_Heli_Transport_01_F",0,
"EPOCH_RyanZombie_1",0.12,
"I_Soldier_EPOCH",0
};
antagonistSpawnIndex[] = {
// {"type", limit}
{"Epoch_Cloak_F",1},
{"GreatWhite_F",2},
{"Epoch_Sapper_F",2},
{"Epoch_SapperG_F",1},
{"Epoch_SapperB_F",1},
{"I_UAV_01_F",2},
{"PHANTOM",1},
{"B_Heli_Transport_01_F",1},
{"EPOCH_RyanZombie_1",12},
{"I_Soldier_EPOCH",1}
};
customVarsDefaults[] = {
// EPOCH_player + varName, default value, {max,min,high-warn,high-critical,low-warn,low-critical}
{"Temp",98.6,{106.7,95,102,105,96,95}},
{"Hunger",1500,{5000,0,5001,5001,1250,0}},
{"Thirst",750,{2500,0,2501,2501,625,0}},
{"AliveTime",0,{-2,0}},
{"Energy",0,{2500,0}},
{"Wet",0,{100,0,35,55,-1,-1}},
{"Soiled",0,{100,0,35,55,-1,-1}},
{"Immunity",0,{100,0}},
{"Toxicity",0,{100,0,35,55,-1,-1}},
{"Stamina",100,{"EPOCH_playerStaminaMax",0}},
{"Crypto",0,{250000,0}},
{"HitPoints",{0,0,0,0},{1,0,0.5,1,-1,-1}},
{"BloodP",100,{190,0,120,140,70,50}},
{"SpawnArray",{},{}},
{"Karma",0,{50000,-50000}},
{"Alcohol",0,{100,0,35,55,-1,-1}},
{"Radiation",0,{100,0,35,55,-1,-1}},
{"Nuisance",0,{100,0}},
{"MissionArray",{},{}}
};
// add any stats and their starting number here for better community integration and neat stats tracking too!
defineCommunityStats[] = {{"Murders",0},{"Deaths",0},{"Suicides",0},{"Revives",0},{"TraderMissions",0},{"AIKills",0},{"AntagonistKills",0},{"ZombieKills",0}};
hudConfigs[] = {{{"BloodP","","",{"getPlayerDamage",">=",0.7}},"topRight","x\addons\a3_epoch_code\Data\UI\bleeding_ca.paa",{"forceUpdate"}},{{"Oxygen","getPlayerOxygenRemaining","",{},{1,0,2,2,1,0.55}},"topRight","x\addons\a3_epoch_code\Data\UI\oxygen_ca.paa"},{"Hunger","topRight","x\addons\a3_epoch_code\Data\UI\hunger_ca.paa",{"forceBloodRise"}},{"Thirst","topRight","x\addons\a3_epoch_code\Data\UI\thirst_ca.paa",{"forceBloodRise"}},{"Temp","topRight",{"x\addons\a3_epoch_code\Data\UI\hot_ca.paa","x\addons\a3_epoch_code\Data\UI\cold_ca.paa"},{"forceFatigue"}},{"Toxicity","topRight","x\addons\a3_epoch_code\Data\UI\hazzard_ca.paa"},{"Alcohol","topRight","x\addons\a3_epoch_code\Data\UI\drunk_ca.paa"},{"Soiled","topRight","x\addons\a3_epoch_code\Data\UI\soiled_ca.paa"},{"Radiation","topRight","x\addons\a3_epoch_code\Data\UI\rads_ca.paa"},{{"HitPoints","getPlayerHitPointDamage","HitLegs"},"topRight","x\addons\a3_epoch_code\Data\UI\broken_ca.paa"}};
hudConfigs[] = {
{{"BloodP","","",{"getPlayerDamage",">=",0.7}},"topRight","x\addons\a3_epoch_code\Data\UI\bleeding_ca.paa",{"forceUpdate"}},
{{"Oxygen","getPlayerOxygenRemaining","",{},{1,0,2,2,1,0.55}},"topRight","x\addons\a3_epoch_code\Data\UI\oxygen_ca.paa"},
{"Hunger","topRight","x\addons\a3_epoch_code\Data\UI\hunger_ca.paa",{"forceBloodRise"}},
{"Thirst","topRight","x\addons\a3_epoch_code\Data\UI\thirst_ca.paa",{"forceBloodRise"}},
{"Temp","topRight",{"x\addons\a3_epoch_code\Data\UI\hot_ca.paa","x\addons\a3_epoch_code\Data\UI\cold_ca.paa"},{"forceFatigue"}},
{"Toxicity","topRight","x\addons\a3_epoch_code\Data\UI\hazzard_ca.paa"},
{"Alcohol","topRight","x\addons\a3_epoch_code\Data\UI\drunk_ca.paa"},
{"Soiled","topRight","x\addons\a3_epoch_code\Data\UI\soiled_ca.paa"},
{"Radiation","topRight","x\addons\a3_epoch_code\Data\UI\rads_ca.paa"},
{{"HitPoints","getPlayerHitPointDamage","HitLegs"},"topRight","x\addons\a3_epoch_code\Data\UI\broken_ca.paa"}
};
group_upgrade_lvl[] = {4,"1000",6,"1500",8,"2000",10,"2500",12,"3000",14,"3500",16,"4000",32,"8000",64,"16000"}; // controls max group limit and cost
// Event handler code
displayAddEventHandler[] = {"keyDown","keyUp"};

View File

@ -46,21 +46,5 @@ if (alive _object) then {
};
};
if ((random 1) <= EPOCH_antagonistChanceTrash) then {
_nearPlayers = _posWH nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 50];
if (!(_nearPlayers isEqualTo[])) then {
_target = selectRandom _nearPlayers;
_antagTable = ["Trash", "CfgMainTable", "antagonists"] call EPOCH_weightedArray;
_antagTableArray = _antagTable select 0;
if !(_antagTableArray isEqualTo[]) then{
_weightedArray = _antagTable select 1;
_triggerType = _antagTableArray select(selectRandom _weightedArray);
[_target, _triggerType] call EPOCH_server_triggerEvent;
};
};
};
};
true

View File

@ -55,13 +55,4 @@ if !(_object in EPOCH_cleanupQueue) then {
[_errorMsg, 5] remoteExec ['Epoch_message',_player];
};
if ((random 1) <= EPOCH_antagonistChanceLoot) then{
_antagTable = [_type, "CfgMainTable", "antagonists"] call EPOCH_weightedArray;
_antagTableArray = _antagTable select 0;
if !(_antagTableArray isEqualTo[]) then{
_weightedArray = _antagTable select 1;
_triggerType = _antagTableArray select(selectRandom _weightedArray);
[_player, _triggerType] call EPOCH_server_triggerEvent;
};
};
};

View File

@ -27,6 +27,13 @@ class CfgServerFunctions
class server_deleteGroup {};
class server_invitePlayer {};
};
class epoch_grouptemp {
class server_upgradeTempGroup {};
class server_updatePlayerTempGroup {};
class server_createTempGroup {};
class server_deleteTempGroup {};
class server_invitePlayerTempGroup {};
};
class epoch_bases {
class swapBuilding {};
class saveBuilding {};

View File

@ -36,12 +36,11 @@ private _configArray = [
["lootMultiplier", 0.5],
["WeatherStaticForecast", []],
["showEarthQuakes", true],
["showSatellites", true],
["showShippingContainers", true],
["cloneCost", 100],
["vehicleLockTime", 1800],
["antagonistChanceTrash", 0.09],
["antagonistChancePDeath", 0.33],
["antagonistChanceLoot", 0.09],
["taxRate", 0.1],
["starterTraderItems", [[], []]],
["SHOW_TRADERS", true],

View File

@ -1342,9 +1342,9 @@ class CfgLootTable
{ { "H_92_EPOCH", "item" }, 1 },
{ { "H_104_EPOCH", "item" }, 1 },
{ { "H_105_EPOCH", "item" }, 1 },
{ { "wolf_mask_epoch", "item" }, 1 },
{ { "pkin_mask_epoch", "item" }, 1 },
{ { "clown_mask_epoch", "item" }, 1 }
{ { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} } // only available in october
};
};
};

View File

@ -1905,9 +1905,9 @@ class CfgLootTable_CUP
{ { "H_92_EPOCH", "item" }, 1 },
{ { "H_104_EPOCH", "item" }, 1 },
{ { "H_105_EPOCH", "item" }, 1 },
{ { "wolf_mask_epoch", "item" }, 1 },
{ { "pkin_mask_epoch", "item" }, 1 },
{ { "clown_mask_epoch", "item" }, 1 }
{ { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} } // only available in october
};
};
};

View File

@ -1350,9 +1350,9 @@ class CfgLootTable_MAD
{ { "H_92_EPOCH", "item" }, 1 },
{ { "H_104_EPOCH", "item" }, 1 },
{ { "H_105_EPOCH", "item" }, 1 },
{ { "wolf_mask_epoch", "item" }, 1 },
{ { "pkin_mask_epoch", "item" }, 1 },
{ { "clown_mask_epoch", "item" }, 1 }
{ { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} } // only available in october
};
};
};

View File

@ -1913,9 +1913,9 @@ class CfgLootTable_MADCUP
{ { "H_92_EPOCH", "item" }, 1 },
{ { "H_104_EPOCH", "item" }, 1 },
{ { "H_105_EPOCH", "item" }, 1 },
{ { "wolf_mask_epoch", "item" }, 1 },
{ { "pkin_mask_epoch", "item" }, 1 },
{ { "clown_mask_epoch", "item" }, 1 }
{ { "wolf_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "pkin_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} }, // only available in october
{ { "clown_mask_epoch", "item" }, 1, {"getDate", 1, "==", 10} } // only available in october
};
};
};

View File

@ -20,15 +20,6 @@ class CfgMainTable
lootMin = 1;
LootMax = 1;
tables[] = { "Food" };
antagonists[] = {
{ "Zombie", 40 },
{ "UAV", 15 },
{ "Cloak", 10 }, // Night = Epoch_Cloak_F, Day = Epoch_Sapper_F
{ "Sapper", 20 },
{ "SapperG", 5 },
{ "SapperB", 5 },
{ "PHANTOM", 5 }
};
};
class Tree : Default
{
@ -62,14 +53,6 @@ class CfgMainTable
{ "Generic", 15 },
{ "GenericLarge", 18 }
};
antagonists[] = {
{ "Zombie", 45 },
{ "UAV", 15 },
{ "Cloak", 10 }, // Night = Epoch_Cloak_F, Day = Epoch_Sapper_F
{ "Sapper", 20 },
{ "SapperG", 5 },
{ "SapperB", 5 }
};
};
class TrashSmall : Default
{