diff --git a/Sources/epoch_code/compile/EPOCH_supportCopter.sqf b/Sources/epoch_code/compile/EPOCH_supportCopter.sqf
index 6f6d9f21..50920082 100644
--- a/Sources/epoch_code/compile/EPOCH_supportCopter.sqf
+++ b/Sources/epoch_code/compile/EPOCH_supportCopter.sqf
@@ -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[(_arrUnits select (floor random count _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 {
diff --git a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
index eddf17e5..a323e17e 100644
--- a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
+++ b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
@@ -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{["Not allowed near a base - Please respawn !", 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{["Not allowed near a trader - Please respawn !", 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,7 +115,13 @@ 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];
-};
+};
\ No newline at end of file
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf
index ab19c739..9db92ecd 100644
--- a/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf
@@ -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)
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf
new file mode 100644
index 00000000..c2b78477
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf
@@ -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;
+ };
+};
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf
index 61644cbc..6e6e46d0 100644
--- a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf
@@ -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;
["You can be just revived once per life!", 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;
};
};
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf
new file mode 100644
index 00000000..770f9bde
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf
@@ -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;
+ };
+};
\ No newline at end of file
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf
new file mode 100644
index 00000000..1b06337e
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf
@@ -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;
+ };
+};
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf
new file mode 100644
index 00000000..8630d935
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf
@@ -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];
\ No newline at end of file
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf
new file mode 100644
index 00000000..f8613241
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf
@@ -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];
\ No newline at end of file
diff --git a/Sources/epoch_config/Configs/CfgEpochClient.hpp b/Sources/epoch_config/Configs/CfgEpochClient.hpp
index 0cf9c1aa..c8162e02 100644
--- a/Sources/epoch_config/Configs/CfgEpochClient.hpp
+++ b/Sources/epoch_config/Configs/CfgEpochClient.hpp
@@ -1,6 +1,6 @@
/*
Author: Aaron Clark - EpochMod.com
- Contributors:
+ Contributors: Andrew Gregory
Description:
Main Client side configs for the Epoch gamemode
@@ -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},
@@ -59,7 +60,7 @@ class CfgEpochClient
displayAddEventHandler[] = {"keyDown","keyUp"};
keyDown = "(_this call EPOCH_KeyDown)";
keyUp = "(_this call EPOCH_KeyUp)";
- addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","Fired","Killed","HandleRating","GetInMan","GetOutMan"};
+ addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","Fired","Killed","HandleRating"};
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";
@@ -73,8 +74,6 @@ class CfgEpochClient
Dammaged = "";
Hit = "";
HitPart = "";
- GetInMan = "";
- GetOutMan = "_this call EPOCH_antiWall;";
// suppress these units from spawning near Jammer or Traders
nonJammerAI[] = {"B_Heli_Transport_01_F","PHANTOM","Epoch_Cloak_F"};
@@ -108,6 +107,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 +118,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.
diff --git a/Sources/epoch_config/Configs/CfgRemoteExec.hpp b/Sources/epoch_config/Configs/CfgRemoteExec.hpp
index e780ee73..fbef7146 100644
--- a/Sources/epoch_config/Configs/CfgRemoteExec.hpp
+++ b/Sources/epoch_config/Configs/CfgRemoteExec.hpp
@@ -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;};
};
diff --git a/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf b/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf
new file mode 100644
index 00000000..7a498c79
--- /dev/null
+++ b/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf
@@ -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
+};
diff --git a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf
index adf85075..50e80763 100644
--- a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf
+++ b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf
@@ -1,7 +1,7 @@
/*
- Author: Aaron Clark - EpochMod.com
+ Author: Andrew Gregory - EpochMod.com
- Contributors:
+ Contributors: Aaron Clark
Description:
Creates air drop crate
diff --git a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf
index 9d445df6..d988bd83 100644
--- a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf
+++ b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf
@@ -1,7 +1,7 @@
/*
- Author: Aaron Clark - EpochMod.com
+ Author: Andrew Gregory - EpochMod.com
- Contributors:
+ Contributors: Aaron Clark
Description:
Creates helicopter air drop
diff --git a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf
index 61da45db..2adc6d47 100644
--- a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf
+++ b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf
@@ -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
diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayerDetonate.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayerDetonate.sqf
new file mode 100644
index 00000000..941e9fcf
--- /dev/null
+++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayerDetonate.sqf
@@ -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;
\ No newline at end of file
diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_playerSetVariable.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_playerSetVariable.sqf
new file mode 100644
index 00000000..bb05deac
--- /dev/null
+++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_playerSetVariable.sqf
@@ -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];
\ No newline at end of file
diff --git a/Sources/epoch_server/config.cpp b/Sources/epoch_server/config.cpp
index 9128d65a..50605397 100644
--- a/Sources/epoch_server/config.cpp
+++ b/Sources/epoch_server/config.cpp
@@ -1,16 +1,21 @@
-/****************************************************************************
-Copyright (C) 2015 - ARMA 3 EPOCH MOD [EpochMod.com] (v0.3.0.1)
-*****************************************************************************/
+////////////////////////////////////////////////////////////////////
+//DeRap: Produced from mikero's Dos Tools Dll version 4.90
+//Tue Apr 19 09:31:41 2016 : Source 'file' date Tue Apr 19 09:31:41 2016
+//http://dev-heaven.net/projects/list_files/mikero-pbodll
+////////////////////////////////////////////////////////////////////
#define _ARMA_
-class CfgPatches {
- class A3_epoch_server {
+//Class C:\arma3server\@epochhive\addons\a3_epoch_server\config.bin{
+class CfgPatches
+{
+ class A3_epoch_server
+ {
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredAddons[] = {"A3_epoch_server_core","A3_epoch_config","A3_server_settings"};
- #include "build.hpp"
+ build = 315;
};
};
class cfgFunctions
@@ -39,99 +44,111 @@ class CfgServerFunctions
{
tag = "EPOCH";
file = "\x\addons\a3_epoch_server\compile";
- class epoch_group {
- class server_upgradeGroup {};
- class server_updatePlayerGroup {};
- class server_createGroup {};
- class server_deleteGroup {};
- class server_invitePlayer {};
+ class epoch_group
+ {
+ class server_upgradeGroup{};
+ class server_updatePlayerGroup{};
+ class server_createGroup{};
+ class server_deleteGroup{};
+ class server_invitePlayer{};
};
- class epoch_bases {
- class saveBuilding {};
- class server_loadBuildings {};
- class server_saveBuilding {};
- class server_upgradeBUILD {};
- class server_removeBUILD {};
- class server_paintBUILD {};
- class server_maintBUILD {};
- class server_simulSwap {};
- class server_simToStatic {};
- class server_unsuppported {};
+ class epoch_bases
+ {
+ class saveBuilding{};
+ class server_loadBuildings{};
+ class server_saveBuilding{};
+ class server_upgradeBUILD{};
+ class server_removeBUILD{};
+ class server_paintBUILD{};
+ class server_maintBUILD{};
+ class server_simulSwap{};
+ class server_simToStatic{};
+ class server_unsuppported{};
};
- class epoch_looting {
- class server_lootContainer {};
- class server_spawnBoatLoot {};
- class server_destroyTrash {};
- class server_knockDownTree {};
- class server_mineRocks {};
- class server_lootAnimal {};
+ class epoch_looting
+ {
+ class server_lootContainer{};
+ class server_spawnBoatLoot{};
+ class server_destroyTrash{};
+ class server_knockDownTree{};
+ class server_mineRocks{};
+ class server_lootAnimal{};
};
- class epoch_player {
- class fnc_savePlayer {};
- 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 epoch_player
+ {
+ class fnc_savePlayer{};
+ class server_savePlayer{};
+ class server_loadPlayer{};
+ class server_checkPlayer{};
+ 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 {};
- class server_spawnTraders {};
+ class epoch_traders
+ {
+ class server_loadTraders{};
+ class server_spawnTraders{};
};
- class epoch_trading {
- class server_makeTrade {};
- class server_tradeRequest {};
- class server_makeNPCTrade {};
- class server_takeCrypto {};
+ class epoch_trading
+ {
+ class server_makeTrade{};
+ class server_tradeRequest{};
+ class server_makeNPCTrade{};
+ class server_takeCrypto{};
};
- class epoch_vehicle {
- class server_save_vehicles {};
- class server_save_vehicle {};
- class server_save_killedVehicle {};
- class server_save_killedStorage {};
- class server_save_killedBuilding {};
- class load_vehicles {};
- class load_storage {};
- class server_save_storage {};
- class spawn_vehicles {};
- class server_lockVehicle {};
- class server_fillVehicle {};
- class server_repairVehicle {};
- class server_lockStorage {};
- class server_packStorage {};
- class server_packJack {};
- class spawn_vehicle {};
+ class epoch_vehicle
+ {
+ class server_save_vehicles{};
+ class server_save_vehicle{};
+ class server_save_killedVehicle{};
+ class server_save_killedStorage{};
+ class server_save_killedBuilding{};
+ class load_vehicles{};
+ class load_storage{};
+ class server_save_storage{};
+ class spawn_vehicles{};
+ class server_lockVehicle{};
+ class server_fillVehicle{};
+ class server_repairVehicle{};
+ class server_lockStorage{};
+ class server_packStorage{};
+ class server_packJack{};
+ class spawn_vehicle{};
};
- class epoch_server {
- class weightedArray {};
- class precisionPos {};
- class serverLootObject {};
- class server_vehicleInit {};
- class server_storageInit {};
- class server_buildingInit {};
- class server_traderKilled {};
- class localCleanup {};
- class server_createTeleport {};
- class server_teleportPlayer {};
- class returnConfig {};
- class serverCommand {};
+ class epoch_server
+ {
+ class weightedArray{};
+ class precisionPos{};
+ class serverLootObject{};
+ class server_vehicleInit{};
+ class server_storageInit{};
+ class server_buildingInit{};
+ class server_traderKilled{};
+ class localCleanup{};
+ class server_createTeleport{};
+ class server_teleportPlayer{};
+ class returnConfig{};
+ class serverCommand{};
};
- class epoch_missions {
- class Server_createObject {};
- class server_airDropCrate {};
- class server_fillContainer {};
- class Server_createAirDrop {};
+ class epoch_missions
+ {
+ class Server_createObject{};
+ class server_airDropCrate{};
+ class server_fillContainer{};
+ class Server_createAirDrop{};
};
- class epoch_antagonists {
- class server_triggerEvent {};
- class server_handle_say3D {};
- class server_handle_switchMove {};
- class server_handle_sapperObjs {};
+ class epoch_antagonists
+ {
+ class server_triggerEvent{};
+ class server_handle_say3D{};
+ class server_handle_switchMove{};
+ class server_handle_sapperObjs{};
+ class server_triggerAntagonist{};
};
};
};
@@ -141,3 +158,9 @@ class CfgServerVersion
config = "0.3.8.0";
hive = "0.5.1.7";
};
+class cfgMods
+{
+ author = "";
+ timepacked = "1458312578";
+};
+//};