diff --git a/CREDITS.txt b/CREDITS.txt
new file mode 100644
index 000000000..0b2b9ee58
--- /dev/null
+++ b/CREDITS.txt
@@ -0,0 +1,29 @@
+=== Epoch Mod Credits ===
+The entire Epoch Mod Team wants to thank all those that have helped along the way!
+
+== Contributors ==
+Poul Andersen - Poulmba - Wiki Editor - https://www.youtube.com/user/poulmba
+Tobias Solem - - Tester / Server Host - http://whatthepoch.com/
+More TBA
+
+== Top Donators to EpochMod.com ==
+GTXGAMING
+SurvivalServers.com
+dean4310
+Robio
+rhinoCRUNCH
+B3nzi
+Madman2077
+Axle
+orangesherbet
+
+== Active GSP Supporters ==
+GTXGaming - Dedicated Server - http://www.gtxgaming.co.uk
+Survival Servers - Dedicated Server - https://www.survivalservers.com
+Vilayer - Dedicated Server - https://www.vilayer.com
+Nitrado - Dedicated Server - https://server.nitrado.net
+Vert Hosting - Shared Arma 2 and 3 servers - https://verthosting.com
+
+== Past GSP Supporters ==
+Gportal - Dedicated Server - https://www.g-portal.com
+Arctic Servers - Shared Arma 3 server - http://arcticservers.co.uk
diff --git a/Changelogs/0.3.5.0.txt b/Changelogs/0.3.5.0.txt
new file mode 100644
index 000000000..5b58d9040
--- /dev/null
+++ b/Changelogs/0.3.5.0.txt
@@ -0,0 +1,34 @@
+**Client**
+[Added] Metal Floors as upgrade in-place option for wood floors.
+[Added] Gender selection screen improvements.
+[Added] New interaction system.
+[Added] Persistent wood and metal spike traps.
+[Added] New custom 3x wide hesco type barrier.
+[Added] New custom tank trap.
+[Added] Updated version of the Fishing Rod. Reel was to small.
+[Changed] Made wood ramp shorter by about 30% and slightly reduced height of wood towers and stairs.
+[Changed] Refine ghost preview base building snap checks.
+[Changed] Players now start with a Quartz radio by default.
+[Changed] Overhaul of secure storage system to make it faster.
+[Fixed] Selection ring now correctly shows damage/decay level of target when build mode is disabled.
+[Fixed] Was unable to use cursorTarget underwater, fixed using new custom made function.
+[Fixed] NPC item trades that cannot fit in the players inventory will be placed at the feet of the player.
+[Fixed] Not loosing Stamina while swimming.
+[Fixed] Removed extra roadway on top of columns.
+[Fixed] Error Zero divisor in client side master loop.
+[Fixed] .rpt error after gutting animal.
+
+**Server**
+[Added] Documentation on server core framework functions and hive calls.
+[Added] muzzle_snds_338_sand to loot and pricing tables.
+[Added] Client side master loop is now fully config (CfgMasterLoop) based.
+[Added] Ability to fully change default player loadouts via CfgEpochServer configs:
+(defaultGoggles, defaultHeadgear, defaultBackpack, defaultVestFemale, defaultVestMale, defaultUniformFemale, defaultUniformMale, itemsInContainers, weaponsInContainers, normalMagazines, weaponsAndItems)
+[Changed] Increased reverse token check timeout from 90 to 180 seconds.
+[Fixed] Dynamic traders did not correctly track the stored vehicle count and limits.
+[Fixed] Force trader data save to save when loading starter items.
+[Fixed] Added private array to all Epoch Event scripts due to feedback.
+[Fixed] Removed forced weather sync on server startup from server init phase so weather changes are now solely dependent on Epoch Events weather script.
+[Fixed] EPOCH_fnc_returnConfigEntry and V2 functions did not use defaults properly.
+[Info] Server pack Tools folder now contains InstalEpoch.cmd that is an updated version of the command line download Epoch client files download script for steam workshop.
+[Info] Removed old .bikey and added new one for 0350.
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 000000000..e3d82bb71
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,2 @@
+Arma 3: Epoch Mod is licensed under:
+http://creativecommons.org/licenses/by-nc-nd/4.0/
\ No newline at end of file
diff --git a/Server_Install_Pack/@epochhive/README.md b/Server_Install_Pack/@epochhive/README.md
new file mode 100644
index 000000000..776610ac5
--- /dev/null
+++ b/Server_Install_Pack/@epochhive/README.md
@@ -0,0 +1,658 @@
+**A3 Epoch Hive Calls**
+
+Full A3 epoch server hive call documentation
+
+**000**
+
+Get and return Instance ID from config
+
+_Input: None_
+
+_Returns: [ARRAY](https://community.bistudio.com/wiki/Array) format: ["NA123"]_
+
+
+```
+"epochserver" callExtension "000";
+```
+
+
+**001**
+
+STEAMAPI - Vac ban check
+
+_Input: [SteamID64](https://community.bistudio.com/wiki/getPlayerUID)_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["001|%1", _uid];
+```
+
+
+**100**
+
+Setter - Temporarily stack, workaround for Arma 8k character limitation. Used in combination with the SET or SETEX calls.
+
+
+
+_Uses: SET_
+
+_Call Type: Synchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Call Index ID, Value_
+
+_Returns: Nothing_
+
+
+
+```
+"epochserver" callExtension format["100|%1:%2|%3|%4", 100, _prefix, _key, _hiveCallID, _value];
+```
+
+
+**101**
+
+
+Setter - Temporarily stack, workaround for Arma 8k character limitation. Used in combination with the SET or SETEX calls.
+
+
+_Uses: SET_
+
+_Call Type: Asynchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Call Index ID, Value_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["100|%1:%2|%3|%4", 101, _prefix, _key, _hiveCallID, _value];
+```
+
+
+**110**
+
+Store value in database with the specified key
+
+
+_Uses: SET_
+
+_Call Type: Synchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Call Index ID, Value_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["110|%1:%2|%3|%4", _prefix, _key, _hiveCallID, _value];
+```
+
+
+**111**
+
+
+Store value in database with the specified key
+
+
+_Uses: SET_
+
+_Call Type: Asynchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Call Index ID, Value_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["111|%1:%2|%3|%4", _prefix, _key, _hiveCallID, _value];
+```
+
+
+**120**
+
+
+_Uses: SETEX_
+
+_Call Type: Asynchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Expires, Call Index ID, Value_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["120|%1:%2|%3|%4|%5", _prefix, _key, _expires, _hiveCallID, _value];
+```
+
+
+**121**
+
+
+Store value in database with the specified key and expiration.
+
+
+_Uses: SETEX_
+
+_Call Type: Asynchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Expires, Call Index ID, Value_
+
+_Returns: Nothing_
+
+```
+"epochserver" callExtension format["121|%1:%2|%3|%4|%5", _prefix, _key, _expires, _hiveCallID, _value];
+```
+
+
+**130**
+
+
+Set a timeout on key. After the timeout has expired, the key will automatically be deleted.
+
+
+_Uses: [EXPIRE](http://redis.io/commands/expire)_
+
+_Call Type: Synchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Expires_
+
+_Returns: Nothing_
+
+```
+"epochserver" callExtension format ["130|%1:%2|%3", _prefix, _key, _expires];
+```
+
+**131**
+
+
+Set a timeout on key. After the timeout has expired, the key will automatically be deleted.
+
+
+
+_Uses: [EXPIRE](http://redis.io/commands/expire)_
+
+_Call Type: Asynchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Expires_
+
+_Returns: Nothing_
+
+```
+"epochserver" callExtension format ["130|%1:%2|%3", _prefix, _key, _expires];
+```
+
+
+**140**
+
+Sets or clears the bit at offset in the string value stored at key.
+
+
+
+_Uses: [SETBIT](http://redis.io/commands/setbit)_
+
+_Call Type: Synchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Bit Index, Value_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["140|%1:%2|%3|%4", _prefix, _key, _bitIndex, _value];
+```
+
+
+**141**
+
+
+Sets or clears the bit at offset in the string value stored at key.
+
+
+_Uses: [SETBIT](http://redis.io/commands/setbit)_
+
+_Call Type: Asynchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Bit Index, Value_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["141|%1:%2|%3|%4", _prefix, _key, _bitIndex, _value];
+```
+
+
+**200**
+
+_Uses: GET_
+
+_Call Type: Synchronous_
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Bit Index, Value_
+
+_Returns: _Array
+
+
+```
+_hiveResponse = "epochserver" callExtension format ["200|%1:%2", _prefix, _key];
+```
+
+
+**210**
+
+
+_Uses: GET, TLL_
+
+
+_Call Type: Synchronous_
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Bit Index, Value_
+
+_Returns: Array_
+
+```
+_hiveResponse = "epochserver" callExtension format ["210|%1:%2", _prefix, _key];
+```
+
+
+**220**
+
+
+_Uses: GETRANGE_
+
+
+_Call Type: Synchronous_
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Start Index, Stop Index_
+
+_Returns: Array_
+
+```
+_hiveResponse = "epochserver" callExtension format["220|%1:%2|%3|%4", _prefix, _key, _currentIndex, (_currentIndexMax-1)];
+```
+
+
+**230**
+
+_Uses: GETBIT_
+
+_Call Type: Synchronous_
+
+_Input: [Key](http://redis.io/topics/data-types-intro), Bit Index, Value (0-1)_
+
+_Returns: BOOL_
+
+
+```
+_hiveResponse = "epochserver" callExtension format["240|%1:%2|%3", _prefix, _key, _value];
+```
+
+
+
+**300**
+
+
+
+_Uses: [TTL](http://redis.io/commands/ttl)_
+
+
+
+_Call Type: Synchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro)_
+
+_Returns: TTL in seconds_
+
+
+```
+"epochserver" callExtension format["300|%1:%2", _prefix, _uniqueID];
+```
+
+
+**400**
+
+Removes the specified key.
+
+_Uses: [DEL](http://redis.io/commands/del)_
+
+_Call Type: Synchronous_
+
+
+
+_Input: [Key](http://redis.io/topics/data-types-intro)_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["400|%1:%2", _prefix, _uniqueID];
+```
+
+
+**500**
+
+_Uses: [PING](http://redis.io/commands/ping)_
+
+_Call Type: Synchronous_
+
+_Input: Nothing_
+
+_Returns: "PONG"_
+
+```
+'epochserver' callExtension '500'
+```
+
+
+
+**501**
+
+Get current time.
+
+
+
+_Call Type: Synchronous_
+
+_Input: Nothing_
+
+_Returns: Array [YYYY,MM,DD,HH,MM,SS]_
+
+
+```
+'epochserver' callExtension '510'
+```
+
+
+**600**
+
+Used to push data from database server in a queue.
+
+_Uses: [LPOP](http://redis.io/commands/lpop) with CMD- prefix_
+
+
+
+_Call Type: Synchronous_
+
+_Input: Server InstanceID_
+
+_Returns: Array [1,""]_
+
+
+```
+_response = "epochserver" callExtension format["600|%1",_instanceID];
+```
+
+
+**700**
+
+Log in Redis
+
+
+
+_Uses: LPUSH _with -LOG postfix
+
+
+
+_Call Type: Synchronous_
+
+_Input: Key Prefix, Message_
+
+_Returns: Nothing_
+
+
+```
+"epochserver" callExtension format["700|%1|%2", _prefix, _message];
+```
+
+
+**701**
+
+Log in Redis
+
+
+
+_Uses: LPUSH _with -LOG postfix
+
+
+
+_Call Type: Synchronous_
+
+_Input: Key Prefix, Message_
+
+_Returns: Nothing_
+
+
+
+```
+"epochserver" callExtension format["701|%1|%2", _prefix, _message];
+```
+
+
+**800**
+
+
+
+Append strings specified to end of first line of publicvariable.txt and then runs BE command #loadEvents.
+
+
+
+_Call Type: Synchronous_
+
+_Input: Strings_
+
+_Returns: Nothing_
+
+
+
+```
+"epochserver" callExtension format["800|%1|%2|%3|%4", _var1, _var2, _var3, _var4];
+```
+
+
+**801**
+
+Append strings specified to end of first line of publicvariable.txt and then runs BE command #loadEvents.
+
+
+
+_Call Type: Asynchronous_
+
+_Input: Strings_
+
+_Returns: Nothing_
+
+
+
+```
+"epochserver" callExtension format["800|%1|%2|%3|%4", _var1, _var2, _var3, _var4];
+```
+
+**810**
+
+Get random string, [a-zA-Z]{5-10}, if only one string is requested it will return a string instead of a array
+
+
+
+_Call Type: Synchronous_
+
+_Input: Count_
+
+_Returns: Array or String_
+
+
+
+
+
+```
+_response = 'epochserver' callExtension format['810|%1',_count];
+```
+
+
+
+**820**
+
+Add ban to bans.txt and execute #loadBans (Depreciated should use 900 calls)
+
+
+
+_Call Type: Synchronous_
+
+_Input: Steam64ID, Reason_
+
+_Returns: Nothing_
+
+
+
+```
+'epochserver' callExtension format['820|%1|%2',getPlayerUID _playerObj,_reason];
+```
+
+**821**
+
+Add ban to bans.txt and execute #loadBans (Depreciated should use 900 calls)
+
+
+
+_Call Type: Synchronous_
+
+_Input: Steam64ID, Reason_
+
+_Returns: Nothing_
+
+
+
+```
+epochserver' callExtension format['821|%1|%2',getPlayerUID _playerObj,_reason];
+```
+
+
+**901**
+
+Broadcast message to server
+
+_Call Type: Asynchronous_
+
+_Input: Message_
+
+_Returns: Nothing_
+
+```
+'epochserver' callExtension format['901|%1', _message];
+```
+
+
+**911**
+
+Kick with message
+
+
+
+_Call Type: Asynchronous_
+
+_Input: player64ID, Message_
+
+_Returns: Nothing_
+
+
+
+```
+'epochserver' callExtension format['911|%1|%2', _playerUID, _reason];
+```
+
+
+
+**921**
+
+Ban with message and duration
+
+
+
+_Call Type: Asynchronous_
+
+_Input: player64ID, Message, duration_
+
+_Returns: Nothing_
+
+
+```
+'epochserver' callExtension format['921|%1|%2|%3', _playerUID, _message, _duration];
+```
+
+
+**930**
+
+Unlock server using BE command #unlock
+
+
+
+_Call Type: Asynchronous_
+
+_Input: Nothing_
+
+_Returns: Nothing_
+
+
+
+```
+'epochserver' callExtension '930'
+```
+
+**931**
+
+Lock server using BE command #lock
+
+
+
+_Call Type: Asynchronous_
+
+_Input: Nothing_
+
+_Returns: Nothing_
+
+
+```
+'epochserver' callExtension '931'
+```
+
+
+**991**
+
+Shutdown Server using BE #shutdown command.
+
+_Call Type: Asynchronous_
+
+_Input: Nothing_
+
+_Returns: Nothing_
+
+
+
+```
+'epochserver' callExtension '991'
+```
diff --git a/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo b/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo
index dade80077..efb12f426 100644
Binary files a/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo and b/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo differ
diff --git a/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo b/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo
index 7e5ed9f9e..7761ce66c 100644
Binary files a/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo and b/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo differ
diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo
index a58760415..cd6da19cf 100644
Binary files a/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo and b/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo differ
diff --git a/Server_Install_Pack/@epochhive/epochah.hpp b/Server_Install_Pack/@epochhive/epochah.hpp
index baeb44583..38ed95cfb 100644
--- a/Server_Install_Pack/@epochhive/epochah.hpp
+++ b/Server_Install_Pack/@epochhive/epochah.hpp
@@ -3,7 +3,7 @@ antihack_Enabled = true; // built-in Anti-Hack
antihack_cfgPatchesCheck = true; // cfgPatches (AddOn Check)
antihack_PVSPrefix = "EPAH_"; // used to help whitelist pveh variables in BE without BEC and watchdog, leave blank to use no prefix.
antihack_cfgPatchesCfg[] = {0}; // 0 == BAN - 1 = LOG
-antihack_ahInitAuthCfg[] = {0,90}; // 0 == BAN - 1 = LOG, 60 = ban or log if anti hack is not started in 90 seconds
+antihack_ahInitAuthCfg[] = {0,180}; // 0 == BAN - 1 = LOG, 60 = ban or log if anti hack is not started in 180 seconds
antihack_whitelistedCfgPatches[] = {"A3_AIR_F_RTD","AiA_Worlds_Author","AiA_Worlds_Grid","AiA_BaseConfig_F","AiA_A1AlwaysDummy","CAVideo2_PMC","CA_AnimsHotfix","CA_CutSceneAnims","CAIntroAnims","CAUSMCD","CAVoice","CAweapons3_aks74pso","CAWeapons3_ammocrates","CAweapons3_ksvk","CAweapons3_m107","CAweapons3_m16a4_acg_gl","CAweapons3_m16a4_acg","CAweapons3_m16a4_gl","CAweapons3_m16a4","CAWeapons3","CTI_buildingsBmp2_hq","CTI_buildingsM113_hq","DSHkM_Mini","M2HD_Mini","MK19_Tripod","Warfare","WarfareBuildings_Stinger_Twice_static","WarfareBuildings_T72_RACS","WarfareBuildings_TOW_Tripod","AiA_cba_xeh_a2_Dummy","AiA_CBA_A2_xeh_Dummy","AiA_cba_xeh_oa_Dummy","AiA_CBA_OA_xeh_Dummy","AiA_CA_Data","AiA_A10_Data","AiA_Afghan_Data","AiA_Air2_Data","AiA_Air3_Data","AiA_Air_Data","AiA_Air_e_Data","AiA_Animations_Data","AiA_Animations_Config","AiA_Bohemia_Data","AiA_Bootcamp_acr_Data","AiA_Buildings2_Data","AiA_Buildings2_Ind_Cementworks_Data","AiA_Buildings_Data","AiA_Ca_acr_Data","AiA_CA_Config","CAData","AiA_CA_Config_Data_ParticleEffects","CAData_ParticleEffects","AiA_Ca_e_Data","AiA_Ca_pmc_Data","AiA_Characters2_Data","AiA_Chernarus_Data","AiA_Chernarus_Data_Data","AiA_Chernarus_Data_Layers_Data","AiA_Chernarus_Summer_Data","AiA_Cti_buildings_Data","AiA_CA_Data_Data_ParticleEffects","AiA_Data_baf_Data","AiA_Desert2_Data","Desert2_Objects","AiA_Desert_Data","AiA_Desert_e_Data","AiA_Hotfix_Data","AiA_Introanims_Data","CALanguage","AiA_Language_acr_Data","AiA_Language_baf_Data","AiA_Language_e_Data","AiA_Language_pmc_Data","CALanguage_missions","AiA_Languagemissions_acr_Data","AiA_Languagemissions_baf_Data","CALanguage_missions_e","AiA_Languagemissions_pmc_Data","AiA_Misc2_Data","AiA_Misc3_Data","AiA_Misc_Data","AiA_Misc_acr_Data","AiA_Misc_e_Data","AiA_Plants2_Bush_Data","AiA_Plants2_Clutter_Data","AiA_Plants2_Misc_Data","AiA_Plants2_Plant_Data","AiA_Plants2_Tree_Data","AiA_Plants_Data","AiA_Plants_Config","CAPlants","AiA_Plants_e2_Data","AiA_Plants_e_Data","AiA_Plants_pmc_Data","AiA_Provinggrounds_pmc_Data","AiA_Roads2_Data","AiA_Roads2_Config","CARoads2","CARoads2Bridge","CARoads2Dam","AiA_Roads_Data","AiA_Roads_Config","CARoads","AiA_Roads_e_Data","AiA_Roads_pmc_Data","AiA_Roads_pmc_Config","CARoads_PMC_Bridge","AiA_Rocks2_Data","AiA_Rocks2_Config","CARocks2","AiA_Rocks_Data","AiA_Rocks_Config","CARocks","AiA_Rocks_e_Data","AiA_Sara_Data","AiA_Saralite_Data","AiA_Shapur_baf_Data","AiA_Signs2_Data","AiA_Signs2_Config","CASigns2","AiA_Signs_Data","AiA_Signs_Config","CASigns","AiA_Signs_e_Data","AiA_Sounds_Data","AiA_Sounds_Config","CASounds","AiA_Sounds_e_Data","AiA_Structures_Data","pond_test","AiA_Structures_e_Data","AiA_Structures_pmc_Data","AiA_Takistan_Data","AiA_Takistan_Data_Data","AiA_Takistan_Data_Layers_Data","AiA_Tracked2_Data","AiA_Tracked_Data","AiA_Tracked_e_Data","AiA_Ui_Data","AiA_Utes_Data","AiA_Utes_Config","Utes","AiA_Water2_Data","CAWater2_LHD","AiA_Water_Data","AiA_Weapons2_Data","AiA_Weapons_Data","AiA_Weapons_e_Data","AiA_Weapons_pmc_Data","AiA_Wheeled2_Data","AiA_Wheeled_Data","AiA_Wheeled_e_Data","AiA_Zargabad_Data","AiA_Models_DBE1_Data","Music_DBE1","ploty_DBE1","Roads_DBE1","AiA_Sara_dbe1_Data","Disable_XEH_Logging","AiA_TKOH_Dummy","HSim_Data_H","HSim_Data_H_data_ParticleEffects","HSim_Data_H_data_ParticleEffects_rotor_blades","HSim_Dubbing_H","HSim_DubbingRadio_H","HSim_Editor_H","Intro_Island_H","HSim_Missions_H","HSim_ModulesCore_H","HSim_ModulesCore_H_AmbientCombat","HSim_ModulesCore_H_DynO","HSim_ModulesCore_H_Functions","HSim_ModulesCore_H_GarbageCollector","HSim_ModulesCore_H_Functions_E","HSim_ModulesCore_H_OO","HSim_ModulesCore_H_Functions_PMC","HSim_Music_H","HSim_Sounds_H","South_Asia_H","HSim_UIFonts_H","United_States_H","HSim_Animals_H","HSim_Animals_H_Anim_Config","HSim_Animals_H_Dog","HSim_Characters_H_Faces","HSim_Characters_H_Heads","HSim_Modules_H","HSim_UI_H","HSim_Weapons_H","HSim_Weapons_H_AK47","HSim_Weapons_H_DShKM","HSim_Weapons_H_Glock","HSim_Weapons_H_HandItems","HSim_Weapons_H_M16","HSim_Weapons_US_H","HSim_Characters_H","HSim_Characters_US_H","HSim_Missions_H_FreeFlight","HSim_Functions_Base_H","HSim_Water_H","HSim_Water_H_Civ_FishingBoat_Large","HSim_Water_H_Civ_Jetboat","HSim_Water_H_Civ_Yacht","HSim_Water_H_Container_Ship","HSim_Water_H_Cruise_Ship","HSim_Water_H_Destroyer","HSim_Water_H_Fishing_Boat","HSim_Water_H_Fregata","HSim_Water_H_LHD","HSim_Water_H_Oil_tanker","HSim_Water_H_Rubber_Boat","HSim_Water_H_Whales","HSim_Water_H_Whales_GreyWhale","HSim_Water_H_Whales_Whale1","HSim_Weapons_H_IGLA","HSim_Weapons_US_H_M2","HSim_Wheeled_H","HSim_Wheeled_H_Ambulance","HSim_Wheeled_H_FireTruck","HSim_Wheeled_H_Hatchback","HSim_Wheeled_H_Military_Offroad_LR","HSim_Wheeled_H_Military_Pickup_DSHKM","HSim_Wheeled_H_Offroad","HSim_Wheeled_H_Police_Car","HSim_Wheeled_H_TowingTractor","HSim_Wheeled_H_Tractor","HSim_Wheeled_H_Trailers","HSim_Wheeled_H_Truck_Light_Transport","HSim_Wheeled_H_Ural","HSim_Wheeled_H_Van_Passenger","HSim_Wheeled_US_H","HSim_Wheeled_US_H_Military_Offroad","HSim_Wheeled_US_H_Military_Truck","HSim_Wheeled_US_H_Pickup_01","HSim_Wheeled_US_H_Pickup_02","HSim_Wheeled_US_H_SUV","HSim_Wheeled_US_H_Truck_US_Type","HSim_Air_H","HSim_Air_H_Aircraft_A","HSim_Air_H_Aircraft_C","HSim_Air_H_Aircraft_D","HSim_Air_H_Aircraft_E_H","HSim_Air_H_Airliner_A","HSim_Air_H_Airliner_B","HSim_Air_H_Parachute","HSim_Air_US_H","HSim_Air_US_H_Helicopters_Heavy","HSim_Air_US_H_Helicopters_Light","HSim_Air_US_H_Helicopters_Medium","HSim_Misc_H","HSim_Misc_H_Antena","HSim_Misc_H_Barels","HSim_Misc_H_Bleacher","HSim_Misc_H_BoardsPack","HSim_Misc_H_CncBlock","HSim_Misc_H_Doghouse","HSim_Misc_H_Engine_Crane","HSim_Misc_H_Fence","HSim_Misc_H_Fire_Extinguisher","HSim_Misc_H_Fire_Suppression","HSim_Misc_H_First_Aid","HSim_Misc_H_Flagpole","HSim_Misc_H_Folding_Ladder","HSim_Misc_H_FuelCan","HSim_Misc_H_Heliport_Furniture","HSim_Misc_H_Helicopter_Parts","HSim_Misc_H_Helipads","HSim_Misc_H_Heliport_Objects","HSim_Misc_H_Helpers","HSim_Misc_H_Info_Board","HSim_Misc_H_Infostands","HSim_Misc_H_Inspection_Visuals","HSim_Misc_H_Interior","HSim_Misc_H_Loudspeakers","HSim_Misc_H_Market","HSim_Misc_H_Office_Objects","HSim_Misc_H_Perimeter_Ligh","HSim_Misc_H_Pike","HSim_Misc_H_Platform_Cart","HSim_Misc_H_Portable_Generator","HSim_Misc_H_Props","HSim_Misc_H_SawHorse","HSim_Misc_H_Shooting_Range","HSim_Misc_H_Signs","HSim_Misc_H_Sink","HSim_Misc_H_Targets","HSim_Misc_H_Tent","HSim_Misc_H_Toilet","HSim_Misc_H_Tools","HSim_Misc_H_Tools_Racking","HSim_Misc_H_Trash","HSim_Misc_H_Weather_Station","HSim_Misc_H_Weld_Gastank","HSim_Misc_H_Wheel_Chocks","HSim_Misc_H_Wheeled_Scaffolding","HSim_Misc_H_wheeled_tool_cart","HSim_Misc_H_Wheeled_Whiteboard","HSim_Misc_H_Winch","HSim_Misc_H_Windsock","HSim_Misc_H_Workbench","HSim_Misc_H_Wrecks","HSim_Structures_H","HSim_Structures_H_Airport_Papi","HSim_Structures_H_Harbour","HSim_Structures_H_Heliports_Heliport_Big","HSim_Structures_H_Heliports_Heliport_Small","HSim_Structures_H_Industrial_A_CraneCon","HSim_Structures_H_Industrial_Rooftop_Objects","HSim_Structures_US_H","HSim_Structures_US_H_Bld_US","HSim_Structures_US_H_Landmarks_Space_Needle","HSim_Tracked_H","HSim_Tracked_H_BMP2","HSim_Tracked_US_H","HSim_Tracked_US_H_M1A2","HSim_Tracked_US_H_MLRS","HSim_Data_H_EditorGroups","HSim_Anims_H","HSim_Anims_H_config_sdr","HSim_Anims_H_config_wmn","Hsim_Language_H","Hsim_Language_missions_H","AiA_StandaloneTerrainPack_Dummy","CA_ACR","CA_Animals2_Anim_Config","CA_Anims_Char","CA_Anims_E_Wmn","CA_E","CA_PMC","CAAir","CACharacters","CATracked","CAUI","CAWater","CAWater2","CAWater2_seafox","CAWeapons","CAWeapons_Warfare_weapons","CAWheeled","CAWheeled_E","CAWheeled2","6G30_DBE1","Arma2_Ka52","BI_SRRS","CA_AH64D","CA_AIR_E_MQ9PredatorB","CA_AIR_E_Su25","CA_AIR2_Su25","CA_Animals_E","CA_Animals2","CA_Animals2_Chicken","CA_Animals2_Cow","CA_Animals2_Dogs","CA_Animals2_Dogs_Fin","CA_Animals2_Dogs_Pastor","CA_Animals2_Goat","CA_Animals2_Rabbit","CA_Animals2_Sheep","CA_Animals2_WildBoar","CA_Anims","CA_Anims_E","CA_Anims_E_Sdr","CA_Anims_Sdr","CA_Anims_Wmn","CA_CommunityConfigurationProject_E","CA_CruiseMissile","CA_Dubbing","CA_Dubbing_Baf","CA_Dubbing_Counterattack","CA_Dubbing_E","CA_Dubbing_PMC","CA_DubbingRadio_E","CA_DubbingRadio_PMC","CA_E_ParticleEffects","CA_Editor","CA_HC_Sounds","CA_Heads","CA_HighCommand","CA_L39","CA_Missions","CA_Missions_AlternativeInjurySimulation","CA_Missions_AmbientCombat","CA_Missions_Armory1","CA_Missions_Armory2","CA_Missions_BAF","CA_Missions_BAF_2","CA_Missions_BAF_Templates_SecOps","CA_Missions_BattlefieldClearance","CA_Missions_E","CA_Missions_E_Armory2","CA_Missions_E_SecOps","CA_Missions_E_Templates_SecOps","CA_Missions_FirstAidSystem","CA_Missions_GarbageCollector","CA_Missions_PMC","CA_Missions_SecOps","CA_Missions_Templates_SecOps","CA_Missions2_PMC","CA_Modules","CA_Modules_Alice","CA_Modules_Animals","CA_Modules_ARTY","CA_Modules_clouds","CA_Modules_Coin","CA_Modules_DynO","CA_Modules_E","CA_Modules_E_DynO","CA_Modules_E_Jukebox","CA_Modules_E_OO","CA_Modules_E_UAV","CA_Modules_E_UAV_Heli","CA_Modules_E_Weather","CA_Modules_Functions","CA_Modules_Marta","CA_Modules_PMC","CA_Modules_PMC_SimpleFIrstAid","CA_Modules_Silvie","CA_Modules_StratLayer","CA_Modules_UAV","CA_Modules_ZoRA","CA_MPA","CA_MPA_Challenges","CA_MPA_Core","CA_MPA_MP","CA_MPA_Scenarios","CA_Sounds_Baf","CA_SoundsMissions_E","CA_Support","CAA10","CAAir_BAF","CAAir_BAF_CH_47F","CAAir_E","CAAir_E_A10","CAAir_E_AH64D","CAAir_E_AH6J","CAAir_E_An2","CAAir_E_C130J","CAAir_E_CH_47F","CAAir_E_Halo","CAAir_E_Mi24","CAAir_E_MI8","CAAir_E_UH1H_EP1","CAAir_E_UH60M","CAAir_PMC","CAAir_PMC_KA137","CAAir_PMC_KA60","CAAir2","CAAir2_C130J","CAAir2_ChukarTarget","CAAir2_F35B","CAAir2_MQ9PredatorB","CAAir2_MV22","CAAir2_Pchela1T","CAAir2_UH1Y","CAAir3","CAAir3_Su34","CAAnimals","CACharacters_BAF","CACharacters_BAF_Head","CACharacters_E","CACharacters_E_Head","CACharacters_PMC","CACharacters_PMC_Head","CACharacters_W_BAF","CACharacters2","CAFonts","CAMisc_fix","CAMisc_fix_A2FREE","CAMisc_fix_air","CAMisc_fix_Ch2","CAMisc_fix_Str","CAMisc_fix_Weap","CAMP_Armory_Misc","CAMP_Armory_Misc_Concrete_Wall","CAMP_Armory_Misc_Entrance_Gate","CAMP_Armory_Misc_Info_Board","CAMP_Armory_Misc_Infostands","CAMP_Armory_Misc_Laptop","CAMP_Armory_Misc_Loudspeakers","CAMP_Armory_Misc_Plasticpole","CAMP_Armory_Misc_Red_Light","CAMP_Armory_Misc_Sign_Armex","CAMP_Armory_Misc_Sign_Direction","CAMusic","CAMusic_E","CAMusic_PMC","CASounds_E","CASounds_Missions","CATracked_BAF","CATracked_E","CATracked_E_BMP2","CATracked_E_M1_Abrams","CATracked_E_M113","CATracked_E_M2A2_Bradley","CATracked_E_T34","CATracked_E_T55","CATracked_E_T72","CATracked_E_us_m270mlrs","CATracked_E_ZSU","CATracked_W_BAF","CATracked2","CATracked2_2S6M_Tunguska","CATracked2_AAV","CATracked2_BMP3","CATracked2_T34","CATracked2_T90","CATracked2_us_m270mlrs","CAWater2_Destroyer","CAWater2_fishing_boat","CAWater2_Fregata","CAWater2_smallboat_1","CAWeapons_2b14_82mm_Mortar","CAWeapons_AK","CAWeapons_AmmoBoxes","CAWeapons_BAF","CAWeapons_bizon","CAWeapons_Colt1911","CAWeapons_DMR","CAWeapons_E","CAWeapons_E_AGS","CAWeapons_E_AK","CAWeapons_E_AmmoBoxes","CAWeapons_E_Colt1911","CAWeapons_E_D30","CAWeapons_E_DSHKM","CAWeapons_E_FIM92_static","CAWeapons_E_fnfal","CAWeapons_E_G36","CAWeapons_E_GrenadeLauncher","CAWeapons_E_Igla","CAWeapons_E_Javelin","CAWeapons_E_KORD","CAWeapons_E_ksvk","CAWeapons_E_LeeEnfield","CAweapons_E_m107","CAWeapons_E_M110","CAWeapons_E_M119_Howitzer","CAWeapons_E_M136","CAWeapons_E_M14","CAWeapons_E_M16","CAWeapons_E_M240","CAWeapons_E_M252_81mm_Mortar","CAWeapons_E_M2StaticMG","CAWeapons_E_M47","CAWeapons_E_M9","CAWeapons_E_MAAWS","CAWeapons_E_Makarov","CAWeapons_E_Metis","CAWeapons_E_Mk19_MiniTriPod","CAWeapons_E_PK","CAWeapons_E_Podnos_2b14_82mm","CAWeapons_E_RPG18","CAWeapons_E_RPG7","CAWeapons_E_scar","CAWeapons_E_Searchlight","CAWeapons_E_SPG9","CAWeapons_E_STATIC","CAWeapons_E_Stinger","CAWeapons_E_Strela","CAWeapons_E_TOW","CAWeapons_E_ZU23","CAWeapons_Kord","CAweapons_ksvk","CAWeapons_M1014","CAweapons_m107","CAWeapons_M252_81mm_Mortar","CAWeapons_Metis_AT_13","CAWeapons_PMC","CAWeapons_PMC_AA_12","CAWeapons_PMC_AS50","CAWeapons_PMC_XM8","CAWeapons_Saiga12K","CAWeapons_SPG9","CAWeapons_VSS_vintorez","CAWeapons_ZU23","CAWeapons2","CAWeapons2_HuntingRifle","CAWeapons2_RPG18","CAWeapons2_SMAW","CAWheeled_D_BAF","CAWheeled_E_ATV","CAWheeled_E_BRDM2","CAWheeled_E_BTR40","CAWheeled_E_BTR60","CAWheeled_E_HMMWV","CAWheeled_E_Ikarus","CAWheeled_E_LADA","CAWheeled_E_LandRover","CAWheeled_E_M1030","CAWheeled_E_MTVR","CAWheeled_E_Offroad","CAWheeled_E_Old_bike","CAWheeled_E_Old_moto","CAWheeled_E_Pickup","CAWheeled_E_s1203","CAWheeled_E_SCUD","CAWheeled_E_stryker","CAWheeled_E_SUV","CAWheeled_E_TT650","CAWheeled_E_UAZ","CAWheeled_E_Ural","CAWheeled_E_V3S","CAWheeled_E_Volha","CAWheeled_Offroad","CAWheeled_Pickup","CAWheeled_PMC","CAWheeled_PMC_ArmoredSUV","CAWheeled_W_BAF","CAWheeled2_BTR90","CAWheeled2_GAZ39371","CAWheeled2_HMMWV_Ambulance","CAWheeled2_HMMWV_BASE","CAWheeled2_Ikarus","CAWheeled2_Kamaz","CAWheeled2_LADA","CAWheeled2_LAV25","CAWheeled2_M1114_Armored","CAWheeled2_M998A2_Avenger","CAWheeled2_MMT","CAWheeled2_MTVR","CAWheeled2_TowingTractor","CAWheeled2_V3S","CAWheeled2_VWGolf","CAWheeled3","CAWheeled3_M1030","CAWheeled3_TT650","Datsun_armed_DBE1","DBE1","DBE1_UI","DC3_DBE1","HALO_Test","Hilux_armed_DBE1","Warfare2","Warfare2_E","Warfare2Vehicles","AiA_Buildings_Config","CABuildings","CABuildings_Misc","Desert2_Buildings","CA_desert2_Characters","DBE1_Hotfix","AiA_Language_acr_Config","CALanguage_ACR","AiA_Language_e_Config","CALanguage_e","AiA_Language_pmc_Config","CALanguage_PMC","AiA_Languagemissions_acr_Config","CALanguage_missions_ACR","AiA_Languagemissions_pmc_Config","CALanguage_missions_PMC","AiA_Misc_Config","CAMisc","CAWater2_seafox_EP1","AiA_Roads_e_Config","CARoads_E","AiA_Rocks_e_Config","CARocks_E","AiA_Sara_Config","Sara","AiA_Saralite_Config","SaraLite","AiA_Structures_Config","CAStructures","CAStructures_A_BuildingWIP","CAStructures_A_CraneCon","CAStructuresLand_A_MunicipalOffice","CAStructuresBarn_W","CAStructures_Castle","CAStructuresHouse","CAStructuresHouse_A_FuelStation","CAStructuresHouse_A_Hospital","CAStructuresHouse_A_Office01","CAStructuresHouse_A_Office02","CAStructuresHouse_a_stationhouse","CAStructuresHouse_Church_02","CAStructuresHouse_Church_03","CAStructuresHouse_Church_05R","CAStructuresHouse_HouseBT","CAStructuresHouse_HouseV2","CAStructuresHouse_HouseV","CAStructuresLand_Ind_Stack_Big","CAStructures_IndPipe1","CAStructuresInd_Quarry","Ind_SawMill","CAStructures_Mil","CAStructures_Misc","CAStructures_Misc_Armory","CAStructures_Misc_Armory_Armor_Popuptarget","CAStructures_Misc_Powerlines","CAStructures_Nav","CAStructuresLand_Nav_Boathouse","CAStructures_Proxy_BuildingParts","CAStructures_Proxy_Ruins","CAStructures_Rail","CAStructuresHouse_rail_station_big","CAStructures_Ruins","CAStructuresShed_Small","CAStructuresHouse_Shed_Ind","CAStructures_Wall","AiA_Models_DBE1_Config","Models_DBE1","Anims_DBE1","HMMWV_DBE1","Kamenolom_DBE1","Mercenary_DBE1","Misc_DBE1","NPCs_DBE1","Pila_DBE1","Prisoners_DBE1","UH60Desert","UI_DBE1","Vysilac_DBE1","Zakladna_DBE1","AiA_Sara_dbe1_Config","Sara_dbe1","AiA_Buildings2_Config","CABuildings2","A_Crane_02","A_GeneralStore_01","CABuildings2_A_Pub","A_statue","Barn_Metal","CABuildingParts","CABuildingParts_Signs","CATEC","Church_01","Farm_Cowshed","Farm_WTower","CAHouseBlock_A","CAHouseBlock_B","CAHouseBlock_C","CAHouseBlock_D","HouseRuins","Ind_Dopravnik","Ind_Expedice","Ind_MalyKomin","Ind_Mlyn","Ind_Pec","ind_silomale","Ind_SiloVelke","Ind_Vysypka","Ind_Garage01","CAStructures_IndPipe1_todo_delete","IndPipe2","Ind_Shed_01","Ind_Shed_02","Ind_Tank","Ind_Workshop01","CABuildings2_Misc_Cargo","Misc_PowerStation","Misc_WaterStation","Rail_House_01","Shed_small","Shed_wooden","particle_effects","AiA_Chernarus_Config","Chernarus","AiA_Chernarus_Summer_Config","Chernarus_Summer","AiA_Desert2_Config","Porto","AiA_Desert_Config","Desert","AiA_Hotfix_Config","CA_Hotfix","CA_QGClutterHotfix","CA_Hotfix_vez_ropa","AiA_Misc2_Config","CAMisc2","AiA_Misc3_Config","CAMisc3","WarfareBuildings","AiA_Misc_e_Config","CAMisc_E","CAMisc_E_WF","AiA_Signs_e_Config","CASigns_E","A_TVTower","CAStructures_Nav_pier","CAStructures_Railway","AiA_Structures_e_Config","CAStructures_E","CAStructures_E_HouseA","CAStructures_E_HouseA_A_BuildingWIP","CAStructures_E_HouseA_A_CityGate1","CAStructures_E_HouseA_A_Minaret","CAStructures_E_HouseA_A_Minaret_Porto","CAStructures_E_HouseA_A_Mosque_big","CAStructures_E_HouseA_A_Mosque_small","CAStructures_E_HouseA_A_Office01","CAStructures_E_HouseA_a_stationhouse","CAStructures_E_HouseA_A_Statue","CAStructures_E_HouseA_A_Villa","CAStructures_E_HouseC","CAStructures_E_HouseK","CAStructures_E_HouseL","CAStructures_E_Ind","CAStructures_E_Ind_Ind_Coltan_Mine","CAStructures_E_Ind_Ind_FuelStation","CAStructures_E_Ind_Ind_Garage01","CAStructures_E_Ind_Oil_Mine","CAStructures_E_Ind_IndPipes","CAStructures_E_Ind_Misc_PowerStation","CAStructures_E_Ind_Ind_Shed","CAStructures_E_Mil","CAStructures_E_Misc","CAStructures_E_Misc_Misc_cables","CAStructures_E_Misc_Misc_Construction","CAStructures_E_Misc_Misc_Garbage","CAStructures_E_Misc_Misc_Interier","CAStructures_E_Misc_Misc_Lamp","CAStructures_E_Misc_Misc_Market","CAStructures_E_Misc_Misc_powerline","CAStructures_E_Misc_Misc_Water","CAStructures_E_Misc_Misc_Well","CAStructures_E_Wall","CAStructures_E_Wall_Wall_L","AiA_Structures_pmc_Config","CAStructures_PMC","CAStructures_PMC_Buildings","CAStructures_PMC_Buildings_Bunker","CAStructures_PMC_Buildings_GeneralStore_PMC","CAStructures_PMC_Buildings_Ruin_Cowshed","CAStructures_PMC_Ind","CAStructures_PMC_FuelStation","CAStructures_PMC_Misc","CAStructures_PMC_Misc_Shed","CAStructures_PMC_Ruins","CAStructures_PMC_Walls","AiA_Takistan_Config","Takistan","AiA_Zargabad_Config","zargabad","AiA_Afghan_Config","Mountains_ACR","AiA_Bohemia_Config","Woodland_ACR","AiA_Bootcamp_acr_Config","Bootcamp_ACR","AiA_Data_baf_Config","CA_BAF","AiA_Desert_e_Config","Desert_E","AiA_Language_baf_Config","CALanguage_Baf","AiA_Languagemissions_baf_Config","CALanguageMissions_baf","AiA_Misc_acr_Config","CAMisc_ACR","CAMisc_ACR_3DMarkers","CAMisc_ACR_Container","CAMisc_ACR_Dog","CAMisc_ACR_Helpers","CAMisc_ACR_PBX","CAMisc_ACR_ScaffoldingSmall","CAMisc_ACR_Shooting_range","CAMisc_ACR_Sign_Mines","CAMisc_ACR_Targets","CAMisc_ACR_Targets_InvisibleTarget","CAMisc_ACR_TestSphere","AiA_Provinggrounds_pmc_Config","ProvingGrounds_PMC","AiA_Shapur_baf_Config","Shapur_BAF","AiA_Core","AiA_Worlds","AiA_Worlds_Ambient","AiA_Worlds_Clutter","AiA_Worlds_ClutterDist","AiA_Worlds_Delete","AiA_Worlds_DisableInfiniteTerrain","AiA_Worlds_DustEffects","AiA_Worlds_EnvSounds","AiA_Worlds_FullDetailDist","AiA_Worlds_Intros","AiA_Worlds_Lighting","AiA_Worlds_Lighting_Chernarus","AiA_Worlds_Lighting_Desert","AiA_Worlds_MapSize","AiA_Worlds_MidDetailTexture","AiA_Worlds_NoDetailDist","AiA_Worlds_PictureMap","AiA_Worlds_PictureShot","AiA_Worlds_Seabed","AiA_Worlds_SkyTexture","AiA_Worlds_StreetLamp","AiA_Worlds_Surfaces","AiA_Worlds_Water","AiA_StandaloneTerrainPack_Core","AiA_StandaloneTerrainPack_Core_Faction","AiA_StandaloneTerrainPack_Core_VehicleClass"}; //whitelisted cfgPatches for AiA TP
antihack_InvOpenCheck[] = {}; // blank array disables, enable with {6} distance in meters disallows gear access if another player is within this range also disables gear access in vehicles.
antihack_banReason = "EpochMod.com Autoban";
@@ -20,7 +20,7 @@ antihack_customVariablesCheck = false; // true enables variable scanning on miss
antihack_customVariables[] = {}; //Add global variables from custom scripts, example: {"MyOwnVar","CP_KK"} //Global Variables begin without "_" !!
antihack_customVariablesCheckMode = 0; // 0 = Ban, 1 = Log, 2 == learning mode (only enable with trusted players in a passwored server to profile your variables keep disabled for normal operation)
-adminMenu_Owner[] = {};
+adminMenu_Owner[] = {};
adminMenu_OwnerSetting[] = {
"ESP-PLAYER",
"ESP-VEHICLE",
@@ -35,7 +35,7 @@ adminMenu_OwnerSetting[] = {
// "MAP-LOOT",
"MAP-VEHICLE",
"MAP-AI",
- // "MAP-BASEBUILDING",
+ // "MAP-BASEBUILDING",
"TARGET-HEAL",
"TARGET-AMMO",
"TARGET-KILL",
@@ -71,7 +71,7 @@ adminMenu_Owner[] = {
{"STEAMID64","ADMINNAME1"},
{"STEAMID64","ADMINNAME2"},
{"STEAMID64","ADMINNAME3"} //<- No comma on the last entry
-};
+};
adminMenu_High[] = {
{"STEAMID64","ADMINNAME4"},
{"STEAMID64","ADMINNAME5"},
@@ -123,4 +123,4 @@ Available Settings:
"SPAWN-MENU" => Access to Spawn Menu
-*/
\ No newline at end of file
+*/
diff --git a/Server_Install_Pack/README.txt b/Server_Install_Pack/README.txt
index fa892cd1a..ae003a36f 100644
--- a/Server_Install_Pack/README.txt
+++ b/Server_Install_Pack/README.txt
@@ -1,12 +1,18 @@
-Arma 3: Epoch Mod - EpochMod.com
+Arma 3 Epoch Mod
+--------------------------
Developers
-Aaron Clark - [VB]AWOL - Game Design, Code
-Kenneth Bente - Axle - Public Relations
-Paul Tomany - Sequisha - Models, Textures
-Darren Harrison - Kiory - Models, Textures
-Damian Clark - [VB]GREEN - Graphics
-Niklas Wagner - Skaronator - Code - http://skaronator.com/
-Andrew Gregory - Axeman - AI Code
-Florian Kinder - Fank - DLL Code
-Denis Erygin - devd - Linux DLL Support
+--------------------------
+* Aaron Clark - [VB]AWOL - Game Design, Code
+* Kenneth Bente - Axle - Public Relations, Models
+* Paul Tomany - Sequisha - Models, Textures
+* Dan - OrangeSherbet - Tester, Videos, Wiki Editor
+* Darren Harrison - Kiory - Models, Textures
+* Damian Clark - [VB]GREEN - Graphics
+* Niklas Wagner - Skaronator - Code
+* Andrew Gregory - Axeman - AI Code
+* Florian Kinder - Fank - DLL Code
+* Denis Erygin - devd - Linux DLL Support
+* Richie - Map Support
+* Paden Sturtevant - SteamPunkGears - Models
+* Raimonds Virtoss - Raymix - UI and Code
diff --git a/Server_Install_Pack/Tools/InstallEpoch.cmd b/Server_Install_Pack/Tools/InstallEpoch.cmd
new file mode 100644
index 000000000..458e8741b
--- /dev/null
+++ b/Server_Install_Pack/Tools/InstallEpoch.cmd
@@ -0,0 +1,14 @@
+@ECHO OFF
+SET STEAMUN=admin@youremail.net
+SET STEAMPW=chamgeme
+SET ARMASVRPATH=C:\Arma3Server
+SET ARMAAPPID=107410
+SET ARMAWORKSHOPID=421839251
+
+:: remove mod folder
+rd /s/q "%ARMASVRPATH%\@Epoch"
+:: update workshop mod
+START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit
+:: copy files back to server
+xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\@Epoch"
+:: steamcmd.exe +login %STEAMUN% %STEAMPW% +force_install_dir "%ARMASVRPATH%" "+app_update %ARMAAPPID%" validate +quit
diff --git a/Server_Install_Pack/keys/epoch0340.bikey b/Server_Install_Pack/keys/epoch0340.bikey
deleted file mode 100644
index 84a4347bf..000000000
Binary files a/Server_Install_Pack/keys/epoch0340.bikey and /dev/null differ
diff --git a/Server_Install_Pack/keys/epoch0350.bikey b/Server_Install_Pack/keys/epoch0350.bikey
new file mode 100644
index 000000000..f503ee3e4
Binary files /dev/null and b/Server_Install_Pack/keys/epoch0350.bikey differ
diff --git a/Server_Install_Pack/mpmissions/epoch.VR.pbo b/Server_Install_Pack/mpmissions/epoch.VR.pbo
index b6c4f80ca..3339b03c2 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.VR.pbo and b/Server_Install_Pack/mpmissions/epoch.VR.pbo differ
diff --git a/Server_Install_Pack/sc/battleye/BEServer.dll b/Server_Install_Pack/sc/battleye/BEServer.dll
deleted file mode 100644
index c508ebbc7..000000000
Binary files a/Server_Install_Pack/sc/battleye/BEServer.dll and /dev/null differ
diff --git a/Server_Install_Pack/sc/battleye/attachto.txt b/Server_Install_Pack/sc/battleye/attachto.txt
index fa4aec86c..aea73eda9 100644
--- a/Server_Install_Pack/sc/battleye/attachto.txt
+++ b/Server_Install_Pack/sc/battleye/attachto.txt
@@ -1 +1 @@
-5 "" !WeaponHolderSimulated !Shot !"(Safe|LockBox|FirePlace|PlotPole|Jack|SolarGen)_EPOCH" !"Jack_SIM_EPOCH" !"LockBox_Ghost_EPOCH" !"CinderWallHalf_Ghost_EPOCH" !"(Tipi|Workbench|StorageShelf|Wood(Floor|LargeWall|Stairs|Ramp|Ladder|Tower)_Ghost_EPOCH" !"Foundation_Ghost_EPOCH" !"Land_Cages_F" !"Epoch_Sapper_F"
+5 "" !WeaponHolderSimulated !Shot !"(Safe|LockBox|FirePlace|PlotPole|Jack|SolarGen)_EPOCH" !"Jack_SIM_EPOCH" !"LockBox_Ghost_EPOCH" !"CinderWallHalf_Ghost_EPOCH" !"(Tipi|Workbench|StorageShelf|Wood(Floor|LargeWall|Stairs|Ramp|Ladder|Tower)_Ghost_EPOCH" !"(Hesco3|Metal|Foundation)_Ghost_EPOCH" !"Land_Cages_F" !"Epoch_Sapper_F"
diff --git a/Server_Install_Pack/sc/battleye/createvehicle.txt b/Server_Install_Pack/sc/battleye/createvehicle.txt
index 516987d73..02ba18340 100644
--- a/Server_Install_Pack/sc/battleye/createvehicle.txt
+++ b/Server_Install_Pack/sc/battleye/createvehicle.txt
@@ -1,3 +1,3 @@
5 "" !="I_UAV_01_F" !="(I|B|O)_UAV_AI" !"_EPOCH" !="B_65x39_Minigun_Caseless_Red_splash" !="B_762x51_Minigun_Tracer_Yellow_splash" !="B_(Swing|Stick)" !"^SmokeShell" !"^G_40mm_" !"^F_40mm_" !"Sub_F_" !"^F_Signal_" !="mini_Grenade" !="GrenadeHand" !="LaserTarget(C|W|E)" !"^Chemlight_" !="(ClaymoreDirectionalMine|DemoCharge|SatchelCharge)_Remote_Ammo" !="SLAMDirectionalMine_Wire_Ammo" !="(CMflare_Chaff|Sapper_Charge|SapperB_Charge|ATMine_Range)_Ammo" !="APERS(TripMine_Wire|BoundingMine_Range|Mine_Range)_Ammo" !="Epoch_(Sapper|SapperB|Cloak)_F" !="GreatWhite_F" !="groundWeaponHolder" !="WeaponHolderSimulated" !="Epoch_(Male|Female)_F" !"Supply[0-9]" !"Steerable_Parachute_F" !="Epoch_Female_CamoRed_F" !="Land_Cages_F" !="(O|I|B)_UAV_01_backpack_F" !="I_(helipilot|helicrew)_F" !="#smokesource" !="SmokeLauncherAmmo"
-5 "_EPOCH" !="(SapperHead|Jack|SolarGen)_SIM_EPOCH" !="Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower)_EPOCH" !="(Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH" !="(Tipi|StorageShelf|Safe|LockBox|FirePlace|FirePlaceOn|PlotPole|SolarGen|Jack|Freezer|Tarp|CinderWallHalf|Bobber)_EPOCH" !="I_(Soldier[1-3]|Soldier)_EPOCH" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Rabbit|Cabinet)_EPOCH" !="(Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH" !="(Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace)_SIM_EPOCH" !="Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH" !="(WoodFoundation|Foundation)_EPOCH" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH"
+5 "_EPOCH" !="(SapperHead|Jack|SolarGen)_SIM_EPOCH" !="Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower)_EPOCH" !="(Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH" !="(Tipi|StorageShelf|Safe|LockBox|FirePlace|FirePlaceOn|PlotPole|SolarGen|Jack|Freezer|Tarp|CinderWallHalf|Bobber)_EPOCH" !="I_(Soldier[1-3]|Soldier)_EPOCH" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Rabbit|Cabinet)_EPOCH" !="(Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH" !="(Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace|TankTrap)_SIM_EPOCH" !="Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH" !="(Hesco3|Metal)(_Ghost|_SIM|)_EPOCH" !="(Spike|Metal)_TRAP_SIM_EPOCH" !="(WoodFoundation|Foundation)_EPOCH" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH"
5 SeaGull
diff --git a/Server_Install_Pack/sc/battleye/scripts.txt b/Server_Install_Pack/sc/battleye/scripts.txt
index 7470628b7..fc477658b 100644
--- a/Server_Install_Pack/sc/battleye/scripts.txt
+++ b/Server_Install_Pack/sc/battleye/scripts.txt
@@ -1,4 +1,6 @@
//new2
+7 EPOCH_C_SET !="!isNil \"EPOCH_C_SET\"" !="_array = EPOCH_C_SET;" !="EPOCH_C_SET = nil;"
+7 EPOCH_GROUP_Delete_PVS !="EPOCH_GROUP_Delete_PVS = [player,Epoch_personalToken];"
7 "BIS_fnc_dynamictext" !="\"BIS_fnc_dynamictext"\" !", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;" !", 0, 0.4, 5, 2, 0, 2] spawn bis_fnc_dynamictext;" !", 0, 1, 6, 2, 0, 1] spawn bis_fnc_dynamictext;" !"snil '_fnc_scriptName') then {_fnc_scriptName}"
7 forceRespawn
7 setFriend
@@ -24,6 +26,8 @@
7 addMagazineCargo !"_dogHolder addMagazineCargo [\"RabbitCarcass_EPOCH\", 1]" !"_dogHolder addMagazineCargo [\"Pelt_EPOCH\", 1]" !"_dogHolder addMagazineCargo [\"Venom_EPOCH\", 1]" !"_dogHolder addMagazineCargo [\"SnakeCarcass_EPOCH\", 1]" !"_dogHolder addMagazineCargo [\"ChickenCarcass_EPOCH\", 1]" !="_acceptHolder addMagazineCargo [_wAmmo, 1] ;"
7 addItem !="player addItem _item;" !="player addItem _craftItem;" !="player addItem _x;" !="_plyr addItemToVest _missionItem;" !="axeVIP addItemToVest _item;" !="_plyr addItemToVest _missionItem;" !="EPOCH_fnc_addItemOverflow"
7 addBackPack
+7 addMissionEventHandler !="addMissionEventHandler ['Draw3D',_var + \"call Epoch_gui3DCooldownEH;\"];" !="addMissionEventHandler ['Draw3D',_var + \"call epoch_gui3dModelPosEH;\"];" !="addMissionEventHandler ['Draw3D',_var + \"call epoch_gui3dWorldPosEH;\"];" !="addMissionEventHandler [\n"ended",\n{\n\nBIS_fnc_missionHandlers_end = _this;"
+7 removeMissionEventHandler !="removeMissionEventHandler [\"Draw3D\", _id];"
7 removeAllWeapons !="removeAllWeapons axeGeneral;"
7 removeAllItems
7 removeAllActions
@@ -34,7 +38,7 @@
7 createUnit !="_unit = _grp createUnit[(_arrUnits select _i), _pos, [], 0, \"FORM\"];" !="_driver = _grp createUnit[\"I_UAV_AI\", position _unit, [], 0, \"CAN_COLLIDE\"];" !="axeGeneral = grpVIPGeneral createUnit ["I_officer_F", axeGeneralPos, [], 1, "CAN_COLLIDE"];"
7 createAgent !="_unit = createAgent[_unitClass, _targetPos, [], 256, \"FORM\"];" !="_unit = createAgent [_unitClass, _targetPos, [], 120, \"FORM\"];" !="_animal = createAgent[_randomAIClass, _animalPos, [], 5, \"NONE\"];" !="_unit = createAgent [\"Epoch_Cloak_F\", _pos, [], 0, \"CAN_COLLIDE\"];" !="_unit = createAgent [\"Epoch_Sapper_F\", _targetPos, [], 180, \"FORM\"];" !="_sapper = createAgent ["Epoch_Sapper_F", getPos _cage2, [], 0, "FORM"];"
7 createTeam
-7 createDialog !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog \"TapOut\";" !="if !(createdialog \"Trade\") exitWith {};" !="_ok = createdialog \"Interact\";" !="_ok = createdialog \"TradeNPCMenu\";" !="createDialog \"Epoch_myGroup\";" !="createDialog (if ((Epoch_my_GroupUID == \"\") && (Epoch_my_Group isEqualTo [])) then {\"EPOCH_createGrp\"} else {\"Epoch_myGroup\"});" !="createDialog \"GroupRequests\";" !="_ok = createdialog \"MissionSelect\";" !="createDialog 'Skaronator_AdminMenu';"
+7 createDialog !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog \"TapOut\";" !="if !(createdialog \"Trade\") exitWith {};" !="_ok = createdialog \"Interact\";" !="_ok = createdialog \"TradeNPCMenu\";" !="createDialog \"Epoch_myGroup\";" !="createDialog (if ((Epoch_my_GroupUID == \"\") && (Epoch_my_Group isEqualTo [])) then {\"EPOCH_createGrp\"} else {\"Epoch_myGroup\"});" !="createDialog \"GroupRequests\";" !="_ok = createdialog \"MissionSelect\";" !="createDialog 'Skaronator_AdminMenu';"
7 createDisplay !="createDisplay \"rmx_dynamenu\";" !="_parent createdisplay _displayClass;"
7 deleteMarker
7 setMarker
@@ -45,7 +49,7 @@
7 setDamage !="player setdamage 1;"
7 setDammage
7 displaySetEventHandler
-7 ctrlSetEventHandler !"BIS_fnc_guiMessage_status" !"ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn',"
+7 ctrlSetEventHandler !"BIS_fnc_guiMessage_status" !"ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn'," !="_ctrl ctrlSetEventHandler [\"mouseEnter\""
7 addMPEventHandler
7 addEventHandler !"displayAddEventHandler" !"ctrlAddEventHandler" !"FiredNear" !"EpeContactStart" !"InventoryClosed" !"GetOut" !"InventoryOpened" !"local" !"Respawn" !"Put" !"Take" !"Fired" !"Killed" !" [\"PostReset\",{BIS_EnginePPReset = true;} ];" !"_logic addeventhandler [\n\"local\""
7 displayAddEventHandler !"[_display] call _fnc_animate;" !"tVersion select 4) == \"Development\") then" !"_display displayaddeventhandler\n[\n\"mousemoving\"," !"(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !"(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"_this call EPOCH_KeyDown\"];" !="_addCase = _display46 displayAddEventHandler ['KeyDown',{_this call EPOCH_KeyDown;}];" !"_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'"
@@ -57,10 +61,9 @@
7 displayRemoveEventHandler !"BIS_fnc_guiMessage_status"
7 switchCamera !="vehicle player switchCamera"
7 remoteControl !"fn_moduleRemoteControl.sqf" !="\"BIS_fnc_moduleRemoteControl"\"
-7 drawIcon3D !="drawIcon3D[\"\x\addons\a3_epoch_code\Data\Member.paa\",_color,_pos,1,1,0,_text,1,0.025,\"PuristaMedium\"];\n}forEach EPOCH_ESP_TARGETS;" !"drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_stability],_color,(getPosATL EPOCH_stabilityTarget),5,5,0,\"\",1,0.05,\"PuristaMedium\"];" !"drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_num],_color,_pos,4,4,0,\"\",1,0.05,\"PuristaMedium\"];" !"EPOCH_drawIcon3dStability" !"EPOCH_drawIcon3d" !"if (_condition) then {\ndrawIcon3D [_icon, _color, _position, _sizeX, _sizeY, _angle, _text," !="drawIcon3D [\"\A3\UI_F_MP_Mark\Data\Tasks\Misc\background.paa\""
+7 drawIcon3D !="drawIcon3D[\"\x\addons\a3_epoch_code\Data\Member.paa\",_color,_pos,1,1,0,_text,1,0.025,\"PuristaMedium\"];\n}forEach EPOCH_ESP_TARGETS;" !"drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_stability],_color,(getPosATL EPOCH_stabilityTarget),5,5,0,\"\",1,0.05,\"PuristaMedium\"];" !"drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_num],_color,_pos,4,4,0,\"\",1,0.05,\"PuristaMedium\"];" !"EPOCH_drawIcon3dStability" !"EPOCH_drawIcon3d" !"if (_condition) then {\ndrawIcon3D [_icon, _color, _position, _sizeX, _sizeY, _angle, _text," !="drawIcon3D [\"\A3\UI_F_MP_Mark\Data\Tasks\Misc\background.paa\"" !="drawIcon3D[\"x\addons\a3_epoch_code\Data\UI\snap_ca.paa\""
7 drawLine3D !"{\nfor [{_i = 1}, {_i < count _x}, {_i = _i + 1}] do {\ndrawLine3D [_x select (_i - 1), _x select _i, ((BIS_tracedShooter getVari"
-7 ctrlCreate !="_ctrl = _display ctrlCreate [\"RscProgress\",_idc + 1];" !="_display ctrlCreate [\"rmx_rscControlsGroup\"" !="_ListGroup = _display ctrlCreate [\"RscControlsGroupNoHScrollbars\"" !="_ctrl = _display ctrlCreate [_x,call _getIDC];" !="_mainGrp = _display ctrlCreate [\"Epoch_main_config_group\",_value];" !="_ctrlGrp = _display ctrlCreate [\"RscControlsGroupNoScrollbars\",call epoch_getIDC];"
-7 ctrlDelete !="ctrlDelete _ListGroup;" !="ctrlDelete (rmx_var_crafting_ctrl_GROUP select 0);" !="ctrlDelete _mainGrp;" !="_x call epoch_getIDC;\nctrlDelete _x;"
+7 ctrlCreate !="ctrlCreate [\"RscProgress\",_idc + 1];" !="ctrlCreate [\"rmx_rscControlsGroup\"" !="_ListGroup = _display ctrlCreate [\"RscControlsGroupNoHScrollbars\"" !="ctrlCreate [_x,call _getIDC];" !="_mainGrp = _display ctrlCreate [\"Epoch_main_config_group\",_value];" !="ctrlCreate [\"RscControlsGroupNoScrollbars\",call epoch_getIDC];" !="ctrlCreate [\"rmx_rscPicture\",(66600 + _e)];" !="ctrlCreate ["RscStructuredText",call epoch_getIDC];"
7 ctrlClassName
7 ctrlModel
7 ctrlModelDirection
@@ -74,5 +77,3 @@
7 setGroupIconsSelectable
7 setGroupIconParams
7 addGroupIcon
-7 EPOCH_defaultVars_SEPXVar
-7 EPOCH_GROUP_Delete_PVS !="EPOCH_GROUP_Delete_PVS = [player,Epoch_personalToken];"
diff --git a/Server_Install_Pack/sc/battleye/setpos.txt b/Server_Install_Pack/sc/battleye/setpos.txt
index 45b3f8213..916a46945 100644
--- a/Server_Install_Pack/sc/battleye/setpos.txt
+++ b/Server_Install_Pack/sc/battleye/setpos.txt
@@ -1 +1 @@
-5 "" !="Epoch_(Male|Female)_F" !="SapperHead_SIM_EPOCH" !="(Tipi|Workbench|StorageShelf|Safe|LockBox|FirePlace|FirePlaceOn|PlotPole|SolarGen)_EPOCH" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Rabbit|Cabinet)_EPOCH" !="(Sheep|Goat|Snake|Hen|Cock|Fin|Alsatian)_random_EPOCH" !="(Safe|LockBox|CinderWallHalf|CinderWall|Fireplace|SolarGen)_SIM_EPOCH" !="Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorway|Stairs|Stairs2|Ramp)_SIM_EPOCH" !="(Foundation|Wood(Foundation|Ladder|Tower))_Ghost_EPOCH" !="Foundation_EPOCH" !="WoodFoundation_EPOCH" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH"
+5 "" !="Epoch_(Male|Female)_F" !="SapperHead_SIM_EPOCH" !="(Tipi|Workbench|StorageShelf|Safe|LockBox|FirePlace|FirePlaceOn|PlotPole|SolarGen)_EPOCH" !="(Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Rabbit|Cabinet)_EPOCH" !="(Sheep|Goat|Snake|Hen|Cock|Fin|Alsatian)_random_EPOCH" !="(Safe|LockBox|CinderWallHalf|CinderWall|Fireplace|SolarGen|TankTrap)_SIM_EPOCH" !="Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorway|Stairs|Stairs2|Ramp)_SIM_EPOCH" !="(Foundation|Wood(Foundation|Ladder|Tower))_Ghost_EPOCH" !="Foundation_EPOCH" !="WoodFoundation_EPOCH" !="(Hesco3|Metal)(_Ghost|_SIM|)_EPOCH" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH"
diff --git a/Sources/epoch_code/Data/UI/buttons/build_maintain.paa b/Sources/epoch_code/Data/UI/buttons/build_maintain.paa
index 75d0bf8cd..c474d0667 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/build_maintain.paa and b/Sources/epoch_code/Data/UI/buttons/build_maintain.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/build_move.paa b/Sources/epoch_code/Data/UI/buttons/build_move.paa
index 898820703..b765c04ac 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/build_move.paa and b/Sources/epoch_code/Data/UI/buttons/build_move.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/build_pack.paa b/Sources/epoch_code/Data/UI/buttons/build_pack.paa
new file mode 100644
index 000000000..756a616a8
Binary files /dev/null and b/Sources/epoch_code/Data/UI/buttons/build_pack.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/build_remove.paa b/Sources/epoch_code/Data/UI/buttons/build_remove.paa
index 79ef7cad2..f1786bf1d 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/build_remove.paa and b/Sources/epoch_code/Data/UI/buttons/build_remove.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/build_upgrade.paa b/Sources/epoch_code/Data/UI/buttons/build_upgrade.paa
index 062b9038c..55b3fbdd2 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/build_upgrade.paa and b/Sources/epoch_code/Data/UI/buttons/build_upgrade.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/dm_selection.paa b/Sources/epoch_code/Data/UI/buttons/dm_selection.paa
index f8a686a4b..3bfbf989b 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/dm_selection.paa and b/Sources/epoch_code/Data/UI/buttons/dm_selection.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/dm_selection_b1.paa b/Sources/epoch_code/Data/UI/buttons/dm_selection_b1.paa
new file mode 100644
index 000000000..78f3f1953
Binary files /dev/null and b/Sources/epoch_code/Data/UI/buttons/dm_selection_b1.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/krypto.paa b/Sources/epoch_code/Data/UI/buttons/krypto.paa
new file mode 100644
index 000000000..c48138cc1
Binary files /dev/null and b/Sources/epoch_code/Data/UI/buttons/krypto.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/pad_can_lock.paa b/Sources/epoch_code/Data/UI/buttons/pad_can_lock.paa
index 21f5245e3..b6be18f4a 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/pad_can_lock.paa and b/Sources/epoch_code/Data/UI/buttons/pad_can_lock.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/pad_can_unlock.paa b/Sources/epoch_code/Data/UI/buttons/pad_can_unlock.paa
index b7e674094..efd15c505 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/pad_can_unlock.paa and b/Sources/epoch_code/Data/UI/buttons/pad_can_unlock.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/pad_cannot_lock.paa b/Sources/epoch_code/Data/UI/buttons/pad_cannot_lock.paa
index 75e46a5e6..bf715d9cc 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/pad_cannot_lock.paa and b/Sources/epoch_code/Data/UI/buttons/pad_cannot_lock.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/pad_cannot_unlock.paa b/Sources/epoch_code/Data/UI/buttons/pad_cannot_unlock.paa
index 5608cb528..c6e57b08e 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/pad_cannot_unlock.paa and b/Sources/epoch_code/Data/UI/buttons/pad_cannot_unlock.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/player_inspect.paa b/Sources/epoch_code/Data/UI/buttons/player_inspect.paa
index ebcc84687..92d9f2e9f 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/player_inspect.paa and b/Sources/epoch_code/Data/UI/buttons/player_inspect.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/repair.paa b/Sources/epoch_code/Data/UI/buttons/repair.paa
new file mode 100644
index 000000000..1ff513025
Binary files /dev/null and b/Sources/epoch_code/Data/UI/buttons/repair.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/talk_blue.paa b/Sources/epoch_code/Data/UI/buttons/talk_blue.paa
index 038d21624..da1976fd2 100644
Binary files a/Sources/epoch_code/Data/UI/buttons/talk_blue.paa and b/Sources/epoch_code/Data/UI/buttons/talk_blue.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/timer.paa b/Sources/epoch_code/Data/UI/buttons/timer.paa
new file mode 100644
index 000000000..d07f12ad1
Binary files /dev/null and b/Sources/epoch_code/Data/UI/buttons/timer.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/vehicle_refuel.paa b/Sources/epoch_code/Data/UI/buttons/vehicle_refuel.paa
new file mode 100644
index 000000000..7aa2c3146
Binary files /dev/null and b/Sources/epoch_code/Data/UI/buttons/vehicle_refuel.paa differ
diff --git a/Sources/epoch_code/Data/UI/buttons/vehicle_siphon.paa b/Sources/epoch_code/Data/UI/buttons/vehicle_siphon.paa
new file mode 100644
index 000000000..08a8a722d
Binary files /dev/null and b/Sources/epoch_code/Data/UI/buttons/vehicle_siphon.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/0.paa b/Sources/epoch_code/Data/UI/health_parts/0.paa
new file mode 100644
index 000000000..b8124c8cc
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/0.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/1.paa b/Sources/epoch_code/Data/UI/health_parts/1.paa
new file mode 100644
index 000000000..80c15d1dd
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/1.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/10.paa b/Sources/epoch_code/Data/UI/health_parts/10.paa
new file mode 100644
index 000000000..dc303668e
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/10.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/2.paa b/Sources/epoch_code/Data/UI/health_parts/2.paa
new file mode 100644
index 000000000..19dbcec7a
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/2.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/3.paa b/Sources/epoch_code/Data/UI/health_parts/3.paa
new file mode 100644
index 000000000..d262947cc
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/3.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/4.paa b/Sources/epoch_code/Data/UI/health_parts/4.paa
new file mode 100644
index 000000000..403796635
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/4.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/5.paa b/Sources/epoch_code/Data/UI/health_parts/5.paa
new file mode 100644
index 000000000..9153ab9a0
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/5.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/6.paa b/Sources/epoch_code/Data/UI/health_parts/6.paa
new file mode 100644
index 000000000..b305e5e22
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/6.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/7.paa b/Sources/epoch_code/Data/UI/health_parts/7.paa
new file mode 100644
index 000000000..b0b0ba022
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/7.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/8.paa b/Sources/epoch_code/Data/UI/health_parts/8.paa
new file mode 100644
index 000000000..07b37e7e9
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/8.paa differ
diff --git a/Sources/epoch_code/Data/UI/health_parts/9.paa b/Sources/epoch_code/Data/UI/health_parts/9.paa
new file mode 100644
index 000000000..cd76bc9e4
Binary files /dev/null and b/Sources/epoch_code/Data/UI/health_parts/9.paa differ
diff --git a/Sources/epoch_code/Data/UI/snap_ca.paa b/Sources/epoch_code/Data/UI/snap_ca.paa
new file mode 100644
index 000000000..c2cade9cd
Binary files /dev/null and b/Sources/epoch_code/Data/UI/snap_ca.paa differ
diff --git a/Sources/epoch_code/Data/gender_selection.paa b/Sources/epoch_code/Data/gender_selection.paa
new file mode 100644
index 000000000..b37928518
Binary files /dev/null and b/Sources/epoch_code/Data/gender_selection.paa differ
diff --git a/Sources/epoch_code/System/Animal_brain.fsm b/Sources/epoch_code/System/Animal_brain.fsm
index 8af1e5584..7557c5d7c 100644
--- a/Sources/epoch_code/System/Animal_brain.fsm
+++ b/Sources/epoch_code/System/Animal_brain.fsm
@@ -1,4 +1,4 @@
-/*%FSM*/
+/*%FSM*/
/*%FSM*/
/*
item0[] = {"init",0,250,375.000000,-225.000000,475.000000,-175.000000,0.000000,"init"};
@@ -22,37 +22,41 @@ item17[] = {"Not_Too_Far",4,218,250.000000,325.000000,350.000000,375.000000,0.00
item18[] = {"Process_1",2,250,575.000000,250.000000,675.000000,300.000000,0.000000,"Process"};
item19[] = {"Fight",4,218,625.000000,325.000000,725.000000,375.000000,0.000000,"Fight"};
item20[] = {"Flight",4,218,500.000000,325.000000,600.000000,375.000000,0.000000,"Flight"};
-item21[] = {"Fight",2,4346,625.000000,425.000000,725.000000,475.000000,0.000000,"Fight"};
+item21[] = {"Fight",2,250,625.000000,425.000000,725.000000,475.000000,0.000000,"Fight"};
item22[] = {"Delete_1",1,250,675.000000,-25.000000,775.000000,25.000000,0.000000,"Delete"};
item23[] = {"Too_many",4,218,525.000000,-25.000000,625.000000,25.000000,0.000000,"Too many"};
+item24[] = {"IsNull",4,4314,525.000000,-125.000000,625.000000,-75.000000,0.000000,"IsNull"};
+item25[] = {"Exit_",1,250,675.000000,-125.000000,775.000000,-75.000000,0.000000,"" \n "Exit" \n ""};
link0[] = {0,1};
link1[] = {1,2};
link2[] = {2,6};
link3[] = {2,23};
-link4[] = {3,15};
-link5[] = {4,18};
-link6[] = {5,14};
-link7[] = {6,9};
-link8[] = {7,8};
-link9[] = {8,2};
-link10[] = {9,3};
-link11[] = {9,4};
-link12[] = {9,11};
-link13[] = {10,7};
-link14[] = {11,12};
-link15[] = {13,10};
-link16[] = {15,5};
-link17[] = {15,17};
-link18[] = {16,10};
-link19[] = {17,16};
-link20[] = {18,19};
-link21[] = {18,20};
-link22[] = {19,21};
-link23[] = {20,13};
-link24[] = {21,10};
-link25[] = {23,22};
-globals[] = {25.000000,1,0,0,0,640,480,1,60,6316128,1,65.053413,836.813538,684.337891,-110.918762,853,911,1};
-window[] = {2,-1,-1,-1,-1,753,25,1063,25,3,871};
+link4[] = {2,24};
+link5[] = {3,15};
+link6[] = {4,18};
+link7[] = {5,14};
+link8[] = {6,9};
+link9[] = {7,8};
+link10[] = {8,2};
+link11[] = {9,3};
+link12[] = {9,4};
+link13[] = {9,11};
+link14[] = {10,7};
+link15[] = {11,12};
+link16[] = {13,10};
+link17[] = {15,5};
+link18[] = {15,17};
+link19[] = {16,10};
+link20[] = {17,16};
+link21[] = {18,19};
+link22[] = {18,20};
+link23[] = {19,21};
+link24[] = {20,13};
+link25[] = {21,10};
+link26[] = {23,22};
+link27[] = {24,25};
+globals[] = {25.000000,1,0,0,0,640,480,1,62,6316128,1,65.053413,836.813538,420.713287,-149.285370,853,630,1};
+window[] = {2,-1,-1,-1,-1,884,156,1194,156,3,871};
*//*%FSM*/
class FSM
{
@@ -115,6 +119,16 @@ class FSM
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
+ /*%FSM*/
+ class IsNull
+ {
+ priority = 0.000000;
+ to="Exit_";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"isNull _animalAgent"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
/*%FSM*/
class Loop
{
@@ -396,13 +410,25 @@ class FSM
};
};
/*%FSM*/
+ /*%FSM*/
+ class Exit_
+ {
+ name = "Exit_";
+ init = /*%FSM*/""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ };
+ };
+ /*%FSM*/
};
initState="init";
finalStates[] =
{
- "Dead" ,
- "Delete" ,
- "Delete_1"
+ "Dead",
+ "Delete",
+ "Delete_1",
+ "Exit_",
};
};
/*%FSM*/
\ No newline at end of file
diff --git a/Sources/epoch_code/System/Group_Leader_Brain.fsm b/Sources/epoch_code/System/Group_Leader_Brain.fsm
index 3e53df11b..44b31c1b9 100644
--- a/Sources/epoch_code/System/Group_Leader_Brain.fsm
+++ b/Sources/epoch_code/System/Group_Leader_Brain.fsm
@@ -296,7 +296,7 @@ class FSM
"" \n
"_arrGarr = [];" \n
"_garrCount = 0;" \n
- "while {format [""%1"", _nrBuild buildingPos (_garrCount)] != ""[0,0,0]"" } do {" \n
+ "while {!((_nrBuild buildingPos _garrCount) isEqualTo [0,0,0])} do {" \n
"_arrGarr pushBack _garrCount;" \n
"_garrCount = _garrCount + 1;" \n
"};"/*%FSM*/;
@@ -372,7 +372,7 @@ class FSM
"" \n
"_arrGarr = [];" \n
"_garrCount = 0;" \n
- "while {format [""%1"", _nrBuild buildingPos (_garrCount)] != ""[0,0,0]"" } do {" \n
+ "while {!((_nrBuild buildingPos _garrCount) isEqualTo [0,0,0])} do {" \n
"_arrGarr pushBack _garrCount;" \n
"_garrCount = _garrCount + 1;" \n
"};" \n
diff --git a/Sources/epoch_code/System/Sapper_Brain.fsm b/Sources/epoch_code/System/Sapper_Brain.fsm
index f819dd9ef..69cfa9267 100644
--- a/Sources/epoch_code/System/Sapper_Brain.fsm
+++ b/Sources/epoch_code/System/Sapper_Brain.fsm
@@ -1136,7 +1136,7 @@ class FSM
"" \n
"_nestFind = _nestFind + 1;" \n
"_garrisonPos = getPos _nrBuild;" \n
- "while {format [""%1"", _nrBuild buildingPos (_garrCount)] != ""[0,0,0]"" } do {" \n
+ "while {!((_nrBuild buildingPos _garrCount) isEqualTo [0,0,0])} do {" \n
"_arrGarr pushBack _garrCount;" \n
"_garrCount = _garrCount + 1;" \n
"};" \n
diff --git a/Sources/epoch_code/System/gender_selection.fsm b/Sources/epoch_code/System/gender_selection.fsm
index ca1190468..a0e86f9d6 100644
--- a/Sources/epoch_code/System/gender_selection.fsm
+++ b/Sources/epoch_code/System/gender_selection.fsm
@@ -250,7 +250,7 @@ class FSM
"player addEventHandler [""Put"", {(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler}];" \n
"player addEventHandler [""Take"", {(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck}];" \n
"player addEventHandler [""InventoryClosed"", {if !(EPOCH_arr_interactedObjs isEqualTo[]) then {EPOCH_arr_interactedObjs remoteExec[""EPOCH_server_save_vehicles"", 2]; EPOCH_arr_interactedObjs = [];};}];" \n
- "player addEventHandler [""InventoryOpened"", {_this spawn EPOCH_initUI; (locked (_this select 1) in [2, 3])}];" \n
+ "player addEventHandler [""InventoryOpened"", {_this spawn EPOCH_initUI; (locked (_this select 1) in [2, 3] || (_this select 1) getVariable[""EPOCH_Locked"", false])}];" \n
"player addEventHandler [""Fired"", {_this call EPOCH_fnc_playerFired}];" \n
"player addEventHandler [""Killed"", {_this call EPOCH_fnc_playerDeath}];"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
@@ -287,4 +287,4 @@ class FSM
"END"
};
};
-/*%FSM*/
\ No newline at end of file
+/*%FSM*/
diff --git a/Sources/epoch_code/System/player_login.fsm b/Sources/epoch_code/System/player_login.fsm
index fb72c4e23..aad55b99a 100644
--- a/Sources/epoch_code/System/player_login.fsm
+++ b/Sources/epoch_code/System/player_login.fsm
@@ -1,4 +1,4 @@
-/*%FSM*/
+/*%FSM*/
/*%FSM*/
/*
item0[] = {"INIT",0,250,-25.000000,-375.000000,75.000000,-325.000000,0.000000,"INIT"};
@@ -190,1208 +190,1298 @@ link97[] = {85,79};
link98[] = {86,16};
link99[] = {86,22};
link100[] = {87,31};
-globals[] = {25.000000,1,0,0,0,640,480,1,244,6316128,1,-506.837463,384.823669,1593.480103,946.069397,1212,880,1};
-window[] = {2,-1,-1,-1,-1,860,-1550,-510,130,3,1230};
+globals[] = {0.000000,0,0,0,0,640,480,1,244,6316128,1,-494.255402,984.732300,1761.360352,737.509033,585,832,1};
+window[] = {0,-1,-1,-1,-1,1079,713,2114,75,1,603};
*//*%FSM*/
class FSM
{
- fsmName = "Epoch Login";
- class States
- {
- /*%FSM*/
- class INIT
- {
- name = "INIT";
- init = /*%FSM*/"titleCut ["""", ""BLACK FADED"", 1337];" \n
- "0 fadeSound 0;" \n
- "player enableSimulation false;" \n
- "" \n
- "_debug = true;" \n
- "_myTime = diag_tickTime;" \n
- "if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Init"";" \n
- "};" \n
- ""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
+ fsmName = "Epoch Login";
+ class States
{
- priority = 0.000000;
- to="Process_1";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
+ /*%FSM*/
+ class INIT
+ {
+ name = "INIT";
+ itemno = 0;
+ init = /*%FSM*/"titleCut ["""", ""BLACK FADED"", 1337];" \n
+ "0 fadeSound 0;" \n
+ "player enableSimulation false;" \n
+ "" \n
+ "_debug = true;" \n
+ "_myTime = diag_tickTime;" \n
+ "if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Init"";" \n
+ "};" \n
+ ""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 62;
+ priority = 0.000000;
+ to="Process_1";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class FINISH
+ {
+ name = "FINISH";
+ itemno = 1;
+ init = /*%FSM*/"[] spawn {" \n
+ " waitUntil{!isNull (findDisplay 46)};" \n
+ " (findDisplay 46) displayAddEventHandler [""KeyDown"",""_this call EPOCH_KeyDown""];" \n
+ " (findDisplay 46) displayAddEventHandler [""KeyUp"",""_this call EPOCH_KeyUp""];" \n
+ "};" \n
+ "" \n
+ "3 fadeSound 1;" \n
+ "" \n
+ "if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Finish!"";" \n
+ "};" \n
+ "" \n
+ "" \n
+ "player enableSimulation true;" \n
+ "" \n
+ "titleCut ["""", ""BLACK IN"", 1];" \n
+ "1338 cutText ["""",""PLAIN"",0]; " \n
+ "" \n
+ "progressLoadingScreen 1.0;" \n
+ "" \n
+ "endLoadingScreen;" \n
+ "EPOCH_loadingScreenDone = true;" \n
+ "" \n
+ "player switchMove """";"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Version_Check
+ {
+ name = "Version_Check";
+ itemno = 3;
+ init = /*%FSM*/"if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Version Check"";" \n
+ "};" \n
+ "" \n
+ "// SHOULD BE:" \n
+ "_epoch_assets0 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_assets"");" \n
+ "_epoch_assets1 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_assets_1"");" \n
+ "_epoch_assets2 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""epoch_objects"");" \n
+ "_epoch_assets3 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_assets_3"");" \n
+ "_epoch_config = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_config"");" \n
+ "_epoch_language = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_language"");" \n
+ "_epoch_underground = getText(configFile >> ""Epoch"" >> ""Version"" >> ""Underground_Epoch"");" \n
+ "_epoch_vehicles = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_vehicles"");" \n
+ "_epoch_weapons = getText(configFile >> ""Epoch"" >> ""Version"" >> ""a3_epoch_weapons"");" \n
+ "" \n
+ "" \n
+ "// IS:" \n
+ "_my_epoch_assets0 = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_assets"" >> ""epochVersion"");" \n
+ "_my_epoch_assets1 = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_assets_1"" >> ""epochVersion"");" \n
+ "_my_epoch_assets2 = getText(configFile >> ""CfgPatches"" >> ""epoch_objects"" >> ""epochVersion"");" \n
+ "_my_epoch_assets3 = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_assets_3"" >> ""epochVersion"");" \n
+ "_my_epoch_config = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_config"" >> ""epochVersion"");" \n
+ "_my_epoch_language = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_language"" >> ""epochVersion"");" \n
+ "_my_epoch_underground = getText(configFile >> ""CfgPatches"" >> ""Underground_Epoch"" >> ""epochVersion"");" \n
+ "_my_epoch_vehicles = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_vehicles"" >> ""epochVersion"");" \n
+ "_my_epoch_weapons = getText(configFile >> ""CfgPatches"" >> ""a3_epoch_weapons"" >> ""epochVersion"");" \n
+ "" \n
+ "progressLoadingScreen 0.1;" \n
+ ""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Wrong_Version
+ {
+ itemno = 7;
+ priority = 10.000000;
+ to="ERROR_Wrong_Version";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_epoch_assets0 != _epoch_assets0 ||" \n
+ "_my_epoch_assets1 != _epoch_assets1 ||" \n
+ "_my_epoch_assets2 != _epoch_assets2 ||" \n
+ "_my_epoch_assets3 != _epoch_assets3 ||" \n
+ "_my_epoch_config != _epoch_config ||" \n
+ "_my_epoch_language != _epoch_language ||" \n
+ "_my_epoch_underground != _epoch_underground ||" \n
+ "_my_epoch_vehicles != _epoch_vehicles ||" \n
+ "_my_epoch_weapons != _epoch_weapons"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class true
+ {
+ itemno = 44;
+ priority = 0.000000;
+ to="Arma_Version_Che";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Check_Player_UID
+ {
+ name = "Check_Player_UID";
+ itemno = 5;
+ init = /*%FSM*/"if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Check PlayerUID"";" \n
+ "};" \n
+ "" \n
+ "_playerUID = getPlayerUID player;" \n
+ "" \n
+ "progressLoadingScreen 0.2;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class PlayerUID_Okay
+ {
+ itemno = 6;
+ priority = 10.000000;
+ to="Check_Server_1";
+ precondition = /*%FSM*/"!isNil ""_playerUID"""/*%FSM*/;
+ condition=/*%FSM*/"_playerUID != """""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Empty_PlayerUID
+ {
+ itemno = 12;
+ priority = 0.000000;
+ to="ERROR_PlayerUID";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Wrong_Version
+ {
+ name = "ERROR_Wrong_Version";
+ itemno = 9;
+ init = /*%FSM*/"_msg = ""You have an outdated version of Epoch"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_EPOCHVERSION = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_EPOCHVERSION"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Disconnect
+ {
+ name = "Disconnect";
+ itemno = 10;
+ init = /*%FSM*/"endLoadingScreen;" \n
+ "1338 cutText [_msg,""PLAIN"",0]; " \n
+ "deleteVehicle player;" \n
+ "call _rejectPlayer;" \n
+ "diag_log format [""(%1) %2"",diag_tickTime,_msg];" \n
+ "_myTime = diag_tickTime;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Check_if_Player
+ {
+ itemno = 28;
+ priority = 0.000000;
+ to="Reject_without_B";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"(diag_tickTime - _myTime) > 2"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_PlayerUID
+ {
+ name = "ERROR_PlayerUID";
+ itemno = 13;
+ init = /*%FSM*/"_msg = ""Can not setup Player Object! (Error 01)"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_UID = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_UID"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Setup_Player_Var
+ {
+ name = "Setup_Player_Var";
+ itemno = 17;
+ init = /*%FSM*/"diag_log format[""DEBUG TIME WAITED: %1"", (diag_tickTime - _myTime)];" \n
+ "{" \n
+ " missionNamespace setVariable[(format[""EPOCH_player%1"", EPOCH_customVars select _forEachIndex]), _x];" \n
+ "} forEach _playerVariables;" \n
+ "" \n
+ """Loading Player Variables... Please wait!"" call Epoch_updateLoadingScreen;" \n
+ "" \n
+ "EPOCH_lastPlayerPos = getPosATL vehicle player;" \n
+ "" \n
+ "progressLoadingScreen 0.7;" \n
+ "" \n
+ "if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Setup Player Variables"";" \n
+ "};" \n
+ ""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 24;
+ priority = 0.000000;
+ to="Setup_EH_s_and_H";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Request_Hive
+ {
+ name = "Request_Hive";
+ itemno = 18;
+ init = /*%FSM*/"_myTime = diag_tickTime;" \n
+ "" \n
+ "Epoch_my_Group = [];" \n
+ "" \n
+ "EPOCH_checkPlayer_PVS = player;" \n
+ "publicVariableServer ""EPOCH_checkPlayer_PVS"";" \n
+ "" \n
+ "" \n
+ """Loading Player Data... Please wait!"" call Epoch_updateLoadingScreen;" \n
+ "progressLoadingScreen 0.5;" \n
+ ""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Hive_Response
+ {
+ itemno = 78;
+ priority = 0.000000;
+ to="Process_2";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"!isNil ""EPOCH_checkPlayer_PVC"""/*%FSM*/;
+ action=/*%FSM*/"_newChar = EPOCH_checkPlayer_PVC;" \n
+ "EPOCH_checkPlayer_PVC = nil;"/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Timeout_No_Respo
+ {
+ itemno = 19;
+ priority = 0.000000;
+ to="ERROR_Server_not_3";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"(diag_tickTime - _myTime) > 120"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Server_not
+ {
+ name = "ERROR_Server_not";
+ itemno = 20;
+ init = /*%FSM*/"_msg = ""Authentication Failed, Disconnect and try again"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_NoResponse2 = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_NoResponse2"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Wrong_Server
+ {
+ name = "ERROR_Wrong_Server";
+ itemno = 25;
+ init = /*%FSM*/"_msg = format[""Server and Client running with different Version! (You: %1 // Server: %2)"",getText(configFile >> ""CfgMods"" >> ""Epoch"" >> ""version""),_serverVersion];" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_ServerVersion = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_ServerVersion"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Setup_Player_Obj
+ {
+ name = "Setup_Player_Obj";
+ itemno = 27;
+ init = /*%FSM*/"_ply = player;" \n
+ "_group = group player;" \n
+ "selectPlayer _playerObject;" \n
+ "" \n
+ "deleteVehicle _ply;" \n
+ "deleteGroup _group;" \n
+ "" \n
+ """Loading Player Body... Please wait!"" call Epoch_updateLoadingScreen;" \n
+ "progressLoadingScreen 0.8;" \n
+ "" \n
+ "if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Setup Player Object"";" \n
+ "};" \n
+ "" \n
+ "_myTime = diag_tickTime;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Timeout_
+ {
+ itemno = 69;
+ priority = 0.000000;
+ to="ERROR_Player_Setup";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"(diag_tickTime - _myTime) > 60"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class new_player_____p
+ {
+ itemno = 49;
+ priority = 0.000000;
+ to="Setup_Player_Var";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_playerObject == player"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Display_Message
+ {
+ name = "Display_Message";
+ itemno = 33;
+ init = /*%FSM*/"[] spawn {" \n
+ " waitUntil{!isNull (findDisplay 46)};" \n
+ " (findDisplay 46) displayAddEventHandler [""KeyDown"",""true""];" \n
+ " (findDisplay 46) displayAddEventHandler [""KeyUp"",""true""];" \n
+ "};" \n
+ "diag_log format [""(%1) %2"",diag_tickTime,_msg];" \n
+ "_myTime = diag_tickTime;" \n
+ ""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Display_Message
+ {
+ itemno = 26;
+ priority = 0.000000;
+ to="Disconnect";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"(diag_tickTime - _myTime) > 10"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Check_Server
+ {
+ name = "Check_Server";
+ itemno = 35;
+ init = /*%FSM*/"_myTime = diag_tickTime;" \n
+ "if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Check Server"";" \n
+ "};" \n
+ """Checking Server... Please wait!"" call Epoch_updateLoadingScreen;" \n
+ "progressLoadingScreen 0.4;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Server_not_worki
+ {
+ itemno = 36;
+ priority = 10.000000;
+ to="ERROR_Server_not_1";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"!isNil ""EPOCH_BADHIVE""" \n
+ ""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Server_Okay
+ {
+ itemno = 11;
+ priority = 0.000000;
+ to="Server_Version_C";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"!isNil ""Epoch_ServerVersion"""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Server_not_1
+ {
+ name = "ERROR_Server_not_1";
+ itemno = 37;
+ init = /*%FSM*/"_msg = ""Server not Ready (Error 03)"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_NotReady2 = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_NotReady2"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Check_Server_1
+ {
+ name = "Check_Server_1";
+ itemno = 39;
+ init = /*%FSM*/"progressLoadingScreen 0.3;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Timeout_No_Respo
+ {
+ itemno = 40;
+ priority = 0.000000;
+ to="ERROR_Server_not_2";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"(diag_tickTime - _myTime) > 180"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class freshServer
+ {
+ itemno = 66;
+ priority = 0.000000;
+ to="Update_Loadingscreen";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"uiNamespace getVariable ['Epoch_freshServer', false]"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Server_Ready
+ {
+ itemno = 34;
+ priority = 0.000000;
+ to="Check_Server";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"!isNil ""EPOCH_SERVER"""/*%FSM*/;
+ action=/*%FSM*/"_serverUptime = EPOCH_SERVER;" \n
+ "EPOCH_SERVER = nil;"/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Server_not_2
+ {
+ name = "ERROR_Server_not_2";
+ itemno = 41;
+ init = /*%FSM*/"_msg = ""Server not Ready (Error 02)"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_NotReady1 = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_NotReady1"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Reject_without_B
+ {
+ name = "Reject_without_B";
+ itemno = 43;
+ init = /*%FSM*/"[] spawn {" \n
+ " waitUntil{!isNull (findDisplay 46)};" \n
+ " waitUntil {" \n
+ " (findDisplay 46) closeDisplay 0;" \n
+ " isNull (findDisplay 46)" \n
+ " };" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Arma_Version_Che
+ {
+ name = "Arma_Version_Che";
+ itemno = 45;
+ init = /*%FSM*/"progressLoadingScreen 0.15;" \n
+ ""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Outdated_Version
+ {
+ itemno = 46;
+ priority = 10.000000;
+ to="ERROR_Wrong_Version_1";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"productVersion select 2 < getNumber(configFile >> ""CfgMods"" >> ""Epoch"" >> ""ArmAVersion"")"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Player_Object_Re
+ {
+ itemno = 4;
+ priority = 0.000000;
+ to="Check_Player_UID";
+ precondition = /*%FSM*/"!isNull player"/*%FSM*/;
+ condition=/*%FSM*/"player == player"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Wrong_Version_1
+ {
+ name = "ERROR_Wrong_Version_1";
+ itemno = 47;
+ init = /*%FSM*/"_msg = ""You have an outdated version of ArmA 3"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_ARMAVERSION = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_ARMAVERSION"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Setup_EH_s_and_H
+ {
+ name = "Setup_EH_s_and_H";
+ itemno = 50;
+ init = /*%FSM*/"player addEventHandler [""Respawn"", {(_this select 0) call EPOCH_clientRespawn}];" \n
+ "player addEventHandler [""Put"", {(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler}];" \n
+ "player addEventHandler [""Take"", {(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck}];" \n
+ "player addEventHandler [""InventoryClosed"", {if !(EPOCH_arr_interactedObjs isEqualTo[]) then {EPOCH_arr_interactedObjs remoteExec[""EPOCH_server_save_vehicles"", 2]; EPOCH_arr_interactedObjs = [];};}];" \n
+ "player addEventHandler [""InventoryOpened"", {_this spawn EPOCH_initUI; (locked (_this select 1) in [2, 3] || (_this select 1) getVariable[""EPOCH_Locked"", false])}];" \n
+ "player addEventHandler [""Fired"", {_this call EPOCH_fnc_playerFired}];" \n
+ "player addEventHandler [""Killed"", {_this call EPOCH_fnc_playerDeath}];" \n
+ "" \n
+ "if (count EPOCH_playerHitPoints isEqualTo count ((getAllHitPointsDamage player) param [0,[]])) then {" \n
+ " {" \n
+ " player setHitIndex [_forEachIndex, _x];" \n
+ " }forEach EPOCH_playerHitPoints;" \n
+ "};" \n
+ "" \n
+ "[] spawn EPOCH_masterLoop_v2;" \n
+ "true call EPOCH_fnc_Weather;" \n
+ "[5,100] spawn EPOCH_niteLight;" \n
+ "" \n
+ "if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Setup EH's"";" \n
+ "};" \n
+ "" \n
+ """Loading... Please wait!"" call Epoch_updateLoadingScreen;" \n
+ "progressLoadingScreen 0.9;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Has_Current_Weap
+ {
+ itemno = 53;
+ priority = 10.000000;
+ to="Find_Active_Weap";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_currentWeapon != """""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class no_weapons
+ {
+ itemno = 51;
+ priority = 0.000000;
+ to="Process";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_currentWeapon == """""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Process
+ {
+ name = "Process";
+ itemno = 52;
+ init = /*%FSM*/"progressLoadingScreen 0.975;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Preload_done
+ {
+ itemno = 29;
+ priority = 0.000000;
+ to="FINISH";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"preloadCamera (getposATL player)"/*%FSM*/;
+ action=/*%FSM*/"call compile _playerGroupOnline;"/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Find_Active_Weap
+ {
+ name = "Find_Active_Weap";
+ itemno = 54;
+ init = /*%FSM*/"_activeWeapon = currentWeapon player;" \n
+ "progressLoadingScreen 0.95;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Current_Weapon_S
+ {
+ itemno = 56;
+ priority = 0.000000;
+ to="Do_nothing";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_activeWeapon == _currentWeapon"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Current_Weapon_Not
+ {
+ itemno = 55;
+ priority = 0.000000;
+ to="Select_Weapon";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_activeWeapon != _currentWeapon"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Select_Weapon
+ {
+ name = "Select_Weapon";
+ itemno = 57;
+ init = /*%FSM*/"_currentWeapon spawn {" \n
+ " uiSleep 1; " \n
+ " player selectWeapon _this;" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 58;
+ priority = 0.000000;
+ to="Process";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Do_nothing
+ {
+ name = "Do_nothing";
+ itemno = 59;
+ init = /*%FSM*/""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 58;
+ priority = 0.000000;
+ to="Process";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Check_New_Player
+ {
+ name = "Check_New_Player";
+ itemno = 60;
+ init = /*%FSM*/"_myTime = diag_tickTime;" \n
+ "" \n
+ "// player reveal [_playerObject, 4];" \n
+ "" \n
+ "" \n
+ """Loading Player Inventory... Please wait!"" call Epoch_updateLoadingScreen;" \n
+ "progressLoadingScreen 0.6;" \n
+ ""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Wait_mag_count_m
+ {
+ itemno = 61;
+ priority = 0.000000;
+ to="Setup_Player_Obj";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_magCount == count (magazines _playerObject)"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Timeout_No_Respo
+ {
+ itemno = 15;
+ priority = 0.000000;
+ to="ERROR_Server_not";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"(diag_tickTime - _myTime) > 120"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Process_1
+ {
+ name = "Process_1";
+ itemno = 63;
+ init = /*%FSM*/""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Wait_ArmA_Loading
+ {
+ itemno = 64;
+ priority = 0.000000;
+ to="Start_Loading_Sc";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"{!isnull _x} count ((uinamespace getvariable ""loading_displays"") - [finddisplay 18]) == 0"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Start_Loading_Sc
+ {
+ name = "Start_Loading_Sc";
+ itemno = 65;
+ init = /*%FSM*/"startLoadingScreen ["""",""EpochLoadingScreen""];" \n
+ "if (_debug) then {" \n
+ " diag_log ""EPOCH-LOGIN: Start Loadingscreen"";" \n
+ "};" \n
+ """Starting Epoch... Please wait!"" call Epoch_updateLoadingScreen;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 2;
+ priority = 0.000000;
+ to="Version_Check";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Update_Loadingscreen
+ {
+ name = "Update_Loadingscreen";
+ itemno = 67;
+ init = /*%FSM*/"uiNamespace setVariable ['Epoch_freshServer', false];" \n
+ "" \n
+ """Server initializing... Please wait!"" call Epoch_updateLoadingScreen;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 68;
+ priority = 0.000000;
+ to="Check_Server_1";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Player_Setup
+ {
+ name = "ERROR_Player_Setup";
+ itemno = 70;
+ init = /*%FSM*/"_msg = ""Problem setting up player"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_InvaildSetup = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_InvaildSetup"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Server_Version_C
+ {
+ name = "Server_Version_C";
+ itemno = 72;
+ init = /*%FSM*/""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Wrong_Server_Ver
+ {
+ itemno = 23;
+ priority = 10.000000;
+ to="ERROR_Wrong_Server";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"Epoch_ServerVersion != getText(configFile >> ""CfgMods"" >> ""Epoch"" >> ""version"")"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Version_Okay
+ {
+ itemno = 73;
+ priority = 0.000000;
+ to="Request_Hive";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Server_not_3
+ {
+ name = "ERROR_Server_not_3";
+ itemno = 75;
+ init = /*%FSM*/"_msg = ""Authentication Failed, Disconnect and try again"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_HiveNotResponse = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_HiveNotResponse"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Process_2
+ {
+ name = "Process_2";
+ itemno = 80;
+ init = /*%FSM*/""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class new_character
+ {
+ itemno = 77;
+ priority = 10.000000;
+ to="Open_Gender_Selection";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"_newChar"/*%FSM*/;
+ action=/*%FSM*/"endLoadingScreen;" \n
+ "_myGenderTime = diag_tickTime;"/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class load_old_charact
+ {
+ itemno = 79;
+ priority = 0.000000;
+ to="Process_3";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/""/*%FSM*/;
+ action=/*%FSM*/"_myTime = diag_tickTime;"/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Open_Gender_Selection
+ {
+ name = "Open_Gender_Selection";
+ itemno = 81;
+ init = /*%FSM*/"createdialog ""SelectGender"";"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Gender_Selected
+ {
+ itemno = 83;
+ priority = 10.000000;
+ to="Send_character_s";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"!isNil ""EPOCH_PlayerIsMale"""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Timeout
+ {
+ itemno = 84;
+ priority = 0.000000;
+ to="Send_character_s";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"((diag_tickTime - _myGenderTime) > 30)"/*%FSM*/;
+ action=/*%FSM*/"EPOCH_PlayerIsMale = true;" \n
+ "closeDialog 0;"/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Reopen_when_client
+ {
+ itemno = 82;
+ priority = 0.000000;
+ to="Open_Gender_Selection";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"!dialog && isNil ""EPOCH_PlayerIsMale"""/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Send_character_s
+ {
+ name = "Send_character_s";
+ itemno = 85;
+ init = /*%FSM*/"startLoadingScreen ["""",""EpochLoadingScreen""];" \n
+ """Gender Selected... Please wait!"" call Epoch_updateLoadingScreen;" \n
+ "" \n
+ "" \n
+ "EPOCH_selectedGender_PVS = [player,EPOCH_PlayerIsMale];" \n
+ "publicVariableServer ""EPOCH_selectedGender_PVS"";" \n
+ "EPOCH_selectedGender_PVS = nil;" \n
+ "EPOCH_PlayerIsMale = nil;"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class load_old_charact
+ {
+ itemno = 79;
+ priority = 0.000000;
+ to="Process_3";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/""/*%FSM*/;
+ action=/*%FSM*/"_myTime = diag_tickTime;"/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Process_3
+ {
+ name = "Process_3";
+ itemno = 86;
+ init = /*%FSM*/""/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class Timeout_No_Respo
+ {
+ itemno = 22;
+ priority = 0.000000;
+ to="ERROR_Server_not_4";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"(diag_tickTime - _myTime) > 120"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class Response
+ {
+ itemno = 16;
+ priority = 0.000000;
+ to="Check_New_Player";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"!isNil ""EPOCH_C_SET"""/*%FSM*/;
+ action=/*%FSM*/"_array = EPOCH_C_SET;" \n
+ "EPOCH_C_SET = nil;" \n
+ "_playerObject = _array deleteAt 0;" \n
+ "_playerVariables = _array deleteAt 0;" \n
+ "_currentWeapon = _array deleteAt 0;" \n
+ "_magCount = _array deleteAt 0;" \n
+ "Epoch_my_GroupUID = _array deleteAt 0;" \n
+ "Epoch_canBeRevived = _array deleteAt 0;" \n
+ "Epoch_personalToken = _array deleteAt 0;" \n
+ "reverse _serverUptime;" \n
+ "_serverUptime pushBack (_array deleteAt 0);" \n
+ "reverse _serverUptime;" \n
+ "_serverUptime call EPOCH_client_publicEH;" \n
+ "_playerGroupOnline = _array deleteAt 0;" \n
+ "" \n
+ ""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
+ /*%FSM*/
+ class ERROR_Server_not_4
+ {
+ name = "ERROR_Server_not_4";
+ itemno = 87;
+ init = /*%FSM*/"_msg = ""Authentication Failed, Disconnect and try again"";" \n
+ "_msg call Epoch_updateLoadingScreen;" \n
+ "diag_log _msg;" \n
+ "" \n
+ "_rejectPlayer = {" \n
+ " PLAYER_REJECT_HiveLoadChar = true;" \n
+ " publicVariableServer ""PLAYER_REJECT_HiveLoadChar"";" \n
+ "};"/*%FSM*/;
+ precondition = /*%FSM*/""/*%FSM*/;
+ class Links
+ {
+ /*%FSM*/
+ class true
+ {
+ itemno = 32;
+ priority = 0.000000;
+ to="Display_Message";
+ precondition = /*%FSM*/""/*%FSM*/;
+ condition=/*%FSM*/"true"/*%FSM*/;
+ action=/*%FSM*/""/*%FSM*/;
+ };
+ /*%FSM*/
+ };
+ };
+ /*%FSM*/
};
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class FINISH
- {
- name = "FINISH";
- init = /*%FSM*/"[] spawn {" \n
- " waitUntil{!isNull (findDisplay 46)};" \n
- " (findDisplay 46) displayAddEventHandler [""KeyDown"",""_this call EPOCH_KeyDown""];" \n
- "};" \n
- "" \n
- "3 fadeSound 1;" \n
- "" \n
- "if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Finish!"";" \n
- "};" \n
- "" \n
- "" \n
- "player enableSimulation true;" \n
- "" \n
- "titleCut ["""", ""BLACK IN"", 1];" \n
- "1338 cutText ["""",""PLAIN"",0]; " \n
- "" \n
- "progressLoadingScreen 1.0;" \n
- "" \n
- "endLoadingScreen;" \n
- "EPOCH_loadingScreenDone = true;" \n
- "" \n
- "player switchMove """";"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Version_Check
- {
- name = "Version_Check";
- init = /*%FSM*/"if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Version Check"";" \n
- "};" \n
- "" \n
- "// SHOULD BE:" \n
- "_epoch_assets0 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_assets"");" \n
- "_epoch_assets1 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_assets_1"");" \n
- "_epoch_assets2 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""epoch_objects"");" \n
- "_epoch_assets3 = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_assets_3"");" \n
- "_epoch_config = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_config"");" \n
- "_epoch_language = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_language"");" \n
- "_epoch_underground = getText(configFile >> ""Epoch"" >> ""Version"" >> ""Underground_Epoch"");" \n
- "_epoch_vehicles = getText(configFile >> ""Epoch"" >> ""Version"" >> ""A3_epoch_vehicles"");" \n
- "_epoch_weapons = getText(configFile >> ""Epoch"" >> ""Version"" >> ""a3_epoch_weapons"");" \n
- "" \n
- "" \n
- "// IS:" \n
- "_my_epoch_assets0 = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_assets"" >> ""epochVersion"");" \n
- "_my_epoch_assets1 = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_assets_1"" >> ""epochVersion"");" \n
- "_my_epoch_assets2 = getText(configFile >> ""CfgPatches"" >> ""epoch_objects"" >> ""epochVersion"");" \n
- "_my_epoch_assets3 = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_assets_3"" >> ""epochVersion"");" \n
- "_my_epoch_config = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_config"" >> ""epochVersion"");" \n
- "_my_epoch_language = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_language"" >> ""epochVersion"");" \n
- "_my_epoch_underground = getText(configFile >> ""CfgPatches"" >> ""Underground_Epoch"" >> ""epochVersion"");" \n
- "_my_epoch_vehicles = getText(configFile >> ""CfgPatches"" >> ""A3_epoch_vehicles"" >> ""epochVersion"");" \n
- "_my_epoch_weapons = getText(configFile >> ""CfgPatches"" >> ""a3_epoch_weapons"" >> ""epochVersion"");" \n
- "" \n
- "progressLoadingScreen 0.1;" \n
- ""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Wrong_Version
+ initState="INIT";
+ finalStates[] =
{
- priority = 10.000000;
- to="ERROR_Wrong_Version";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_epoch_assets0 != _epoch_assets0 ||" \n
- "_my_epoch_assets1 != _epoch_assets1 ||" \n
- "_my_epoch_assets2 != _epoch_assets2 ||" \n
- "_my_epoch_assets3 != _epoch_assets3 ||" \n
- "_my_epoch_config != _epoch_config ||" \n
- "_my_epoch_language != _epoch_language ||" \n
- "_my_epoch_underground != _epoch_underground ||" \n
- "_my_epoch_vehicles != _epoch_vehicles ||" \n
- "_my_epoch_weapons != _epoch_weapons"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
+ "FINISH",
+ "Reject_without_B",
};
- /*%FSM*/
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Arma_Version_Che";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Check_Player_UID
- {
- name = "Check_Player_UID";
- init = /*%FSM*/"if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Check PlayerUID"";" \n
- "};" \n
- "" \n
- "_playerUID = getPlayerUID player;" \n
- "" \n
- "progressLoadingScreen 0.2;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class PlayerUID_Okay
- {
- priority = 10.000000;
- to="Check_Server_1";
- precondition = /*%FSM*/"!isNil ""_playerUID"""/*%FSM*/;
- condition=/*%FSM*/"_playerUID != """""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Empty_PlayerUID
- {
- priority = 0.000000;
- to="ERROR_PlayerUID";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Wrong_Version
- {
- name = "ERROR_Wrong_Version";
- init = /*%FSM*/"_msg = ""You have an outdated version of Epoch"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_EPOCHVERSION = true;" \n
- " publicVariableServer ""PLAYER_REJECT_EPOCHVERSION"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Disconnect
- {
- name = "Disconnect";
- init = /*%FSM*/"endLoadingScreen;" \n
- "1338 cutText [_msg,""PLAIN"",0]; " \n
- "deleteVehicle player;" \n
- "call _rejectPlayer;" \n
- "diag_log format [""(%1) %2"",diag_tickTime,_msg];" \n
- "_myTime = diag_tickTime;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Check_if_Player
- {
- priority = 0.000000;
- to="Reject_without_B";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"(diag_tickTime - _myTime) > 2"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_PlayerUID
- {
- name = "ERROR_PlayerUID";
- init = /*%FSM*/"_msg = ""Can not setup Player Object! (Error 01)"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_UID = true;" \n
- " publicVariableServer ""PLAYER_REJECT_UID"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Setup_Player_Var
- {
- name = "Setup_Player_Var";
- init = /*%FSM*/"diag_log format[""DEBUG TIME WAITED: %1"", (diag_tickTime - _myTime)];" \n
- "{" \n
- " missionNamespace setVariable[(format[""EPOCH_player%1"", EPOCH_customVars select _forEachIndex]), _x];" \n
- "} forEach _playerVariables;" \n
- "" \n
- """Loading Player Variables... Please wait!"" call Epoch_updateLoadingScreen;" \n
- "" \n
- "EPOCH_lastPlayerPos = getPosATL vehicle player;" \n
- "" \n
- "progressLoadingScreen 0.7;" \n
- "" \n
- "if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Setup Player Variables"";" \n
- "};" \n
- ""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Setup_EH_s_and_H";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Request_Hive
- {
- name = "Request_Hive";
- init = /*%FSM*/"_myTime = diag_tickTime;" \n
- "" \n
- "Epoch_my_Group = [];" \n
- "" \n
- "EPOCH_checkPlayer_PVS = player;" \n
- "publicVariableServer ""EPOCH_checkPlayer_PVS"";" \n
- "" \n
- "" \n
- """Loading Player Data... Please wait!"" call Epoch_updateLoadingScreen;" \n
- "progressLoadingScreen 0.5;" \n
- ""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Hive_Response
- {
- priority = 0.000000;
- to="Process_2";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"!isNil ""EPOCH_checkPlayer_PVC"""/*%FSM*/;
- action=/*%FSM*/"_newChar = EPOCH_checkPlayer_PVC;" \n
- "EPOCH_checkPlayer_PVC = nil;"/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Timeout_No_Respo
- {
- priority = 0.000000;
- to="ERROR_Server_not_3";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"(diag_tickTime - _myTime) > 120"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Server_not
- {
- name = "ERROR_Server_not";
- init = /*%FSM*/"_msg = ""Authentication Failed, Disconnect and try again"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_NoResponse2 = true;" \n
- " publicVariableServer ""PLAYER_REJECT_NoResponse2"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Wrong_Server
- {
- name = "ERROR_Wrong_Server";
- init = /*%FSM*/"_msg = format[""Server and Client running with different Version! (You: %1 // Server: %2)"",getText(configFile >> ""CfgMods"" >> ""Epoch"" >> ""version""),_serverVersion];" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_ServerVersion = true;" \n
- " publicVariableServer ""PLAYER_REJECT_ServerVersion"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Setup_Player_Obj
- {
- name = "Setup_Player_Obj";
- init = /*%FSM*/"_ply = player;" \n
- "_group = group player;" \n
- "selectPlayer _playerObject;" \n
- "" \n
- "deleteVehicle _ply;" \n
- "deleteGroup _group;" \n
- "" \n
- """Loading Player Body... Please wait!"" call Epoch_updateLoadingScreen;" \n
- "progressLoadingScreen 0.8;" \n
- "" \n
- "if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Setup Player Object"";" \n
- "};" \n
- "" \n
- "_myTime = diag_tickTime;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Timeout_
- {
- priority = 0.000000;
- to="ERROR_Player_Setup";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"(diag_tickTime - _myTime) > 60"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class new_player_____p
- {
- priority = 0.000000;
- to="Setup_Player_Var";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_playerObject == player"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Display_Message
- {
- name = "Display_Message";
- init = /*%FSM*/"[] spawn {" \n
- " waitUntil{!isNull (findDisplay 46)};" \n
- " (findDisplay 46) displayAddEventHandler [""KeyDown"",""true""];" \n
- "};" \n
- "diag_log format [""(%1) %2"",diag_tickTime,_msg];" \n
- "_myTime = diag_tickTime;" \n
- ""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Display_Message
- {
- priority = 0.000000;
- to="Disconnect";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"(diag_tickTime - _myTime) > 10"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Check_Server
- {
- name = "Check_Server";
- init = /*%FSM*/"_myTime = diag_tickTime;" \n
- "if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Check Server"";" \n
- "};" \n
- """Checking Server... Please wait!"" call Epoch_updateLoadingScreen;" \n
- "progressLoadingScreen 0.4;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Server_not_worki
- {
- priority = 10.000000;
- to="ERROR_Server_not_1";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"!isNil ""EPOCH_BADHIVE""" \n
- ""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Server_Okay
- {
- priority = 0.000000;
- to="Server_Version_C";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"!isNil ""Epoch_ServerVersion"""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Server_not_1
- {
- name = "ERROR_Server_not_1";
- init = /*%FSM*/"_msg = ""Server not Ready (Error 03)"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_NotReady2 = true;" \n
- " publicVariableServer ""PLAYER_REJECT_NotReady2"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Check_Server_1
- {
- name = "Check_Server_1";
- init = /*%FSM*/"progressLoadingScreen 0.3;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Timeout_No_Respo
- {
- priority = 0.000000;
- to="ERROR_Server_not_2";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"(diag_tickTime - _myTime) > 180"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class freshServer
- {
- priority = 0.000000;
- to="Update_Loadingscreen";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"uiNamespace getVariable ['Epoch_freshServer', false]"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Server_Ready
- {
- priority = 0.000000;
- to="Check_Server";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"!isNil ""EPOCH_SERVER"""/*%FSM*/;
- action=/*%FSM*/"_serverUptime = EPOCH_SERVER;" \n
- "EPOCH_SERVER = nil;"/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Server_not_2
- {
- name = "ERROR_Server_not_2";
- init = /*%FSM*/"_msg = ""Server not Ready (Error 02)"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_NotReady1 = true;" \n
- " publicVariableServer ""PLAYER_REJECT_NotReady1"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Reject_without_B
- {
- name = "Reject_without_B";
- init = /*%FSM*/"[] spawn {" \n
- " waitUntil{!isNull (findDisplay 46)};" \n
- " waitUntil {" \n
- " (findDisplay 46) closeDisplay 0;" \n
- " isNull (findDisplay 46)" \n
- " };" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Arma_Version_Che
- {
- name = "Arma_Version_Che";
- init = /*%FSM*/"progressLoadingScreen 0.15;" \n
- ""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Outdated_Version
- {
- priority = 10.000000;
- to="ERROR_Wrong_Version_1";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"productVersion select 2 < getNumber(configFile >> ""CfgMods"" >> ""Epoch"" >> ""ArmAVersion"")"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Player_Object_Re
- {
- priority = 0.000000;
- to="Check_Player_UID";
- precondition = /*%FSM*/"!isNull player"/*%FSM*/;
- condition=/*%FSM*/"player == player"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Wrong_Version_1
- {
- name = "ERROR_Wrong_Version_1";
- init = /*%FSM*/"_msg = ""You have an outdated version of ArmA 3"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_ARMAVERSION = true;" \n
- " publicVariableServer ""PLAYER_REJECT_ARMAVERSION"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Setup_EH_s_and_H
- {
- name = "Setup_EH_s_and_H";
- init = /*%FSM*/"player addEventHandler [""Respawn"", {(_this select 0) call EPOCH_clientRespawn}];" \n
- "player addEventHandler [""Put"", {(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler}];" \n
- "player addEventHandler [""Take"", {(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck}];" \n
- "player addEventHandler [""InventoryClosed"", {if !(EPOCH_arr_interactedObjs isEqualTo[]) then {EPOCH_arr_interactedObjs remoteExec[""EPOCH_server_save_vehicles"", 2]; EPOCH_arr_interactedObjs = [];};}];" \n
- "player addEventHandler [""InventoryOpened"", {_this spawn EPOCH_initUI; (locked (_this select 1) in [2, 3])}];" \n
- "player addEventHandler [""Fired"", {_this call EPOCH_fnc_playerFired}];" \n
- "player addEventHandler [""Killed"", {_this call EPOCH_fnc_playerDeath}];" \n
- "" \n
- "if (count EPOCH_playerHitPoints isEqualTo count ((getAllHitPointsDamage player) param [0,[]])) then {" \n
- " {" \n
- " player setHitIndex [_forEachIndex, _x];" \n
- " }forEach EPOCH_playerHitPoints;" \n
- "};" \n
- "" \n
- "[] spawn EPOCH_masterLoop;" \n
- "true call EPOCH_fnc_Weather;" \n
- "[5,100] spawn EPOCH_niteLight;" \n
- "" \n
- "if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Setup EH's"";" \n
- "};" \n
- "" \n
- """Loading... Please wait!"" call Epoch_updateLoadingScreen;" \n
- "progressLoadingScreen 0.9;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Has_Current_Weap
- {
- priority = 10.000000;
- to="Find_Active_Weap";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_currentWeapon != """""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class no_weapons
- {
- priority = 0.000000;
- to="Process";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_currentWeapon == """""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Process
- {
- name = "Process";
- init = /*%FSM*/"progressLoadingScreen 0.975;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Preload_done
- {
- priority = 0.000000;
- to="FINISH";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"preloadCamera (getposATL player)"/*%FSM*/;
- action=/*%FSM*/"call compile _playerGroupOnline;"/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Find_Active_Weap
- {
- name = "Find_Active_Weap";
- init = /*%FSM*/"_activeWeapon = currentWeapon player;" \n
- "progressLoadingScreen 0.95;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Current_Weapon_S
- {
- priority = 0.000000;
- to="Do_nothing";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_activeWeapon == _currentWeapon"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Current_Weapon_Not
- {
- priority = 0.000000;
- to="Select_Weapon";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_activeWeapon != _currentWeapon"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Select_Weapon
- {
- name = "Select_Weapon";
- init = /*%FSM*/"_currentWeapon spawn {" \n
- " uiSleep 1; " \n
- " player selectWeapon _this;" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Process";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Do_nothing
- {
- name = "Do_nothing";
- init = /*%FSM*/""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Process";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Check_New_Player
- {
- name = "Check_New_Player";
- init = /*%FSM*/"_myTime = diag_tickTime;" \n
- "" \n
- "// player reveal [_playerObject, 4];" \n
- "" \n
- "" \n
- """Loading Player Inventory... Please wait!"" call Epoch_updateLoadingScreen;" \n
- "progressLoadingScreen 0.6;" \n
- ""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Wait_mag_count_m
- {
- priority = 0.000000;
- to="Setup_Player_Obj";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_magCount == count (magazines _playerObject)"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Timeout_No_Respo
- {
- priority = 0.000000;
- to="ERROR_Server_not";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"(diag_tickTime - _myTime) > 120"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Process_1
- {
- name = "Process_1";
- init = /*%FSM*/""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Wait_ArmA_Loading
- {
- priority = 0.000000;
- to="Start_Loading_Sc";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"{!isnull _x} count ((uinamespace getvariable ""loading_displays"") - [finddisplay 18]) == 0"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Start_Loading_Sc
- {
- name = "Start_Loading_Sc";
- init = /*%FSM*/"startLoadingScreen ["""",""EpochLoadingScreen""];" \n
- "if (_debug) then {" \n
- " diag_log ""EPOCH-LOGIN: Start Loadingscreen"";" \n
- "};" \n
- """Starting Epoch... Please wait!"" call Epoch_updateLoadingScreen;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Version_Check";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Update_Loadingscreen
- {
- name = "Update_Loadingscreen";
- init = /*%FSM*/"uiNamespace setVariable ['Epoch_freshServer', false];" \n
- "" \n
- """Server initializing... Please wait!"" call Epoch_updateLoadingScreen;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Check_Server_1";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Player_Setup
- {
- name = "ERROR_Player_Setup";
- init = /*%FSM*/"_msg = ""Problem setting up player"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_InvaildSetup = true;" \n
- " publicVariableServer ""PLAYER_REJECT_InvaildSetup"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Server_Version_C
- {
- name = "Server_Version_C";
- init = /*%FSM*/""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Wrong_Server_Ver
- {
- priority = 10.000000;
- to="ERROR_Wrong_Server";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"Epoch_ServerVersion != getText(configFile >> ""CfgMods"" >> ""Epoch"" >> ""version"")"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Version_Okay
- {
- priority = 0.000000;
- to="Request_Hive";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Server_not_3
- {
- name = "ERROR_Server_not_3";
- init = /*%FSM*/"_msg = ""Authentication Failed, Disconnect and try again"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_HiveNotResponse = true;" \n
- " publicVariableServer ""PLAYER_REJECT_HiveNotResponse"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Process_2
- {
- name = "Process_2";
- init = /*%FSM*/""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class new_character
- {
- priority = 10.000000;
- to="Open_Gender_Selection";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"_newChar"/*%FSM*/;
- action=/*%FSM*/"endLoadingScreen;" \n
- "_myGenderTime = diag_tickTime;"/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class load_old_charact
- {
- priority = 0.000000;
- to="Process_3";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/""/*%FSM*/;
- action=/*%FSM*/"_myTime = diag_tickTime;"/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Open_Gender_Selection
- {
- name = "Open_Gender_Selection";
- init = /*%FSM*/"createdialog ""SelectGender"";"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Gender_Selected
- {
- priority = 10.000000;
- to="Send_character_s";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"!isNil ""EPOCH_PlayerIsMale"""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Timeout
- {
- priority = 0.000000;
- to="Send_character_s";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"((diag_tickTime - _myGenderTime) > 30)"/*%FSM*/;
- action=/*%FSM*/"EPOCH_PlayerIsMale = true;" \n
- "closeDialog 0;"/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Reopen_when_client
- {
- priority = 0.000000;
- to="Open_Gender_Selection";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"!dialog && isNil ""EPOCH_PlayerIsMale"""/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Send_character_s
- {
- name = "Send_character_s";
- init = /*%FSM*/"startLoadingScreen ["""",""EpochLoadingScreen""];" \n
- """Gender Selected... Please wait!"" call Epoch_updateLoadingScreen;" \n
- "" \n
- "" \n
- "EPOCH_selectedGender_PVS = [player,EPOCH_PlayerIsMale];" \n
- "publicVariableServer ""EPOCH_selectedGender_PVS"";" \n
- "EPOCH_selectedGender_PVS = nil;" \n
- "EPOCH_PlayerIsMale = nil;"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class load_old_charact
- {
- priority = 0.000000;
- to="Process_3";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/""/*%FSM*/;
- action=/*%FSM*/"_myTime = diag_tickTime;"/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class Process_3
- {
- name = "Process_3";
- init = /*%FSM*/""/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class Timeout_No_Respo
- {
- priority = 0.000000;
- to="ERROR_Server_not_4";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"(diag_tickTime - _myTime) > 120"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- /*%FSM*/
- class Response
- {
- priority = 0.000000;
- to="Check_New_Player";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"!isNil ""EPOCH_C_SET"""/*%FSM*/;
- action=/*%FSM*/"_array = EPOCH_C_SET;" \n
- "EPOCH_C_SET = nil;" \n
- "_playerObject = _array deleteAt 0;" \n
- "_playerVariables = _array deleteAt 0;" \n
- "_currentWeapon = _array deleteAt 0;" \n
- "_magCount = _array deleteAt 0;" \n
- "Epoch_my_GroupUID = _array deleteAt 0;" \n
- "Epoch_canBeRevived = _array deleteAt 0;" \n
- "Epoch_personalToken = _array deleteAt 0;" \n
- "reverse _serverUptime;" \n
- "_serverUptime pushBack (_array deleteAt 0);" \n
- "reverse _serverUptime;" \n
- "_serverUptime call EPOCH_client_publicEH;" \n
- "_playerGroupOnline = _array deleteAt 0;" \n
- "" \n
- ""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- /*%FSM*/
- class ERROR_Server_not_4
- {
- name = "ERROR_Server_not_4";
- init = /*%FSM*/"_msg = ""Authentication Failed, Disconnect and try again"";" \n
- "_msg call Epoch_updateLoadingScreen;" \n
- "diag_log _msg;" \n
- "" \n
- "_rejectPlayer = {" \n
- " PLAYER_REJECT_HiveLoadChar = true;" \n
- " publicVariableServer ""PLAYER_REJECT_HiveLoadChar"";" \n
- "};"/*%FSM*/;
- precondition = /*%FSM*/""/*%FSM*/;
- class Links
- {
- /*%FSM*/
- class true
- {
- priority = 0.000000;
- to="Display_Message";
- precondition = /*%FSM*/""/*%FSM*/;
- condition=/*%FSM*/"true"/*%FSM*/;
- action=/*%FSM*/""/*%FSM*/;
- };
- /*%FSM*/
- };
- };
- /*%FSM*/
- };
- initState="INIT";
- finalStates[] =
- {
- "FINISH",
- "Reject_without_B",
- };
};
-/*%FSM*/
\ No newline at end of file
+/*%FSM*/
diff --git a/Sources/epoch_code/compile/EPOCH_consumeItem.sqf b/Sources/epoch_code/compile/EPOCH_consumeItem.sqf
index b9b73f87a..03ad65683 100644
--- a/Sources/epoch_code/compile/EPOCH_consumeItem.sqf
+++ b/Sources/epoch_code/compile/EPOCH_consumeItem.sqf
@@ -94,11 +94,8 @@ switch _interactOption do {
if (_buildClass != "") then {
_isStorage = getNumber(configfile >> "CfgMagazines" >> _item >> "isStorage");
- _isOk = if (_isStorage == 1) then { EPOCH_StorageSlotsCount > 0 } else { EPOCH_BuildingSlotCount > 0 };
+ _isOk = if (_isStorage == 1 || _buildClass isKindOf "Secure_Storage_Temp") then { EPOCH_StorageSlotsCount > 0 } else { EPOCH_BuildingSlotCount > 0 };
- if (_buildClass isKindOf "Secure_Storage_Temp") then {
- _isOk = (EPOCH_StorageSlotsCount > 0 && EPOCH_BuildingSlotCount > 0);
- };
if (isNil "EPOCH_simulSwap_Lock") then {
if !(isNil "_isOk") then {
if (_isOk) then {
diff --git a/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf b/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf
index 96607614c..481e7616f 100644
--- a/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf
+++ b/Sources/epoch_code/compile/EPOCH_onEachFrame.sqf
@@ -1,4 +1,3 @@
-
if (EPOCH_velTransform) then {
if (EPOCH_playerEnergy > 0) then {
_pos1 = getPosASL EPOCH_target;
@@ -23,7 +22,6 @@ if (EPOCH_velTransform) then {
EPOCH_velTransform = false;
};
};
-
if (!isNull EPOCH_currentTarget && vehicle player == player) then {
_currentTarget = EPOCH_currentTarget;
@@ -32,20 +30,27 @@ if (!isNull EPOCH_currentTarget && vehicle player == player) then {
_stability = 0;
_color = [1, 1, 1, 0.7];
- _text = "";
+ _text = format ["Hold (%1)",EPOCH_keysAction call BIS_fnc_keyCode];
_icon = "\x\addons\a3_epoch_code\Data\UI\ui_question_ca.paa";
_interactOption = getNumber(configFile >> "cfgVehicles" >> typeOf _currentTarget >> "interactMode");
switch _interactOption do {
case 0: {
- _text = "Press (Inventory)";
- _stability = 100 - round(damage _currentTarget) * 10;
+ _stability = 100 - round(damage _currentTarget * 100);
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";
+ _text = "Press (Inventory)";
+
+ if (_stability < 50) then {
+ _color = [1, 0.5, 0, 0.7];
+ if (_stability < 25) then {
+ _color = [1, 0, 0, 0.7];
+ };
+ };
};
case 1: {
- _text = if (EPOCH_buildMode > 0) then[{"Press (Space)"}, { "Enable Build - Press (1)" }];
- _stability = _currentTarget getVariable["stability", 100];
+ _text = if (EPOCH_buildMode > 0) then[{_text}, { format ["Press (%1)",EPOCH_keysBuildMode1 call BIS_fnc_keyCode] }];
+ _stability = if (EPOCH_buildMode > 0) then[{_currentTarget getVariable["stability", 100]}, {100 - round(damage _currentTarget * 100)}];
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";
if (_stability < 50) then {
@@ -57,8 +62,8 @@ if (!isNull EPOCH_currentTarget && vehicle player == player) then {
};
case 2: {
if (alive _currentTarget) then{
- _text = format["%1 - Press (Ctrl+T)", if (isStreamFriendlyUIEnabled) then[{"Player"}, { name _currentTarget }]];
- _stability = 100 - round(damage _currentTarget) * 10;
+ _text = format["%1 - Press (Ctrl+%2)", if (isStreamFriendlyUIEnabled) then[{"Player"}, { name _currentTarget }],EPOCH_keysAcceptTrade call BIS_fnc_keyCode];
+ _stability = 100 - round(damage _currentTarget * 100);
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";
if (_stability < 50) then{
@@ -69,19 +74,20 @@ if (!isNull EPOCH_currentTarget && vehicle player == player) then {
};
} else {
- _text = "Press (Inventory)";
+ //_text = "Press (Inventory)";
_icon = "\x\addons\a3_epoch_code\Data\UI\ui_crossbones_ca.paa";
};
};
case 3: {
if (!alive _currentTarget && _distance < 2) then{
- _text = "Gut Animal - Press (Inventory)";
+ _text = format ["Gut Animal - %1",_text];
_icon = "\x\addons\a3_epoch_code\Data\UI\ui_crossbones_ca.paa";
};
};
case 4: {
- _text = if (EPOCH_buildMode > 0) then[{"Press (Space)"}, { "Press (Inventory)" }];
- _stability = _currentTarget getVariable["stability", 100];
+ //_text = if (EPOCH_buildMode > 0) then[{"Press (Space)"}, { "Press (Inventory)" }];
+ _text = if (EPOCH_buildMode > 0) then[{_text}, { format ["Press (%1) or (Inventory)",EPOCH_keysBuildMode1 call BIS_fnc_keyCode] }];
+ _stability = if (EPOCH_buildMode > 0) then[{_currentTarget getVariable["stability", 100]}, {100 - round(damage _currentTarget * 100)}];
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";
if (_stability < 50) then{
@@ -94,7 +100,7 @@ if (!isNull EPOCH_currentTarget && vehicle player == player) then {
};
if (!isNull EPOCH_stabilityTarget) then {
- if (cursorTarget != EPOCH_stabilityTarget) then {
+ if (([10] call EPOCH_fnc_cursorTarget) != EPOCH_stabilityTarget) then {
EPOCH_stabilityTarget = objNull;
}
else {
@@ -120,7 +126,7 @@ if (!isNull EPOCH_currentTarget && vehicle player == player) then {
_pos = visiblePositionASL _currentTarget;
_pos set[2, (_currentTarget modelToWorld[0, 0, 0]) select 2];
- _size = 3;
+ _size = 2.5;
drawIcon3D[format[_icon, _stability], _color, _pos, _size, _size, 0, _text, 0, _size / 60, "PuristaMedium"];
};
}
@@ -128,6 +134,7 @@ else {
EPOCH_stabilityTarget = objNull;
};
+
if (EPOCH_drawIcon3d) then {
{
if (!isPlayer _x) then {
@@ -146,6 +153,17 @@ if (EPOCH_drawIcon3d) then {
};
}forEach EPOCH_arr_countdown;
};
+
+{
+ _distance = player distance _x;
+ if (_distance < 9) then {
+ _pos = _x;
+ _color = [1, 1, 1, 0.7];
+ _size = 1;
+ drawIcon3D["x\addons\a3_epoch_code\Data\UI\snap_ca.paa", _color, _pos, _size, _size, 0, "", 1, _size / 60, "PuristaMedium"];
+ };
+}forEach EPOCH_arr_snapPoints;
+
{
if (!isNull _x) then {
_pos = visiblePositionASL _x;
diff --git a/Sources/epoch_code/compile/building/EPOCH_QuickUpgrade.sqf b/Sources/epoch_code/compile/building/EPOCH_QuickUpgrade.sqf
deleted file mode 100644
index b3cb5611b..000000000
--- a/Sources/epoch_code/compile/building/EPOCH_QuickUpgrade.sqf
+++ /dev/null
@@ -1,35 +0,0 @@
-_target = param [0,objNull];
-if (!isNull _target) then {
-
- _targetClass = typeOf _target;
-
- _config = 'CfgBaseBuilding' call EPOCH_returnConfig;
-
- _recipes = getArray(_config >> _targetClass >> "upgradeBuilding");
- if !(_recipes isEqualTo []) then {
-
- createDialog "QuickUpgrade";
- {
- _upgradeClass = _x select 0;
- _upgradeRecipe = _x select 1;
- _index = lbAdd[1500, getText(configfile >> "CfgVehicles" >> _upgradeClass >> "DisplayName")];
- lbSetData[1500, _index, _upgradeClass];
- lbSetValue[1500, _index, _forEachIndex];
-
- _toolTip = "";
- {
- _recipeClass = _x;
- _recipeQty = 1;
- if (typeName _recipeClass == "ARRAY") then {
- _recipeClass = _x select 0;
- _recipeQty = _x select 1;
- };
- _toolTip = _toolTip + format["%1 x %2, ",_recipeQty,getText(configfile >> "CfgMagazines" >> _recipeClass >> "DisplayName")];
- } forEach _upgradeRecipe;
- lbSetTooltip [1500, _index, _toolTip];
-
- } foreach _recipes;
-
- };
-
-};
diff --git a/Sources/epoch_code/compile/building/EPOCH_checkBuild.sqf b/Sources/epoch_code/compile/building/EPOCH_checkBuild.sqf
new file mode 100644
index 000000000..27bea9905
--- /dev/null
+++ b/Sources/epoch_code/compile/building/EPOCH_checkBuild.sqf
@@ -0,0 +1,23 @@
+_out = [false, false, false];
+
+if !(isNil "EPOCH_simulSwap_Lock") exitWith{ _out };
+if !(isNull EPOCH_Target) exitWith{ _out };
+
+params ["_object"];
+
+if (isNull _object) exitWith{ _out };
+if ((player distance _object) > 9) exitWith { _out };
+
+if !(EPOCH_buildMode > 0) exitWith {_out};
+if (EPOCH_playerEnergy <= 0) exitWith{ _dt = ["Need energy", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext; _out };
+
+_objType = typeOf _object;
+_config = 'CfgBaseBuilding' call EPOCH_returnConfig;
+
+_out =
+[
+ !(getArray(_config >> _objType >> "upgradeBuilding") isEqualTo []),
+ !(getArray(_config >> _objType >> "removeParts") isEqualTo []),
+ (_object isKindOf "ThingX")
+];
+_out
diff --git a/Sources/epoch_code/compile/building/EPOCH_countdown.sqf b/Sources/epoch_code/compile/building/EPOCH_countdown.sqf
index ea763734f..6d5a8aa09 100644
--- a/Sources/epoch_code/compile/building/EPOCH_countdown.sqf
+++ b/Sources/epoch_code/compile/building/EPOCH_countdown.sqf
@@ -39,16 +39,18 @@ if (!isNull _this) then {
EPOCH_arr_countdown = EPOCH_arr_countdown - [_this];
EPOCH_drawIcon3d = !(EPOCH_arr_countdown isEqualTo []);
-
- if (typeOf _this == "Fireplace_SIM_EPOCH") then {
+ _objClass = typeOf _this;
+ // Spawn temporary static item insead of saving.
+ if (getNumber(configfile >> "CfgVehicles" >> _objClass >> "isTemporary") == 1) then {
_worldspace = [getposATL _this, vectordir _this, vectorup _this];
deleteVehicle _this;
-
+ _class = getText(configfile >> "CfgVehicles" >> _objClass >> "staticClass");
_newObj = createVehicle["Fireplace_EPOCH", (_worldspace select 0), [], 0, "CAN_COLLIDE"];
_newObj setVectorDirAndUp[_worldspace select 1, _worldspace select 2];
_newObj setposATL(_worldspace select 0);
+ // proceed to send save to server
} else {
if (_saveCheck) then {
EPOCH_SAVEBUILD = [_this, player, Epoch_personalToken];
diff --git a/Sources/epoch_code/compile/building/EPOCH_fnc_SelectTarget.sqf b/Sources/epoch_code/compile/building/EPOCH_fnc_SelectTarget.sqf
deleted file mode 100644
index 8d2859008..000000000
--- a/Sources/epoch_code/compile/building/EPOCH_fnc_SelectTarget.sqf
+++ /dev/null
@@ -1,32 +0,0 @@
-private ["_dt","_object","_objType","_dialog","_handled","_config","_upgrade","_remove"];
-
-if !(isNil "EPOCH_simulSwap_Lock") exitWith{ false };
-if !(isNull EPOCH_Target) exitWith{ false };
-if (EPOCH_playerEnergy <= 0) exitWith{ _dt = ["Need energy", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext; false };
-
-_object = _this;
-
-if (isNull _object) exitWith{ false };
-if ((player distance _object) > 9) exitWith { false };
-
-_objType = typeOf _object;
-
-_dialog = "InteractBaseBuilding";
-_handled = createdialog _dialog;
-
-_config = 'CfgBaseBuilding' call EPOCH_returnConfig;
-
-_upgrade = getArray(_config >> _objType >> "upgradeBuilding");
-if (_upgrade isEqualTo[]) then{
- ctrlEnable[2400, false];
-};
-_remove = getArray(_config >> _objType >> "removeParts");
-if (_remove isEqualTo[]) then{
- ctrlEnable[2401, false];
-};
-// disable Move option if not SIM
-if !(_object isKindOf "ThingX") then{
- ctrlEnable[2402, false];
-};
-
-true
diff --git a/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf b/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf
index 2daef10fd..54db82849 100644
--- a/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf
+++ b/Sources/epoch_code/compile/building/EPOCH_maintainIT.sqf
@@ -1,18 +1,37 @@
+if !(isNil "EPOCH_maintainLockout") exitWith {_dt = ["Already Maintaining a base.", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;};
if (EPOCH_playerCrypto > 0) then {
_config = "CfgEpochClient" call EPOCH_returnConfig;
_buildingJammerRange = getNumber(_config >> "buildingJammerRange");
if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; };
- _maintainCount = {(damage _x) > 0} count nearestObjects[_this, ["Constructions_static_F","Constructions_foundation_F","Buildable_Storage","Secure_Storage_Proxy"], _buildingJammerRange];
+ _maintainCount = {(damage _x) > 0} count nearestObjects[_this, ["Constructions_static_F","Constructions_foundation_F","Buildable_Storage","Constructions_lockedstatic_F"], _buildingJammerRange];
+ if (_maintainCount > 0) then {
- if (EPOCH_playerCrypto < _maintainCount) then {
- _maintainCount = EPOCH_playerCrypto;
- };
+ if (EPOCH_playerCrypto < _maintainCount) then {
+ _maintainCount = EPOCH_playerCrypto;
+ };
+
+ _rnd = format ["rmx_var_temp%1%2",floor random 100, ["A","B","C","D","E","F"] select random 5];
+ [_this modelToWorld [0,0,0.2],20,"x\addons\a3_epoch_code\Data\UI\buttons\timer.paa", "Maintaining",60,_rnd] call epoch_gui3dWorldPos;
+
+ EPOCH_maintainLockout = true;
- EPOCH_MAINTBUILD = [_this, player, _maintainCount, Epoch_personalToken];
- publicVariableServer "EPOCH_MAINTBUILD";
+ EPOCH_MAINTBUILD = [_this, player, _maintainCount, Epoch_personalToken];
+ publicVariableServer "EPOCH_MAINTBUILD";
- _dt = [format["Cost %1 Krypto to maintain base.", _maintainCount], 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
+ [_rnd,_maintainCount] spawn {
+ params ["_rnd","_maintainCount"];
+ uiSleep _maintainCount;
+ missionNamespace setVariable [_rnd,false];
+ uiSleep 1;
+ missionNamespace setVariable [_rnd,nil];
+ EPOCH_maintainLockout = nil;
+ };
+
+ _dt = [format["Cost %1 Krypto to maintain base.", _maintainCount], 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
+ } else {
+ _dt = ["Nothing needs Maintaining", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
+ };
} else {
_dt = ["You need Krypto to maintain a base.", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
};
diff --git a/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf b/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf
index 96e824fb5..71f6bfbc5 100644
--- a/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf
+++ b/Sources/epoch_code/compile/building/EPOCH_staticMove.sqf
@@ -21,6 +21,8 @@ if (_energyCost == 0) then {
_class = getText(configfile >> "cfgVehicles" >> _objType >> "GhostPreview");
_maxHeight = getNumber(configfile >> "cfgVehicles" >> _objType >> "maxHeight");
_simulClass = getText(configFile >> "CfgVehicles" >> _objType >> "simulClass");
+_snapChecks = getArray(configFile >> "CfgSnapChecks" >> _objType >> "nails");
+diag_log format["DEBUG: _snapChecks %1",_snapChecks];
_maxSnapDistance = 1;
_lastCheckTime = diag_tickTime;
_stabilityCheck = false;
@@ -71,6 +73,7 @@ if (_class != "") then {
_isSnap = false;
_EPOCH_1 = diag_tickTime;
+ _EPOCH_2 = diag_tickTime;
_nearestObjects = [];
while {EPOCH_target == _currentTarget} do {
@@ -109,6 +112,13 @@ if (_class != "") then {
EPOCH_target attachTo[player];
};
+ if (EPOCH_space) then {
+ _dir2 = [vectorDir player, EPOCH_buildDirection] call EPOCH_returnVector;
+ _up2 = (vectorUp player);
+ EPOCH_space = false;
+ EPOCH_target setVectorDirAndUp [_dir2,_up2];
+ };
+
{
_nearestObject = _x;
if !(isNull EP_snap) then {
@@ -129,6 +139,7 @@ if (_class != "") then {
_baselineSnapPos = _nearestObject modelToWorldVisual [0,0,0];
if (EPOCH_buildMode == 1) then {
+
{
if (_x in _allowedSnapPoints) then {
_pOffset = _nearestObject selectionPosition _x;
@@ -231,10 +242,31 @@ if (_class != "") then {
_currentTarget setVectorDirAndUp[_dir2, (vectorUp _nearestObject)];
_currentTarget setposATL _snapPosition;
+
+ if ((diag_tickTime - _EPOCH_2) > 2) then {
+ _EPOCH_2 = diag_tickTime;
+ _arr_snapPoints = [];
+ EPOCH_arr_snapPoints = [];
+ {
+ _pos1_snap = _currentTarget modelToWorldVisual (_x select 0);
+ _pos2_snap = _currentTarget modelToWorldVisual (_x select 1);
+ _ins = lineIntersectsSurfaces [AGLToASL _pos1_snap, AGLToASL _pos2_snap,player,_currentTarget,true,1,"VIEW","FIRE"];
+ if (count _ins > 0) then {
+ if (surfaceIsWater _snapPosition) then {
+ _arr_snapPoints pushBack (_ins select 0 select 0);
+ } else {
+ _arr_snapPoints pushBack ASLToATL(_ins select 0 select 0);
+ };
+ };
+ if (count _arr_snapPoints >= 2) exitWith { EPOCH_arr_snapPoints = _arr_snapPoints; }
+ } forEach _snapChecks;
+ };
+
};
} else {
+ EPOCH_arr_snapPoints = [];
if !(attachedObjects player isEqualTo[]) then {
_offSet = [EPOCH_X_OFFSET, EPOCH_Y_OFFSET, EPOCH_Z_OFFSET];
_pos1 = player modelToWorldVisual _offSet;
@@ -252,12 +284,16 @@ if (_class != "") then {
if ((diag_tickTime - _EPOCH_1) > 1) then {
_EPOCH_1 = diag_tickTime;
- _nearestObjects = nearestObjects[EPOCH_target, _allowedSnapObjects, 12];
- EPOCH_playerEnergy = (EPOCH_playerEnergy - _energyCost) max 0;
+ if !(isNull EPOCH_target) then {
+ _nearestObjects = nearestObjects[EPOCH_target, _allowedSnapObjects, 12];
+ EPOCH_playerEnergy = (EPOCH_playerEnergy - _energyCost) max 0;
+ };
};
};
+ EPOCH_arr_snapPoints = [];
+
{
detach _x;
} forEach attachedObjects player;
@@ -282,37 +318,28 @@ if (_class != "") then {
_offsetZPos = [_currentPos select 0, _currentPos select 1, (_currentPos select 2) - 0.5];
if !(terrainIntersect[_currentPos, _offsetZPos]) then {
- // check below for static object
- if (lineintersectsobjs[ATLtoASL _currentPos, ATLtoASL _offsetZPos, _currentTarget, objNull, false, 2] isEqualTo[]) then {
-
- _currentDir = getDir _currentTarget;
- _objSize = sizeOf _objType / 3.5;
- _numberOfContacts = 0;
- {
- // check all four sides (must have two or more)
- if !(lineintersectsobjs[ATLtoASL _currentPos, ATLtoASL([_currentTarget, _objSize, _currentDir + _x] call BIS_fnc_relPos), _currentTarget, objNull, false, 2] isEqualTo[]) then {
- _numberOfContacts = _numberOfContacts + 1;
- };
- } forEach[0, 90, 180, 270];
-
- if (_numberOfContacts < 2) then {
-
- // TODO: foundations need to be handled
-
- // change to sim
- _worldspace = [getposATL _currentTarget, vectordir _currentTarget, vectorup _currentTarget];
-
- deleteVehicle _currentTarget;
-
- _currentTarget = createVehicle[_simulClass, (_worldspace select 0), [], 0, "CAN_COLLIDE"];
- _currentTarget setVectorDirAndUp[_worldspace select 1, _worldspace select 2];
- _currentTarget setposATL(_worldspace select 0);
-
- };
+ _numberOfContacts = 0;
+ {
+ _pos1_snap = _currentTarget modelToWorldVisual (_x select 0);
+ _pos2_snap = _currentTarget modelToWorldVisual (_x select 1);
+ _ins = lineIntersectsSurfaces [AGLToASL _pos1_snap, AGLToASL _pos2_snap,player,_currentTarget,true,1,"VIEW","FIRE"];
+ if (count _ins > 0) then {
+ _numberOfContacts = _numberOfContacts + 1;
+ };
+ if (_numberOfContacts >= 2) exitWith {}
+ } forEach _snapChecks;
+
+ if (_numberOfContacts < 2) then {
+ // TODO: foundations need to be handled
+ // change to sim
+ _worldspace = [getposATL _currentTarget, vectordir _currentTarget, vectorup _currentTarget];
+ deleteVehicle _currentTarget;
+ _currentTarget = createVehicle[_simulClass, (_worldspace select 0), [], 0, "CAN_COLLIDE"];
+ _currentTarget setVectorDirAndUp[_worldspace select 1, _worldspace select 2];
+ _currentTarget setposATL(_worldspace select 0);
};
};
};
-
_currentTarget spawn EPOCH_countdown;
};
};
diff --git a/Sources/epoch_code/compile/building/EPOCH_upgradeBUILDv2.sqf b/Sources/epoch_code/compile/building/EPOCH_upgradeBUILDv2.sqf
index 24539ebb0..6d25bff65 100644
--- a/Sources/epoch_code/compile/building/EPOCH_upgradeBUILDv2.sqf
+++ b/Sources/epoch_code/compile/building/EPOCH_upgradeBUILDv2.sqf
@@ -1,5 +1,8 @@
-if (isNull _this) exitWith{ false };
_return = false;
+_object = param [0,objNull,[objNull]];
+_index = param [1,-1,[0]]; //EPOCH_UpgradeIndex
+if !(_index isEqualTo -1) then {Epoch_upgradeIndex = _index};
+if (isNull _object) exitWith {false};
_buildingAllowed = true;
_ownedJammerExists = false;
@@ -14,19 +17,7 @@ if (_buildingCountLimit == 0) then { _buildingCountLimit = 200; };
EPOCH_buildOption = 1;
-_object = _this;
-// get index from UI
-_index = lbCurSel 1500;
-
-if (isNil "EPOCH_UpgradeIndex") then {
- EPOCH_UpgradeIndex = 0;
-};
-if (_index != -1) then {
- // close UI
- closeDialog 0;
- EPOCH_UpgradeIndex = _index;
-};
// check if another player has target
_targeter = _object getVariable["last_targeter", objNull];
@@ -41,10 +32,6 @@ if (_stability > 0) exitWith{
};
};
-
-
-
-
_jammer = nearestObjects[player, ["PlotPole_EPOCH"], _buildingJammerRange];
if !(_jammer isEqualTo[]) then {
@@ -66,16 +53,16 @@ if !(_jammer isEqualTo[]) then {
};
if !(_buildingAllowed)exitWith{ false };
-if (_this isKindOf "Constructions_static_F") then {
+if (_object isKindOf "Constructions_static_F") then {
// take upgrade item from player here
_config = 'CfgBaseBuilding' call EPOCH_returnConfig;
- _upgrades = getArray(_config >> (typeOf _this) >> "upgradeBuilding");
+ _upgrades = getArray(_config >> (typeOf _object) >> "upgradeBuilding");
if !(_upgrades isEqualTo []) then {
// get selected upgrade
- _upgrade = _upgrades param [EPOCH_UpgradeIndex,[]];
+ _upgrade = _upgrades param [Epoch_upgradeIndex,[]];
_upgradeParts = _upgrade select 1;
@@ -112,8 +99,9 @@ if (_this isKindOf "Constructions_static_F") then {
if (_canUpgradePartCount == _removedPartCount) then {
// send to server for upgrade
- EPOCH_UPBUILD = [_this,player,EPOCH_UpgradeIndex,Epoch_personalToken];
+ EPOCH_UPBUILD = [_object,player,Epoch_upgradeIndex,Epoch_personalToken];
publicVariableServer "EPOCH_UPBUILD";
+ Epoch_upgradeIndex = nil;
_return = true;
_dt = ["Upgraded", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
};
diff --git a/Sources/epoch_code/compile/building/staticMoveV2.sqf b/Sources/epoch_code/compile/building/staticMoveV2.sqf
deleted file mode 100644
index 4528f3967..000000000
--- a/Sources/epoch_code/compile/building/staticMoveV2.sqf
+++ /dev/null
@@ -1,137 +0,0 @@
-EPOCH_buildClasses = ["Land_Obstacle_Bridge_F",
-
-"Land_Shoot_House_Wall_F",
-"Land_Shoot_House_Wall_Stand_F",
-"Land_Shoot_House_Wall_Crouch_F",
-"Land_Shoot_House_Wall_Prone_F",
-"Land_Shoot_House_Wall_Long_F",
-"Land_Shoot_House_Wall_Long_Stand_F",
-"Land_Shoot_House_Wall_Long_Crouch_F",
-"Land_Shoot_House_Wall_Long_Prone_F",
-"Land_Shoot_House_Corner_F",
-"Land_Shoot_House_Corner_Stand_F",
-"Land_Shoot_House_Corner_Crouch_F",
-"Land_Shoot_House_Corner_Prone_F",
-"Land_Shoot_House_Panels_F",
-"Land_Shoot_House_Panels_Crouch_F",
-"Land_Shoot_House_Panels_Prone_F",
-"Land_Shoot_House_Panels_Vault_F",
-"Land_Shoot_House_Panels_Window_F",
-"Land_Shoot_House_Panels_Windows_F",
-"Land_Shoot_House_Tunnel_F",
-"Land_Shoot_House_Tunnel_Stand_F",
-"Land_Shoot_House_Tunnel_Crouch_F",
-"Land_Shoot_House_Tunnel_Prone_F",
-
-
-"Land_Obstacle_RunAround_F","Land_Obstacle_Saddle_F","Land_RampConcrete_F","Land_RampConcreteHigh_F","Land_GH_Stairs_F","Land_Billboard_F","Land_HBarrier_1_F","Land_HBarrier_3_F","Land_HBarrier_5_F","Land_Razorwire_F","Land_HBarrierWall6_F","WoodFloor_EPOCH","WoodLargeWall_EPOCH","Land_BagFence_Long_F","Land_BagFence_Corner_F","Land_BagFence_End_F","Land_BagFence_Round_F","Land_BagFence_Short_F"];
-EPOCH_buildClassesCount = count EPOCH_buildClasses - 1;
-Epoch_selectedBuildClasIndex = 0;
-EPOCH_selectedBuildClass = EPOCH_buildClasses select 0;
-
-EPOCH_buildWorldspace = [[0,0,0],[0,0,0],[0,0,0]];
-EPOCH_KeyDownFunctionhandler = {
- _dikCode = _this select 1;
- _shift = _this select 2;
- _ctrl = _this select 3;
- _alt = _this select 4;
-
- switch (_dikCode) do {
- case 0x39 : {
- _worldspace = EPOCH_buildWorldspace;
- _newObj = EPOCH_selectedBuildClass createVehicle (_worldspace select 0);
- _newObj setVectorDirAndUp [_worldspace select 1,_worldspace select 2];
- _newObj setposASL (_worldspace select 0);
- _handled = true;
- };
- case 0xC9 : {
- Epoch_selectedBuildClasIndex = ((Epoch_selectedBuildClasIndex + 1) min EPOCH_buildClassesCount) max 0;
- EPOCH_selectedBuildClass = EPOCH_buildClasses select Epoch_selectedBuildClasIndex;
-
- if !(isNull EPOCH_currentBuildObj) then {
- deleteVehicle EPOCH_currentBuildObj;
- EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle [0,0,0];
- EPOCH_currentBuildObj disableCollisionWith player;
- EPOCH_currentBuildObj setObjectTextureGlobal [0, "#(rgb,8,8,3)color(0,0,1,1)"];
- };
-
- hint EPOCH_selectedBuildClass;
- _handled = true;
- };
- case 0xD1 : {
- Epoch_selectedBuildClasIndex = ((Epoch_selectedBuildClasIndex - 1) min EPOCH_buildClassesCount) max 0;
- EPOCH_selectedBuildClass = EPOCH_buildClasses select Epoch_selectedBuildClasIndex;
- hint EPOCH_selectedBuildClass;
-
- if !(isNull EPOCH_currentBuildObj) then {
- deleteVehicle EPOCH_currentBuildObj;
- EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle [0,0,0];
- EPOCH_currentBuildObj disableCollisionWith player;
- EPOCH_currentBuildObj setObjectTextureGlobal [0, "#(rgb,8,8,3)color(0,0,1,1)"];
- };
-
- _handled = true;
- };
- };
- _handled
-};
-
-
-[] spawn {
- (findDisplay 46) displayRemoveAllEventHandlers "KeyDown";
- (findDisplay 46) displayAddEventHandler["KeyDown",{_this call EPOCH_KeyDownFunctionhandler}];
-};
-
-EPOCH_currentBuildObj = EPOCH_selectedBuildClass createVehicle [0,0,0];
-EPOCH_currentBuildObj disableCollisionWith player;
-EPOCH_currentBuildObj setObjectTextureGlobal [0, "#(rgb,8,8,3)color(0,0,1,1)"];
-
-onEachFrame {
- _ins = lineIntersectsSurfaces [AGLToASL positionCameraToWorld [0,0,0],AGLToASL positionCameraToWorld [0,0,10],player,EPOCH_currentBuildObj];
- if (count _ins == 0) exitWith {EPOCH_currentBuildObj setPosASL [0,0,0]};
-
- _intersectObj = (_ins select 0 select 2);
- if (isNull _intersectObj) then {_intersectObj = player};
- EPOCH_currentBuildObj setVectorDirAndUp [vectordir _intersectObj,(_ins select 0 select 1)];
- EPOCH_currentBuildObj setPosASL (_ins select 0 select 0);
- EPOCH_buildWorldspace = [(_ins select 0 select 0),vectordir _intersectObj,(_ins select 0 select 1)];
-
- _currentPos = (_ins select 0 select 0);
- _numberOfContacts = 0;
-
- _currentDir = direction EPOCH_currentBuildObj;
-
- _bbr = boundingBoxReal EPOCH_currentBuildObj;
- _p1 = _bbr select 0;
- _p2 = _bbr select 1;
- _maxWidth = abs ((_p2 select 0) - (_p1 select 0)) / 2;
- _maxLength = abs ((_p2 select 1) - (_p1 select 1)) / 2;
- _maxHeight = abs ((_p2 select 2) - (_p1 select 2)) / 2;
-
- {
- _pos1 = EPOCH_currentBuildObj modelToWorld [0,0,_maxHeight];
- _pos2 = EPOCH_currentBuildObj modelToWorld _x;
- _ins = lineIntersectsSurfaces [AGLToASL _pos1,AGLToASL _pos2,player,EPOCH_currentBuildObj];
- _color = [0,0,1,1];
-
- if (count _ins == 0) then {
-
-
- _color = [0,0,1,1];
- drawIcon3D ["a3\modules_f\data\iconunlock_ca.paa", [1,1,1,1], _pos2, 1, 1, 45, "", 1, 0.05, "TahomaB"];
-
-
- } else {
- _numberOfContacts = _numberOfContacts + 1;
- drawIcon3D ["a3\modules_f\data\iconlock_ca.paa", [1,1,1,1], ASLToATL (_ins select 0 select 0), 1, 1, 45, "Snap", 1, 0.05, "TahomaB"];
- _color = [1,0,0,1];
- };
-
- drawLine3D [
- _pos1,
- _pos2,
- _color
- ];
-
- } forEach[[_maxWidth,0,_maxHeight], [0,_maxLength,_maxHeight], [-_maxWidth,0,_maxHeight], [0,-_maxLength,_maxHeight], [0,0,-_maxHeight]];
-};
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fn_returnConfigEntryV2.sqf b/Sources/epoch_code/compile/functions/EPOCH_fn_returnConfigEntryV2.sqf
index 32fd41750..c2bb720d7 100644
--- a/Sources/epoch_code/compile/functions/EPOCH_fn_returnConfigEntryV2.sqf
+++ b/Sources/epoch_code/compile/functions/EPOCH_fn_returnConfigEntryV2.sqf
@@ -11,10 +11,10 @@ if (isClass(_config)) then{
_finalconfig = _config >> (_this select 1);
if (configName(_finalconfig) == (_this select 1)) then{
_varData = switch (typeName _defaultData) do {
- case "SCALAR": {getNumber _finalconfig};
- case "BOOL": {(getNumber _finalconfig) == 1};
- case "ARRAY": {getArray _finalconfig};
- case "STRING": {getText _finalconfig};
+ case "SCALAR": {if (isNumber (_finalconfig)) then { getNumber _finalconfig } else {_defaultData} };
+ case "BOOL": {if (isText (_finalconfig)) then { (getText _finalconfig) isEqualTo "true" } else {_defaultData} };
+ case "ARRAY": {if (isArray (_finalconfig)) then { getArray _finalconfig } else {_defaultData} };
+ case "STRING": {if (isText (_finalconfig)) then { getText _finalconfig } else {_defaultData} };
default {_defaultData};
};
} else {
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_Weather.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_Weather.sqf
index b34933c75..4a9676ca1 100644
--- a/Sources/epoch_code/compile/functions/EPOCH_fnc_Weather.sqf
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_Weather.sqf
@@ -1,4 +1,9 @@
private ["_warming","_isNearFire","_airTemp","_waterTemp","_playerPosATL"];
+
+if (isNil "EPOCH_CURRENT_WEATHER") then {
+ EPOCH_CURRENT_WEATHER = 75;
+};
+
_airTemp = EPOCH_CURRENT_WEATHER;
_waterTemp = EPOCH_CURRENT_WEATHER/2;
_warming = true;
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_cursorTarget.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_cursorTarget.sqf
new file mode 100644
index 000000000..441fa355c
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_cursorTarget.sqf
@@ -0,0 +1,4 @@
+params [["_distance",10], ["_lod1", "VIEW"], ["_lod2","FIRE"], ["_sort",true]];
+_ins = lineIntersectsSurfaces [AGLToASL positionCameraToWorld [0,0,0],AGLToASL positionCameraToWorld [0,0,_distance],player,objNull,_sort,1,_lod1,_lod2];
+if (_ins isEqualTo []) exitWith { objNull };
+(_ins select 0 param [3,objNull])
diff --git a/Sources/epoch_code/compile/functions/EPOCH_pushCustomVar.sqf b/Sources/epoch_code/compile/functions/EPOCH_pushCustomVar.sqf
index dddcec138..188bc59e6 100644
--- a/Sources/epoch_code/compile/functions/EPOCH_pushCustomVar.sqf
+++ b/Sources/epoch_code/compile/functions/EPOCH_pushCustomVar.sqf
@@ -5,28 +5,19 @@ _EPOCH_lastSave = missionNamespace getVariable["EPOCH_lastSave", diag_tickTime];
if ((diag_tickTime - _EPOCH_lastSave) >= _time) then {
- missionNamespace setVariable["EPOCH_lastSave", diag_tickTime];
+ // manually set hitpoints array
+ EPOCH_playerHitPoints = ((getAllHitPointsDamage player) param [2,[]]);
+
+ // Get all custom variables
+ _customVars = [];
+ _customVarsInit = ["CfgEpochClient", "customVarsDefaults", missionNamespace getVariable["EPOCH_customVarsDefaults", []]] call EPOCH_fnc_returnConfigEntryV2;
+ {
+ _customVars pushBack (missionNamespace getVariable format["EPOCH_player%1",_x select 0]);
+ } forEach _customVarsInit;
- missionNamespace setVariable ["EPOCH_pushPlayer_PVS",
- [ player,
- [
- missionNamespace getVariable "EPOCH_playerTemp",
- missionNamespace getVariable "EPOCH_playerHunger",
- missionNamespace getVariable "EPOCH_playerThirst",
- missionNamespace getVariable "EPOCH_playerAliveTime",
- missionNamespace getVariable "EPOCH_playerEnergy",
- missionNamespace getVariable "EPOCH_playerWet",
- missionNamespace getVariable "EPOCH_playerSoiled",
- missionNamespace getVariable "EPOCH_playerImmunity",
- missionNamespace getVariable "EPOCH_playerToxicity",
- missionNamespace getVariable "EPOCH_playerStamina",
- missionNamespace getVariable "EPOCH_playerCrypto",
- ((getAllHitPointsDamage player) param [2,[]]),
- missionNamespace getVariable "EPOCH_playerBloodP",
- missionNamespace getVariable "EPOCH_playerSpawnArray"
- ],
- missionNamespace getVariable "Epoch_personalToken"
- ]
- ];
+ // TODO: use remoteExec here
+ missionNamespace setVariable ["EPOCH_pushPlayer_PVS",[player,_customVars,missionNamespace getVariable "Epoch_personalToken"]];
publicVariableServer "EPOCH_pushPlayer_PVS";
-};
\ No newline at end of file
+
+ missionNamespace setVariable["EPOCH_lastSave", diag_tickTime];
+};
diff --git a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
index 4a2717da9..c03414717 100644
--- a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
+++ b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyDown.sqf
@@ -1,8 +1,6 @@
private["_dikCode", "_handled"];
-_dikCode = _this select 1;
-_shift = _this select 2;
-_ctrl = _this select 3;
-_alt = _this select 4;
+params ["_display","_dikCode","_shift","_ctrl","_alt"];
+
_handled = false;
// Developer Debug
@@ -17,14 +15,14 @@ if (_dikCode in [0x02,0x03,0x04,0x58,0x57,0x44,0x43,0x42,0x41,0x40,0x3F,0x3E,0x3
_handled = true;
};
-// rasie vol
-if (_ctrl && _dikCode == 0x0D) then {
+// increase vol
+if (_ctrl && _dikCode == EPOCH_keysVolumeUp) then {
EPOCH_soundLevel = (EPOCH_soundLevel + 0.1) min 1;
5 fadeSound EPOCH_soundLevel;
_dt = [format["Internal sound level: %1%2 ", EPOCH_soundLevel * 100, "%"], 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
};
// lower vol
-if (_ctrl && _dikCode == 0x0C) then {
+if (_ctrl && _dikCode == EPOCH_keysVolumeDown) then {
EPOCH_soundLevel = (EPOCH_soundLevel - 0.1) max 0.1;
5 fadeSound EPOCH_soundLevel;
_dt = [format["Internal sound level: %1%2 ", EPOCH_soundLevel * 100,"%"], 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
@@ -61,6 +59,22 @@ if (_dikCode == EPOCH_keysDebugMon) then {
_handled = true;
};
+//Action Menu
+if (_dikCode == EPOCH_keysAction) then {
+ _handled = true;
+ if !(EPOCH_keysActionPressed) then {
+ EPOCH_keysActionPressed = true;
+ if (cursorTarget isKindOf "AllVehicles") then {
+ call epoch_dynamicMenu;
+ } else {
+ [] spawn {
+ uiSleep 0.2;
+ if (EPOCH_keysActionPressed) then {call epoch_dynamicMenu};
+ };
+ };
+ };
+};
+
// Player only code
if (vehicle player == player) then {
@@ -151,7 +165,7 @@ if (vehicle player == player) then {
case EPOCH_keysBuildMovR: { EPOCH_X_OFFSET = (EPOCH_X_OFFSET - 0.1) max - 5; _handled = true };
case EPOCH_keysBuildRotL: { EPOCH_buildDirection = (EPOCH_buildDirection + 1) min 360; EPOCH_space = true; _handled = true };
case EPOCH_keysBuildRotR: { EPOCH_buildDirection = (EPOCH_buildDirection - 1) max 0; EPOCH_space = true; _handled = true };
- case EPOCH_keysBuildIt: { cursorTarget call EPOCH_fnc_SelectTarget; _handled = true };
+ //case EPOCH_keysBuildIt: { cursorTarget call EPOCH_fnc_SelectTarget; _handled = true };
};
};
};
diff --git a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf
index 6a47242c3..ed0c73042 100644
--- a/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf
+++ b/Sources/epoch_code/compile/interface_event_handlers/EPOCH_KeyUp.sqf
@@ -1,6 +1,14 @@
-_dikCode = _this select 1;
-_shift = _this select 2;
-_ctrl = _this select 3;
-_alt = _this select 4;
+private["_dikCode", "_handled"];
+params ["_display","_dikCode","_shift","_ctrl","_alt"];
+_handled = false;
+
+//Main actions
+
+if (_dikCode == EPOCH_keysAction) then {
+ EPOCH_keysActionPressed = false;
+ true call Epoch_dynamicMenuCleanup;
+};
+
+
+_handled
-if (_ctrl && _dikCode == 0x39) then { call EPOCH_lootTrash; };
\ No newline at end of file
diff --git a/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf b/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf
index 524d16d7d..4e444fc3c 100644
--- a/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf
+++ b/Sources/epoch_code/compile/inventory/EPOCH_initUI.sqf
@@ -2,11 +2,6 @@ private ["_bar","_uniformArmor","_totalArmor","_finalArmor","_vestArmor","_headg
disableSerialization;
EPOCH_InteractedItem = [];
-
-if (isNil "EPOCH_MAX_ARMOR") then {
- call EPOCH_maxArmorInit;
-};
-
EPOCH_lastContainer = _this select 1;
waitUntil {!isNull findDisplay 602};
@@ -14,9 +9,6 @@ _display = (findDisplay 602);
(_display displayCtrl -13) ctrlEnable false;
-_totalArmor = 0;
-_totalArmorMax = EPOCH_MAX_ARMOR select 3;
-
_color = [0.6,0.6,0.6,1];
_colorCompare = [0.4,0.6,1,0.4];
diff --git a/Sources/epoch_code/compile/inventory/EPOCH_refeshUI.sqf b/Sources/epoch_code/compile/inventory/EPOCH_refeshUI.sqf
index 9fe5861a9..862a7a8e9 100644
--- a/Sources/epoch_code/compile/inventory/EPOCH_refeshUI.sqf
+++ b/Sources/epoch_code/compile/inventory/EPOCH_refeshUI.sqf
@@ -7,6 +7,10 @@ if (!isNull findDisplay 602) then {
_selectedClass = EPOCH_InteractedItem select 1;
};
+ if (isNil "EPOCH_MAX_ARMOR") then {
+ call EPOCH_maxArmorInit;
+ };
+
_totalArmor = 0;
_totalArmorMax = EPOCH_MAX_ARMOR select 3;
diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf
index dbbfd22dc..32bae9b7e 100644
--- a/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf
+++ b/Sources/epoch_code/compile/setup/EPOCH_clientInit.sqf
@@ -15,7 +15,7 @@ EPOCH_target = objNull;
EPOCH_Z_OFFSET = 0;
EPOCH_X_OFFSET = 0;
EPOCH_Y_OFFSET = 5;
-EPOCH_snapVisArray = [];
+EPOCH_arr_snapPoints = [];
EPOCH_prevTarget = objNull;
EPOCH_interactOption = 0;
diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf
index 7350981f6..e28f67d27 100644
--- a/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf
+++ b/Sources/epoch_code/compile/setup/EPOCH_clientKeyMap.sqf
@@ -4,6 +4,13 @@ params [["_args",0],["_input",0]];
_keyMap =
[
//["Name", "Variable name", Default value],
+ ["Action","EPOCH_keysAction",0x39],
+ ["Holster Weapon", "EPOCH_keysHolster", 35],
+ ["Debug Monitor", "EPOCH_keysDebugMon", 41],
+ ["Trade", "EPOCH_keysAcceptTrade", 0x14],
+
+ ["Volume + (ctrl)","EPOCH_keysVolumeUp",0x0D],
+ ["Volume - (ctrl)","EPOCH_keysVolumeDown",0x0C],
["Build: Mode 1", "EPOCH_keysBuildMode1", 2],
["Build: Mode 2", "EPOCH_keysBuildMode2", 3],
["Build: Direction", "EPOCH_keysBuildDir", 4],
@@ -15,11 +22,7 @@ _keyMap =
["Build: Move LEFT", "EPOCH_keysBuildMovL", 0xD2],
["Build: Move RIGHT", "EPOCH_keysBuildMovR", 0xD3],
["Build: Rotate LEFT", "EPOCH_keysBuildRotL", 0x12],
- ["Build: Rotate RIGHT", "EPOCH_keysBuildRotR", 0x10],
- ["Build: BUILD", "EPOCH_keysBuildIt", 0x39],
- ["Trade", "EPOCH_keysAcceptTrade", 0x14],
- ["Holster Weapon", "EPOCH_keysHolster", 35],
- ["Debug Monitor", "EPOCH_keysDebugMon", 41]
+ ["Build: Rotate RIGHT", "EPOCH_keysBuildRotR", 0x10]
];
switch (_args) do {
diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientRespawn.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientRespawn.sqf
index 1b4e1bca7..4969200dc 100644
--- a/Sources/epoch_code/compile/setup/EPOCH_clientRespawn.sqf
+++ b/Sources/epoch_code/compile/setup/EPOCH_clientRespawn.sqf
@@ -1,5 +1,5 @@
call EPOCH_clientInit;
-[] spawn EPOCH_masterLoop;
+[] spawn EPOCH_masterLoop_v2;
[5,100] call EPOCH_niteLight;
Epoch_canBeRevived = true;
@@ -7,4 +7,4 @@ Epoch_canBeRevived = true;
[] execFSM "\x\addons\a3_epoch_code\system\gender_selection.fsm";
-true
\ No newline at end of file
+true
diff --git a/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf b/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf
index e42a60257..52010850d 100644
--- a/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf
+++ b/Sources/epoch_code/compile/setup/EPOCH_clientRevive.sqf
@@ -1,4 +1,4 @@
-//
+//
_playerObject = _this select 0;
if !(alive player && alive _playerObject && !isPlayer _playerObject) then {
_ply = player;
@@ -12,7 +12,7 @@ if !(alive player && alive _playerObject && !isPlayer _playerObject) then {
Epoch_personalToken = _this select 1;
// call EPOCH_clientInit;
- [] spawn EPOCH_masterLoop;
+ [] spawn EPOCH_masterLoop_v2;
[5, 100] call EPOCH_niteLight;
closeDialog 0;
@@ -20,13 +20,13 @@ if !(alive player && alive _playerObject && !isPlayer _playerObject) then {
player addEventHandler ["Respawn", {(_this select 0) call EPOCH_clientRespawn}];
player addEventHandler ["Put", {(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler}];
- player addEventHandler ["Take", {(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck}];
- player addEventHandler["InventoryClosed", { if !(EPOCH_arr_interactedObjs isEqualTo[]) then{EPOCH_arr_interactedObjs remoteExec["EPOCH_server_save_vehicles", 2]; EPOCH_arr_interactedObjs = []; }; }];
- player addEventHandler ["InventoryOpened", {_this spawn EPOCH_initUI;locked (_this select 1) in [2, 3]}];
- player addEventHandler ["Fired", {_this call EPOCH_fnc_playerFired}];
- player addEventHandler ["Killed", {_this call EPOCH_fnc_playerDeath}];
+ player addEventHandler ["Take", {(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck}];
+ player addEventHandler ["InventoryClosed", { if !(EPOCH_arr_interactedObjs isEqualTo[]) then{EPOCH_arr_interactedObjs remoteExec["EPOCH_server_save_vehicles", 2]; EPOCH_arr_interactedObjs = []; }; }];
+ player addEventHandler ["InventoryOpened", {_this spawn EPOCH_initUI; (locked (_this select 1) in [2, 3] || (_this select 1) getVariable["EPOCH_Locked", false]) }];
+ player addEventHandler ["Fired", {_this call EPOCH_fnc_playerFired}];
+ player addEventHandler ["Killed", {_this call EPOCH_fnc_playerDeath}];
} else {
deleteVehicle _playerObject;
};
-true call EPOCH_pushCustomVar;
\ No newline at end of file
+true call EPOCH_pushCustomVar;
diff --git a/Sources/epoch_code/compile/setup/EPOCH_masterLoop.sqf b/Sources/epoch_code/compile/setup/EPOCH_masterLoop.sqf
index 10ad6ce78..a3961057f 100644
--- a/Sources/epoch_code/compile/setup/EPOCH_masterLoop.sqf
+++ b/Sources/epoch_code/compile/setup/EPOCH_masterLoop.sqf
@@ -185,6 +185,8 @@ _fadeUI = {
};
};
+_cursorTarget = objNull;
+
// Master Loop Start
while {alive player} do {
@@ -198,17 +200,15 @@ while {alive player} do {
// current target
_currentTarget = objNull;
- if (!isNull cursorTarget && !(EPOCH_target isEqualTo cursorTarget)) then {
- _distance = player distance cursorTarget;
- if (_distance < 9) then {
- if (cursorTarget isKindOf "ThingX" || cursorTarget isKindOf "Constructions_static_F" || cursorTarget isKindOf "Constructions_foundation_F" || cursorTarget isKindOf "WeaponHolder" || cursorTarget isKindOf "AllVehicles" || cursorTarget isKindOf "PlotPole_EPOCH") then{
- if (cursorTarget isKindOf "Animal_Base_F") then {
- if !(alive cursorTarget) then {
- _currentTarget = cursorTarget;
- };
- } else {
- _currentTarget = cursorTarget;
+ _cursorTarget = ([10] call EPOCH_fnc_cursorTarget);
+ if (!isNull _cursorTarget && {!(EPOCH_target isEqualTo _cursorTarget)}) then {
+ if (_cursorTarget isKindOf "ThingX" || _cursorTarget isKindOf "Constructions_static_F" || _cursorTarget isKindOf "Constructions_foundation_F" || _cursorTarget isKindOf "WeaponHolder" || _cursorTarget isKindOf "AllVehicles" || _cursorTarget isKindOf "PlotPole_EPOCH") then{
+ if (_cursorTarget isKindOf "Animal_Base_F") then {
+ if !(alive _cursorTarget) then {
+ _currentTarget = _cursorTarget;
};
+ } else {
+ _currentTarget = _cursorTarget;
};
};
};
@@ -218,7 +218,9 @@ while {alive player} do {
_vehicle = vehicle player;
if (_vehicle == player) then {
_val = log(abs(speed player));
- if (_val>0.7) then {
+ _staminaThreshold = 0.7;
+ if (EPOCH_playerIsSwimming) then {_staminaThreshold = 0.3};
+ if (_val>_staminaThreshold) then {
EPOCH_playerStamina = (EPOCH_playerStamina - (_val/4)) max 0;
} else {
_increaseStamina = true;
@@ -478,6 +480,7 @@ while {alive player} do {
_position = getPosATL player;
EPOCH_nearestLocations = nearestLocations[player, ["NameCityCapital", "NameCity", "Airport"], 300];
+ EPOCH_playerIsSwimming = false;
if !(surfaceIsWater _position) then {
if (EPOCH_nearestLocations isEqualTo []) then{
@@ -489,12 +492,19 @@ while {alive player} do {
} else {
// spawn shark if player is deep water and not in vehicle
if (vehicle player == player) then{
- if (((_position vectorDiff getPosASL player) select 2) > 50) then {
+ _offsetZ = ((_position vectorDiff getPosASL player) select 2);
+ if (_offsetZ > 1.7) then {
+ EPOCH_playerIsSwimming = true;
+ };
+ if (_offsetZ > 50) then {
"GreatWhite_F" call EPOCH_unitSpawn;
};
};
};
+ // default power state
+ EPOCH_nearPower = false;
+ EPOCH_chargeRate = 0;
// energy Charge from nearby power plants
_powerSources = nearestObjects[player, ["Land_spp_Tower_F","Land_wpp_Turbine_V2_F","Land_wpp_Turbine_V1_F","SolarGen_EPOCH"], _energyRange];
@@ -514,12 +524,15 @@ while {alive player} do {
};
_totalCapacity = _totalCapacity + _powerCap;
} forEach _powerSources;
- _players = player nearEntities[["Epoch_Male_F", "Epoch_Female_F"], _energyRange];
- EPOCH_chargeRate = ceil(_totalCapacity / (count _players));
- EPOCH_nearPower = true;
- } else {
- EPOCH_nearPower = false;
- EPOCH_chargeRate = 0;
+ if (_totalCapacity > 0) then {
+ _players = player nearEntities[["Epoch_Male_F", "Epoch_Female_F"], _energyRange];
+ if (_players isEqualTo []) then {
+ EPOCH_chargeRate = ceil _totalCapacity;
+ } else {
+ EPOCH_chargeRate = ceil (_totalCapacity / (count _players));
+ };
+ EPOCH_nearPower = true;
+ };
};
EPOCH_playerAliveTime = round(EPOCH_playerAliveTime + (_tickTime - EPOCH_clientAliveTimer));
@@ -553,7 +566,6 @@ while {alive player} do {
} forEach EPOCH_playerSpawnArray;
// test spawning one antagonist every 10 minutes select one unit at random to spawn
-
if !(_spawnUnits isEqualTo[]) then{
(_spawnUnits select(floor random(count _spawnUnits))) call EPOCH_unitSpawn;
};
diff --git a/Sources/epoch_code/compile/setup/EPOCH_masterLoop_v2.sqf b/Sources/epoch_code/compile/setup/EPOCH_masterLoop_v2.sqf
new file mode 100644
index 000000000..5afeef295
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/EPOCH_masterLoop_v2.sqf
@@ -0,0 +1,40 @@
+// EPOCHMOD.com
+disableSerialization;
+_config = 'CfgMasterLoop' call EPOCH_returnConfig;
+_build_sqf = preprocessFile getText (_config >> "Init" >> "file");
+_configs = "true" configClasses (_config >> "Events");
+_condition = getText (_config >> "Events" >> "condition");
+_file = getText (_config >> "Events" >> "file");
+{
+ _configName = configName _x;
+ _varName = format["_EPOCH_%1",_configName];
+ _build_sqf = _build_sqf + '
+ '+_varName+' = diag_tickTime;
+ ';
+}forEach _configs;
+_build_sqf = _build_sqf + '
+while {'+_condition+'} do {
+ _tickTime = diag_tickTime;
+';
+{
+ _delay = getNumber(_x >> "delay");
+ _configName = configName _x;
+ _varName = format["_EPOCH_%1",_configName];
+ _code = preprocessFile format ["%1\%2.sqf",_file,_configName];
+ _build_sqf = _build_sqf + '
+ if ((_tickTime - '+_varName+') > '+str(_delay)+') then {
+ '+_varName+' = _tickTime;
+ '+_code+'
+ };
+ ';
+}forEach _configs;
+_build_sqf = _build_sqf + '
+ if (vehicle player != player) then {
+ if (isNull EPOCH_currentVehicle) then {
+ EPOCH_currentVehicle = vehicle player;
+ EPOCH_currentVehicle addEventHandler["GetOut", "_this call EPOCH_antiWall"];
+ };
+ };
+ uiSleep 0.1;
+};';
+call compile _build_sqf;
diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf
new file mode 100644
index 000000000..274445fb8
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf
@@ -0,0 +1,142 @@
+
+ // current target
+
+ _currentTarget = objNull;
+ _cursorTarget = ([10] call EPOCH_fnc_cursorTarget);
+ if (!isNull _cursorTarget && {!(EPOCH_target isEqualTo _cursorTarget)}) then {
+ if (_cursorTarget isKindOf "ThingX" || _cursorTarget isKindOf "Constructions_static_F" || _cursorTarget isKindOf "Constructions_foundation_F" || _cursorTarget isKindOf "WeaponHolder" || _cursorTarget isKindOf "AllVehicles" || _cursorTarget isKindOf "PlotPole_EPOCH") then{
+ if (_cursorTarget isKindOf "Animal_Base_F") then {
+ if !(alive _cursorTarget) then {
+ _currentTarget = _cursorTarget;
+ };
+ } else {
+ _currentTarget = _cursorTarget;
+ };
+ };
+ };
+ EPOCH_currentTarget = _currentTarget;
+
+ _increaseStamina = false;
+ _vehicle = vehicle player;
+ if (_vehicle == player) then {
+ _val = log(abs(speed player));
+ _staminaThreshold = 0.7;
+ if (EPOCH_playerIsSwimming) then {_staminaThreshold = 0.3};
+ if (_val>_staminaThreshold) then {
+ EPOCH_playerStamina = (EPOCH_playerStamina - (_val/4)) max 0;
+ } else {
+ _increaseStamina = true;
+ };
+ } else {
+ if (EPOCH_buildMode > 0) then {
+ EPOCH_buildMode = 0;
+ EPOCH_snapDirection = 0;
+ hintsilent "BUILD MODE: DISABLED";
+ EPOCH_Target = objNull;
+ // EPOCH_SURVEY = [];
+ };
+ _increaseStamina = true;
+
+ switch (typeOf _vehicle) do {
+ case "jetski_epoch": {
+ _clock_hour10 = floor ((date select 3)/10);
+ _clock_minute10 = floor ((date select 4)/10);
+ {
+ _vehicle setObjectTexture [_forEachIndex,_x];
+ }forEach[
+ format["\x\addons\a3_epoch_vehicles\data\num%1_ca.paa",_clock_hour10],
+ format["\x\addons\a3_epoch_vehicles\data\num%1_ca.paa",(date select 3)-(_clock_hour10*10)],
+ format["\x\addons\a3_epoch_vehicles\data\num%1_ca.paa",_clock_minute10],
+ format["\x\addons\a3_epoch_vehicles\data\num%1_ca.paa",(date select 4)-(_clock_minute10*10)],
+ format["\x\addons\a3_epoch_vehicles\data\fuel%1_ca.paa",floor(fuel _vehicle*10)]
+ ];
+ };
+ case "ebike_epoch": {
+ {
+ _vehicle setObjectTexture [_forEachIndex,_x];
+ }forEach[
+ format["\x\addons\a3_epoch_vehicles\data\speed%1_ca.paa",floor(speed _vehicle/9) max 0],
+ format["\x\addons\a3_epoch_vehicles\data\energ%1_ca.paa",floor(fuel _vehicle*14)]
+ ];
+ };
+ };
+ };
+
+ _envCold = EPOCH_playerTemp <= 95.0;
+ _envHot = EPOCH_playerTemp >= 106.7;
+ _hungry = EPOCH_playerHunger <= 0;
+ _thirsty = EPOCH_playerThirst <= 0;
+ _warnbloodPressure = EPOCH_playerBloodP > 120;
+
+ _thirst ctrlShow (EPOCH_playerThirst <= 625);
+ if (ctrlShown _thirst) then {
+ [_thirst,_thirsty] call _fadeUI;
+ _thirstScale = linearConversion [0,EPOCH_playerThirst,2500,0.01,1];
+ _thirst ctrlSetTextColor [_thirstScale, _thirstScale, 0.9, 1];
+ };
+
+ _hunger ctrlShow (EPOCH_playerHunger <= 1250);
+ if (ctrlShown _hunger) then {
+ [_hunger,_hungry] call _fadeUI;
+ _hungerScale = linearConversion [0,EPOCH_playerHunger,5000,0.01,1];
+ _hunger ctrlSetTextColor [1, _hungerScale, _hungerScale, 1];
+ };
+
+ _playerOxygen = getOxygenRemaining player;
+ _oxygen ctrlShow (_playerOxygen < 1);
+ if (ctrlShown _oxygen) then {
+ [_oxygen,(_playerOxygen <= 0.55)] call _fadeUI;
+ _oxygen ctrlSetTextColor [1, _playerOxygen, _playerOxygen, 1];
+ };
+
+ _hazzard ctrlShow (EPOCH_playerToxicity > 1);
+ if (ctrlShown _hazzard) then {
+ [_hazzard,(EPOCH_playerToxicity >= 55)] call _fadeUI;
+ _toxicScale = 1-linearConversion [0,EPOCH_playerToxicity,100,0.01,1];
+ _hazzard ctrlSetTextColor [_toxicScale, 1, _toxicScale, 1];
+ };
+
+ _broken ctrlShow ((player getHitPointDamage "HitLegs") >= 0.5);
+ if (ctrlShown _broken) then {
+ [_broken,true] call _fadeUI;
+ };
+
+ if (_envCold || _envHot || _hungry || _thirsty) then {
+ if (_envHot || _envCold) then {
+ player setFatigue 1;
+ };
+ EPOCH_playerBloodP = (EPOCH_playerBloodP + 0.05) min 190;
+ _increaseStamina = false;
+ } else {
+ if (EPOCH_playerStamina > 0) then {
+ if !(_panic) then {
+ if (!_warnbloodPressure) then {
+ player setFatigue 0;
+ };
+ EPOCH_playerBloodP = EPOCH_playerBloodP - 1 max 100;
+ };
+ };
+ };
+
+ _critical = (damage player >= 0.7 || _warnbloodPressure);
+ _emergency ctrlShow _critical;
+ if (ctrlShown _emergency) then {
+ [_emergency,(EPOCH_playerBloodP > 140)] call _fadeUI;
+ _emergencyScale = 1-linearConversion [0,EPOCH_playerBloodP,180,0.01,1];
+ _emergency ctrlSetTextColor [1, _emergencyScale, _emergencyScale, 1];
+ };
+
+ if (EPOCH_playerBloodP >= 180) then {
+ true call EPOCH_pushCustomVar;
+ };
+ if (_increaseStamina && (getFatigue player) == 0) then {
+ EPOCH_playerStamina = (EPOCH_playerStamina + 0.5) min EPOCH_playerStaminaMax;
+ };
+ if (EPOCH_debugMode) then {
+ call EPOCH_debugMonitor;
+ };
+
+ call EPOCH_TradeLoop;
+
+
+ onEachFrame EPOCH_onEachFrame;
diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event2.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event2.sqf
new file mode 100644
index 000000000..7afca83a8
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/Event2.sqf
@@ -0,0 +1,94 @@
+
+ if !(EPOCH_arr_interactedObjs isEqualTo[]) then {
+ EPOCH_arr_interactedObjs remoteExec["EPOCH_server_save_vehicles", 2];
+ EPOCH_arr_interactedObjs = [];
+ };
+
+ if (damage player != _damagePlayer) then {
+ if (alive player) then {
+ true call EPOCH_pushCustomVar;
+ _damagePlayer = damage player;
+ };
+ };
+
+ if ((rating player) < 0) then {
+ player addRating abs(rating player);
+ };
+
+ // calculate total available power
+ // 1. number of power production devices within range 75m
+
+ // find share of power based on factors
+ // 1. number of players
+ // 2. Other sources of drain (Lights)
+
+ _energyValue = EPOCH_chargeRate min _energyRegenMax;
+ _vehicle = vehicle player;
+ if (_vehicle != player && isEngineOn _vehicle) then {
+ _energyValue = _energyValue + 5;
+ };
+
+ if (currentVisionMode player == 1) then { //NV enabled
+ _energyValue = _energyValue - _energyCostNV;
+ if (EPOCH_playerEnergy == 0) then {
+ player action["nvGogglesOff", player];
+ };
+ };
+
+ EPOCH_playerEnergy = ((EPOCH_playerEnergy + _energyValue) min EPOCH_playerEnergyMax) max 0;
+
+ if !(EPOCH_playerEnergy isEqualTo _prevEnergy) then {
+ 9993 cutRsc["EpochGameUI3", "PLAIN", 0, false];
+ _display3 = uiNamespace getVariable "EPOCH_EpochGameUI3";
+ _energyDiff = round(EPOCH_playerEnergy - _prevEnergy);
+ _diffText = if (_energyDiff > 0) then {format["+%1",_energyDiff]} else {format["%1",_energyDiff]};
+ // hint str [_energyValue,_prevEnergy,EPOCH_playerEnergy];
+ (_display3 displayCtrl 21210) ctrlSetText format["%1/%2 %3", round(EPOCH_playerEnergy), EPOCH_playerEnergyMax, _diffText];
+ _prevEnergy = EPOCH_playerEnergy;
+ };
+
+ if (EPOCH_playerEnergy == 0) then {
+ if (EPOCH_buildMode > 0) then {
+ EPOCH_buildMode = 0;
+ EPOCH_snapDirection = 0;
+ _dt = ["Build Mode Disabled: Need Energy< / t>", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
+ EPOCH_Target = objNull;
+ EPOCH_Z_OFFSET = 0;
+ EPOCH_X_OFFSET = 0;
+ EPOCH_Y_OFFSET = 5;
+ };
+ };
+
+ _attackers = player nearEntities[["Snake_random_EPOCH", "GreatWhite_F", "Epoch_Cloak_F"], 30];
+ if !(_attackers isEqualTo[]) then {
+ (_attackers select 0) call EPOCH_client_bitePlayer;
+ _panic = true;
+ } else {
+ // custom poision
+ _toxicObjs = player nearobjects["SmokeShellCustom", 6];
+ if!(_toxicObjs IsEqualTo[]) then {
+ (_toxicObjs select 0) call EPOCH_client_bitePlayer;
+ _panic = true;
+ } else {
+ _panic = false;
+ };
+ };
+
+ call EPOCH_fnc_Weather;
+
+ // Hunger / Thirst
+ _HTlossRate = _baseHTLoss;
+ if (EPOCH_playerStamina < 100) then {
+ if ((getFatigue player) > 0) then {
+ _HTlossRate = _HTlossRate + (_HTlossRate*(getFatigue player));
+ };
+ } else {
+ _HTlossRate = (_HTlossRate / 2);
+ };
+
+ EPOCH_playerHunger = (EPOCH_playerHunger - _HTlossRate) max 0;
+ EPOCH_playerThirst = (EPOCH_playerThirst - _HTlossRate) max 0;
+
+ call _lootBubble;
+
+ EPOCH_playerStaminaMax = (100 * (round(EPOCH_playerAliveTime/360)/10)) min 2500;
diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event3.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event3.sqf
new file mode 100644
index 000000000..15e4bae8b
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/Event3.sqf
@@ -0,0 +1,6 @@
+
+ if !(_prevEquippedItem isEqualTo EPOCH_equippedItem_PVS) then {
+ _EPOCH_15 = _tickTime;
+ _prevEquippedItem = EPOCH_equippedItem_PVS;
+ publicVariableServer "EPOCH_equippedItem_PVS";
+ };
diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event4.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event4.sqf
new file mode 100644
index 000000000..da2292d3e
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/Event4.sqf
@@ -0,0 +1,17 @@
+
+ _nearByBobbersLocal = [];
+ _nearByBobbers = player nearEntities[["Bobber_EPOCH"], 12];
+ {
+ if (local _x) then {
+ _nearByBobbersLocal pushBack _x
+ }
+ } forEach _nearByBobbers;
+
+ if !(_nearByBobbersLocal isEqualTo []) then {
+ if ((random 100) < 50) then {
+ _bobber = _nearByBobbersLocal select floor(random(count _nearByBobbers));
+ _bobber setVelocity [0,-1,-1];
+ _bobber setVariable ["EPOCH_fishOnLine" , diag_tickTime];
+ };
+
+ };
diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event5.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event5.sqf
new file mode 100644
index 000000000..42a394025
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/Event5.sqf
@@ -0,0 +1,60 @@
+_position = getPosATL player;
+
+EPOCH_nearestLocations = nearestLocations[player, ["NameCityCapital", "NameCity", "Airport"], 300];
+EPOCH_playerIsSwimming = false;
+
+if !(surfaceIsWater _position) then {
+ if (EPOCH_nearestLocations isEqualTo []) then{
+ if (count(_position nearEntities["Animal_Base_F", 800]) < 2) then {
+ // diag_log "DEBUG: Attempt to spawn animal";
+ call EPOCH_client_loadAnimalBrain;
+ };
+ };
+} else {
+ // spawn shark if player is deep water and not in vehicle
+ if (vehicle player == player) then{
+ _offsetZ = ((_position vectorDiff getPosASL player) select 2);
+ if (_offsetZ > 1.7) then {
+ EPOCH_playerIsSwimming = true;
+ };
+ if (_offsetZ > 50) then {
+ "GreatWhite_F" call EPOCH_unitSpawn;
+ };
+ };
+};
+
+// default power state
+EPOCH_nearPower = false;
+EPOCH_chargeRate = 0;
+
+// energy Charge from nearby power plants
+_powerSources = nearestObjects[player, ["Land_spp_Tower_F","Land_wpp_Turbine_V2_F","Land_wpp_Turbine_V1_F","SolarGen_EPOCH"], _energyRange];
+if !(_powerSources isEqualTo[]) then {
+ _totalCapacity = 0;
+ {
+ _powerClass = typeOf _x;
+ _powerCap = getNumber(configFile >> "CfgVehicles" >> _powerClass >> "powerCapacity");
+ _powerType = getNumber(configFile >> "CfgVehicles" >> _powerClass >> "powerType");
+ if (_powerCap == 0) then {
+ _powerCap = 100;
+ };
+ if (_powerType == 1) then {
+ if (sunOrMoon < 1) then {
+ _powerCap = _powerCap/2;
+ };
+ };
+ _totalCapacity = _totalCapacity + _powerCap;
+ } forEach _powerSources;
+ if (_totalCapacity > 0) then {
+ _players = player nearEntities[["Epoch_Male_F", "Epoch_Female_F"], _energyRange];
+ if (_players isEqualTo []) then {
+ EPOCH_chargeRate = ceil _totalCapacity;
+ } else {
+ EPOCH_chargeRate = ceil (_totalCapacity / (count _players));
+ };
+ EPOCH_nearPower = true;
+ };
+};
+
+EPOCH_playerAliveTime = round(EPOCH_playerAliveTime + (_tickTime - EPOCH_clientAliveTimer));
+EPOCH_clientAliveTimer = _tickTime;
diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event6.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event6.sqf
new file mode 100644
index 000000000..7d922a608
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/Event6.sqf
@@ -0,0 +1 @@
+false call EPOCH_pushCustomVar;
diff --git a/Sources/epoch_code/compile/setup/masterLoop/Event7.sqf b/Sources/epoch_code/compile/setup/masterLoop/Event7.sqf
new file mode 100644
index 000000000..2a4516bc3
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/Event7.sqf
@@ -0,0 +1,23 @@
+
+ if ((EPOCH_playerSpawnArray select(EPOCH_spawnIndex find "Epoch_Sapper_F")) <= 0) then{
+ _sapperChance = 1 + (EPOCH_playerSoiled / 2);
+ if !(EPOCH_nearestLocations isEqualTo[]) then{
+ _sapperChance = _sapperChance + 2;
+ };
+ // 1% - 55% if soiled (+ 2% if in city) chance to spawn sapper every 10 minutes
+ if (random _sapperRndChance < _sapperChance) then{
+ "Epoch_Sapper_F" call EPOCH_unitSpawnIncrease;
+ };
+ };
+
+ _spawnUnits = [];
+ {
+ if (_x > 0) then{
+ _spawnUnits pushBack(EPOCH_spawnIndex select _forEachIndex);
+ };
+ } forEach EPOCH_playerSpawnArray;
+
+ // test spawning one antagonist every 10 minutes select one unit at random to spawn
+ if !(_spawnUnits isEqualTo[]) then{
+ (_spawnUnits select(floor random(count _spawnUnits))) call EPOCH_unitSpawn;
+ };
diff --git a/Sources/epoch_code/compile/setup/masterLoop/init.sqf b/Sources/epoch_code/compile/setup/masterLoop/init.sqf
new file mode 100644
index 000000000..e4cc32bd1
--- /dev/null
+++ b/Sources/epoch_code/compile/setup/masterLoop/init.sqf
@@ -0,0 +1,179 @@
+
+_prevEquippedItem = [];
+_damagePlayer = damage player;
+_panic = false;
+_prevEnergy = EPOCH_playerEnergy;
+
+// init config data
+_sapperRndChance = ["CfgEpochClient", "sapperRngChance", 100] call EPOCH_fnc_returnConfigEntryV2;
+EPOCH_droneRndChance = ["CfgEpochClient", "droneRngChance", 100] call EPOCH_fnc_returnConfigEntryV2;
+_baseHTLoss = ["CfgEpochClient", "baseHTLoss", 8] call EPOCH_fnc_returnConfigEntryV2;
+_energyCostNV = ["CfgEpochClient", "energyCostNV", 3] call EPOCH_fnc_returnConfigEntryV2;
+_energyRegenMax = ["CfgEpochClient", "energyRegenMax", 5] call EPOCH_fnc_returnConfigEntryV2;
+_energyRange = ["CfgEpochClient", "energyRange", 75] call EPOCH_fnc_returnConfigEntryV2;
+
+EPOCH_chargeRate = 0;
+
+// default data if mismatch
+if (count EPOCH_playerSpawnArray != count EPOCH_spawnIndex) then{
+ { EPOCH_playerSpawnArray pushBack 0 } forEach EPOCH_spawnIndex;
+};
+
+9990 cutRsc ["EpochGameUI","PLAIN",2,false];
+_display = uiNamespace getVariable "EPOCH_EpochGameUI";
+
+_thirst = _display displayCtrl 21201;
+_hunger = _display displayCtrl 21202;
+_broken = _display displayCtrl 21203;
+_oxygen = _display displayCtrl 21204;
+_hazzard = _display displayCtrl 21205;
+_emergency = _display displayCtrl 21206;
+
+{
+ _x ctrlShow false;
+}forEach[_thirst,_hunger,_broken,_oxygen,_hazzard,_emergency];
+
+// find radio
+{
+ if (configName(inheritsFrom(configFile >> "CfgWeapons" >> _x)) == "ItemRadio") exitWith{
+ EPOCH_equippedItem_PVS = [_x, true, player];
+ };
+} forEach assignedItems player;
+
+// lootBubble Init
+_loots = ["CfgEpochClient", "lootClasses", EPOCH_lootClasses] call EPOCH_fnc_returnConfigEntryV2;
+
+_lootClasses = ('CfgBuildingLootPos' call EPOCH_returnConfig) call Bis_fnc_getCfgSubClasses;
+_lootClasses = _lootClasses - ["Default"];
+
+_lootBubble = {
+ private["_pos", "_others", "_objects", "_nearObjects", "_building", "_travelDir", "_lootDist", "_xPos", "_yPos", "_lootLoc", "_playerPos", "_distanceTraveled", "_class", "_dir", "_color", "_colors", "_item", "_randomColor", "_positions", "_lootBiasPos", "_lootType", "_config"];
+ _playerPos = getPosATL vehicle player;
+ _distanceTraveled = EPOCH_lastPlayerPos distance _playerPos;
+ if (_distanceTraveled > 10 && _distanceTraveled < 200) then {
+ _travelDir = [EPOCH_lastPlayerPos, _playerPos] call BIS_fnc_dirTo;
+ _lootDist = 30 + _distanceTraveled;
+ _xPos = (_playerPos select 0) + (_lootDist * sin(_travelDir));
+ _yPos = (_playerPos select 1) + (_lootDist * cos(_travelDir));
+ _lootLoc = [_xPos, _yPos, 0];
+
+ _objects = nearestObjects[_lootLoc, _lootClasses, 30];
+ _config = 'CfgEpochClient' call EPOCH_returnConfig;
+ _buildingJammerRange = getNumber(_config >> "buildingJammerRange");
+ if (_buildingJammerRange == 0) then { _buildingJammerRange = 75; };
+
+ _jammer = nearestObjects [_lootLoc, ["PlotPole_EPOCH"], _buildingJammerRange];
+
+ if (!(_objects isEqualTo[]) && (_jammer isEqualTo[])) then {
+
+ _building = _objects select(floor(random(count _objects)));
+
+ if !(_building in EPOCH_LootedBlds) then {
+
+ _pos = getPosATL _building;
+ _others = _building nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 15];
+ if (_others isEqualTo[]) then {
+
+ _nearObjects = nearestObjects[_pos, ["WH_Loot", "Animated_Loot"], 35];
+ if (_nearObjects isEqualTo[]) then {
+
+ _config = ('CfgBuildingLootPos' call EPOCH_returnConfig) >> (typeOf _building);
+
+ if (isClass(_config)) then {
+
+ _lootBiasPos = getNumber(_config >> "lootBiasPos");
+ _lootType = getText(_config >> "lootType");
+
+ EPOCH_LootedBlds pushBack _building;
+ if (count EPOCH_LootedBlds >= 20) then {
+ EPOCH_LootedBlds deleteAt 0;
+ };
+
+ {
+ _positions = [] + getArray(_config >> (_x select 0));
+ if !(_positions isEqualTo[]) then {
+ _class = _x select 1;
+ _randomColor = _x select 2;
+ {
+
+ if ((random 100) < _lootBiasPos) then {
+
+ _pos = _building modelToWorld(_x select 0);
+
+ if (nearestObjects[_pos, ["WH_Loot", "Animated_Loot"], 2] isEqualTo[]) then {
+
+ if ((typeName _class) == "ARRAY") then {
+ _class = _class select(floor(random(count _class)));
+ };
+
+ _dir = (_x select 1) + (getDir _building);
+ if (_dir > 360) then {
+ _dir = _dir - 360;
+ };
+
+ // Temp for now till we get more
+ if (_lootType == "mil" && _class == "Bed_EPOCH") then {
+ _class = "Bunk_EPOCH";
+ };
+
+ _item = createVehicle[_class, _pos, [], 0.0, "CAN_COLLIDE"];
+ _item setDir _dir;
+
+ // force item to ground level is resulting z pos is below ground.
+ if (_pos select 2 < 0) then {
+ _pos set[2, 0];
+ };
+
+ if (surfaceIsWater _pos) then {
+ _item setPosASL _pos;
+ } else {
+ _item setPosATL _pos;
+ };
+
+ if (typeName _randomColor isEqualTo "STRING") then {
+ _randomColor = _randomColor isEqualTo "true";
+ };
+
+ if (_randomColor) then {
+ _colors = [] + getArray(configFile >> "CfgVehicles" >> _class >> "availableTextures");
+ if !(_colors isEqualTo[]) then {
+ _color = _colors select floor(random(count _colors));
+ _item setObjectTextureGlobal[0, _color];
+ };
+ };
+ };
+ };
+ }forEach _positions;
+ };
+ }forEach _loots;
+ };
+ };
+ };
+ };
+ };
+ };
+ EPOCH_lastPlayerPos = _playerPos;
+};
+
+// [control,bool] call _fadeUI;
+_fadeUI = {
+ private ["_ctrl"];
+ _ctrl = _this select 0;
+ if (_this select 1) then {
+ if (ctrlFade _ctrl == 0) then {
+ _ctrl ctrlSetFade 1;
+ _ctrl ctrlCommit 0.5;
+ };
+ if (ctrlFade _ctrl == 1) then {
+ _ctrl ctrlSetFade 0;
+ _ctrl ctrlCommit 0.5;
+ };
+ } else {
+ if (ctrlFade _ctrl != 1) then {
+ _ctrl ctrlSetFade 0;
+ _ctrl ctrlCommit 0;
+ };
+ };
+};
+
+_cursorTarget = objNull;
diff --git a/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf b/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf
index 21c3ae3d7..4459c2b32 100644
--- a/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf
+++ b/Sources/epoch_code/compile/traders/EPOCH_startInteract.sqf
@@ -23,16 +23,18 @@ if (isNull _target) then {
if (!isNull _target) then {
if (alive _target) then {
+ /*
if ((_target isKindOf "LandVehicle") || (_target isKindOf "Air") || (_target isKindOf "Ship") || (_target isKindOf "Tank")) then {
_dialog = "InteractVehicle";
};
- /*
+
if (_ctrl) then {
if (_target isKindOf "Constructions_static_F" || _target isKindOf "Constructions_foundation_F") then {
_dialog = "InteractBaseBuilding";
};
};
*/
+ /*
if (_target isKindOf "Man") then {
if (_target != player) then {
if (!isPlayer _target) then {
@@ -42,6 +44,7 @@ if (!isNull _target) then {
};
};
};
+ */
};
if (_forceGear) then {
diff --git a/Sources/epoch_code/compile/traders/EPOCH_startNpcTrade.sqf b/Sources/epoch_code/compile/traders/EPOCH_startNpcTrade.sqf
index 341fba078..c295825e2 100644
--- a/Sources/epoch_code/compile/traders/EPOCH_startNpcTrade.sqf
+++ b/Sources/epoch_code/compile/traders/EPOCH_startNpcTrade.sqf
@@ -19,8 +19,8 @@ if (!isNull _this) then {
_item = lbData[41501, _i];
if (isClass (_config >> _item)) then{
-
- // test remove items to be sold and add to array
+
+ // test remove items to be sold and add to array
if ([_item, "CfgWeapons"] call EPOCH_fnc_isAny) then {
if (_item in items player) then {
player removeItem _item;
@@ -48,10 +48,10 @@ if (!isNull _this) then {
};
};
};
- // test
+ // test
+
+
-
-
};
};
};
@@ -107,18 +107,14 @@ if (!isNull _this) then {
if !((EPOCH_TRADE_COMPLETE select 1) isEqualTo[]) then {
if ((EPOCH_TRADE_COMPLETE select 1) isEqualTo(_this select 1)) then {
- _errorMsg = 'Items Purchased';
-
+ _errorMsg = 'Items Purchased: ';
// add purchased items
{
if ([_x, "CfgWeapons"] call EPOCH_fnc_isAny) then {
- if (player canAdd _x) then {
- player addItem _x;
- }
- else {
- _type = getNumber(configfile >> "CfgWeapons" >> (_x) >> "type");
- _addWeaponToHands = false;
- switch (_type) do {
+ _errorMsg = _errorMsg + format["%1, ", getText(configfile >> "CfgWeapons" >> (_x) >> "displayName")];
+ _type = getNumber(configfile >> "CfgWeapons" >> (_x) >> "type");
+ _addWeaponToHands = false;
+ switch (_type) do {
case 1: {
if (primaryWeapon player == "") then {
_addWeaponToHands = true;
@@ -134,24 +130,18 @@ if (!isNull _this) then {
_addWeaponToHands = true;
};
};
- };
- if (_addWeaponToHands) then {
- player addWeapon _x;
- }
- else {
- _errorMsg = "Not enough space";
- };
};
-
- }
- else {
+ if (_addWeaponToHands) then {
+ player addWeapon _x;
+ } else {
+ _x call EPOCH_fnc_addItemOverflow;
+ };
+ } else {
if ([_x, "CfgMagazines"] call EPOCH_fnc_isAny) then {
- if (player canAdd _x) then {
- player addMagazine _x;
- }
- else {
- _errorMsg = "Not enough space";
- };
+ _errorMsg = _errorMsg + format["%1, ", getText(configfile >> "CfgMagazines" >> (_x) >> "displayName")];
+ _x call EPOCH_fnc_addItemOverflow;
+ } else {
+ _errorMsg = _errorMsg + format["%1, ", getText(configfile >> "CfgVehicles" >> (_x) >> "displayName")];
};
};
} forEach(_this select 1);
@@ -169,4 +159,4 @@ if (!isNull _this) then {
EPOCH_TRADE_STARTED = nil;
};
};
-};
\ No newline at end of file
+};
diff --git a/Sources/epoch_code/config.cpp b/Sources/epoch_code/config.cpp
index 055bde509..640d3731e 100644
--- a/Sources/epoch_code/config.cpp
+++ b/Sources/epoch_code/config.cpp
@@ -16,7 +16,7 @@ class CfgMods
hidePicture = 0;
hideName = 0;
action = "http://www.epochmod.com";
- version = "0.3.4.0";
+ version = "0.3.5.0";
majorVersion = 0.3; //MUST BE A NUMBER!; Change this if we release a new major version, don't change if we push just push a hotfix
ArmAVersion = 150;
overview = "Open world survival mod set in the year 2035, Just two years after the mass extinction of billions of people. Those that remain are left with remnants of a once technological society. Try to survive, build, or explore your way through the harsh dynamic environment.";
@@ -27,20 +27,20 @@ class Epoch
class Version
{
//Version System, Check if PBO Version is compatible with Code
- A3_epoch_assets = "0.3.4.0";
- A3_epoch_assets_1 = "0.3.4.0";
- epoch_objects = "0.3.4.0";
- A3_epoch_assets_3 = "0.3.4.0";
- A3_epoch_config = "0.3.4.0";
- A3_epoch_language = "0.3.4.0";
- Underground_Epoch = "0.3.4.0";
- A3_epoch_vehicles = "0.3.4.0";
- a3_epoch_weapons = "0.3.4.0";
- a2_epoch_weapons = "0.3.4.0";
- a3_epoch_structures = "0.3.4.0";
- A3_epoch_functions = "0.3.4.0";
- A3_epoch_vehicles_1 = "0.3.4.0";
- Enhanced_Epoch_AiASupport = "0.3.4.0";
+ A3_epoch_assets = "0.3.5.0";
+ A3_epoch_assets_1 = "0.3.5.0";
+ epoch_objects = "0.3.5.0";
+ A3_epoch_assets_3 = "0.3.5.0";
+ A3_epoch_config = "0.3.5.0";
+ A3_epoch_language = "0.3.5.0";
+ Underground_Epoch = "0.3.5.0";
+ A3_epoch_vehicles = "0.3.5.0";
+ a3_epoch_weapons = "0.3.5.0";
+ a2_epoch_weapons = "0.3.5.0";
+ a3_epoch_structures = "0.3.5.0";
+ A3_epoch_functions = "0.3.5.0";
+ A3_epoch_vehicles_1 = "0.3.5.0";
+ Enhanced_Epoch_AiASupport = "0.3.5.0";
};
};
@@ -146,7 +146,6 @@ class CfgClientFunctions
class maintainIT {};
class lockCheck {};
class countdown {};
- class fnc_SelectTarget {};
class fnc_SelectTargetBuild {};
class isBuildAllowed {};
class simulSwap {};
@@ -156,7 +155,7 @@ class CfgClientFunctions
class upgradeBUILDv2 {};
class removeBUILD {};
class changeWallState {};
- class QuickUpgrade {};
+ class checkBuild {};
};
class traders
@@ -178,6 +177,7 @@ class CfgClientFunctions
class interface_event_handlers
{
class KeyDown {};
+ class KeyUp {};
class onChar {};
};
@@ -185,6 +185,7 @@ class CfgClientFunctions
{
class client_publicEH {};
class masterLoop {};
+ class masterLoop_v2 {};
class clientInit {};
class clientRespawn {};
class clientRevive {};
@@ -220,6 +221,8 @@ class CfgClientFunctions
class fnc_stringLeft {};
class fnc_findSapperStalkLocation {};
class fnc_dirToFuzzy {};
+
+ class fnc_cursorTarget {};
};
class environment
@@ -259,25 +262,31 @@ class CfgClientFunctions
class gui {
file = "\x\addons\a3_epoch_code\gui\scripts";
class onPause {};
- class interactVehicle {};
class showStats {};
- //class dynamicMenu {};
- //class dynamicMenuCleanup {};
class 3DctrlPitchYaw {};
class 3DctrlSpin {};
class 3DctrlYaw {};
class InterruptConfig {};
class InterruptConfigActions {};
- class gui3DCooldown {};
- class gui3DWorldPos {};
- class gui3DModelPos {};
class getIDC {};
+ class guiObjHP {};
+ class secureStorageHandler {};
+ class dynamicText {};
+ class genderSelection {};
};
class config {
file = "\x\addons\a3_epoch_code\gui\scripts\config";
class config_keymap {};
};
+
+ class dynamenu {
+ file = "\x\addons\a3_epoch_code\gui\scripts\dynamenu";
+ class dynamicMenu {};
+ class dynamicMenuPopulate {};
+ class dynamicMenuCleanup {};
+ };
+
class gui_craft {
file = "\x\addons\a3_epoch_code\gui\scripts\craftingv2";
class crafting_animate {};
@@ -295,7 +304,7 @@ class CfgClientFunctions
class crafting_LB_defaults {};
class crafting_LB_doubleClick {};
class crafting_colorScheme {};
- };
+ };
class group {
file = "\x\addons\a3_epoch_code\gui\scripts\group";
class Group_invitePlayer {};
@@ -331,6 +340,16 @@ class CfgClientFunctions
class postprocessCreate {};
class postprocessAdjust {};
class postprocessDestroy {};
+ class setDrunk {}; //needs a better name
+ };
+ class worldToScreen {
+ file = "\x\addons\a3_epoch_code\gui\scripts\worldToScreen";
+ class gui3DCooldown {};
+ class gui3DCooldownEH {};
+ class gui3DWorldPos {};
+ class gui3DWorldPosEH {};
+ class gui3DModelPos {};
+ class gui3DModelPosEH {};
};
};
};
diff --git a/Sources/epoch_code/gui/Epoch_GUI_Config.hpp b/Sources/epoch_code/gui/Epoch_GUI_Config.hpp
index e7fed27b2..86662ba61 100644
--- a/Sources/epoch_code/gui/Epoch_GUI_Config.hpp
+++ b/Sources/epoch_code/gui/Epoch_GUI_Config.hpp
@@ -42,7 +42,7 @@ class ScrollBar;
#include "Epoch_GUI_ClientConfigs.hpp"
#include "Epoch_GUI_rmx.hpp"
-class RscTitles
+class RscTitles
{
#include "Epoch_RscTitles.hpp"
};
@@ -116,7 +116,7 @@ class TradeRequest
};
};
*/
-
+/*
class QuickUpgrade
{
idd = -15;
@@ -169,7 +169,7 @@ class QuickUpgrade
};
};
-
+*/
class QuickTake
{
idd = -5;
@@ -275,7 +275,7 @@ class TapOut
};
-
+/*
class SelectGender
{
idd = -7;
@@ -318,6 +318,78 @@ class SelectGender
};
};
};
+*/
+
+class SelectGender
+{
+
+ idd = -7;
+ movingEnable = 0;
+ enableSimulation = 1;
+ onLoad = "['Select your gender',10] call Epoch_dynamicText; setMousePosition [0.5, 0.5];";
+ class ControlsBackground
+ {
+ class Background: RscPicture //Replace with custom background
+ {
+ idc = 88800;
+ text = "x\addons\a3_epoch_code\Data\gender_selection.paa";
+ x = safezoneX - safezoneW * 0.1;
+ y = safezoneY - safezoneH * 0.1;
+ w = safezoneW + safezoneW * 0.3;
+ h = safezoneH + safezoneH * 0.3;
+ };
+ };
+ class Objects
+ {
+ class female
+ {
+
+ idc = 88801;
+ type = 82;
+ model = "\x\addons\a3_epoch_assets\models\clone_female.p3d";
+ scale = 0.5;
+
+ direction[] = {0, 1, 0};
+ up[] = {0, 0, 1};
+
+ x = -1;
+ z = 1;
+ y = 1.8;
+
+ xBack = -1;
+ zBack = 1;
+ yBack = 1.8;
+
+ inBack = 0;
+ enableZoom = 0;
+ zoomDuration = 0.001;
+ onMouseButtonDown = "closeDialog 0; EPOCH_PlayerIsMale = false;";
+ onLoad = "(_this select 0) ctrlSetModelDirAndUp [[0,1,0],[0,0,1]];";
+ };
+ class male: female
+ {
+ idc = 88802;
+ model = "\x\addons\a3_epoch_assets\models\clone_male.p3d";
+ x = 2;
+ xBack = 2;
+ onMouseButtonDown = "closeDialog 0; EPOCH_PlayerIsMale = true;";
+ };
+ };
+ class controls
+ {
+ class overlay: RscPicture
+ {
+ idc = 88803;
+ text = "#(argb,8,8,3)color(0,0,0,0)";
+ x = safezoneX + 0.4 * safezoneW;
+ y = safezoneY;
+ w = safezoneW * 0.2;
+ h = safezoneH;
+ onMouseMoving = "(_this select 1) call epoch_genderSelection;";
+ onLoad = "(_this select 0) ctrlEnable true;";
+ };
+ };
+};
class TradeNPCMenu
{
@@ -390,6 +462,7 @@ class TradeNPCMenu
h = 0.282151 * safezoneH;
onLBDblClick = "[41501,_this] call EPOCH_npcTraderAdd";
onLBDrop = "[41501,_this] call EPOCH_npcTraderAdd";
+ onLoad = "ctrlSetFocus (_this select 0)";
};
class RscListbox_playerOffer: RscListbox
{
@@ -1191,7 +1264,7 @@ class CraftItem
};
};
-
+/*
class InteractVehicle
{
idd = -11;
@@ -1241,7 +1314,7 @@ class InteractVehicle
};
};
};
-
+*/
/*
class InteractPlayer
{
@@ -1273,7 +1346,7 @@ class InteractPlayer
};
};
*/
-
+/*
class InteractNPC
{
idd = -12;
@@ -1302,7 +1375,7 @@ class InteractNPC
h = 0.08;
action = "call EPOCH_startNPCTraderMenu;";
};
- /*
+
class RscButtonMenu_2403: RscButtonMenu
{
idc = 2403;
@@ -1313,7 +1386,7 @@ class InteractNPC
h = 0.08;
action = "closeDialog 0; player action [""Gear"", cursorTarget];";
};
- */
+
class RscButtonMenu_2404: RscButtonMenu
{
idc = 2405;
@@ -1326,6 +1399,7 @@ class InteractNPC
};
};
};
+*/
/*
class InteractBuilding
@@ -1492,6 +1566,7 @@ class InteractBank
};
};
};
+/*
class InteractBaseBuilding
{
idd = -14;
@@ -1542,9 +1617,10 @@ class InteractBaseBuilding
h = 0.08;
action = "closeDialog 0; cursorTarget call EPOCH_fnc_SelectTargetBuild;";
};
-
+
};
};
+*/
/*
class InteractItem
{
@@ -2398,7 +2474,7 @@ class RscDisplayInventory_DLCTemplate
};
};
};
-
+
class RscDisplayInventory
{
@@ -3235,13 +3311,13 @@ class RscDisplayInventory
class EpochBtnBG : IGUIBack
{
idc = -10;
-
+
//x = 0.433468 * safezoneW + safezoneX;
//y = 0.75872 * safezoneH + safezoneY;
//w = 0.30231 * safezoneW;
//h = 0.0337482 * safezoneH;
-
+
x = "14.5 * ( ((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)";
y = "23.9 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - ( ((safezoneW / safezoneH) min 1.2) / 1.2))/2)";
w = "24.5 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
@@ -3254,12 +3330,12 @@ class RscDisplayInventory
idc = -11;
text = "Group Menu";
onMouseButtonDown = "_this call EPOCH_Inventory_Group";
-
+
//x = 0.437079 * safezoneW + safezoneX;
//y = 0.764 * safezoneH + safezoneY;
//w = 0.0711741 * safezoneW;
//h = 0.022 * safezoneH;
-
+
x = "33.2 * ( ((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)";
y = "24 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - ( ((safezoneW / safezoneH) min 1.2) / 1.2))/2)";
w = "6 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
@@ -3270,12 +3346,12 @@ class RscDisplayInventory
idc = -12;
text = "Requests";
onMouseButtonDown = "_this call EPOCH_Inventory_iGroup";
-
+
//x = 0.511347 * safezoneW + safezoneX;
//y = 0.764 * safezoneH + safezoneY;
//w = 0.0711741 * safezoneW;
//h = 0.022 * safezoneH;
-
+
x = "27.0 * ( ((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)";
y = "24 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - ( ((safezoneW / safezoneH) min 1.2) / 1.2))/2)";
w = "6 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
@@ -3286,12 +3362,12 @@ class RscDisplayInventory
idc = -13;
text = "EXAMINE";
onMouseButtonDown = "call EPOCH_consumeItem";
-
+
//x = 0.585617 * safezoneW + safezoneX;
//y = 0.764 * safezoneH + safezoneY;
//w = 0.0711741 * safezoneW;
//h = 0.022 * safezoneH;
-
+
x = "14.62 * ( ((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)";
y = "24 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - ( ((safezoneW / safezoneH) min 1.2) / 1.2))/2)";
w = "6 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
@@ -3302,12 +3378,12 @@ class RscDisplayInventory
idc = -14;
text = "CRAFT";
onMouseButtonDown = "EPOCH_CraftingItem call EPOCH_crafting_load;";
-
+
//x = 0.659883 * safezoneW + safezoneX;
//y = 0.764 * safezoneH + safezoneY;
//w = 0.0711741 * safezoneW;
//h = 0.022 * safezoneH;
-
+
x = "20.8 * ( ((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)";
y = "24 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - ( ((safezoneW / safezoneH) min 1.2) / 1.2))/2)";
w = "6 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
diff --git a/Sources/epoch_code/gui/Epoch_GUI_rmx.hpp b/Sources/epoch_code/gui/Epoch_GUI_rmx.hpp
index f74b585cd..5bd2807c4 100644
--- a/Sources/epoch_code/gui/Epoch_GUI_rmx.hpp
+++ b/Sources/epoch_code/gui/Epoch_GUI_rmx.hpp
@@ -3,6 +3,7 @@ class rmx_dynamenu {
enableSimulation = 1;
movingEnable = 1;
onLoad = "setMousePosition [0.5, 0.5];";
+ onKeyUp = "_this call epoch_keyUp";
class controls {};
};
@@ -47,6 +48,136 @@ class rmx_rscObject
};
};
+class rmx_rscContainer
+{
+
+ idd = 99440;
+ movingEnable = 0;
+ enableSimulation = 1;
+ enableDisplay = 0;
+
+ class Objects
+ {
+ class _CT_OBJECT_CONTAINER
+ {
+ access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified)
+ idc = 99441; // Control identification (without it, the control won't be displayed)
+ type = 82; // Type
+ style = ST_LEFT; // Style
+ blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect.
+
+ //model = "\A3\Misc_F\Helpers\UserTexture1m.p3d"; // Displayed model
+ //model = "\x\addons\a3_epoch_code\gui\terminal2.p3d"; // Displayed model
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\center_plane.p3d";
+ scale = 0.2; // Model scale
+
+ x = 26 * GUI_GRID_CENTER_W + GUI_GRID_CENTER_X; // Horizontal coordinates
+ y = 21 * GUI_GRID_CENTER_H + GUI_GRID_CENTER_Y; // Vertical coordinates
+ z = 1; // Depth coordinates
+ //position[] = {0,0,1}; // Alternative XYZ coordinates, where XY is center of the screen
+
+ xBack = 25 * GUI_GRID_CENTER_W + GUI_GRID_CENTER_X; // Horizontal background coordinates
+ yBack = 12 * GUI_GRID_CENTER_H + GUI_GRID_CENTER_Y; // Vertical background coordinates
+ zBack = 2; // Depth background coordinates
+ //positionBack[] = {0,0,2}; // Alternative XYZ coordinates, where XY is center of the screen
+
+ enableZoom = 1; // Allow foreground/background transformation
+ zoomDuration = 0.5; // Speed of foreground/background transformation
+ inBack = 0; // Start in back (Back coordinates are used)
+
+ direction[] = {1,0,0.5}; // Model vector dir
+ up[] = {0.5,1,0}; // Model vector up
+
+ tooltip = "CT_OBJECT"; // Tooltip text
+ tooltipColorShade[] = {0,0,0,1}; // Tooltip background color
+ tooltipColorText[] = {1,1,1,1}; // Tooltip text color
+ tooltipColorBox[] = {1,1,1,1}; // Tooltip frame color
+
+ class Areas // Configurable UI areas. Normally interactive controls (buttons, listboxes, ...) are not interactive here.
+ {
+ class UserTextureL
+ {
+ selection = "usertextureL"; // Model selection on which the UI will be rendered
+ class Controls
+ {
+ class _CT_STATIC
+ {
+ idc = 1100; // Control identification (without it, the control won't be displayed)
+ type = CT_STATIC; // Type
+ style = ST_LEFT + ST_CENTER + ST_MULTI; // Style
+
+ x = 0; // Horizontal coordinates (relative to the selection area)
+ y = 0; // Vertical coordinates (relative to the selection area)
+ w = 1; // Width (relative to the selection area)
+ h = 1; // Height (relative to the selection area)
+
+ colorBackground[] = {0,0,0,1}; // Fill color
+
+ text = "\nCT_OBJECT\n_CONTAINER"; // Displayed text
+ sizeEx = 6 * GUI_GRID_CENTER_H; // Text size
+ font = "VT323"; // Font from CfgFontFamilies
+ colorText[] = {1,0,0,1}; // Text color
+ lineSpacing = 1; // When ST_MULTI style is used, this defines distance between lines (1 is text height)
+ };
+ };
+ };
+ class UserTexture
+ {
+ selection = "usertexture"; // Model selection on which the UI will be rendered
+ class Controls
+ {
+ class _CT_STATIC
+ {
+ idc = 11002; // Control identification (without it, the control won't be displayed)
+ type = CT_STATIC; // Type
+ style = ST_LEFT + ST_CENTER + ST_MULTI; // Style
+
+ x = 0; // Horizontal coordinates (relative to the selection area)
+ y = 0; // Vertical coordinates (relative to the selection area)
+ w = 1; // Width (relative to the selection area)
+ h = 1; // Height (relative to the selection area)
+
+ colorBackground[] = {0,0,0,1}; // Fill color
+
+ text = "\nCT_OBJECT\n_CONTAINER"; // Displayed text
+ sizeEx = 6 * GUI_GRID_CENTER_H; // Text size
+ font = "VT323"; // Font from CfgFontFamilies
+ colorText[] = {1,0,0,1}; // Text color
+ lineSpacing = 1; // When ST_MULTI style is used, this defines distance between lines (1 is text height)
+ };
+ };
+ };
+ class UserTextureR
+ {
+ selection = "usertextureR"; // Model selection on which the UI will be rendered
+ class Controls
+ {
+ class _CT_STATIC
+ {
+ idc = 11001; // Control identification (without it, the control won't be displayed)
+ type = CT_STATIC; // Type
+ style = ST_LEFT + ST_CENTER + ST_MULTI; // Style
+
+ x = 0; // Horizontal coordinates (relative to the selection area)
+ y = 0; // Vertical coordinates (relative to the selection area)
+ w = 1; // Width (relative to the selection area)
+ h = 1; // Height (relative to the selection area)
+
+ colorBackground[] = {0,0,0,1}; // Fill color
+
+ text = "\nCT_OBJECT\n_CONTAINER"; // Displayed text
+ sizeEx = 6 * GUI_GRID_CENTER_H; // Text size
+ font = "VT323"; // Font from CfgFontFamilies
+ colorText[] = {1,0,0,1}; // Text color
+ lineSpacing = 1; // When ST_MULTI style is used, this defines distance between lines (1 is text height)
+ };
+ };
+ };
+ };
+ };
+ };
+};
+
class rmx_rscControlsGroup: RscControlsGroup
{
idc = -1;
@@ -620,4 +751,22 @@ class Epoch_main_config_combo: RscCombo
};
onLBSelChanged = "_this call EPOCH_InterruptConfigActions;";
+};
+
+class rmx_ST1: RscStructuredText
+{
+ text = "";
+ size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
+ colorText[] = {1,1,1,1.0};
+ shadow = 2;
+ class Attributes
+ {
+ font = "PuristaMedium";
+ color = "#ffffff";
+ colorLink = "#D09B43";
+ align = "center";
+ valign = "middle";
+ size = "2";
+ shadow = 2;
+ };
};
\ No newline at end of file
diff --git a/Sources/epoch_code/gui/scripts/Epoch_dynamicMenu.sqf b/Sources/epoch_code/gui/scripts/Epoch_dynamicMenu.sqf
deleted file mode 100644
index e1011dfeb..000000000
--- a/Sources/epoch_code/gui/scripts/Epoch_dynamicMenu.sqf
+++ /dev/null
@@ -1,137 +0,0 @@
-#include <\x\Addons\rmx_init\defines.inc>
-
-//TODO: read key press from global var (profileNamespace config)
-//TODO: admin choice to use missionConfigFile
-//TODO: (Ask team) suffix code to close dialog when button pressed
-//TODO: unlimited categories
-//TODO: functionize var Defines, do check before button action
-//TODO: nil before closing display
-//TODO: add commented out dialog version to display
-//TODO: add cooldown
-//TODO: prevent from opening and instantly close if known display is on
-
-if !(isNil "rmx_var_dynamicMenuInProgress") exitWith {};
-
-if !(isNil "rmx_var_dynamicMenuHOLD") exitWith {};
-
-private ["_display","_cfg","_cat","_buttonSettings","_configs","_subclasses","_action","_entries","_img","_img2","_center","_defaultScaleX","_defaultScaleY","_distance","_scaleLargeX","_scaleLargeY","_scaleSmallX","_scaleSmallY","_scaleSelectedX","_scaleSelectedY","_points","_positions","_positions2","_positions3","_x","_y"];
-disableSerialization;
-
-rmx_var_dynamicMenuInProgress = true; //needed to suspend button spam, removed later
-
-_display = (findDisplay 46) createDisplay "rmx_dynamenu";
-_display displaySetEventHandler ["keyUp", "[false,_this select 1] call Epoch_dynamicMenuCleanup;"];
-
-//TODO: config choice based on global variable or dynamic config update (slower)
-_cfg = param [0,"cfgDynamicMenu" call EPOCH_returnConfig,[configFile]];
-
-/** Variable Defines **/
-{
- call compile (format ["%1 = %2;",configName _x,getText _x]);
-} count (configProperties [(_cfg >> "variableDefines"),"true",false]);
-
-_cat = if (isClass _cfg >> "dynaButtons") then {
- (_cfg >> "dynaButtons")
- } else {
- _cfg
- };
-
-/** Button configs **/
-_buttonSettings = [];
-
-_configs = "true" configClasses (_cat);
-{
- if (call compile (getText(_x >> "condition"))) then {
-
- _subclasses = configProperties [_x, "isClass _x",true];
-
- _action = if (_subclasses isEqualTo []) then {
- compile (format ["%1",getText(_x >> "action")])
- } else {
- compile (format ["[true,57] call Epoch_dynamicMenuCleanup; %2",getText(_x >> "action")])
- };
- //diag_log _action;
- _buttonSettings pushBack [
- getText(_x >> "icon"),
- getText(_x >> "tooltip"),
- _action
- ];
- };
-} forEach _configs;
-
-_entries = count _buttonSettings;
-if (_entries <= 0) exitWith {rmx_var_tabmenu = true; rmx_var_dynamicMenuInProgress = nil;};
-
-//Post processing
-if (isNil "rmx_var_dynamenuPPHandle") then {
- rmx_var_dynamenuPPHandle = ["dynamicBlur",10] call epoch_postProcessCreate;
- [rmx_var_dynamenuPPHandle, 1, [1]] call epoch_postprocessAdjust;
-};
-
-_img = "#(rgb,8,8,3)color(0,0,0,0)";
-_img2 = "x\addons\a3_epoch_code\Data\UI\buttons\dm_selection.paa";
-
-//defaults don't edit
-_center = 0.5;
-_defaultScaleX = 0.4;
-_defaultScaleY = 0.5;
-_distance = 0.7 + _entries / 100;
-
-//edit scaling here (divisor only, larger values produce smaller image)
-_scaleLargeX = _defaultScaleX / (1.5 + _entries / 10); //anim invisible
-_scaleLargeY = _defaultScaleY / (1.5 + _entries / 10);
-_scaleSmallX = _defaultScaleX / (2.5 + _entries / 10); //icons
-_scaleSmallY = _defaultScaleY / (2.5 + _entries / 10);
-_scaleSelectedX = _defaultScaleX / (1.75 + _entries / 10); //anim selected
-_scaleSelectedY = _defaultScaleY / (1.75 + _entries / 10);
-
-_points = 360 / _entries;
-
-_positions = [];
-_positions2 = [];
-_positions3 = [];
-for "_p" from 0 to 360 step _points do {
-
- _x = cos _p * (0.3 * _distance);
- _y = sin _p * (0.4 * _distance);
-
- _positions pushBack [_x + (_center - (_scaleLargeX / 2)),_y + (_center - (_scaleLargeY / 2)),_scaleLargeX,_scaleLargeY];
- _positions2 pushBack [_x + (_center - (_scaleSmallX / 2)),_y + (_center - (_scaleSmallY / 2)),_scaleSmallX,_scaleSmallY];
- _positions3 pushBack [_x + (_center - (_scaleSelectedX / 2)),_y + (_center - (_scaleSelectedY / 2)),_scaleSelectedX,_scaleSelectedY];
-};
-
-rmx_var_controls = [];
-//_buttonSettings [icon,tooltip,action]
-for "_e" from 0 to (_entries - 1) do {
- private ["_ctrl","_ctrl2"];
- _ctrl = _display ctrlCreate ["rmx_rscPicture",(66600 + _e)];
- _ctrl ctrlSetText _img;
- _ctrl ctrlSetPosition (_positions select _e);
- _ctrl ctrlCommit 0.1;
- _ctrl ctrlSetTooltip (_buttonSettings select _e select 1);
-
- _ctrl ctrlSetTooltipColorBox [0, 0, 0, 0];
- _ctrl ctrlSetTooltipColorShade [0, 0, 0, 0];
- _ctrl ctrlSetEventHandler ["mouseEnter", (format ["_c = _this select 0; _c ctrlSetText '%1'; _c ctrlSetPosition %2; _c ctrlCommit 0.3;",_img2,(_positions3 select _e)])];
- _ctrl ctrlSetEventHandler ["mouseExit", (format ["_c = _this select 0; _c ctrlSetText '%1'; _c ctrlSetPosition %2; _c ctrlCommit 0.3;",_img,(_positions select _e)])];
- _ctrl ctrlSetEventHandler ["mouseButtonDown", (format ["call %1;",(_buttonSettings select _e select 2)])];
- _ctrl ctrlEnable true;
-
- _ctrl2 = _display ctrlCreate ["rmx_rscPicture",-(66600 + _e)];
- _ctrl2 ctrlSetTooltip (_buttonSettings select _e select 1);
- _ctrl2 ctrlSetTooltipColorBox [0, 0, 0, 0];
- _ctrl2 ctrlSetTooltipColorShade [0, 0, 0, 0];
- _ctrl2 ctrlSetText (_buttonSettings select _e select 0);
- _ctrl2 ctrlSetPosition (_positions2 select _e);
- _ctrl2 ctrlCommit 0.1;
-
- rmx_var_controls pushBack _ctrl;
- rmx_var_controls pushBack _ctrl2;
-};
-
-/** Variable Cleanup **/
-{
- call compile (format ["%1 = nil;",configName _x]);
-} count (configProperties [(_cfg >> "variableDefines"),"true",false]);
-rmx_var_dynamicMenuInProgress = nil;
-true
diff --git a/Sources/epoch_code/gui/scripts/Epoch_dynamicMenuCleanup.sqf b/Sources/epoch_code/gui/scripts/Epoch_dynamicMenuCleanup.sqf
deleted file mode 100644
index 3c17afe55..000000000
--- a/Sources/epoch_code/gui/scripts/Epoch_dynamicMenuCleanup.sqf
+++ /dev/null
@@ -1,31 +0,0 @@
-_test = param [1,0];
-if (_test != 57) exitWith {true}; //dirty fix, TODO: read values from epoch startup vars for key
-
-_this spawn {
- if !(isNil "rmx_var_dynamicMenuInProgress") exitWith {};
- _args = param [0,false,[false]]; //true if redirected with category, false for full cleanup
-
- if (_args) then {rmx_var_dynamicMenuHOLD = true;} else {rmx_var_dynamicMenuHOLD = nil; rmx_var_dynamicMenuCat = nil;};
-
- disableSerialization;
- private "_animSpeed";
- _animSpeed = 0.1;
- {
- _x ctrlSetPosition [0.4625,0.45,0.075,0.1];
- _x ctrlSetFade 1;
- _x ctrlCommit _animSpeed;
- } forEach rmx_var_controls;
-
- [rmx_var_dynamenuPPHandle, _animSpeed, [0]] call epoch_postprocessAdjust;
-
- uiSleep _animSpeed;
-
- findDisplay 66600 closeDisplay 1;
-
- rmx_var_controls = nil;
-
- rmx_var_dynamenuPPHandle call epoch_postprocessDestroy;
- rmx_var_dynamenuPPHandle = nil;
-};
-
-true
diff --git a/Sources/epoch_code/gui/scripts/Epoch_dynamicText.sqf b/Sources/epoch_code/gui/scripts/Epoch_dynamicText.sqf
new file mode 100644
index 000000000..04ac06ec1
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/Epoch_dynamicText.sqf
@@ -0,0 +1,97 @@
+#include "\A3\ui_f\hpp\defineCommonGrids.inc"
+
+_text = param [0,"Missing text",["",(text "")]];
+_time = param [1,5,[1]];
+_color = param [2,"#ffffff",[""]];
+
+if (typeName _text isEqualTo "STRING") then {_text = parseText _text};
+
+_alreadyEnabled = uiNamespace getVariable ["rmx_var_dynamicText",false];
+
+_input = count str _text * 2;
+_scale = 1;
+_width = _scale * GUI_GRID_W;
+_height = _scale * GUI_GRID_H;
+_centerX = 0.5;
+_centerY = -18 * GUI_GRID_H + GUI_GRID_Y;
+
+disableSerialization;
+_display = findDisplay 46;
+
+_ctrlGroup = _display ctrlCreate ["RscControlsGroupNoScrollbars", call Epoch_getIDC];
+_ctrlGroup ctrlSetPosition [_centerX - _width/2 * _input / 2, _centerY - _height, _width * _input, _height * 2];
+_ctrlGroup ctrlCommit 0;
+
+_y = 0;
+_cnt = -1;
+_controls = [];
+for "_i" from 0 to (_input - 1) do {
+ _ctrl = _display ctrlCreate ["RscPicture", call Epoch_getIDC,_ctrlGroup];
+ _cnt = _cnt + 1;
+ if (_cnt == (_input / 2)) then {_y = _height; _cnt = 0;};
+ _ctrl ctrlSetPosition [_cnt * _width,_y,_width,_height];
+ _ctrl ctrlSetText "#(rgb,8,8,3)color(1,1,1,1)";
+ _ctrl ctrlCommit 0;
+ _ctrl ctrlSetFade 1-(random 0.2);
+ [_ctrl, 1-(random 0.2),0] call BIS_fnc_ctrlSetScale;
+
+ _controls set [_i, _ctrl];
+};
+
+_ctrlText = _display ctrlCreate ["rmx_ST1", call Epoch_getIDC,_ctrlGroup];
+_ctrlText ctrlSetStructuredText _text;
+_ctrlText ctrlSetPosition [0, 0, _width * _input /2, _height * 2];
+_ctrlText ctrlCommit 0;
+
+
+_add = uiNamespace getVariable ["rmx_var_dynamicTextCTRL",[]];
+_add pushBack _ctrlGroup;
+uiNamespace setVariable ["rmx_var_dynamicTextCTRL",_add];
+
+[_time,_ctrlGroup,_ctrlText,_controls] spawn {
+ disableSerialization;
+ params ["_time","_ctrlGroup","_ctrlText","_controls"];
+
+ _tick = diag_tickTime;
+ while {(diag_tickTime - _tick) < _time} do {
+ {
+ _x ctrlSetFade 1-(random 0.2);
+ [_x, 1-(random 0.2), (random 1)] call BIS_fnc_ctrlSetScale;
+ } forEach _controls;
+ uiSleep 0.5;
+ };
+ _arr = uiNamespace getVariable ["rmx_var_dynamicTextCTRL",[]];
+ _del =
+ {
+ if (str _x isEqualTo str _ctrlGroup) exitWith {_forEachIndex};
+ 0
+ } forEach _arr;
+
+ _arr deleteAt _del;
+ uiNamespace setVariable ["rmx_var_dynamicTextCTRL",_arr];
+ uiSleep 0.01;
+ {
+ _x call Epoch_getIDC;
+ ctrlDelete _x;
+ } forEach (_controls + [_ctrlText] + [_ctrlGroup]);
+};
+
+if !(_alreadyEnabled) then {
+ uiNamespace setVariable ["rmx_var_dynamicText",true];
+ [ctrlPosition _ctrlGroup] spawn {
+ disableSerialization;
+ params ["_defaultPos"];
+ _yPos = _defaultPos param [1];
+ _height = _defaultPos param [3];
+ while {uiNamespace getVariable ["rmx_var_dynamicText",false]} do {
+ _arr = uiNamespace getVariable ["rmx_var_dynamicTextCTRL",[]];
+ if (_arr isEqualTo []) exitWith {uiNamespace setVariable ["rmx_var_dynamicText",nil];};
+ {
+ _xPos = (ctrlPosition _x) select 0;
+ _x ctrlSetPosition [_xPos,_yPos + _height * _forEachIndex];
+ _x ctrlCommit 0;
+ } forEach _arr;
+ };
+ };
+};
+true
diff --git a/Sources/epoch_code/gui/scripts/Epoch_genderSelection.sqf b/Sources/epoch_code/gui/scripts/Epoch_genderSelection.sqf
new file mode 100644
index 000000000..fa896370a
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/Epoch_genderSelection.sqf
@@ -0,0 +1,10 @@
+_min = safezoneX + 0.4 * safezoneW;
+_max = safezoneX + 0.6 * safezoneW;
+_r = linearConversion [_min, _max, _this, 0.2, -1, true];
+_r2 = linearConversion [_min, _max, _this, 2, 0.8, true];
+_r3 = linearConversion [_min, _max, _this, safezoneX, safezoneX - safezoneW * 0.3, true];
+
+(findDisplay -7 displayCtrl 88801) ctrlSetPosition [_r,1,1.8];
+(findDisplay -7 displayCtrl 88802) ctrlSetPosition [_r2,1,1.8];
+(findDisplay -7 displayCtrl 88800) ctrlSetPosition [_r3,safezoneY - safezoneH * 0.1];
+(findDisplay -7 displayCtrl 88800) ctrlCommit 0;
\ No newline at end of file
diff --git a/Sources/epoch_code/gui/scripts/Epoch_getIDC.sqf b/Sources/epoch_code/gui/scripts/Epoch_getIDC.sqf
index 1e6e4e65c..12d1932f9 100644
--- a/Sources/epoch_code/gui/scripts/Epoch_getIDC.sqf
+++ b/Sources/epoch_code/gui/scripts/Epoch_getIDC.sqf
@@ -4,7 +4,7 @@
*/
private ["_in","_list","_out","_find"];
_in = param [0,controlNull,[controlNull]];
-_list = uiNamespace getVariable ["rmx_var_uniqueIDC",[]];
+_list = missionNamespace getVariable ["rmx_var_uniqueIDC",[]];
if (ctrlIDC _in isEqualTo -1) then {
_out = -90000 - (count _list);
@@ -14,6 +14,6 @@ if (ctrlIDC _in isEqualTo -1) then {
_list deleteAt _find;
_out = true;
};
-uiNamespace setVariable ["rmx_var_uniqueIDC",_list];
+missionNamespace setVariable ["rmx_var_uniqueIDC",_list];
_out
diff --git a/Sources/epoch_code/gui/scripts/Epoch_guiObjHP.sqf b/Sources/epoch_code/gui/scripts/Epoch_guiObjHP.sqf
new file mode 100644
index 000000000..fcdb85de2
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/Epoch_guiObjHP.sqf
@@ -0,0 +1,25 @@
+
+private ["_obj","_mode","_hitPoints","_dmg"];
+
+_obj = param [0, objNull, [objNull]];
+_mode = param [1, 0, [0]];
+
+if (_obj isEqualTo objNull) exitWith {};
+
+_hitPoints = getAllHitPointsDamage _obj;
+
+{
+ _dmg = _hitPoints select 2 select _forEachIndex;
+ if ((_mode isEqualTo 1) || ((_mode isEqualTo 0) && !(_dmg isEqualTo 0))) then {
+ [
+ _obj,
+ 10,
+ format ["x\addons\a3_epoch_code\Data\UI\health_parts\%1.paa", floor (_dmg * 10)],
+ format ["%1%2",100 - (round (_dmg * 100)),"%"],
+ (_obj selectionPosition _x),
+ 10
+ ] call epoch_gui3dModelPos;
+ };
+} forEach (_hitPoints select 1);
+
+true
diff --git a/Sources/epoch_code/gui/scripts/Epoch_interactVehicle.sqf b/Sources/epoch_code/gui/scripts/Epoch_interactVehicle.sqf
deleted file mode 100644
index 0c549d0af..000000000
--- a/Sources/epoch_code/gui/scripts/Epoch_interactVehicle.sqf
+++ /dev/null
@@ -1,43 +0,0 @@
-private["_mode","_display","_vehicle","_isLock"];
-_mode = [_this,0,"",[""]] call bis_fnc_param;
-_display = [_this,1,displayNull,[displayNull]] call bis_fnc_param;
-
-_vehicle = cursorTarget;
-
-if (vehicle player != player) then {
- _vehicle = vehicle player;
-};
-
-if (isNull _vehicle) exitWith { closeDialog 0 };
-disableSerialization;
-
-_isLock = locked _vehicle in [2,3];
-switch _mode do {
- case "onLoad": {
- if !((crew _vehicle) isEqualTo []) then {
- (_display displayCtrl 2400) ctrlEnable false;
- };
- if (_isLock) then {
- (_display displayCtrl 2400) ctrlEnable false; //Lock Button
- (_display displayCtrl 2402) ctrlEnable false; //Inspect Button
- } else {
- (_display displayCtrl 2401) ctrlEnable false; //Unlock Button
- };
- };
- case "Lock": {
- if (!_isLock) then {
- EPOCH_lockVehicle_PVS = [_vehicle, true, player, Epoch_personalToken];
- publicVariableServer "EPOCH_lockVehicle_PVS";
- };
- closeDialog 0;
- };
- case "Unlock": {
- if (_isLock) then {
- EPOCH_lockVehicle_PVS = [_vehicle, false, player, Epoch_personalToken];
- publicVariableServer "EPOCH_lockVehicle_PVS";
- };
- closeDialog 0;
- };
-
- default { closeDialog 0 };
-};
\ No newline at end of file
diff --git a/Sources/epoch_code/gui/scripts/Epoch_secureStorageHandler.sqf b/Sources/epoch_code/gui/scripts/Epoch_secureStorageHandler.sqf
new file mode 100644
index 000000000..6db7ed5b4
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/Epoch_secureStorageHandler.sqf
@@ -0,0 +1,19 @@
+_in = param [0,false];
+
+_out = switch (typeName _in) do {
+ case "STRING":
+ {
+ if !(isNull dyna_cursorTarget) then {
+ dyna_cursorTarget getVariable ["EPOCH_Locked",false]
+ };
+ };
+ case "OBJECT":
+ {
+ EPOCH_lockStorage_PVS = [_in,(_in getVariable ["EPOCH_Locked",false]),player,Epoch_personalToken];
+ publicVariableServer "EPOCH_lockStorage_PVS";
+ true
+ };
+ default {false};
+};
+
+_out
diff --git a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf
index be60b04e9..40e49f43c 100644
--- a/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf
+++ b/Sources/epoch_code/gui/scripts/craftingv2/EPOCH_crafting_load.sqf
@@ -129,7 +129,7 @@ rmx_var_crafting_PP_DB = ["dynamicBlur",11] call epoch_postProcessCreate;
private "_pos";
_pos = position player;
while {rmx_var_craftingLOOPS} do {
- if ((_pos distance (position player)) > 0) exitWith {closeDialog 0;};
+ if ((_pos distance (position player)) > 1) exitWith {closeDialog 0;};
};
};
true
\ No newline at end of file
diff --git a/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenu.sqf b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenu.sqf
new file mode 100644
index 000000000..79eb2ae1d
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenu.sqf
@@ -0,0 +1,117 @@
+disableSerialization;
+_in = param [0, "", [""]];
+_display = findDisplay 66600;
+_cfg = "CfgActionMenu" call EPOCH_returnConfig;
+_arr = [];
+_buttonSettings = [];
+
+/** Variable Defines **/
+{
+ call compile (format ["%1 = %2;",configName _x,getText _x]);
+} count (configProperties [(_cfg >> "variableDefines"),"true",false]);
+
+_hasTarget = !(dyna_cursorTarget isEqualTo objNull);
+
+if (isNull _display && dialog) exitWith {call Epoch_dynamicMenuCleanup; false};
+
+if (isNull _display) then {
+ if (_hasTarget) then {
+ createDialog "rmx_dynamenu";
+ } else {
+ findDisplay 46 createDisplay "rmx_dynamenu";
+ };
+};
+
+_selfOrTarget = if !(_hasTarget) then {"self"} else {"target"};
+_checkConfigs = {
+
+ _config = switch (_in) do {
+ case "build_upgrade":
+ {
+ _cfg = "CfgBaseBuilding" call EPOCH_returnConfig;
+ (_cfg >> dyna_cursorTargetType)
+ };
+ case "":
+ {
+ (_cfg >> _selfOrTarget)
+ };
+ default
+ {
+ _c = format ["_cfg >> '%1'",_selfOrTarget];
+ _arr = _this;
+ {
+ _c = _c + (format [" >> '%1'",_x]);
+ } forEach _arr;
+
+ (call compile _c)
+ };
+ };
+
+ switch (_in) do {
+ case "build_upgrade":
+ {
+ if !(isClass _config) exitWith {_in = "";};
+
+ {
+ _dName = getText(configfile >> "CfgVehicles" >> (_x select 0) >> "DisplayName");
+ _tTip = "";
+ _icon = "";
+ {
+ if !(typeName _x isEqualTo "ARRAY") then {_x = [_x, 1]};
+ _c = configfile >> "CfgMagazines" >> (_x select 0);
+ _tTip = _tTip + format ["[%1 x %2] ", _x select 1, getText(_c >> "DisplayName")];
+ if (_icon isEqualTo "") then {_icon = getText (_c >> "picture")};
+ } forEach (_x select 1);
+
+ _tooltip = format ["%1 >> %2 ",_dName,_tTip];
+ _action = format ["[dyna_cursorTarget,%1] call EPOCH_upgradeBUILDv2; true call Epoch_dynamicMenuCleanup;",_forEachIndex];
+
+ _buttonSettings pushBack [
+ _icon,
+ _tooltip,
+ _action
+ ];
+
+ } forEach (getArray (_config >> "upgradeBuilding"));
+
+
+ };
+ default
+ {
+ _configs = "true" configClasses _config;
+ {
+ if (call compile (getText(_x >> "condition"))) then {
+
+ if (_selfOrTarget isEqualTo "self" || dyna_distance) then {
+
+ _subclasses = configProperties [_x, "isClass _x",true];
+
+ _action = if (_subclasses isEqualTo []) then {
+ format ["%1; true call Epoch_dynamicMenuCleanup;",getText(_x >> "action")]
+ } else {
+ format ["%2 %1 call Epoch_dynamicMenu;",_arr + [(configName _x)],getText(_x >> "action")]
+ };
+
+ _buttonSettings pushBack [
+ getText(_x >> "icon"),
+ getText(_x >> "tooltip"),
+ _action
+ ];
+ };
+ };
+ } forEach _configs;
+ };
+ };
+};
+
+call _checkConfigs;
+if (_buttonSettings isEqualTo []) then {_selfOrTarget = "self"; call _checkConfigs;};
+
+_entries = count _buttonSettings;
+if !(_entries <= 0) then {
+ [_entries, _buttonSettings] call epoch_dynamicMenuPopulate;
+} else {
+ true call Epoch_dynamicMenuCleanup;
+};
+
+true
diff --git a/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuCleanup.sqf b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuCleanup.sqf
new file mode 100644
index 000000000..21d500158
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuCleanup.sqf
@@ -0,0 +1,30 @@
+private ["_close","_cleanupVars"];
+_close = param [0,false,[false]];
+
+_cleanupVars = {
+ _cfg = "CfgActionMenu" call EPOCH_returnConfig;
+ {
+ // call compile (format ["%1 = nil;",configName _x]);
+ missionNamespace setVariable [configName _x,nil];
+ } count (configProperties [(_cfg >> "variableDefines"),"true",false]);
+};
+
+if (_close) then {
+ (findDisplay 66600) closeDisplay 1;
+};
+
+if (uiNamespace getVariable ["rmx_var_dynamicMenuInProgress",false]) then {
+
+ uiNamespace setVariable ["rmx_var_dynamicMenuInProgress", nil];
+
+ call _cleanupVars;
+
+
+ [rmx_var_dynamenuPPHandle, 1, [0]] call epoch_postprocessAdjust;
+ rmx_var_dynaControls = nil;
+ rmx_var_dynamenuPPHandle call epoch_postprocessDestroy;
+ rmx_var_dynamenuPPHandle = nil;
+} else {
+ call _cleanupVars;
+};
+true
diff --git a/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuPopulate.sqf b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuPopulate.sqf
new file mode 100644
index 000000000..64cbafaed
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/dynamenu/Epoch_dynamicMenuPopulate.sqf
@@ -0,0 +1,79 @@
+#include "\A3\ui_f\hpp\defineCommonGrids.inc"
+params ["_entries","_buttonSettings"];
+disableSerialization;
+
+_inProgress = uiNamespace getVariable ["rmx_var_dynamicMenuInProgress", false];
+_display = findDisplay 66600;
+
+if (_inProgress) then {
+ {
+ ctrlDelete _x;
+ } forEach rmx_var_dynaControls;
+} else {
+ uiNamespace setVariable ["rmx_var_dynamicMenuInProgress", true];
+ //Post processing
+ if (isNil "rmx_var_dynamenuPPHandle") then {
+ rmx_var_dynamenuPPHandle = ["dynamicBlur",10] call epoch_postProcessCreate;
+ [rmx_var_dynamenuPPHandle, 1, [1]] call epoch_postprocessAdjust;
+ };
+};
+
+//defaults don't edit
+_center = 0.5;
+_scale = 12;
+_defaultScaleX = _scale * GUI_GRID_W;
+_defaultScaleY = _scale * GUI_GRID_H;
+
+_distance = 0.6 + _entries / 100;
+
+//edit scaling here (divisor only, larger values produce smaller image)
+_scaleLargeX = _defaultScaleX / (1.5 + _entries / 10); //anim
+_scaleLargeY = _defaultScaleY / (1.5 + _entries / 10);
+_scaleSmallX = _defaultScaleX / (3 + _entries / 10); //icons
+_scaleSmallY = _defaultScaleY / (3 + _entries / 10);
+
+_points = 360 / _entries;
+
+_positions = [];
+_positions2 = [];
+for "_p" from 0 to 360 step _points do {
+
+ _x = cos _p * (0.3 * _distance);
+ _y = sin _p * (0.4 * _distance);
+
+ _positions pushBack [_x + (_center - (_scaleLargeX / 2)),_y + (_center - (_scaleLargeY / 2)),_scaleLargeX,_scaleLargeY];
+ _positions2 pushBack [_x + (_center - (_scaleSmallX / 2)),_y + (_center - (_scaleSmallY / 2)),_scaleSmallX,_scaleSmallY];
+};
+
+missionNamespace setVariable ["rmx_var_dynaControls",[]];
+//_buttonSettings [icon,tooltip,action]
+for "_e" from 0 to (_entries - 1) do {
+ private ["_ctrl","_ctrl2"];
+ _ctrl = _display ctrlCreate ["rmx_rscPicture",(66600 + _e)];
+ _ctrl ctrlSetText "x\addons\a3_epoch_code\Data\UI\buttons\dm_selection_b1.paa";
+ _ctrl ctrlSetPosition (_positions select _e);
+ _ctrl ctrlSetFade 1;
+ _ctrl ctrlCommit 0;
+ _ctrl ctrlSetTooltip (_buttonSettings select _e select 1);
+
+ _ctrl ctrlSetTooltipColorBox [0, 0, 0, 0];
+ _ctrl ctrlSetTooltipColorShade [0, 0, 0, 0];
+ _ctrl ctrlSetEventHandler ["mouseEnter", "_c = _this select 0; _c ctrlSetFade 0; [_c,0.85,0.1] call BIS_fnc_ctrlSetScale"];
+ _ctrl ctrlSetEventHandler ["mouseExit", "_c = _this select 0; _c ctrlSetFade 1; [_c,1,0.1] call BIS_fnc_ctrlSetScale"];
+ _ctrl ctrlSetEventHandler ["mouseButtonDown", (_buttonSettings select _e select 2)];
+ _ctrl ctrlEnable true;
+
+ _ctrl2 = _display ctrlCreate ["rmx_rscPicture",-(66600 + _e)];
+ _ctrl2 ctrlSetTooltip (_buttonSettings select _e select 1);
+ _ctrl2 ctrlSetTooltipColorBox [0, 0, 0, 0];
+ _ctrl2 ctrlSetTooltipColorShade [0, 0, 0, 0];
+ _ctrl2 ctrlSetText (_buttonSettings select _e select 0);
+ _ctrl2 ctrlSetPosition (_positions2 select _e);
+ _ctrl2 ctrlCommit 0.1;
+
+ _arr = missionNamespace getVariable ["rmx_var_dynaControls",[]];
+ _arr append [_ctrl,_ctrl2];
+ missionNamespace setVariable ["rmx_var_dynaControls",_arr];
+};
+
+true
diff --git a/Sources/epoch_code/gui/scripts/post_process/Epoch_setDrunk.sqf b/Sources/epoch_code/gui/scripts/post_process/Epoch_setDrunk.sqf
new file mode 100644
index 000000000..5d9af5874
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/post_process/Epoch_setDrunk.sqf
@@ -0,0 +1,74 @@
+/*
+ Usage:
+ 0.5 call epoch_setDrunk;
+ [0.2, _time] call epoch_setDrunk;
+ Notes:
+ Drunk levels 1-9, 0 to disable
+ Use low times, wet distortion does not work well when animated over time
+*/
+
+private ["_level","_speed"];
+params [["_level",0,[0]],["_speed",0,[0]]];
+
+if (isNil "rmx_var_drunkHandles") then {
+
+ _priority = 15;
+ _wd = ["wetdistortion",_priority] call epoch_postProcessCreate;
+ _db = ["dynamicBlur",_priority] call epoch_postProcessCreate;
+
+ rmx_var_drunkHandles = [_wd,_db];
+};
+
+switch _level do {
+ case 0:
+ {
+ rmx_var_drunkHandles call epoch_postprocessDestroy;
+ rmx_var_drunkHandles = nil;
+ };
+ case 0.1:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [-1,0.0144629,0,1,0,-0.551644,0.0309715,0.202484,0,0,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ };
+ case 0.2:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [-1,0.0144629,0,1,0,-0.551644,0.0309715,0.390503,0,0,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ };
+ case 0.3:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [-1,0.0144629,0,1,0,-0.53718,-0.157049,0.390503,-1,0,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ };
+ case 0.4:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [-1,0.0144629,0,1,0,-0.53718,-0.157049,0.390503,-1,1,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ };
+ case 0.5:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [1,0.0144616,0.0144629,1,0,-0.53718,-0.157049,0.390503,-1,1,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ [(rmx_var_drunkHandles select 1), _speed, [0.146676]] call epoch_postprocessAdjust;
+ };
+ case 0.6:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [1,0.0144616,0.0144629,1,0,-0.53718,-0.157049,0.390503,-1,1,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ [(rmx_var_drunkHandles select 1), _speed, [0.334697]] call epoch_postprocessAdjust;
+ };
+ case 0.7:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [1,0.0144616,0.0289258,1,0,-0.53718,-0.157049,0.390503,-1,1,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ [(rmx_var_drunkHandles select 1), _speed, [0.334697]] call epoch_postprocessAdjust;
+ };
+ case 0.8:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [1,0.0289245,0.0289258,1,0,-0.53718,-0.157049,0.390503,-1,1,-0.161139,0,0,1,1]] call epoch_postprocessAdjust;
+ [(rmx_var_drunkHandles select 1), _speed, [0.334697]] call epoch_postprocessAdjust;
+ };
+ case 0.9:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [1,0,-0.0867792,0.435939,-0.592987,-0.739664,-1,0.144629,-1,0.103286,0.247918,0,0,1,-0.378086]] call epoch_postprocessAdjust;
+ [(rmx_var_drunkHandles select 1), _speed, [0.0940112]] call epoch_postprocessAdjust;
+ };
+ case 1:
+ {
+ [(rmx_var_drunkHandles select 0), _speed, [1,0.0723131,-0.0433885,1,-0.592987,-0.811979,-1,0.882248,-1,1,1,0,0,0.373996,-1]] call epoch_postprocessAdjust;
+ [(rmx_var_drunkHandles select 1), _speed, [0.151864]] call epoch_postprocessAdjust;
+ };
+};
\ No newline at end of file
diff --git a/Sources/epoch_code/gui/scripts/Epoch_gui3DCooldown.sqf b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DCooldown.sqf
similarity index 79%
rename from Sources/epoch_code/gui/scripts/Epoch_gui3DCooldown.sqf
rename to Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DCooldown.sqf
index ffc87b349..be80b939e 100644
--- a/Sources/epoch_code/gui/scripts/Epoch_gui3DCooldown.sqf
+++ b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DCooldown.sqf
@@ -13,7 +13,7 @@
*/
_this spawn {
- private ["_error","_pos","_time","_distance","_bool","_display","_ctrlPos","_ctrlGrp","_ctrl","_partTime","_ct","_cl"];
+ private ["_error","_pos","_time","_distance","_bool","_display","_ctrlPos","_ctrlGrp","_rnd","_var","_id","_ctrl","_partTime","_ct","_cl"];
disableSerialization;
params
[
@@ -35,21 +35,11 @@ _this spawn {
_ctrlGrp ctrlSetPosition _ctrlPos;
_ctrlGrp ctrlCommit 0;
- _id = call compile format
- [
- "
- missionNamespace setVariable ['rmx_var_3DCD_temp%1',[_ctrlGrp, _distance, _pos]];
- _id = addMissionEventHandler ['Draw3D',{
- _arr = missionNamespace getVariable 'rmx_var_3DCD_temp%1';
- _scale = linearConversion [0, (_arr select 1), player distance (_arr select 2), 0, 1, false];
- (_arr select 0) ctrlSetPosition (worldToScreen (_arr select 2));
- (_arr select 0) ctrlSetFade _scale;
- (_arr select 0) ctrlCommit 0;
- }];
- [_id,'rmx_var_3DCD_temp%1']
- "
- ,floor random 10000
- ];
+ _rnd = format ["rmx_var_temp%1%2",floor random 100, ["A","B","C","D","E","F"] select random 5];
+ uiNamespace setVariable [_rnd,[_ctrlGrp, _pos,(ctrlPosition _ctrlGrp),_distance/2]];
+ _var = format ["uiNamespace getVariable '%1'",_rnd];
+
+ _id = addMissionEventHandler ['Draw3D',_var + "call Epoch_gui3DCooldownEH;"];
_ctrl = [];
for "_i" from 0 to 9 do {
@@ -87,8 +77,8 @@ _this spawn {
if !(_continue) exitWith {};
};
- removeMissionEventHandler ["Draw3D", _id select 0];
- missionNamespace setVariable [_id select 1, nil];
+ removeMissionEventHandler ["Draw3D", _id];
+ uiNamespace setVariable [_rnd, nil];
{
_x call epoch_getIDC;
ctrlDelete _x;
diff --git a/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DCooldownEH.sqf b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DCooldownEH.sqf
new file mode 100644
index 000000000..afb3be85d
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DCooldownEH.sqf
@@ -0,0 +1,10 @@
+params ["_ctrlGrp", "_loc","_pos","_dst"];
+_pos2 = worldToScreen _loc;
+if (_pos2 isEqualTo []) then {_pos2 = [-2,-2]};
+_pos set [0, (_pos2 select 0)-((_pos select 2)/2)];
+_pos set [1, (_pos2 select 1)-((_pos select 3)/2)];
+_ctrlGrp ctrlSetPosition _pos;
+_scale = linearConversion [0, _dst, player distance _loc, 0, 1, false];
+_ctrlGrp ctrlSetFade _scale;
+_ctrlGrp ctrlCommit 0;
+true
diff --git a/Sources/epoch_code/gui/scripts/Epoch_gui3DModelPos.sqf b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DModelPos.sqf
similarity index 64%
rename from Sources/epoch_code/gui/scripts/Epoch_gui3DModelPos.sqf
rename to Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DModelPos.sqf
index e0936ec84..151b14802 100644
--- a/Sources/epoch_code/gui/scripts/Epoch_gui3DModelPos.sqf
+++ b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DModelPos.sqf
@@ -4,7 +4,7 @@
*/
#include "\A3\ui_f\hpp\defineCommonGrids.inc"
_this spawn {
- private ["_obj","_loc","_time","_pic","_txt","_dst","_bool","_display","_ctrl","_imgParsed","_txtParsed","_id","_tick"];
+ private ["_obj","_loc","_time","_pic","_txt","_dst","_bool","_display","_ctrl","_rnd","_var","_imgParsed","_txtParsed","_id","_tick"];
disableSerialization;
params
[
@@ -30,22 +30,11 @@ _this spawn {
_ctrl ctrlSetStructuredText (composeText [_imgParsed, parseText "
", _txtParsed]);
- _id = call compile format
- [
- "
- missionNamespace setVariable ['rmx_var_3DMP_temp%1',[_ctrl, _dst, _obj, _loc]];
- _id = addMissionEventHandler ['Draw3D',{
- _arr = missionNamespace getVariable 'rmx_var_3DMP_temp%1';
- _pos = worldToScreen ((_arr select 2) modelToWorld (_arr select 3));
- (_arr select 0) ctrlSetPosition _pos;
- (_arr select 0) ctrlCommit 0;
- _scale = linearConversion [0, (_arr select 1), player distance ((_arr select 2) modelToWorld (_arr select 3)), 1, 0, false];
- [(_arr select 0), _scale, 0] call BIS_fnc_ctrlSetScale;
- }];
- [_id,'rmx_var_3DMP_temp%1']
- "
- ,floor random 10000
- ];
+ _rnd = format ["rmx_var_temp%1%2",floor random 100, ["A","B","C","D","E","F"] select random 5];
+ uiNamespace setVariable [_rnd,[_ctrl, _obj, _loc, (ctrlPosition _ctrl),_dst/2]];
+ _var = format ["uiNamespace getVariable '%1'",_rnd];
+
+ _id = addMissionEventHandler ['Draw3D',_var + "call epoch_gui3dModelPosEH;"];
_tick = diag_tickTime;
while {(diag_tickTime - _tick) < _time} do {
@@ -53,8 +42,8 @@ _this spawn {
if ((player distance (_obj modelToWorld _loc)) > _dst) exitWith {};
};
- removeMissionEventHandler ["Draw3D", _id select 0];
- missionNamespace setVariable [_id select 1, nil];
+ removeMissionEventHandler ["Draw3D", _id];
+ uiNamespace setVariable [_rnd, nil];
_ctrl call epoch_getIDC;
ctrlDelete _ctrl;
};
diff --git a/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DModelPosEH.sqf b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DModelPosEH.sqf
new file mode 100644
index 000000000..6a73a2285
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DModelPosEH.sqf
@@ -0,0 +1,11 @@
+params ["_ctrl", "_obj", "_loc","_pos","_dst"];
+_m2w = _obj modelToWorld _loc;
+_pos2 = worldToScreen _m2w;
+if (_pos2 isEqualTo []) then {_pos2 = [-2,-2]};
+_pos set [0, (_pos2 select 0)-((_pos select 2)/2)];
+_pos set [1, (_pos2 select 1)-((_pos select 3)/2)];
+_ctrl ctrlSetPosition _pos;
+_scale = linearConversion [0, _dst, player distance _m2w, 0, 1, false];
+_ctrl ctrlSetFade _scale;
+_ctrl ctrlCommit 0;
+true
diff --git a/Sources/epoch_code/gui/scripts/Epoch_gui3DWorldPos.sqf b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DWorldPos.sqf
similarity index 63%
rename from Sources/epoch_code/gui/scripts/Epoch_gui3DWorldPos.sqf
rename to Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DWorldPos.sqf
index 1b80b41d8..134a22d64 100644
--- a/Sources/epoch_code/gui/scripts/Epoch_gui3DWorldPos.sqf
+++ b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DWorldPos.sqf
@@ -4,7 +4,7 @@
*/
#include "\A3\ui_f\hpp\defineCommonGrids.inc"
_this spawn {
- private ["_loc","_time","_pic","_txt","_dst","_bool","_display","_ctrl","_imgParsed","_txtParsed","_id","_tick"];
+ private ["_loc","_time","_pic","_txt","_dst","_bool","_display","_ctrl","_rnd","_var","_imgParsed","_txtParsed","_id","_tick"];
disableSerialization;
params
[
@@ -17,7 +17,7 @@ _this spawn {
];
_display = findDisplay 46;
-
+
_ctrl = _display ctrlCreate ["RscStructuredText",call epoch_getIDC];
_ctrl ctrlSetPosition [10 * GUI_GRID_W + GUI_GRID_X,10 * GUI_GRID_H + GUI_GRID_Y,10 * GUI_GRID_W,10 * GUI_GRID_H];
_ctrl ctrlCommit 0;
@@ -27,22 +27,12 @@ _this spawn {
_ctrl ctrlSetStructuredText (composeText [_imgParsed, parseText "
", _txtParsed]);
- _id = call compile format
- [
- "
- missionNamespace setVariable ['rmx_var_3DWP_temp%1',[_ctrl, _dst, _loc]];
- _id = addMissionEventHandler ['Draw3D',{
- _arr = missionNamespace getVariable 'rmx_var_3DWP_temp%1';
- _pos = worldToScreen (_arr select 2);
- (_arr select 0) ctrlSetPosition _pos;
- (_arr select 0) ctrlCommit 0;
- _scale = linearConversion [0, (_arr select 1), player distance (_arr select 2), 1, 0, false];
- [(_arr select 0), _scale, 0] call BIS_fnc_ctrlSetScale;
- }];
- [_id,'rmx_var_3DWP_temp%1']
- "
- ,floor random 10000
- ];
+ _rnd = format ["rmx_var_temp%1%2",floor random 100, ["A","B","C","D","E","F"] select random 5];
+ uiNamespace setVariable [_rnd,[_ctrl, _loc,(ctrlPosition _ctrl),_dst/2]];
+ _var = format ["uiNamespace getVariable '%1'",_rnd];
+
+ _id = addMissionEventHandler ['Draw3D',_var + "call epoch_gui3dWorldPosEH;"];
+
_tick = diag_tickTime;
while {(diag_tickTime - _tick) < _time} do {
@@ -50,8 +40,8 @@ _this spawn {
if ((player distance _loc) > _dst) exitWith {};
};
- removeMissionEventHandler ["Draw3D", _id select 0];
- missionNamespace setVariable [_id select 1, nil];
+ removeMissionEventHandler ["Draw3D", _id];
+ uiNamespace setVariable [_rnd, nil];
_ctrl call epoch_getIDC;
ctrlDelete _ctrl;
};
diff --git a/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DWorldPosEH.sqf b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DWorldPosEH.sqf
new file mode 100644
index 000000000..78983d52b
--- /dev/null
+++ b/Sources/epoch_code/gui/scripts/worldToScreen/Epoch_gui3DWorldPosEH.sqf
@@ -0,0 +1,12 @@
+params ["_ctrl","_loc","_pos","_dst"];
+_pos2 = worldToScreen _loc;
+if (_pos2 isEqualTo []) then {_pos2 = [-2,-2]};
+_pos set [0, (_pos2 select 0)-((_pos select 2)/2)];
+_pos set [1, (_pos2 select 1)-((_pos select 3)/2)];
+_ctrl ctrlSetPosition _pos;
+_scale = linearConversion [0, _dst, player distance _loc, 0, 1, false];
+_ctrl ctrlSetFade _scale;
+_ctrl ctrlCommit 0;
+
+//[_ctrl, _scale, 0] call BIS_fnc_ctrlSetScale;
+true
diff --git a/Sources/epoch_code/init/both_init.sqf b/Sources/epoch_code/init/both_init.sqf
index c3776a769..53f618f1f 100644
--- a/Sources/epoch_code/init/both_init.sqf
+++ b/Sources/epoch_code/init/both_init.sqf
@@ -1,7 +1,7 @@
// Init Custom vars
EPOCH_customVars = [];
EPOCH_defaultVars = [];
-_customVarsDefaults = [
+EPOCH_customVarsDefaults = [
["Temp",98.6],
["Hunger",5000],
["Thirst",2500],
@@ -15,9 +15,12 @@ _customVarsDefaults = [
["Crypto",0],
["HitPoints",[0,0,0,0]],
["BloodP",100],
- ["SpawnArray",[]]
+ ["SpawnArray",[]],
+ ["Karma",0],
+ ["Alcohol",0],
+ ["Radiation",0]
];
-_customVarsInit = ["CfgEpochClient", "customVarsDefaults", _customVarsDefaults] call EPOCH_fnc_returnConfigEntryV2;
+_customVarsInit = ["CfgEpochClient", "customVarsDefaults", EPOCH_customVarsDefaults] call EPOCH_fnc_returnConfigEntryV2;
{
EPOCH_customVars pushBack (_x select 0);
EPOCH_defaultVars pushBack (_x select 1);
diff --git a/Sources/epoch_code/init/client_init.sqf b/Sources/epoch_code/init/client_init.sqf
index 0f3e076a5..4ec06a4a7 100644
--- a/Sources/epoch_code/init/client_init.sqf
+++ b/Sources/epoch_code/init/client_init.sqf
@@ -11,6 +11,7 @@ EPOCH_group_level_img = ["x\addons\a3_epoch_code\data\owner.paa", "x\addons\a3_e
if (isNil 'EPOCH_diag_fps') then {
EPOCH_diag_fps = 0;
};
+EPOCH_playerIsSwimming = false;
EPOCH_lastTrash = diag_tickTime;
EPOCH_tradeDone = false;
EPOCH_bankBalance = 0;
@@ -49,6 +50,7 @@ if(EPOCH_AirDropChance < 0)then{EPOCH_AirDropChance = 101;EPOCH_AirDropCheck = 9
EPOCH_droneRndChance = 100;
// Custom Keys
+EPOCH_keysActionPressed = false; //prevents EH spam
0 call EPOCH_clientKeyMap;
//ON INIT and RESPAWN
diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp
new file mode 100644
index 000000000..38a40f824
--- /dev/null
+++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_core.hpp
@@ -0,0 +1,27 @@
+class CfgActionMenu
+{
+ class variableDefines //must be global, nil when menu closes
+ {
+ dyna_cursorTarget = "([10] call EPOCH_fnc_cursorTarget)";
+ dyna_cursorTargetType = "typeOf ([10] call EPOCH_fnc_cursorTarget)";
+ dyna_inVehicle = "vehicle player != player";
+ dyna_itemsPlayer = "items player";
+ dyna_distance = "(player distance dyna_cursorTarget) < 5";
+
+ dyna_buildMode = "([10] call EPOCH_fnc_cursorTarget) call EPOCH_checkBuild;";
+ dyna_isVehicle = "if !(isNull dyna_cursorTarget && alive dyna_cursorTarget) then {((dyna_cursorTarget isKindOf 'LandVehicle') || (dyna_cursorTarget isKindOf 'Air') || (dyna_cursorTarget isKindOf 'Ship') || (dyna_cursorTarget isKindOf 'Tank'))} else {false}";
+ dyna_isTrader = "if !(isNull dyna_cursorTarget && alive dyna_cursorTarget) then {((dyna_cursorTarget isKindOf 'Man') && (dyna_cursorTarget != player) && (!isPlayer dyna_cursorTarget) && ((dyna_cursorTarget getVariable['AI_SLOT', -1]) != -1))} else {false}";
+ dyna_locked = "locked dyna_cursorTarget in [2,3]";
+ dyna_lockedInVehicle = "locked vehicle player in [2,3]";
+ };
+
+ class self
+ {
+ #include "CfgActionMenu_self.hpp"
+ };
+
+ class target
+ {
+ #include "CfgActionMenu_target.hpp"
+ };
+};
diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp
new file mode 100644
index 000000000..4a0a83e4f
--- /dev/null
+++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_self.hpp
@@ -0,0 +1,21 @@
+class veh_lock
+{
+ condition = "dyna_inVehicle && !dyna_lockedInVehicle";
+ action = "EPOCH_lockVehicle_PVS = [vehicle player, true, player, Epoch_personalToken]; publicVariableServer 'EPOCH_lockVehicle_PVS';";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_cannot_lock.paa";
+ tooltip = "Lock";
+};
+class veh_unLock
+{
+ condition = "dyna_inVehicle && dyna_lockedInVehicle";
+ action = "EPOCH_lockVehicle_PVS = [vehicle player, false, player, Epoch_personalToken]; publicVariableServer 'EPOCH_lockVehicle_PVS';";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_can_unlock.paa";
+ tooltip = "Unlock";
+};
+class player_inspect
+{
+ condition = "true";
+ action = "call EPOCH_lootTrash;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa";
+ tooltip = "Examine";
+};
diff --git a/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp
new file mode 100644
index 000000000..230575d5c
--- /dev/null
+++ b/Sources/epoch_config/Configs/CfgActionMenu/CfgActionMenu_target.hpp
@@ -0,0 +1,117 @@
+//Build mode enabled
+class build_upgrade
+{
+ condition = "dyna_buildMode select 0";
+ //action = "dyna_cursorTarget call EPOCH_QuickUpgrade;"; //TODO: scripted dyna menu
+ action = "";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_upgrade.paa";
+ tooltip = "Upgrade";
+ class special {}; //uses external config, hardcoded
+};
+class build_remove
+{
+ condition = "dyna_buildMode select 1";
+ action = "dyna_cursorTarget call EPOCH_removeBUILD;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_remove.paa";
+ tooltip = "Remove";
+};
+class build_move
+{
+ condition = "dyna_buildMode select 2";
+ action = "dyna_cursorTarget call EPOCH_fnc_SelectTargetBuild;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_move.paa";
+ tooltip = "Move";
+};
+
+//Vehicle interaction
+class veh_gear
+{
+ condition = "dyna_isVehicle && !dyna_locked";
+ action = "call Epoch_client_gearVehicle;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa";
+ tooltip = "Inspect";
+};
+class veh_lock
+{
+ condition = "dyna_isVehicle && !dyna_locked";
+ action = "EPOCH_lockVehicle_PVS = [dyna_cursorTarget, true, player, Epoch_personalToken]; publicVariableServer 'EPOCH_lockVehicle_PVS';";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_cannot_lock.paa";
+ tooltip = "Lock";
+};
+class veh_unLock
+{
+ condition = "dyna_isVehicle && dyna_locked";
+ action = "EPOCH_lockVehicle_PVS = [dyna_cursorTarget, false, player, Epoch_personalToken]; publicVariableServer 'EPOCH_lockVehicle_PVS';";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_can_unlock.paa";
+ tooltip = "Unlock";
+};
+
+//Trader interaction
+class tra_talk
+{
+ condition = "dyna_isTrader";
+ action = "dyna_cursorTarget call EPOCH_startInteractNPC;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\talk_blue.paa";
+ tooltip = "Talk";
+};
+class tra_shop
+{
+ condition = "dyna_isTrader";
+ action = "call EPOCH_startNPCTraderMenu;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\krypto.paa";
+ tooltip = "Shop";
+};
+
+//User action replacement
+class maintain_jammer
+{
+ condition = "dyna_cursorTargetType isEqualTo 'PlotPole_EPOCH' && (damage dyna_cursorTarget < 1)";
+ action = "dyna_cursorTarget call EPOCH_maintainIT;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_maintain.paa";
+ tooltip = "Maintain";
+};
+//lock unlock
+class unlock_lockbox
+{
+ condition = "(dyna_cursorTargetType in ['LockBox_EPOCH','LockBoxProxy_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])";
+ action = "dyna_cursorTarget call Epoch_secureStorageHandler";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_can_unlock.paa";
+ tooltip = "Unlock Lockbox";
+};
+class lock_lockbox
+{
+ condition = "(dyna_cursorTargetType in ['LockBox_EPOCH','LockBoxProxy_EPOCH']) && !(dyna_cursorTarget getVariable ['EPOCH_Locked',false])";
+ action = "dyna_cursorTarget call Epoch_secureStorageHandler";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_cannot_lock.paa";
+ tooltip = "Lock Lockbox";
+};
+class unlock_safe
+{
+ condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])";
+ action = "dyna_cursorTarget call Epoch_secureStorageHandler";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_can_unlock.paa";
+ tooltip = "Unlock Safe";
+};
+class lock_safe
+{
+ condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH']) && !(dyna_cursorTarget getVariable ['EPOCH_Locked',false])";
+ action = "dyna_cursorTarget call Epoch_secureStorageHandler";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\pad_cannot_lock.paa";
+ tooltip = "Lock Safe";
+};
+
+//pack
+class pack_lockbox
+{
+ condition = "(dyna_cursorTargetType in ['LockBox_EPOCH','LockBoxProxy_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])";
+ action = "EPOCH_packStorage_PVS = [dyna_cursorTarget,player,Epoch_personalToken]; publicVariableServer 'EPOCH_packStorage_PVS';";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_pack.paa";
+ tooltip = "Pack Lockbox";
+};
+class pack_safe
+{
+ condition = "(dyna_cursorTargetType in ['Safe_EPOCH','SafeProxy_EPOCH']) && (dyna_cursorTarget getVariable ['EPOCH_Locked',false])";
+ action = "EPOCH_packStorage_PVS = [dyna_cursorTarget,player,Epoch_personalToken]; publicVariableServer 'EPOCH_packStorage_PVS';";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_pack.paa";
+ tooltip = "Pack Safe";
+};
diff --git a/Sources/epoch_config/Configs/CfgActionMenu/EXAMPLE.hpp b/Sources/epoch_config/Configs/CfgActionMenu/EXAMPLE.hpp
new file mode 100644
index 000000000..799f73812
--- /dev/null
+++ b/Sources/epoch_config/Configs/CfgActionMenu/EXAMPLE.hpp
@@ -0,0 +1,79 @@
+class CfgActionMenu
+{
+ /** GLOBAL VARIABLES ONLY - removed automatically **/
+ class variableDefines //must be global, nil when menu closes
+ {
+ dyna_cursorTarget = "cursorTarget";
+ dyna_typeOfCursorTarget = "typeOf cursorTarget";
+
+ dyna_player = "vehicle player";
+ dyna_itemsPlayer = "items player";
+ };
+
+ /** No cursor target **/
+ class CfgActionMenu_self
+ {
+ class player_craftMenu
+ {
+ condition = "true";
+ action = "call EPOCH_crafting_load;";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_maintain.paa";
+ tooltip = "Crafting V2";
+ };
+ };
+
+ /** Has cursor target **/
+ class CfgActionMenu_target
+ {
+ class player_inspect
+ {
+ condition = "dyna_typeOfCursorTarget isEqualTo 'someClassName'";
+ action = "hint 'Detective is on the case'";
+ icon = "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa";
+ tooltip = "Examine";
+ };
+ };
+};
+
+/** Sub-category example **/
+/*
+class CAT_pad
+{
+ condition = "true"; //must be value
+ action = ""; //can be empty for categories
+ icon = "#(rgb,8,8,3)color(1,0,1,0.5)";
+ tooltip = "Main cat";
+
+ class SUB_CAT_test1
+ {
+ condition = "true"; //must be value
+ action = ""; //can be empty for categories
+ icon = "#(rgb,8,8,3)color(1,1,1,0.5)";
+ tooltip = "Subcat1";
+
+ class SUB_CAT_test2
+ {
+ condition = "true"; //must be value
+ action = ""; //can be empty for categories
+ icon = "#(rgb,8,8,3)color(1,0,0,0.5)";
+ tooltip = "Subcat2";
+
+ class SUB_CAT_test3
+ {
+ condition = "true"; //must be value
+ action = ""; //can be empty for categories
+ icon = "#(rgb,8,8,3)color(0,1,1,0.5)";
+ tooltip = "Subcat3";
+
+ class SUB_CAT_test4
+ {
+ condition = "true"; //must be value
+ action = ""; //can be empty for categories
+ icon = "#(rgb,8,8,3)color(0,1,0,0.5)";
+ tooltip = "Subcat4";
+ };
+ };
+ };
+ };
+};
+*/
\ No newline at end of file
diff --git a/Sources/epoch_config/Configs/CfgAmmo.hpp b/Sources/epoch_config/Configs/CfgAmmo.hpp
index df8facf95..770d10f3b 100644
--- a/Sources/epoch_config/Configs/CfgAmmo.hpp
+++ b/Sources/epoch_config/Configs/CfgAmmo.hpp
@@ -1,5 +1,122 @@
+class CraterSpike {
+ class CraterSmokeCustom1
+ {
+ simulation = "particles";
+ type = "SpikeCraterEffect"; // CraterSmokeCustom
+ position[] = {0,0,0};
+ intensity = 1;
+ interval = 0.1;
+ lifeTime = 0.5;
+ };
+ class CraterSmokeCustom4
+ {
+ simulation = "particles";
+ type = "WoodChippings3"; // CraterSmokeCustom
+ position[] = {0,0,0};
+ intensity = 1;
+ interval = 1;
+ lifeTime = 0.5;
+ };
+
+};
+
+class CraterMetal {
+ class CraterSmokeCustom1
+ {
+ simulation = "particles";
+ type = "SpikeCraterEffect"; // CraterSmokeCustom
+ position[] = {0,0,0};
+ intensity = 1;
+ interval = 0.1;
+ lifeTime = 0.5;
+ };
+ class CraterSmokeCustom2
+ {
+ simulation = "particles";
+ type = "ScrapsCraterEffect"; // CraterSmokeCustom
+ position[] = {0,0,0};
+ intensity = 1;
+ interval = 0.1;
+ lifeTime = 0.5;
+ };
+ class CraterSmokeCustom3
+ {
+ simulation = "particles";
+ type = "WoodChippings3"; // CraterSmokeCustom
+ position[] = {0,0,0};
+ intensity = 1;
+ interval = 1;
+ lifeTime = 0.5;
+ };
+
+};
+
class CfgAmmo
{
+
+ class DirectionalBombBase;
+ class Spike_TRAP_AMMO_EPOCH: DirectionalBombBase
+ {
+ hit = 10;
+ indirectHit = 5;
+ indirectHitRange = 3;
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\swing_box.p3d";
+ mineModelDisabled = "\x\addons\a3_epoch_assets_3\CfgVehicles\swing_box.p3d";
+ defaultMagazine = "APERSTripMine_Wire_Mag";
+ icon = "iconExplosiveAP";
+
+ soundHit[] = {"a3\sounds_f\characters\movements\bodyfalls\bodyfall_concrete_2",2.5,1,150};
+ soundTrigger[] = {"a3\sounds_f\arsenal\sfx\bullet_hits\body_08",0.56234133,1,40};
+ soundActivation[] = {"",1,1,40};
+
+ minimumSafeZone = 0;
+ explosionAngle = 360;
+ explosionEffects = "";
+ CraterEffects = "CraterSpike";
+ whistleDist = 8;
+ cost = 200;
+ mineTrigger = "RangeTriggerBounding";
+ mineInconspicuousness = 100;
+
+ class CamShakeHit
+ {
+ power = 1;
+ duration = 1;
+ frequency = 20;
+ };
+ };
+
+ class Metal_TRAP_AMMO_EPOCH: DirectionalBombBase
+ {
+ hit = 15;
+ indirectHit = 8;
+ indirectHitRange = 4;
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\swing_box.p3d";
+ mineModelDisabled = "\x\addons\a3_epoch_assets_3\CfgVehicles\swing_box.p3d";
+ defaultMagazine = "APERSTripMine_Wire_Mag";
+ icon = "iconExplosiveAP";
+
+ soundHit[] = {"a3\sounds_f\characters\movements\bodyfalls\bodyfall_concrete_2",2.5,1,150};
+ soundTrigger[] = {"a3\sounds_f\arsenal\sfx\bullet_hits\body_08",0.56234133,1,40};
+ soundActivation[] = {"a3\sounds_f\vehicles\boat\noises\Light_metal_boat_crash_wood_02",1,1,40};
+
+ minimumSafeZone = 0;
+ explosionAngle = 360;
+ explosionEffects = "";
+ CraterEffects = "CraterMetal";
+ whistleDist = 8;
+ cost = 200;
+ mineTrigger = "RangeTriggerBounding";
+ mineInconspicuousness = 100;
+
+ class CamShakeHit
+ {
+ power = 1.2;
+ duration = 1;
+ frequency = 20;
+ };
+ };
+
class BulletBase;
class B_EnergyPack: BulletBase
{
@@ -150,13 +267,13 @@ class CfgAmmo
timeToLive = 60;
fuseDistance = 0;
soundHit[] = { "", 0, 1 };
-
+
SmokeShellSoundLoop1[] = { "A3\Sounds_F\weapons\smokeshell\smoke_loop1", 0.12589253, 1, 70 };
SmokeShellSoundLoop2[] = { "A3\Sounds_F\weapons\smokeshell\smoke_loop2", 0.12589253, 1, 70 };
grenadeFireSound[] = {};
grenadeBurningSound[] = { "SmokeShellSoundLoop1", 0.5, "SmokeShellSoundLoop2", 0.5 };
-
+
impactGroundSoft[] = {};
impactGroundHard[] = {};
impactIron[] = {};
@@ -173,12 +290,12 @@ class CfgAmmo
impactMetal[] = {};
impactMetalplate[] = {};
impactWater[] = {};
-
+
effectsSmoke = "SmokeShellWhiteEffect";
whistleDist = 0;
smokeColor[] = { 0.039, 0.278, 0, 0.5 };
};
-
+
class B_Test_Caseless: BulletBase
{
hit = 10;
@@ -254,4 +371,4 @@ class CfgAmmo
soundHit[] = {"","db-90",1};
soundEngine[] = {"","db-80",4};
};
-};
\ No newline at end of file
+};
diff --git a/Sources/epoch_config/Configs/CfgBaseBuilding.hpp b/Sources/epoch_config/Configs/CfgBaseBuilding.hpp
index 62f214c26..4de1ff669 100644
--- a/Sources/epoch_config/Configs/CfgBaseBuilding.hpp
+++ b/Sources/epoch_config/Configs/CfgBaseBuilding.hpp
@@ -20,6 +20,14 @@ class CfgBaseBuilding {
{
removeParts[] = { { "PartPlankPack", 4 } };
};
+ class Hesco3_EPOCH : Default
+ {
+ removeParts[] = { { "KitHesco3", 1 } };
+ };
+ class TankTrap_EPOCH : Default
+ {
+ removeParts[] = { { "KitTankTrap", 1 } };
+ };
class SolarGen_EPOCH : Default
{
removeParts[] = { { "KitSolarGen", 1 } };
@@ -34,8 +42,13 @@ class CfgBaseBuilding {
};
class WoodFloor_EPOCH : Default
{
+ upgradeBuilding[] = { { "MetalFloor_EPOCH", { { "ItemCorrugatedLg", 2 } } } };
removeParts[] = { { "PartPlankPack", 2 } };
};
+ class MetalFloor_EPOCH : Default
+ {
+ removeParts[] = { { "ItemCorrugatedLg", 2 } };
+ };
class CinderWallGarage_EPOCH : Default
{
removeParts[] = { { "CinderBlocks", 4 }, { "ItemCorrugatedLg", 1 }, { "CircuitParts", 1 } };
diff --git a/Sources/epoch_config/Configs/CfgCloudlets.hpp b/Sources/epoch_config/Configs/CfgCloudlets.hpp
index f2a388574..b81d2aa27 100644
--- a/Sources/epoch_config/Configs/CfgCloudlets.hpp
+++ b/Sources/epoch_config/Configs/CfgCloudlets.hpp
@@ -1,6 +1,101 @@
class CfgCloudlets
{
class Default;
+
+ class SpikeCraterEffect: Default
+ {
+ interval = 0.001;
+ circleRadius = 0;
+ circleVelocity[] = {0,0,0};
+ particleShape = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\spike.p3d";
+ particleFSNtieth = 0;
+ particleFSIndex = 1;
+ particleFSFrameCount = 0;
+ particleFSLoop = 0;
+ angleVar = 1;
+ animationName = "";
+ particleType = "spaceobject";
+ timerPeriod = 1;
+ lifeTime = 20;
+ moveVelocity[] = {0,0,0};
+ rotationVelocity = 1;
+ weight = 5;
+ volume = 1;
+ rubbing = 0.01;
+ size[] = {1,1};
+ color[] = {{1,1,1,1},{1,1,1,0}};
+ animationSpeed[] = {0};
+ animationSpeedCoef = 1;
+ randomDirectionPeriod = 0.1;
+ randomDirectionIntensity = 0.05;
+ onTimerScript = "";
+ beforeDestroyScript = "";
+ destroyOnWaterSurface = 1;
+ destroyOnWaterSurfaceOffset = -0.1;
+ lifeTimeVar = 0;
+ position[] = {0, 0, 0};
+ positionVar[] = {1,1,1};
+ moveVelocityVar[] = {2,2,2};
+ positionVarConst[] = {0, 0, 0};
+
+ rotationVelocityVar = 360;
+ sizeVar = 0;
+ colorVar[] = {0,0,0,0};
+ randomDirectionPeriodVar = 0;
+ randomDirectionIntensityVar = 0;
+
+ bounceOnSurface = 0.01;
+ bounceOnSurfaceVar = 0.01;
+
+ };
+
+ class ScrapsCraterEffect: Default
+ {
+ interval = 0.002;
+ circleRadius = 0;
+ circleVelocity[] = {0,0,0};
+ particleShape = "\x\addons\a3_epoch_assets\models\scraps.p3d";
+ particleFSNtieth = 0;
+ particleFSIndex = 1;
+ particleFSFrameCount = 0;
+ particleFSLoop = 0;
+ angleVar = 1;
+ animationName = "";
+ particleType = "spaceobject";
+ timerPeriod = 1;
+ lifeTime = 20;
+ moveVelocity[] = {0,0,0};
+ rotationVelocity = 1;
+ weight = 5;
+ volume = 1;
+ rubbing = 0.01;
+ size[] = {1,1};
+ color[] = {{1,1,1,1},{1,1,1,0}};
+ animationSpeed[] = {0};
+ animationSpeedCoef = 1;
+ randomDirectionPeriod = 0.1;
+ randomDirectionIntensity = 0.05;
+ onTimerScript = "";
+ beforeDestroyScript = "";
+ destroyOnWaterSurface = 1;
+ destroyOnWaterSurfaceOffset = -0.1;
+ lifeTimeVar = 0;
+ position[] = {0, 0, 0};
+ positionVar[] = {1,1,1};
+ moveVelocityVar[] = {2,2,2};
+ positionVarConst[] = {0, 0, 0};
+
+ rotationVelocityVar = 360;
+ sizeVar = 0;
+ colorVar[] = {0,0,0,0};
+ randomDirectionPeriodVar = 0;
+ randomDirectionIntensityVar = 0;
+
+ bounceOnSurface = 0.01;
+ bounceOnSurfaceVar = 0.01;
+
+ };
+
class ObjectDestructionFire1SmallxG: Default
{
interval = 0.01;
@@ -210,7 +305,7 @@ class CfgCloudlets
constantDistance = 1.0;
damageType = "Fire";
};
-
+
/*
class Blood1 : Default
{
@@ -334,4 +429,4 @@ class CfgCloudlets
randomDirectionIntensityVar = 0;
};
*/
-};
\ No newline at end of file
+};
diff --git a/Sources/epoch_config/Configs/CfgDynamicMenu-EXAMPLE.hpp b/Sources/epoch_config/Configs/CfgDynamicMenu-EXAMPLE.hpp
deleted file mode 100644
index 3a0035edd..000000000
--- a/Sources/epoch_config/Configs/CfgDynamicMenu-EXAMPLE.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-//IMPORTANT - do not add semicolons here, script takes care of it
-
-class cfgDynamicMenu
-{
- /** GLOBAL VARIABLES ONLY - removed automatically **/
- class variableDefines //must be global, nil when menu closes
- {
- dyna_cursorTarget = "cursorTarget";
- dyna_typeOfCursorTarget = "typeOf cursorTarget";
-
- dyna_player = "vehicle player";
- dyna_itemsPlayer = "items player";
- };
-
- /** BUTTON DEFINES **/
- class dynaButtons
- {
- class example /** Single button **/
- {
- condition = "true"; //must be value
- action = "hint 'example button'";
- icon = "#(rgb,8,8,3)color(1,1,1,0.5)";
- tooltip = "example button";
- };
-
- class example2: example /** Single button from inherited values above **/
- {
- icon = "#(rgb,8,8,3)color(1,0,1,0.5)";
- action = "systemchat 'example button 2'";
- };
-
- /** ------------------------------ **/
- // Category works like a folder, when clicked, it replaces current buttons
- // with fresh batch from it's own subclasses
- /** ------------------------------ **/
-
- class category_example /** Category button, add subclasses to enable this mode**/
- {
- condition = "true"; //must be value
- action = "hint 'Category button 1'"; //can be empty for categories
- icon = "#(rgb,8,8,3)color(1,0,0,0.5)";
- tooltip = "Category button 1";
-
- class category_subclass_example /** Same config as the rest **/
- {
- condition = "true"; //must be value
- action = "hint 'example category button 1'";
- icon = "#(rgb,8,8,3)color(1,1,1,0.5)";
- tooltip = "example button";
- };
-
- class category_subclass_example2: category_subclass_example /** Subclass inheritance **/
- {
- action = "hint 'example category button 2'";
- };
- };
- class category_example2: category_example /** Category Inheritance, includes all buttons **/
- {
- action = "hint 'Category button 2'";
- tooltip = "Category button 2";
- class category_subclass_example2 /** REPLACE inherited button **/
- {
- condition = "true"; //must be value
- action = "hint 'inherited category button replaced'";
- icon = "#(rgb,8,8,3)color(1,1,1,0.5)";
- tooltip = "replaced button";
- };
- };
- };
-};
\ No newline at end of file
diff --git a/Sources/epoch_config/Configs/CfgDynamicMenu.hpp b/Sources/epoch_config/Configs/CfgDynamicMenu.hpp
deleted file mode 100644
index 0015a2b4c..000000000
--- a/Sources/epoch_config/Configs/CfgDynamicMenu.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-//IMPORTANT - do not add semicolons here, script takes care of it
-
-class cfgDynamicMenu
-{
- dyna_displayWhitelist[] = {};
-
- /** GLOBAL VARIABLES ONLY - removed automatically **/
- class variableDefines //must be global, nil when menu closes
- {
- dyna_cursorTarget = "cursorTarget";
- dyna_typeOfCursorTarget = "typeOf cursorTarget";
-
- dyna_player = "vehicle player";
- dyna_itemsPlayer = "items player";
- };
-
- /** BUTTON DEFINES **/
- class dynaButtons
- {
-
- /*
- class close_Button_if_dialog_used_instead
- {
- condition = "true";
- action = "findDisplay 66600 closeDisplay 1";
- icon = "#(rgb,8,8,3)color(1,0,0,1)";
- tooltip = "CLOSE";
- };
- */
- class player_craftMenu
- {
- condition = "true";
- action = "call EPOCH_crafting_load;";
- icon = "x\addons\a3_epoch_code\Data\UI\buttons\build_maintain.paa";
- tooltip = "Crafting V2";
- };
- class player_inspect
- {
- condition = "true";
- action = "hint 'Detective is on the case'";
- icon = "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa";
- tooltip = "Examine";
- };
-
- class CAT_pad
- {
- condition = "true"; //must be value
- action = ""; //can be empty for categories
- icon = "#(rgb,8,8,3)color(1,0,1,0.5)";
- tooltip = "Main cat";
-
- class SUB_CAT_test1
- {
- condition = "true"; //must be value
- action = ""; //can be empty for categories
- icon = "#(rgb,8,8,3)color(1,1,1,0.5)";
- tooltip = "Subcat1";
-
- class SUB_CAT_test2
- {
- condition = "true"; //must be value
- action = ""; //can be empty for categories
- icon = "#(rgb,8,8,3)color(1,0,0,0.5)";
- tooltip = "Subcat2";
-
- class SUB_CAT_test3
- {
- condition = "true"; //must be value
- action = ""; //can be empty for categories
- icon = "#(rgb,8,8,3)color(0,1,1,0.5)";
- tooltip = "Subcat3";
-
- class SUB_CAT_test4
- {
- condition = "true"; //must be value
- action = ""; //can be empty for categories
- icon = "#(rgb,8,8,3)color(0,1,0,0.5)";
- tooltip = "Subcat4";
- };
- };
- };
- };
- };
- };
-};
\ No newline at end of file
diff --git a/Sources/epoch_config/Configs/CfgEpochClient.hpp b/Sources/epoch_config/Configs/CfgEpochClient.hpp
index 7fcae7cfa..d59251481 100644
--- a/Sources/epoch_config/Configs/CfgEpochClient.hpp
+++ b/Sources/epoch_config/Configs/CfgEpochClient.hpp
@@ -1,6 +1,6 @@
class CfgEpochClient
{
- epochVersion = "0.3.4.0";
+ epochVersion = "0.3.5.0";
sapperRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 = 1% - 55% if soiled (+ 2% if in city) chance to spawn sapper
droneRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 = // 2% chance (+ 4% chance if in city) (1% - 2% Half if using silencer) to spawn drone if shot fired
@@ -38,7 +38,10 @@ class CfgEpochClient
{"Crypto",0},
{"HitPoints",{0,0,0,0}},
{"BloodP",100},
- {"SpawnArray",{}}
+ {"SpawnArray",{}},
+ {"Karma",0},
+ {"Alcohol",0},
+ {"Radiation",0}
};
// controls max group limit and cost
@@ -63,7 +66,7 @@ class CfgEpochClient
{ "cabinetPos", "Cabinet_EPOCH", false }
};
-
+
#include "CfgEpochClient\takistan.hpp"
#include "CfgEpochClient\australia.hpp"
#include "CfgEpochClient\ProvingGrounds_PMC.hpp"
diff --git a/Sources/epoch_config/Configs/CfgMagazines.hpp b/Sources/epoch_config/Configs/CfgMagazines.hpp
index f5aecd33f..40687cbd5 100644
--- a/Sources/epoch_config/Configs/CfgMagazines.hpp
+++ b/Sources/epoch_config/Configs/CfgMagazines.hpp
@@ -72,7 +72,7 @@ class CfgMagazines
interactText = "BUILD";
buildClass = "Safe_SIM_EPOCH";
};
-
+
class PartPlankPack: CA_Magazine
{
@@ -1052,6 +1052,33 @@ class CfgMagazines
interactAttributes[] = {0,3000,0,0,0,0,0,0,0,0};
};
+ class KitSpikeTrap: CA_Magazine
+ {
+ model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
+ picture = "\x\addons\a3_epoch_assets_1\pictures\equip_wooden_crate_ca.paa";
+ displayName = "Wooden Spike Trap";
+ scope = 2;
+ descriptionShort = "Wooden Spike Trap";
+ count = 1;
+ mass = 20;
+ interactAction = 3; // 0 = examine, 1 = eat, 2 = drink, 3 = build
+ interactText = "BUILD";
+ buildClass = "Spike_TRAP_SIM_EPOCH";
+ };
+ class KitMetalTrap: CA_Magazine
+ {
+ model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
+ picture = "\x\addons\a3_epoch_assets_1\pictures\equip_wooden_crate_ca.paa";
+ displayName = "Metal Spike Trap";
+ scope = 2;
+ descriptionShort = "Metal Spike Trap";
+ count = 1;
+ mass = 20;
+ interactAction = 3; // 0 = examine, 1 = eat, 2 = drink, 3 = build
+ interactText = "BUILD";
+ buildClass = "Metal_TRAP_SIM_EPOCH";
+ };
+
class KitStudWall: CA_Magazine
{
model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
@@ -1118,6 +1145,32 @@ class CfgMagazines
interactText = "BUILD";
buildClass = "WoodRamp_EPOCH";
};
+ class KitTankTrap : CA_Magazine
+ {
+ model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
+ picture = "\x\addons\a3_epoch_assets_1\pictures\equip_wooden_crate_ca.paa";
+ displayName = "Tank Trap";
+ scope = 2;
+ descriptionShort = "Tank Trap";
+ count = 1;
+ mass = 20;
+ interactAction = 3; // 0 = examine, 1 = eat, 2 = drink, 3 = build
+ interactText = "BUILD";
+ buildClass = "TankTrap_SIM_EPOCH";
+ };
+ class KitHesco3 : CA_Magazine
+ {
+ model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
+ picture = "\x\addons\a3_epoch_assets_1\pictures\equip_wooden_crate_ca.paa";
+ displayName = "Hesco Wide";
+ scope = 2;
+ descriptionShort = "Hesco Wide";
+ count = 1;
+ mass = 20;
+ interactAction = 3; // 0 = examine, 1 = eat, 2 = drink, 3 = build
+ interactText = "BUILD";
+ buildClass = "Hesco3_EPOCH";
+ };
class KitWoodLadder : CA_Magazine
{
model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
diff --git a/Sources/epoch_config/Configs/CfgMasterLoop.hpp b/Sources/epoch_config/Configs/CfgMasterLoop.hpp
new file mode 100644
index 000000000..5b8a54c8c
--- /dev/null
+++ b/Sources/epoch_config/Configs/CfgMasterLoop.hpp
@@ -0,0 +1,42 @@
+class CfgMasterLoop
+{
+ class Init
+ {
+ file = "\x\addons\a3_epoch_code\compile\setup\masterLoop\init.sqf";
+ };
+
+ class Events
+ {
+ condition = "alive player";
+ file = "\x\addons\a3_epoch_code\compile\setup\masterLoop";
+
+ class Event1
+ {
+ delay = 1; // in seconds
+ };
+ class Event2
+ {
+ delay = 10;
+ };
+ class Event3
+ {
+ delay = 15;
+ };
+ class Event4
+ {
+ delay = 30;
+ };
+ class Event5
+ {
+ delay = 60;
+ };
+ class Event6
+ {
+ delay = 300;
+ };
+ class Event7
+ {
+ delay = 600;
+ };
+ };
+};
diff --git a/Sources/epoch_config/Configs/CfgPricing.hpp b/Sources/epoch_config/Configs/CfgPricing.hpp
index 32e20f87c..1a746f383 100644
--- a/Sources/epoch_config/Configs/CfgPricing.hpp
+++ b/Sources/epoch_config/Configs/CfgPricing.hpp
@@ -47,7 +47,7 @@ class CfgPricing
class 130Rnd_338_Mag{ price = 2; tax = 0.9; };
class 10Rnd_93x64_DMR_05_Mag { price = 2; tax = 0.9; };
class 10Rnd_127x54_Mag { price = 2; tax = 0.9; };
-
+
// Paint
class PaintCanClear {price = 1;};
class PaintCanBlk {price = 1;};
@@ -104,7 +104,7 @@ class CfgPricing
class Towelette {price = 1;};
class HeatPack {price = 2;};
class ColdPack {price = 2;};
-
+
class sr25_epoch { price = 50; };
class l85a2_epoch { price = 50; };
class l85a2_pink_epoch { price = 50; };
@@ -213,7 +213,7 @@ class CfgPricing
class M14Grn_EPOCH {price = 150;};
class m4a3_EPOCH {price = 100;};
class AKM_EPOCH {price = 100;};
-
+
// new magazines kiory
class 30rnd_556_magazine{ price = 5; tax = 0.9; };
class 20rnd_762_magazine{ price = 5; tax = 0.9; };
@@ -246,12 +246,12 @@ class CfgPricing
class MeleeSledge {price = 50;};
class MeleeSword { price = 1111; };
class MeleeRod { price = 100; };
-
+
class CrudeHatchet { price = 5; };
class MeleeMaul { price = 10; };
class WoodClub { price = 5; };
class Plunger { price = 15; };
-
+
class 16Rnd_9x21_Mag {price = 2; tax = 0.9;};
class 30Rnd_9x21_Mag {price = 3; tax = 0.9;};
class 9Rnd_45ACP_Mag {price = 1; tax = 0.9;};
@@ -319,6 +319,8 @@ class CfgPricing
// DLC muzzles
class muzzle_snds_338_black { price = 3; };
class muzzle_snds_338_green { price = 3; };
+ class muzzle_snds_338_sand { price = 3; };
+
class muzzle_snds_93mmg { price = 3; };
class muzzle_snds_93mmg_tan { price = 3; };
@@ -356,13 +358,16 @@ class CfgPricing
class KitWoodStairs {price = 10;};
class KitWoodTower {price = 10;};
class KitWoodRamp {price = 14;};
+ class KitSpikeTrap {price = 25;};
+ class KitMetalTrap {price = 25;};
+ class KitTankTrap {price = 25;};
+ class KitHesco3 { price = 25; };
class KitWoodLadder { price = 10; };
-
class KitFirePlace {price = 4;};
class KitTiPi {price = 10;};
class KitShelf {price = 90;};
class KitWorkbench { price = 10; };
-
+
class KitWoodFoundation { price = 20; };
class KitFoundation {price = 90;};
class KitPlotPole {price = 300;};
@@ -490,7 +495,7 @@ class CfgPricing
class U_C_Driver_1_yellow {price = 5;};
class U_C_Driver_1_orange {price = 5;};
-
+
class V_F0_EPOCH { price = 5; };
class V_F1_EPOCH { price = 5; };
class V_F2_EPOCH { price = 5; };
@@ -692,7 +697,7 @@ class CfgPricing
class K02 {price = 300;};
class K03 {price = 300;};
class K04 {price = 300;};
-
+
//Mission Items
class B_UavTerminal {price = 10;};
class O_UavTerminal {price = 10;};
diff --git a/Sources/epoch_config/Configs/CfgSnapChecks.hpp b/Sources/epoch_config/Configs/CfgSnapChecks.hpp
new file mode 100644
index 000000000..d6d89148a
--- /dev/null
+++ b/Sources/epoch_config/Configs/CfgSnapChecks.hpp
@@ -0,0 +1,53 @@
+// Snap Checks - EpochMod.com
+class CfgSnapChecks {
+ class Hesco3_EPOCH {
+ nails[] = {
+ {{1.6,0,-0.6},{1.6,0,-0.75}},
+ {{-1.6,0,-0.6},{-1.6,0,-0.75}},
+ {{1.6,0,-0.0307557},{1.8625,0,-0.0307557}},
+ {{-1.6,0,-0.0307557},{-1.8625,0,-0.0307557}}
+ };
+ };
+ class WoodLargeWall_EPOCH {
+ nails[] = {
+ {{2.46932,0,0.120775},{2.46932,0,-0.190775}},
+ {{-2.46932,0,0.120775},{-2.46932,0,-0.190775}},
+ {{2.46932,0,1.5},{2.76932,0,1.5}},
+ {{-2.46932,0,1.5},{-2.76932,0,1.5}}
+ };
+ };
+ class WoodWall1_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodWall2_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodWall3_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodWall4_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodLargeWallCor_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodLargeWallDoorway_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodLargeWallDoor_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodLargeWallDoorL_EPOCH : WoodLargeWall_EPOCH {};
+ class CinderWallGarage_EPOCH : WoodLargeWall_EPOCH {};
+ class CinderWall_EPOCH : WoodLargeWall_EPOCH {};
+ class CinderWallHalf_EPOCH : WoodLargeWall_EPOCH {};
+ class WoodFloor_Epoch {
+ nails[] = {
+ {{2.5555,0,0.15},{2.8555,0,0.15}},
+ {{0,-2.5555,0.15},{0,2.8555,0.15}},
+ {{-2.5555,0,0.15},{-2.8555,0,0.15}},
+ {{0,-2.5555,0.15},{0,-2.8555,0.15}},
+
+ {{2.5555,0,0.15},{2.5555,0,-0.15}},
+ {{-2.5555,0,0.15},{-2.5555,0,-0.15}},
+ {{0,-2.5555,0.15},{0,-2.5555,-0.15}},
+ {{0,2.5555,0.15},{0,2.5555,-0.15}}
+ };
+ };
+ class MetalFloor_EPOCH : WoodFloor_Epoch {};
+ class WoodStairs_EPOCH {
+ nails[] = {
+ {{0.1,0,0.05},{0.1,0,-0.20}},
+ {{-0.1,0,0.05},{-0.1,0,-0.20}}
+ };
+ };
+ class WoodStairs2_EPOCH : WoodStairs_EPOCH {};
+ class WoodTower_EPOCH : WoodStairs_EPOCH {};
+ class WoodRamp_EPOCH : WoodStairs_EPOCH {};
+};
diff --git a/Sources/epoch_config/Configs/CfgVehicles.hpp b/Sources/epoch_config/Configs/CfgVehicles.hpp
index c1d22c822..354714994 100644
--- a/Sources/epoch_config/Configs/CfgVehicles.hpp
+++ b/Sources/epoch_config/Configs/CfgVehicles.hpp
@@ -1927,7 +1927,7 @@ class CfgVehicles
class TransportItems{};
class Eventhandlers{};
};
-
+
class I_MRAP_03_F;
class I_MRAP_03_EPOCH : I_MRAP_03_F
{
@@ -1942,7 +1942,7 @@ class CfgVehicles
typicalCargo[] = {};
class TransportItems{};
class Eventhandlers{};
-
+
class RenderTargets
{
class commander_display
@@ -2359,7 +2359,7 @@ class CfgVehicles
waterResistanceCoef = 0.8;
waterAngularDampingCoef = 10;
destrType = "DestructNo";
-
+
mapSize = 0.14;
icon = "iconObject_2x3";
cost = 1000;
@@ -2408,14 +2408,67 @@ class CfgVehicles
cost = 1000;
interactMode = 1;
};
- /*
- class Sword_SIM_EPOCH: Constructions_modular_F
+
+ class Spike_TRAP_SIM_EPOCH: Constructions_modular_F
{
scope = 2;
- model = "\x\addons\a3_epoch_assets\models\sword.p3d";
- displayName = "Sword";
+ model = "\x\addons\a3_epoch_assets\models\sticks.p3d";
+ displayName = "Spike Trap (SIM)";
+ simulClass = "Spike_TRAP_SIM_EPOCH";
+ staticClass = "Spike_TRAP_EPOCH";
+ GhostPreview = "Spike_TRAP_EPOCH";
+ limitNearby = 1;
+ bypassJammer = 1;
};
- */
+
+ class Metal_TRAP_SIM_EPOCH: Constructions_modular_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets\models\sticks.p3d";
+ displayName = "Metal Trap (SIM)";
+ simulClass = "Metal_TRAP_SIM_EPOCH";
+ staticClass = "Metal_TRAP_EPOCH";
+ GhostPreview = "Metal_TRAP_EPOCH";
+ limitNearby = 1;
+ bypassJammer = 1;
+ };
+
+ class TankTrap_SIM_EPOCH: Constructions_modular_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\tank_trap.p3d";
+ displayName = "Tank Trap (SIM)";
+ simulClass = "TankTrap_SIM_EPOCH";
+ staticClass = "TankTrap_EPOCH";
+ GhostPreview = "TankTrap_EPOCH";
+ limitNearby = 4;
+ bypassJammer = 1;
+ };
+
+ class Hesco3_SIM_EPOCH : Constructions_modular_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\hesco.p3d";
+ displayName = "Hesco Wide (SIM)";
+ simulClass = "Hesco3_SIM_EPOCH";
+ staticClass = "Hesco3_EPOCH";
+ GhostPreview = "Hesco3_Ghost_EPOCH";
+ snapType = "snapPointsPara";
+ snapPointsPara[] = { "C", "E", "W" };
+ allowedSnapPoints[] = { "C", "E", "W" };
+ allowedSnapObjects[] = { "Hesco3_EPOCH" };
+ energyCost = 0.4;
+ slingLoadCargoMemoryPoints[] = {};
+ limitNearby = 4;
+ bypassJammer = 1;
+
+ /*
+ hiddenSelections[] = { "Camo" };
+ hiddenSelectionsTextures[] = { "\x\addons\a3_epoch_assets\textures\hesco\hesco_co.paa" };
+ hiddenSelectionsMaterials[] = { "\x\addons\a3_epoch_assets\textures\hesco\hesco.rvmat" };
+ */
+ };
+
class SapperHead_SIM_EPOCH: Constructions_modular_F
{
scope = 2;
@@ -2459,6 +2512,7 @@ class CfgVehicles
simulClass = "Fireplace_SIM_EPOCH";
staticClass = "Fireplace_EPOCH";
GhostPreview = "Fireplace_EPOCH";
+ isTemporary = 1;
};
class Jack_SIM_EPOCH : Constructions_modular_F
{
@@ -2656,6 +2710,21 @@ class CfgVehicles
energyCost = 0.2;
slingLoadCargoMemoryPoints[] = { "N", "S", "E", "W" };
};
+ class MetalFloor_SIM_EPOCH : Constructions_modular_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_1\models\metal_floor.p3d";
+ displayName = "Metal Floor";
+ simulClass = "MetalFloor_SIM_EPOCH";
+ staticClass = "MetalFloor_EPOCH";
+ GhostPreview = "MetalFloor_Ghost_EPOCH";
+ snapPointsPara[] = { "NF", "SF", "EF", "WF", "C", "CB" };
+ snapPointsPerp[] = { "N", "S", "E", "W", "CinN", "CinS", "CinE", "CinW" };
+ allowedSnapPoints[] = { "NF", "SF", "EF", "WF", "C" };
+ allowedSnapObjects[] = { "Const_floors_static_F", "Constructions_foundation_F" };
+ energyCost = 0.5;
+ slingLoadCargoMemoryPoints[] = { "N", "S", "E", "W" };
+ };
class WoodLargeWall_SIM_EPOCH: Constructions_modular_F
{
@@ -3587,6 +3656,7 @@ class CfgVehicles
simulClass = "PlotPole_SIM_EPOCH";
model = "\x\addons\a3_epoch_assets\models\jammer.p3d";
+ /*
class UserActions
{
class MaintainIT
@@ -3600,6 +3670,7 @@ class CfgVehicles
statement = "this call EPOCH_maintainIT";
};
};
+ */
removeParts[] = { { "KitPlotPole", 1 } };
bypassJammer = 1;
interactMode = 1;
@@ -3659,7 +3730,7 @@ class CfgVehicles
};
*/
- class Constructions_lockedstatic_F : NonStrategic
+ class Constructions_lockedstatic_F : WeaponHolder
{
mapSize = 1.27;
author = "Epoch";
@@ -3672,6 +3743,12 @@ class CfgVehicles
vehicleclass = "Epoch_objects";
destrType = "DestructBuilding";
cost = 1000;
+ // storage defaults
+ isGround = 0;
+ showWeaponCargo = 0;
+ forceSupply = 0;
+ maximumLoad = 600;
+ isSecureStorage = 1;
};
class LockBox_EPOCH : Constructions_lockedstatic_F
@@ -3684,10 +3761,12 @@ class CfgVehicles
weaponHolderProxy = "LockBoxProxy_EPOCH";
GhostPreview = "LockBox_EPOCH";
armor = 5000;
+ maximumLoad = 600;
bypassJammer = 1;
limitNearby = 2;
isSecureStorage = 1;
returnOnPack[] = { { "ItemLockbox", 1 } };
+ /*
class UserActions
{
class Unlock
@@ -3710,6 +3789,7 @@ class CfgVehicles
statement = "EPOCH_packStorage_PVS = [this,player,Epoch_personalToken]; publicVariableServer ""EPOCH_packStorage_PVS"";";
};
};
+ */
};
@@ -3723,12 +3803,15 @@ class CfgVehicles
weaponHolderProxy = "SafeProxy_EPOCH";
GhostPreview = "Safe_EPOCH";
armor = 15000;
+ maximumLoad = 3600;
bypassJammer = 1;
limitNearby = 2;
isSecureStorage = 1;
returnOnPack[] = { { "ItemSafe", 1 } };
+ /*
class UserActions
{
+
class Unlock
{
displayName = "Unlock";
@@ -3739,6 +3822,7 @@ class CfgVehicles
condition = "(this getVariable[""EPOCH_secStorParent"", objNull]) getVariable [""EPOCH_Locked"",true]";
statement = "EPOCH_lockStorage_PVS = [this,false,player,Epoch_personalToken]; publicVariableServer ""EPOCH_lockStorage_PVS"";";
};
+
class Pack
{
displayName = "Pack";
@@ -3748,7 +3832,86 @@ class CfgVehicles
condition = "(this getVariable[""EPOCH_secStorParent"", objNull]) getVariable [""EPOCH_Locked"",true]";
statement = "EPOCH_packStorage_PVS = [this,player,Epoch_personalToken]; publicVariableServer ""EPOCH_packStorage_PVS"";";
};
+
};
+ */
+
+ };
+
+
+ class TankTrap_EPOCH: Constructions_static_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\tank_trap.p3d";
+ displayName = "Tank Trap";
+ simulClass = "TankTrap_SIM_EPOCH";
+ staticClass = "TankTrap_EPOCH";
+ GhostPreview = "TankTrap_EPOCH";
+ energyCost = 0.2;
+ limitNearby = 4;
+ bypassJammer = 1;
+ };
+
+ class TRAP_EPOCH : Constructions_static_F {};
+ class Spike_TRAP_EPOCH: Constructions_static_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets\models\sticks.p3d";
+ displayName = "Spike Trap (SIM)";
+ simulClass = "Spike_TRAP_SIM_EPOCH";
+ staticClass = "Spike_TRAP_EPOCH";
+ GhostPreview = "Spike_TRAP_EPOCH";
+ ammoClass = "Spike_TRAP_AMMO_EPOCH";
+ energyCost = 0.2;
+ limitNearby = 2;
+ bypassJammer = 1;
+ armor = 0.1
+ };
+
+ class Metal_TRAP_EPOCH: Constructions_static_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets\models\sticks.p3d";
+ displayName = "Metal Trap (SIM)";
+ simulClass = "Metal_TRAP_SIM_EPOCH";
+ staticClass = "Metal_TRAP_EPOCH";
+ GhostPreview = "Metal_TRAP_EPOCH";
+ ammoClass = "Metal_TRAP_AMMO_EPOCH";
+ energyCost = 0.4;
+ limitNearby = 2;
+ bypassJammer = 1;
+ armor = 0.1
+ };
+
+ class Hesco3_EPOCH: Const_All_Walls_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\hesco.p3d";
+ displayName = "Hesco Wide";
+ simulClass = "Hesco3_SIM_EPOCH";
+ staticClass = "Hesco3_EPOCH";
+ GhostPreview = "Hesco3_Ghost_EPOCH";
+ snapType = "snapPointsPara";
+ snapPointsPara[] = { "C", "E", "W" };
+ allowedSnapPoints[] = { "C", "E", "W" };
+ energyCost = 0.2;
+ limitNearby = 4;
+ bypassJammer = 1;
+
+ /*
+ hiddenSelections[] = { "Camo" };
+ hiddenSelectionsTextures[] = { "\x\addons\a3_epoch_assets\textures\hesco\hesco_co.paa" };
+ hiddenSelectionsMaterials[] = { "\x\addons\a3_epoch_assets\textures\hesco\hesco.rvmat" };
+ */
+
+ /*
+ selectionDamage = "zbytek";
+ class Damage
+ {
+ tex[] = {};
+ mat[] = { "x\addons\a3_epoch_assets\textures\cinder\cinder.rvmat", "x\addons\a3_epoch_assets\textures\cinder\cinder_destruct50.rvmat", "x\addons\a3_epoch_assets\textures\cinder\cinder_destruct50.rvmat" };
+ };
+ */
};
class WoodRamp_EPOCH : Constructions_static_F
@@ -3792,7 +3955,7 @@ class CfgVehicles
scope = 2;
model = "\x\addons\a3_epoch_assets\models\cinder.p3d";
displayName = "Cinder Block Wall";
- upgradeBuilding[] = { "CinderWallGarage_EPOCH", { { "ItemCorrugatedLg", 1 }, { "CircuitParts", 1 } } };
+ // upgradeBuilding[] = { "CinderWallGarage_EPOCH", { { "ItemCorrugatedLg", 1 }, { "CircuitParts", 1 } } };
simulClass = "CinderWall_SIM_EPOCH";
staticClass = "CinderWall_EPOCH";
GhostPreview = "CinderWall_EPOCH";
@@ -3801,7 +3964,7 @@ class CfgVehicles
allowedSnapPoints[] = { "N", "S", "E", "W" };
energyCost = 0.4;
armor = 10000;
- removeParts[] = { { "CinderBlocks", 4 }, { "ItemRock", 2 } };
+
};
class CinderWallGarage_EPOCH : Const_Cinder_static_F
{
@@ -3948,7 +4111,28 @@ class CfgVehicles
snapPointsPerp[] = {"N","S","E","W","CinN","CinS","CinE","CinW"};
allowedSnapPoints[] = {"NF","SF","EF","WF","C"};
energyCost = 0.2;
- removeParts[] = { { "PartPlankPack", 2 } };
+ };
+ class MetalFloor_EPOCH : Const_floors_static_F
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_1\models\metal_floor.p3d";
+ displayName = "Metal Floor";
+ simulClass = "MetalFloor_SIM_EPOCH";
+ staticClass = "MetalFloor_EPOCH";
+ GhostPreview = "MetalFloor_Ghost_EPOCH";
+ snapPointsPara[] = { "NF", "SF", "EF", "WF", "C", "CB" };
+ snapPointsPerp[] = { "N", "S", "E", "W", "CinN", "CinS", "CinE", "CinW" };
+ allowedSnapPoints[] = { "NF", "SF", "EF", "WF", "C" };
+ energyCost = 0.5;
+ armor = 15000;
+
+ selectionDamage = "zbytek";
+ class Damage
+ {
+ tex[] = {};
+ // TODO: make seperate rvmat for destruction check for issues due to camo zbytek applying to all mats
+ mat[] = { "x\addons\a3_epoch_assets_1\textures\metal_floor.rvmat", "x\addons\a3_epoch_assets\textures\PlyPlank_destruct50.rvmat", "x\addons\a3_epoch_assets\textures\PlyPlank_destruct50.rvmat" };
+ };
};
// Wood wall seed item lvl 0
@@ -4024,6 +4208,20 @@ class CfgVehicles
ladders[] = {};
};
+ class MetalFloor_Ghost_EPOCH : Const_Ghost_EPOCH
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_1\models\metal_floor_ghost.p3d";
+ displayName = "Metal Floor Ghost";
+ staticClass = "MetalFloor_EPOCH";
+
+ snapPointsPara[] = { "NF", "SF", "EF", "WF", "C", "CB" };
+ snapPointsPerp[] = { "N", "S", "E", "W", "CinN", "CinS", "CinE", "CinW" };
+ allowedSnapPoints[] = { "NF", "SF", "EF", "WF", "C" };
+ allowedSnapObjects[] = { "Const_floors_static_F", "Constructions_foundation_F" };
+
+ ladders[] = {};
+ };
class WoodLadder_Ghost_EPOCH : Const_Ghost_EPOCH
{
@@ -4081,6 +4279,22 @@ class CfgVehicles
ladders[] = {};
};
+
+ class Hesco3_Ghost_EPOCH : Const_Ghost_EPOCH
+ {
+ scope = 2;
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\hesco_ghost.p3d";
+ displayName = "Hesco Wide (Ghost)";
+ staticClass = "Hesco3_EPOCH";
+
+ snapPointsPara[] = {};
+ snapPointsPerp[] = {};
+ allowedSnapPoints[] = { "C", "E", "W" };
+ allowedSnapObjects[] = { "Hesco3_EPOCH" };
+
+ ladders[] = {};
+ };
+
class CinderWallHalf_Ghost_EPOCH : Const_Ghost_EPOCH
{
scope = 2;
@@ -5073,60 +5287,9 @@ class CfgVehicles
};
};
- class Secure_Storage_Proxy : WeaponHolder {};
- class LockBoxProxy_EPOCH : Secure_Storage_Proxy
- {
- scope = 2;
- model = "\A3\Weapons_f\dummyweapon.p3d";
- displayName = "Lockbox WH";
- isGround = 0;
- showWeaponCargo = 0;
- forceSupply = 0;
- maximumLoad = 600;
- isSecureStorage = 1;
- parentClass = "LockBox_EPOCH";
-
- class UserActions
- {
- class Lock
- {
- displayName = "Lock";
- displayNameDefault = "
";
- onlyforplayer = 1;
- position = "Door_knopf";
- radius = 3;
- condition = "this == this";
- statement = "EPOCH_lockStorage_PVS = [this,true,player,Epoch_personalToken]; publicVariableServer ""EPOCH_lockStorage_PVS"";";
- };
- };
- };
-
- class SafeProxy_EPOCH : Secure_Storage_Proxy
- {
- scope = 2;
- model = "\x\addons\a3_epoch_assets_1\models\safe_proxy.p3d";
- displayName = "Safe WH";
- isGround = 0;
- showWeaponCargo = 0;
- forceSupply = 0;
- maximumLoad = 3600;
- isSecureStorage = 1;
- parentClass = "Safe_EPOCH";
-
- class UserActions
- {
- class Lock
- {
- displayName = "Lock";
- displayNameDefault = "
";
- onlyforplayer = 1;
- position = "Door_knopf";
- radius = 3;
- condition = "this == this";
- statement = "EPOCH_lockStorage_PVS = [this,true,player,Epoch_personalToken]; publicVariableServer ""EPOCH_lockStorage_PVS"";";
- };
- };
- };
+ // class Secure_Storage_Proxy : WeaponHolder {};
+ class LockBoxProxy_EPOCH : LockBox_EPOCH {};
+ class SafeProxy_EPOCH : Safe_EPOCH {};
class CouchProxy_EPOCH: WeaponHolder
{
diff --git a/Sources/epoch_config/Configs/cfgCrafting.hpp b/Sources/epoch_config/Configs/cfgCrafting.hpp
index 061737d59..35afc435b 100644
--- a/Sources/epoch_config/Configs/cfgCrafting.hpp
+++ b/Sources/epoch_config/Configs/cfgCrafting.hpp
@@ -263,14 +263,14 @@ class CfgCrafting
};
class MortarBucket : Part
{
- usedIn[] = {"KitFoundation","KitCinderWall"};
+ usedIn[] = {"KitFoundation","KitCinderWall", "KitHesco3"};
previewPosition[] = {0.799442,1,0.426761};
previewScale = 0.6;
previewVector = 0;
};
class ItemScraps : Item
{
- usedIn[] = { "ItemCorrugated" };
+ usedIn[] = { "ItemCorrugated", "KitMetalTrap"};
nearby[] = {{"Fire", "", "fire", {1,{"ALL"}}, 3, 1, 1, 0}};
recipe[] = { { "PartOre", 2 } };
previewPosition[] = {0.797144,1,0.309158};
@@ -637,16 +637,17 @@ class CfgCrafting
};
class ItemCorrugatedLg : Kit
{
- usedIn[] = { "VehicleRepairLg", "KitPlotPole" };
+ usedIn[] = { "VehicleRepairLg", "KitPlotPole", "KitTankTrap", "KitHesco3" };
recipe[] = { { "ItemCorrugated", 3 } };
nearby[] = {{"Workbench", "", "workbench", {1,{"WorkBench_EPOCH"}}, 3, 1, 0, 1}};
previewPosition[] = {0.797491,1,0.32899};
previewScale = 0.25;
previewVector = 0.5;
};
+
class PartPlankPack : Kit
{
- usedIn[] = {"KitStudWall","KitWoodFloor","KitWoodFoundation","KitWoodStairs","KitWoodRamp","KitWoodLadder","KitWoodTower","KitTiPi","KitWorkbench"};
+ usedIn[] = {"KitStudWall","KitWoodFloor","KitWoodFoundation","KitWoodStairs","KitWoodRamp","KitWoodLadder","KitWoodTower","KitTiPi","KitWorkbench","KitSpikeTrap","KitMetalTrap"};
recipe[] = {{"WoodLog_EPOCH",2}};
previewPosition[] = {0.797837,1,0.288258};
previewScale = 0.2;
@@ -661,6 +662,29 @@ class CfgCrafting
previewScale = 0.2;
previewVector = 1.5;
};
+
+
+
+ class KitSpikeTrap : Kit
+ {
+ recipe[] = {{"PartPlankPack",4}};
+ model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
+ nearby[] = {{"Workbench", "", "workbench", {1,{"WorkBench_EPOCH"}}, 3, 1, 0, 1}};
+ previewPosition[] = {0.797675,1,0.398882};
+ previewScale = 0.07;
+ previewVector = 0;
+ };
+ class KitMetalTrap : Kit
+ {
+ recipe[] = {{"PartPlankPack",4}, {"ItemScraps",2}};
+ model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";
+ nearby[] = {{"Workbench", "", "workbench", {1,{"WorkBench_EPOCH"}}, 3, 1, 0, 1}};
+ previewPosition[] = {0.797675,1,0.398882};
+ previewScale = 0.07;
+ previewVector = 0;
+ };
+
+
class KitStudWall : Kit
{
recipe[] = {{"PartPlankPack",4}};
@@ -698,6 +722,24 @@ class CfgCrafting
previewScale = 0.05;
previewVector = 0;
};
+ class KitTankTrap : Kit
+ {
+ recipe[] = { { "ItemCorrugatedLg", 1 } };
+ nearby[] = {{"Workbench", "", "workbench", {1,{"WorkBench_EPOCH"}}, 3, 1, 0, 1}};
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\tank_trap.p3d";
+ previewPosition[] = { 0.803749, 1, 0.448515 };
+ previewScale = 0.17;
+ previewVector = 0;
+ };
+ class KitHesco3 : Kit
+ {
+ recipe[] = { { "MortarBucket", 2 }, { "ItemCorrugatedLg", 2 } };
+ nearby[] = { { "Workbench", "", "workbench", { 1, { "WorkBench_EPOCH" } }, 3, 1, 0, 1 } };
+ model = "\x\addons\a3_epoch_assets_3\CfgVehicles\Defense\hesco.p3d";
+ previewPosition[] = { 0.803749, 1, 0.448515 };
+ previewScale = 0.02;
+ previewVector = 0;
+ };
class KitWoodStairs : Kit
{
recipe[] = {{"PartPlankPack",4}};
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32310-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32310-01.paa
new file mode 100644
index 000000000..c43d5cfe0
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32310-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32310-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32310-02.paa
new file mode 100644
index 000000000..182f815ac
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32310-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32310-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32310-03.paa
new file mode 100644
index 000000000..99a999e3c
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32310-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32310-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32310-04.paa
new file mode 100644
index 000000000..ddc6dcd33
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32310-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32310.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32310.fxy
new file mode 100644
index 000000000..e54046cc7
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32310.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32311-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32311-01.paa
new file mode 100644
index 000000000..a126046c5
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32311-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32311-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32311-02.paa
new file mode 100644
index 000000000..1fea30719
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32311-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32311-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32311-03.paa
new file mode 100644
index 000000000..44cce0a59
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32311-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32311-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32311-04.paa
new file mode 100644
index 000000000..89dc116df
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32311-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32311.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32311.fxy
new file mode 100644
index 000000000..9304a1422
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32311.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32312-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32312-01.paa
new file mode 100644
index 000000000..f87f93856
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32312-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32312-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32312-02.paa
new file mode 100644
index 000000000..350fefe1d
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32312-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32312-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32312-03.paa
new file mode 100644
index 000000000..be7c497be
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32312-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32312-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32312-04.paa
new file mode 100644
index 000000000..f9bedab38
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32312-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32312.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32312.fxy
new file mode 100644
index 000000000..b21dd4dad
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32312.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32313-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32313-01.paa
new file mode 100644
index 000000000..6184034e1
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32313-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32313-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32313-02.paa
new file mode 100644
index 000000000..b0ddb9107
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32313-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32313-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32313-03.paa
new file mode 100644
index 000000000..5396c2947
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32313-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32313-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32313-04.paa
new file mode 100644
index 000000000..f5b4807da
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32313-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32313.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32313.fxy
new file mode 100644
index 000000000..8638a227e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32313.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32314-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32314-01.paa
new file mode 100644
index 000000000..7cefb045d
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32314-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32314-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32314-02.paa
new file mode 100644
index 000000000..7529ed8f5
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32314-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32314-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32314-03.paa
new file mode 100644
index 000000000..7f19fdd53
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32314-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32314-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32314-04.paa
new file mode 100644
index 000000000..d1ce3dcf2
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32314-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32314.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32314.fxy
new file mode 100644
index 000000000..ac619daf5
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32314.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32315-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32315-01.paa
new file mode 100644
index 000000000..e847c41cc
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32315-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32315-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32315-02.paa
new file mode 100644
index 000000000..e0b8ee082
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32315-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32315-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32315-03.paa
new file mode 100644
index 000000000..019768c9a
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32315-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32315-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32315-04.paa
new file mode 100644
index 000000000..35ecb9062
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32315-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32315.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32315.fxy
new file mode 100644
index 000000000..86b8c1a29
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32315.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32316-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32316-01.paa
new file mode 100644
index 000000000..9632249a7
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32316-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32316-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32316-02.paa
new file mode 100644
index 000000000..6a74c403c
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32316-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32316-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32316-03.paa
new file mode 100644
index 000000000..666904db2
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32316-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32316-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32316-04.paa
new file mode 100644
index 000000000..4b6fc74c2
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32316-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32316.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32316.fxy
new file mode 100644
index 000000000..52596def8
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32316.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32317-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32317-01.paa
new file mode 100644
index 000000000..568b2cb00
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32317-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32317-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32317-02.paa
new file mode 100644
index 000000000..68abeae8a
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32317-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32317-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32317-03.paa
new file mode 100644
index 000000000..cf64b0383
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32317-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32317-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32317-04.paa
new file mode 100644
index 000000000..c1b5d97f0
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32317-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32317.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32317.fxy
new file mode 100644
index 000000000..4e2abfa9d
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32317.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32318-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32318-01.paa
new file mode 100644
index 000000000..028fbbf93
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32318-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32318-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32318-02.paa
new file mode 100644
index 000000000..0c4c4aada
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32318-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32318-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32318-03.paa
new file mode 100644
index 000000000..f0d8d6a59
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32318-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32318-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32318-04.paa
new file mode 100644
index 000000000..630000bf2
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32318-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32318.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32318.fxy
new file mode 100644
index 000000000..edd6a02f0
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32318.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32319-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32319-01.paa
new file mode 100644
index 000000000..fff4cfff4
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32319-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32319-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32319-02.paa
new file mode 100644
index 000000000..b10615b41
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32319-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32319-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32319-03.paa
new file mode 100644
index 000000000..3a4101ed9
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32319-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32319-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32319-04.paa
new file mode 100644
index 000000000..b4fab0601
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32319-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32319.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32319.fxy
new file mode 100644
index 000000000..78a667165
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32319.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32320-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32320-01.paa
new file mode 100644
index 000000000..a3a6a3983
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32320-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32320-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32320-02.paa
new file mode 100644
index 000000000..3229445bf
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32320-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32320-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32320-03.paa
new file mode 100644
index 000000000..4ad24b115
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32320-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32320-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32320-04.paa
new file mode 100644
index 000000000..9dd228088
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32320-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32320.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32320.fxy
new file mode 100644
index 000000000..d02f03cf9
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32320.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32321-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32321-01.paa
new file mode 100644
index 000000000..ab75a6d8a
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32321-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32321-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32321-02.paa
new file mode 100644
index 000000000..bb9dbefed
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32321-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32321-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32321-03.paa
new file mode 100644
index 000000000..c3130eaaa
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32321-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32321-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32321-04.paa
new file mode 100644
index 000000000..a144ee8af
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32321-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32321.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32321.fxy
new file mode 100644
index 000000000..4270f013e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32321.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32322-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32322-01.paa
new file mode 100644
index 000000000..f3eb091fc
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32322-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32322-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32322-02.paa
new file mode 100644
index 000000000..6a7694a0c
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32322-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32322-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32322-03.paa
new file mode 100644
index 000000000..9c20ce4dc
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32322-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32322-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32322-04.paa
new file mode 100644
index 000000000..6e596679e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32322-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32322.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32322.fxy
new file mode 100644
index 000000000..1aae93007
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32322.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32323-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32323-01.paa
new file mode 100644
index 000000000..6e9d49acf
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32323-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32323-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32323-02.paa
new file mode 100644
index 000000000..7126a42bd
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32323-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32323-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32323-03.paa
new file mode 100644
index 000000000..498f909c7
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32323-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32323-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32323-04.paa
new file mode 100644
index 000000000..d4b2b2632
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32323-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32323.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32323.fxy
new file mode 100644
index 000000000..b003db9df
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32323.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32324-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32324-01.paa
new file mode 100644
index 000000000..92eb79b4f
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32324-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32324-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32324-02.paa
new file mode 100644
index 000000000..ca8e2cfac
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32324-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32324-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32324-03.paa
new file mode 100644
index 000000000..37f4b207f
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32324-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32324-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32324-04.paa
new file mode 100644
index 000000000..09fe1f648
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32324-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32324.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32324.fxy
new file mode 100644
index 000000000..f043c930f
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32324.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32325-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32325-01.paa
new file mode 100644
index 000000000..c470319c9
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32325-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32325-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32325-02.paa
new file mode 100644
index 000000000..e96e09cb9
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32325-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32325-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32325-03.paa
new file mode 100644
index 000000000..75a96ad80
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32325-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32325-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32325-04.paa
new file mode 100644
index 000000000..31d8bd7b4
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32325-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32325.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32325.fxy
new file mode 100644
index 000000000..5383236e5
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32325.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32326-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32326-01.paa
new file mode 100644
index 000000000..eb8e1ffc7
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32326-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32326-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32326-02.paa
new file mode 100644
index 000000000..ddbe36329
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32326-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32326-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32326-03.paa
new file mode 100644
index 000000000..3149fcc4a
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32326-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32326-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32326-04.paa
new file mode 100644
index 000000000..dfb2536d8
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32326-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32326.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32326.fxy
new file mode 100644
index 000000000..166b37320
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32326.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32327-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32327-01.paa
new file mode 100644
index 000000000..09ea5893e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32327-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32327-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32327-02.paa
new file mode 100644
index 000000000..e9154cb2b
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32327-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32327-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32327-03.paa
new file mode 100644
index 000000000..9bf1b3e13
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32327-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32327-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32327-04.paa
new file mode 100644
index 000000000..56b4c9624
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32327-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32327.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32327.fxy
new file mode 100644
index 000000000..8965d63ac
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32327.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32328-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32328-01.paa
new file mode 100644
index 000000000..f45afaa1c
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32328-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32328-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32328-02.paa
new file mode 100644
index 000000000..a57310bb8
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32328-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32328-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32328-03.paa
new file mode 100644
index 000000000..fc7ca5388
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32328-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32328-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32328-04.paa
new file mode 100644
index 000000000..e4c23a208
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32328-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32328.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32328.fxy
new file mode 100644
index 000000000..d0f0973f4
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32328.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32329-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32329-01.paa
new file mode 100644
index 000000000..f0a59138b
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32329-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32329-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32329-02.paa
new file mode 100644
index 000000000..0b798430c
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32329-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32329-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32329-03.paa
new file mode 100644
index 000000000..ad60a8625
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32329-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32329-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32329-04.paa
new file mode 100644
index 000000000..c21f2faf0
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32329-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32329.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32329.fxy
new file mode 100644
index 000000000..99657d4a3
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32329.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32330-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32330-01.paa
new file mode 100644
index 000000000..170320af8
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32330-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32330-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32330-02.paa
new file mode 100644
index 000000000..24782f7e1
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32330-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32330-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32330-03.paa
new file mode 100644
index 000000000..a14ddf78d
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32330-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32330-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32330-04.paa
new file mode 100644
index 000000000..cd38d3468
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32330-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32330.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32330.fxy
new file mode 100644
index 000000000..db7d7e00a
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32330.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32331-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32331-01.paa
new file mode 100644
index 000000000..fd33948a8
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32331-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32331-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32331-02.paa
new file mode 100644
index 000000000..b042f71e2
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32331-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32331-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32331-03.paa
new file mode 100644
index 000000000..12092f0cb
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32331-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32331-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32331-04.paa
new file mode 100644
index 000000000..e1da7cf18
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32331-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32331.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32331.fxy
new file mode 100644
index 000000000..34992c696
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32331.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32334-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32334-01.paa
new file mode 100644
index 000000000..96e17624e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32334-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32334-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32334-02.paa
new file mode 100644
index 000000000..66a54faa5
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32334-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32334-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32334-03.paa
new file mode 100644
index 000000000..d65ae40e4
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32334-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32334-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32334-04.paa
new file mode 100644
index 000000000..57ee0f2c7
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32334-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32334.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32334.fxy
new file mode 100644
index 000000000..76dffd9e0
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32334.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32335-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32335-01.paa
new file mode 100644
index 000000000..731b9fa60
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32335-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32335-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32335-02.paa
new file mode 100644
index 000000000..28d4e1875
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32335-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32335-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32335-03.paa
new file mode 100644
index 000000000..9a5309d9a
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32335-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32335-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32335-04.paa
new file mode 100644
index 000000000..16830a69e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32335-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32335.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32335.fxy
new file mode 100644
index 000000000..a7bc90d45
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32335.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32337-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32337-01.paa
new file mode 100644
index 000000000..1a246491e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32337-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32337-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32337-02.paa
new file mode 100644
index 000000000..e4a32cb8f
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32337-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32337-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32337-03.paa
new file mode 100644
index 000000000..f36a6d42d
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32337-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32337-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32337-04.paa
new file mode 100644
index 000000000..3562134c1
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32337-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32337.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32337.fxy
new file mode 100644
index 000000000..5b326724d
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32337.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32346-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32346-01.paa
new file mode 100644
index 000000000..82b247e83
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32346-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32346-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32346-02.paa
new file mode 100644
index 000000000..f01c812ff
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32346-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32346-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32346-03.paa
new file mode 100644
index 000000000..b96e43e08
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32346-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32346-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT32346-04.paa
new file mode 100644
index 000000000..4c61164c2
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32346-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT32346.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT32346.fxy
new file mode 100644
index 000000000..0d5985707
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT32346.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3236-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3236-01.paa
new file mode 100644
index 000000000..cd694d96c
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3236-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3236-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3236-02.paa
new file mode 100644
index 000000000..2614641df
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3236-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3236-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3236-03.paa
new file mode 100644
index 000000000..6c88d2c75
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3236-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3236-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3236-04.paa
new file mode 100644
index 000000000..ab6219163
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3236-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3236.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT3236.fxy
new file mode 100644
index 000000000..72412a792
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3236.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3237-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3237-01.paa
new file mode 100644
index 000000000..583b8c9ef
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3237-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3237-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3237-02.paa
new file mode 100644
index 000000000..063df0b41
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3237-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3237-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3237-03.paa
new file mode 100644
index 000000000..673d0b703
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3237-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3237-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3237-04.paa
new file mode 100644
index 000000000..244dffe78
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3237-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3237.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT3237.fxy
new file mode 100644
index 000000000..efb909231
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3237.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3238-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3238-01.paa
new file mode 100644
index 000000000..7b7d43763
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3238-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3238-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3238-02.paa
new file mode 100644
index 000000000..9716e4291
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3238-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3238-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3238-03.paa
new file mode 100644
index 000000000..ebc0c2cd7
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3238-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3238-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3238-04.paa
new file mode 100644
index 000000000..4169ac994
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3238-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3238.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT3238.fxy
new file mode 100644
index 000000000..b1b82a71e
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3238.fxy differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3239-01.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3239-01.paa
new file mode 100644
index 000000000..2d702e9b8
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3239-01.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3239-02.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3239-02.paa
new file mode 100644
index 000000000..8fe497b42
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3239-02.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3239-03.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3239-03.paa
new file mode 100644
index 000000000..454f58fc0
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3239-03.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3239-04.paa b/Sources/epoch_config/Data/Fonts/VT323/VT3239-04.paa
new file mode 100644
index 000000000..fd8a9ace2
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3239-04.paa differ
diff --git a/Sources/epoch_config/Data/Fonts/VT323/VT3239.fxy b/Sources/epoch_config/Data/Fonts/VT323/VT3239.fxy
new file mode 100644
index 000000000..8c1144bfe
Binary files /dev/null and b/Sources/epoch_config/Data/Fonts/VT323/VT3239.fxy differ
diff --git a/Sources/epoch_config/config.cpp b/Sources/epoch_config/config.cpp
index dd6d66a4d..f19e196b8 100644
--- a/Sources/epoch_config/config.cpp
+++ b/Sources/epoch_config/config.cpp
@@ -18,7 +18,7 @@ class CfgPatches
requiredAddons[] = { "a3_map_altis", "a3_map_stratis", "A3_epoch_assets_3", "a3_epoch_weapons", "epoch_objects", "A3_epoch_vehicles", "A3_epoch_assets_1", "A3_epoch_assets", "A3_Soft_F", "A3_Characters_F", "A3_Characters_F_Beta", "A3_Characters_F_EPA", "A3_Characters_F_EPB", "A3_Structures_F", "A3_Armor_F_Beta", "A3_Data_F", "A3_Weapons_F", "A3_Characters_F_Kart", "A3_Soft_F_Kart_Kart_01", "a2_epoch_weapons", "A3_Air_F_Gamma_UAV_01", "A3_Soft_F_Car", "A3_Soft_F_Heli_Car", "A3_Soft_F_Offroad_01", "A3_Soft_F_Quadbike", "A3_Soft_F_Heli_Quadbike", "A3_Soft_F_SUV", "A3_Soft_F_Heli_SUV", "A3_Boat_F_Boat_Transport_01", "A3_Soft_F_Truck", "A3_Soft_F_Heli_Truck", "A3_Soft_F_Bootcamp_Truck", "A3_Boat_F_Civilian_Boat", "A3_Air_F_Heli_Light_01", "A3_Air_F_Heli_Heli_Light_01", "A3_Air_F_Beta_Heli_Transport_01", "A3_Boat_F_SDV_01", "A3_Boat_F_Heli_SDV_01", "A3_Soft_F_MRAP_01", "A3_Soft_F_Heli_MRAP_01", "A3_Soft_F_HEMTT", "A3_Soft_F_Gamma_HEMTT", "A3_Soft_F_TruckHeavy", "A3_Soft_F_Gamma_TruckHeavy", "A3_Soft_F_EPC_Truck_03", "A3_Air_F_Heli_Light_02", "A3_Air_F_Beta_Heli_Transport_02", "A3_Air_F_EPB_Heli_Light_03", "A3_Air_F_Heli_Heli_Transport_04", "A3_Air_F_Heli_Heli_Transport_03", "A3_Animals_F_Dog", "A3_Animals_F_Rabbit", "A3_Animals_F_Chicken", "A3_Characters_F_Common", "A3_Structures_F_Ind_Transmitter_Tower", "a3_epoch_structures" };
magazines[] = { "30Rnd_test_mag", "5Rnd_rollins_mag", "CSGAS", "sledge_swing", "30Rnd_test_mag_Tracer", "EnergyPack", "1Rnd_Soda", "1Rnd_Food", "WoodLog_EPOCH", "PaintCanBlk", "PaintCanBlu", "PaintCanBrn", "PaintCanGrn", "PaintCanOra", "PaintCanPur", "PaintCanRed", "PaintCanTeal", "PaintCanYel" };
ammo[] = { "B_EnergyPack", "B_Swing", "Sapper_Charge_Ammo", "SapperB_Charge_Ammo", "B_Soda", "B_Food", "B_Test_Caseless", "ChainSaw_Bullet", "SmokeShellCustom" };
- epochVersion = "0.3.4.0";
+ epochVersion = "0.3.5.0";
};
};
@@ -40,11 +40,11 @@ class CfgAddons
#include "\x\addons\a3_epoch_config\Configs\cfgCrafting.hpp"
#include "\x\addons\a3_epoch_config\Configs\cfgPricing.hpp"
#include "\x\addons\a3_epoch_config\Configs\CfgEpochClient.hpp"
+#include "\x\addons\a3_epoch_config\Configs\CfgMasterLoop.hpp"
#include "\x\addons\a3_epoch_config\Configs\CfgBaseBuilding.hpp"
+#include "\x\addons\a3_epoch_config\Configs\CfgSnapChecks.hpp"
#include "\x\addons\a3_epoch_config\Configs\CfgBuildingLootPos.hpp"
-
-//gitmerge fix
-#include "\x\addons\a3_epoch_config\Configs\CfgDynamicMenu.hpp"
+#include "\x\addons\a3_epoch_config\Configs\CfgActionMenu\CfgActionMenu_core.hpp"
#include "\x\addons\a3_epoch_config\Configs\CfgEpochConfiguration.hpp"
class DefaultEventhandlers;
@@ -105,8 +105,18 @@ class CfgAnimationSourceSounds
class CfgCommands
{
// allowedHTMLLoadURIs[] += // think this adds to an existing array
- allowedHTMLLoadURIs[] =
+ allowedHTMLLoadURIs[] =
{
"https://raw.githubusercontent.com/epochmodteam/epoch/test/changelog.html" //there are some issues with capitalization used in github links
};
-};
\ No newline at end of file
+};
+
+class CfgFontFamilies
+{
+ class VT323
+ {
+ fonts[] = {"x\addons\a3_epoch_config\Data\Fonts\VT323\VT3236","x\addons\a3_epoch_config\Data\Fonts\VT323\VT3237","x\addons\a3_epoch_config\Data\Fonts\VT323\VT3238","x\addons\a3_epoch_config\Data\Fonts\VT323\VT3239","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32310","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32311","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32312","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32313","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32314","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32315","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32316","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32317","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32318","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32319","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32320","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32321","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32322","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32323","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32324","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32325","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32326","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32327","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32328","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32329","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32330","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32331","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32334","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32335","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32337","x\addons\a3_epoch_config\Data\Fonts\VT323\VT32346"};
+ spaceWidth = 0.7;
+ spacing = 0.2;
+ };
+};
diff --git a/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_handle_say3D.sqf b/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_handle_say3D.sqf
index a69a21b85..a6087ddd6 100644
--- a/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_handle_say3D.sqf
+++ b/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_handle_say3D.sqf
@@ -8,12 +8,12 @@ private["_range", "_nearBy", "_target", "_soundIndex", "_sound"];
if !([_this select 0, _this select 3] call EPOCH_server_getPToken) exitWith{};
-_target = _this select 1;
+_target = param [1,objNull];
if (isNull _target) exitWith {};
-_soundIndex = _this select 2;
-_sound = EPOCH_sounds select _soundIndex;
+_soundIndex = param [2,-1];
+_sound = EPOCH_sounds param [_soundIndex,-1];
-if (!isNil "_sound") then {
+if !(_sound isEqualTo -1) then {
_range = getNumber(configFile >> "CfgSay3Dhandler" >> _sound >> "distance");
_nearBy = _target nearEntities [["Epoch_Male_F","Epoch_Female_F","LandVehicle","Ship","Air","Tank"], _range];
{
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf
index eb8557c9d..0da78b0c4 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf
@@ -49,10 +49,6 @@ for "_i" from 0 to _this do {
_textureSlot = _arr select 4;
};
-
-
-
-
// experiment with damage factor based on time only for now.
_damage = ((1 - (_ttl / _maxTTL)) min 1) max 0;
@@ -65,11 +61,22 @@ for "_i" from 0 to _this do {
// remove old safes on && !(_class isKindOf 'Constructions_lockedstatic_F')
if (isClass (configFile >> "CfgVehicles" >> _class) && (_damage < 1) && !(_class isKindOf 'Constructions_lockedstatic_F')) then {
- _baseObj = createVehicle [_class, _location, [], 0, "CAN_COLLIDE"];
+ _baseObj = createVehicle [_class, _location, [], 0, "CAN_COLLIDE"];
_baseObj setVectorDirAndUp _worldspace;
_baseObj setposATL _location;
+ // spawn additional object for trap
+ _ammoClass = (configFile >> "CfgVehicles" >> _class >> "ammoClass");
+ if(isText _ammoClass) then {
+ _ammoClass = getText _ammoClass;
+ _ammoObj = createVehicle [_ammoClass, _location, [], 0, "CAN_COLLIDE"];
+ _ammoObj setVectorDirAndUp _worldspace;
+ _ammoObj setposATL _location;
+ _baseObj setVariable ["EPOCH_TRAP_OBJ",_ammoObj];
+ };
+
+ // set persistent Animations
if (_arrCount >= 6) then{
_anims = _arr param[5, [], [[]]];
{
@@ -77,8 +84,8 @@ for "_i" from 0 to _this do {
} foreach(getArray(configFile >> "CfgVehicles" >> _class >> "persistAnimations"));
};
- // TODO make config based
- if (_class == "PlotPole_EPOCH") then {
+ // Handle Jammers and create marker if EPOCH_SHOW_JAMMERS set true.
+ if (_class isKindOf "PlotPole_EPOCH") then {
if (EPOCH_SHOW_JAMMERS) then {
_marker = createMarker[str(_location), _location];
_marker setMarkerShape "ICON";
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf
index 1b8b7cb4a..e9a31ff4a 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_maintBUILD.sqf
@@ -60,7 +60,7 @@ if (typeOf _object == "PlotPole_EPOCH") then {
};
};
if (_counter > _maintCount) exitWith{};
- } forEach nearestObjects[_object, ["Constructions_static_F","Constructions_foundation_F","Buildable_Storage","Secure_Storage_Proxy"], _buildingJammerRange];
+ } forEach nearestObjects[_object, ["Constructions_static_F","Constructions_foundation_F","Buildable_Storage","Constructions_lockedstatic_F"], _buildingJammerRange];
// effect crypto
_playerCryptoLimit = [(configFile >> "CfgSecConf" >> "limits"), "playerCrypto", 25000] call EPOCH_fnc_returnConfigEntry;
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf
index 7bb663fb6..214f54bba 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_removeBUILD.sqf
@@ -43,7 +43,7 @@ if (_vehSlot != -1 || _storageSlot != "ABORT" || _isTemporary == 1) then{
// if normal storage device dump items on ground.
if (_building isKindOf "Buildable_Storage") then {
-
+
// may not be needed but should prevent in DB.
_wepsItemsCargo = weaponsItemsCargo _building;
if (isNil "_wepsItemsCargo") then{
@@ -54,7 +54,7 @@ if (_vehSlot != -1 || _storageSlot != "ABORT" || _isTemporary == 1) then{
_magsAmmoCargo = [];
};
- // dump items on ground
+ // dump items on ground
_inventory = [
_wepsItemsCargo,
_magsAmmoCargo,
@@ -103,7 +103,7 @@ if (_vehSlot != -1 || _storageSlot != "ABORT" || _isTemporary == 1) then{
};
} forEach _x;
- // add all attachments to vehicle
+ // add all attachments to vehicle
// TODO replace with adding attachments directly to gun (Arma feature dependant)
{
_gwh addItemCargoGlobal[_x, 1];
@@ -148,6 +148,12 @@ if (_vehSlot != -1 || _storageSlot != "ABORT" || _isTemporary == 1) then{
} else {
+ // Remove trap object
+ _ammoObj = _building getVariable ["EPOCH_TRAP_OBJ",objNull];
+ if !(isNull _ammoObj) then {
+ deleteVehicle _ammoObj;
+ };
+
[_building, _player] call EPOCH_server_save_killedBuilding;
deleteVehicle _building;
};
@@ -158,7 +164,7 @@ if (_vehSlot != -1 || _storageSlot != "ABORT" || _isTemporary == 1) then{
_gwh addMagazineCargoGlobal[_x select 0, _x select 1];
} forEach _removeParts;
};
-
+
};
};
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf
index d3ecef02d..a1dde6a28 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_saveBuilding.sqf
@@ -31,65 +31,27 @@ if (isText _config) then {
EPOCH_StorageSlotsCount = count EPOCH_StorageSlots;
publicVariable "EPOCH_StorageSlotsCount";
- // Secure storage
- if (getNumber(configFile >> "CfgVehicles" >> _staticClass >> "isSecureStorage") == 1) then{
-
- // remove sim
- _vehiclePos = getposATL _vehicle;
- _vectorDirAndUp = [vectordir _vehicle, vectorup _vehicle];
- deleteVehicle _vehicle;
-
- // create static dummy placeholder for secure storage
- _newVehicle = createVehicle[_staticClass, _vehiclePos, [], 0, "CAN_COLLIDE"];
- _newVehicle setVectorDirAndUp _vectorDirAndUp;
- _newVehicle setposATL _vehiclePos;
-
- if (!isNull _newVehicle) then{
-
- _buildClass = getText(configFile >> "CfgVehicles" >> _staticClass >> "weaponHolderProxy");
- if (_buildClass != "") then{
-
- // TODO need some sanity checks here
- _storageObj = createVehicle[_buildClass, _vehiclePos, [], 0.0, "CAN_COLLIDE"];
- _storageObj setVectorDirAndUp _vectorDirAndUp;
- _storageObj setposATL _vehiclePos;
-
- // set reference to storage object on dummy object
- _newVehicle setVariable["EPOCH_secStorParent", _storageObj];
- _storageObj setVariable["EPOCH_secStorChild",_newVehicle];
-
- _storageObj setVariable["EPOCH_Locked", false, true];
- _storageObj setVariable["STORAGE_OWNERS", [_plyrUID]];
- _storageObj setVariable["STORAGE_SLOT", _slot, true];
+ // Secure and insecure storage
+ _vehiclePos = getposATL _vehicle;
+ _vectorDirAndUp = [vectordir _vehicle, vectorup _vehicle];
+ deleteVehicle _vehicle;
- _storageObj call EPOCH_server_save_storage;
- _storageObj call EPOCH_server_storageInit;
+ _storageObj = createVehicle[_staticClass, _vehiclePos, [], 0, "CAN_COLLIDE"];
+ _storageObj setVectorDirAndUp _vectorDirAndUp;
+ _storageObj setposATL _vehiclePos;
- diag_log format["STORAGE: %1 created storage %2 at %3", _plyrUID, _buildClass, _pos];
-
- };
- };
-
- // insecure storage
- } else {
-
- _vehiclePos = getposATL _vehicle;
- _vectorDirAndUp = [vectordir _vehicle, vectorup _vehicle];
- deleteVehicle _vehicle;
-
- _storageObj = createVehicle[_staticClass, _vehiclePos, [], 0, "CAN_COLLIDE"];
- _storageObj setVectorDirAndUp _vectorDirAndUp;
- _storageObj setposATL _vehiclePos;
+ if (getNumber(configFile >> "CfgVehicles" >> _staticClass >> "isSecureStorage") == 1) then{
+ _storageObj setVariable["EPOCH_Locked", false, true];
+ };
- _storageObj setVariable["STORAGE_OWNERS", [_plyrUID]];
- _storageObj setVariable["STORAGE_SLOT", _slot, true];
+ _storageObj setVariable["STORAGE_OWNERS", [_plyrUID]];
- _storageObj call EPOCH_server_save_storage;
- _storageObj call EPOCH_server_storageInit;
+ _storageObj setVariable["STORAGE_SLOT", _slot, true];
- diag_log format["STORAGE: %1 created storage %2 at %3", _plyrUID, _staticClass, _vehiclePos];
+ _storageObj call EPOCH_server_save_storage;
+ _storageObj call EPOCH_server_storageInit;
- };
+ diag_log format["STORAGE: %1 created storage %2 at %3 with slot %4", _plyrUID, _staticClass, _vehiclePos, _slot];
};
} else {
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf
index 88f5883e9..5f8cfee04 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_simulSwap.sqf
@@ -43,6 +43,16 @@ if (_objSlot != -1) then {
};
};
+ // spawn additional object for trap
+ _ammoClass = (configFile >> "CfgVehicles" >> _class >> "ammoClass");
+ if (isText _ammoClass) then {
+ _ammoClass = getText _ammoClass;
+ _ammoObj = createVehicle [_ammoClass, _worldspace select 0, [], 0, "CAN_COLLIDE"];
+ _ammoObj setVectorDirAndUp [(_worldspace select 1),(_worldspace select 2)];
+ _ammoObj setposATL (_worldspace select 0);
+ _newObj setVariable ["EPOCH_TRAP_OBJ",_ammoObj];
+ };
+
_newObj setVectorDirAndUp [(_worldspace select 1),(_worldspace select 2)];
_newObj setposATL (_worldspace select 0);
_newObj setDamage _damage;
@@ -51,4 +61,4 @@ if (_objSlot != -1) then {
};
};
};
-_return
\ No newline at end of file
+_return
diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf
index b95b7de86..a472d5d61 100644
--- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf
+++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_loadPlayer.sqf
@@ -4,12 +4,33 @@
Epoch Mod - EpochMod.com
All Rights Reserved.
*/
-private["_reject", "_plyr", "_instanceID", "_plyrNetID", "_plyrUID", "_response", "_arr", "_defaultUniform", "_class", "_vest", "_medical", "_alreadyDead", "_worldspace", "_dir", "_location", "_prevInstance", "_plyrGroup", "_canBeRevived", "_vars", "_hitpoints", "_group", "_newPlyr", "_currWeap", "_apperance", "_goggles", "_headgear", "_backpack", "_uniform", "_weaponsAndItems", "_equipped", "_weapon", "_type", "_attachments", "_attachment", "_wMags", "_itemSlot", "_itemqtys", "_found", "_contentArray", "_deadPlayer"];
+private ["_arr","_uniform","_class","_vest","_vars","_canBeRevived","_dir","_location","_group","_apperance","_goggles","_headgear","_backpack","_weaponsAndItems","_linkedItems","_normalMagazines","_itemsInContainers","_weaponsInContainers","_wMags","_wMagsArray","_equipped","_weapon","_type","_attachments","_currWeap","_found","_contentArray","_plyrGroup","_response","_reject","_fnc_addItemToX","_worldspace","_prevInstance","_medical","_server_vars","_hitpoints","_deadPlayer","_alreadyDead","_newPlyr","_plyrUID","_serverSettingsConfig","_plyr","_instanceID","_plyrNetID"];
_reject = true;
+_fnc_addItemToX = {
+ private ["_itemSlot","_itemqtys","_newPlyr"];
+ _newPlyr = _this select 0;
+ {
+ _itemSlot = _forEachIndex;
+ _itemqtys = _x select 1;
+ {
+ for "_i" from 1 to (_itemqtys select _forEachIndex) do {
+ switch _itemSlot do {
+ case 0: { _newPlyr addItemToUniform _x };
+ case 1: { _newPlyr addItemToVest _x };
+ case 2: { _newPlyr addItemToBackpack _x };
+ };
+ };
+ } forEach(_x select 0);
+ } forEach (_this select 1);
+};
+
if (typename _this == "ARRAY") then {
+ // load server settings
+ _serverSettingsConfig = configFile >> "CfgEpochServer";
+
_plyr = _this select 0;
_instanceID = call EPOCH_fn_InstanceID;
@@ -26,31 +47,43 @@ if (typename _this == "ARRAY") then {
if ((_response select 0) == 1 && typeName(_response select 1) == "ARRAY") then {
_arr = (_response select 1);
};
- _defaultUniform = "U_Test_uniform";
+
+ // Apperance defaults
+ _uniform = [_serverSettingsConfig, "defaultUniformFemale", "U_Test_uniform"] call EPOCH_fnc_returnConfigEntry;
_class = "Epoch_Female_F";
- _vest = "V_F41_EPOCH";
+ _vest = [_serverSettingsConfig, "defaultVestFemale", "V_F41_EPOCH"] call EPOCH_fnc_returnConfigEntry;
if (_this select 1) then { //true == male
- _defaultUniform = "U_Test1_uniform";
+ _uniform = [_serverSettingsConfig, "defaultUniformMale", "U_Test1_uniform"] call EPOCH_fnc_returnConfigEntry;
_class = "Epoch_Male_F";
- _vest = "V_41_EPOCH";
+ _vest = [_serverSettingsConfig, "defaultVestMale", "V_41_EPOCH"] call EPOCH_fnc_returnConfigEntry;
};
+ _goggles = [_serverSettingsConfig, "defaultGoggles", ""] call EPOCH_fnc_returnConfigEntry;
+ _headgear = [_serverSettingsConfig, "defaultHeadgear", ""] call EPOCH_fnc_returnConfigEntry;
+ _backpack = [_serverSettingsConfig, "defaultBackpack", ""] call EPOCH_fnc_returnConfigEntry;
+
+ // Inventory defaults
+ _linkedItems = [_serverSettingsConfig, "linkedItems", ["ItemMap","EpochRadio0"]] call EPOCH_fnc_returnConfigEntry;
+ _itemsInContainers = [_serverSettingsConfig, "itemsInContainers", []] call EPOCH_fnc_returnConfigEntry;
+ _weaponsInContainers = [_serverSettingsConfig, "weaponsInContainers", []] call EPOCH_fnc_returnConfigEntry;
+ _normalMagazines = [_serverSettingsConfig, "normalMagazines", []] call EPOCH_fnc_returnConfigEntry;
+ _weaponsAndItems = [_serverSettingsConfig, "weaponsAndItems", ["", []]] call EPOCH_fnc_returnConfigEntry;
+
+ diag_log format["DEBUG (Load Player) _linkedItems 1: %1", _linkedItems];
if (count _arr < 11) then { // invaild format attempt to override
- _arr = [[0, [], _instanceID], [0, 0, 1, 0, []], ["", "", _vest, "", _defaultUniform, _class], [""], [] + EPOCH_defaultVars_SEPXVar, ["", []], ["ItemMap"], [], [], [], "", true];
+ _arr = [[0, [], _instanceID], [0, 0, 1, 0, []], [_goggles, _headgear, _vest, _backpack, _uniform, _class], [""], [] + EPOCH_defaultVars_SEPXVar, _weaponsAndItems, _linkedItems, _normalMagazines, _itemsInContainers, _weaponsInContainers, "", true];
};
_worldspace = _arr select 0;
_dir = _worldspace select 0;
_location = _worldspace select 1;
_prevInstance = _worldspace select 2;
-
_medical = _arr select 1;
+ _server_vars = _arr select 3;
+ _vars = _arr select 4;
_plyrGroup = _arr select 10;
_canBeRevived = _arr select 11;
-
- _server_vars = _arr select 3;
- _vars = _arr select 4;
_hitpoints = _vars select 11;
@@ -76,12 +109,13 @@ if (typename _this == "ARRAY") then {
};
} forEach allUnits;
+ // find existing group
if (_plyrGroup != "") then {
- {
- if ((_x getVariable["GROUP", ""]) == _plyrGroup) exitWith{
- _group = group _x;
- };
- } forEach playableUnits;
+ {
+ if ((_x getVariable["GROUP", ""]) == _plyrGroup) exitWith{
+ _group = group _x;
+ };
+ } forEach playableUnits;
};
if (isNull _group) then {
@@ -117,63 +151,64 @@ if (typename _this == "ARRAY") then {
_backpack = _apperance select 3;
_uniform = _apperance select 4;
- if (_uniform != "") then {
- _newPlyr addUniform _uniform;
- };
- if (_backpack != "") then {
- _newPlyr addBackpack _backpack;
- };
- if (_goggles != "") then {
- _newPlyr addGoggles _goggles;
- };
- if (_headgear != "") then {
- _newPlyr addHeadgear _headgear;
- };
- if (_vest != "") then {
- _newPlyr addVest _vest;
- };
-
// Weapons
_weaponsAndItems = _arr select 5;
- if (count _weaponsAndItems >= 2) then {
-
- _equipped = _weaponsAndItems select 2;
- {
- _weapon = _x deleteAt 0;
- _type = getNumber(configfile >> "cfgweapons" >> _weapon >> "type");
-
- _attachments = [];
- _wMags = false;
- _wMagsArray = [];
- // suppressor, laser, optics, magazines(array), bipods
- {
- // magazines
- if (typeName(_x) == "ARRAY") then{
- _wMags = true;
- _wMagsArray = _x;
- }
- else {
- // attachments
- if (_x != "") then{
- _attachments pushBack _x;
- };
- };
- } forEach _x;
-
- // add weapon if equiped
- if (_weapon in _equipped) then {
-
- _equipped = _equipped - [_weapon];
+ _linkedItems = _arr select 6;
+ _normalMagazines = _arr select 7;
+ _itemsInContainers = _arr select 8;
+ _weaponsInContainers = _arr select 9;
+ };
- if (_wMags) then {
- _newPlyr addMagazine _wMagsArray;
- };
+ // Load Apperance START
+ if (_uniform != "") then {
+ _newPlyr addUniform _uniform;
+ };
+ if (_backpack != "") then {
+ _newPlyr addBackpack _backpack;
+ };
+ if (_goggles != "") then {
+ _newPlyr addGoggles _goggles;
+ };
+ if (_headgear != "") then {
+ _newPlyr addHeadgear _headgear;
+ };
+ if (_vest != "") then {
+ _newPlyr addVest _vest;
+ };
+ // Load Apperance END
- if (_weapon != "") then {
- _newPlyr addWeapon _weapon;
+ // Load inventory + defaults START
+ if (count _weaponsAndItems >= 2) then {
+ _equipped = _weaponsAndItems select 2;
+ {
+ _weapon = _x deleteAt 0;
+ _type = getNumber(configfile >> "cfgweapons" >> _weapon >> "type");
+ _attachments = [];
+ _wMags = false;
+ _wMagsArray = [];
+ // suppressor, laser, optics, magazines(array), bipods
+ {
+ // magazines
+ if (typeName(_x) == "ARRAY") then{
+ _wMags = true;
+ _wMagsArray = _x;
+ } else {
+ // attachments
+ if (_x != "") then{
+ _attachments pushBack _x;
};
-
- switch _type do {
+ };
+ } forEach _x;
+ // add weapon if equiped
+ if (_weapon in _equipped) then {
+ _equipped = _equipped - [_weapon];
+ if (_wMags) then {
+ _newPlyr addMagazine _wMagsArray;
+ };
+ if (_weapon != "") then {
+ _newPlyr addWeapon _weapon;
+ };
+ switch _type do {
case 1: { // primary
removeAllPrimaryWeaponItems _newPlyr;
{ _newPlyr addPrimaryWeaponItem _x } forEach _attachments;
@@ -187,69 +222,41 @@ if (typename _this == "ARRAY") then {
{
_newPlyr removeSecondaryWeaponItem _x;
} forEach (secondaryWeaponItems _newPlyr);
+
{ _newPlyr addSecondaryWeaponItem _x } forEach _attachments;
};
- };
- }
- else { // overflow need to add these items to storage
- {
- _newPlyr addItem _x;
- } forEach _attachments;
-
- if (_wMags) then {
- _newPlyr addMagazine _wMagsArray;
- };
};
- } forEach(_weaponsAndItems select 1);
-
- _currWeap = _weaponsAndItems select 0;
- };
-
- // Linked items
- {
- if (_x in["Binocular", "Rangefinder"]) then {
- _newPlyr addWeapon _x;
- }
- else {
- _newPlyr linkItem _x;
+ } else {
+ // overflow need to add these items to storage
+ {
+ _newPlyr addItem _x;
+ } forEach _attachments;
+ if (_wMags) then {
+ _newPlyr addMagazine _wMagsArray;
+ };
};
- } forEach(_arr select 6);
+ } forEach(_weaponsAndItems select 1);
+ _currWeap = _weaponsAndItems select 0;
+ };
+ // Linked items
+ {
+ if (_x in["Binocular", "Rangefinder"]) then {
+ _newPlyr addWeapon _x;
+ } else {
+ _newPlyr linkItem _x;
+ };
+ } forEach _linkedItems;
+ diag_log format["DEBUG (Load Player) _linkedItems: %1", _linkedItems];
- // add items to containers
- {
- _itemSlot = _forEachIndex;
- _itemqtys = _x select 1;
- {
- for "_i" from 1 to(_itemqtys select _forEachIndex) do {
- switch _itemSlot do {
- case 0: { _newPlyr addItemToUniform _x };
- case 1: { _newPlyr addItemToVest _x };
- case 2: { _newPlyr addItemToBackpack _x };
- };
- };
- } forEach(_x select 0);
- } forEach(_arr select 8);
+ // add items to containers
+ [_newPlyr, _itemsInContainers] call _fnc_addItemToX;
- // add weapons to containers
- {
- _itemSlot = _forEachIndex;
- _itemqtys = _x select 1;
- {
- for "_i" from 1 to(_itemqtys select _forEachIndex) do {
- switch _itemSlot do {
- case 0: { _newPlyr addItemToUniform _x };
- case 1: { _newPlyr addItemToVest _x };
- case 2: { _newPlyr addItemToBackpack _x };
- };
- };
- } forEach(_x select 0);
- } forEach(_arr select 9);
+ // add weapons to containers
+ [_newPlyr, _weaponsInContainers] call _fnc_addItemToX;
- // Add magazines
- {
- _newPlyr addMagazine _x;
- } forEach(_arr select 7);
- };
+ // Add magazines
+ {_newPlyr addMagazine _x} forEach _normalMagazines;
+ // Load inventory + defaults END
// Final Push
if (isNull _plyr) then {
@@ -292,9 +299,6 @@ if (typename _this == "ARRAY") then {
};
diag_log format["DEBUG (Load Player) Set Group: %1", _plyrGroup];
};
-
- // may not be needed, just here to see if we can force the data to sync quicker
- // _plyr setPosATL _location;
_newPlyr setVariable["SETUP", true];
_newPlyr setVariable["PUID", _plyrUID];
diff --git a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf
index ef5ca42ef..9ddee61c2 100644
--- a/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf
+++ b/Sources/epoch_server/compile/epoch_traders/EPOCH_server_loadTraders.sqf
@@ -93,6 +93,7 @@ for "_i" from 0 to _this do {
if (_arr isEqualTo [[], []]) then{
_arr = EPOCH_starterTraderItems;
+ ["AI_ITEMS", _objHiveKey, EPOCH_expiresAIdata, _arr] call EPOCH_fnc_server_hiveSETEX;
};
_agent setVariable ["AI_ITEMS", _arr, true];
@@ -162,8 +163,46 @@ for "_i" from 0 to _this do {
_arr = (_response select 1);
if (_arr isEqualTo []) then {
- _arr = [[],[]];
+ _arr = [[], []];
};
+
+ _toBeRemoved = [];
+ // count vehicles
+ {
+ _limit = ["CfgTraderLimits", _x, 100] call EPOCH_fnc_returnConfigEntryV2;
+ _currentStock = (_arr select 1) param[_forEachIndex, 0];
+ if (_limit == 0) then {
+ // mark for removal since limit is 0
+ _toBeRemoved pushBack _forEachIndex;
+ _currentStock = 0;
+ } else {
+ // lower to limit current qty is over limit
+ if (_currentStock > _limit) then {
+ (_arr select 1) set [_forEachIndex,_limit];
+ _currentStock = _limit;
+ };
+ };
+ if (_x isKindOf "Air" || _x isKindOf "Ship" || _x isKindOf "LandVehicle" || _x isKindOf "Tank") then {
+ if (EPOCH_storedVehicleCount <= _storedVehicleLimit) then {
+ EPOCH_storedVehicleCount = EPOCH_storedVehicleCount + _currentStock;
+ } else {
+ _toBeRemoved pushBack _forEachIndex;
+ };
+
+ };
+ } forEach (_arr select 0);
+
+ // remove any marked for removal
+ {
+ (_arr select 0) deleteAt _x;
+ (_arr select 1) deleteAt _x
+ } forEach _toBeRemoved;
+
+ if (_arr isEqualTo [[], []]) then{
+ _arr = EPOCH_starterTraderItems;
+ ["AI_ITEMS", _objHiveKey, EPOCH_expiresAIdata, _arr] call EPOCH_fnc_server_hiveSETEX;
+ };
+
};
_agent setVariable ["AI_ITEMS", _arr, true];
diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf
index 787d16742..b920a5ee1 100644
--- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf
+++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_storage.sqf
@@ -23,10 +23,16 @@ for "_i" from 1 to _this do {
EPOCH_StorageSlots deleteAt _storageSlotIndex;
- _class = _arr select 0;
+ _class_raw = _arr select 0;
_damage = _arr select 2;
_inventory = _arr select 3;
+ _class = switch (_class_raw) do {
+ case "LockBoxProxy_EPOCH": { "LockBox_EPOCH" };
+ case "SafeProxy_EPOCH": { "Safe_EPOCH" };
+ default { _class_raw };
+ };
+
if (typeName(_inventory) != "ARRAY") then { _inventory = []; };
_worldspace = _arr select 1;
@@ -47,7 +53,6 @@ for "_i" from 1 to _this do {
_location = (_location select 0) vectorAdd(_location select 1);
};
-
// set to ground if only x,y
if (count _location == 2) then {
_location set [2, 0];
@@ -60,25 +65,6 @@ for "_i" from 1 to _this do {
_vehicle = createVehicle[_class, _location, [], 0, "CAN_COLLIDE"];
- // if proxy create visable safe
- if (_class isKindOf "Secure_Storage_Proxy") then {
- _dummyClass = getText(configFile >> "CfgVehicles" >> _class >> "parentClass");
- _dummyVehicle = createVehicle [_dummyClass, _location, [], 0, "CAN_COLLIDE"];
-
- if (typeName _dir == "ARRAY") then {
- _dummyVehicle setVectorDirAndUp _dir;
- } else {
- _dummyVehicle setDir _dir;
- };
-
- _dummyVehicle setposATL _location;
-
- // used on save to get ref to storage object
- _dummyVehicle setVariable ["EPOCH_secStorParent", _vehicle];
- // used on save to get loction of dummy object
- _vehicle setVariable["EPOCH_secStorChild",_dummyVehicle];
- };
-
if (typeName _dir == "ARRAY") then {
_vehicle setVectorDirAndUp _dir;
} else {
@@ -119,12 +105,9 @@ for "_i" from 1 to _this do {
if (count _arr >= 6) then {
_vehicle setVariable ["STORAGE_OWNERS", _arr select 5];
- if (_class isKindOf 'Secure_Storage_Proxy') then{
-
- // TODO: could be used to unlock safe?
+ if (_class isKindOf 'Constructions_lockedstatic_F') then{
+ // set locked state of secure storage
if ((_arr select 6) != -1) then {
- _location set [2, -10];
- _vehicle setPosATL _location;
_vehicle setVariable["EPOCH_Locked", true, true];
};
};
@@ -240,6 +223,6 @@ for "_i" from 1 to _this do {
EPOCH_StorageSlotsCount = count EPOCH_StorageSlots;
publicVariable "EPOCH_StorageSlotsCount";
-diag_log format ["Storage SPAWN TIMER %1", diag_tickTime - _diag];
+diag_log format ["Storage SPAWN TIMER: %1 slots left: %2", diag_tickTime - _diag, EPOCH_StorageSlotsCount];
true
diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf
index 9161472bf..859a7467a 100644
--- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf
+++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf
@@ -55,7 +55,7 @@ for "_i" from 1 to _this do {
_vehicle call EPOCH_server_setVToken;
_vehicle setposATL _location;
-
+
_vehicle setVectorDirAndUp _worldspace;
_vehicle setDamage _damage;
@@ -248,6 +248,6 @@ if (_immuneVehicleSpawn) then{
addToRemainsCollector _allVehicles;
-diag_log format ["VEH SPAWN TIMER %1, LOADED 2% VEHICLES", diag_tickTime - _diag, count _allVehicles];
+diag_log format ["VEH SPAWN TIMER %1, LOADED %2 VEHICLES", diag_tickTime - _diag, count _allVehicles];
true
diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_killedBuilding.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_killedBuilding.sqf
index aa8728898..50ff34c1f 100644
--- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_killedBuilding.sqf
+++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_killedBuilding.sqf
@@ -7,6 +7,13 @@ if (!isNull _building) then {
_vehSlot = _building getVariable["BUILD_SLOT", -1];
if (_vehSlot != -1) then {
+
+ // Set off trap object
+ _ammoObj = _building getVariable ["EPOCH_TRAP_OBJ",objNull];
+ if !(isNull _ammoObj) then {
+ _ammoObj setDamage 1;
+ };
+
_vehHiveKey = format ["%1:%2", (call EPOCH_fn_InstanceID), _vehSlot];
["Building", _vehHiveKey, []] call EPOCH_fnc_server_hiveSET;
EPOCH_BuildingSlots set [_vehSlot, 0];
diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_storage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_storage.sqf
index 67bb62e57..840ae859d 100644
--- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_storage.sqf
+++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_save_storage.sqf
@@ -54,13 +54,6 @@ if (!isNull _this) then {
_locked = if (_vehicle getVariable["EPOCH_Locked", true]) then {1} else {-1};
- // get position of dummy safe instead of proxy position
- _storageChild = _vehicle getVariable["EPOCH_secStorChild",objNull];
- if !(isNull _storageChild) then {
- _vehiclePos = getposATL _storageChild;
- _vehicle = _storageChild;
- };
-
_worldspace = [(_vehiclePos call EPOCH_precisionPos), vectordir _vehicle, vectorup _vehicle];
_VAL = [_class, _worldspace, _damage, _inventory, _colorSlot, _storageOwners, _locked];
diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf
index 6ace542ad..7b5f5ae06 100644
--- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf
+++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_lockStorage.sqf
@@ -14,29 +14,20 @@ _plyrGroup = _plyr getVariable ["GROUP",""];
// functions
_fnc_lock = {
_this setVariable ["EPOCH_Locked", true, true];
- _currentPos = getPosATL _this;
- _currentPos set[2, -10];
- _this setPosATL _currentPos;
// force save on lock
if !(_this in EPOCH_saveStorQueue) then { EPOCH_saveStorQueue pushBack _this };
};
_fnc_unlock = {
- _weaponHolder = _this getVariable["EPOCH_secStorParent", objNull];
- diag_log format["DEBUG: Unlock _weaponHolder %1", _weaponHolder];
- if (!isNull _weaponHolder) then {
- _weaponHolder setVariable ["EPOCH_Locked", false, true];
- _weaponHolder setPosATL (getPosATL _this);
- };
+ _this setVariable ["EPOCH_Locked", false, true];
};
// functions
if (getNumber(configFile >> "CfgVehicles" >> _type >> "isSecureStorage") == 1) then{
- // direct ref to proxy
- if (_type isKindOf "Secure_Storage_Proxy") then {
+ _owners = _unit getVariable["STORAGE_OWNERS", []];
- _owners = _unit getVariable["STORAGE_OWNERS", []];
- //diag_log format["_owners2 %1", _owners];
+ // locked > unlocked
+ if !(_unit getVariable ["EPOCH_Locked", true]) then {
// allow group members and owner access
if (_plyrGroup != "") then {
@@ -63,43 +54,30 @@ if (getNumber(configFile >> "CfgVehicles" >> _type >> "isSecureStorage") == 1) t
};
};
-
- // ref Dummy obj
+ // unlocked > locked
} else {
- _weaponHolder = _unit getVariable["EPOCH_secStorParent", objNull];
- //diag_log format["DEBUG: SecStor _weaponHolder %1", _weaponHolder];
-
- if (!isNull _weaponHolder) then {
- _owners = _weaponHolder getVariable["STORAGE_OWNERS", []];
- //diag_log format["_owners %1", _owners];
-
- // allow group members and owner access
- if (_plyrGroup != "") then {
- if (_plyrGroup in _owners) then {
- _unit call _fnc_unlock;
- } else {
- _response = ["Group", _plyrGroup] call EPOCH_fnc_server_hiveGETRANGE;
- if ((_response select 0) == 1 && typeName(_response select 1) == "ARRAY") then {
- _gArray = _response select 1;
- if (
- {(_x select 0) in _owners }count(_gArray select 3) > 0 ||
- {(_x select 0) in _owners}count(_gArray select 4) > 0 ||
- _plyrUID in _owners
- ) then {
- _unit call _fnc_unlock;
- };
- };
- };
+ // allow group members and owner access
+ if (_plyrGroup != "") then {
+ if (_plyrGroup in _owners) then {
+ _unit call _fnc_unlock;
} else {
- if (_plyrUID in _owners) then {
- _unit call _fnc_unlock;
+ _response = ["Group", _plyrGroup] call EPOCH_fnc_server_hiveGETRANGE;
+ if ((_response select 0) == 1 && typeName(_response select 1) == "ARRAY") then {
+ _gArray = _response select 1;
+ if (
+ {(_x select 0) in _owners }count(_gArray select 3) > 0 ||
+ {(_x select 0) in _owners}count(_gArray select 4) > 0 ||
+ _plyrUID in _owners
+ ) then {
+ _unit call _fnc_unlock;
+ };
};
};
+ } else {
+ if (_plyrUID in _owners) then {
+ _unit call _fnc_unlock;
+ };
};
-
-
-
};
-
};
diff --git a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_packStorage.sqf b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_packStorage.sqf
index 6d44f5bdf..d6d8042d9 100644
--- a/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_packStorage.sqf
+++ b/Sources/epoch_server/compile/epoch_vehicle/EPOCH_server_packStorage.sqf
@@ -6,129 +6,121 @@ if (isNull _unit) exitWith{};
if (_plyr distance _unit > 20) exitWith{};
_class = typeOf _unit;
-if (_class isKindOf 'Constructions_lockedstatic_F') then{
+if (_class isKindOf 'Constructions_lockedstatic_F') then {
- _weaponHolder = _unit getVariable["EPOCH_secStorParent", objNull];
- //diag_log format["DEBUG: Pack _weaponHolder %1", _weaponHolder];
+ _owners = _unit getVariable["STORAGE_OWNERS", []];
+ if ((getPlayerUID _plyr) in _owners) then {
- if (!isNull _weaponHolder) then {
- _owners = _weaponHolder getVariable["STORAGE_OWNERS", []];
- if ((getPlayerUID _plyr) in _owners) then {
+ _posWH = getPosATL _unit;
- _posWH = getPosATL _unit;
- [_unit, _plyr] call EPOCH_server_save_killedBuilding;
- deleteVehicle _unit;
-
- // may not be needed but should prevent in DB.
- _wepsItemsCargo = weaponsItemsCargo _weaponHolder;
- if (isNil "_wepsItemsCargo") then {
- _wepsItemsCargo = [];
- };
- _magsAmmoCargo = magazinesAmmoCargo _weaponHolder;
- if (isNil "_magsAmmoCargo") then {
- _magsAmmoCargo = [];
- };
+ // may not be needed but should prevent in DB.
+ _wepsItemsCargo = weaponsItemsCargo _unit;
+ if (isNil "_wepsItemsCargo") then {
+ _wepsItemsCargo = [];
+ };
+ _magsAmmoCargo = magazinesAmmoCargo _unit;
+ if (isNil "_magsAmmoCargo") then {
+ _magsAmmoCargo = [];
+ };
- // dump items on ground
- _inventory = [
- _wepsItemsCargo,
- _magsAmmoCargo,
- getBackpackCargo _weaponHolder,
- getItemCargo _weaponHolder
- ];
+ // dump items on ground
+ _inventory = [
+ _wepsItemsCargo,
+ _magsAmmoCargo,
+ getBackpackCargo _unit,
+ getItemCargo _unit
+ ];
+ [_unit, _plyr] call EPOCH_server_save_killedStorage;
+ deleteVehicle _unit;
- [_weaponHolder, _plyr] call EPOCH_server_save_killedStorage;
- deleteVehicle _weaponHolder;
+ _gwh = createVehicle["groundWeaponHolder", _posWH, [], 0, "CAN_COLLIDE"];
+ _gwh setPosATL _posWH;
- _gwh = createVehicle["groundWeaponHolder", _posWH, [], 0, "CAN_COLLIDE"];
- _gwh setPosATL _posWH;
+ _returnItems = getArray(configFile >> "CfgVehicles" >> _class >> "returnOnPack");
+ {
+ _gwh addMagazineCargoGlobal _x;
+ } forEach _returnItems;
- _returnItems = getArray(configFile >> "CfgVehicles" >> _class >> "returnOnPack");
- {
- _gwh addMagazineCargoGlobal _x;
- } forEach _returnItems;
+ {
+ _objType = _forEachIndex;
- {
- _objType = _forEachIndex;
+ _objTypes = _x;
+ _objQty = [];
- _objTypes = _x;
- _objQty = [];
-
- if (_objType in[2, 3]) then {
- _objTypes = _x select 0;
- _objQty = _x select 1;
- };
+ if (_objType in[2, 3]) then {
+ _objTypes = _x select 0;
+ _objQty = _x select 1;
+ };
- {
- switch _objType do {
- case 0: {
- if (typeName _x == "ARRAY") then {
- _arrCount = count _x;
- if (_arrCount >= 4) then {
-
- _gwh addWeaponCargoGlobal[_x deleteAt 0, 1];
-
- _attachments = [];
- _wMags = false;
- _wMagsArray = [];
- // suppressor, laser, optics, magazines(array), bipods
- {
- // magazines
- if (typeName(_x) == "ARRAY") then{
- _wMags = true;
- _wMagsArray = _x;
- }
- else {
- // attachments
- if (_x != "") then{
- _attachments pushBack _x;
- };
+ {
+ switch _objType do {
+ case 0: {
+ if (typeName _x == "ARRAY") then {
+ _arrCount = count _x;
+ if (_arrCount >= 4) then {
+
+ _gwh addWeaponCargoGlobal[_x deleteAt 0, 1];
+
+ _attachments = [];
+ _wMags = false;
+ _wMagsArray = [];
+ // suppressor, laser, optics, magazines(array), bipods
+ {
+ // magazines
+ if (typeName(_x) == "ARRAY") then{
+ _wMags = true;
+ _wMagsArray = _x;
+ }
+ else {
+ // attachments
+ if (_x != "") then{
+ _attachments pushBack _x;
};
- } forEach _x;
+ };
+ } forEach _x;
- // add all attachments to vehicle
- // TODO replace with adding attachments directly to gun (Arma feature dependant)
- {
- _gwh addItemCargoGlobal[_x, 1];
- } forEach _attachments;
+ // add all attachments to vehicle
+ // TODO replace with adding attachments directly to gun (Arma feature dependant)
+ {
+ _gwh addItemCargoGlobal[_x, 1];
+ } forEach _attachments;
- if (_wMags) then{
- if (typeName _wMagsArray == "ARRAY" && (count _wMagsArray) >= 2) then{
- _gwh addMagazineAmmoCargo[_wMagsArray select 0, 1, _wMagsArray select 1];
- };
+ if (_wMags) then{
+ if (typeName _wMagsArray == "ARRAY" && (count _wMagsArray) >= 2) then{
+ _gwh addMagazineAmmoCargo[_wMagsArray select 0, 1, _wMagsArray select 1];
};
-
};
+
};
};
- case 1: {
- if (typeName _x == "ARRAY") then {
- if ((count _x) == 2) then {
- _magazineName = _x select 0;
- _magazineSize = _x select 1;
-
- if ((typeName _magazineName == "STRING") && (typeName _magazineSize == "SCALAR")) then {
- _gwh addMagazineAmmoCargo[_magazineName, 1, _magazineSize];
- };
+ };
+ case 1: {
+ if (typeName _x == "ARRAY") then {
+ if ((count _x) == 2) then {
+ _magazineName = _x select 0;
+ _magazineSize = _x select 1;
+
+ if ((typeName _magazineName == "STRING") && (typeName _magazineSize == "SCALAR")) then {
+ _gwh addMagazineAmmoCargo[_magazineName, 1, _magazineSize];
};
};
};
- case 2: {
- if (typeName _x == "STRING") then {
- _qty = _objQty select _forEachIndex;
- _gwh addBackpackCargoGlobal[_x, _qty];
- };
- };
- case 3: {
- if (typeName _x == "STRING") then {
- _qty = _objQty select _forEachIndex;
- _gwh addItemCargoGlobal[_x, _qty];
- };
+ };
+ case 2: {
+ if (typeName _x == "STRING") then {
+ _qty = _objQty select _forEachIndex;
+ _gwh addBackpackCargoGlobal[_x, _qty];
};
+ };
+ case 3: {
+ if (typeName _x == "STRING") then {
+ _qty = _objQty select _forEachIndex;
+ _gwh addItemCargoGlobal[_x, _qty];
};
- }forEach _objTypes;
- }forEach _inventory;
- };
+ };
+ };
+ }forEach _objTypes;
+ }forEach _inventory;
};
};
diff --git a/Sources/epoch_server/config.cpp b/Sources/epoch_server/config.cpp
index 98b3fd74e..c4bc8c4dc 100644
--- a/Sources/epoch_server/config.cpp
+++ b/Sources/epoch_server/config.cpp
@@ -44,7 +44,7 @@ class cfgFunctions
};
class CfgServerVersion
{
- client = "0.3.4.0";
- config = "0.3.4.0";
+ client = "0.3.5.0";
+ config = "0.3.5.0";
hive = "0.5.1.7";
};
diff --git a/Sources/epoch_server/init/server_compiles.sqf b/Sources/epoch_server/init/server_compiles.sqf
index e4abeb2e5..c5b4926f9 100644
--- a/Sources/epoch_server/init/server_compiles.sqf
+++ b/Sources/epoch_server/init/server_compiles.sqf
@@ -58,7 +58,7 @@ EPOCH_server_vehicleInit = compileFinal preprocessFileLineNumbers "\x\ad
EPOCH_server_storageInit = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_server_storageInit.sqf";
EPOCH_server_buildingInit = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_server_buildingInit.sqf";
EPOCH_server_traderKilled = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_server_traderKilled.sqf";
-EPOCH_server_setWeather = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_server_setWeather.sqf";
+// EPOCH_server_setWeather = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_server_setWeather.sqf";
EPOCH_localCleanup = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_localCleanup.sqf";
EPOCH_server_createTeleport = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_server_createTeleport.sqf";
EPOCH_server_teleportPlayer = compileFinal preprocessFileLineNumbers "\x\addons\a3_epoch_server\compile\epoch_server\EPOCH_server_teleportPlayer.sqf";
diff --git a/Sources/epoch_server/init/server_init.sqf b/Sources/epoch_server/init/server_init.sqf
index 437c910fe..5598498a3 100644
--- a/Sources/epoch_server/init/server_init.sqf
+++ b/Sources/epoch_server/init/server_init.sqf
@@ -92,8 +92,8 @@ if (epoch_centerMarkerPosition isEqualTo [0,0,0]) then {
};
EPOCH_dynamicVehicleArea = _worldSize / 2;
-diag_log "Epoch: Set Weather";
-true call EPOCH_server_setWeather;
+// diag_log "Epoch: Set Weather";
+// true call EPOCH_server_setWeather;
// custom radio channels
EPOCH_customChannels = [];
diff --git a/Sources/epoch_server/init/server_securityfunctions.sqf b/Sources/epoch_server/init/server_securityfunctions.sqf
index 3e4a4553d..8464fd619 100644
--- a/Sources/epoch_server/init/server_securityfunctions.sqf
+++ b/Sources/epoch_server/init/server_securityfunctions.sqf
@@ -37,7 +37,7 @@ _skn_nilVarCheckArray = [_cfg_variablesConfig, "nilVars", ['EPOCH_antiWallCount'
_skn_commandMenuArray = [(_config >> "commandMenu"), "menus",['','RscSelectTeam','RscTeam','RscMoveHigh','#GETIN','#RscStatus','#WATCH0','RscCombatMode','RscMenuReply','RscCallSupport','#CUSTOM_RADIO','#User:BIS_fnc_addCommMenuItem_menu','RscRadio','RscReply','#ACTION','RscMenuFormations','#WATCH','RscGroupRootMenu','RscMainMenu','RscMenuMove','RscWatchDir','RscWatchMoveDir','#User:BIS_Menu_GroupCommunication','RscMenuStatus','RscFormations']] call EPOCH_fnc_returnConfigEntry;
_skn_displayAddEHKeyDown = [(_config >> "displayAddEventHandler"), "keyDown",'_this call EPOCH_KeyDown'] call EPOCH_fnc_returnConfigEntry;
-_skn_displayAddEHKeyUp = [(_config >> "displayAddEventHandler"), "keyUp",''] call EPOCH_fnc_returnConfigEntry;
+_skn_displayAddEHKeyUp = [(_config >> "displayAddEventHandler"), "keyUp",'_this call EPOCH_KeyUp'] call EPOCH_fnc_returnConfigEntry;
_skn_addEHConfig = (_config >> "addEventHandler");
_skn_displayAddEHChecks = [_skn_addEHConfig, "checks",[]] call EPOCH_fnc_returnConfigEntry;
@@ -137,7 +137,7 @@ switch (_this select 0) do {
case 'message': { 'epochserver' callExtension format['901|%1', _this select 1] };
case 'lock': { 'epochserver' callExtension '931' };
case 'unlock': { 'epochserver' callExtension '930' };
- case 'kick': {
+ case 'kick': {
_playerUID = _this select 1;
if (typeName _playerUID == 'OBJECT') then{
if (!isNull(_playerUID)) then{
@@ -175,7 +175,7 @@ if (!_skn_enableAntihack) exitWith {
EPOCH_server_kickToLobby = compileFinal("true");
};
-// Check AH init code
+// Check AH init code
_skn_AH_rndVarAHInitCheck = _skn_rndVA deleteAt 0;
// Init as array
call compile(_skn_AH_rndVarAHInitCheck+"=[];");
@@ -298,7 +298,7 @@ EPOCH_server_disconnect = compileFinal("
" +_skn_AH_rndVarAHInitCheck + " deleteAt _index;
_ret = true;
};
- _ret
+ _ret
");
_stringInArray = {
@@ -381,7 +381,7 @@ _case = _skn_adminMenuOwnerSetting; //All Cfg for Owner Menu
for "_i" from 1 to 3 do {
_temp = "[['=============== MAIN MENU ===============',[],'','1',[]]";
if (["PLAYER-TELEPORT","MAP-TELEPORT","INFRONT-TELEPORT"] call _stringInArray) then {
-
+
if ("PLAYER-TELEPORT" in _case) then {
_temp = _temp + "
,[' Player To Admin',[],{[101,_this select 1] call "+_skn_adminRequest_PVC+"},'4',[]]
@@ -467,7 +467,7 @@ for "_i" from 1 to 3 do {
_temp = _temp + ",['Old Visualisation Tools', [],'','1',[]]";
if ("OLD-ESP" in _case) then {
_temp = _temp + ",[' 3D ESP', [], "+_skn_old_esp+", '2', []]";
- };
+ };
if ("OLD-MAP" in _case) then {
_temp = _temp + ",[' MAP ESP', [], "+_skn_old_espMap+", '2', []]";
};
@@ -658,7 +658,7 @@ call compile ("'"+_skn_doKickBan+"' addPublicVariableEventHandler {
_trusted = "+_str_learningModeCheck+";
if !(_unknownVar in _safeVars) then{
if (_trusted) then {
-
+
_safeVars pushBack _unknownVar;
missionNamespace setVariable ["+str _skn_whitelistVars+",_safeVars];
publicVariable "+str _skn_whitelistVars+";
@@ -804,18 +804,12 @@ _skn_code_antihack = compileFinal ("
if !(commandingMenu in "+str _skn_commandMenuArray+") then {
[format['Menu: commandMenu: %1',commandingMenu],0] call "+_sknBanANDSleep+";
};
-
+
onMapSingleClick '';
player allowDamage true;
vehicle player allowDamage true;
onEachFrame EPOCH_onEachFrame;
- _addCase = addMissionEventHandler ['Draw3D', {}];
- removeMissionEventHandler ['Draw3D',0];
- if (_addCase > 0) then {
- [format['MEH: Draw3D %1',_addCase],0] call "+_sknBanANDSleep+";
- };
-
{
_ehKey = _x select 0;
if (_x select 2) then {
@@ -831,7 +825,7 @@ _skn_code_antihack = compileFinal ("
[format['EH: %1 %2',_ehKey,_addCase],0] call "+_sknBanANDSleep+";
};
} forEach "+str _skn_addEHArray+";
-
+
uiSleep 0.01;
};
};
@@ -845,7 +839,7 @@ _skn_code_antihack = compileFinal ("
_personalToken = Epoch_personalToken;
_antiWallCount = 0;
waitUntil{!isNull (findDisplay 46)};
- setViewDistance "+str _skn_viewDistance+";
+ setViewDistance "+str _skn_viewDistance+";
setObjectViewDistance["+str _skn_viewDistanceObects+", 100];
setTerrainGrid "+str _skn_terrainGrid+";
uiSleep 5;
@@ -950,7 +944,7 @@ _skn_code_antihack = compileFinal ("
vehicle player setPosATL _lastPos;
_cntBan = _cntBan + 1;
if (_cntBan > 4) then {
-
+
};
} else {
uiSleep 10;
@@ -1108,7 +1102,7 @@ call compile ("'"+_skn_doAdminRequest+"' addPublicVariableEventHandler {
if ((_content isKindOf 'LandVehicle') || (_content isKindOf 'Air') || (_content isKindOf 'Ship') || (_content isKindOf 'Tank')) then {
[_content, _admin] call EPOCH_server_save_killedVehicle;
} else {
- if (_content isKindOf 'Secure_Storage_Proxy' || (_content isKindOf 'Buildable_Storage')) then{
+ if (_content isKindOf 'Constructions_lockedstatic_F' || (_content isKindOf 'Buildable_Storage')) then{
[_content, _admin] call EPOCH_server_save_killedStorage;
} else {
[_content, _admin] call EPOCH_server_save_killedBuilding;
@@ -1229,7 +1223,7 @@ call compile ("'"+_skn_doAdminRequest+"' addPublicVariableEventHandler {
_vehLockHiveKey = format['%1:%2', (call EPOCH_fn_InstanceID), _slot];
['VehicleLock', _vehLockHiveKey, EPOCH_vehicleLockTime, [_lockOwner]] call EPOCH_fnc_server_hiveSETEX;
-
+
_config = (configFile >> 'CfgVehicles' >> _item >> 'availableColors');
if (isArray(_config)) then {
_textureSelectionIndex = configFile >> 'CfgVehicles' >> _item >> 'textureSelectionIndex';
@@ -1335,7 +1329,7 @@ _skn_admincode = compileFinal ("
if (isPlayer _x) then {
_display drawIcon [
getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x, name _x
- ];
+ ];
};
}forEach playableUnits;
};
@@ -1343,7 +1337,7 @@ _skn_admincode = compileFinal ("
_size = (1/ctrlMapScale _display) max 20;
{
if (!isNull _x) then {
- _color = [1,1,1,1];
+ _color = [1,1,1,1];
_display drawIcon [
getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _color, visiblePosition _x, _size, _size, getDir _x, typeOf _x
];
@@ -1353,7 +1347,7 @@ _skn_admincode = compileFinal ("
if ("+_skn_tg_map_loot+") then {
{
if (!isNull _x) then {
- _color = [1,1,1,1];
+ _color = [1,1,1,1];
_display drawRectangle [
visiblePosition _x,
5,
@@ -1368,7 +1362,7 @@ _skn_admincode = compileFinal ("
if ("+_skn_tg_map_vehicle+") then {
_size = (1/ctrlMapScale _display) max 20;
{
- if (alive _x) then {
+ if (alive _x) then {
_display drawIcon [
getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x,
getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName')
@@ -1379,7 +1373,7 @@ _skn_admincode = compileFinal ("
if ("+_skn_tg_map_ai+") then {
_size = (0.5/ctrlMapScale _display) max 20;
{
- if (isPlayer _x) then {
+ if (isPlayer _x) then {
_display drawIcon [
getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x,
getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName')
@@ -1415,7 +1409,7 @@ _skn_admincode = compileFinal ("
};
};
};
- }forEach EPOCH_ESPMAP_TARGETS;
+ }forEach EPOCH_ESPMAP_TARGETS;
};
}];
}forEach ['ESP_mainMap','ESP_adminMap'];
@@ -1669,7 +1663,7 @@ _skn_admincode = compileFinal ("
if (surfaceIsWater _pos) then [{vehicle player setPosASL _pos},{vehicle player setPosATL _pos}];
} else {
[109,_pos] call "+_skn_adminRequest_PVC+";
- };
+ };
if (!dialog) then {openMap [false, false]};
};
};
diff --git a/Sources/epoch_server/init/server_variables.sqf b/Sources/epoch_server/init/server_variables.sqf
index 3121ed3c5..cad64de76 100644
--- a/Sources/epoch_server/init/server_variables.sqf
+++ b/Sources/epoch_server/init/server_variables.sqf
@@ -45,7 +45,7 @@ _configArray = [
["B_Heli_Light_01_EPOCH", 2],
["B_SDV_01_EPOCH", 2],
["B_MRAP_01_EPOCH", 3],
- ["I_MRAP_03_EPOCH", 3],
+ ["I_MRAP_03_EPOCH", 3],
["B_Truck_01_transport_EPOCH", 1],
["B_Truck_01_covered_EPOCH", 2],
["B_Truck_01_mover_EPOCH", 1],
@@ -69,7 +69,7 @@ _configArray = [
["K04", 2],
["ebike_epoch", 7],
["mosquito_epoch", 5],
- ["C_Heli_Light_01_civil_EPOCH",5]
+ ["C_Heli_Light_01_civil_EPOCH",5]
]
],
["taxRate", 0.1],
@@ -94,13 +94,13 @@ _configArray = [
EPOCH_fnc_returnConfigEntry = {
private["_defaultData", "_config", "_varData"];
_defaultData = _this select 2;
- _config = (_this select 0) >> (_this select 1);
if (isClass(_this select 0)) then{
+ _config = (_this select 0) >> (_this select 1);
_varData = switch (typeName _defaultData) do {
- case "SCALAR": {getNumber _config};
- case "BOOL": {(getNumber _config) == 1};
- case "ARRAY": {getArray _config};
- case "STRING": {getText _config};
+ case "SCALAR": {if (isNumber (_config)) then { getNumber _config } else {_defaultData} };
+ case "BOOL": {if (isText (_config)) then { (getText _config) isEqualTo "true" } else {_defaultData} };
+ case "ARRAY": {if (isArray (_config)) then { getArray _config } else {_defaultData} };
+ case "STRING": {if (isText (_config)) then { getText _config } else {_defaultData} };
default {_defaultData};
};
} else {
diff --git a/Sources/epoch_server/system/server_monitor.fsm b/Sources/epoch_server/system/server_monitor.fsm
index 5ffa508c5..ad10f30dd 100644
--- a/Sources/epoch_server/system/server_monitor.fsm
+++ b/Sources/epoch_server/system/server_monitor.fsm
@@ -48,7 +48,7 @@ class FSM
init = /*%FSM*/"diag_log ""Loaded Server FSM"";" \n
"" \n
"_serverSettingsConfig = configFile >> ""CfgEpochServer"";" \n
- "_ahInitAuthCfg = [_serverSettingsConfig, ""antihack_ahInitAuthCfg"", [0,90]] call EPOCH_fnc_returnConfigEntry;" \n
+ "_ahInitAuthCfg = [_serverSettingsConfig, ""antihack_ahInitAuthCfg"", [0,180]] call EPOCH_fnc_returnConfigEntry;" \n
"_events = [_serverSettingsConfig, ""events"", [[3600, ""CarnivalSpawner""], [2400, ""EarthQuake""], [1800, ""ChangeWeather""], [1200, ""ContainerSpawner""], [300, ""PlantSpawner""]]] call EPOCH_fnc_returnConfigEntry;" \n
"_simulationHandler = [_serverSettingsConfig, ""simulationHandler"", false] call EPOCH_fnc_returnConfigEntry;" \n
"" \n
@@ -464,4 +464,4 @@ class FSM
{
};
};
-/*%FSM*/
\ No newline at end of file
+/*%FSM*/
diff --git a/Sources/epoch_server_core/README.md b/Sources/epoch_server_core/README.md
index 7de7a173e..69687054a 100644
--- a/Sources/epoch_server_core/README.md
+++ b/Sources/epoch_server_core/README.md
@@ -2,39 +2,21 @@
================
Arma 3 Epoch Mod
+Server Framework Core
+http://epochmod.com/
--------------------------
Developers
--------------------------
* Aaron Clark - [VB]AWOL - Game Design, Code
-* Kenneth Bente - Axle - Public Relations
-* Paul Tomany - Sequisha - Models, Textures
-* Dan - OrangeSherbet - Tester, Videos, Wiki Editor
-* Darren Harrison - Kiory - Models, Textures
-* Damian Clark - [VB]GREEN - Graphics
-* Niklas Wagner - Skaronator - Code
-* Andrew Gregory - Axeman - AI Code
* Florian Kinder - Fank - DLL Code
* Denis Erygin - devd - Linux DLL Support
-* Richie - Map Support
-* SteamPunkGears - Models
-* Raymix - UI and Code
-
---------------------------
-Install Notes
+Install Notes
---------------------------
Hive DLL requires vs2013 redist: http://www.microsoft.com/en-us/download/details.aspx?id=40784
-
----------------------------
-Tools Used
----------------------------
-Mikero's tools - https://dev-heaven.net/projects/mikero-pbodll/files
- moveobject - repath previous epoch content
- proproject
-BIS Tools
-
---------------------------
Resources
---------------------------
diff --git a/Sources/epoch_server_core/compile/epoch_hive/README.md b/Sources/epoch_server_core/compile/epoch_hive/README.md
new file mode 100644
index 000000000..bc7e3bf76
--- /dev/null
+++ b/Sources/epoch_server_core/compile/epoch_hive/README.md
@@ -0,0 +1,226 @@
+**EPOCH_fnc_server_hiveSET**
+
+Permanent storage of value with given prefix:key
+
+_Uses Hive Call: (**101, 111) or (100, 110)**_
+
+_Input: Key Prefix, Unique Key, Value_
+
+_Returns: Nothing_
+
+```
+// get reference to player and get playerUID to use as unique key
+
+_plyrUID = getPlayerUID _playerObject;
+
+// Fill your Array with data
+_VAL = [damage _playerObject];
+
+// Save value to database with given prefix:key
+["PlayerMYCustomKey", _plyrUID, _VAL] call EPOCH_server_hiveSET;
+
+```
+
+**EPOCH_fnc_server_hiveSETEX**
+
+Semi-Permanent storage of value with given prefix:key. This command is very useful at preventing long term data bloat in the database and should be used for storing data that does not need to be stored forever.
+
+_Uses Hive Call: (**101, 121) or (100, 120)**_
+
+_Input: Key Prefix, Unique Key, Expires in # seconds, Value_
+
+_Returns: Nothing_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// string (time in seconds) the key should last.
+_expires = "2592000"; // 30 days
+
+// Fill your array with data
+_VAL = [damage _playerObject];
+
+// Save value to database with given prefix:key and expiration.
+["PlayerMYCustomKey", _plyrUID, _expires, _VAL] call EPOCH_server_hiveSETEX;
+```
+
+**EPOCH_fnc_server_hiveEXPIRE**
+
+Set a timeout on key. After the timeout has expired, the key will automatically be deleted.
+
+_Uses Hive Call: (**131) or (130)**_
+
+_Input: Key Prefix, Unique Key, Expires in # seconds_
+
+_Returns: Nothing_
+
+```
+// get reference to player and get playerUID to use as unique key.
+_plyrUID = getPlayerUID _playerObject;
+
+// string (time in seconds) the key should last.
+_expires = "2592000"; // 30 days
+
+// Set expiration on given prefix:key.
+["PlayerMYCustomKey", _plyrUID, _expires] call EPOCH_server_hiveEXPIRE;
+```
+
+**EPOCH_fnc_server_hiveSETBIT**
+
+Permanent storage of bit value with given prefix:key
+
+_Uses Hive Call: **141**_
+
+_Input: Key Prefix, Unique Key, Bit Index, Value_
+
+_Returns: Nothing_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// index to get bit value
+_index = 0;
+
+// 1 = true, 0 = false
+_value = 1;
+
+// Set bit at given index for prefix:key
+["PlayerMYCustomBitKey", _plyrUID, _index, _value] call EPOCH_server_hiveSETBIT;
+```
+
+**EPOCH_fnc_server_hiveGET**
+
+Made to exceed the character limits of callextension within the dll using extra c++ and sqf logic. The GETRANGE function has proven to be more reliable to use for data sets that are known to exceed 8k chars.
+
+_Uses Hive Call: **200**_
+
+_Input: Key Prefix, Unique Key_
+
+_Returns: Array(Status, Array)_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// Get data using prefix:key. "PlayerMYCustomKey" is the prefix and "_plyrUID" unique key.
+_response = ["PlayerMYCustomKey", _plyrUID] call EPOCH_server_hiveGET;
+
+if ((_response select 0) == 1 && typeName(_response select 1) == "ARRAY") then {
+ _status = _response select 0;
+ _arr = _response select 1;
+ // do something with _arr data here
+};
+```
+
+**EPOCH_fnc_server_hiveGETTTL**
+
+Made to exceed the character limits of callextension within the dll using extra c++ and sqf logic. Also, returns the ttl or expire time in seconds.
+
+_Uses Hive Call: **200, 210**_
+
+_Input: Key Prefix, Unique Key_
+
+_Returns: Array(Status, Array,TTL)_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// Get data and ttl using prefix:key. "PlayerMYCustomKey" is the prefix and "_plyrUID" unique key.
+_response = ["PlayerMYCustomKey", _plyrUID] call EPOCH_server_hiveGETTTL;
+
+if ((_response select 0) == 1 && typeName (_response select 1) == "ARRAY" && !((_response select 1) isEqualTo [])) then {
+ _status = _response select 0;
+ _arr = _response select 1;
+ _ttl = _response select 2;
+
+ // do something with data here
+}
+```
+
+**EPOCH_fnc_server_hiveGETBIT**
+
+Returns the bit value at offset in the string value stored at key.
+
+_Uses Hive Call: **240**_
+
+_Input: Key Prefix, Unique Key, Bit Index_
+
+_Returns: Bool(true|false)_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// index to get bit value
+_index = 0;
+
+// Get bit value with given index at prefix:key
+_return = ["PlayerMYCustomBitKey", _plyrUID, _index] call EPOCH_server_hiveGETBIT;
+
+if (_return) then {
+ // do something if true
+};
+```
+
+**EPOCH_fnc_server_hiveGETRANGE**
+
+Made to exceed the character limits of callextension by using the redis command GETRANGE and sqf logic.
+
+_Uses Hive Call: **220**_
+
+_Input: Key Prefix, Unique Key_
+
+_Returns: Array(Status, Array)_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// PlayerMYCustomKey is the prefix and _plyrUID unique key
+_response = ["PlayerMYCustomKey", _plyrUID] call EPOCH_server_hiveGETRANGE;
+
+if ((_response select 0) == 1 && typeName(_response select 1) == "ARRAY") then {
+ _status = _response select 0;
+ _arr = _response select 1;
+ // do something with data here
+};
+```
+
+**EPOCH_fnc_server_hiveDEL**
+
+Removes the specified key.
+
+_Uses Hive Call: **400**_
+
+_Input: Key Prefix, Unique Key_
+
+_Returns: Nothing_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// Remove key
+["PlayerMYCustomKey", _plyrUID] call EPOCH_server_hiveDEL;
+```
+
+**EPOCH_fnc_server_hiveLog**
+
+Removes the specified key.
+
+_Uses Hive Call: **700**_
+
+_Input: Key Prefix, Message_
+
+_Returns: Nothing_
+
+```
+// get reference to player and get playerUID to use as unique key
+_plyrUID = getPlayerUID _playerObject;
+
+// Log to database, This data can be access via the database and can be found with the key "MyCustomLog-LOG"
+['MyCustomLog', format["%1 (%2) at %3", _playerObject, _plyrUID, getPosATL _playerObject]] call EPOCH_server_hiveLog;
+```
diff --git a/Sources/epoch_server_core/config.cpp b/Sources/epoch_server_core/config.cpp
index ae4d0de0c..b9731ac10 100644
--- a/Sources/epoch_server_core/config.cpp
+++ b/Sources/epoch_server_core/config.cpp
@@ -1,5 +1,5 @@
/****************************************************************************
-Copyright (C) 2015 - ARMA 3 EPOCH MOD [EpochMod.com] (v0.3.4.0)
+Copyright (C) 2015 - ARMA 3 EPOCH MOD [EpochMod.com] (v0.3.5.0)
*****************************************************************************/
#define _ARMA_
class CfgPatches {
diff --git a/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf b/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf
index ad4baaf69..ca799f8a8 100644
--- a/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf
+++ b/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf
@@ -6,7 +6,7 @@
Improvements and or bugfixes and other contributions are welcome via the github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server_settings/EpochEvents/CarnivalSpawner.sqf
*/
-
+private ["_item","_marker","_ferrisPosition"];
_ferrisPosition = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 4000, 0] call BIS_fnc_findSafePos;
if ((count _ferrisPosition) == 2) then{
_item = createVehicle["ferrisWheel_EPOCH", _ferrisPosition, [], 0.0, "CAN_COLLIDE"];
diff --git a/Sources/epoch_server_settings/EpochEvents/ChangeWeather.sqf b/Sources/epoch_server_settings/EpochEvents/ChangeWeather.sqf
index a9bca9f5a..5fd7dd8d5 100644
--- a/Sources/epoch_server_settings/EpochEvents/ChangeWeather.sqf
+++ b/Sources/epoch_server_settings/EpochEvents/ChangeWeather.sqf
@@ -9,6 +9,8 @@
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server_settings/EpochEvents/ChangeWeather.sqf
*/
+private ["_tempOVRD","_rainOVRD","_fogOVRD","_overcastOVRD","_windOVRD","_arr","_response","_windValX","_windValZ","_WeatherChangeTime","_force","_rnd_temp","_fog","_rain","_overcast"];
+
// Initalize variable for tracking time between runs.
if (isNil "EPOCH_lastWeatherChange") then {
EPOCH_lastWeatherChange = diag_tickTime;
@@ -69,7 +71,7 @@ if (_rain > 0.5) then {
_windValZ = random 20 - 10;
};
-if !(isNil "_windOVRD") then {
+if !(isNil "_windOVRD") then {
_windValX = _windOVRD select 0;
_windValZ = _windOVRD select 1;
};
@@ -81,4 +83,4 @@ if (_force) then {
forceWeatherChange;
};
-diag_log format["Weather Change: fog: %1 rain: %2 overcast: %3 windx: %4 windz: %5 forced: %6", _fog, _overcast, _rain, _windValX, _windValZ, _force];
\ No newline at end of file
+diag_log format["Weather Change: fog: %1 rain: %2 overcast: %3 windx: %4 windz: %5 forced: %6", _fog, _overcast, _rain, _windValX, _windValZ, _force];
diff --git a/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf b/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf
index cbfbcb1f5..b86dc08fc 100644
--- a/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf
+++ b/Sources/epoch_server_settings/EpochEvents/ContainerSpawner.sqf
@@ -6,6 +6,7 @@
Improvements and or bugfixes and other contributions are welcome via the github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server_settings/EpochEvents/ContainterSpawner.sqf
*/
+private ["_marker","_item","_cargoPosition"];
_cargoPosition = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 4000, 1] call BIS_fnc_findSafePos;
if ((count _cargoPosition) == 2) then{
_item = createVehicle["Cargo_Container", _cargoPosition, [], 0.0, "CAN_COLLIDE"];
diff --git a/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf b/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf
index e4df7b1f7..a8917dc96 100644
--- a/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf
+++ b/Sources/epoch_server_settings/EpochEvents/EarthQuake.sqf
@@ -6,6 +6,7 @@
Improvements and or bugfixes and other contributions are welcome via the github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server_settings/EpochEvents/Earthquake.sqf
*/
+private ["_marker","_minerals","_randomIndex","_item","_plyrsNearEpicenter","_position"];
_position = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 1000, 0] call BIS_fnc_findSafePos;
if ((count _position) == 2) then{
_plyrsNearEpicenter = _position nearEntities[["Epoch_Male_F", "Epoch_Female_F"], 1000];
diff --git a/Sources/epoch_server_settings/EpochEvents/MessageServer.sqf b/Sources/epoch_server_settings/EpochEvents/MessageServer.sqf
index 87d6ef023..6010ca226 100644
--- a/Sources/epoch_server_settings/EpochEvents/MessageServer.sqf
+++ b/Sources/epoch_server_settings/EpochEvents/MessageServer.sqf
@@ -1,5 +1,5 @@
// Random Messages
-
+/*
_messages = [
"Message 1",
"Message 2",
@@ -7,10 +7,8 @@ _messages = [
"Message 4",
];
["message", _messages param [floor(random (count _messages))]] call EPOCH_serverCommand;
-
+*/
// Restart time
-/*
_restartIn = round((EPOCH_forceRestartTime-diag_tickTime)/60);
["message", format["Welcome to Epoch Mod, server wlll restart in %1 minutes",_restartIn]] call EPOCH_serverCommand;
-*/
diff --git a/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf b/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf
index f361b329f..0c2ce7e42 100644
--- a/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf
+++ b/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf
@@ -6,7 +6,7 @@
Improvements and or bugfixes and other contributions are welcome via the github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server_settings/EpochEvents/PlantSpawner.sqf
*/
-
+private ["_displayName","_marker","_plants","_plant","_item","_plantPosition"];
_plantPosition = [epoch_centerMarkerPosition, 0, EPOCH_dynamicVehicleArea, 10, 0, 4000, 0] call BIS_fnc_findSafePos;
if ((count _plantPosition) == 2) then{
diff --git a/Sources/epoch_server_settings/config.cpp b/Sources/epoch_server_settings/config.cpp
index 05fd43c0a..cfd785679 100644
--- a/Sources/epoch_server_settings/config.cpp
+++ b/Sources/epoch_server_settings/config.cpp
@@ -1,5 +1,5 @@
/****************************************************************************
-Copyright (C) 2015 - ARMA 3 EPOCH MOD [EpochMod.com] (v0.3.4.0)
+Copyright (C) 2015 - ARMA 3 EPOCH MOD [EpochMod.com] (v0.3.5.0)
*****************************************************************************/
#define _ARMA_
@@ -9,7 +9,7 @@ class CfgPatches {
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
- epochVersion = "0.3.4.0";
+ epochVersion = "0.3.5.0";
requiredAddons[] = {};
};
};
diff --git a/Sources/epoch_server_settings/configs/loots.h b/Sources/epoch_server_settings/configs/loots.h
index 4885be28a..d839f45b6 100644
--- a/Sources/epoch_server_settings/configs/loots.h
+++ b/Sources/epoch_server_settings/configs/loots.h
@@ -509,7 +509,7 @@ class CfgMainTable
{
lootMin = 7;
LootMax = 14;
- tables[] = {
+ tables[] = {
{ "Equipment", 6 },
{ "Pistols", 8 },
{ "PistolAmmo", 10 },
@@ -662,7 +662,7 @@ class CfgLootTable
{ { "acc_pointer_IR", "item" }, 20 },
// Marksman DLC
{ { "Bipods", "CfgLootTable" }, 5 }
-
+
};
};
@@ -670,7 +670,7 @@ class CfgLootTable
{
items[] = {
{ { "SniperRiflem107", "CfgLootTable" }, 8 },
-
+
// Marksman DLC
{ { "SniperRifleMarkDLC", "CfgLootTable" }, 10 },
@@ -727,7 +727,7 @@ class CfgLootTable
{ { "10Rnd_338_Mag", "magazine" }, 1 },
{ { "10Rnd_93x64_DMR_05_Mag", "magazine" }, 1 },
{ { "10Rnd_127x54_Mag", "magazine" }, 1 }
-
+
};
};
@@ -792,8 +792,8 @@ class CfgLootTable
{ { "FoodSnooter", "magazine" }, 9 },
{ { "TacticalBacon", "magazine" }, 5 },
{ { "FoodMeeps", "magazine" }, 1 }
-
-
+
+
};
};
@@ -842,7 +842,7 @@ class CfgLootTable
{ { "ItemBattery", "magazine" }, 5 },
{ { "ItemCables", "magazine" }, 5 },
{ { "ItemSafe", "magazine" }, 1 }
-
+
};
};
@@ -1269,12 +1269,14 @@ class CfgLootTable
{ { "Muzzles_93mmgMarkDLC", "CfgLootTable" }, 1 }
};
};
-
+
class Muzzles_338MarkDLC
{
items[] = {
{ { "muzzle_snds_338_black", "item" }, 1 },
- { { "muzzle_snds_338_green", "item" }, 1 }
+ { { "muzzle_snds_338_green", "item" }, 1 },
+ { { "muzzle_snds_338_sand", "item" }, 1 }
+
};
};
class Muzzles_93mmgMarkDLC
@@ -1358,10 +1360,12 @@ class CfgLootTable
{ { "KitStudWall", "magazine" }, 13 },
{ { "KitShelf", "magazine" }, 9 },
{ { "KitWorkbench", "magazine" }, 2 },
- { { "KitWoodFloor", "magazine" }, 12 },
- { { "KitWoodStairs", "magazine" }, 10 },
+ { { "KitWoodFloor", "magazine" }, 10 },
+ { { "KitWoodStairs", "magazine" }, 9 },
{ { "KitWoodTower", "magazine" }, 5 },
{ { "KitWoodRamp", "magazine" }, 5 },
+ { { "KitTankTrap", "magazine" }, 2 },
+ { { "KitHesco3", "magazine" }, 1 },
{ { "KitWoodLadder", "magazine" }, 5 },
{ { "KitFirePlace", "magazine" }, 8 },
{ { "KitCinderWall", "magazine" }, 5 },
@@ -1370,7 +1374,7 @@ class CfgLootTable
{ { "ItemSafe", "magazine" }, 1 }
};
};
-
+
class Mission_Payout1
{
items[] = {
@@ -1539,7 +1543,7 @@ class CfgLootTable
{ { "B_AssaultPack_rgr", "backpack" }, 5 },
{ { "B_AssaultPack_sgg", "backpack" }, 5 },
{ { "B_AssaultPack_blk", "backpack" }, 5 },
-
+
{ { "B_Carryall_cbr", "backpack" }, 1 },
{ { "B_Carryall_khk", "backpack" }, 1 },
@@ -1848,7 +1852,7 @@ class CfgLootTable
{ { "wolf_mask_epoch", "item" }, 1 },
{ { "pkin_mask_epoch", "item" }, 1 },
{ { "clown_mask_epoch", "item" }, 1 }
-
+
};
};
};
diff --git a/Sources/epoch_server_settings/configs/security/security_checks.h b/Sources/epoch_server_settings/configs/security/security_checks.h
index d1246f619..14fc11ba2 100644
--- a/Sources/epoch_server_settings/configs/security/security_checks.h
+++ b/Sources/epoch_server_settings/configs/security/security_checks.h
@@ -5,7 +5,7 @@
class CfgSecConf
{
debug = false;
-
+
class limits {
playerCrypto = 25000;
};
@@ -54,17 +54,17 @@ class CfgSecConf
};
mode = "Standard";
};
-
+
class displayAddEventHandler {
keyDown = "_this call EPOCH_KeyDown;";
- keyUp = "";
+ keyUp = "_this call EPOCH_KeyUp;";
};
-
+
class addEventHandler {
checks[] = {"Fired","InventoryClosed","InventoryOpened","Killed","HandleDamage","HandleHeal","Dammaged","Hit","HitPart"};
Fired = "_this call EPOCH_fnc_playerFired;";
- InventoryClosed = "if !(EPOCH_arr_interactedObjs isEqualTo[]) then {EPOCH_arr_interactedObjs remoteExec['EPOCH_server_save_vehicles', 2]; EPOCH_arr_interactedObjs = [];};";
- InventoryOpened = "_this spawn EPOCH_initUI; (locked (_this select 1) in [2, 3])";
+ InventoryClosed = "if !(EPOCH_arr_interactedObjs isEqualTo[]) then {EPOCH_arr_interactedObjs remoteExec['EPOCH_server_save_vehicles', 2]; EPOCH_arr_interactedObjs = [];};";
+ InventoryOpened = "_this spawn EPOCH_initUI; (locked (_this select 1) in [2, 3] || (_this select 1) getVariable['EPOCH_Locked;, false])";
Killed = "_this call EPOCH_fnc_playerDeath;";
HandleDamage = "";
HandleHeal = "";
@@ -75,18 +75,18 @@ class CfgSecConf
class variables {
class whitelist {
- #include "data\custom_vars.h" // whitelisted variables
+ #include "data\custom_vars.h" // whitelisted variables
};
badVars[] = {"ESP_map","ESP_mainMap","ESP_adminMap","AntiAntiAntiAntiHax","fnc_usec_damageHandler","fnc_usec_unconscious","VAGINA_secret","yolo","VERSION","life_fnc_handleDamage","EPOCH_spawnVehicle_PVS","CLASS911_Menu","nuke_vars","JJMMEE_INIT_MENU","PLAYERON","PLAYERNEXT2","ALTISLIFEON","LY_Menu","PLAY","LY_SwaggerLikeUs","BIS_fnc_dbg_reminder_value","BIS_fnc_dbg_reminder"};
nilVars[] = {"EPOCH_antiWallCount","EPOCH_playerEnergy","EPOCH_playerHunger","EPOCH_playerStamina","EPOCH_playerCrypto","EPOCH_target","EPOCH_ESP_TARGETS","EPOCH_ESPMAP_TARGETS","EPOCH_taxRate","EPOCH_ESP_VEHICLEPLAYER","EPOCH_ESP_PLAYER","EPOCH_ESP_VEHICLES"};
};
-
+
class commandMenu {
menus[] = {"","RscSelectTeam","RscTeam","RscMoveHigh","#GETIN","#RscStatus","#WATCH0","RscCombatMode","RscMenuReply","RscCallSupport","#CUSTOM_RADIO","#User:BIS_fnc_addCommMenuItem_menu","RscRadio","RscReply","#ACTION","RscMenuFormations","#WATCH","RscGroupRootMenu","RscMainMenu","RscMenuMove","RscWatchDir","RscWatchMoveDir","#User:BIS_Menu_GroupCommunication","RscMenuStatus","RscFormations"};
};
-
- // RscDisplay (onload, unload) scanning is automatic and will ensure data matches the server.
- // Using the extra whitelist arrays this check can be extended to allow modifications client side that do not exist server side.
+
+ // RscDisplay (onload, unload) scanning is automatic and will ensure data matches the server.
+ // Using the extra whitelist arrays this check can be extended to allow modifications client side that do not exist server side.
class displayOnload {
// Format: {rscDisplayConfigname, extra whitelisted onload data (array of string), extra whitelisted unload data (array of string)}
// The extra onload whitelist for RscDisplayConfigure is for CBA
@@ -126,4 +126,4 @@ class CfgSecConf
systemChat4 = "systemChat format['Debug-Vehicle: _veh: %1', _veh];";
systemChat5 = "systemChat format['Debug-Vehicle: _this: %1', _this];";
};
-};
\ No newline at end of file
+};
diff --git a/Sources/mpmissions/epoch.VR/description.ext b/Sources/mpmissions/epoch.VR/description.ext
index d8fd5c2ac..1ce50f3aa 100644
--- a/Sources/mpmissions/epoch.VR/description.ext
+++ b/Sources/mpmissions/epoch.VR/description.ext
@@ -72,7 +72,7 @@ class CfgRemoteExec
class CfgEpochClient
{
- epochVersion = "0.3.4.0";
+ epochVersion = "0.3.5.0";
sapperRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 = 1% - 55% if soiled (+ 2% if in city) chance to spawn sapper
diff --git a/Tools/Install/InstallEpoch.cmd b/Tools/Install/InstallEpoch.cmd
index d5c7ac5b6..458e8741b 100644
--- a/Tools/Install/InstallEpoch.cmd
+++ b/Tools/Install/InstallEpoch.cmd
@@ -3,13 +3,12 @@ SET STEAMUN=admin@youremail.net
SET STEAMPW=chamgeme
SET ARMASVRPATH=C:\Arma3Server
SET ARMAAPPID=107410
-:: Workshop IDs: EpochExperimental = 455221958, Normal Epoch = 421839251
SET ARMAWORKSHOPID=421839251
+
:: remove mod folder
rd /s/q "%ARMASVRPATH%\@Epoch"
-:: remove cache C:\Users\Administrator\Downloads\steamcmd\steamapps\workshop
-del "steamapps\workshop\appworkshop_%ARMAAPPID%.acf"
:: update workshop mod
-START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% +quit
+START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit
:: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\@Epoch"
+:: steamcmd.exe +login %STEAMUN% %STEAMPW% +force_install_dir "%ARMASVRPATH%" "+app_update %ARMAAPPID%" validate +quit