0.3.5.016

This commit is contained in:
vbawol 2015-10-28 10:16:00 -05:00
parent e329075677
commit 981170c5f0
105 changed files with 3905 additions and 2305 deletions

10
Changelogs/0.3.5.0.txt Normal file
View File

@ -0,0 +1,10 @@
[Added] Persistent Spike traps.
[Added] New interaction system.
[Added] Documentation on server core framework functions and hive calls.
[Added] Custom Epoch Tank trap.
[Added] New version of the Fishing Rod.
[Added] muzzle_snds_338_sand to loot and pricing tables.
[Changed] Overhaul of secure storage system with support for new UI.
[Fixed] Force trader data save to save when loading starter items.
[Fixed] Dynamic traders did not correctly track the stored vehicle count and limits.
[Fixed] .rpt error after gutting animal added by adding isNull check to animal brain.

View File

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

Binary file not shown.

View File

@ -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" !="(Spike|Metal)_TRAP_SIM_EPOCH" !="(WoodFoundation|Foundation)_EPOCH" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH"
5 SeaGull

View File

@ -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'"
@ -59,8 +63,7 @@
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 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];"

View File

@ -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" !="WoodWall[1-4](_SIM|_Ghost|)_EPOCH"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
/*%FSM<COMPILE "X:\ArmA\Tools\FSM Editor Personal Edition\scriptedFSM.cfg, animals">*/
/*%FSM<COMPILE "F:\Program Files (x86)\Bohemia Interactive\Tools\FSM Editor Personal Edition\scriptedFSM.cfg, animals">*/
/*%FSM<HEAD>*/
/*
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</HEAD>*/
class FSM
{
@ -115,6 +119,16 @@ class FSM
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "IsNull">*/
class IsNull
{
priority = 0.000000;
to="Exit_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"isNull _animalAgent"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Loop">*/
class Loop
{
@ -396,13 +410,25 @@ class FSM
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Exit_">*/
class Exit_
{
name = "Exit_";
init = /*%FSM<STATEINIT""">*/""/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
};
};
/*%FSM</STATE>*/
};
initState="init";
finalStates[] =
{
"Dead" ,
"Delete" ,
"Delete_1"
"Dead",
"Delete",
"Delete_1",
"Exit_",
};
};
/*%FSM</COMPILE>*/

View File

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

View File

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

View File

@ -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</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
@ -287,4 +287,4 @@ class FSM
"END"
};
};
/*%FSM</COMPILE>*/
/*%FSM</COMPILE>*/

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -32,19 +32,19 @@ if (!isNull EPOCH_currentTarget && vehicle player == player) then {
_stability = 0;
_color = [1, 1, 1, 0.7];
_text = "";
_text = format ["Press (%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;
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";
_text = "Press (Inventory)";
};
case 1: {
_text = if (EPOCH_buildMode > 0) then[{"Press (Space)"}, { "Enable Build - Press (1)" }];
_text = if (EPOCH_buildMode > 0) then[{_text}, { format ["Enable Build - Press (%1)",EPOCH_keysBuildMode1 call BIS_fnc_keyCode] }];
_stability = _currentTarget getVariable["stability", 100];
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";
@ -57,7 +57,7 @@ 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 }]];
_text = format["%1 - Press (Ctrl+%2)", if (isStreamFriendlyUIEnabled) then[{"Player"}, { name _currentTarget }],EPOCH_keysAcceptTrade call BIS_fnc_keyCode];
_stability = 100 - round(damage _currentTarget) * 10;
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";
@ -69,18 +69,18 @@ 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)" }];
//_text = if (EPOCH_buildMode > 0) then[{"Press (Space)"}, { "Press (Inventory)" }];
_stability = _currentTarget getVariable["stability", 100];
_icon = "\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa";

View File

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

View File

