Merge branch 'master' of github.com:KoffeinFlummi/ACE3

This commit is contained in:
esteldunedain 2015-04-20 18:24:50 -03:00
commit 1fa9ba1cbf
53 changed files with 5716 additions and 226 deletions

View File

@ -82,3 +82,4 @@ BlackPixxel
Asgar Serran <piechottaf@web.de>
Kavinsky <nmunozfernandez@gmail.com>
Coren <coren4@gmail.com>
OnkelDisMaster <onkeldismaster@gmail.com>

View File

@ -15,4 +15,8 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"
#include "RscTitles.hpp"
#include "ACE_Settings.hpp"
#include "ACE_Settings.hpp"
class ACE_Extensions {
extensions[] += {"ace_advanced_ballistics"};
};

View File

@ -248,5 +248,13 @@ if(isMultiplayer && { time > 0 || isNull player } ) then {
}, 0, []] call cba_fnc_addPerFrameHandler;
};
// check dlls
{
if (_x callExtension "version" == "") then {
private "_errorMsg";
_errorMsg = format ["Extension %1.dll not installed.", _x];
diag_log text format ["[ACE] ERROR: %1", _errorMsg];
["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage);
};
} forEach getArray (configFile >> "ACE_Extensions" >> "extensions");

View File

@ -42,6 +42,7 @@ PREP(doAnimation);
PREP(dropBackpack);
PREP(endRadioTransmission);
PREP(eraseCache);
PREP(errorMessage);
PREP(execNextFrame);
PREP(execPersistentFnc);
PREP(execRemoteFnc);

View File

@ -152,3 +152,15 @@ class CfgUIGrids {
};
};
};
/*
// check dll
class RscStandardDisplay;
class RscDisplayMain: RscStandardDisplay {
onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDisplayMain"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); [ARR_5('header','tail',{0},{},_this select 0)] call COMPILE_FILE(functions\fnc_errorMessage));
};
*/
class ACE_Extensions {
extensions[] = {};
};

View File

@ -27,7 +27,7 @@ if ((local _unit) && {!([_unit] call EFUNC(common,isPlayer))}) then {
_unit disableConversation true;
} else {
//Sanity check to make sure we don't enable unconsious AI
if (_unit getVariable ["ace_isunconscious", false]) exitWith {ERROR("Enabling AI for unconsious unit");};
if (_unit getVariable ["ace_isunconscious", false] && alive _unit) exitWith {ERROR("Enabling AI for unconsious unit");};
_unit enableAI "MOVE";
_unit enableAI "TARGET";
_unit enableAI "AUTOTARGET";

View File

@ -1,14 +1,16 @@
/*
* Author: commy2
*
* Disables key input. ESC can still be pressed to open the menu.
*
* Argument:
* 0: True to disable key inputs, false to re-enable them (Bool)
* Arguments:
* 0: True to disable key inputs, false to re-enable them <BOOL>
*
* Return value:
* Nothing
*
* Public: Yes
*/
#include "script_component.hpp"
private ["_state", "_dlg"];
@ -16,76 +18,93 @@ private ["_state", "_dlg"];
_state = _this select 0;
if (_state) then {
disableSerialization;
disableSerialization;
if (!isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull])) exitWith {};
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) exitWith {};
if (!isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull])) exitWith {};
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) exitWith {};
// end TFAR and ACRE2 radio transmissions
0 spawn FUNC(endRadioTransmission);
// end TFAR and ACRE2 radio transmissions
call FUNC(endRadioTransmission);
// Close map
if (visibleMap && {!(player getVariable ["ACE_canSwitchUnits", false])}) then {openMap false};
// Close map
if (visibleMap && {!(player getVariable ["ACE_canSwitchUnits", false])}) then {
openMap false;
};
closeDialog 0;
createDialog QGVAR(DisableMouse_Dialog);
closeDialog 0;
createDialog QGVAR(DisableMouse_Dialog);
_dlg = uiNamespace getVariable QGVAR(dlgDisableMouse);
_dlg = uiNamespace getVariable QGVAR(dlgDisableMouse);
_dlg displayAddEventHandler ["KeyDown", {
_key = _this select 1;
if (_key == 1 && {alive player}) then {
createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer);
disableSerialization;
_dlg = finddisplay 49;
_dlg displayAddEventHandler ["KeyDown", {
_dlg displayAddEventHandler ["KeyDown", {
_key = _this select 1;
!(_key == 1)
}];
for "_index" from 100 to 2000 do {
(_dlg displayCtrl _index) ctrlEnable false;
};
if (_key == 1 && {alive player}) then {
createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer);
_ctrl = _dlg displayctrl 103;
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable true;
_ctrl ctrlSetText "ABORT";
_ctrl ctrlSetTooltip "Abort.";
disableSerialization;
_dlg = finddisplay 49;
_dlg displayAddEventHandler ["KeyDown", {
_key = _this select 1;
!(_key == 1)
}];
_ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer);
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable (call {_config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}});
_ctrl ctrlSetText "RESPAWN";
_ctrl ctrlSetTooltip "Respawn.";
};
for "_index" from 100 to 2000 do {
(_dlg displayCtrl _index) ctrlEnable false;
};
if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; teamSwitch};//_acc = accTime; teamSwitch; setAccTime _acc};
if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openCuratorInterface};
if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openMap true};
_ctrl = _dlg displayctrl 103;
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable true;
_ctrl ctrlSetText "ABORT";
_ctrl ctrlSetTooltip "Abort.";
if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then {
if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then {
_key = 0;
};
};
_ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer);
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable (call {_config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}});
_ctrl ctrlSetText "RESPAWN";
_ctrl ctrlSetTooltip "Respawn.";
};
_key > 0
}];
_dlg displayAddEventHandler ["KeyUp", {true}];
if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then {
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
_acc = accTime;
teamSwitch;
setAccTime _acc;
};
if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then {
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
openCuratorInterface;
};
if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then {
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
openMap true;
};
if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then {
if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then {
_key = 0;
};
};
_key > 0
}];
_dlg displayAddEventHandler ["KeyUp", {true}];
["ACE_DisableUserInput", "onEachFrame", {
if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && isNull findDisplay 49 && isNull findDisplay 312 && isNull findDisplay 632}) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
[true] call FUNC(disableUserInput);
};
}] call BIS_fnc_addStackedEventHandler;
["ACE_DisableUserInput", "onEachFrame", {
if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && isNull findDisplay 49 && isNull findDisplay 312 && isNull findDisplay 632}) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
[true] call FUNC(disableUserInput);
};
}] call BIS_fnc_addStackedEventHandler;
} else {
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
};
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
};
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
};

View File

