sync with experimental with release

This commit is contained in:
vbawol 2016-04-29 10:53:01 -05:00
commit c1356ed4b9
63 changed files with 494 additions and 179 deletions

View File

@ -55,7 +55,8 @@ Build: 439
[Changed] Increased range for vehicle interactions to fix issues with access to larger vehicles. Thanks to Grahame for the report: http://epochmod.com/forum/index.php?/topic/41894-cannot-unlock-large-vehicles/
[Changed] Preloading sapper by spawning one on the map at server start.
[Changed] Change to github markdown for credits and license.
[Fixed] BE kick since 1.58 hotfix.
[Fixed] suppress loot spawning at main traders. Thanks to Ghostrider-DbD- for the report. http://epochmod.com/forum/topic/41954-loot-spawning-at-traders/
[Fixed] BE kick since 1.58 hotfix. http://epochmod.com/forum/topic/41961-rscdebugconsole_watch-battleye-kick/?do=findComment&comment=275456
[Fixed] Use object as input for remoteExec instead of owner. http://epochmod.com/forum/topic/41959-be-carefull-with-remoteexec-and-owner/
[Fixed] Attempt fix issues with temporary angle and rotation issues with base building.
[Fixed] Check for base kit item is in players inventory before spawning ghost.

25
Changelogs/0.3.9.0.txt Normal file
View File

@ -0,0 +1,25 @@
[Added] Player option to Morph into a random antagonist (from deathMorphClass) after death. The array 'deathMorphClass' found in CfgEpochClient can be used to specify what antagonists to randomly spawn.
[Added] Player option to detonate body after death. Sacrifice yourself by generating a runaway thermal cascade using the nano bots within your body. Nothing left to revive.
[Added] Server function to allow remote exec of setVariable on client - Allows client to ask another client to set a local variable, via the server. Server can run same function.
[Changed] Sapper groan or detonate can be triggered by setting a variable on the target or sapper.
[Changed] Server can be asked by a client / server to trigger an antagonist on another client. Antagonist is then run on target PC, independent from caller of function.
[Changed] Epoch Unit Spawn code. Now can be called specifying the target of the antagonist. Antagonist will run on target client PC.
[Changed] Sapper defaults tweaked to make them more responsive.
[Changed] New Sapper antagonist config options:
reflexSpeed - Set the loop pause. Defaults have been lowered to make sapper more responsive.
nestChance - A percentage chance, at each sapper spawn, that he will create a nest.
hideLevel - (Fear Emotion) Set level at which sapper will go into hiding based on fear of armed players, being shot near etc.
chargeLevel - (Anger Emotion) Set level at which sapper will trigger 'charge the player' mode.
[Changed] New UAV Support Troops antagonist config options:
unitTypes - an array of soldier classes to randomly choose from. Custom weapons to-do, use soldiers with default weapon loadout or handle weapons with custom script.
maxUnitNum - Maximum number of units to spawn per UAV.
minAISkill - Minimum value for any AI skill.
maxAimingAccuracy -> maxGeneral - Set the maximum value for each available AI skill. A random number between minAISkill and the value for each will be set as that skill.
[Fixed] Prevent empty group menu display. Thanks to He-Man! for the fix.
[Fixed] Group system marked player as "Dead Player" if moderator status was change while player offline. Thanks to He-Man! for the fix.
[Fixed] Group system invite and kick from group options not working. Thanks to He-Man for the fixes: http://epochmod.com/forum/topic/41893-group-menu-broken-kick-invite-for-admin-not-possible/#comment-275429
[Fixed] Missing texture issues with some base building objects since 0.3.8.
[Info] RConPort 2306 added to example-beserver.cfg for changes since A3 1.58.
[Info] Removed old .bikey and added new one for 0390.
[Info] Requires Arma 3 1.58 or higher.
[Info] A big thanks to Isaac, Axeman's chief tester.

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
5 "" !" GroundWeaponHolder$" !" WeaponHolderSimulated$" !" Epoch_(Sapper|SapperB|Cloak|Female_CamoRed)_F$" !" (Land_MPS|Bobber|Rabbit)_EPOCH$" !" (Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH$" !" (Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Cabinet|Freezer|Tarp)_EPOCH$" !" (SapperHead|Jack|SolarGen)_SIM_EPOCH$" !" (Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH$" !" Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH$" !" (Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace|TankTrap)_SIM_EPOCH$" !" (Hesco3|Metal|WoodWall[1-4])_(Ghost|SIM)_EPOCH$" !" (Spike|Metal)_TRAP_SIM_EPOCH$" !" (WoodFoundation|Foundation)_Ghost_EPOCH$" !" I_(Soldier[1-3]|Soldier)_EPOCH$" !" I_(helipilot|helicrew)_F$" !" I_UAV_01_F$" !" (I|B|O)_UAV_AI$" !" I_Boat_Armed_01_minigun_F" !" B_Heli_Transport_01_F" !" Land_Cages_F$"
5 "" !="[0-9]:[0-9]{1,4}" !" GroundWeaponHolder$" !" WeaponHolderSimulated$" !" Epoch_(Sapper|SapperB|Cloak|Female_CamoRed)_F$" !" (Land_MPS|Bobber|Rabbit)_EPOCH$" !" (Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH$" !" (Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Cabinet|Freezer|Tarp)_EPOCH$" !" (SapperHead|Jack|SolarGen)_SIM_EPOCH$" !" (Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH$" !" Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH$" !" (Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace|TankTrap)_SIM_EPOCH$" !" (Hesco3|Metal|WoodWall[1-4])_(Ghost|SIM)_EPOCH$" !" (Spike|Metal)_TRAP_SIM_EPOCH$" !" (WoodFoundation|Foundation)_Ghost_EPOCH$" !" I_(Soldier[1-3]|Soldier)_EPOCH$" !" I_(helipilot|helicrew)_F$" !" I_UAV_01_F$" !" (I|B|O)_UAV_AI$" !" I_Boat_Armed_01_minigun_F" !" B_Heli_Transport_01_F" !" Land_Cages_F$"

View File

@ -1 +1 @@
5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_checkplayer \[[A-Z]{1} [A-Za-z]{4,10} [0-9]{1,3}-[0-9]{1,3}:[0-9]{1,3}( \(.+\)|) REMOTE\]" !="epoch_server_(save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player|(upgrade|updateplayer|create|delete)Group) \[.+\]" !="epoch_server_(knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer) \[.+\]"
5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_checkplayer \[[A-Z]{1} [A-Za-z]{4,10} [0-9]{1,3}-[0-9]{1,3}:[0-9]{1,3}( \(.+\)|) REMOTE\]" !="epoch_server_(save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player|(upgrade|updateplayer|create|delete)Group) \[.+\]" !="epoch_server_(deadplayerdetonate|triggerantagonist|playersetvariable) \[.+\]" !="epoch_server_(knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer) \[.+\]"

View File

@ -36,7 +36,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_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 createDialog !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog _tapDiag;" !="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 !="CBA_fnc_setMarkerPersistent\"" !="\\fnc_setMarkerPersistent" !="\"setMarkerPersistent"
@ -55,9 +55,9 @@
7 displayRemoveAllEventHandlers !="_display displayRemoveAllEventHandlers _x;" !="if !(isMultiplayer) then { { (findDisplay 46) displayRemoveAllEventHandlers _x } forEach [\"KeyUp\", \"KeyDown\"] };"
7 removeAllMissionEventHandlers
7 ctrlRemoveAllEventHandlers !="(uiNamespace getVariable 'ESP_map') ctrlRemoveAllEventHandlers 'Draw';" !="ctrlAddEventHandler ['MouseButtonDown'"
7 removeEventHandler !="displayRemoveEventHandler" !="player removeEventHandler ['Fired', 0];" !"_currentTarget removeEventHandler[\"EpeContactStart\", _onContactEH]" !" [_adminVar,objnull];\npublicvariable _adminVar;\nplayer removeeventhandler [\"respawn\",_respawn];" !="_plyr removeEventHandler [\"FiredNear\", _smokeEH];" !="player removeEventHandler [_ehKey, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler"
7 removeEventHandler !="displayRemoveEventHandler" !="player removeEventHandler ['Fired', 0];" !"_currentTarget removeEventHandler[\"EpeContactStart\", _onContactEH]" !" [_adminVar,objnull];\npublicvariable _adminVar;\nplayer removeeventhandler [\"respawn\",_respawn];" !="_plyr removeEventHandler [\"FiredNear\", _smokeEH];" !="player removeEventHandler [_ehKey, 0];" !="player removeEventHandler [_x, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler"
7 displayRemoveEventHandler !"BIS_fnc_guiMessage_status" !="(findDisplay 46) displayRemoveEventHandler [_key, _id];"
7 switchCamera !="vehicle player switchCamera"
7 switchCamera !="vehicle player switchCamera" !="_antagonist switchCamera \"Internal\";"
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\"" !="drawIcon3D[\"x\addons\a3_epoch_code\Data\UI\snap_ca.paa\""
7 drawLine3D !"{\nfor [{_i = 1}, {_i < count _x}, {_i = _i + 1}] do {\ndrawLine3D [_x select (_i - 1), _x select _i, ((BIS_tracedShooter getVari"