@ -0,0 +1,23 @@
_out = [false, false, false];
if !(isNil "EPOCH_simulSwap_Lock") exitWith{ _out };
if !(isNull EPOCH_Target) exitWith{ _out };
if (EPOCH_playerEnergy <= 0) exitWith{ _dt = ["<t size='0.8' shadow='0' color='#99ffffff'>Need energy</t>", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext; _out };
params ["_object"];
if (isNull _object) exitWith{ _out };
if ((player distance _object) > 9) exitWith { _out };
if !(EPOCH_buildMode > 0) exitWith {_out};
_objType = typeOf _object;
_config = 'CfgBaseBuilding' call EPOCH_returnConfig;
_out =
[
!(getArray(_config >> _objType >> "upgradeBuilding") isEqualTo []),
!(getArray(_config >> _objType >> "removeParts") isEqualTo []),
(_object isKindOf "ThingX")
];
_out

View File

@ -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 = ["<t size='0.8' shadow='0' color='#99ffffff'>Need energy</t>", 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

View File

@ -1,18 +1,37 @@
if !(isNil "EPOCH_maintainLockout") exitWith {_dt = ["<t size=""0.8"" shadow=""0"" color=""#99ffffff"">Already Maintaining a base.</t>", 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";
[_rnd,_maintainCount] spawn {
params ["_rnd","_maintainCount"];
uiSleep _maintainCount;
missionNamespace setVariable [_rnd,false];
uiSleep 1;
missionNamespace setVariable [_rnd,nil];
EPOCH_maintainLockout = nil;
};
_dt = [format["<t size=""0.8"" shadow=""0"" color=""#99ffffff"">Cost %1 Krypto to maintain base.</t>", _maintainCount], 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
} else {
_dt = ["<t size=""0.8"" shadow=""0"" color=""#99ffffff"">Nothing needs maintained.</t>", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
};
EPOCH_MAINTBUILD = [_this, player, _maintainCount, Epoch_personalToken];
publicVariableServer "EPOCH_MAINTBUILD";
_dt = [format["<t size=""0.8"" shadow=""0"" color=""#99ffffff"">Cost %1 Krypto to maintain base.</t>", _maintainCount], 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
} else {
_dt = ["<t size=""0.8"" shadow=""0"" color=""#99ffffff"">You need Krypto to maintain a base.</t>", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
};

View File

@ -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 = ["<t size='0.8' shadow='0' color='#99ffffff'>Upgraded</t>", 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
};

View File

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

View File

@ -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["<t size = '0.8' shadow = '0' color = '#99ffffff'>Internal sound level: %1%2 </t>", 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["<t size = '0.8' shadow = '0' color = '#99ffffff'>Internal sound level: %1%2 </t>", EPOCH_soundLevel * 100,"%"], 0, 1, 5, 2, 0, 1] spawn bis_fnc_dynamictext;
@ -61,9 +59,24 @@ if (_dikCode == EPOCH_keysDebugMon) then {
_handled = true;
};
//Action Menu
if (_dikCode == EPOCH_keysAction) then {
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 {
if (_dikCode == EPOCH_keysBuildMode1) then {
if (EPOCH_buildMode == 1) then {
EPOCH_buildMode = 0;
@ -151,7 +164,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 };
};
};
};

View File

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

View File

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

View File

@ -1,4 +1,4 @@
//
//
_playerObject = _this select 0;
if !(alive player && alive _playerObject && !isPlayer _playerObject) then {
_ply = player;
@ -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;
true call EPOCH_pushCustomVar;

View File

@ -514,8 +514,14 @@ 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));
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;
} else {
EPOCH_nearPower = false;
@ -553,7 +559,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;
};

View File

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

View File

@ -2,6 +2,7 @@ private["_item", "_currQty", "_tradeType", "_itemWorth", "_aiItems", "_itemClass
if (!isNil "EPOCH_TRADE_COMPLETE") exitWith {};
if (!isNil "EPOCH_TRADE_STARTED") exitWith{};
if (EPOCH_playerCrypto <= 0) exitWith {};
if (!isNull _this) then {
@ -19,8 +20,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 +49,10 @@ if (!isNull _this) then {
};
};
};
// test
// test
};
};
};
@ -107,18 +108,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 +131,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 +160,4 @@ if (!isNull _this) then {
EPOCH_TRADE_STARTED = nil;
};
};
};
};

View File

@ -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 {};
};
@ -259,25 +259,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 {};
@ -332,6 +338,15 @@ class CfgClientFunctions
class postprocessAdjust {};
class postprocessDestroy {};
};
class worldToScreen {
file = "\x\addons\a3_epoch_code\gui\scripts\worldToScreen";
class gui3DCooldown {};
class gui3DCooldownEH {};
class gui3DWorldPos {};
class gui3DWorldPosEH {};
class gui3DModelPos {};
class gui3DModelPosEH {};
};
};
};
#include "\A3\ui_f\hpp\defineCommonGrids.inc"

View File