@ -0,0 +1,144 @@
/*
* Author: commy2, based on BIS_fnc_errorMsg and BIS_fnc_guiMessage by Karel Moricky (BI)
* Stops simulation and opens a textbox with error message.
*
* Arguments:
* ?
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
disableSerialization;
endLoadingScreen;
private ["_textHeader", "_textMessage", "_onOK", "_onCancel"];
_textHeader = _this select 0;
_textMessage = _this select 1;
_onOK = ARR_SELECT(_this,2,{});
_onCancel = ARR_SELECT(_this,3,{});
if (typeName _textMessage == "STRING") then {
_textMessage = parseText _textMessage;
};
(ARR_SELECT(_this,4,call BIS_fnc_displayMission)) createDisplay "RscDisplayCommonMessagePause";
private ["_display", "_ctrlRscMessageBox", "_ctrlBcgCommonTop", "_ctrlBcgCommon", "_ctrlText", "_ctrlBackgroundButtonOK", "_ctrlBackgroundButtonMiddle", "_ctrlBackgroundButtonCancel", "_ctrlButtonOK", "_ctrlButtonCancel"];
_display = uiNamespace getVariable "RscDisplayCommonMessage_display";
_ctrlRscMessageBox = _display displayCtrl 2351;
_ctrlBcgCommonTop = _display displayCtrl 235100;
_ctrlBcgCommon = _display displayCtrl 235101;
_ctrlText = _display displayCtrl 235102;
_ctrlBackgroundButtonOK = _display displayCtrl 235103;
_ctrlBackgroundButtonMiddle = _display displayCtrl 235104;
_ctrlBackgroundButtonCancel = _display displayCtrl 235105;
_ctrlButtonOK = _display displayCtrl 235106;
_ctrlButtonCancel = _display displayCtrl 235107;
_ctrlBcgCommonTop ctrlSetText _textHeader;
private ["_ctrlButtonOKPos", "_ctrlBcgCommonPos", "_bottomSpaceY", "_ctrlTextPos", "_marginX", "_marginY"];
_ctrlButtonOKPos = ctrlPosition _ctrlButtonOK;
_ctrlBcgCommonPos = ctrlPosition _ctrlBcgCommon;
_bottomSpaceY = (_ctrlButtonOKPos select 1) - ((_ctrlBcgCommonPos select 1) + (_ctrlBcgCommonPos select 3));
_ctrlTextPos = ctrlPosition _ctrlText;
_marginX = (_ctrlTextPos select 0) - (_ctrlBcgCommonPos select 0);
_marginY = (_ctrlTextPos select 1) - (_ctrlBcgCommonPos select 1);
private ["_ctrlTextPosH", "_bottomPosY"];
_ctrlText ctrlSetStructuredText _textMessage;
_ctrlTextPosH = ctrlTextHeight _ctrlText;
_ctrlBcgCommon ctrlSetPosition [
_ctrlBcgCommonPos select 0,
_ctrlBcgCommonPos select 1,
_ctrlBcgCommonPos select 2,
_ctrlTextPosH + _marginY * 2
];
_ctrlBcgCommon ctrlCommit 0;
_ctrlText ctrlSetPosition [
(_ctrlBcgCommonPos select 0) + _marginX,
(_ctrlBcgCommonPos select 1) + _marginY,
(_ctrlBcgCommonPos select 2) - _marginX * 2,
_ctrlTextPosH
];
_ctrlText ctrlCommit 0;
_bottomPosY = (_ctrlBcgCommonPos select 1) + _ctrlTextPosH + (_marginY * 2) + _bottomSpaceY;
{
private "_xPos";
_xPos = ctrlPosition _x;
_xPos set [1, _bottomPosY];
_x ctrlSetPosition _xPos;
_x ctrlCommit 0;
} foreach [
_ctrlBackgroundButtonOK,
_ctrlBackgroundButtonMiddle,
_ctrlBackgroundButtonCancel,
_ctrlButtonOK,
_ctrlButtonCancel
];
private ["_ctrlRscMessageBoxPos", "_ctrlRscMessageBoxPosH"];
_ctrlRscMessageBoxPos = ctrlPosition _ctrlRscMessageBox;
_ctrlRscMessageBoxPosH = _bottomPosY + (_ctrlButtonOKPos select 3);
_ctrlRscMessageBox ctrlSetPosition [
0.5 - (_ctrlBcgCommonPos select 2) / 2,
0.5 - _ctrlRscMessageBoxPosH / 2,
(_ctrlBcgCommonPos select 2) + 0.5,
_ctrlRscMessageBoxPosH
];
_ctrlRscMessageBox ctrlEnable true;
_ctrlRscMessageBox ctrlCommit 0;
if (_onOK isEqualTo {}) then {
_ctrlButtonOK ctrlEnable false;
_ctrlButtonOK ctrlSetFade 0;
_ctrlButtonOK ctrlSetText "";
_ctrlButtonOK ctrlCommit 0;
} else {
_ctrlButtonOK ctrlEnable true;
_ctrlButtonOK ctrlSetFade 0;
_ctrlButtonOK ctrlSetText localize "STR_DISP_OK";
_ctrlButtonOK ctrlCommit 0;
ctrlSetFocus _ctrlButtonOK;
};
if (_onCancel isEqualTo {}) then {
_ctrlButtonCancel ctrlEnable false;
_ctrlButtonCancel ctrlSetFade 0;
_ctrlButtonCancel ctrlSetText "";
_ctrlButtonCancel ctrlCommit 0;
} else {
_ctrlButtonCancel ctrlEnable true;
_ctrlButtonCancel ctrlSetFade 0;
_ctrlButtonCancel ctrlSetText localize "STR_DISP_CANCEL";
_ctrlButtonCancel ctrlCommit 0;
ctrlSetFocus _ctrlButtonCancel;
};
_ctrlButtonOK ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 1; true}];
_ctrlButtonCancel ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 2; true}];
GVAR(errorOnOK) = _onOK;
GVAR(errorOnCancel) = _onCancel;
_display displayAddEventHandler ["unload", {call ([{}, GVAR(errorOnOK), GVAR(errorOnCancel)] select (_this select 1))}];
_display displayAddEventHandler ["keyDown", {_this select 1 == 1}];

View File

@ -11,4 +11,4 @@
#define DEBUG_SETTINGS DEBUG_SETTINGS_COMMON
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -9,8 +9,6 @@ _isUnconscious = _this select 1;
private "_player";
_player = ACE_player;
if ((_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg") > 0.4) exitwith {};
if (_player getVariable [QGVAR(isDragging), false]) then {
private "_draggedObject";
@ -22,9 +20,9 @@ if (_player getVariable [QGVAR(isDragging), false]) then {
};
// handle waking up dragged unit
if (_unit == _draggedObject) then {
[_player, _draggedObject] call FUNC(dropObject);
};
//if (_unit == _draggedObject) then {
// [_player, _draggedObject] call FUNC(dropObject);
//};
};
@ -39,8 +37,8 @@ if (_player getVariable [QGVAR(isCarrying), false]) then {
};
// handle waking up dragged unit
if (_unit == _carriedObject) then {
[_player, _carriedObject] call FUNC(dropObject_carry);
};
//if (_unit == _carriedObject) then {
// [_player, _carriedObject] call FUNC(dropObject_carry);
//};
};

View File

@ -20,3 +20,7 @@ class CfgPatches {
#include "CfgWeapons.hpp"
#include "CfgOptics.hpp"
class ACE_Extensions {
extensions[] += {"ace_fcs"};
};

View File

@ -0,0 +1,7 @@
class CfgActions {
class None;
class OpenBag: None {
showWindow = 0;
};
};

View File

@ -14,6 +14,8 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgActions.hpp"
#include "CursorMenus.hpp"
class ACE_Settings {
@ -36,3 +38,7 @@ class ACE_Settings {
displayName = "$STR_ACE_Interact_Menu_UseListMenu";
};
};
class ACE_Extensions {
extensions[] += {"ace_breakLine"};
};

View File

@ -3,6 +3,7 @@ class ACE_Head {
displayName = "$STR_ACE_Interaction_Head";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -74,6 +75,7 @@ class ACE_Torso {
displayName = "$STR_ACE_Interaction_Torso";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -173,6 +175,7 @@ class ACE_ArmLeft {
displayName = "$STR_ACE_Interaction_ArmLeft";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -329,6 +332,7 @@ class ACE_ArmRight {
displayName = "$STR_ACE_Interaction_ArmRight";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -423,8 +427,8 @@ class ACE_ArmRight {
};
class PlasmaIV: BloodIV {
displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000";
condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(treatment));
condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(treatment));
EXCEPTIONS
};
class PlasmaIV_500: PlasmaIV {
@ -482,6 +486,7 @@ class ACE_LegLeft {
displayName = "$STR_ACE_Interaction_LegLeft";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -578,8 +583,8 @@ class ACE_LegLeft {
};
class PlasmaIV: BloodIV {
displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000";
condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(treatment));
condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(treatment));
EXCEPTIONS
};
class PlasmaIV_500: PlasmaIV {
@ -623,6 +628,7 @@ class ACE_LegRight {
displayName = "$STR_ACE_Interaction_LegRight";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -718,8 +724,8 @@ class ACE_LegRight {
};
class PlasmaIV: BloodIV {
displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000";
condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(treatment));
condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(treatment));
EXCEPTIONS
};
class PlasmaIV_500: PlasmaIV {

View File

@ -4,6 +4,7 @@ class Medical {
hotkey = "M";
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class ACE_Head {
@ -11,6 +12,7 @@ class Medical {
icon = PATHTOF(UI\icons\medical_cross.paa);
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation));
condition = "true";
runOnHover = 1;
class Bandage {
@ -146,6 +148,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {
@ -246,6 +249,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {
@ -342,6 +346,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {
@ -427,6 +432,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {

View File

@ -79,16 +79,16 @@ class ACE_Settings {
displayName = "$STR_ACE_Medical_litterSimulationDetail";
description = "$STR_ACE_Medical_litterSimulationDetail_Desc";
typeName = "SCALAR";
value = 3;
values[] = {"Off", "Low", "Medium", "High", "Ultra"};
_values[] = { 0, 50, 100, 1000, 5000 };
isClientSettable = 1;
};
class GVAR(litterCleanUpDelay) {
typeName = "SCALAR";
value = 0;
value = 0;
};
class GVAR(medicSetting_PAK) {
typeName = "SCALAR";
@ -135,4 +135,12 @@ class ACE_Settings {
values[] = {"$STR_ACE_Medical_painEffect_Flash", "$STR_ACE_Medical_painEffect_Chroma"};
isClientSettable = 1;
};
class GVAR(allowUnconsciousAnimationOnTreatment) {
typeName = "BOOL";
value = 0;
};
class GVAR(moveUnitsFromGroupOnUnconscious) {
typeName = "BOOL";
value = 0;
};
};

View File

@ -6,5 +6,5 @@ _unit = _this select 0;
_unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}];
if (local _unit) then {
[_unit] call FUNC(init);
[_unit] call FUNC(init);
};

View File

@ -241,7 +241,7 @@ if (USE_WOUND_EVENT_SYNC) then {
// We are only pulling the wounds for the units in the player group. Anything else will come when the unit interacts with them.
{
[_x, _newPlayer] call FUNC(requestWoundSync);
}foreach units group player;
}foreach units group _newPlayer;
};
}] call EFUNC(common,addEventhandler);
};

View File

@ -96,6 +96,7 @@ PREP(moduleAssignMedicalFacility);
PREP(moduleTreatmentConfiguration);
PREP(copyDeadBody);
PREP(requestWoundSync);
PREP(unconsciousPFH);
// Networked litter
PREP(createLitter);

View File

@ -6,7 +6,6 @@ _unit = _this select 0;
if !(local _unit) exitWith {};
diag_log "running respawn";
[_unit] call FUNC(init);
//Reset captive status for respawning unit

View File

@ -23,10 +23,10 @@ if ([_target] call EFUNC(common,isAwake)) exitwith {
["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent);
};
if ([_target] call FUNC(isBeingCarried)) then {
[_caller, _target] call FUNC(dropObject_carry);
[_caller, _target] call FUNC(dropObject_carry);
};
if ([_target] call FUNC(isBeingDragged)) then {
[_caller, _target] call FUNC(dropObject);
[_caller, _target] call FUNC(dropObject);
};
_vehicle = [_caller, _target] call EFUNC(common,loadPerson);

View File

@ -19,4 +19,4 @@
#define MAX_DURATION_CACHE 2
// parameters, function, namespace, uid
[_this, DFUNC(canTreat), _this select 0, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall);
[_this, DFUNC(canTreat), _this select 1, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall);

View File

@ -21,10 +21,10 @@ if ((vehicle _unit != _unit) && {!alive (vehicle _unit)}) exitwith { true };
// Find the correct Damage threshold for unit.
_damageThreshold = [1,1,1];
if (isPlayer _unit) then {
//_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(damageThreshold_Players), GVAR(damageThreshold_Players), GVAR(damageThreshold_Players) * 1.7]];
if ([_unit] call EFUNC(common,IsPlayer)) then {
_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(playerDamageThreshold), GVAR(playerDamageThreshold), GVAR(playerDamageThreshold) * 1.7]];
} else {
//_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(damageThreshold_AI), GVAR(damageThreshold_AI), GVAR(damageThreshold_AI) * 1.7]];
_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(AIDamageThreshold), GVAR(AIDamageThreshold), GVAR(AIDamageThreshold) * 1.7]];
};
_damageBodyPart = ((_unit getvariable [QGVAR(bodyPartStatus),[0, 0, 0, 0, 0, 0]]) select _part) + _withDamage;

View File

@ -59,20 +59,30 @@ if (isClass (_config >> _className)) then {
_bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []];
_exist = false;
_injuryId = _injury select 0;
_bandagedInjury = [];
{
if ((_x select 0) == _injuryId) exitwith {
_exist = true;
_existingInjury = _x;
_existingInjury set [3, (_existingInjury select 3) + _impact];
_bandagedWounds set [_foreachIndex, _existingInjury];
_bandagedInjury = _existingInjury;
};
}foreach _bandagedWounds;
if !(_exist) then {
// [ID, classID, bodypart, percentage treated, bloodloss rate]
_bandagedWounds pushback [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4];
_bandagedInjury = [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4];
_bandagedWounds pushback _bandagedInjury;
};
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC];
if (USE_WOUND_EVENT_SYNC) then {
// sync _bandagedInjury
};
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];
// Check if we are ever going to reopen this
if (random(1) <= _reopeningChance) then {
@ -109,7 +119,7 @@ if (random(1) <= _reopeningChance) then {
}foreach _bandagedWounds;
if (_exist) then {
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC];
};
};
// Otherwise something went wrong, we we don't reopen them..

View File

@ -57,6 +57,12 @@ if (GVAR(level) >= 2) then {
_minLethalDamage = GVAR(minLethalDamages) select _typeIndex;
};
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selection == ""}) then {
if (GVAR(enableVehicleCrashes)) then {
_selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS))));
};
};
if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)} && {_selection in ["", "head", "body"]}) then {
if ([_unit] call FUNC(setDead)) then {
_damageReturn = 1;

View File

@ -33,10 +33,12 @@ if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _un
};
_typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage);
_part = [_selectionName] call FUNC(selectionNameToNumber);
if (_part < 0) exitwith {};
_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"];
// Sorting out the damage
_damageBodyParts = _unit getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]];
_damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage];
_unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true];

View File

@ -38,7 +38,7 @@ if (_selectionName in _hitSelections) then {
// Check for vehicle crash
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selectionName == ""}) then {
if (missionNamespace getvariable [QGVAR(allowVehicleCrashDamage), true]) then {
if (GVAR(enableVehicleCrashes)) then {
_selectionName = _hitSelections select (floor(random(count _hitSelections)));
_projectile = "vehiclecrash";
};

View File

@ -133,7 +133,6 @@ if (count _woundsCreated > 0) then {
};
if (USE_WOUND_EVENT_SYNC) then {
// TODO Should this be done in a single broadcast?
// Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries.
{
["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent);

View File

@ -22,4 +22,14 @@ if (_local) then {
if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then {
[_unit, true] call FUNC(addToInjuredCollection);
};
if ((_unit getvariable ["ACE_isUnconscious",false]) && {count (_unit getvariable [QGVAR(unconsciousArguments), []]) >= 7}) then {
private "_arguments";
_arguments = (_unit getvariable [QGVAR(unconsciousArguments), []]);
_arguments set [ 3, time];
[DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler;
_unit setvariable [QGVAR(unconsciousArguments), nil, true];
};
};

View File

@ -94,7 +94,7 @@ if (GVAR(level) >= 2) then {
if ([_unit] call EFUNC(common,isAwake)) then {
if (_bloodVolume < 60) then {
if (random(1) > 0.9) then {
[_unit] call FUNC(setUnconscious);
[_unit, true, 15 + random(20)] call FUNC(setUnconscious);
};
};
};
@ -136,7 +136,7 @@ if (GVAR(level) >= 2) then {
if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then {
[_unit] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already.
[_unit, true, 10+ random(20)] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already.
};
if (_bloodPressureH > 260) then {

View File

@ -13,7 +13,7 @@
#include "script_component.hpp"
private ["_unit", "_allUsedMedication", "_logs"];
private ["_unit", "_allUsedMedication", "_logs", "_forceNew"];
_unit = _this select 0;
@ -28,6 +28,7 @@ _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true];
_unit setvariable [QGVAR(openWounds), [], true];
_unit setvariable [QGVAR(bandagedWounds), [], true];
_unit setVariable [QGVAR(internalWounds), [], true];
_unit setvariable [QGVAR(lastUniqueWoundID), 1, true];
// vitals
_unit setVariable [QGVAR(heartRate), 80];
@ -36,24 +37,24 @@ _unit setvariable [QGVAR(bloodPressure), [80, 120]];
_unit setVariable [QGVAR(peripheralResistance), 100];
// fractures
_unit setVariable [QGVAR(fractures), []];
_unit setVariable [QGVAR(fractures), [], true];
// triage card and logs
_unit setvariable [QGVAR(triageLevel), 0, true];
_unit setvariable [QGVAR(triageCard), [], true];
// IVs
_unit setVariable [QGVAR(salineIVVolume), 0];
_unit setVariable [QGVAR(plasmaIVVolume), 0];
_unit setVariable [QGVAR(bloodIVVolume), 0];
_unit setVariable [QGVAR(salineIVVolume), 0, true];
_unit setVariable [QGVAR(plasmaIVVolume), 0, true];
_unit setVariable [QGVAR(bloodIVVolume), 0, true];
// damage storage
_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true];
// airway
_unit setvariable [QGVAR(airwayStatus), 100, true];
_unit setVariable [QGVAR(airwayOccluded), false, true];
_unit setvariable [QGVAR(airwayCollapsed), false, true];
_unit setvariable [QGVAR(airwayStatus), 100];
_unit setVariable [QGVAR(airwayOccluded), false];
_unit setvariable [QGVAR(airwayCollapsed), false];
// generic medical admin
_unit setvariable [QGVAR(addedToUnitLoop), false, true];
@ -69,11 +70,11 @@ _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []];
{
_unit setvariable [_x select 0, nil];
} foreach _allUsedMedication;
_unit setVariable [QGVAR(allUsedMedication), []];
_unit setVariable [QGVAR(allUsedMedication), [], true];
_logs = _unit getvariable [QGVAR(allLogs), []];
{
_unit setvariable [_x, nil, true];
_unit setvariable [_x, nil];
} foreach _logs;
_unit setvariable [QGVAR(allLogs), [], true];

View File

@ -1,11 +1,10 @@
/*
* Author: Glowbal
* Enabled the vitals loop for a unit.
* Handles an wound update request.
*
* Arguments:
* 0: The Unit <OBJECT>
* 1: the last known ID <NUMBER>
* 2: Origin object <OBJECT>
* 1: Origin object <OBJECT>
*
* ReturnValue:
* <NIL>
@ -14,12 +13,11 @@
*/
#include "script_component.hpp"
private ["_unit", "_lastId", "_openWounds"];
private ["_unit", "_openWounds"];
_unit = _this select 0;
_lastId = _this select 1;
_originOfrequest = _this select 2;
_originOfrequest = _this select 1;
if (local _unit) then {
if (local _unit && !(local _originOfrequest)) then {
_openWounds = _unit getvariable [QGVAR(openWounds), []];
{
["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent);

View File

@ -14,11 +14,11 @@
#include "script_component.hpp"
private [ "_target", "_caller", "_openWounds","_lastId"];
private [ "_target", "_caller", "_openWounds"];
_target = _this select 0;
_caller = _this select 1;
if (local _target || GVAR(level) < 2) exitwith {}; // if the target is local, we already got the most update to date information
if (_target getvariable [QGVAR(isWoundSynced), false]) exitwith {};
_target setvariable [QGVAR(isWoundSynced), true];
["medical_woundUpdateRequest", [_target], [_target, _lastId, _caller]] call EFUNC(common,targetEvent);
["medical_woundUpdateRequest", [_target], [_target, _caller]] call EFUNC(common,targetEvent);

View File

@ -23,7 +23,7 @@ _set = if (count _this > 1) then {_this select 1} else {true};
_minWaitingTime = if (count _this > 2) then {_this select 2} else {DEFAULT_DELAY};
if !(_set) exitwith {
_unit setvariable ["ACE_isUnconscious", false,true];
_unit setvariable ["ACE_isUnconscious", false, true];
};
if !(!(isNull _unit) && {(_unit isKindOf "CaManBase") && ([_unit] call EFUNC(common,isAwake))}) exitwith{};
@ -37,7 +37,14 @@ _unit setUnconscious true;
if (_unit == ACE_player) then {
if (visibleMap) then {openMap false};
closeDialog 0;
while {dialog} do {
closeDialog 0;
};
};
// if we have unconsciousness for AI disabled, we will kill the unit instead
if (!([_unit] call EFUNC(common,IsPlayer)) && (GVAR(enableUnsconsiousnessAI) == 0 || (GVAR(enableUnsconsiousnessAI) == 2 && random(1) <= 0.5))) exitwith {
[_unit, true] call FUNC(setDead); // force, to avoid getting into a loop in case revive is enabled.
};
// If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious,
@ -68,73 +75,15 @@ _unit setUnitPos "DOWN";
// So the AI does not get stuck, we are moving the unit to a temp group on its own.
//Unconscious units shouldn't be put in another group #527:
// [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};
[_unit, QGVAR(unconscious), true] call EFUNC(common,setCaptivityStatus);
[_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation);
_startingTime = time;
[{
private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut"];
_args = _this select 0;
_unit = _args select 0;
_oldAnimation = _args select 1;
_originalPos = _args select 2;
_startingTime = _args select 3;
_minWaitingTime = _args select 4;
_hasMovedOut = _args select 5;
if (!alive _unit) exitwith {
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
// In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation
if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith {
// TODO, handle this with carry instead, so we can remove the PFH here.
// Wait until the unit isn't being carried anymore, so we won't end up with wierd animations
if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then {
if (vehicle _unit == _unit) then {
if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then {
[_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation);
[_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation);
} else {
[_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation);
};
} else {
// Switch to the units original animation, assuming
// TODO: what if the unit switched vehicle?
[_unit, _oldAnimation, 2] call EFUNC(common,doAnimation);
};
// EXIT PFH
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
if (!_hasMovedOut) then {
// Reset the unit back to the previous captive state.
[_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus);
// Swhich the unit back to its original group
//Unconscious units shouldn't be put in another group #527:
// [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
[_unit, false] call EFUNC(common,disableAI);
_unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP)
_unit setUnconscious false;
["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent);
// ensure this statement runs only once
_args set [5, true];
};
};
// Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs
if ((time - _startingTime) >= _minWaitingTime) exitwith {
if (!([_unit] call FUNC(getUnconsciousCondition))) then {
_unit setvariable ["ACE_isUnconscious", false, true];
};
};
}, 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false] ] call CBA_fnc_addPerFrameHandler;
[DFUNC(unconsciousPFH), 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler;
["medical_onUnconscious", [_unit, true]] call EFUNC(common,globalEvent);

View File

@ -129,7 +129,7 @@ if (isNil _callbackProgress) then {
// Patient Animation
_patientAnim = getText (_config >> "animationPatient");
if (_target getvariable ["ACE_isUnconscious", false]) then {
if (_target getvariable ["ACE_isUnconscious", false] && GVAR(allowUnconsciousAnimationOnTreatment)) then {
if !(animationState _target in (getArray (_config >> "animationPatientUnconsciousExcludeOn"))) then {
_patientAnim = getText (_config >> "animationPatientUnconscious");
};
@ -149,6 +149,8 @@ if (_caller == _target) then {
_callerAnim = [getText (_config >> "animationCallerSelf"), getText (_config >> "animationCallerSelfProne")] select (stance _caller == "PRONE");
};
_caller setvariable [QGVAR(selectedWeaponOnTreatment), currentWeapon _caller];
// Cannot use secondairy weapon for animation
if (currentWeapon _caller == secondaryWeapon _caller) then {
_caller selectWeapon (primaryWeapon _caller);

View File

@ -15,7 +15,7 @@
#include "script_component.hpp"
private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit"];
private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_specificClass", "_classID", "_effectivenessFound"];
_target = _this select 0;
_bandage = _this select 1;
_selectionName = _this select 2;

View File

@ -17,7 +17,7 @@
#include "script_component.hpp"
private ["_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems"];
private ["_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems", "_weaponSelect"];
_args = _this select 0;
_caller = _args select 0;
@ -34,6 +34,13 @@ if (vehicle _caller == _caller) then {
};
_caller setvariable [QGVAR(treatmentPrevAnimCaller), nil];
_weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]);
if (_weaponSelect != "") then {
_caller selectWeapon _weaponSelect;
} else {
_caller action ["SwitchWeapon", _caller, _caller, 99];
};
{
(_x select 0) addItem (_x select 1);
}foreach _usersOfItems;

View File

@ -17,7 +17,7 @@
#include "script_component.hpp"
private ["_caller", "_target","_selectionName","_className","_config","_callback"];
private ["_caller", "_target","_selectionName","_className","_config","_callback", "_weaponSelect"];
_args = _this select 0;
_caller = _args select 0;
_target = _args select 1;
@ -32,6 +32,13 @@ if (vehicle _caller == _caller) then {
};
_caller setvariable [QGVAR(treatmentPrevAnimCaller), nil];
_weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]);
if (_weaponSelect != "") then {
_caller selectWeapon _weaponSelect;
} else {
_caller action ["SwitchWeapon", _caller, _caller, 99];
};
// Record specific callback
_config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className);
if (GVAR(level) >= 2) then {

View File

@ -0,0 +1,97 @@
/*
* Author: Glowbal
* PFH logic for unconscious state
*
* Arguments:
* 0: The unit that will be put in an unconscious state <OBJECT>
*
* ReturnValue:
* nil
*
* Public: yes
*/
#include "script_component.hpp"
private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut", "_parachuteCheck"];
_args = _this select 0;
_unit = _args select 0;
_oldAnimation = _args select 1;
_originalPos = _args select 2;
_startingTime = _args select 3;
_minWaitingTime = _args select 4;
_hasMovedOut = _args select 5;
_parachuteCheck = _args select 6;
if (!alive _unit) exitwith {
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
[_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};
[_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus);
[_unit, false] call EFUNC(common,disableAI);
//_unit setUnitPos _originalPos;
_unit setUnconscious false;
["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent);
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
// In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation
if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith {
// TODO, handle this with carry instead, so we can remove the PFH here.
// Wait until the unit isn't being carried anymore, so we won't end up with wierd animations
if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then {
if (vehicle _unit == _unit) then {
if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then {
[_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation);
[_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation);
} else {
[_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation);
};
} else {
// Switch to the units original animation, assuming
// TODO: what if the unit switched vehicle?
[_unit, _oldAnimation, 2] call EFUNC(common,doAnimation);
};
["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent);
// EXIT PFH
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
if (!_hasMovedOut) then {
// Reset the unit back to the previous captive state.
[_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus);
// Swhich the unit back to its original group
//Unconscious units shouldn't be put in another group #527:
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
[_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};
[_unit, false] call EFUNC(common,disableAI);
_unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP)
_unit setUnconscious false;
// ensure this statement runs only once
_args set [5, true];
};
};
if (_parachuteCheck) then {
if !(vehicle _unit isKindOf "ParachuteBase") then {
[_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation);
_args set [6, false];
};
};
if (!local _unit) exitwith {
_args set [ 4, _minWaitingTime - (time - _startingTime)];
_unit setvariable [QGVAR(unconsciousArguments), _args, true];
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
// Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs
if ((time - _startingTime) >= _minWaitingTime) exitwith {
if (!([_unit] call FUNC(getUnconsciousCondition))) then {
_unit setvariable ["ACE_isUnconscious", false, true];
};
};

View File

@ -49,11 +49,11 @@ if (GVAR(currentApplicationPage) == 1) then {
} else { //Map Mode:
if (GVAR(mapAutoTrackPosition)) then {
_theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), GVAR(gpsPositionASL)];
_theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), (getPosASL ace_player)];
ctrlMapAnimCommit _theMap;
};
_size = 48 * _mapSize;
_theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], GVAR(gpsPositionASL), _size, _size, (getDir ace_player), '', 0 ];
_theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], (getPosASL ace_player), _size, _size, (getDir ace_player), '', 0 ];
if (GVAR(settingShowAllWaypointsOnMap)) then {
_size = 32 * _mapSize;

View File

@ -83,7 +83,6 @@ if ((_oldShowMode == DISPLAY_MODE_CLOSED) && {GVAR(currentShowMode) != DISPLAY_M
};
[_pfID] call CBA_fnc_removePerFrameHandler;
} else {
GVAR(gpsPositionASL) = getPosAsl ace_player;
if (GVAR(currentShowMode) == DISPLAY_MODE_HIDDEN) then {
//If display is hidden, and we can show, then swithc modes:
if ([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) then {

View File

@ -44,7 +44,7 @@ case (APP_MODE_INFODISPLAY): {
(_display displayCtrl IDC_MODEDISPLAY_NORTHING) ctrlSetText _northingText;
//Elevation:
_numASL = (GVAR(gpsPositionASL) select 2) + GVAR(mapAltitude);
_numASL = ((getPosASL ace_player) select 2) + GVAR(mapAltitude);
_aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber;
_aboveSeaLevelText = if (_numASL > 0) then {"+" + _aboveSeaLevelText + " MSL"} else {_aboveSeaLevelText + " MSL"};
(_display displayCtrl IDC_MODEDISPLAY_ELEVATIONNUM) ctrlSetText _aboveSeaLevelText;
@ -88,13 +88,13 @@ case (APP_MODE_INFODISPLAY): {
};
if (!(_targetPosLocationASL isEqualTo [])) then {
_bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearingText = if (GVAR(settingUseMils)) then {
[(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber;
} else {
([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8
};
_2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)];
_numASL = (_targetPosLocationASL select 2) + GVAR(mapAltitude);
_aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber;
@ -125,7 +125,7 @@ case (APP_MODE_COMPASS): {
(_display displayCtrl IDC_MODECOMPASS_RANGE) ctrlSetText "";
(_display displayCtrl IDC_MODECOMPASS_TARGET) ctrlSetText "";
} else {
_playerPos2d = GVAR(gpsPositionASL) select [0,2];
_playerPos2d = (getPosASL ace_player) select [0,2];
_targetPosName = "";
_targetPosLocationASL = [];
@ -145,13 +145,13 @@ case (APP_MODE_COMPASS): {
_rangeText = "---";
if (!(_targetPosLocationASL isEqualTo [])) then {
_bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearingText = if (GVAR(settingUseMils)) then {
[(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber;
} else {
([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8
};
_2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)];
};
@ -169,7 +169,7 @@ case (APP_MODE_WAYPOINTS): {
{
EXPLODE_2_PVT(_x,_wpName,_wpPos);
_wpListBox lbAdd _wpName;
_2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_wpPos select [0,2])) / 1000;
_2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_wpPos select [0,2])) / 1000;
_wpListBox lbSetTextRight [_forEachIndex, (format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)])];
} forEach _waypoints;

View File

@ -0,0 +1 @@
z\ace\addons\recoil

View File

@ -0,0 +1,255 @@
#define KICKBACK 1.6
#define MUZZLETEMP 1
#define MUZZLEPERM 0.1
#define MUZZLECLIMB_POS 1
#define MUZZLERIGHT_POS 0.4
#define MUZZLECLIMB_MAG 1
#define MUZZLERIGHT_MAG 1
class CfgRecoils {
class Default {
// doc: http://forums.bistudio.com/showthread.php?188999-Recoil-Overhaul-Feedback&s=dba8590ec07adb5ffa87f72d38dde6fc&p=2886744&viewfull=1#post2886744
// {horizontal axis position, vertical axis position, horizontal magnitude, vertical magnitude}
muzzleOuter[] = {0*MUZZLERIGHT_POS,0.4*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG};
// restricted area inside the outer ellipse where the recoil cannot end
muzzleInner[] = {0,0.05,0.2,0.2};
// minimum and maximum interval for backward force
kickBack[] = {0.05*KICKBACK,0.1*KICKBACK};
permanent = 0.1*MUZZLEPERM;
temporary = 0.01*MUZZLETEMP;
};
class recoil_default: Default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
muzzleInner[] = {0,0,0.1,0.1};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
permanent = 0.1*MUZZLEPERM;
temporary = 0.01*MUZZLETEMP;
};
class recoil_mk20: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.03*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mk20c: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_trg20: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_trg21: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.03*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mx: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mxc: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_sw: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_mxm: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_ktb: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_ktbc: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_smg_01: recoil_default {
muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.03*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_smg_02: recoil_default {
muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.02*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_pdw: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_sdar: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_pistol_p07: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.03*MUZZLETEMP;
};
class recoil_pistol_rook40: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_pistol_acpc2: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.04*MUZZLETEMP;
};
class recoil_pistol_4five: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.06*MUZZLETEMP;
};
class recoil_pistol_zubr: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.08*MUZZLETEMP;
};
class recoil_pistol_signal: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_rpg: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.08*KICKBACK,0.1*KICKBACK};
temporary = 0.1*MUZZLETEMP;
};
class recoil_nlaw: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.06*KICKBACK,0.08*KICKBACK};
temporary = 0.08*MUZZLETEMP;
};
class recoil_titan_long: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.1*KICKBACK,0.12*KICKBACK};
temporary = 0.15*MUZZLETEMP;
};
class recoil_titan_short: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.1*KICKBACK,0.12*KICKBACK};
temporary = 0.12*MUZZLETEMP;
};
class recoil_mk200: recoil_default {
muzzleOuter[] = {0.4*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_zafir: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.08*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_m320: recoil_default {
muzzleOuter[] = {1*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG};
kickBack[] = {0.08*KICKBACK,0.1*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_gm6: recoil_default {
muzzleOuter[] = {1.4*MUZZLERIGHT_POS,3.5*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.8*MUZZLECLIMB_MAG};
kickBack[] = {0.1*KICKBACK,0.12*KICKBACK};
temporary = 0.025*MUZZLETEMP;
};
class recoil_ebr: recoil_default {
muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.07*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_01: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.08*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_dmr_02: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.06*KICKBACK,0.08*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_03: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_dmr_04: recoil_default {
muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_dmr_05: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG};
kickBack[] = {0.08*KICKBACK,0.1*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_06: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.05*KICKBACK,0.1*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mmg_01: recoil_default {
muzzleOuter[] = {0.6*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.08*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_mmg_02: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
};

15
addons/recoil/config.cpp Normal file
View File

@ -0,0 +1,15 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author[] = {"commy2"};
authorUrl = "";
VERSION_CONFIG;
};
};
#include "CfgRecoils.hpp"

View File

@ -0,0 +1,12 @@
#define COMPONENT recoil
#include "\z\ace\addons\main\script_mod.hpp"
#ifdef DEBUG_ENABLED_RECOIL
#define DEBUG_MODE_FULL
#endif
#ifdef DEBUG_ENABLED_RECOIL
#define DEBUG_SETTINGS DEBUG_ENABLED_RECOIL
#endif
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -4,7 +4,7 @@
if !(hasInterface) exitWith {};
// Add keybinds
["ACE3", QGVAR(SelectPistol), localize "STR_ACE_WeaponSelect_SelectPistol",
["ACE3", QGVAR(SelectPistolNew), localize "STR_ACE_WeaponSelect_SelectPistol",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false};
@ -13,12 +13,12 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, handgunWeapon ACE_player] call FUNC(selectWeaponMode);
true
false
},
{false},
[2, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key
["ACE3", QGVAR(SelectRifle), localize "STR_ACE_WeaponSelect_SelectRifle",
["ACE3", QGVAR(SelectRifleNew), localize "STR_ACE_WeaponSelect_SelectRifle",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false};
@ -27,12 +27,12 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, primaryWeapon ACE_player] call FUNC(selectWeaponMode);
true
false
},
{false},
[3, [false, false, false]], false] call cba_fnc_addKeybind; //2 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //2 Key
["ACE3", QGVAR(SelectRifleMuzzle), localize "STR_ACE_WeaponSelect_SelectRifleMuzzle",
["ACE3", QGVAR(SelectRifleMuzzleNew), localize "STR_ACE_WeaponSelect_SelectRifleMuzzle",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false};
@ -41,12 +41,12 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, primaryWeapon ACE_player] call FUNC(selectWeaponMuzzle);
true
false
},
{false},
[4, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key
["ACE3", QGVAR(SelectLauncher), localize "STR_ACE_WeaponSelect_SelectLauncher",
["ACE3", QGVAR(SelectLauncherNew), localize "STR_ACE_WeaponSelect_SelectLauncher",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false};
@ -55,12 +55,12 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, secondaryWeapon ACE_player] call FUNC(selectWeaponMode);
true
false
},
{false},
[5, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key
["ACE3", QGVAR(SelectBinocular), localize "STR_ACE_WeaponSelect_SelectBinocular",
["ACE3", QGVAR(SelectBinocularNew), localize "STR_ACE_WeaponSelect_SelectBinocular",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false};
@ -69,10 +69,10 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, binocular ACE_player] call FUNC(selectWeaponMode);
true
false
},
{false},
[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key
["ACE3", QGVAR(SelectGrenadeFrag), localize "STR_ACE_WeaponSelect_SelectGrenadeFrag",
{
@ -144,7 +144,7 @@ if !(hasInterface) exitWith {};
{false},
[2, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key
["ACE3", QGVAR(SelectMainGun), localize "STR_ACE_WeaponSelect_SelectMainGun",
["ACE3", QGVAR(SelectMainGunNew), localize "STR_ACE_WeaponSelect_SelectMainGun",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false};
@ -153,12 +153,12 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, vehicle ACE_player, 0] call FUNC(selectWeaponVehicle);
true
false
},
{false},
[4, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key
["ACE3", QGVAR(SelectMachineGun), localize "STR_ACE_WeaponSelect_SelectMachineGun",
["ACE3", QGVAR(SelectMachineGunNew), localize "STR_ACE_WeaponSelect_SelectMachineGun",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false};
@ -167,12 +167,12 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, vehicle ACE_player, 1] call FUNC(selectWeaponVehicle);
true
false
},
{false},
[5, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key
["ACE3", QGVAR(SelectMissiles), localize "STR_ACE_WeaponSelect_SelectMissiles",
["ACE3", QGVAR(SelectMissilesNew), localize "STR_ACE_WeaponSelect_SelectMissiles",
{
// Conditions: canInteract
if !([ACE_player, ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false};
@ -181,10 +181,10 @@ if !(hasInterface) exitWith {};
// Statement
[ACE_player, vehicle ACE_player, 2] call FUNC(selectWeaponVehicle);
true
false
},
{false},
[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key
[0, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key
["ACE3", QGVAR(FireSmokeLauncher), localize "STR_ACE_WeaponSelect_FireSmokeLauncher",
{

2801
extras/CfgAmmoReference.hpp Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,36 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"};
author[]={"OnkelDisMaster"};
authorUrl = "http://2.xn--gebirgsjgerkompanie-nwb.de/";
VERSION_CONFIG;
};
};
class asdg_SlotInfo;
class asdg_FrontSideRail: asdg_SlotInfo {
class compatibleItems {
ACE_acc_pointer_red = 1;
ACE_acc_pointer_green = 1;
};
};
class asdg_OpticRail;
class asdg_OpticRail1913: asdg_OpticRail {
class compatibleItems {
ACE_optic_Hamr_2D = 1;
ACE_optic_Hamr_PIP = 1;
ACE_optic_Arco_2D = 1;
ACE_optic_Arco_PIP = 1;
ACE_optic_MRCO_2D = 1;
ACE_optic_SOS_2D = 1;
ACE_optic_SOS_PIP = 1;
ACE_optic_LRPS_2D = 1;
ACE_optic_LRPS_PIP = 1;
};
};

View File

@ -0,0 +1,5 @@
#define COMPONENT asdg_comp
#include "\z\ace\addons\main\script_mod.hpp"
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -39,6 +39,11 @@ prefix = z\ace\addons
# Default: <work_drive>\<prefix>\addons
module_root = P:\z\ace\addons
# Set the location where the optional addon source folders (i.e. P:\z\ace\optionals)
# Default: <work_drive>\<prefix>\optionals
optionals_root = P:\z\ace\optionals
# Directory where the built addon will be saved.
# Default: release
release_dir = P:\z\ace\release

View File

@ -30,7 +30,7 @@
###############################################################################
__version__ = "0.3dev"
__version__ = "0.4"
import sys
@ -54,6 +54,13 @@ import re
if sys.platform == "win32":
import winreg
######## GLOBALS #########
work_drive = ""
module_root = ""
release_dir = ""
module_root_parent = ""
optionals_root = ""
###############################################################################
# http://akiscode.com/articles/sha-1directoryhash.shtml
# Copyright (c) 2009 Stephen Akiki
@ -284,11 +291,122 @@ def print_yellow(msg):
print(msg)
color("reset")
def copy_important_files(source_dir,destination_dir):
originalDir = os.getcwd()
importantFiles = ["mod.cpp",
"README.md",
"AUTHORS.txt",
"LICENSE",
"logo_ace3_ca.paa"
]
print_yellow ("source_dir: " + source_dir)
print_yellow("destination_dir: " + destination_dir)
#copy importantFiles
try:
print_blue("\nSearching for important files in " + source_dir)
for file in importantFiles:
print_green("Copying file => " + os.path.join(source_dir,file))
shutil.copyfile(os.path.join(source_dir,file),os.path.join(destination_dir,file))
except:
print_error("COPYING IMPORTANT FILES.")
raise
#copy all extension dlls
try:
os.chdir(os.path.join(source_dir))
print_blue("\nSearching for DLLs in " + os.getcwd())
filenames = glob.glob("*.dll")
if not filenames:
print ("Empty SET")
for dll in filenames:
print_green("Copying dll => " + os.path.join(source_dir,dll))
if os.path.isfile(dll):
shutil.copyfile(os.path.join(source_dir,dll),os.path.join(destination_dir,dll))
except:
print_error("COPYING DLL FILES.")
raise
finally:
os.chdir(originalDir)
def copy_optionals_for_building(mod,pbos):
src_directories = os.listdir(optionals_root)
current_dir = os.getcwd()
print("")
try:
#special server.pbo processing
files = glob.glob(os.path.join(release_dir, "@ace","optionals","*.pbo"))
for file in files:
file_name = os.path.basename(file)
print ("Adding the following file: " + file_name)
pbos.append(file_name)
pbo_path = os.path.join(release_dir, "@ace","optionals",file_name)
if (os.path.isfile(pbo_path)):
print("Moving " + pbo_path + " for processing.")
shutil.move(pbo_path, os.path.join(release_dir,"@ace","addons",file_name))
except:
print_error("Error in moving")
raise
finally:
os.chdir(current_dir)
print("")
try:
for dir_name in src_directories:
mod.append(dir_name)
if (dir_name == "userconfig"):
destination = os.path.join(work_drive,dir_name)
else:
destination = os.path.join(module_root,dir_name)
print("Temporarily copying " + os.path.join(optionals_root,dir_name) + " => " + destination + " for building.")
shutil.rmtree(destination, True)
shutil.copytree(os.path.join(optionals_root,dir_name), destination)
except:
print_error("Copy Optionals Failed")
raise
finally:
os.chdir(current_dir)
def cleanup_optionals(mod,pbos):
print("")
try:
for dir_name in mod:
if (dir_name == "userconfig"):
destination = os.path.join(work_drive,dir_name)
else:
destination = os.path.join(module_root,dir_name)
print("Cleaning " + destination)
try:
file_name = "ace_{}.pbo".format(dir_name)
src_file_path = os.path.join(release_dir, "@ace","addons",file_name)
dst_file_path = os.path.join(release_dir, "@ace","optionals",file_name)
if (os.path.isfile(src_file_path)):
#print("Preserving " + file_name)
os.renames(src_file_path,dst_file_path)
except FileExistsError:
print_error(file_name + " already exists")
continue
shutil.rmtree(destination)
except:
print_error("Cleaning Optionals Failed")
raise
###############################################################################
def main(argv):
"""Build an Arma addon suite in a directory from rules in a make.cfg file."""
print_blue(("\nmake.py for Arma, v" + __version__))
print_blue(("\nmake.py for Arma, modified for Advanced Combat Environment v" + __version__))
if sys.platform != "win32":
print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.")
@ -321,6 +439,7 @@ make.py [help] [test] [force] [key <name>] [target <name>] [release <version>]
test -- Copy result to Arma 3.
release <version> -- Make archive with <version>.
force -- Ignore cache and build all.
checkexternal -- Check External Files
target <name> -- Use rules in make.cfg under heading [<name>] rather than
default [Make]
key <name> -- Use key in working directory with <name> to sign. If it does not
@ -378,6 +497,12 @@ See the make.cfg file for additional build options.
quiet = True
argv.remove("quiet")
if "checkexternal" in argv:
argv.remove("checkexternal")
check_external = True
else:
check_external = False
# Get the directory the make script is in.
make_root = os.path.dirname(os.path.realpath(__file__))
make_root_parent = os.path.abspath(os.path.join(os.getcwd(), os.pardir))
@ -396,6 +521,12 @@ See the make.cfg file for additional build options.
cfg = configparser.ConfigParser();
try:
global work_drive
global module_root
global release_dir
global module_root_parent
global optionals_root
cfg.read(os.path.join(make_root, "make.cfg"))
# Project name (with @ symbol)
@ -429,27 +560,35 @@ See the make.cfg file for additional build options.
# Release/build directory, relative to script dir
release_dir = cfg.get(make_target, "release_dir", fallback="release")
# Project PBO file prefix (files are renamed to prefix_name.pbo)
pbo_name_prefix = cfg.get(make_target, "pbo_name_prefix", fallback=None)
# Project module Root
module_root_parent = os.path.abspath(os.path.join(os.path.join(work_drive, prefix), os.pardir))
module_root = cfg.get(make_target, "module_root", fallback=os.path.join(make_root_parent, "addons"))
optionals_root = os.path.join(module_root_parent, "optionals")
print_green ("module_root: " + module_root)
if (os.path.isdir(module_root)):
os.chdir(module_root)
else:
print_error ("Directory " + module_root + " does not exist.")
sys.exit()
if (os.path.isdir(optionals_root)):
print_green ("optionals_root: " + optionals_root)
else:
print_error ("Directory " + optionals_root + " does not exist.")
sys.exit()
print_green ("release_dir: " + release_dir)
except:
raise
print_error("Could not parse make.cfg.")
sys.exit(1)
# See if we have been given specific modules to build from command line.
if len(argv) > 1 and not make_release:
arg_modules = True
@ -492,9 +631,14 @@ See the make.cfg file for additional build options.
print ("No cache found.")
cache = {}
#Temporarily copy optionals_root for building. They will be removed later.
optionals_modules = []
optional_files = []
copy_optionals_for_building(optionals_modules,optional_files)
# Get list of subdirs in make root.
dirs = next(os.walk(module_root))[1]
# Autodetect what directories to build.
if module_autodetect and not arg_modules:
modules = []
@ -537,7 +681,8 @@ See the make.cfg file for additional build options.
# For each module, prep files and then build.
for module in modules:
print_green("\nMaking " + module + "-"*max(1, (60-len(module))))
missing = False
# Cache check
if module in cache:
old_sha = cache[module]
@ -550,10 +695,15 @@ See the make.cfg file for additional build options.
# Hash the module
new_sha = get_directory_hash(os.path.join(module_root, module))
# Is the pbo file missing?
missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "ace_{}.pbo".format(module)))
if missing:
print("ace_{}.pbo".format(module) + " is missing. Building...")
# Check if it needs rebuilt
# print ("Hash:", new_sha)
if old_sha == new_sha:
if old_sha == new_sha and not missing:
if not force_build:
print("Module has not changed.")
# Skip everything else
@ -658,7 +808,10 @@ See the make.cfg file for additional build options.
cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")]
else:
cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"]
if check_external:
cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"]
else:
cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"]
color("grey")
if quiet:
@ -841,6 +994,8 @@ See the make.cfg file for additional build options.
except:
print_error("Could not copy files. Is Arma 3 running?")
copy_important_files(module_root_parent,os.path.join(release_dir, "@ace"))
cleanup_optionals(optionals_modules,optional_files)
if __name__ == "__main__":
main(sys.argv)
input("Press Enter to continue...")