View File

@ -1 +1 @@
5 "" !=(Offer|Accept|BUILD_SLOT|TRADE_ACTIVE|last_targeter) !="bis_fnc_objectvar_var" !="bis_fnc_selectrespawntemplate_respawned"
5 "" !=(Offer|Accept|BUILD_SLOT|TRADE_ACTIVE|last_targeter|epoch_(antagobj|antagBomb)) !="bis_fnc_objectvar_var" !="bis_fnc_selectrespawntemplate_respawned"

View File

@ -22,16 +22,29 @@ _grp = createGroup RESISTANCE;
_grp setBehaviour "COMBAT";
_grp setCombatMode "RED";
// TODO: make configized
_arrUnits = ["I_Soldier_EPOCH", "I_Soldier2_EPOCH", "I_Soldier3_EPOCH"];
_minAISkill = getNumber (getMissionConfig "CfgEpochUAVSupport" >> "minAISkill");
_arrUnits = getArray (getMissionConfig "CfgEpochUAVSupport" >> "unitTypes");
_unitCount = getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxUnitNum");
_arrSkills = ["aimingAccuracy","aimingShake","aimingSpeed","endurance","spotDistance","spotTime","courage","reloadSpeed","commanding","general"];
_arrVals = [
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxAimingAccuracy"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxAimingShake"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxAimingSpeed"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxEndurance"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxSpotDistance"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxSpotTime"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxCourage"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxReloadSpeed"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxCommanding"),
getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxGeneral")
];
_units = [];
for "_i" from 0 to ((count _arrUnits)-1) do {
for "_i" from 0 to (_unitCount - 1) do {
_unit = _grp createUnit[(_arrUnits select _i), _pos, [], 0, "FORM"];
_unit = _grp createUnit[selectRandom _arrUnits, _pos, [], 0, "FORM"];
_units pushBack _unit;
_unit setSkill 0.6;
//_unit setSkill 0.6;
_unit setRank "Private";
_unit enableAI "TARGET";
@ -41,9 +54,9 @@ for "_i" from 0 to ((count _arrUnits)-1) do {
_unit disableAI "FSM";
for "_i" from 0 to ((count _arrSkills)-1) do {
_aiskill = ((floor(random 10))+1)/10;
if (_aiskill<0.6) then {_aiskill=0.6};
_unit setSkill [_arrSkills select _i,_aiskill];
_aiskill = floor random (_arrVals select _i);
if (_aiskill<_minAISkill) then {_aiskill=_minAISkill};
_unit setSkill [_arrSkills select _i,_arrVals select _i];
};
if (_i == 0) then {

View File

@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
Contributors:
Contributors: Andrew Gregory
Description:
Antagonist spawn function
@ -12,15 +12,19 @@
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
*/
private ["_unit","_sapperNum","_config","_bomb","_targetPos","_grp","_driver","_index","_nonJammer","_nonTrader","_jammers","_jammerRange","_restricted","_disableAI"];
params ["_unitClass"];
private ["_unit","_sapperNum","_config","_targetPos","_grp","_driver","_index","_nonJammer","_nonTrader","_jammers","_jammerRange","_restricted","_disableAI"];
params ["_unitClass","_trgt","_doVariable"];
private _bomb = objNull;
if(isNil "_doVariable")then{_doVariable=false;};
if(isNil "_trgt")then{_trgt=player;};
diag_log format["Epoch: ADMIN: Antagonist %1 Spawning on %2. Do variable: %3.", _unitClass, _trgt, _doVariable];
if(random 100 < 6)then{
[] execFSM "\x\addons\a3_epoch_code\System\Event_Air_Drop.fsm";
};
if(_doVariable)then{_unitClass call EPOCH_unitSpawnIncrease;};//Assumes Antagonist is required.
_index = EPOCH_spawnIndex find _unitClass;
if (count(player nearEntities[_unitClass, 800]) >= (EPOCH_playerSpawnArray select _index)) exitWith{};
if (!_doVariable && (count(_trgt nearEntities[_unitClass, 800]) >= (EPOCH_playerSpawnArray select _index))) exitWith{};
_nonJammer = ["CfgEpochClient", "nonJammerAI", ["B_Heli_Transport_01_F","PHANTOM","Epoch_Cloak_F"]] call EPOCH_fnc_returnConfigEntryV2;
_nonTrader = ["CfgEpochClient", "nonTraderAI", ["B_Heli_Transport_01_F","PHANTOM","Epoch_Cloak_F","GreatWhite_F"]] call EPOCH_fnc_returnConfigEntryV2;
@ -28,18 +32,22 @@ _nonTraderAIRange = ["CfgEpochClient", "nonTraderAIRange", 150] call EPOCH_fnc_r
_unit = objNull;
_targetPos = getPosATL player;
_targetPos = getPosATL _trgt;
_targetPos set [2,0];
_jammers = [];
_config = 'CfgEpochClient' call EPOCH_returnConfig;
_jammerRange = getNumber(_config >> "buildingJammerRange");
_jammers = nearestObjects[_targetPos, ["PlotPole_EPOCH"], _jammerRange];
if(count _jammers > 0 && (_unitClass in _nonJammer))exitWith{};
if(count _jammers > 0 && (_unitClass in _nonJammer))exitWith{
if(_doVariable)then{["<t size='1.6' color='#99ffffff'>Not allowed near a base - Please respawn !</t>", 5] call Epoch_dynamicText;};
};
_restricted = [];
_restricted = nearestObjects [_targetPos, ["ProtectionZone_Invisible_F"], _nonTraderAIRange];
if(count _restricted > 0 && (_unitClass in _nonTrader))exitWith{};
if(count _restricted > 0 && (_unitClass in _nonTrader))exitWith{
if(_doVariable)then{["<t size='1.6' color='#99ffffff'>Not allowed near a trader - Please respawn !</t>", 5] call Epoch_dynamicText;};
};
_disableAI = {
{_this disableAI _x}forEach["TARGET","AUTOTARGET","FSM"];
@ -49,11 +57,11 @@ switch _unitClass do {
case "Epoch_Cloak_F": {
_unit = createAgent[_unitClass, _targetPos, [], 256, "FORM"];
_unit call _disableAI;
[_unit] execFSM "\x\addons\a3_epoch_code\System\cloak.fsm";
[_unit,_trgt] execFSM "\x\addons\a3_epoch_code\System\cloak.fsm";
};
case "GreatWhite_F": {
if (surfaceIsWater _targetPos) then{
if (((_targetPos vectorDiff getPosASL player) select 2) > 25) then{
if (((_targetPos vectorDiff getPosASL _trgt) select 2) > 25) then{
_unit = createAgent[_unitClass, _targetPos, [], 120, "FORM"];
_unit call _disableAI;
[_unit] execFSM "\x\addons\a3_epoch_code\System\Shark_Brain.fsm";
@ -61,19 +69,19 @@ switch _unitClass do {
};
};
case "Epoch_Sapper_F": {
if(random 100 < 6)then{
if(random 100 < 6 && isNull _trgt)then{
_config = 'CfgEpochSapper' call EPOCH_returnConfig;
_sapperNum = 8;
if(getNumber(_config >> "sapperMigrationCount") > 0)then{
_sapperNum = getNumber(_config >> "sapperMigrationCount");
};
[player,_sapperNum] execVM "epoch_code\compile\EPOCH_callSapperMigration.sqf";
[_trgt,_sapperNum] execVM "epoch_code\compile\EPOCH_callSapperMigration.sqf";
}else{
_unit = createAgent[_unitClass, _targetPos, [], 256, "FORM"];
_bomb = createVehicle ["Sapper_Charge_Ammo", _targetPos, [], 0, "CAN_COLLIDE"];
_bomb attachTo [_unit, [0,0,0],"Pelvis"];
_unit call _disableAI;
sapperHndl = [_unit, _bomb] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain.fsm";
sapperHndl = [_unit, _bomb, _trgt] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain.fsm";
_unit addEventHandler ["FiredNear", "sapperHndl setFSMVariable [""_sFiredNear"",[_this select 1, _this select 2]];"];
_unit addEventHandler ["Hit", "sapperHndl setFSMVariable [""_sHit"",[_this select 1, _this select 2]];"];
};
@ -83,12 +91,12 @@ switch _unitClass do {
_bomb = createVehicle["SapperB_Charge_Ammo", _targetPos, [], 0, "CAN_COLLIDE"];
_bomb attachTo[_unit, [0, 0, 0], "Pelvis"];
_unit call _disableAI;
sapperHndl = [_unit, _bomb] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain2.fsm";
sapperHndl = [_unit, _bomb, _trgt] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain2.fsm";
_unit addEventHandler["FiredNear", "sapperHndl setFSMVariable [""_sFiredNear"",[_this select 1, _this select 2]];"];
_unit addEventHandler["Hit", "sapperHndl setFSMVariable [""_sHit"",[_this select 1, _this select 2]];"];
};
case "I_UAV_01_F": {
_targetPos = getPosATL player;
_targetPos = getPosATL _trgt;
_targetPos = [_targetPos, 600, 1200, 5, 0, 400, 0] call BIS_fnc_findSafePos;
_targetPos set[2, 600];
_unit = createVehicle["I_UAV_01_F", _targetPos, [], 0, "FLY"];
@ -97,7 +105,7 @@ switch _unitClass do {
_grp = createGroup RESISTANCE;
_driver = _grp createUnit["I_UAV_AI", position _unit, [], 0, "CAN_COLLIDE"];
_driver moveInAny _unit;
[_unit, player] execFSM "\x\addons\a3_epoch_code\System\Copter_brain.fsm";
[_unit, _trgt] execFSM "\x\addons\a3_epoch_code\System\Copter_brain.fsm";
};
case "PHANTOM": {
[] execFSM "\x\addons\a3_epoch_code\System\Phantom_Brain.fsm";
@ -107,6 +115,12 @@ switch _unitClass do {
};
};
if(_doVariable && (!isNull _unit) && (!isNull _trgt))then{
_trgt setVariable ["EPOCH_antagObj", _unit, true];
if!(isNull _bomb)then{
_trgt setVariable ["EPOCH_antagBomb", _bomb, true];
};
};
if !(isNull _unit) then {
// send to server
[_unit] remoteExec ["EPOCH_localCleanup",2];

View File

@ -4,7 +4,7 @@
Contributors:
Description:
Epoch cursorTarget anywhere
Direction from one object to another plus a degree value to chose a random direction within.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
@ -18,7 +18,7 @@
Parameter(s):
_this select 0: (ARRAY or OBJECT) - position1
_this select 1: (ARRAY or OBJECT) - position2
_this select 2: NUMBER - random spread [optional: default 32]
_this select 2: NUMBER - random spread [optional: default 32] max 360
Returns:
SCALAR - (direction 0-360)

View File

@ -0,0 +1,65 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors:
Description:
Switch player camera to antagonist. Currently only for use after player death. Return to player body when finished or revived.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf
Example:
[_antagonistObj,_plyrObj] call EPOCH_fnc_playerAttachToAntagonist;
Parameter(s):
_this select 0: OBJECT - Antagonist Object
_this select 1: OBJECT - Player Object
Returns:
*/
params ["_player", "_antagonist", "_bomb","_killer"];
private _tapDiag = "TapOut";
if (visibleMap) then {openMap [false, true];};
_antagonist switchCamera "Internal";
if(isNil "_bomb")then{_bomb = objNull;};
if(typeOf _antagonist == "Epoch_Sapper_F" || typeOf _antagonist == "Epoch_SapperB_F")then{_tapDiag = "TapOut3";};
createDialog _tapDiag;
diag_log format["Epoch: DEBUG: Attaching player %1 to %2, bomb found: %3",_player,_antagonist,_bomb];
[_antagonist,_tapDiag,_player,_killer] spawn{
_antagonist2 = _this select 0;
_tapDiag2 = _this select 1;
_player2 = _this select 2;
_killer2 = _this select 3;
private _doingGroan = false;
private _doingBoom = false;
private _groanTime = diag_tickTime;
while {!alive _player2} do {
if (playerRespawnTime <= 1) exitWith{ (findDisplay 46) closeDisplay 0; };
if (playerRespawnTime > 15 && !dialog) then {createDialog _tapDiag2;};
if (isObjectHidden _player2) exitWith {[_player2,Epoch_personalToken,_killer2, "EPOCH_antagObj", objNull, true] remoteExec ["EPOCH_server_playerSetVariable",2];closeDialog 2;};//revivial
if((!alive _antagonist2)) exitWith {
[_player2,Epoch_personalToken,_killer2, "EPOCH_antagObj", objNull, true] remoteExec ["EPOCH_server_playerSetVariable",2];
uiSleep 3;(findDisplay 46) closeDisplay 0;};
if(_player2 getVariable["EPOCH_callGroan",false])then{
_player2 setVariable["EPOCH_callGroan",false];
_doingGroan = true;
_groanTime = diag_tickTime;
[_player2,Epoch_personalToken,_killer2, "EPOCH_callGroan", true, false] remoteExec ["EPOCH_server_playerSetVariable",2];
};
if(_player2 getVariable["EPOCH_callBoom",false])then{
_player2 setVariable["EPOCH_callBoom",false];
_doingBoom = true;
[_player2,Epoch_personalToken,_killer2, "EPOCH_callBoom", true, false] remoteExec ["EPOCH_server_playerSetVariable",2];
};
if(_doingGroan && ctrlEnabled 1602)then{ctrlEnable[1602,false];};
if(_doingGroan && !(ctrlEnabled 1602) && diag_tickTime - _groanTime > 16)then{ctrlEnable[1602,true];_doingGroan=false;};
if(_doingBoom && ctrlEnabled 1601)then{ctrlEnable[1601,false];};
uiSleep 0.1;
};
};

View File

@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
Contributors:
Contributors: Andrew Gregory
Description:
Player death handler
@ -22,6 +22,8 @@
Returns:
BOOL
*/
private _tapDiag = "TapOut";
private _doRevenge = false;
params ["_unit", "_killer"];
// test ejecting unit from vehicle if dead client side
@ -36,21 +38,26 @@ EPOCH_buildMode = 0;
EPOCH_snapDirection = 0;
EPOCH_Target = objNull;
if(player != _killer && (isPlayer _killer || isPlayer (effectiveCommander _killer)))then{_tapDiag = "TapOut2";};//TODO: vehicle check may not always be reliable
if (Epoch_canBeRevived) then {
setPlayerRespawnTime 600;
createDialog "TapOut";
createDialog _tapDiag;
} else {
setPlayerRespawnTime 15;
["<t size='1.6' color='#99ffffff'>You can be just revived once per life!</t>", 5] call Epoch_dynamicText;
};
[] spawn{
[_killer, _tapDiag] spawn{
_killer2 = _this select 0;
_tapDiag2 = _this select 1;
while {!alive player} do {
if (playerRespawnTime <= 1) exitWith{ (findDisplay 46) closeDisplay 0; };
if (playerRespawnTime > 15 && !dialog) then {
createDialog "TapOut";
};
if (playerRespawnTime > 15 && !dialog) then {createDialog _tapDiag2;};
if (isObjectHidden player) then {closeDialog 2;};
if(player getVariable["EPOCH_doBoom",false])exitWith{player setVariable ["EPOCH_doBoom",nil];[player] call EPOCH_fnc_playerDeathDetonate;};
if(player getVariable["EPOCH_doMorph",false])exitWith{player setVariable ["EPOCH_doMorph",nil];[selectRandom (getArray (getMissionConfig "CfgEpochClient" >> "deathMorphClass")),player,_killer2] call EPOCH_fnc_playerDeathMorph;};
uiSleep 0.1;
};
};

View File

@ -0,0 +1,36 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors:
Description:
Detonate player body.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf
Example:
[] call EPOCH_fnc_playerDeathDetonate;
Parameter(s):
Returns:
BOOM
*/
params ["_player"];
openmap [false,false];
closeDialog 2;
[_player, Epoch_personalToken] remoteExec ["EPOCH_server_deadPlayerDetonate",2];
deleteVehicle player;
player setVariable ["doneBoom", true];
[] spawn{
while {!alive player} do {
//Handle clean up
if(player getVariable["doneBoom",false])exitWith{player setVariable ["doneBoom",nil]; uiSleep 5; (findDisplay 46) closeDisplay 0;};
uiSleep 0.1;
};
};

View File

@ -0,0 +1,38 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors:
Description:
Morph dead player body into an antagonist, called from player death GUI. Dead player camera will attach to antagonist.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf
Example:
[] call EPOCH_fnc_playerDeathMorph;
Parameter(s):
_this select 0: STRING - Antagonist class
_this select 1: OBJECT - Player (Victim)
_this select 2: OBJECT - Target Player (Killer)
Returns:
*/
params ["_antagonistClass", "_player", "_killer"];
openmap [false,false];
[_killer,_antagonistClass,true,_player, Epoch_personalToken] remoteExec ["EPOCH_server_triggerAntagonist",2];
[_killer,_player] spawn{
_killer2 = _this select 0;
_player2 = _this select 1;
while {!alive player} do {
if (isObjectHidden _player2) then {closeDialog 2;};
if!(isNull (_killer2 getVariable["EPOCH_antagObj",objNull])) exitWith {closeDialog 2;[_player2,(_killer2 getVariable["EPOCH_antagObj",objNull]),(_killer2 getVariable["EPOCH_antagBomb",objNull]),_killer2] call EPOCH_fnc_playerAttachToAntagonist;};
uiSleep 0.1;
};
};

View File

@ -0,0 +1,30 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors:
Description:
call setVariable from client. Allows the server to call and set a local variable on an object via a player without broadcasting.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf
Example:
[_obj,_var,_value,_local] call EPOCH_fnc_playerSetVariable;
Parameter(s):
_this select 0: OBJECT - Object to attach variable to
_this select 1: STRING - Variable Name
_this select 2: ANYTHING - Variable Value
_this select 3: BOOLEAN - Broadcast ?
Returns:
*/
params ["_obj", "_var", "_value", "_local"];
if(isNil "_local")then{_local = false;};
diag_log format["Epoch: ADMIN: Attempting Set variable [%2,%3,%4] on %1.", _obj, _var, _value,_local];
_obj setVariable [_var,_value,_local];

View File

@ -0,0 +1,27 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors: Aaron Clark
Description:
Send server message to trigger antagonist on another client. Server returns antagonist object where required. Designed to support additional tap out options (Morphing).
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf
Example:
[_killer, "Epoch_Sapper_F", player, true] call EPOCH_fnc_triggerAntagonist;
Parameter(s):
_this select 0: Target client to trigger antagonist on. (Killer)
_this select 1: Antagonist class to spawn, e.g. "Epoch_Sapper_F", see EPOCH_unitSpawn.sqf for full list
_this select 2: On target, set variable containing antagonist object. Allows other players / requesting player to attach to antagonist object.
Returns:
*/
params ["_target","_antagonist","_doVariable"];
[_target,_antagonist,_doVariable,player,Epoch_personalToken] remoteExec ["EPOCH_server_triggerAntagonist",2];

View File

@ -112,6 +112,11 @@ class CfgClientFunctions
class fnc_findSapperStalkLocation {};
class fnc_dirToFuzzy {};
class fnc_cursorTarget {};
class fnc_triggerAntagonist {};
class fnc_playerDeathDetonate {};
class fnc_playerDeathMorph {};
class fnc_playerSetVariable {};
class fnc_playerAttachToAntagonist {};
};
class environment
{

View File

@ -1,6 +1,6 @@
/*
Author: Aaron Clark - EpochMod.com
Contributors:
Contributors: Andrew Gregory
Description:
Main Client side configs for the Epoch gamemode
@ -13,7 +13,7 @@
*/
class CfgEpochClient
{
epochVersion = "0.3.8.0";
epochVersion = "0.3.9.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
buildingNearbyMilitary = 0; //1 to allow building nearby
@ -23,6 +23,7 @@ class CfgEpochClient
buildingJammerRange = 75; // jammer range in meters
disableRemoteSensors = true; // disableRemoteSensors true
EPOCH_news[] = {"Word is that Sappers have a new boss.","Dogs will often lure them monsters away.","My dog was blown up. I miss him.."};
deathMorphClass[] = {"Epoch_Sapper_F","Epoch_SapperB_F","I_UAV_01_F","Epoch_Cloak_F"};//Random selection of these classes when player morphs after death. Currently available: Epoch_Cloak_F, Epoch_SapperB_F, Epoch_Sapper_F, I_UAV_01_F
antagonistSpawnIndex[] = {
{"Epoch_Cloak_F", 1}, // {"type", limit}
{"GreatWhite_F", 2},
@ -57,16 +58,16 @@ class CfgEpochClient
// Event handler code
displayAddEventHandler[] = {"keyDown","keyUp"};
keyDown = "(_this call EPOCH_KeyDown)";
keyUp = "(_this call EPOCH_KeyUp)";
keyDown = "(_this call EPOCH_KeyDown)";
keyUp = "(_this call EPOCH_KeyUp)";
addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","Fired","Killed","HandleRating","GetInMan","GetOutMan"};
Respawn = "(_this select 0) call EPOCH_clientRespawn";
Put = "(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler";
Take = "(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck";
Fired = "_this call EPOCH_fnc_playerFired;";
InventoryClosed = "if !(EPOCH_arr_interactedObjs isEqualTo[]) then {[EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; EPOCH_arr_interactedObjs = [];};";
Take = "(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck";
Fired = "_this call EPOCH_fnc_playerFired;";
InventoryClosed = "if !(EPOCH_arr_interactedObjs isEqualTo[]) then {[EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; EPOCH_arr_interactedObjs = [];};";
InventoryOpened = "_this spawn EPOCH_initUI;_container = _this select 1;_lockedNear = false;if (_container isKindOf 'GroundWeaponHolder' || _container isKindOf 'WeaponHolderSimulated') then {{if (locked _x in [2, 3] ||_x getVariable['EPOCH_Locked', false]) exitWith {_lockedNear = true}} forEach (player nearSupplies 10);};if (locked _container in [2, 3] || _container getVariable['EPOCH_Locked', false] || _lockedNear) then {[] spawn {disableSerialization;waitUntil {!isNull findDisplay 602};_display = findDisplay 602;_ctrl_cargo = _display displayCtrl 6401;_ctrl_ground = _display displayCtrl 6321;_ctrl_cargo ctrlEnable false;ctrlSetFocus _ctrl_ground;ctrlActivate _ctrl_ground;};};";
Killed = "_this call EPOCH_fnc_playerDeath;";
Killed = "_this call EPOCH_fnc_playerDeath;";
HandleRating = "EPOCH_playerKarma = EPOCH_playerKarma + (_this select 1);0";
HandleDamage = "";
HandleHeal = "";
@ -108,6 +109,10 @@ class CfgEpochSapper
groanTrig = 16; //Percentage chance of a groan. Min value = 4
sRange = 300; //Distance from target over which sapper will dispose. Range within which sapper code will be aware of targets. Distance up to which sapper will attempt to find a spot to hide in. Min Value = 150.
smellDist = 24; //Distance up to which sapper can smell. Used to decide if sapper can see target when deciding to charge and influences target selection. Is influenced by wind direction. Min Value = 8.
reflexSpeed = 0.25; //Sapper brain will pause for this time when checking for new stimulus during each thought process. Lower number equals a more reactive sapper. (Guide Min 0.25 - Max 2.5).
nestChance = 2; //Every time a sapper spawns apply this percentage chance that sapper will create a nest.
hideLevel = 72; //(Emotion) Sapper fear increases by several factors, higher number of armed player(s) in area / being shot at. Set fear level (out of 100) at which he will go into a 'hide / evade mode'.. temporarily.
chargeLevel = 52; //(Emotion) Sapper anger increases by smelling / sensing players, being shot at / hit, too many players on his turf. Set level (Out of 100) at which he is triggered to charge on the current target.
};
class CfgEpochUAV
{
@ -115,6 +120,22 @@ class CfgEpochUAV
UAVMaxDist = 180; //Maximum distance to choose next position when roaming. Min Value = 42 / Max Value = 400.
UAVHeight = 100; //Set height when roaming, slight randomness is applied to this value. UAV will choose own height when locked onto target. Min Value = 42 / Max Value = 280. UAV can still spot targets from height !
};
class CfgEpochUAVSupport
{
unitTypes[] = {"I_Soldier_EPOCH", "I_Soldier2_EPOCH", "I_Soldier3_EPOCH"};//Selects from randomly
maxUnitNum = 2; //Maximum number of units spawned when UAV spots target.
minAISkill = 0.2; //Minumum AI Skill. Skills are chosen randomly between this minimum overall AI skill value and the following max AI skill values, for each of the next skills:
maxAimingAccuracy = 0.7;
maxAimingShake = 0.9;
maxAimingSpeed = 0.6;
maxEndurance = 0.4;
maxSpotDistance = 0.4;
maxSpotTime = 0.3;
maxCourage = 0.3;
maxReloadSpeed = 0.5;
maxCommanding = 0.4;
maxGeneral = 0.4;
};
class CfgEpochAirDrop
{
AirDropFreq = 1200; //AirDropChance, to decide if Air drop occurs, will only be checked once per AirDropFreq time period, for each player. Min value = 120.

View File

@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
Contributors:
Contributors: Andrew Gregory
Description:
RemoteExec whitelist for Epoch sandbox gamemode. This also blacklists default A3 remoteExec commands.
@ -197,6 +197,19 @@ class CfgRemoteExec
allowedTargets=2;
jip = 0;
};
class EPOCH_server_triggerAntagonist {
allowedTargets=2;
jip = 0;
};
class EPOCH_server_deadPlayerDetonate {
allowedTargets=2;
jip = 0;
};
class epoch_server_playersetvariable {
allowedTargets=2;
jip = 0;
};
};
class Commands {mode=0;};
};

View File

@ -1 +1 @@
build=439;
build=443;

View File

@ -1 +1 @@
build=439;
build=443;

View File

@ -0,0 +1,24 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors: Aaron Clark
Description:
Trigger an antagonist on a client. Option to add antagonist object to target as a variable.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf
*/
params ["_target","_antagonistClass","_doVariable","_player","_token"];
diag_log format["Epoch: ADMIN: Attempting antagonist (%3) trigger from %1 for %2.", getPlayerUID _player, _target, _antagonistClass];
if !([_player,_token]call EPOCH_server_getPToken)exitWith{};
if(!isNull _target)then{
diag_log format["Epoch: ADMIN: Calling antagonist (%3) trigger from %1 for %2.", getPlayerUID _player, _target, _antagonistClass];
[_antagonistClass, _target, _doVariable] remoteExec ["EPOCH_unitSpawn",_target];
//if(!isNull _player)then{hideObjectGlobal _player;};//Do elsewhere, allow revival
};

View File

@ -73,7 +73,6 @@ for "_i" from 0 to _this do {
if (isClass (configFile >> "CfgVehicles" >> _class) && (_damage < 1) && !(_class isKindOf 'Constructions_lockedstatic_F')) then {
_baseObj = createVehicle [_class, [0,0,0], [], 0, "CAN_COLLIDE"];
_baseObj setposATL _location;
_baseObj setVectorDirAndUp _worldspace;

View File

@ -43,7 +43,7 @@ _stableCount = 0;
_playerUID = _x getVariable["BUILD_OWNER", "-1"];
_slot = _x getVariable["EPOCH_secureStorage", "-1"];
deleteVehicle _x;
_newObj = createVehicle[_class, _objectPos, [], 0, "CAN_COLLIDE"];
_newObj = createVehicle[_class, [0,0,0], [], 0, "CAN_COLLIDE"];
_newObj setVariable["BUILD_SLOT", _objSlot, true];
_newObj setposASL _objectPos;
_newObj setVectorDirAndUp[_vDir, _vUP];

View File

@ -33,7 +33,7 @@ if (_objSlot != -1) then {
deleteVehicle _object;
_class = _upgrade select 0;
_newObj = createVehicle [_class, _objectPos, [], 0, "CAN_COLLIDE"];
_newObj = createVehicle [_class, [0,0,0], [], 0, "CAN_COLLIDE"];
_newObj setVariable ["BUILD_SLOT",_objSlot,true];
_newObj call EPOCH_server_buildingInit;
_newObj setposATL _objectPos;

View File

@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
Author: Andrew Gregory - EpochMod.com
Contributors:
Contributors: Aaron Clark
Description:
Creates air drop crate

View File

@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
Author: Andrew Gregory - EpochMod.com
Contributors:
Contributors: Aaron Clark
Description:
Creates helicopter air drop

View File

@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
Author: Andrew Gregory - EpochMod.com
Contributors:
Contributors: Aaron Clark
Description:
Server side spawing of shipwreck loots

View File

@ -0,0 +1,22 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors: Aaron Clark
Description:
Detonate a boss sapper bomb at player position.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_playerDeathOptions.sqf
*/
params ["_player", "_token"];
diag_log format["Epoch: ADMIN: Attempting player detonate on %1.", getPlayerUID _player];
if !([_player,_token]call EPOCH_server_getPToken)exitWith{};
_pos = getPosATL _player;
_bomb = createVehicle["SapperB_Charge_Ammo", _pos, [], 0, "CAN_COLLIDE"];
_bomb setDamage 1;
hideObjectGlobal _player;

View File

@ -0,0 +1,18 @@
/*
Author: Andrew Gregory - EpochMod.com
Contributors:
Description:
Call setVariable on specific client.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_playerSetVariable.sqf
*/
params ["_player","_token","_obj", "_var", "_value", "_local"];
if !([_player,_token]call EPOCH_server_getPToken)exitWith{};
diag_log format["Epoch: ADMIN: Attempting Set variable [%2,%3,%4] on %1.", _obj, _var, _value,_local];
[_obj, _var,_value,_local] remoteExec ['EPOCH_fnc_playerSetVariable', _obj];

View File

@ -71,13 +71,14 @@ class CfgServerFunctions
class server_savePlayer {};
class server_loadPlayer {};
class server_checkPlayer {};
// class server_respawnPlayer {};
class server_onPlayerDisconnect {};
class server_deadPlayer {};
class server_revivePlayer {};
class server_storeCrypto {};
class server_equippedItem {};
class server_unpackBackpack {};
class server_deadPlayerDetonate{};
class server_playerSetVariable{};
};
class epoch_traders {
class server_loadTraders {};
@ -132,12 +133,13 @@ class CfgServerFunctions
class server_handle_say3D {};
class server_handle_switchMove {};
class server_handle_sapperObjs {};
class server_triggerAntagonist{};
};
};
};
class CfgServerVersion
{
client = "0.3.8.0";
config = "0.3.8.0";
client = "0.3.9.0";
config = "0.3.9.0";
hive = "0.5.1.7";
};

View File

@ -12,6 +12,8 @@
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server/init/server_securityfunctions.sqf
*/
private ["_code","_functionName","_remoteExecClientStr","_onLoad","_onUnload","_skn_blockedSpawnMenuUID","_temp","_skn_adminMenuOwner","_case","_skn_adminMenuHigh","_skn_adminMenuLow","_config","_debugClass","_cfg_systemDebug","_skn_systemDebug1","_skn_systemDebug2","_skn_systemDebug3","_skn_systemDebug4","_skn_systemDebug5","_cfg_remoteExecClient","_remoteExecClient_NAMES","_cfg_limits","_skn_playerCryptoLimit","_cfg_learning","_skn_trustedUsers","_str_learningModeCheck","_cfg_quality","_skn_perfMode","_skn_viewDistance","_skn_viewDistanceObects","_skn_terrainGrid","_cfg_blacklistConfig","_skn_badDisplaysArray","_skn_badAnimations","_cfg_variablesConfig","_skn_badVarCheckArray","_skn_nilVarCheckArray","_skn_commandMenuArray","_skn_addEHConfig","_skn_displayAddEHChecks","_skn_addEHArray","_serverSettingsConfig","_skn_enableAntihack","_skn_check_addons","_checkFiles","_skn_check_files","_whitelistPatches","_skn_whitelist_cfgPatches","_skn_adminsOwner","_skn_adminsHigh","_skn_adminsLow","_banReasons","_skn_banReason","_antihack_banDuration","_epoch_banReasons","_kickReasons","_epoch_kickReason","_epoch_kickReasons","_ownerSettings","_skn_adminMenuOwnerSetting","_adminSettings","_skn_adminMenuHighSetting","_lowSettings","_skn_adminMenuLowSetting","_skn_adminMenuMenuKey","_skn_adminMenuInfrontTeleport","_skn_adminMenuBanReasons","_skn_adminMenuCryproCfg","_skn_cfgPatchesCfg","_skn_PVSPrefix","_rndVAR_Count","_skn_rndVA","_skn_PVC_INDEX","_skn_AH_rndVarVehicle","_skn_AH_rndVarPlayer","_skn_AH_rndVarAHInitCheck","_skn_AH_Init","_skn_AH_Code","_skn_AH_Code_CA","_skn_AH_Code_CB","_skn_AH_Ban","_skn_AH_rndVar","_skn_doKickBan","_skn_server_getRealTime","_skn_pv_hackerLog","_skn_pv_adminLog","_skn_server_adminLog","_skn_doAdminRequest","_skn_doAdminLog","_skn_doTokenAuth","_skn_antiTeleportPVC","_skn_Admin_Code","_skn_Admin_Init","_skn_adminRequest_PVC","_skn_adminLog_PVC","_skn_adminLog","_skn_AdminKeyDown","_skn_AdminMenu_Init","_skn_getCtrl","_skn_fnc_Spec","_skn_Update_AdminButtons","_skn_mainMenuCfg","_skn_FillMainMenu","_skn_FillPlayerMenu","_skn_switchMainMenu","_skn_dbClickMainMenu","_skn_spawnMenu","_skn_spawnSpawnMenu","_skn_removespawnMenu","_skn_fillSpawnMenu","_skn_hackerLog","_skn_switchTable","_skn_customBanreason","_skn_flipVehicle","_skn_freeCam","_skn_delete","_skn_deleteMenu","_skn_deleteNow","_skn_doBan","_skn_mapTeleport","_skn_old_esp","_skn_hideAdmin","_skn_old_espMap","_skn_infrontTP","_skn_esp","_skn_godMode","_skn_repairVehicle","_skn_spawnLoot","_skn_mapLootArray","_skn_tg_Spec","_skn_tg_sortOrder","_skn_tg_toggle","_skn_tg_BanPlayer","_skn_tg_delete","_skn_tg_mapTeleport","_skn_tg_spawnTyp","_skn_tg_limitSpawn","_skn_tg_old_espMap","_skn_tg_old_esp","_skn_tg_hideAdmin","_skn_tg_infrontTP","_skn_tg_godMode","_skn_tg_map_player","_skn_tg_map_corpse","_skn_tg_map_loot","_skn_tg_map_vehicle","_skn_tg_map_ai","_skn_tg_map_basebuilding","_skn_t1","_skn_t2","_skn_t3","_skn_t4","_skn_t5","_skn_AH_rndVarAHInitCheckToken","_stringInArray","_displaysArray","_displays","_escapeQuotes","_cfg_displayArray","_skn_adminUIDArray","_skn_adminNAMEArray","_skn_tempuid","_skn_spawnPointCenter","_centerDistance","_sknBanANDSleep","_sknBanANDSleepQuick","_sknPatches","_skn_addonCheckCode","_skn_fileCheckCode","_sknAddActionCheck","_skn_code_ban","_skn_code_init","_skn_code_antihack","_skn_admincode","_skn_admininit"];
_config = (configFile >> "CfgSecConf");
if (isClass _config) then {diag_log "Loading config..."};
@ -75,7 +77,17 @@ _skn_whitelist_cfgPatches = [_serverSettingsConfig, "antihack_whitelistedCfgPatc
_skn_adminsOwner = [_serverSettingsConfig, "adminMenu_Owner", []] call EPOCH_fnc_returnConfigEntry;
_skn_adminsHigh = [_serverSettingsConfig, "adminMenu_High", []] call EPOCH_fnc_returnConfigEntry;
_skn_adminsLow = [_serverSettingsConfig, "adminMenu_Low", []] call EPOCH_fnc_returnConfigEntry;
_banReasons = [
"Mod mismatch, check that the mods you have enabled match server."
];
_skn_banReason = [_serverSettingsConfig, "antihack_banReason", "EpochMod.com Autoban"] call EPOCH_fnc_returnConfigEntry;
_antihack_banDuration = [_serverSettingsConfig, "antihack_banDuration", 5] call EPOCH_fnc_returnConfigEntry;
_epoch_banReasons = [_serverSettingsConfig, "antihack_banReasons", _banReasons] call EPOCH_fnc_returnConfigEntry;
_kickReasons = [
"Mod mismatch, check that mods enabled match server."
];
_epoch_kickReason = [_serverSettingsConfig, "antihack_kickReason", "EpochMod.com Autokick"] call EPOCH_fnc_returnConfigEntry;
_epoch_kickReasons = [_serverSettingsConfig, "antihack_kickReasons", _kickReasons] call EPOCH_fnc_returnConfigEntry;
_ownerSettings = ["ESP-PLAYER","ESP-VEHICLE","ESP-LOOT","OLD-ESP","OLD-MAP","PLAYER-TELEPORT","MAP-TELEPORT","INFRONT-TELEPORT","MAP-PLAYER","MAP-CORPSE","MAP-LOOT","MAP-VEHICLE","MAP-AI","MAP-BASEBUILDING","TARGET-HEAL","TARGET-AMMO","TARGET-KILL","TARGET-CRYPTO","TARGET-VEHICLEREPAIR","VEHICLEFLIP","BANPANNEL","SPAWN-MENU","FREE-CAM","INVISIBLE","SPAWNLOOT","GODMODE","HEAL","VEHICLEREPAIR"];
_skn_adminMenuOwnerSetting = [_serverSettingsConfig, "adminMenu_OwnerSetting", _ownerSettings] call EPOCH_fnc_returnConfigEntry;
_adminSettings = ["PLAYER-TELEPORT","MAP-TELEPORT","TARGET-HEAL","TARGET-AMMO","TARGET-KILL","VEHICLEFLIP","BANPANNEL"];
@ -86,30 +98,14 @@ _skn_adminMenuMenuKey = [_serverSettingsConfig, "adminMenu_menuKey", 0x3B] call
_skn_adminMenuInfrontTeleport = [_serverSettingsConfig, "adminMenu_infrontTeleport", 0x06] call EPOCH_fnc_returnConfigEntry;
_skn_adminMenuBanReasons = [_serverSettingsConfig, "adminMenu_BanReasons", ["Traderzone","Hacking","Glitch","Combat Log"]] call EPOCH_fnc_returnConfigEntry;
_skn_adminMenuCryproCfg = [_serverSettingsConfig, "adminMenu_cryptoCfg", [2500,1000,500,100,50,-1000]] call EPOCH_fnc_returnConfigEntry;
_skn_cfgPatchesCfg = [_serverSettingsConfig, "antihack_cfgPatchesCfg", [0]] call EPOCH_fnc_returnConfigEntry;
_skn_cfgPatchesCfg = [_serverSettingsConfig, "antihack_cfgPatchesMode", [2]] call EPOCH_fnc_returnConfigEntry;
_skn_PVSPrefix = [_serverSettingsConfig, "antihack_PVSPrefix", "EPAH_"] call EPOCH_fnc_returnConfigEntry;
_skn_customVariablesCheck = [_serverSettingsConfig, "antihack_customVariablesCheck", true] call EPOCH_fnc_returnConfigEntry;
_skn_customVariables = [_serverSettingsConfig, "antihack_customVariables", []] call EPOCH_fnc_returnConfigEntry;
// build array with X number of random strings
_rndVAR_Count = 84; // 85 = number of (_skn_rndVA deleteAt 0)
_skn_rndVA = call compile('epochserver' callExtension format['810|%1', _rndVAR_Count]);
EPOCH_hiveWhitelistVarsArray = [];
if (_skn_customVariablesCheck) then{
_whitelistConfig = _cfg_variablesConfig >> "whitelist";
_skn_customVariables append(getArray(_whitelistConfig >> "bis")); //BIS Variables
_skn_customVariables append(getArray(_whitelistConfig >> "epoch")); //Epoch Variables
_skn_customVariables append(getArray(_whitelistConfig >> "custom")); //Custom Variables
// Get any automatically added whitelist vars from Learning feature.
_response = ["AH-WhitelistVars", (call EPOCH_fn_InstanceID)] call EPOCH_fnc_server_hiveGETRANGE;
if ((_response select 0) == 1 && (_response select 1) isEqualType []) then{
if !((_response select 1) isEqualTo[]) then{
EPOCH_hiveWhitelistVarsArray = _response select 1;
_skn_customVariables append EPOCH_hiveWhitelistVarsArray;
};
};
};
// For client PVC
_skn_PVC_INDEX = _skn_rndVA deleteAt 0;
@ -150,7 +146,6 @@ if (!_skn_enableAntihack) exitWith {
EPOCH_server_isPAdmin = compileFinal ("false");
EPOCH_server_Authed = compileFinal ("true");
EPOCH_server_disconnect = compileFinal("true");
EPOCH_server_kickToLobby = compileFinal("true");
};
// Check AH init code
@ -250,21 +245,6 @@ _skn_t3 = _skn_rndVA deleteAt 0;
_skn_t4 = _skn_rndVA deleteAt 0;
_skn_t5 = _skn_rndVA deleteAt 0;
_skn_kickToLobby = _skn_rndVA deleteAt 0;
_skn_whitelistVars = _skn_rndVA deleteAt 0;
if (_skn_customVariablesCheck) then{
// Gather all random global vars from AH for whitelist var checks
_skn_customVariables append [_skn_PVC_INDEX,_skn_whitelistVars,_skn_kickToLobby,toLower(_skn_doKickBan),toLower(_skn_doTokenAuth)];
_skn_customVariables append [_skn_AH_Init,_skn_AH_Code,_skn_AH_Code_CA,_skn_AH_Code_CB,_skn_AH_Ban,_skn_antiTeleportPVC,_skn_Admin_Init];
_skn_customVariables append [toLower("FW"+_skn_AH_rndVar),toLower("FA"+_skn_AH_rndVar),toLower("FWC"+_skn_AH_rndVar)];
// Globally brodcast whitelist vars array
missionNamespace setVariable [_skn_whitelistVars,_skn_customVariables,true];
};
EPOCH_server_kickToLobby = compileFinal ("if !(isNull _this) then {"+_skn_kickToLobby+" = true;(owner _this) publicVariableClient '"+_skn_kickToLobby+"';};");
_skn_AH_rndVarAHInitCheckToken = _skn_t1+_skn_t2+_skn_t3+_skn_t4+_skn_t5;
EPOCH_server_Authed = compileFinal("_this in "+_skn_AH_rndVarAHInitCheck);
EPOCH_server_disconnect = compileFinal("
@ -547,19 +527,9 @@ _sknBanANDSleepQuick = _skn_AH_Ban+"; uiSleep 1";
_sknPatches = [];
"_sknPatches pushBack (configName _x)" configClasses (configFile >> "CfgPatches");
{_sknPatches pushBackUnique _x}forEach _skn_whitelist_cfgPatches;
_skn_addonCheckCode = if (_skn_check_addons) then {"[] spawn{_config = '!(configName _x in "+str _sknPatches+")' configClasses (configFile >> 'CfgPatches');if !(_config isEqualTo []) then {[format['Disallowed Addon %1',_config],"+str (_skn_cfgPatchesCfg select 0)+"] call "+_skn_AH_Ban+"}};"} else {""};
_skn_addonCheckCode = if (_skn_check_addons) then {"[] spawn{_config = '!(configName _x in "+str _sknPatches+")' configClasses (configFile >> 'CfgPatches');if !(_config isEqualTo []) then {[format['Disallowed Addon %1',_config],["+str (_skn_cfgPatchesCfg select 0)+",0]] call "+_skn_AH_Ban+"}};"} else {""};
_skn_fileCheckCode = if (_skn_check_files isEqualTo []) then {""} else {"{if (str(compile preprocessFileLineNumbers (_x select 0)) != str(missionNamespace getVariable [_x select 1,'']))exitWith{[format['Modified File %1 (%2/%3)',_x select 1,count toArray str (compile preprocessFileLineNumbers (_x select 0)),count toArray str(missionNamespace getVariable [_x select 1,''])],0] call "+_skn_AH_Ban+"}} forEach "+str _skn_check_files+";"};
_sknCustomVarCheckModeCode = [_serverSettingsConfig, "antihack_customVariablesCheckMode", 0] call EPOCH_fnc_returnConfigEntry;
_sknCustomVarCheckCode = if (_skn_customVariablesCheck) then {"
{
if !(_x in (missionNamespace getVariable ["+str _skn_whitelistVars+",[]])) then{
[format['(WIP) Unknown Variable (missionNamespace): %1', _x], ["+str _sknCustomVarCheckModeCode+",[toArray(_x)]]] call "+_sknBanANDSleepQuick+";
}
}forEach(allVariables missionNamespace);
"} else {""};
_sknAddActionCheck = if ([_serverSettingsConfig, "antihack_addActionCheck", true] call EPOCH_fnc_returnConfigEntry) then{ "
if (player == _ActionVehicle) then[{_ActionCount = _ActionCount + 1}, { _ActionVehicle = player; _ActionCount = 0 }];
_addCase = player addAction['', '', [], -5, false, true, '', 'false'];
@ -604,66 +574,52 @@ call compile("'"+_skn_doTokenAuth+"' addPublicVariableEventHandler {
};
};");
//[[_case,_time,_name,_uid,_save],[1, 0, 0, 1]]
call compile ("'"+_skn_doKickBan+"' addPublicVariableEventHandler {
_array = _this select 1;
_player =_array select 2;
if !([_player,_array select 3] call EPOCH_server_getPToken) exitWith {
_array params ['_text','_mode','_player','_token'];
if !([_player,_token] call EPOCH_server_getPToken) exitWith {
['ahe', format['Token is different [%1,%2] %3',if (!isNull _player) then { _player getVariable ['"+_skn_AH_rndVarPlayer+"','']}else{'PlayerObj NULL'}, _array select 3, _array]] call EPOCH_fnc_server_hiveLog;
};
_text = toString(_array select 0);
_mode = _array select 1;
_data = [];
_text = toString(_text);
_reasonIndex = -1;
if (_mode isEqualType []) then{
_mode = (_array select 1) select 0;
_data = (_array select 1) select 1;
_mode = _mode select 0;
_reasonIndex = _mode select 1;
};
if (_mode == 0) then{
['ahb', format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
"+_skn_pv_hackerLog+" pushBack [[0,call "+_skn_server_getRealTime+",name _player,getPlayerUID _player,_text],[1, 0, 0, 1]];
'epochserver' callExtension format['820|%1|"+_skn_banReason+"',getPlayerUID _player];
} else {
if (_mode == 2) then{
_unknownVar = toString(_data select 0);
_safeVars = missionNamespace getVariable ["+str _skn_whitelistVars+",[]];
_trusted = "+_str_learningModeCheck+";
if !(_unknownVar in _safeVars) then{
if (_trusted) then {
_safeVars pushBack _unknownVar;
missionNamespace setVariable ["+str _skn_whitelistVars+",_safeVars,true];
if !(_unknownVar in EPOCH_hiveWhitelistVarsArray) then{
EPOCH_hiveWhitelistVarsArray pushBack _unknownVar;
['AH-WhitelistVars', (call EPOCH_fn_InstanceID), EPOCH_hiveWhitelistVarsArray] call EPOCH_fnc_server_hiveSET;
};
['ahl', format['LEARNING: %1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
"+_skn_pv_hackerLog+" pushBack[[1, call "+_skn_server_getRealTime+", name _player, getPlayerUID _player, format['LEARNING: %1',_text]], []];
} else {
['ahb', format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
"+_skn_pv_hackerLog+" pushBack [[0,call "+_skn_server_getRealTime+",name _player,getPlayerUID _player,_text],[1, 0, 0, 1]];
_banID = 1;
'epochserver' callExtension format['820|%1|"+_skn_banReason+" #V%2',getPlayerUID _player,_banID];
};
_reason = '';
_logName = 'ahl';
_logMode = 1;
_logColor = [1,1,1,1];
switch _mode do {
case 0: {
_logName = 'ahb';
_logColor = [1,0,0,1];
_logMode = 0;
if (_reasonIndex != -1) then {
_reason = "+str(_epoch_banReasons)+" select _reasonIndex;
};
}else {
['ahl', format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
"+_skn_pv_hackerLog+" pushBack[[1, call "+_skn_server_getRealTime+", name _player, getPlayerUID _player, _text], []];
['ban', _player , format['"+_skn_banReason+" %1',_reason], "+str(_antihack_banDuration)+"] call EPOCH_serverCommand;
};
case 2: {
_logName = 'ahk';
_logColor = [0,0,1,1];
if (_reasonIndex != -1) then {
_reason = "+str(_epoch_kickReasons)+" select _reasonIndex;
};
['kick', _player , format['"+_epoch_kickReason+" %1',_reason]] call EPOCH_serverCommand;
};
};
"+_skn_pv_hackerLog+" pushBack[[_logMode, call "+_skn_server_getRealTime+", name _player, getPlayerUID _player, _text], _logColor];
[_logName, format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
{
if (_x call EPOCH_server_isPAdmin) then {
(owner _x) publicVariableClient '"+_skn_pv_hackerLog+"';
};
}forEach playableUnits;
}forEach allPlayers;
};");
//0 = BAN
//1 = LOG
//[2,varname] = Self-learning vars from trusted users.
//2 = KICK
_skn_code_ban = compileFinal ("
_this set [0,toArray (_this select 0)];
@ -679,7 +635,7 @@ _skn_code_init = compileFinal ("
_start = diag_tickTime;
waitUntil {!isNil '"+_skn_AH_Code+"' || (diag_tickTime-_start > 20)};
if (isNil '"+_skn_AH_Code+"') exitWith {
"+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],1,player,Epoch_personalToken];
"+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],2,player,Epoch_personalToken];
publicVariableServer '"+_skn_doKickBan+"';
(findDisplay 46) closeDisplay 0
};
@ -694,7 +650,7 @@ _skn_code_init = compileFinal ("
};
uiSleep 5;
if ((isNil '"+_skn_AH_Code_CA+"') || (isNil '"+_skn_AH_Code_CB+"')) then {
"+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],1,player,Epoch_personalToken];
"+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],2,player,Epoch_personalToken];
publicVariableServer '"+_skn_doKickBan+"';
(findDisplay 46) closeDisplay 0
};
@ -964,7 +920,6 @@ _skn_code_antihack = compileFinal ("
[format['Changed %1 >> onUnload >> %2', _display, getText(configFile>>_display>>'onUnload')],0] call "+_sknBanANDSleep+";
}
}forEach "+str _cfg_displayArray+";
"+_sknCustomVarCheckCode+"
uiSleep ((random 10)+10);
};
};
@ -972,9 +927,6 @@ _skn_code_antihack = compileFinal ("
"+_skn_doTokenAuth+" = [_t,player,Epoch_personalToken];
publicVariableServer '"+_skn_doTokenAuth+"';
"+_skn_doTokenAuth+" = nil;
'"+_skn_kickToLobby+"' addPublicVariableEventHandler {
[] spawn {waitUntil {(findDisplay 46) closeDisplay 0; false}}
};
"+_skn_AH_Code_CB+" = true;
true
");
@ -1006,7 +958,7 @@ call compile ("
if (_x call EPOCH_server_isPAdmin) then {
(owner _x) publicVariableClient '"+_skn_pv_adminLog+"';
};
}forEach playableUnits;
}forEach allPlayers;
true
};
");

View File

@ -1 +1 @@
build=439;
build=443;

View File

@ -1,4 +1,4 @@
if (sunOrMoon >= 0.99) then { // adjust this lower to change sooner. Note: "0.99 value, the twilight is still quite dark" https://community.bistudio.com/wiki/sunOrMoon
if (sunOrMoon < 0.99) then { // adjust this lower to change sooner. Note: "0.99 value, the twilight is still quite dark" https://community.bistudio.com/wiki/sunOrMoon
setTimeMultiplier 13 // adjust this value for slower or faster night cycle ( 24 hours will take 1 hour )
} else {
setTimeMultiplier 5 // adjust this value for slower or faster day cycle ( 12 hours will take 1 hour )

View File

@ -1 +1 @@
build=439;
build=443;

View File

@ -20,7 +20,7 @@ class CfgPatches {
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
epochVersion = "0.3.8.0";
epochVersion = "0.3.9.0";
requiredAddons[] = {};
#include "build.hpp"
};

View File

@ -81,8 +81,8 @@ echo build=%BUILDNUMBER%; > !serverBuildInc!
SET SOURCE_PATH=%MAIN_PATH%\Sources\epoch_server
SET OUTPUT_PATH=%MAIN_PATH%\Server_Install_Pack\@EpochHive\addons
SET TEMP_PATH=x\addons\a3_epoch_server
rd /s/q p:\!TEMP_PATH!
xcopy /s/e/y/q/i "!SOURCE_PATH!" p:\!TEMP_PATH!
rd /s/q P:\!TEMP_PATH!
xcopy /s/e/y/q/i "!SOURCE_PATH!" P:\!TEMP_PATH!
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!TEMP_PATH!" "!OUTPUT_PATH!" -clear -prefix="!TEMP_PATH!" -project="P:\!TEMP_PATH!" -include=!AB_includes_path!
if '%choice%'=='5' (
call :settings
@ -95,8 +95,8 @@ echo build=%BUILDNUMBER%; > !settingsBuildInc!
SET SOURCE_PATH=%MAIN_PATH%\Sources\epoch_server_settings
SET OUTPUT_PATH=%MAIN_PATH%\Server_Install_Pack\@EpochHive\addons
SET TEMP_PATH=a3_epoch_server_settings
rd /s/q p:\!TEMP_PATH!
xcopy /s/e/y/q/i "!SOURCE_PATH!" p:\!TEMP_PATH!
rd /s/q P:\!TEMP_PATH!
xcopy /s/e/y/q/i "!SOURCE_PATH!" P:\!TEMP_PATH!
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!TEMP_PATH!" "!OUTPUT_PATH!" -packonly -clear -prefix="!TEMP_PATH!" -project="P:\!TEMP_PATH!" -include=!AB_includes_path!
if '%choice%'=='5' (
call :core
@ -109,8 +109,8 @@ echo build=%BUILDNUMBER%; > !coreBuildInc!
SET SOURCE_PATH=%MAIN_PATH%\Sources\epoch_server_core
SET OUTPUT_PATH=%MAIN_PATH%\Server_Install_Pack\@EpochHive\addons
SET TEMP_PATH=epoch_server_core
rd /s/q p:\!TEMP_PATH!
xcopy /s/e/y/q/i "!SOURCE_PATH!" p:\!TEMP_PATH!
rd /s/q P:\!TEMP_PATH!
xcopy /s/e/y/q/i "!SOURCE_PATH!" P:\!TEMP_PATH!
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!TEMP_PATH!" "!OUTPUT_PATH!" -clear -prefix="!TEMP_PATH!" -project="P:\!TEMP_PATH!" -include=!AB_includes_path!
if '%choice%'=='5' (
call :allmaps
@ -127,10 +127,10 @@ for /f "tokens=*" %%G in ('dir /b /s /a:d "!SOURCE_PATH!\mpmissions\epoch.*"') d
echo building !MISSION! pbo
rd /s/q p:\!MISSION!
rem Moving files into temp folder
xcopy /s/e/y/q/i/d "!SOURCE_PATH!\mpmissions\!MISSION!" p:\!MISSION!
xcopy /s/y/q/i/f "!SOURCE_PATH!\description.ext" p:\!MISSION!
xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_code" p:\!MISSION!\epoch_code
xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_config" p:\!MISSION!\epoch_config
xcopy /s/e/y/q/i/d "!SOURCE_PATH!\mpmissions\!MISSION!" P:\!MISSION!
xcopy /s/y/q/i/f "!SOURCE_PATH!\description.ext" P:\!MISSION!
xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_code" P:\!MISSION!\epoch_code
xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_config" P:\!MISSION!\epoch_config
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!MISSION!" "!OUTPUT_PATH!" -clear -prefix=\ -project=P:\ -include=!AB_includes_path!
)
goto end

View File

@ -1 +1 @@
439
443