@ -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]; [findDisplay -7] call BIS_fnc_guiEffectTiles;";
class ControlsBackground
{
class Background: RscPicture //Replace with custom background
{
idc = 88800;
text = "x\addons\a3_epoch_code\data\EpochLogo.paa";
x = 0;
y = 0.5;
w = 1;
h = 0.25;
};
};
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;
@ -1545,6 +1620,7 @@ class InteractBaseBuilding
};
};
*/
/*
class InteractItem
{

View File

@ -3,6 +3,7 @@ class rmx_dynamenu {
enableSimulation = 1;
movingEnable = 1;
onLoad = "setMousePosition [0.5, 0.5];";
onKeyUp = "_this call epoch_keyUp";
class controls {};
};
@ -620,4 +621,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;
};
};

View File

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

View File

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

View File

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

View File

@ -0,0 +1,7 @@
_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];
(findDisplay -7 displayCtrl 88801) ctrlSetPosition [_r,1,1.8];
(findDisplay -7 displayCtrl 88802) ctrlSetPosition [_r2,1,1.8];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,29 @@
private ["_close","_cleanupVars"];
_close = param [0,false,[false]];
_cleanupVars = {
_cfg = "CfgActionMenu" call EPOCH_returnConfig;
{
call compile (format ["%1 = nil;",configName _x]);
} 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

View File

@ -0,0 +1,78 @@
#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];
};
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.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;
rmx_var_dynaControls pushBack _ctrl;
rmx_var_dynaControls pushBack _ctrl2;
};
true

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -49,6 +49,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

View File

@ -0,0 +1,28 @@
class CfgActionMenu
{
class variableDefines //must be global, nil when menu closes
{
dyna_cursorTarget = "cursorTarget";
dyna_cursorTargetType = "typeOf cursorTarget";
dyna_inVehicle = "vehicle player != player";
dyna_itemsPlayer = "items player";
dyna_distance = "(player distance dyna_cursorTarget) < 5";
dyna_buildMode = "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"
};
};

View File

@ -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 = "hint 'Detective is on the case'";
icon = "x\addons\a3_epoch_code\Data\UI\buttons\player_inspect.paa";
tooltip = "Examine";
};

View File

@ -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_green.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 = "#(rgb,8,8,3)color(1,0,1,0.5)";
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 = "#(rgb,8,8,3)color(1,0,1,0.5)";
tooltip = "Pack Safe";
};

View File

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

View File

@ -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_EPOCH: DirectionalBombBase
{
hit = 10;
indirectHit = 5;
indirectHitRange = 3;
model = "\x\addons\a3_epoch_assets\models\stick.p3d";
mineModelDisabled = "\x\addons\a3_epoch_assets\models\sticks.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_EPOCH: DirectionalBombBase
{
hit = 15;
indirectHit = 8;
indirectHitRange = 4;
model = "\x\addons\a3_epoch_assets\models\stick.p3d";
mineModelDisabled = "\x\addons\a3_epoch_assets\models\sticks.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};
};
};
};

View File

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

View File

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

View File

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

View File

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

View File

@ -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,19 @@ 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 KitWoodLadder : CA_Magazine
{
model = "\x\addons\a3_epoch_assets_1\models\supply_crate.p3d";

View File

@ -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,14 @@ class CfgPricing
class KitWoodStairs {price = 10;};
class KitWoodTower {price = 10;};
class KitWoodRamp {price = 14;};
class KitTankTrap {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 +493,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 +695,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;};

View File

@ -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,43 @@ 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\stick.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\stick.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";
simulClass = "TankTrap_SIM_EPOCH";
staticClass = "TankTrap_EPOCH";
GhostPreview = "TankTrap_EPOCH";
limitNearby = 4;
bypassJammer = 1;
};
class SapperHead_SIM_EPOCH: Constructions_modular_F
{
scope = 2;
@ -3587,6 +3616,7 @@ class CfgVehicles
simulClass = "PlotPole_SIM_EPOCH";
model = "\x\addons\a3_epoch_assets\models\jammer.p3d";
/*
class UserActions
{
class MaintainIT
@ -3600,6 +3630,7 @@ class CfgVehicles
statement = "this call EPOCH_maintainIT";
};
};
*/
removeParts[] = { { "KitPlotPole", 1 } };
bypassJammer = 1;
interactMode = 1;
@ -3659,7 +3690,7 @@ class CfgVehicles
};
*/
class Constructions_lockedstatic_F : NonStrategic
class Constructions_lockedstatic_F : WeaponHolder
{
mapSize = 1.27;
author = "Epoch";
@ -3672,6 +3703,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 +3721,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 +3749,7 @@ class CfgVehicles
statement = "EPOCH_packStorage_PVS = [this,player,Epoch_personalToken]; publicVariableServer ""EPOCH_packStorage_PVS"";";
};
};
*/
};
@ -3723,12 +3763,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 +3782,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 +3792,37 @@ 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 Hesco3_EPOCH: Constructions_static_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_EPOCH";
energyCost = 0.2;
limitNearby = 4;
bypassJammer = 1;
};
class WoodRamp_EPOCH : Constructions_static_F
@ -5073,60 +5147,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 = "<img image='\A3\modules_f\data\iconlock_ca.paa' size='2.5' />";
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 = "<img image='\A3\modules_f\data\iconlock_ca.paa' size='2.5' />";
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
{

View File

@ -270,7 +270,7 @@ class CfgCrafting
};
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" };
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,15 @@ 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 KitWoodStairs : Kit
{
recipe[] = {{"PartPlankPack",4}};

View File

@ -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";
};
};
@ -42,9 +42,7 @@ class CfgAddons
#include "\x\addons\a3_epoch_config\Configs\CfgEpochClient.hpp"
#include "\x\addons\a3_epoch_config\Configs\CfgBaseBuilding.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;

View File

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

View File

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

View File

@ -31,65 +31,27 @@ if (isText _config) then {
EPOCH_StorageSlotsCount = count EPOCH_StorageSlots;
publicVariable "EPOCH_StorageSlotsCount";
// Secure storage
// Secure and insecure storage
_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{
// 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];
_storageObj call EPOCH_server_save_storage;
_storageObj call EPOCH_server_storageInit;
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;
_storageObj setVariable["STORAGE_OWNERS", [_plyrUID]];
_storageObj setVariable["STORAGE_SLOT", _slot, true];
_storageObj call EPOCH_server_save_storage;
_storageObj call EPOCH_server_storageInit;
diag_log format["STORAGE: %1 created storage %2 at %3", _plyrUID, _staticClass, _vehiclePos];
_storageObj setVariable["EPOCH_Locked", false, true];
};
_storageObj setVariable["STORAGE_OWNERS", [_plyrUID]];
_storageObj setVariable["STORAGE_SLOT", _slot, true];
_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 {

View File

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

View File

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

View File

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

View File

@ -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 {
_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;
};
};
} else {
if (_plyrUID in _owners) then {
_unit call _fnc_unlock;
};
};
};
};

View File

@ -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 <null> in DB.
_wepsItemsCargo = weaponsItemsCargo _weaponHolder;
if (isNil "_wepsItemsCargo") then {
_wepsItemsCargo = [];
};
_magsAmmoCargo = magazinesAmmoCargo _weaponHolder;
if (isNil "_magsAmmoCargo") then {
_magsAmmoCargo = [];
};
// dump items on ground
_inventory = [
_wepsItemsCargo,
_magsAmmoCargo,
getBackpackCargo _weaponHolder,
getItemCargo _weaponHolder
];
[_weaponHolder, _plyr] call EPOCH_server_save_killedStorage;
deleteVehicle _weaponHolder;
_gwh = createVehicle["groundWeaponHolder", _posWH, [], 0, "CAN_COLLIDE"];
_gwh setPosATL _posWH;
_returnItems = getArray(configFile >> "CfgVehicles" >> _class >> "returnOnPack");
{
_gwh addMagazineCargoGlobal _x;
} forEach _returnItems;
{
_objType = _forEachIndex;
_objTypes = _x;
_objQty = [];
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;
};
};
} forEach _x;
// 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];
};
};
};
};
};
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];
};
};
};
}forEach _objTypes;
}forEach _inventory;
// may not be needed but should prevent <null> 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 _unit,
getItemCargo _unit
];
[_unit, _plyr] call EPOCH_server_save_killedStorage;
deleteVehicle _unit;
_gwh = createVehicle["groundWeaponHolder", _posWH, [], 0, "CAN_COLLIDE"];
_gwh setPosATL _posWH;
_returnItems = getArray(configFile >> "CfgVehicles" >> _class >> "returnOnPack");
{
_gwh addMagazineCargoGlobal _x;
} forEach _returnItems;
{
_objType = _forEachIndex;
_objTypes = _x;
_objQty = [];
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;
};
};
} forEach _x;
// 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];
};
};
};
};
};
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];
};
};
};
}forEach _objTypes;
}forEach _inventory;
};
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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];
diag_log format["Weather Change: fog: %1 rain: %2 overcast: %3 windx: %4 windz: %5 forced: %6", _fog, _overcast, _rain, _windValX, _windValZ, _force];

View File

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

View File

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

View File

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

Some files were not shown because too many files have changed in this diff Show More