diff --git a/AUTHORS.txt b/AUTHORS.txt index 83f759c0ce..737bfb590b 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -18,28 +18,37 @@ Kieran NouberNou PabstMirror Ruthberg +SilentSpike tpM ViperMaul VKing Walter Pearce # CONTRIBUTORS -11RDP-LoupVert [BIG]Bull +11RDP-LoupVert ACCtomeek +adam3adam Adanteh aeroson -alef Aggr094 +alef +Aleksey EpMAK Yermakov Alganthe Anthariel +Asgar Serran +Bla1337 +BlackPixxel BlackQwar Brakoviejo Brisse BullHorn Clon1998 Codingboy +Coren Crusty +Dharma Bellamkonda +Dimaslg eRazeri evromalarkey Falke75 @@ -49,53 +58,46 @@ Filip Basara FreeZbe geraldbolso1899 Ghost +Gianmarco Varriale (TeamNuke) GieNkoV gpgpgpgp Grzegorz -Gianmarco Varriale (TeamNuke) Hamburger SV Harakhti havena Hawkins -jokoho482 +jokoho482 ` Jonpas +Kavinsky Kllrt +legman Legolasindar "Viper" licht-im-Norden87 +Macusercom MarcBook meat Michail Nikolaev nic547 +nikolauska nomisum +OnkelDisMaster oscarmolinadev pokertour +Professor rakowozz +ramius86 Raspu86 Riccardo Petricca Robert Boklahánics -ramius86 -SilentSpike +ruPaladin simon84 Sniperwolf572 +SzwedzikPL Tachi Toaster Tonic Tourorist Valentin Torikian -zGuba -Aleksey EpMAK Yermakov -ruPaladin -BlackPixxel -Asgar Serran -Kavinsky -Coren -OnkelDisMaster -Dimaslg VyMajoris(W-Cephei) -Bla1337 -nikolauska -adam3adam -Professor Winter -Dharma Bellamkonda -legman +zGuba diff --git a/README.md b/README.md index 4ed84011bf..72b1336b57 100644 --- a/README.md +++ b/README.md @@ -4,23 +4,23 @@

- ACE version - - + ACE download - ACE issues - - + BIF thread - ACE license

diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll index 0a14d846b5..dd19f1d0d4 100644 Binary files a/ace_advanced_ballistics.dll and b/ace_advanced_ballistics.dll differ diff --git a/ace_medical.dll b/ace_medical.dll new file mode 100644 index 0000000000..1f4f71d5ca Binary files /dev/null and b/ace_medical.dll differ diff --git a/addons/advanced_ballistics/ACE_Settings.hpp b/addons/advanced_ballistics/ACE_Settings.hpp index c931ce4d21..757385deb3 100644 --- a/addons/advanced_ballistics/ACE_Settings.hpp +++ b/addons/advanced_ballistics/ACE_Settings.hpp @@ -5,30 +5,30 @@ class ACE_Settings { typeName = "BOOL"; value = 0; }; - class GVAR(alwaysSimulateForSnipers) { - displayName = "Always Enabled For Snipers"; - description = "Always enables advanced ballistics when high power optics are used"; + class GVAR(simulateForSnipers) { + displayName = "Enabled For Snipers"; + description = "Enables advanced ballistics for non local snipers (when using high power optics)"; typeName = "BOOL"; value = 1; }; - class GVAR(alwaysSimulateForGroupMembers) { - displayName = "Always Enabled For Group Members"; - description = "Always enables advanced ballistics when a group member fires"; + class GVAR(simulateForGroupMembers) { + displayName = "Enabled For Group Members"; + description = "Enables advanced ballistics for non local group members"; + typeName = "BOOL"; + value = 0; + }; + class GVAR(simulateForEveryone) { + displayName = "Enabled For Everyone"; + description = "Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer)"; typeName = "BOOL"; value = 0; }; class GVAR(disabledInFullAutoMode) { displayName = "Disabled In FullAuto Mode"; - description = "Disables the advanced ballistics during full auto fire"; + description = "Disables advanced ballistics during full auto fire"; typeName = "BOOL"; value = 0; }; - class GVAR(onlyActiveForLocalPlayers) { - displayName = "Disabled For Non Local Players"; - description = "Disables the advanced ballistics for bullets coming from other players (enable this if you encounter frame drops during heavy firefights in multiplayer)"; - typeName = "BOOL"; - value = 1; - }; /* // TODO: We currently do not have firedEHs on vehicles class GVAR(vehicleGunnerEnabled) { displayName = "Enabled For Vehicle Gunners"; diff --git a/addons/advanced_ballistics/CfgVehicles.hpp b/addons/advanced_ballistics/CfgVehicles.hpp index 642faeda96..27ccb2377b 100644 --- a/addons/advanced_ballistics/CfgVehicles.hpp +++ b/addons/advanced_ballistics/CfgVehicles.hpp @@ -2,7 +2,7 @@ class CfgVehicles { class ACE_Module; class GVAR(ModuleSettings): ACE_Module { scope = 2; - displayName = "$STR_ACE_AdvancedBallistics_DisplayName"; + displayName = CSTRING(DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Wind_ca.paa)); category = "ACE"; function = QUOTE(DFUNC(initModuleSettings)); @@ -12,35 +12,35 @@ class CfgVehicles { author = "Ruthberg"; class Arguments { class enabled { - displayName = "$STR_ACE_AdvancedBallistics_enabled_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_enabled_Description"; + displayName = CSTRING(enabled_DisplayName); + description = CSTRING(enabled_Description); typeName = "BOOL"; defaultValue = 0; }; - class alwaysSimulateForSnipers { - displayName = "$STR_ACE_AdvancedBallistics_alwaysSimulateForSnipers_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_alwaysSimulateForSnipers_Description"; + class simulateForSnipers { + displayName = CSTRING(simulateForSnipers_DisplayName); + description = CSTRING(simulateForSnipers_Description); typeName = "BOOL"; defaultValue = 1; }; - class alwaysSimulateForGroupMembers { - displayName = "$STR_ACE_AdvancedBallistics_alwaysSimulateForGroupMembers_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_alwaysSimulateForGroupMembers_Description"; + class simulateForGroupMembers { + displayName = CSTRING(simulateForGroupMembers_DisplayName); + description = CSTRING(simulateForGroupMembers_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class simulateForEveryone { + displayName = CSTRING(simulateForEveryone_DisplayName); + description = CSTRING(simulateForEveryone_Description); typeName = "BOOL"; defaultValue = 0; }; class disabledInFullAutoMode { - displayName = "$STR_ACE_AdvancedBallistics_disabledInFullAutoMod_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_disabledInFullAutoMod_Description"; + displayName = CSTRING(disabledInFullAutoMod_DisplayName); + description = CSTRING(disabledInFullAutoMod_Description); typeName = "BOOL"; defaultValue = 0; }; - class onlyActiveForLocalPlayers { - displayName = "$STR_ACE_AdvancedBallistics_onlyActiveForLocalPlayers_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_onlyActiveForLocalPlayers_Description"; - typeName = "BOOL"; - defaultValue = 1; - }; /* // TODO: We currently do not have firedEHs on vehicles class vehicleGunnerEnabled { displayName = "Enabled For Vehicle Gunners"; @@ -50,38 +50,38 @@ class CfgVehicles { }; */ class ammoTemperatureEnabled { - displayName = "$STR_ACE_AdvancedBallistics_ammoTemperatureEnabled_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_ammoTemperatureEnabled_Description"; + displayName = CSTRING(ammoTemperatureEnabled_DisplayName); + description = CSTRING(ammoTemperatureEnabled_Description); typeName = "BOOL"; defaultValue = 1; }; class barrelLengthInfluenceEnabled { - displayName = "$STR_ACE_AdvancedBallistics_barrelLengthInfluenceEnabled_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_barrelLengthInfluenceEnabled_Description"; + displayName = CSTRING(barrelLengthInfluenceEnabled_DisplayName); + description = CSTRING(barrelLengthInfluenceEnabled_Description); typeName = "BOOL"; defaultValue = 1; }; class bulletTraceEnabled { - displayName = "$STR_ACE_AdvancedBallistics_bulletTraceEnabled_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_bulletTraceEnabled_Description"; + displayName = CSTRING(bulletTraceEnabled_DisplayName); + description = CSTRING(bulletTraceEnabled_Description); typeName = "BOOL"; defaultValue = 1; }; class simulationInterval { - displayName = "$STR_ACE_AdvancedBallistics_simulationInterval_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_simulationInterval_Description"; + displayName = CSTRING(simulationInterval_DisplayName); + description = CSTRING(simulationInterval_Description); typeName = "NUMBER"; defaultValue = 0.0; }; class simulationRadius { - displayName = "$STR_ACE_AdvancedBallistics_simulationRadius_DisplayName"; - description = "$STR_ACE_AdvancedBallistics_simulationRadius_Description"; + displayName = CSTRING(simulationRadius_DisplayName); + description = CSTRING(simulationRadius_Description); typeName = "NUMBER"; defaultValue = 3000; }; }; class ModuleDescription { - description = "$STR_ACE_AdvancedBallistics_Description"; + description = CSTRING(Description); }; }; }; \ No newline at end of file diff --git a/addons/advanced_ballistics/RscTitles.hpp b/addons/advanced_ballistics/RscTitles.hpp index b62af875d2..6deaf0a058 100644 --- a/addons/advanced_ballistics/RscTitles.hpp +++ b/addons/advanced_ballistics/RscTitles.hpp @@ -1,17 +1,13 @@ -class RscTitles -{ - class RscTurretDial - { +class RscTitles { + class RscTurretDial { idd=-1; onLoad="with uiNameSpace do { RscTurretDial = _this select 0 };"; movingEnable=0; duration=5; fadeIn="false"; fadeOut="false"; - class controls - { - class RscTurretDial - { + class controls { + class RscTurretDial { idc=132949; type=0; style=128; @@ -28,18 +24,15 @@ class RscTitles }; }; - class RscProtractor - { + class RscProtractor { idd=-1; onLoad="with uiNameSpace do { RscProtractor = _this select 0 };"; movingEnable=0; duration=60; fadeIn="false"; fadeOut="false"; - class controls - { - class RscProtractorBase - { + class controls { + class RscProtractorBase { idc=132950; type=0; style=48; @@ -54,8 +47,7 @@ class RscTitles sizeEx=0.027; text=""; }; - class RscProtractorMarker : RscProtractorBase - { + class RscProtractorMarker : RscProtractorBase { idc=132951; }; }; diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index b59737412a..b199acb9e5 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -5,7 +5,7 @@ GVAR(currentbulletID) = -1; GVAR(Protractor) = false; -GVAR(ProtractorStart) = time; +GVAR(ProtractorStart) = ACE_time; GVAR(currentGrid) = 0; GVAR(initMessageEnabled) = false; diff --git a/addons/advanced_ballistics/config.cpp b/addons/advanced_ballistics/config.cpp index 1a2187783b..3f974b18df 100644 --- a/addons/advanced_ballistics/config.cpp +++ b/addons/advanced_ballistics/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_ballistics", "ace_weather", "ace_modules"}; + requiredAddons[] = {"ace_ballistics", "ace_weather"}; author[] = {"Ruthberg"}; authorUrl = "https://github.com/ulteq"; VERSION_CONFIG; diff --git a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf index 5fbdf2f12a..1a4c344b2e 100644 --- a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf +++ b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf @@ -45,12 +45,12 @@ GVAR(Protractor) = true; 1 cutRsc ["RscProtractor", "PLAIN", 1, false]; - __ctrl1 ctrlSetScale 0.75; + __ctrl1 ctrlSetScale 1; __ctrl1 ctrlCommit 0; __ctrl1 ctrlSetText QUOTE(PATHTOF(UI\protractor.paa)); __ctrl1 ctrlSetTextColor [1, 1, 1, 1]; - __ctrl2 ctrlSetScale 0.75; + __ctrl2 ctrlSetScale 1; __ctrl2 ctrlSetPosition [(_refPosition select 0), (_refPosition select 1) - 0.0012 * _inclinationAngle, (_refPosition select 2), (_refPosition select 3)]; __ctrl2 ctrlCommit 0; __ctrl2 ctrlSetText QUOTE(PATHTOF(UI\protractor_marker.paa)); diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index 33bd02a4e7..2c3488f92d 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -35,17 +35,17 @@ if (!([_unit] call EFUNC(common,isPlayer))) exitWith {}; if (underwater _unit) exitWith {}; if (!(_ammo isKindOf "BulletBase")) exitWith {}; if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {}; -if (GVAR(onlyActiveForLocalPlayers) && !(local _unit)) then { +if (!GVAR(simulateForEveryone) && !(local _unit)) then { // The shooter is non local _abort = true; - if (GVAR(alwaysSimulateForSnipers)) then { + if (GVAR(simulateForSnipers)) then { if (currentWeapon _unit == primaryWeapon _unit && count primaryWeaponItems _unit > 2) then { _opticsName = (primaryWeaponItems _unit) select 2; _opticType = getNumber(configFile >> "CfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType"); _abort = _opticType != 2; // We only abort if the non local shooter is not a sniper }; }; - if (GVAR(alwaysSimulateForGroupMembers) && _abort) then { + if (GVAR(simulateForGroupMembers) && _abort) then { _abort = (group ACE_player) != (group _unit); }; }; @@ -114,7 +114,7 @@ if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) th GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; -"ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _AmmoCacheEntry select 0, _AmmoCacheEntry select 6, _AmmoCacheEntry select 7, _AmmoCacheEntry select 8, _AmmoCacheEntry select 5, _stabilityFactor, _WeaponCacheEntry select 1, _muzzleVelocity, _AmmoCacheEntry select 4, getPosASL _bullet, EGVAR(weather,Latitude), EGVAR(weather,currentTemperature), EGVAR(weather,Altitude), EGVAR(weather,currentHumidity), overcast, floor(time), time - floor(time)]; +"ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _AmmoCacheEntry select 0, _AmmoCacheEntry select 6, _AmmoCacheEntry select 7, _AmmoCacheEntry select 8, _AmmoCacheEntry select 5, _stabilityFactor, _WeaponCacheEntry select 1, _muzzleVelocity, _AmmoCacheEntry select 4, getPosASL _bullet, EGVAR(weather,Latitude), EGVAR(weather,currentTemperature), EGVAR(weather,Altitude), EGVAR(weather,currentHumidity), overcast, floor(ACE_time), ACE_time - floor(ACE_time)]; [{ private ["_args", "_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"]; @@ -133,10 +133,10 @@ GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; [_this select 1] call cba_fnc_removePerFrameHandler; }; - if (_bulletTraceVisible && _bulletSpeed > 600) then { - drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.0157480315*_caliber,0.00787401574*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; + if (_bulletTraceVisible && _bulletSpeed > 500) then { + drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.02*_caliber,0.01*_caliber],[[0,0,0,0.65],[0,0,0,0.2]],[1,0],0,0,"","",""]; }; - call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(time), time - floor(time)]); + call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(ACE_time), ACE_time - floor(ACE_time)]); }, GVAR(simulationInterval), [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf index 554d9470b9..186c0d0649 100644 --- a/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf +++ b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf @@ -26,10 +26,10 @@ if !(_activated) exitWith {}; [_logic, QGVAR(ammoTemperatureEnabled), "ammoTemperatureEnabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(barrelLengthInfluenceEnabled), "barrelLengthInfluenceEnabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(bulletTraceEnabled), "bulletTraceEnabled"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(onlyActiveForLocalPlayers), "onlyActiveForLocalPlayers"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(simulateForEveryone), "simulateForEveryone"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(disabledInFullAutoMode), "disabledInFullAutoMode"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(alwaysSimulateForSnipers), "alwaysSimulateForSnipers"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(alwaysSimulateForGroupMembers), "alwaysSimulateForGroupMembers"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(simulateForSnipers), "simulateForSnipers"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(simulateForGroupMembers), "simulateForGroupMembers"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(simulationInterval), "simulationInterval"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(simulationRadius), "simulationRadius"] call EFUNC(common,readSettingFromModule); diff --git a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf index 93a79138c6..b2fc7ba084 100644 --- a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf +++ b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf @@ -18,7 +18,7 @@ if (!GVAR(extensionAvailable)) exitWith {}; private ["_initStartTime", "_mapSize", "_mapGrids", "_gridCells", "_x", "_y", "_gridCenter", "_gridHeight", "_gridNumObjects", "_gridSurfaceIsWater"]; -_initStartTime = time; +_initStartTime = ACE_time; _mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"); if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith { @@ -41,7 +41,7 @@ GVAR(currentGrid) = 0; if (GVAR(currentGrid) >= _gridCells) exitWith { if (GVAR(initMessageEnabled)) then { - systemChat format["AdvancedBallistics: Finished terrain initialization in %1 seconds", ceil(time - _initStartTime)]; + systemChat format["AdvancedBallistics: Finished terrain initialization in %1 seconds", ceil(ACE_time - _initStartTime)]; }; [_this select 1] call cba_fnc_removePerFrameHandler; }; diff --git a/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf b/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf index cbf8731336..8a1a29f7b0 100644 --- a/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf +++ b/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf @@ -4,7 +4,7 @@ * Reads the weapon class config and updates the config cache * * Arguments: - * 0: ammo - classname + * 0: weapon - classname * * Return Value: * 0: [_barrelTwist, _twistDirection, _barrelLength] diff --git a/addons/advanced_ballistics/initKeybinds.sqf b/addons/advanced_ballistics/initKeybinds.sqf index cddf47877a..102107dadc 100644 --- a/addons/advanced_ballistics/initKeybinds.sqf +++ b/addons/advanced_ballistics/initKeybinds.sqf @@ -1,4 +1,4 @@ -["ACE3 Equipment", QGVAR(ProtractorKey), localize "STR_ACE_AdvancedBallistics_ProtractorKey", +["ACE3 Equipment", QGVAR(ProtractorKey), localize LSTRING(ProtractorKey), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 79c2ec7c52..8ba88dee2b 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -1,7 +1,7 @@  - - + + Show Wind Info Pokaż inf. o wietrze Mostra indicazioni del vento @@ -13,7 +13,7 @@ Zobrazit informace o větru Mostrar Informação do Vento - + Show Protractor Pokaż kątomierz Mostra il rapportatore @@ -25,91 +25,195 @@ Zobrazit úhloměr Mostrar Transferidor - + Advanced Ballistics Zaawansowana balistyka + Balística avanzada + Erweiterte Ballistik + Pokročilá balistika + Balística avançada - + Advanced Ballistics Zaawansowana balistyka + Balística avanzada + Erweiterte Ballistik + Pokročilá balistika + Balística avançada - + Enables advanced ballistics Aktywuje zaawansowaną balistykę + Activa la balística avanzada + Aktiviert die erweiterte Ballistik + Aktivuje pokročilou balistiku + Ativa balística avançada - - Always Enabled For Snipers - Zawsze akt. dla snajp. + + Enabled For Snipers + Activada para francotiradores + Akt. dla snajperów + Für Scharfschützen aktiviert + Povoleno pro odstřelovače + Ativar para caçadores - - Always enables advanced ballistics when high power optics are used - Aktywuje zaawansowaną balistykę zawsze, kiedy używana jest optyka + + Enables advanced ballistics for non local snipers (when using high power optics) + Activa la balística avanzada para francotiradores no locales (cuando se usa una mira telescópica) + Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki) + Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung) + Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku) + Ativa balística avançada para caçadores não locais (quando usando miras telescópicas) - + + Enabled For Group Members + Activada para miembros de grupo + Akt. dla czł. grupy + Für Gruppenmitglieder aktiviert + Povoleno pro členy skupiny + Ativada para membros do grupo + + + Enables advanced ballistics for non local group members + Activada la balística avanzada para miembros de grupo no locales + Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy + Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder + Aktivuje pokročilou balistiku pro nelokální členy skupiny + Ativa balística avançada para membros de grupo não locais + + + Enabled For Everyone + Activada para todos + Akt. dla wszystkich + Für jeden aktiviert + Povoleno pro všechny + Ativada para todos + + + Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer) + Activada la balística avanzada para todos los jugadores no locales (activarlo puede degradar el rendimiento durante grandes tiroteos en multijugador). + Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia) + Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen) + Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru) + Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer) + + Always Enabled For Group Members + Zawsze akt. dla czł. grupy + Siempre activada para miembros de grupo + Für Gruppenmitglieder immer aktiviert + Vždy povoleno pro členy skupiny + Sempre ativada para membros do grupo - + Always enables advanced ballistics when a group member fires + Aktywuje zaawansowaną balistykę dla wszystkich członków grupy + Activada la balística avanzada siempre cuando miembros de grupo disparan + Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt + Aktivuje pokročilou balistiku pro členy skupiny + Sempre ative balística avançada quando um membro do grupo disparar - + Disabled In FullAuto Mode Wył. podczas ognia auto. + Desactivada en modo automático + Beim vollautomatischen Feuern deaktiviert + Zakázáno v automatickém režimu střelby + Desabilitar no modo automático - + Disables the advanced ballistics during full auto fire Dezaktywuje zaawansowaną balistykę podczas ognia automatycznego + Desactivada la balística avanzada durante el fuego automático + Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern + Zákáže pokročilou balistiku během střelby v režimu automat + Desabilitar a balística avançada durante fogo automático - - Disabled For Non Local Players - Wyłącz dla nielok. graczy - - - Disables the advanced ballistics for bullets coming from other players (enable this if you encounter frame drops during heavy firefights in multiplayer) - Dezaktywuje zaawansowaną balistykę dla pocisków pochodzących od innych graczy(aktywuj tą opcję jeżeli odczuwasz spadki FPS podczas sporych strzelanin w MP) - - + Enable Ammo Temperature Simulation Symulacja temp. amunicji + Activar simulación de temperatura de munición + Simulation der Munitionstemperatur aktivieren + Povolit simulaci teploty munice + Ativar simulação de temperatura de munição - + Muzzle velocity varies with ammo temperature Prędkość wylotowa pocisku jest zależna od temperatury amunicji + La velocidad de salida varía con la temperatura de la munición + Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit + Úsťová rychlost je závislá na teplotě munice + A velocidade de saída varia com a temperatura da munição - + Enable Barrel Length Simulation Symulacja długości lufy + Habilitar la simulación de longitud del cañón + Simulation der Lauflänge aktivieren + Povolit simulaci délky hlavně + Ativar a simulação de comprimento do cano - + Muzzle velocity varies with barrel length Prędkość wylotowa pocisku jest zależna od długości lufy + La velocidad de salidal varía con la longitud del cañón + Lauflänge beeinflusst Mündungsgeschwindigkeit + Úsťová rychlost je závislá na délce hlavně + A velocidade de saída caria com o comprimento do cano - + Enable Bullet Trace Effect Efekt smugi pocisku + Activar el efecto trazador de la bala + Geschossspureffekt aktivieren + Povolit efekt trasírek + Ativa efeito traçante de projétil - + Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics) Aktywuje efekt smugi pocisku dla pocisków wysokokalibrowych (widoczne tylko podczas patrzenia przez optykę) + Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica) + Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) + Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) + Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) - + Simulation Interval Interwał symulacji + Intervalo de simulación + Simulationsintervall + Interval simulace + Intervalo da simulação - + Defines the interval between every calculation step Określa interwał pomiędzy każdym krokiem kalkulacji + Define el intervalo entre cada cálculo + Legt das Intervall zwischen den Berechnungsschritten fest + Určuje interval mezi každým výpočtem + Define o intervalo entre cada cálculo - + Simulation Radius Zasięg symulacji + Radio de simulación + Simulationsradius + Rozsah simulace + Raio de simulação - + Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles Określa obszar naokoło gracza (w metrach), na którym zaawansowana balistyka jest aplikowana dla pocisków + Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles + Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird + Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil + Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis - + Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. + Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. + Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. \ No newline at end of file diff --git a/addons/ai/script_component.hpp b/addons/ai/script_component.hpp index 6097849c6b..7add51c06c 100644 --- a/addons/ai/script_component.hpp +++ b/addons/ai/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT ai -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_AI #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_AI #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/aircraft/CfgVehicles.hpp b/addons/aircraft/CfgVehicles.hpp index 559b8dc2e1..9839149b3d 100644 --- a/addons/aircraft/CfgVehicles.hpp +++ b/addons/aircraft/CfgVehicles.hpp @@ -176,8 +176,8 @@ class CfgVehicles { }; class CargoRamp_Open: DoorL1_Open { userActionID = 52; - displayName = "$STR_ACE_Aircraft_OpenCargoRamp"; - textToolTip = "$STR_ACE_Aircraft_OpenCargoRamp"; + displayName = CSTRING(OpenCargoRamp); + textToolTip = CSTRING(OpenCargoRamp); position = "action_cargoramp"; radius = 3.0; condition = "this animationPhase ""cargoramp_open"" < 0.5 AND Alive(this)"; @@ -185,8 +185,8 @@ class CfgVehicles { }; class CargoRamp_Close: DoorL1_Close { userActionID = 55; - displayName = "$STR_ACE_Aircraft_CloseCargoRamp"; - textToolTip = "$STR_ACE_Aircraft_CloseCargoRamp"; + displayName = CSTRING(CloseCargoRamp); + textToolTip = CSTRING(CloseCargoRamp); position = "action_cargoramp"; radius = 3.0; condition = "this animationPhase ""cargoramp_open"" > 0.5 AND Alive(this)"; diff --git a/addons/aircraft/CfgWeapons.hpp b/addons/aircraft/CfgWeapons.hpp index dc84c9f04a..ac8a759bd3 100644 --- a/addons/aircraft/CfgWeapons.hpp +++ b/addons/aircraft/CfgWeapons.hpp @@ -29,7 +29,7 @@ class CfgWeapons { reloadTime = 0.1; }; class Burst: Mode_Burst { - displayName = "$STR_ACE_Aircraft_CMFlareLauncher_Burst_Name"; + displayName = CSTRING(CMFlareLauncher_Burst_Name); }; }; @@ -50,12 +50,12 @@ class CfgWeapons { }; class ACE_gatling_20mm_Comanche: gatling_20mm { - displayName = "$STR_ACE_Aircraft_gatling_20mm_Name"; + displayName = CSTRING(gatling_20mm_Name); class manual: manual { reloadTime = 0.04; dispersion = 0.006; - displayName = "$STR_ACE_Aircraft_gatling_20mm_Name"; + displayName = CSTRING(gatling_20mm_Name); }; class close: close { reloadTime = 0.04; diff --git a/addons/apl/LWTS_optic.p3d b/addons/apl/LWTS_optic.p3d new file mode 100644 index 0000000000..874bd9051f Binary files /dev/null and b/addons/apl/LWTS_optic.p3d differ diff --git a/addons/apl/data/Jezek_kov.rvmat b/addons/apl/data/Jezek_kov.rvmat new file mode 100644 index 0000000000..d2133e6b5a --- /dev/null +++ b/addons/apl/data/Jezek_kov.rvmat @@ -0,0 +1,79 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={1.000000,1.000000,1.000000,1.000000}; +specularPower=83.900002; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 { + texture="z\ace\addons\apl\data\jezek_texture_NOHQ.tga"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage5 { + texture="z\ace\addons\apl\data\jezek_texture_SMDI.tga"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage6 { + texture="#(ai,32,128,1)fresnel(1.85,0.64)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; diff --git a/addons/apl/data/barbwire_a_co.paa b/addons/apl/data/barbwire_a_co.paa new file mode 100644 index 0000000000..1809c2c08e Binary files /dev/null and b/addons/apl/data/barbwire_a_co.paa differ diff --git a/addons/apl/data/barbwire_a_nohq.paa b/addons/apl/data/barbwire_a_nohq.paa new file mode 100644 index 0000000000..5612dc460a Binary files /dev/null and b/addons/apl/data/barbwire_a_nohq.paa differ diff --git a/addons/apl/data/barbwire_a_ns.rvmat b/addons/apl/data/barbwire_a_ns.rvmat new file mode 100644 index 0000000000..0a6ad7c316 --- /dev/null +++ b/addons/apl/data/barbwire_a_ns.rvmat @@ -0,0 +1,78 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={1.000000,1.000000,1.000000,0.000000}; +specularPower=16.000000; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 { + texture="z\ace\addons\apl\data\BarbWire_A_NOHQ.tga"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage5 { + texture="#(argb,8,8,3)color(0,0,1,1,SMDI)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage6 { + texture="#(ai,32,128,1)fresnel(0.01,0.01)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage7 { + texture="#(argb,8,8,3)color(0,0,0,1,CO)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; diff --git a/addons/apl/data/default.rvmat b/addons/apl/data/default.rvmat new file mode 100644 index 0000000000..f70da1fcf0 --- /dev/null +++ b/addons/apl/data/default.rvmat @@ -0,0 +1,8 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0,0,0,0}; +specularPower=0; +PixelShaderID="Normal"; +VertexShaderID="Basic"; diff --git a/addons/apl/data/default_vehicle_ti_ca.paa b/addons/apl/data/default_vehicle_ti_ca.paa new file mode 100644 index 0000000000..53ca8a62b7 Binary files /dev/null and b/addons/apl/data/default_vehicle_ti_ca.paa differ diff --git a/addons/apl/data/glass_House.bisurf b/addons/apl/data/glass_House.bisurf new file mode 100644 index 0000000000..b8b91bb2a6 --- /dev/null +++ b/addons/apl/data/glass_House.bisurf @@ -0,0 +1,10 @@ +Density=2400; +rough=0; +dust=0; +bulletPenetrability=50; +soundEnviron=Empty; +isWater=false; +friction=0.1; +restitution=0.1; +impact = Hit_Glass; +soundHit = glass; \ No newline at end of file diff --git a/addons/apl/data/glass_house.rvmat b/addons/apl/data/glass_house.rvmat new file mode 100644 index 0000000000..004fd8c6e5 --- /dev/null +++ b/addons/apl/data/glass_house.rvmat @@ -0,0 +1 @@ +surfaceInfo="z\ace\addons\apl\data\glass_House.bisurf"; \ No newline at end of file diff --git a/addons/apl/data/jezek_texture_co.paa b/addons/apl/data/jezek_texture_co.paa new file mode 100644 index 0000000000..7b2e16d0e7 Binary files /dev/null and b/addons/apl/data/jezek_texture_co.paa differ diff --git a/addons/apl/data/jezek_texture_nohq.paa b/addons/apl/data/jezek_texture_nohq.paa new file mode 100644 index 0000000000..6a34328e5f Binary files /dev/null and b/addons/apl/data/jezek_texture_nohq.paa differ diff --git a/addons/apl/data/jezek_texture_smdi.paa b/addons/apl/data/jezek_texture_smdi.paa new file mode 100644 index 0000000000..415d98a09f Binary files /dev/null and b/addons/apl/data/jezek_texture_smdi.paa differ diff --git a/addons/apl/data/metal4_weapons_vehicles_int_512_dt.paa b/addons/apl/data/metal4_weapons_vehicles_int_512_dt.paa new file mode 100644 index 0000000000..a023628a55 Binary files /dev/null and b/addons/apl/data/metal4_weapons_vehicles_int_512_dt.paa differ diff --git a/addons/apl/data/optics_bg_blurred_round_ca.paa b/addons/apl/data/optics_bg_blurred_round_ca.paa new file mode 100644 index 0000000000..b449e342c1 Binary files /dev/null and b/addons/apl/data/optics_bg_blurred_round_ca.paa differ diff --git a/addons/apl/data/optics_bg_square_ca.paa b/addons/apl/data/optics_bg_square_ca.paa new file mode 100644 index 0000000000..43c9d97b3c Binary files /dev/null and b/addons/apl/data/optics_bg_square_ca.paa differ diff --git a/addons/apl/data/plastic.bisurf b/addons/apl/data/plastic.bisurf new file mode 100644 index 0000000000..84984886ec --- /dev/null +++ b/addons/apl/data/plastic.bisurf @@ -0,0 +1,10 @@ +Density=1380; +rough=0.1; +dust=0; +bulletPenetrability=150; +soundEnviron=Empty; +isWater=false; +friction=0.7; +restitution=0.3; +impact = default_Mat; +soundHit = plastic; \ No newline at end of file diff --git a/addons/apl/data/plastic.rvmat b/addons/apl/data/plastic.rvmat new file mode 100644 index 0000000000..6cf20f3d7f --- /dev/null +++ b/addons/apl/data/plastic.rvmat @@ -0,0 +1,4 @@ +surfaceInfo="z\ace\addons\apl\data\plastic.bisurf"; + +diffuse[]={0.5,0.5,1.0,1.000000}; +ambient[]={0.5,0.5,1.0,1.000000}; \ No newline at end of file diff --git a/addons/apl/data/plastic_512_dt.paa b/addons/apl/data/plastic_512_dt.paa new file mode 100644 index 0000000000..62c48c90a4 Binary files /dev/null and b/addons/apl/data/plastic_512_dt.paa differ diff --git a/addons/apl/data/plech.paa b/addons/apl/data/plech.paa new file mode 100644 index 0000000000..240e1ce03f Binary files /dev/null and b/addons/apl/data/plech.paa differ diff --git a/addons/apl/data/twis_m16_ca.paa b/addons/apl/data/twis_m16_ca.paa new file mode 100644 index 0000000000..784c3b791e Binary files /dev/null and b/addons/apl/data/twis_m16_ca.paa differ diff --git a/addons/apl/data/vehicle_destr1024_1024_mc.paa b/addons/apl/data/vehicle_destr1024_1024_mc.paa new file mode 100644 index 0000000000..68dfc1b977 Binary files /dev/null and b/addons/apl/data/vehicle_destr1024_1024_mc.paa differ diff --git a/addons/apl/data/vehicle_destr1024_1024_smdi.paa b/addons/apl/data/vehicle_destr1024_1024_smdi.paa new file mode 100644 index 0000000000..2a2cfc0357 Binary files /dev/null and b/addons/apl/data/vehicle_destr1024_1024_smdi.paa differ diff --git a/addons/apl/sounds/padak_let.wss b/addons/apl/sounds/padak_let.wss new file mode 100644 index 0000000000..19476becd8 Binary files /dev/null and b/addons/apl/sounds/padak_let.wss differ diff --git a/addons/atragmx/CfgVehicles.hpp b/addons/atragmx/CfgVehicles.hpp index f015f0e0b9..65ef589d0f 100644 --- a/addons/atragmx/CfgVehicles.hpp +++ b/addons/atragmx/CfgVehicles.hpp @@ -4,13 +4,13 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class GVAR(open) { - displayName = "$STR_ACE_ATragMX_OpenATragMXDialog"; + displayName = CSTRING(OpenATragMXDialog); condition = QUOTE(call FUNC(can_show)); statement = QUOTE(call FUNC(create_dialog)); showDisabled = 0; priority = 2; icon = PATHTOF(UI\ATRAG_Icon.paa); - exceptions[] = {"notOnMap", "isNotInside"}; + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; }; }; }; diff --git a/addons/atragmx/CfgWeapons.hpp b/addons/atragmx/CfgWeapons.hpp index 07d2fa4aee..42d1e56ae2 100644 --- a/addons/atragmx/CfgWeapons.hpp +++ b/addons/atragmx/CfgWeapons.hpp @@ -6,8 +6,8 @@ class CfgWeapons { class ACE_ATragMX: ACE_ItemCore { author = "Ruthberg"; scope = 2; - displayName = "$STR_ACE_ATragMX_Name"; - descriptionShort = "$STR_ACE_ATragMX_Description"; + displayName = CSTRING(Name); + descriptionShort = CSTRING(Description); model = PATHTOF(data\tdsrecon.p3d); picture = PATHTOF(UI\ATRAG_Icon.paa); icon = "iconObject_circle"; diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index cefc7a26eb..97dad6e7b6 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -152,7 +152,7 @@ class ATragMX_Display { type=0; font="TahomaB"; SizeEX=0.025; - idc=-1; + idc=720000; style=48; x=0.55*safezoneW+safezoneX-0.256; y=0.265*safezoneH+safezoneY-0.1; @@ -160,7 +160,7 @@ class ATragMX_Display { h=1.024*4/3; colorBackground[]={1,1,1,1}; colorText[]={1,1,1,1}; - text=PATHTOF(UI\atrag.paa); + text=PATHTOF(UI\atrag_d.paa); }; class POWER: ATragMX_RscButton { idc=-1; diff --git a/addons/atragmx/UI/ATRAG.paa b/addons/atragmx/UI/ATRAG_D.paa similarity index 100% rename from addons/atragmx/UI/ATRAG.paa rename to addons/atragmx/UI/ATRAG_D.paa diff --git a/addons/atragmx/UI/ATRAG_N.paa b/addons/atragmx/UI/ATRAG_N.paa new file mode 100644 index 0000000000..a588fdbc8b Binary files /dev/null and b/addons/atragmx/UI/ATRAG_N.paa differ diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 1e86838b8b..4b61a28551 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -6,41 +6,41 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657, -0.0006400, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], - ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0003740, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], - ["12.7x99mm" , 900, 100, 0.0623, -0.0006000, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], + ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], + ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], - ["12.7x54mm" , 300, 100, 0.3395, -0.0001400, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], + ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], - [".408 Chey Tac" , 910, 100, 0.0571, -0.0003950, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], + [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], - ["9.3×64mm" , 870, 100, 0.0619, -0.0010600, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], + ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], - [".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"], - [".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"], - [".338LM API526" , 895, 100, 0.0601, -0.0006730, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.560, 1, "ASM" ], + [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"], + [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"], + [".338LM API526" , 895, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.560, 1, "ASM" ], - [".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 2, 10, 120, 0, 0, 13.31, 7.80, 25.40, 0.268, 7, "ICAO"], - [".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"], - [".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"], + [".300WM Mk248 Mod 0", 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 13.31, 7.80, 25.40, 0.268, 7, "ICAO"], + [".300WM Mk248 Mod 1", 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"], + [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"], - ["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"], + ["7.62x54mmR" , 800, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"], - ["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.200, 7, "ICAO"], - ["7.62x51mm M118LR" , 780, 100, 0.0710, -0.0008525, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"], - ["7.62x51mm Mk319" , 910, 100, 0.0585, -0.0010300, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"], - ["7.62x51mm M993" , 930, 100, 0.0585, -0.0010300, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO"], - ["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"], + ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.200, 7, "ICAO"], + ["7.62x51mm M118LR" , 780, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"], + ["7.62x51mm Mk319" , 910, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"], + ["7.62x51mm M993" , 930, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO"], + ["7.62x51mm Subsonic", 320, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"], - ["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], - ["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], - ["6.5mm Creedmor" , 840, 100, 0.0637, -0.0006510, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.317, 7, "ICAO"], + ["6.5x39mm" , 800, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], + ["6.5x47mm Lapua" , 800, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], + ["6.5mm Creedmor" , 840, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.317, 7, "ICAO"], - ["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], - ["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], - ["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ], - ["5.56x45mm M995" , 869, 100, 0.0616, -0.0011200, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ]]; + ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], + ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], + ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ], + ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index 62bf2181c7..0277de1c14 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -4,7 +4,6 @@ ADDON = false; PREP(add_new_gun); PREP(calculate_range_card); -PREP(calculate_scope_base_angle); PREP(calculate_solution); PREP(calculate_target_range_assist); PREP(calculate_target_solution); diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index 5d5253d1bf..516138fcee 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -47,7 +47,7 @@ _temperature = GVAR(temperature); _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); if (!GVAR(atmosphereModeTBH)) then { - _barometricPressure = 1013.25 * exp(-(_altitude) / 7990); + _barometricPressure = 1013.25 * (1 - (0.0065 * _altitude) / (273.15 + _temperature + 0.0065 * _altitude)) ^ 5.255754495; _relativeHumidity = 50; }; diff --git a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf deleted file mode 100644 index fbd191bb79..0000000000 --- a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Author: Ruthberg - * Calculates a new scope base angle - * - * Arguments: - * 0: Bullet mass - * 1: Bore height - * 2: air friction - * 3: muzzle velocity - * 4: zero range - * - * Return Value: - * scope base angle - * - * Example: - * call ace_atragmx_calculate_scope_base_angle - * - * Public: No - */ -#include "script_component.hpp" - -private ["_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_zeroRange"]; -_bulletMass = _this select 0; -_boreHeight = _this select 1; -_airFriction = _this select 2; -_muzzleVelocity = _this select 3; -_zeroRange = _this select 4; - -private ["_scopeBaseAngle"]; -_scopeBaseAngle = 0; - -private ["_temperature", "_barometricPressure", "_relativeHumidity"]; -_temperature = 15; -_barometricPressure = 1013.25; -_relativeHumidity = 0; - -private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0, 0] call FUNC(calculate_solution); - -_scopeBaseAngle + (_result select 0) / 60 diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index 2049398a9c..869ce8d098 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -37,7 +37,7 @@ * 8: Spin drift (MOA) * * Example: - * call ace_atragmx_calculate_target_range_assist + * call ace_atragmx_calculate_solution * * Public: No */ diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 2be1197a9b..b014da6a61 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -47,7 +47,7 @@ _temperature = GVAR(temperature); _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); if (!GVAR(atmosphereModeTBH)) then { - _barometricPressure = 1013.25 * exp(-(_altitude) / 7990); + _barometricPressure = 1013.25 * (1 - (0.0065 * _altitude) / (273.15 + _temperature + 0.0065 * _altitude)) ^ 5.255754495; _relativeHumidity = 50; }; diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 6951137577..df71f9beb9 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -15,6 +15,9 @@ */ #include "script_component.hpp" +#define __dsp (uiNamespace getVariable "ATragMX_Display") +#define __ctrlBackground (__dsp displayCtrl 720000) + if (GVAR(active)) exitWith { false }; if (underwater ACE_player) exitWith { false }; if (!("ACE_ATragMX" in (uniformItems ACE_player)) && !("ACE_ATragMX" in (vestItems ACE_player))) exitWith { false }; @@ -49,4 +52,11 @@ GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer); GVAR(active) = true; +GVAR(DialogPFH) = [{ + if (!GVAR(active)) exitWith { + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + __ctrlBackground ctrlSetText format [QUOTE(PATHTOF(UI\ATRAG_%1.paa)), ["N", "D"] select (call EFUNC(common,ambientBrightness))]; +}, 60, []] call cba_fnc_addPerFrameHandler; + true diff --git a/addons/atragmx/functions/fnc_on_close_dialog.sqf b/addons/atragmx/functions/fnc_on_close_dialog.sqf index 32ba4e4c43..46cbbfc146 100644 --- a/addons/atragmx/functions/fnc_on_close_dialog.sqf +++ b/addons/atragmx/functions/fnc_on_close_dialog.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" uiNamespace setVariable ['ATragMX_Display', nil]; -GVAR(active) = false; \ No newline at end of file +GVAR(active) = false; +[GVAR(DialogPFH)] call cba_fnc_removePerFrameHandler; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf index 6e47461cf3..9bc5b7e34f 100644 --- a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf +++ b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf @@ -30,7 +30,7 @@ if !(ctrlVisible 9000) then { if (!(GVAR(speedAssistTimer))) exitWith { GVAR(speedAssistTimer) = true; - ctrlSetText [8006, Str(Round((time - _startTime) * 10) / 10)]; + ctrlSetText [8006, Str(Round((ACE_time - _startTime) * 10) / 10)]; [] call FUNC(calculate_target_speed_assist); @@ -40,7 +40,7 @@ if !(ctrlVisible 9000) then { [_this select 1] call cba_fnc_removePerFrameHandler; }; - ctrlSetText [9001, Str(Round((time - _startTime) * 10) / 10)]; + ctrlSetText [9001, Str(Round((ACE_time - _startTime) * 10) / 10)]; - }, 0.1, [time]] call CBA_fnc_addPerFrameHandler; + }, 0.1, [ACE_time]] call CBA_fnc_addPerFrameHandler; }; diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf index 7e19abc36e..d084754959 100644 --- a/addons/atragmx/functions/fnc_update_range_card.sqf +++ b/addons/atragmx/functions/fnc_update_range_card.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_range", "_elevation", "_windage1", "_windage2", "_clickSize", "_clickNumber", "_clickInterval", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; +private ["_range", "_elevation", "_windage1", "_windage2", "_clickSize", "_clickNumber", "_clickInterval", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput", "_speedOfSound"]; _lastColumnOutput = ""; if (GVAR(showWind2) && GVAR(rangeCardCurrentColumn) == 0) then { @@ -32,6 +32,8 @@ if (GVAR(currentUnit) == 1) then { lnbClear 5007; +_speedOfSound = GVAR(temperature) call EFUNC(weather,calculateSpeedOfSound); + { _range = _x select 0; _elevation = _x select 1; @@ -72,7 +74,7 @@ lnbClear 5007; _windageOutput = Str(Round(_windage1 * 100) / 100); _rangeOutput = Str(_range); - if (_velocity < 340.29) then { + if (_velocity < _speedOfSound) then { _rangeOutput = _rangeOutput + "*"; }; diff --git a/addons/atragmx/initKeybinds.sqf b/addons/atragmx/initKeybinds.sqf index 0638e5cea8..51d2338292 100644 --- a/addons/atragmx/initKeybinds.sqf +++ b/addons/atragmx/initKeybinds.sqf @@ -1,7 +1,7 @@ -["ACE3 Equipment", QGVAR(ATragMXDialogKey), localize "STR_ACE_ATragMX_ATragMXDialogKey", +["ACE3 Equipment", QGVAR(ATragMXDialogKey), localize LSTRING(ATragMXDialogKey), { // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; if (GVAR(active)) exitWith { closeDialog 0; false @@ -11,4 +11,26 @@ false }, {false}, -[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) \ No newline at end of file +[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) + + +//Add deviceKey entry: +private ["_conditonCode", "_toggleCode", "_closeCode"]; +_conditonCode = { + [] call FUNC(can_show); +}; +_toggleCode = { + // Conditions: canInteract + if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {}; + if (GVAR(active)) exitWith { + closeDialog 0; + }; + // Statement + [] call FUNC(create_dialog); +}; +_closeCode = { + if (GVAR(active)) exitWith { + closeDialog 0; + }; +}; +[(localize LSTRING(Name)), QUOTE(PATHTOF(UI\ATRAG_Icon.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 585070d401..8154ffa04b 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.5 +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.7 diff --git a/addons/attach/$PBOPREFIX$ b/addons/attach/$PBOPREFIX$ index 71a2f40af8..a647dc3672 100644 --- a/addons/attach/$PBOPREFIX$ +++ b/addons/attach/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\Addons\attach \ No newline at end of file +z\ace\addons\attach \ No newline at end of file diff --git a/addons/attach/CfgVehicles.hpp b/addons/attach/CfgVehicles.hpp index ce9b1a7413..daf91a43df 100644 --- a/addons/attach/CfgVehicles.hpp +++ b/addons/attach/CfgVehicles.hpp @@ -3,7 +3,7 @@ class ACE_Actions { \ class ACE_MainActions { \ class GVAR(AttachVehicle) { \ - displayName = "$STR_ACE_Attach_AttachDetach"; \ + displayName = CSTRING(AttachDetach); \ condition = QUOTE(_this call FUNC(canAttach)); \ insertChildren = QUOTE(_this call FUNC(getChildrenAttachActions)); \ exceptions[] = {}; \ @@ -13,7 +13,7 @@ distance = 4.5; \ }; \ class GVAR(DetachVehicle) { \ - displayName = "$STR_ACE_Attach_Detach"; \ + displayName = CSTRING(Detach); \ condition = QUOTE(_this call FUNC(canDetach)); \ statement = QUOTE(_this call FUNC(detach) ); \ exceptions[] = {}; \ @@ -54,7 +54,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class GVAR(Attach) { - displayName = "$STR_ACE_Attach_AttachDetach"; + displayName = CSTRING(AttachDetach); condition = QUOTE(_this call FUNC(canAttach)); insertChildren = QUOTE(_this call FUNC(getChildrenAttachActions)); exceptions[] = {"isNotDragging"}; @@ -64,7 +64,7 @@ class CfgVehicles { // hotkey = "T"; }; class GVAR(Detach) { - displayName = "$STR_ACE_Attach_Detach"; + displayName = CSTRING(Detach); condition = QUOTE(_this call FUNC(canDetach)); statement = QUOTE(_this call FUNC(detach)); exceptions[] = {"isNotDragging"}; @@ -87,9 +87,9 @@ class CfgVehicles { class NVGMarker { diffuse[] = {0.006, 0.006, 0.006, 1}; ambient[] = {0.005, 0.005, 0.005, 1}; - brightness = 0.2; + brightness = 0.1; name = "pozicni blik"; - drawLightSize = 0.2; + drawLightSize = 0.1; drawLightCenterSize = 0.003; activeLight = 0; blinking=1; @@ -112,7 +112,7 @@ class CfgVehicles { magazines[] = {}; nvTarget = 1; destrType = "DestructNo"; - brightness = 20; + brightness = 10; }; class NATO_Box_Base; diff --git a/addons/attach/CfgWeapons.hpp b/addons/attach/CfgWeapons.hpp index 9734ceb273..3ad2591f63 100644 --- a/addons/attach/CfgWeapons.hpp +++ b/addons/attach/CfgWeapons.hpp @@ -5,10 +5,10 @@ class CfgWeapons { class ACE_IR_Strobe_Item: ACE_ItemCore { ACE_attachable = "ACE_IR_Strobe_Effect"; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; - displayName = "$STR_ACE_IrStrobe_Name"; - descriptionShort = "$STR_ACE_IrStrobe_Description"; + displayName = CSTRING(IrStrobe_Name); + descriptionShort = CSTRING(IrStrobe_Description); model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = PATHTOF(UI\irstrobe_item.paa); diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index 45b1c0a336..984c231366 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -37,7 +37,7 @@ if (_itemVehClass == "") then { if (_itemVehClass == "") exitWith {ERROR("no ACE_Attachable for Item");}; -_onAtachText = format [localize "STR_ACE_Attach_Item_Attached", _onAtachText]; +_onAtachText = format [localize LSTRING(Item_Attached), _onAtachText]; if (_unit == _attachToVehicle) then { //Self Attachment _unit removeItem _itemClassname; // Remove item @@ -55,11 +55,11 @@ if (_unit == _attachToVehicle) then { //Self Attachment [_unit, QGVAR(vehAttach), true] call EFUNC(common,setForceWalkStatus); //MenuBack isn't working for now (localize "STR_ACE_Attach_CancelAction") - [{[localize "STR_ACE_Attach_PlaceAction", ""] call EFUNC(interaction,showMouseHint)}, [], 0, 0] call EFUNC(common,waitAndExecute); + [{[localize LSTRING(PlaceAction), ""] call EFUNC(interaction,showMouseHint)}, []] call EFUNC(common,execNextFrame); _unit setVariable [QGVAR(placeActionEH), [_unit, "DefaultAction", {true}, {GVAR(placeAction) = 1;}] call EFUNC(common,AddActionEventHandler)]; // _unit setVariable [QGVAR(cancelActionEH), [_unit, "MenuBack", {true}, {GVAR(placeAction) = 0;}] call EFUNC(common,AddActionEventHandler)]; - _actionID = _unit addAction [format ["%1", localize "STR_ACE_Attach_CancelAction"], {GVAR(placeAction) = 0}]; + _actionID = _unit addAction [format ["%1", localize LSTRING(CancelAction)], {GVAR(placeAction) = 0}]; [{ private "_startingPosition"; diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index a56936301d..92df83b5c1 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -49,7 +49,7 @@ if (isNull _attachedObject || {_itemName == ""}) exitWith {ERROR("Could not find // Exit if can't add the item if !(_unit canAdd _itemName) exitWith { - [localize "STR_ACE_Attach_Inventory_Full"] call EFUNC(common,displayTextStructured); + [localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured); }; // Add item to inventory @@ -60,7 +60,7 @@ if (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then detach _attachedObject; _attachedObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]); // Delete attached item after 0.5 seconds - [{deleteVehicle (_this select 0)}, [_attachedObject], 0.5, 0] call EFUNC(common,waitAndExecute); + [{deleteVehicle (_this select 0)}, [_attachedObject], 2] call EFUNC(common,waitAndExecute); } else { // Delete attached item deleteVehicle _attachedObject; @@ -78,4 +78,4 @@ if (_itemDisplayName == "") then { _itemDisplayName = getText (configFile >> "CfgMagazines" >> _itemName >> "displayName"); }; -[format [localize "STR_ACE_Attach_Item_Detached", _itemDisplayName]] call EFUNC(common,displayTextStructured); +[format [localize LSTRING(Item_Detached), _itemDisplayName]] call EFUNC(common,displayTextStructured); diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf index 60c5e3a9bf..d85a65df2b 100644 --- a/addons/attach/functions/fnc_placeApprove.sqf +++ b/addons/attach/functions/fnc_placeApprove.sqf @@ -74,7 +74,7 @@ _closeInDistance = (_closeInMax + _closeInMin) / 2; //Checks (too close to center or can't attach) if (((_startDistanceFromCenter - _closeInDistance) < 0.1) || {!([_attachToVehicle, _unit, _itemClassname] call FUNC(canAttach))}) exitWith { TRACE_2("no valid spot found",_closeInDistance,_startDistanceFromCenter); - [localize "STR_ACE_Attach_Failed"] call EFUNC(common,displayTextStructured); + [localize LSTRING(Failed)] call EFUNC(common,displayTextStructured); }; //Move it out slightly, for visability sake (better to look a little funny than be embedded//sunk in the hull and be useless) diff --git a/addons/attach/script_component.hpp b/addons/attach/script_component.hpp index 6d468d89c1..409f74ab94 100644 --- a/addons/attach/script_component.hpp +++ b/addons/attach/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT attach -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_ATTACH #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_ATTACH #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 01e07c4096..299a1575ac 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -121,7 +121,7 @@ Nincs több hely В инвентаре нет места - + IR Strobe IR-Stroboskop Marcador IR @@ -133,7 +133,7 @@ Infravörös jeladó ИК-маяк - + IR Strobe allows you to signal your position through a pulsating beacon only visible with NVGs. Das IR-Stroboskop erlaubt es dir deine Position mit einem blinkenden Leuchtfeuer zu signalisieren, welches nur mit Nachtsichtgerät zu erkennen ist. Stroboskop światła podczerwieni umożliwia oznaczenie swojej pozycji pulsacyjnym światłem widocznym tylko przez optykę noktowizyjną i gogle noktowizyjne. diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 3ab265091e..5ffe94ac45 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -20,11 +20,11 @@ class CfgAmmo { }; class B_556x45_Ball : BulletBase { - airFriction=-0.001265; + airFriction=-0.00126466; hit=8; typicalSpeed=750; - tracerStartTime = 0.073; //M856 tracer burns out to 800m - tracerEndTime = 1.579; //Time in seconds calculated with ballistics calculator + tracerStartTime=0.073; // M856 tracer burns out to 800m + tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator ACE_caliber=5.69; ACE_bulletLength=23.012; ACE_bulletMass=4.0176; @@ -37,7 +37,7 @@ class CfgAmmo { ACE_barrelLengths[]={210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; }; class ACE_556x45_Ball_Mk262 : B_556x45_Ball { - airFriction=-0.001125; + airFriction=-0.00109563; caliber=0.8; deflecting=18; hit=11; @@ -54,7 +54,7 @@ class CfgAmmo { ACE_barrelLengths[]={190.5, 368.3, 457.2, 508.0}; }; class ACE_556x45_Ball_Mk318 : B_556x45_Ball { - airFriction=-0.001120; + airFriction=-0.00123318; caliber=0.8; deflecting=18; hit=9; @@ -71,7 +71,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 393.7, 508.0}; }; class ACE_556x45_Ball_M995_AP : B_556x45_Ball { - airFriction=-0.001120; + airFriction=-0.00123272; caliber=1.6; deflecting=18; hit=6; @@ -85,14 +85,14 @@ class CfgAmmo { ACE_standardAtmosphere="ASM"; ACE_dragModel=1; ACE_muzzleVelocities[]={820, 865, 880}; - ACE_barrelLengths[]={254.0, 393.7, 508.0}; + ACE_barrelLengths[]={254.0, 368.3, 508.0}; }; class B_556x45_Ball_Tracer_Red; class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red { nvgOnly = 1; }; class ACE_545x39_Ball_7N6M : B_556x45_Ball { - airFriction=-0.001162; + airFriction=-0.00114744; caliber=0.6; deflecting=18; hit=7; @@ -110,13 +110,13 @@ class CfgAmmo { }; class B_556x45_Ball_Tracer_Green; class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { - airFriction=-0.001162; + airFriction=-0.00114744; caliber=0.6; deflecting=18; hit=7; typicalSpeed=883; - tracerStartTime = 0.073; //7T3M tracer burns out to 850m - tracerEndTime = 1.736; //Time in seconds calculated with ballistics calculator + tracerStartTime=0.073; // 7T3M tracer burns out to 850m + tracerEndTime=1.70236; // Time in seconds calculated with ballistics calculator ACE_caliber=5.588; ACE_bulletLength=21.59; ACE_bulletMass=3.22704; @@ -129,7 +129,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; class B_65x39_Caseless : BulletBase { - airFriction=-0.000785; + airFriction=-0.00075308; typicalSpeed=800; ACE_caliber=6.706; ACE_bulletLength=32.893; @@ -151,7 +151,7 @@ class CfgAmmo { nvgOnly = 1; }; class ACE_65x47_Ball_Scenar: B_65x39_Caseless { - airFriction=-0.00078; + airFriction=-0.00067037; typicalSpeed=820 ; caliber=0.9; ACE_caliber=6.706; @@ -166,7 +166,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; class ACE_65_Creedmor_Ball: B_65x39_Caseless { - airFriction=-0.000651; + airFriction=-0.00060887; typicalSpeed=860 ; caliber=1.1; ACE_caliber=6.706; @@ -181,11 +181,11 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; class B_762x51_Ball : BulletBase { - airFriction=-0.001035; + airFriction=-0.00100957; typicalSpeed=833; hit=9; - tracerStartTime = 0.073; //Based on the British L5A1 which burns out to 1000m - tracerEndTime = 2.058; //Time in seconds calculated with ballistics calculator + tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m + tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=9.4608; @@ -202,7 +202,7 @@ class CfgAmmo { nvgOnly = 1; }; class ACE_762x51_Ball_M118LR : B_762x51_Ball { - airFriction=-0.0008525; + airFriction=-0.00082828; caliber=1.8; hit=16; typicalSpeed=790; @@ -218,7 +218,7 @@ class CfgAmmo { ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; class ACE_762x51_Ball_Mk316_Mod_0 : B_762x51_Ball { - airFriction=-0.0008525; + airFriction=-0.00082029; caliber=1.8; hit=16; typicalSpeed=790; @@ -234,7 +234,7 @@ class CfgAmmo { ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; class ACE_762x51_Ball_Mk319_Mod_0 : B_762x51_Ball { - airFriction=-0.00103; + airFriction=-0.00102338; caliber=1.5; hit=14; typicalSpeed=900; @@ -250,7 +250,7 @@ class CfgAmmo { ACE_barrelLengths[]={330.2, 406.4, 508.0}; }; class ACE_762x51_Ball_M993_AP : B_762x51_Ball { - airFriction=-0.00103; + airFriction=-0.00107148; caliber=2.2; hit=11; typicalSpeed=910; @@ -266,7 +266,7 @@ class CfgAmmo { ACE_barrelLengths[]={330.2, 406.4, 508.0}; }; class ACE_762x51_Ball_Subsonic : B_762x51_Ball { - airFriction=-0.000535; + airFriction=-0.00049899; caliber=1; hit=6; typicalSpeed=320; @@ -282,7 +282,7 @@ class CfgAmmo { ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; class ACE_30_06_M1_Ball : B_762x51_Ball { - airFriction=-0.0009; + airFriction=-0.00080900; typicalSpeed=800; caliber=2.0; hit=10; @@ -298,7 +298,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; class ACE_7_Remington_Magnum_Ball : B_762x51_Ball { - airFriction=-0.0008; + airFriction=-0.00056738; typicalSpeed=820; caliber=2.1; hit=8; @@ -314,7 +314,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; class ACE_243_Winchester_Ball : B_762x51_Ball { - airFriction=-0.00095; + airFriction=-0.00067875; typicalSpeed=915; caliber=2.3; hit=6; @@ -330,7 +330,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball { - airFriction=-0.000830; + airFriction=-0.00070530; caliber=1.8; hit=17; typicalSpeed=900; @@ -346,7 +346,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 609.6, 660.4}; }; class ACE_762x67_Ball_Mk248_Mod_1 : B_762x51_Ball { - airFriction=-0.000815; + airFriction=-0.00061188; caliber=1.9; hit=18; typicalSpeed=867; @@ -362,7 +362,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 609.6, 660.4}; }; class ACE_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball { - airFriction=-0.00076; + airFriction=-0.00053733; caliber=2.0; hit=19; typicalSpeed=853; @@ -378,7 +378,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 609.6, 660.4}; }; class B_762x54_Ball: B_762x51_Ball { - airFriction=-0.001023; + airFriction=-0.00100023; typicalSpeed=820; ACE_caliber=7.925; ACE_bulletLength=28.956; @@ -392,7 +392,7 @@ class CfgAmmo { ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; class ACE_762x54_Ball_7N14 : B_762x51_Ball { - airFriction=-0.001023; + airFriction=-0.00100023; caliber=1.5; hit=15; typicalSpeed=820; @@ -409,12 +409,12 @@ class CfgAmmo { }; class B_762x54_Tracer_Green; class ACE_762x54_Ball_7T2 : B_762x54_Tracer_Green { - airFriction=-0.001023; + airFriction=-0.00103989; caliber=1.5; hit=15; typicalSpeed=800; - tracerStartTime = 0.073; //Based on the 7T2 which burns three seconds - tracerEndTime = 3; + tracerStartTime=0.073; // Based on the 7T2 which burns three seconds + tracerEndTime=3; ACE_caliber=7.925; ACE_bulletLength=28.956; ACE_bulletMass=9.6552; @@ -427,7 +427,7 @@ class CfgAmmo { ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; class ACE_762x35_Ball : B_762x51_Ball { - airFriction=-0.000821; + airFriction=-0.00128942; caliber=1.5; hit=11; typicalSpeed=790; @@ -443,7 +443,7 @@ class CfgAmmo { ACE_barrelLengths[]={228.6, 406.4, 508.0}; }; class ACE_762x39_Ball : B_762x51_Ball { - airFriction=-0.0015168; + airFriction=-0.00151621; hit=12; caliber=1.5; typicalSpeed=716; @@ -459,7 +459,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; class ACE_762x39_Ball_57N231P : B_762x54_Tracer_Green { - airFriction=-0.0015168; + airFriction=-0.00151621; hit=12; caliber=1.5; typicalSpeed=716; @@ -477,7 +477,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; class B_9x21_Ball : BulletBase { - airFriction=-0.00125; + airFriction=-0.00226847; typicalSpeed=390; hit=6; ACE_caliber=9.042; @@ -493,7 +493,7 @@ class CfgAmmo { }; class ACE_9x18_Ball_57N181S : B_9x21_Ball { hit=5; - airFriction=-0.001234; + airFriction=-0.00190333; typicalSpeed=298; ACE_caliber=9.271; ACE_bulletLength=15.494; @@ -507,7 +507,7 @@ class CfgAmmo { ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; class ACE_9x19_Ball : B_9x21_Ball { - airFriction=-0.001234; + airFriction=-0.0018577; typicalSpeed=370; hit=6; ACE_caliber=9.017; @@ -522,7 +522,7 @@ class CfgAmmo { ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; class ACE_10x25_Ball : B_9x21_Ball { - airFriction=-0.00168; + airFriction=-0.00181928; typicalSpeed=425; hit=7; ACE_caliber=12.7; @@ -537,7 +537,7 @@ class CfgAmmo { ACE_barrelLengths[]={101.6, 117.094, 228.6}; }; class ACE_765x17_Ball: B_9x21_Ball { - airFriction=-0.001213; + airFriction=-0.00163356; typicalSpeed=282; hit=7; ACE_caliber=7.938; @@ -552,7 +552,7 @@ class CfgAmmo { ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; class ACE_303_Ball : ACE_762x51_Ball_M118LR { - airFriction=-0.00083; + airFriction=-0.0008349; typicalSpeed=761; caliber=2.0; ACE_caliber=7.899; @@ -567,7 +567,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 609.6, 660.4}; }; class B_93x64_Ball : BulletBase { - airFriction=-0.00106; + airFriction=-0.00108571; typicalSpeed=880; ACE_caliber=9.296; ACE_bulletLength=34.29; @@ -582,7 +582,7 @@ class CfgAmmo { }; class B_408_Ball : BulletBase { timeToLive=10; - airFriction=-0.000395; + airFriction=-0.00038944; typicalSpeed=910; ACE_caliber=10.363; ACE_bulletLength=54.0; @@ -598,6 +598,7 @@ class CfgAmmo { }; class ACE_106x83mm_Ball : B_408_Ball { timeToLive=10; + airFriction=-0.00052047; ACE_caliber=10.566; ACE_bulletLength=53.061; ACE_bulletMass=25.7904; @@ -611,7 +612,7 @@ class CfgAmmo { }; class B_338_Ball : BulletBase { timeToLive=10; - airFriction=-0.000606; + airFriction=-0.00059133; typicalSpeed=915; ACE_caliber=8.585; ACE_bulletLength=39.573; @@ -625,7 +626,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 660.4, 711.2}; }; class B_338_NM_Ball : BulletBase { - airFriction=-0.000537; + airFriction=-0.00052201; typicalSpeed=820; ACE_caliber=8.585; ACE_bulletLength=43.18; @@ -640,7 +641,7 @@ class CfgAmmo { }; class ACE_338_Ball : B_338_Ball { timeToLive=10; - airFriction=-0.000535; + airFriction=-0.00052190; typicalSpeed=826; ACE_caliber=8.585; ACE_bulletLength=43.18; @@ -655,7 +656,7 @@ class CfgAmmo { }; class ACE_338_Ball_API526 : B_338_Ball { timeToLive=10; - airFriction=-0.000673; + airFriction=-0.00069611; caliber=2.8; typicalSpeed=895; ACE_caliber=8.585; @@ -670,7 +671,7 @@ class CfgAmmo { ACE_barrelLengths[]={508.0, 660.4, 711.2}; }; class B_127x54_Ball : BulletBase { - airFriction=-0.00014; + airFriction=-0.00019268; typicalSpeed=300; ACE_caliber=12.954; ACE_bulletLength=64.516; @@ -685,7 +686,7 @@ class CfgAmmo { }; class B_127x99_Ball : BulletBase { timeToLive=10; - airFriction=-0.0006; + airFriction=-0.00057503; typicalSpeed=900; ACE_caliber=12.954; ACE_bulletLength=58.674; @@ -700,7 +701,7 @@ class CfgAmmo { }; class ACE_127x99_API : BulletBase { timeToLive=10; - airFriction=-0.0006; + airFriction=-0.00057503; typicalSpeed=900; hit=25; caliber=4.0; @@ -717,7 +718,7 @@ class CfgAmmo { }; class ACE_127x99_Ball_AMAX : B_127x99_Ball { timeToLive=10; - airFriction=-0.000374; + airFriction=-0.00036645; typicalSpeed=860; caliber=3.0; ACE_caliber=12.954; @@ -733,7 +734,7 @@ class CfgAmmo { }; class B_127x108_Ball : BulletBase { timeToLive=10; - airFriction=-0.00064; + airFriction=-0.00063800; typicalSpeed=820; ACE_caliber=12.979; ACE_bulletLength=64.008; @@ -747,7 +748,7 @@ class CfgAmmo { ACE_barrelLengths[]={728.98}; }; class B_45ACP_Ball : BulletBase { - airFriction=-0.0007182; + airFriction=-0.00081221; typicalSpeed=250; ACE_caliber=11.481; ACE_bulletLength=17.272; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 32121e4e87..e368381333 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -12,75 +12,75 @@ class CfgMagazines { initSpeed = 760; }; class ACE_100Rnd_65x39_caseless_mag_Tracer_Dim: 100Rnd_65x39_caseless_mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_65x39_Caseless_Tracer_Dim"; - displayName = "$STR_ACE_100Rnd_65x39_caseless_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_100Rnd_65x39_caseless_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_100Rnd_65x39_caseless_mag_Tracer_DimDescription"; + displayName = CSTRING(100Rnd_65x39_caseless_mag_Tracer_DimName); + displayNameShort = CSTRING(100Rnd_65x39_caseless_mag_Tracer_DimNameShort); + descriptionShort = CSTRING(100Rnd_65x39_caseless_mag_Tracer_DimDescription); picture = "\A3\weapons_f\data\ui\m_100rnd_65x39_yellow_ca.paa"; }; class 200Rnd_65x39_cased_Box: 100Rnd_65x39_caseless_mag { initSpeed = 760; }; class ACE_200Rnd_65x39_cased_Box_Tracer_Dim: 200Rnd_65x39_cased_Box { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_65x39_Caseless_Tracer_Dim"; - displayName = "$STR_ACE_200Rnd_65x39_cased_Box_Tracer_DimName"; - displayNameShort = "$STR_ACE_200Rnd_65x39_cased_Box_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_200Rnd_65x39_cased_Box_Tracer_DimDescription"; + displayName = CSTRING(200Rnd_65x39_cased_Box_Tracer_DimName); + displayNameShort = CSTRING(200Rnd_65x39_cased_Box_Tracer_DimNameShort); + descriptionShort = CSTRING(200Rnd_65x39_cased_Box_Tracer_DimDescription); picture = "\A3\weapons_f\data\ui\m_200rnd_65x39_yellow_ca.paa"; }; class 30Rnd_65x39_caseless_mag_Tracer; class ACE_30Rnd_65x39_caseless_mag_Tracer_Dim: 30Rnd_65x39_caseless_mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_65x39_Caseless_Tracer_Dim"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimDescription"; + displayName = CSTRING(30Rnd_65x39_caseless_mag_Tracer_DimName); + displayNameShort = CSTRING(30Rnd_65x39_caseless_mag_Tracer_DimNameShort); + descriptionShort = CSTRING(30Rnd_65x39_caseless_mag_Tracer_DimDescription); }; class 30Rnd_65x39_caseless_green_mag_Tracer; class ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim: 30Rnd_65x39_caseless_green_mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_65x39_Caseless_green_Tracer_Dim"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimDescription"; + displayName = CSTRING(30Rnd_65x39_caseless_green_mag_Tracer_DimName); + displayNameShort = CSTRING(30Rnd_65x39_caseless_green_mag_Tracer_DimNameShort); + descriptionShort = CSTRING(30Rnd_65x39_caseless_green_mag_Tracer_DimDescription); }; class 30Rnd_556x45_Stanag: CA_Magazine { }; class ACE_30Rnd_556x45_Stanag_M995_AP_mag: 30Rnd_556x45_Stanag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_556x45_Ball_M995_AP"; - displayName = "$STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_Name"; - displayNameShort = "$STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_NameShort"; - descriptionShort = "$STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_Description"; - initSpeed = 1046; + displayName = CSTRING(30Rnd_556x45_Stanag_M995_AP_mag_Name); + displayNameShort = CSTRING(30Rnd_556x45_Stanag_M995_AP_mag_NameShort); + descriptionShort = CSTRING(30Rnd_556x45_Stanag_M995_AP_mag_Description); + initSpeed = 865; }; class ACE_30Rnd_556x45_Stanag_Mk262_mag: 30Rnd_556x45_Stanag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_556x45_Ball_Mk262"; - displayName = "$STR_ACE_30Rnd_556x45_Stanag_Mk262_mag_Name"; - displayNameShort = "$STR_ACE_30Rnd_556x45_Stanag_Mk262_mag_NameShort"; - descriptionShort = "$STR_ACE_30Rnd_556x45_Stanag_Mk262_mag_Description"; + displayName = CSTRING(30Rnd_556x45_Stanag_Mk262_mag_Name); + displayNameShort = CSTRING(30Rnd_556x45_Stanag_Mk262_mag_NameShort); + descriptionShort = CSTRING(30Rnd_556x45_Stanag_Mk262_mag_Description); initSpeed = 832; }; class ACE_30Rnd_556x45_Stanag_Mk318_mag: 30Rnd_556x45_Stanag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_556x45_Ball_Mk318"; - displayName = "$STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_Name"; - displayNameShort = "$STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_NameShort"; - descriptionShort = "$STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_Description"; + displayName = CSTRING(30Rnd_556x45_Stanag_Mk318_mag_Name); + displayNameShort = CSTRING(30Rnd_556x45_Stanag_Mk318_mag_NameShort); + descriptionShort = CSTRING(30Rnd_556x45_Stanag_Mk318_mag_Description); initSpeed = 922; }; class 30Rnd_556x45_Stanag_Tracer_Red: 30Rnd_556x45_Stanag { }; class ACE_30Rnd_556x45_Stanag_Tracer_Dim: 30Rnd_556x45_Stanag_Tracer_Red { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_B_556x45_Ball_Tracer_Dim"; - displayName = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimDescription"; + displayName = CSTRING(30Rnd_556x45_mag_Tracer_DimName); + displayNameShort = CSTRING(30Rnd_556x45_mag_Tracer_DimNameShort); + descriptionShort = CSTRING(30Rnd_556x45_mag_Tracer_DimDescription); picture = "\A3\weapons_f\data\ui\m_20stanag_red_ca.paa"; }; @@ -97,180 +97,180 @@ class CfgMagazines { initSpeed = 833; }; class ACE_20Rnd_762x51_Mag_Tracer: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "B_762x51_Tracer_Red"; - displayName = "$STR_ACE_20Rnd_762x51_mag_TracerName"; - displayNameShort = "$STR_ACE_20Rnd_762x51_mag_TracerNameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_mag_TracerDescription"; + displayName = CSTRING(20Rnd_762x51_mag_TracerName); + displayNameShort = CSTRING(20Rnd_762x51_mag_TracerNameShort); + descriptionShort = CSTRING(20Rnd_762x51_mag_TracerDescription); tracersEvery = 1; }; class ACE_20Rnd_762x51_Mag_Tracer_Dim: ACE_20Rnd_762x51_Mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_B_762x51_Tracer_Dim"; - displayName = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimDescription"; + displayName = CSTRING(20Rnd_762x51_mag_Tracer_DimName); + displayNameShort = CSTRING(20Rnd_762x51_mag_Tracer_DimNameShort); + descriptionShort = CSTRING(20Rnd_762x51_mag_Tracer_DimDescription); }; class ACE_20Rnd_762x51_Mag_SD: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Subsonic"; - displayName = "$STR_ACE_20Rnd_762x51_mag_SDName"; - displayNameShort = "$STR_ACE_20Rnd_762x51_mag_SDNameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_mag_SDDescription"; + displayName = CSTRING(20Rnd_762x51_mag_SDName); + displayNameShort = CSTRING(20Rnd_762x51_mag_SDNameShort); + descriptionShort = CSTRING(20Rnd_762x51_mag_SDDescription); initSpeed = 325; }; class ACE_10Rnd_762x51_M118LR_Mag: 10Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_M118LR"; count = 10; - displayName = "$STR_ACE_10Rnd_762x51_M118LR_Mag_Name"; - displayNameShort = "$STR_ACE_10Rnd_762x51_M118LR_Mag_NameShort"; - descriptionShort = "$STR_ACE_10Rnd_762x51_M118LR_Mag_Description"; + displayName = CSTRING(10Rnd_762x51_M118LR_Mag_Name); + displayNameShort = CSTRING(10Rnd_762x51_M118LR_Mag_NameShort); + descriptionShort = CSTRING(10Rnd_762x51_M118LR_Mag_Description); initSpeed = 780; }; class ACE_10Rnd_762x51_Mk316_Mod_0_Mag: 10Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk316_Mod_0"; count = 10; - displayName = "$STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_Name"; - displayNameShort = "$STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_NameShort"; - descriptionShort = "$STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_Description"; + displayName = CSTRING(10Rnd_762x51_Mk316_Mod_0_Mag_Name); + displayNameShort = CSTRING(10Rnd_762x51_Mk316_Mod_0_Mag_NameShort); + descriptionShort = CSTRING(10Rnd_762x51_Mk316_Mod_0_Mag_Description); initSpeed = 790; }; class ACE_10Rnd_762x51_Mk319_Mod_0_Mag: 10Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk319_Mod_0"; count = 10; - displayName = "$STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Name"; - displayNameShort = "$STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_NameShort"; - descriptionShort = "$STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Description"; + displayName = CSTRING(10Rnd_762x51_Mk319_Mod_0_Mag_Name); + displayNameShort = CSTRING(10Rnd_762x51_Mk319_Mod_0_Mag_NameShort); + descriptionShort = CSTRING(10Rnd_762x51_Mk319_Mod_0_Mag_Description); initSpeed = 900; }; class ACE_10Rnd_762x51_M993_AP_Mag: 10Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_M993_AP"; count = 10; - displayName = "$STR_ACE_10Rnd_762x51_M993_AP_Mag_Name"; - displayNameShort = "$STR_ACE_10Rnd_762x51_M993_AP_Mag_NameShort"; - descriptionShort = "$STR_ACE_10Rnd_762x51_M993_AP_Mag_Description"; + displayName = CSTRING(10Rnd_762x51_M993_AP_Mag_Name); + displayNameShort = CSTRING(10Rnd_762x51_M993_AP_Mag_NameShort); + descriptionShort = CSTRING(10Rnd_762x51_M993_AP_Mag_Description); initSpeed = 920; }; class ACE_20Rnd_762x51_M118LR_Mag: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_M118LR"; - displayName = "$STR_ACE_20Rnd_762x51_M118LR_Mag_Name"; - displayNameShort = "$STR_ACE_20Rnd_762x51_M118LR_Mag_NameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_M118LR_Mag_Description"; + displayName = CSTRING(20Rnd_762x51_M118LR_Mag_Name); + displayNameShort = CSTRING(20Rnd_762x51_M118LR_Mag_NameShort); + descriptionShort = CSTRING(20Rnd_762x51_M118LR_Mag_Description); initSpeed = 780; }; class ACE_20Rnd_762x51_Mk316_Mod_0_Mag: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk316_Mod_0"; count = 20; - displayName = "$STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_Name"; - displayNameShort = "$STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_NameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_Description"; + displayName = CSTRING(20Rnd_762x51_Mk316_Mod_0_Mag_Name); + displayNameShort = CSTRING(20Rnd_762x51_Mk316_Mod_0_Mag_NameShort); + descriptionShort = CSTRING(20Rnd_762x51_Mk316_Mod_0_Mag_Description); initSpeed = 790; }; class ACE_20Rnd_762x51_Mk319_Mod_0_Mag: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_Mk319_Mod_0"; - displayName = "$STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_Name"; - displayNameShort = "$STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_NameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_Description"; + displayName = CSTRING(20Rnd_762x51_Mk319_Mod_0_Mag_Name); + displayNameShort = CSTRING(20Rnd_762x51_Mk319_Mod_0_Mag_NameShort); + descriptionShort = CSTRING(20Rnd_762x51_Mk319_Mod_0_Mag_Description); initSpeed = 900; }; class ACE_20Rnd_762x51_M993_AP_Mag: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x51_Ball_M993_AP"; count = 20; - displayName = "$STR_ACE_20Rnd_762x51_M993_AP_Mag_Name"; - displayNameShort = "$STR_ACE_20Rnd_762x51_M993_AP_Mag_NameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_M993_AP_Mag_Description"; + displayName = CSTRING(20Rnd_762x51_M993_AP_Mag_Name); + displayNameShort = CSTRING(20Rnd_762x51_M993_AP_Mag_NameShort); + descriptionShort = CSTRING(20Rnd_762x51_M993_AP_Mag_Description); initSpeed = 920; }; class ACE_20Rnd_762x67_Mk248_Mod_0_Mag: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x67_Ball_Mk248_Mod_0"; - displayName = "$STR_ACE_20Rnd_762x67_Mk248_Mod_0_Mag_Name"; - displayNameShort = "$STR_ACE_20Rnd_762x67_Mk248_Mod_0_Mag_NameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x67_Mk248_Mod_0_Mag_Description"; + displayName = CSTRING(20Rnd_762x67_Mk248_Mod_0_Mag_Name); + displayNameShort = CSTRING(20Rnd_762x67_Mk248_Mod_0_Mag_NameShort); + descriptionShort = CSTRING(20Rnd_762x67_Mk248_Mod_0_Mag_Description); initSpeed = 900; }; class ACE_20Rnd_762x67_Mk248_Mod_1_Mag: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x67_Ball_Mk248_Mod_1"; - displayName = "$STR_ACE_20Rnd_762x67_Mk248_Mod_1_Mag_Name"; - displayNameShort = "$STR_ACE_20Rnd_762x67_Mk248_Mod_1_Mag_NameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x67_Mk248_Mod_1_Mag_Description"; + displayName = CSTRING(20Rnd_762x67_Mk248_Mod_1_Mag_Name); + displayNameShort = CSTRING(20Rnd_762x67_Mk248_Mod_1_Mag_NameShort); + descriptionShort = CSTRING(20Rnd_762x67_Mk248_Mod_1_Mag_Description); initSpeed = 880; }; class ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x67_Ball_Berger_Hybrid_OTM"; - displayName = "$STR_ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag_Name"; - displayNameShort = "$STR_ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag_NameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag_Description"; + displayName = CSTRING(20Rnd_762x67_Berger_Hybrid_OTM_Mag_Name); + displayNameShort = CSTRING(20Rnd_762x67_Berger_Hybrid_OTM_Mag_NameShort); + descriptionShort = CSTRING(20Rnd_762x67_Berger_Hybrid_OTM_Mag_Description); initSpeed = 832; }; class ACE_30Rnd_65x47_Scenar_mag: 30Rnd_65x39_caseless_mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_65x47_Ball_Scenar"; - displayName = "$STR_ACE_30Rnd_65x47_Scenar_mag_Name"; - displayNameShort = "$STR_ACE_30Rnd_65x47_Scenar_mag_NameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x47_Scenar_mag_Description"; + displayName = CSTRING(30Rnd_65x47_Scenar_mag_Name); + displayNameShort = CSTRING(30Rnd_65x47_Scenar_mag_NameShort); + descriptionShort = CSTRING(30Rnd_65x47_Scenar_mag_Description); }; class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; - displayName = "$STR_ACE_30Rnd_65_Creedmor_mag_Name"; - displayNameShort = "$STR_ACE_30Rnd_65_Creedmor_mag_NameShort"; - descriptionShort = "$STR_ACE_30Rnd_65_Creedmor_mag_Description"; + displayName = CSTRING(30Rnd_65_Creedmor_mag_Name); + displayNameShort = CSTRING(30Rnd_65_Creedmor_mag_NameShort); + descriptionShort = CSTRING(30Rnd_65_Creedmor_mag_Description); }; class 10Rnd_338_Mag; class ACE_10Rnd_338_300gr_HPBT_Mag: 10Rnd_338_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_338_Ball"; - displayName = "$STR_ACE_10Rnd_338_300gr_HPBT_Mag_Name"; - displayNameShort = "$STR_ACE_10Rnd_338_300gr_HPBT_Mag_NameShort"; - descriptionShort = "$STR_ACE_10Rnd_338_300gr_HPBT_Mag_Description"; + displayName = CSTRING(10Rnd_338_300gr_HPBT_Mag_Name); + displayNameShort = CSTRING(10Rnd_338_300gr_HPBT_Mag_NameShort); + descriptionShort = CSTRING(10Rnd_338_300gr_HPBT_Mag_Description); initSpeed = 800; }; class ACE_10Rnd_338_API526_Mag: 10Rnd_338_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_338_Ball_API526"; - displayName = "$STR_ACE_10Rnd_338_API526_Mag_Name"; - displayNameShort = "$STR_ACE_10Rnd_338_API526_Mag_NameShort"; - descriptionShort = "$STR_ACE_10Rnd_338_API526_Mag_Description"; + displayName = CSTRING(10Rnd_338_API526_Mag_Name); + displayNameShort = CSTRING(10Rnd_338_API526_Mag_NameShort); + descriptionShort = CSTRING(10Rnd_338_API526_Mag_Description); initSpeed = 880; }; class 5Rnd_127x108_Mag; class ACE_5Rnd_127x99_Mag: 5Rnd_127x108_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "B_127x99_Ball"; - displayName = "$STR_ACE_5Rnd_127x99_Mag_Name"; - displayNameShort = "$STR_ACE_5Rnd_127x99_Mag_NameShort"; - descriptionShort = "$STR_ACE_5Rnd_127x99_Mag_Description"; + displayName = CSTRING(5Rnd_127x99_Mag_Name); + displayNameShort = CSTRING(5Rnd_127x99_Mag_NameShort); + descriptionShort = CSTRING(5Rnd_127x99_Mag_Description); initSpeed = 900; }; class ACE_5Rnd_127x99_API_Mag: 5Rnd_127x108_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_127x99_API"; - displayName = "$STR_ACE_5Rnd_127x99_API_Mag_Name"; - displayNameShort = "$STR_ACE_5Rnd_127x99_API_Mag_NameShort"; - descriptionShort = "$STR_ACE_5Rnd_127x99_API_Mag_Description"; + displayName = CSTRING(5Rnd_127x99_API_Mag_Name); + displayNameShort = CSTRING(5Rnd_127x99_API_Mag_NameShort); + descriptionShort = CSTRING(5Rnd_127x99_API_Mag_Description); initSpeed = 900; }; class ACE_5Rnd_127x99_AMAX_Mag: 5Rnd_127x108_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_127x99_Ball_AMAX"; - displayName = "$STR_ACE_5Rnd_127x99_AMAX_Mag_Name"; - displayNameShort = "$STR_ACE_5Rnd_127x99_AMAX_Mag_NameShort"; - descriptionShort = "$STR_ACE_5Rnd_127x99_AMAX_Mag_Description"; + displayName = CSTRING(5Rnd_127x99_AMAX_Mag_Name); + displayNameShort = CSTRING(5Rnd_127x99_AMAX_Mag_NameShort); + descriptionShort = CSTRING(5Rnd_127x99_AMAX_Mag_Description); initSpeed = 860; }; @@ -279,11 +279,11 @@ class CfgMagazines { initSpeed = 450; }; class ACE_30Rnd_9x19_mag: 30Rnd_9x21_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_9x19_Ball"; - displayName = "$STR_ACE_30Rnd_9x19_mag_Name"; - displayNameShort = "$STR_ACE_30Rnd_9x19_mag_NameShort"; - descriptionShort = "$STR_ACE_30Rnd_9x19_mag_Description"; + displayName = CSTRING(30Rnd_9x19_mag_Name); + displayNameShort = CSTRING(30Rnd_9x19_mag_NameShort); + descriptionShort = CSTRING(30Rnd_9x19_mag_Description); initSpeed = 370; }; @@ -311,11 +311,11 @@ class CfgMagazines { initSpeed = 450; }; class ACE_16Rnd_9x19_mag: 16Rnd_9x21_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_9x19_Ball"; - displayName = "$STR_ACE_16Rnd_9x19_mag_Name"; - displayNameShort = "$STR_ACE_16Rnd_9x19_mag_NameShort"; - descriptionShort = "$STR_ACE_16Rnd_9x19_mag_Description"; + displayName = CSTRING(16Rnd_9x19_mag_Name); + displayNameShort = CSTRING(16Rnd_9x19_mag_NameShort); + descriptionShort = CSTRING(16Rnd_9x19_mag_Description); initSpeed = 370; }; @@ -323,11 +323,11 @@ class CfgMagazines { initSpeed = 800; }; class ACE_10Rnd_762x54_Tracer_mag: 10Rnd_762x54_Mag { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_762x54_Ball_7T2"; - displayName = "$STR_ACE_10Rnd_762x54_Tracer_mag_Name"; - displayNameShort = "$STR_ACE_10Rnd_762x54_Tracer_mag_NameShort"; - descriptionShort = "$STR_ACE_10Rnd_762x54_Tracer_mag_Description"; + displayName = CSTRING(10Rnd_762x54_Tracer_mag_Name); + displayNameShort = CSTRING(10Rnd_762x54_Tracer_mag_NameShort); + descriptionShort = CSTRING(10Rnd_762x54_Tracer_mag_Description); initSpeed = 800; tracersEvery = 1; }; diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 0ad697d91e..bb50dcdc2e 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -2,7 +2,7 @@ class CfgVehicles { class Sign_F; class ACE_TargetWall: Sign_F { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 0; class Eventhandlers { init = QUOTE(_this call COMPILE_FILE(scripts\initTargetWall)); @@ -190,9 +190,9 @@ class CfgVehicles { class ACE_Box_Ammo: NATO_Box_Base { scope = 2; accuracy = 1000; - displayName = "$STR_ACE_AmmoSupplyCrate_DisplayName"; + displayName = CSTRING(AmmoSupplyCrate_DisplayName); model = "\A3\weapons_F\AmmoBoxes\AmmoBox_F"; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class TransportMagazines { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M993_AP_Mag,4); @@ -225,5 +225,27 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); }; + class AnimationSources { + class Ammo_source { + source = "user"; + animPeriod = 1; + initPhase = 0; + }; + class AmmoOrd_source { + source = "user"; + animPeriod = 1; + initPhase = 1; + }; + class Grenades_source { + source = "user"; + animPeriod = 1; + initPhase = 1; + }; + class Support_source { + source = "user"; + animPeriod = 1; + initPhase = 1; + }; + }; }; }; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 571112697a..e0cc3f203d 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -552,7 +552,7 @@ class CfgWeapons { }; initSpeed = -1.0; ACE_barrelTwist=381.0; - ACE_barrelLength=929.64; + ACE_barrelLength=730; }; class srifle_DMR_02_F: DMR_02_base_F { magazines[] = { diff --git a/addons/ballistics/config.cpp b/addons/ballistics/config.cpp index 66ff7d188e..768ba63e02 100644 --- a/addons/ballistics/config.cpp +++ b/addons/ballistics/config.cpp @@ -6,8 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"TaoSensai","commy2","Ruthberg"}; - authorUrl = "https://github.com/Taosenai/tmr"; + author[] = {"commy2","Ruthberg"}; VERSION_CONFIG; }; }; diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 85ac44b4de..db44078980 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -1,8 +1,8 @@  - + - + 6.5mm 30Rnd Tracer IR-DIM Mag 6,5mm Nyomjelző IR-DIM 30-as Tár 6,5mm 30-Patronen-Magazin Leuchtspur IR-DIM @@ -14,7 +14,7 @@ Caricatore 6.5mm 30Rnd Traccianti IR-DIM Магазин из 30-ти 6,5 мм ИК-трассирующих - + 6.5mm IR-DIM 6,5mm IR-DIM 6,5mm IR-DIM @@ -26,7 +26,7 @@ 6.5mm IR-DIM 6,5 мм ИК-трассирующие - + Caliber: 6.5x39mm Tracer IR-DIM<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL Kaliber: 6,5x39mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL Kaliber: 6,5x39mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL @@ -38,7 +38,7 @@ Calibro: 6.5x39mm Traccianti IR-DIM <br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL - + 6.5mm 30Rnd SD Mag 6,5mm Halk 30-as Tár 6,5mm 30-Patronen-Magazin SD @@ -50,7 +50,7 @@ Caricatore 6.5mm 30Rnd Sil. Магазин из 30-ти 6,5 мм дозвуковых - + 6.5mm SD 6,5mm Halk 6,5mm SD @@ -62,7 +62,7 @@ 6.5mm Sil. 6,5 мм дозвуковые - + Caliber: 6.5x39mm SD<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL Kaliber: 6,5x39mm Halk<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL Kaliber: 6,5x39mm SD<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL @@ -74,7 +74,7 @@ Calibro: 6.5x39mm Sil.<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL - + 6.5mm 30Rnd AP Mag 6,5mm Páncéltörő 30-as Tár 6,5mm 30-Patronen-Magazin AP @@ -86,7 +86,7 @@ Caricatore 6.5mm 30Rnd AP Магазин из 30-ти 6,5 мм бронебойных - + 6.5mm AP 6,5mm Páncéltörő 6,5mm AP @@ -98,7 +98,7 @@ 6.5mm AP 6,5 мм бронебойные - + Caliber: 6.5x39mm AP<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL Kaliber: 6,5x39mm Páncéltörő<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL Kaliber: 6,5x39mm AP<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL @@ -111,7 +111,7 @@ Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL - + 6.5mm 30Rnd Tracer IR-DIM Mag 6,5mm IR-DIM Nyomjelző 30-as Tár 6,5mm 30-Patronen-Magazin Leuchtspur IR-DIM @@ -123,7 +123,7 @@ Caricatore 6.5mm 30Rnd Traccianti IR-DIM Магазин из 30-ти 6,5 мм ИК-трассирующих - + 6.5mm IR-DIM 6,5mm IR-DIM 6,5mm IR-DIM @@ -135,7 +135,7 @@ 6.5mm IR-DIM 6,5 мм ИК-трассирующие - + Caliber: 6.5x39mm Tracer IR-DIM<br />Rounds: 30<br />Used in: Katiba Kaliber: 6,5x39mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: Katiba Kaliber: 6,5x39mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: Katiba @@ -147,7 +147,7 @@ Calibro: 6.5x39mm Tracciant IR-DIM<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: Katiba - + 6.5mm 30Rnd SD Mag 6,5mm Halk 30-as Tár 6,5mm 30-Patronen-Magazin SD @@ -159,7 +159,7 @@ Caricatore 6.5mm 30Rnd Sil. Магазин из 30-ти 6,5 мм дозвуковых - + 6.5mm SD 6,5mm Halk 6,5mm SD @@ -171,7 +171,7 @@ 6.5mm Sil. 6,5 мм дозвуковые - + Caliber: 6.5x39mm SD<br />Rounds: 30<br />Used in: Katiba Kaliber: 6,5x39mm Halk<br />Lövedékek: 30<br />Használható: Katiba Kaliber: 6,5x39mm SD<br />Patronen: 30<br />Eingesetzt von: Katiba @@ -183,7 +183,7 @@ Calibro: 6.5x39mm Sil.<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: Katiba - + 6.5mm 30Rnd AP Mag 6,5mm Páncéltörő 30-as Tár 6,5mm 30-Patronen-Magazin AP @@ -195,7 +195,7 @@ Caricatore 6.5mm 30Rnd AP Магазин из 30-ти 6,5 мм бронебойных - + 6.5mm AP 6,5mm Páncéltörő 6,5mm AP @@ -207,7 +207,7 @@ 6.5mm AP 6,5 мм бронебойные - + Caliber: 6.5x39mm AP<br />Rounds: 30<br />Used in: Katiba Kaliber: 6,5x39mm Páncéltörő<br />Lövedékek: 30<br />Használható: Katiba Kaliber: 6,5x39mm AP<br />Patronen: 30<br />Eingesetzt von: Katiba @@ -220,7 +220,7 @@ Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: Katiba - + 5.56mm 30rnd Tracer IR-DIM Mag 5,56mm Nyomjelző IR-DIM 30-as Tár 5,56mm 30-Patronen-Magazin Leuchtspur IR-DIM @@ -232,7 +232,7 @@ Caricatore 5.56mm 30rnd Traccianti IR-DIM Магазин из 30-ти 5,56 мм ИК-трассирующих - + 5.56mm IR-DIM 5,56mm IR-DIM 5,56mm IR-DIM @@ -244,7 +244,7 @@ 5.56mm IR-DIM 5,56 мм ИК-трассирующие - + Caliber: 5.56x45mm Tracer IR-DIM<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Kaliber: 5,56x45mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Kaliber: 5,56x45mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -257,7 +257,7 @@ Калибр: 5,56x45 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - + 7.62mm 20rnd Tracer Mag 7,62mm Nyomjelző IR-DIM 20-as Tár 7,62mm 20-Patronen-Magazin Leuchtspur @@ -269,7 +269,7 @@ Caricatore 7.62mm 20Rnd Traccianti Магазин из 20-ти 7,62 мм трассирующих - + 7.62mm Tracer 7,62mm Nyomjelző 7,62mm Leuchtspur @@ -281,7 +281,7 @@ 7.62mm Traccianti 7,62 мм трассирущие - + Caliber: 7.62x51mm Tracer<br />Rounds: 20<br />Used in: Mk18 ABR Kaliber: 7,62x51mm Nyomjelző<br />Lövedékek: 20<br />Használható: Mk18 ABR Kaliber: 7,62x51mm Leuchtspur<br />Patronen: 20<br />Eingesetzt von: EBR @@ -293,7 +293,7 @@ Calibro: 7.62x51mm Traccianti<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR - + 7.62mm 20rnd Tracer IR-DIM Mag 7,62mm Nyomjelző IR-DIM 20-as Tár 7,62mm 20-Patronen-Magazin Leuchtspur IR-DIM @@ -305,7 +305,7 @@ Caricatore 7.62mm 20rnd Traccianti IR-DIM Магазин из 20-ти 7,62 мм ИК-трассирующих - + 7.62mm IR-DIM 7,62mm IR-DIM 7,62mm IR-DIM @@ -317,7 +317,7 @@ 7.62mm IR-DIM 7,62 мм ИК-трассирующие - + Caliber: 7.62x51mm Tracer IR-DIM<br />Rounds: 20<br />Used in: Mk18 ABR Kaliber: 7,62x51mm Nyomjelző IR-DIM<br />Lövedékek: 20<br />Használható: Mk18 ABR Kaliber: 7,62x51mm Leuchtspur IR-DIM<br />Patronen: 20<br />Eingesetzt von: EBR @@ -329,7 +329,7 @@ Calibro: 7.62x51mm Traccianti IR-DIM<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм ИК-трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR - + 7.62mm 20Rnd SD Mag 7,62mm Halk 20-as Tár 7,62mm 20-Patronen-Magazin SD @@ -341,7 +341,7 @@ Caricatore 7.62mm 20Rnd Sil. Магазин из 20-ти 7,62 мм дозвуковых - + 7.62mm SD 7,62mm Halk 7,62mm SD @@ -353,7 +353,7 @@ 7.62mm Sil. 7,62 мм дозвуковые - + Caliber: 7.62x51mm SD<br />Rounds: 20<br />Used in: Mk18 ABR Kaliber: 7,62x51mm Halk<br />Lövedékek: 20<br />Használható: Mk18 ABR Kaliber: 7,62x51mm SD<br />Patronen: 20<br />Eingesetzt von: EBR @@ -366,7 +366,7 @@ Калибр: 7,62x51 мм дозвуковые<br />Патронов: 20<br />Используются с: Mk18 ABR - + .338 NM 130Rnd Tracer Belt .338 NM 130-Patronen-Gurt Leuchtspur Taśma .338 NM 130rd Smugacz @@ -378,7 +378,7 @@ Cinto de munição .338 NM com 130 cartuchos .338 NM 130-lövedékes nyomkövető heveder - + .338 NM Tracer .338 NM Leuchtspur .338 NM Tracer @@ -390,7 +390,7 @@ .338 NM Traçante .338 NM nyomkövető - + Caliber: .338 Norma Magnum Tracer<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Leuchtspur<br />Patronen: 130<br />Eingesetzt von: SPMG Kaliber: .338 Norma Magnum Smugacz<br />Pociski: 130<br />Używany w: SPMG @@ -402,7 +402,7 @@ Calibre: .338 Norma Magnum Traçante<br />Cartuchos: 130<br />Usado em: SPMG Kaliber: .338 Norma Magnum nyomkövető<br />Lövedékek: 130<br />Használható: SPMG - + .338 NM 130Rnd IR-DIM Belt .338 NM 130-Patronen-Gurt Leuchtspur IR-DIM Taśma .338 NM 130rd IR-DIM @@ -414,7 +414,7 @@ Cinto de munição traçante .338 NM IR-DIM com 130 cartuchos .338 NM 130-lövedékes infravörös nyomkövető heveder - + .338 NM IR-DIM .338 LM IR-DIM .338 NM IR-DIM @@ -426,7 +426,7 @@ .338 NM IR-DIM .338 NM infravörös nyomkövető - + Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Leuchtspur IR-DIM<br />Patronen: 130<br />Eingesetzt von: SPMG Kaliber: .338 Norma Magnum Smugacz IR-DIM<br />Pociski: 130<br />Używany w: SPMG @@ -438,7 +438,7 @@ Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartuchos: 130<br />Usado em: SPMG Kaliber: .338 Norma Magnum infravörös nyomkövető<br />Lövedékek: 130<br />Használható: SPMG - + .338 NM 130Rnd AP Belt .338 NM 130-Patronen-Gurt Hartkern Taśma .338 NM 130rd AP @@ -450,7 +450,7 @@ Cinto de munição .338 NM com 130 cartuchos AP .338 NM 130-lövedékes páncéltörő heveder - + .338 NM AP .338 NM AP .338 NM AP @@ -462,7 +462,7 @@ .338 NM AP .338 NM páncéltörő - + Caliber: .338 Norma Magnum AP<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Hartkern<br />Patronen: 130<br />Eingesetzt von: SPMG Kaliber: .338 Norma Magnum AP<br />Pociski: 130<br />Używane w: SPMG @@ -475,7 +475,7 @@ Kaliber: .338 Norma Magnum páncéltörő<br />Lövedékek: 130<br />Használható: SPMG - + 9.3mm 10Rnd Tracer Mag 9,3mm 10-Patronen-Magazin Leuchtspur Magazynek 9.3mm 10rd Smugacz @@ -487,7 +487,7 @@ Carregador de 10 cartuchos 9.3mm traçantes 9,3mm 10-lövedékes nyomkövető tár - + 9.3mm Tracer 9,3mm Leuchtspur 9,3mm Smugacz @@ -499,7 +499,7 @@ 9.3mm Traçante 9,3mm nyomkövető - + Caliber: 9.3x64mm Tracer<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Leuchtspur<br />Patronen: 10<br />Eingesetzt von: Cyrus Kaliber: 9,3x64mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus @@ -511,7 +511,7 @@ Calibre: 9.3x64mm Traçante<br />Cartuchos: 10<br />Usado em: Cyrus Kaliber: 9,3x64mm nyomkövető<br />Lövedékek: 10<br />Használható: Cyrus - + 9.3mm 10Rnd Tracer IR-DIM Mag 9,3mm 10-Patronen-Magazin Leuchtspur IR-DIM Magazynek 9,3mm 10rd Smugacz IR-DIM @@ -523,7 +523,7 @@ Carregador de 10 cartuchos 9.3mm traçantes IR-DIM 9,3mm 10-lövedékes infravörös nyomkövető tár - + 9.3mm IR-DIM 9,3mm IR-DIM 9,3mm IR-DIM @@ -535,7 +535,7 @@ 9.3mm IR-DIM 9,3mm infravörös nyomkövető - + Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Patronen: 10<br />Eingesetzt von: Cyrus Kaliber: 9,3x64mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus @@ -548,7 +548,7 @@ Kaliber: 9,3x64mm infravörös nyomkövető<br />Lövedékek: 10<br /> Használható: Cyrus - + 9.3mm 150Rnd Tracer Belt 9,3mm 150-Patronen-Gurt Leuchtspur Taśma 9,3mm 150rd Smugacz @@ -560,7 +560,7 @@ Cinto de munição traçante 9.3mm com 150 cartuchos 9,3mm 150-lövedékes nyomkövető heveder - + 9.3mm Tracer 9,3mm Leuchtspur 9,3mm Smugacz @@ -572,7 +572,7 @@ 9.3mm Traçante 9,3mm nyomkövető - + Caliber: 9.3x64mm Tracer<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Leuchtspur<br />Patronen: 150<br />Eingesetzt von: Navid Kaliber: 9,3x64mm Smugacz<br />Pociski: 150<br />Używane w: Navid @@ -584,7 +584,7 @@ Calibre: 9.3x64mm Traçante<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64mm nyomkövető<br />Lövedékek: 150<br />Használható: Navid - + 9.3mm 150Rnd Tracer IR-DIM Belt 9,3mm 150-Patronen-Gurt Leuchtspur IR-DIM Taśma 9,3mm 150rd Smugacz IR-DIM @@ -596,7 +596,7 @@ Cinto de munição traçante 9.3mm IR-DIM com 150 cartuchos 9,3mm 150-lövedékes infravörös nyomkövető heveder - + 9.3mm IR-DIM 9,3mm IR-DIM 9,3mm IR-DIM @@ -608,7 +608,7 @@ 9.3mm IR-DIM 9,3mm infravörös nyomkövető - + Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Patronen: 150<br />Eingesetzt von: Navid Kaliber: 9,3x64mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid @@ -620,7 +620,7 @@ Calibre: 9.3x64mm Traçante IR-DIM<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64mm infravörös nyomkövető<br />Lövedékek: 150<br />Használható: Navid - + 9.3mm 150Rnd AP Belt 9,3mm 150-Patronen-Gurt Hartkern Taśma 9,3mm 150rd AP @@ -632,7 +632,7 @@ Cinto de munição 9.3mm AP com 150 cartuchos 9,3mm 150-lövedékes páncéltörő heveder - + 9.3mm AP 9,3mm AP 9,3mm AP @@ -644,7 +644,7 @@ 9.3mm AP 9,3mm páncéltörő - + Caliber: 9.3x64mm AP<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Hartkern<br />Patronen: 150<br />Eingesetzt von: Navid Kaliber: 9,3x64mm AP<br />Pociski: 150<br />Używane w: Navid @@ -656,7 +656,7 @@ Calibre: 9.3x64mm AP<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64mm páncéltörő<br />Lövedékek: 150<br />Használható: Navid - + 9x19mm 16Rnd Mag Magazynek 9x19mm 16rd Ch. 9x19mm 16Cps @@ -668,7 +668,7 @@ Carregador de 16 cartuchos 9x19mm 9x19mm 16-lövedékes tár - + 9x19mm 9x19mm 9x19mm @@ -680,7 +680,7 @@ 9x19mm 9x19mm - + 9x19mm 30Rnd Mag Magazynek 9x19mm 16rd Ch. 9x19mm 30Cps @@ -692,7 +692,7 @@ Carregador de 16 cartuchos 9x19mm 9x19mm 16-lövedékes tár - + 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd Ch. 9x19mm 30Cps @@ -704,7 +704,7 @@ Carregador de 30 cartuchos 9x19mm 9x19mm 30-lövedékes tár - + 9x19mm 9x19mm 9x19mm @@ -716,7 +716,7 @@ 9x19mm 9x19mm - + 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd Ch. 9x19mm 30Cps @@ -728,7 +728,7 @@ Carregador de 30 cartuchos 9x19mm 9x19mm 30-lövedékes tár - + 7.62x54mm 10Rnd Tracer Mag Magazynek 7,62x54mm 10rd Smugacz Ch. 7.62x54mm 10Rnd Traçante @@ -740,7 +740,7 @@ Carregador com 10 cartuchos 7.62x54mm Traçante 7,62x54mm 10-lövedékes nyomkövető tár - + 7.62mm 7,62mm 7.62mm @@ -752,7 +752,7 @@ 7.62mm 7,62mm - + 7.62x54mm 10Rnd Tracer Mag Magazynek 7,62x54mm 10rd Smugacz Ch. 7.62x54mm 10Cps Traçante @@ -764,7 +764,7 @@ Carregador com 10 cartuchos 7.62x54mm Traçante 7,62x54mm 10-lövedékes nyomkövető tár - + 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM Ch. 6.5mm 100Rnd Traçante IR-DIM @@ -776,7 +776,7 @@ Carregador com 100 cartuchos 6.5mm IR-DIM Traçante 6,5mm 100-lövedékes infravörös nyomkövető tár - + 6.5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM @@ -788,7 +788,7 @@ 6.5mm IR-DIM 6,5mm infravörös nyomkövető - + 6.5mm 100Rnd Tracer IR-DIM Mag<br />Rounds: 100<br />Used in: MX LSW Magazynek 6,5mm 100rd Smugacz IR-DIM Ch. 6.5mm 100Rnd Traçante IR-DIM<br />Cartouches: 100<br />Utilisé avec: MX LSW @@ -800,7 +800,7 @@ Carregador 6.5mm 100 Cartuchos Traçantes IR-DIM<br />Cartuchos: 100<br />Usado em: MX LSW 6.5mm 100-lövedékes infravörös nyomkövető tár<br />Lövedékek: 100<br />Használható: MX LSW - + 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Rnd Traçante IR-DIM @@ -812,7 +812,7 @@ Cinto de munição traçante 6.5mm IR-DIM com 200 cartuchos 6,5mm 200-lövedékes infravörös nyomkövető heveder - + 6.5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM @@ -824,7 +824,7 @@ 6.5mm IR-DIM 6,5mm infravörös nyomkövető - + 6.5mm 200Rnd Tracer IR-DIM Belt<br />Rounds: 200<br />Used in: Stoner 99 LMG Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Cps Traçante IR-DIM<br />Cartouches: 200<br />Utilisé avec: Stoner 99 LMG @@ -836,7 +836,7 @@ Cinto de munição traçante 6.5mm IR-DIM com 200 cartuchos<br />Cartuchos: 200<br />Usado em: Stoner 99 LMG 6.5mm 200-lövedékes infravörös nyomkövető heveder<br />Lövedékek: 200<br />Használható: Stoner 99 LMG - + 5.56mm 30Rnd Mag (Mk262) Magazynek 5,56mm 30rd Mk262 5.56mm 30Cps (Mk262) @@ -848,7 +848,7 @@ Carregador 5.56mm com 30 cartuchos (Mk262) 5,56mm 30-lövedékes tár (Mk262) - + 5.56mm Mk262 5,56mm Mk262 5.56mm Mk262 @@ -860,7 +860,7 @@ 5.56mm Mk262 5,56mm Mk262 - + Caliber: 5.56x45mm NATO (Mk262)<br />Rounds: 30 Kaliber: 5,56x45mm NATO (Mk262)<br />Pociski: 30 Calibre: 5.56x45mm NATO (Mk262)<br />Cartouches: 30 @@ -872,7 +872,7 @@ Calibre: 5.56x45mm NATO (Mk262)<br/>Cartuchos: 30 Kaliber: 5,56x45mm NATO (Mk262)<br />Lövedékek: 30 - + 5.56mm 30Rnd Mag (Mk318) Magazynek 5,56mm 30rd (Mk318) Ch. 5.56mm 30Cps (Mk318) @@ -884,7 +884,7 @@ Carregador 5.56mm com 30 cartuchos (Mk318) 5,56mm 30-lövedékes tár (Mk318) - + 5.56mm Mk318 5,56mm Mk318 5.56mm Mk318 @@ -896,7 +896,7 @@ 5.56mm Mk318 5,56mm Mk318 - + Caliber: 5.56x45mm NATO (Mk318)<br />Rounds: 30 Kaliber: 5,56x45mm NATO (Mk318)<br />Pociski: 30 Calibre: 5.56x45mm NATO (Mk318)<br />Cartouches: 30 @@ -908,7 +908,7 @@ Calibre: 5.56x45mm NATO (Mk318)<br/>Cartuchos: 30 Kaliber: 5,56x45mm NATO (Mk318)<br />Lövedékek: 30 - + 5.56mm 30Rnd Mag (M995 AP) Magazynek 5,56mm 30rd (M995 AP) Ch. 5.56mm 30Cps (M995 AP) @@ -920,7 +920,7 @@ Carregador 5.56mm com 30 cartuchos (M995 AP) 5,56mm 30-lövedékes tár (M995 páncéltörő) - + 5.56mm AP 5,56mm AP 5.56mm AP @@ -932,7 +932,7 @@ 5.56mm M995 AP 5,56mm páncéltörő - + Caliber: 5.56x45mm NATO (M995 AP)<br />Rounds: 30 Kaliber: 5,56x45mm NATO (M995 AP)<br />Pociski: 30 Calibre: 5.56x45mm NATO (M995 AP)<br />Cartouches: 30 @@ -944,7 +944,7 @@ Calibre: 5.56x45mm NATO (M995 AP)<br/>Cartuchos: 30 Kaliber: 5,56x45mm NATO (M995 páncéltörő)<br />Lövedékek: 30 - + 7.62mm 10Rnd Mag (M118LR) Magazynek 7,62mm 10rd (M118LR) Ch. 7.62mm 10Cps (M118LR) @@ -956,7 +956,7 @@ Carregador 7.62mm com 10 cartuchos (M118LR) 7,62mm 10-lövedékes tár (M118LR) - + 7.62mm M118LR 7,62mm M118LR 7.62mm M118LR @@ -968,7 +968,7 @@ 7.62mm M118LR 7,62mm M118LR - + Caliber: 7.62x51mm NATO (M118LR)<br />Rounds: 10 Kaliber: 7,62x51mm NATO (M118LR)<br />Pociski: 10 Calibre: 7.62x51mm NATO (M118LR)<br />Cartouches: 10 @@ -980,7 +980,7 @@ Calibre: 7.26x51mm NATO (M118LR)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (M118LR)<br />Lövedékek: 10 - + 7.62mm 20Rnd Mag (M118LR) Magazynek 7,62mm 20rd (M118LR) Ch. 7.62mm 20Cps (M118LR) @@ -992,7 +992,7 @@ Carregador 7.62mm com 20 cartuchos (M118LR) 7,62mm 20-lövedékes tár (M118LR) - + 7.62mm M118LR 7,62mm M118LR 7.62mm M118LR @@ -1004,7 +1004,7 @@ 7.62mm M118LR 7,62mm M118LR - + Caliber: 7.62x51mm NATO (M118LR)<br />Rounds: 20 Kaliber: 7,62x51mm NATO (M118LR)<br />Pociski: 20 Calibre: 7.62x51mm NATO (M118LR)<br />Cartouches: 20 @@ -1016,7 +1016,7 @@ Calibre: 7.26x51mm NATO (M118LR)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (M118LR)<br />Lövedékek: 20 - + 7.62mm 10Rnd Mag (Mk316 Mod 0) Magazynek 7,62mm 10rd (Mk316 Mod 0) Ch. 7.62mm 10Cps (Mk316 Mod 0) @@ -1028,7 +1028,7 @@ Carregador 7.62mm com 10 cartuchos (Mk316 Mod 0) 7,62mm 10-lövedékes tár (Mk316 Mod 0) - + 7.62mm Mk316 7,62mm Mk316 7.62mm Mk316 @@ -1040,7 +1040,7 @@ 7.62mm Mk316 7,62mm Mk316 - + Caliber: 7.62x51mm NATO (Mk316 Mod 0)<br />Rounds: 10 Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Pociski: 10 Calibre: 7.62x51mm NATO (Mk316 Mod 0)<br />Cartouches: 10 @@ -1052,7 +1052,7 @@ Calibre: 7.26x51mm NATO (Mk316 Mod 0)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Lövedékek: 10 - + 7.62mm 20Rnd Mag (Mk316 Mod 0) Magazynek 7,62mm 20rd (Mk316 Mod 0) Ch. 7.62mm 20Cps (Mk316 Mod 0) @@ -1064,7 +1064,7 @@ Carregador 7.62mm com 20 cartuchos (Mk316 Mod 0) 7,62mm 20-lövedékes tár (Mk316 Mod 0) - + 7.62mm Mk316 7,62mm Mk316 7.62mm Mk316 @@ -1076,7 +1076,7 @@ 7.62mm Mk316 7,62mm Mk316 - + Caliber: 7.62x51mm NATO (Mk316 Mod 0)<br />Rounds: 20 Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Pociski: 20 Calibre: 7.62x51mm NATO (Mk316 Mod 0)<br />Cartouches: 20 @@ -1088,7 +1088,7 @@ Calibre: 7.26x51mm NATO (Mk316 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Lövedékek: 20 - + 7.62mm 10Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 10rd (Mk319 Mod 0) Ch. 7.62mm 10Cps (Mk319 Mod 0) @@ -1100,7 +1100,7 @@ Carregador 7.62mm com 10 cartuchos (Mk319 Mod 0) 7,62mm 10-lövedékes tár (Mk319 Mod 0) - + 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 @@ -1112,7 +1112,7 @@ 7.62mm Mk319 7,62mm Mk319 - + Caliber: 7.62x51mm NATO (Mk319 Mod 0)<br />Rounds: 10 Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Pociski: 10 Calibre: 7.62x51mm NATO (Mk319 Mod 0)<br />Cartouches: 10 @@ -1124,7 +1124,7 @@ Calibre: 7.26x51mm NATO (Mk319 Mod 0)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Lövedékek: 10 - + 7.62mm 20Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 20rd (Mk319 Mod 0) Ch. 7.62mm 20Cps (Mk319 Mod 0) @@ -1136,7 +1136,7 @@ Carregador 7.62mm com 20 cartuchos (Mk319 Mod 0) 7,62mm 20-lövedékes tár (Mk319 Mod 0) - + 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 @@ -1148,7 +1148,7 @@ 7.62mm Mk319 7,62mm Mk319 - + Caliber: 7.62x51mm NATO (Mk319 Mod 0)<br />Rounds: 20 Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Pociski: 20 Calibre: 7.62x51mm NATO (Mk319 Mod 0)<br />Cartouches: 20 @@ -1160,7 +1160,7 @@ Calibre: 7.26x51mm NATO (Mk319 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Lövedékek: 20 - + 7.62mm 10Rnd Mag (M993 AP) Magazynek 7,62mm 10rd (M993 AP) Ch. 7.62mm 10Cps (M993 AP) @@ -1172,7 +1172,7 @@ Carregador 7.62mm com 10 cartuchos (M993 AP) 7,62mm 10-lövedékes tár (M993 páncéltörő) - + 7.62mm AP 7,62mm AP 7.62mm AP @@ -1184,7 +1184,7 @@ 7.62mm AP 7,62mm páncéltörő - + Caliber: 7.62x51mm NATO (M993 AP)<br />Rounds: 10 Kaliber: 7,62x51mm NATO (M993 AP)<br />Pociski: 10 Calibre: 7.62x51mm NATO (M993 AP)<br />Cartouches: 10 @@ -1196,7 +1196,7 @@ Calibre: 7.26x51mm NATO (M993 AP)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (M993 páncéltörő)<br />Lövedékek: 10 - + 7.62mm 20Rnd Mag (M993 AP) Magazynek 7,62mm 20rd (M993 AP) Ch. 7.62mm 20Cps (M993 AP) @@ -1208,7 +1208,7 @@ Carregador 7.62mm com 20 cartuchos (M993 AP) 7,62mm 20-lövedékes tár (M993 páncéltörő) - + 7.62mm AP 7,62mm AP 7.62mm AP @@ -1220,7 +1220,7 @@ 7.62mm AP 7,62mm páncéltörő - + Caliber: 7.62x51mm NATO (M993 AP)<br />Rounds: 20 Kaliber: 7,62x51mm NATO (M993 AP)<br />Pociski: 20 Calibre: 7.62x51mm NATO (M993 AP)<br />Cartouches: 20 @@ -1232,7 +1232,7 @@ Calibre: 7.26x51mm NATO (M993 AP)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (M993 páncéltörő)<br />Lövedékek: 20 - + 7.62mm 20Rnd Mag (Mk248 Mod 0) Magazynek 7,62mm 20rd (Mk248 Mod 0) Ch. 7.62mm 20Cps (Mk248 Mod 0) @@ -1244,7 +1244,7 @@ Carregador 7.62mm com 20 cartuchos (Mk248 Mod 0) 7,62mm 20-lövedékes tár (Mk248 Mod 0) - + 7.62mm Mk248 7,62mm Mk248 7.62mm Mk248 @@ -1256,7 +1256,7 @@ 7.62mm Mk248 7,62mm Mk248 - + Caliber: 7.62x67mm NATO (Mk248 Mod 0)<br />Rounds: 20 Kaliber: 7,62x67mm NATO (Mk248 Mod 0)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 0)<br />Cartouches: 20 @@ -1268,7 +1268,7 @@ Calibre: 7.26x67mm NATO (Mk248 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk248 Mod 0)<br />Lövedékek: 20 - + 7.62mm 20Rnd Mag (Mk248 Mod 1) Magazynek 7,62mm 20rd (Mk248 Mod 1) Ch. 7.62mm 20Cps (Mk248 Mod 1) @@ -1280,7 +1280,7 @@ Carregador 7.62mm com 20 cartuchos (Mk248 Mod 1) 7,62mm 20-lövedékes tár (Mk248 Mod 1) - + 7.62mm Mk248 7,62mm Mk248 7.62mm Mk248 @@ -1292,7 +1292,7 @@ 7.62mm Mk248 7,62mm Mk248 - + Caliber: 7.62x67mm NATO (Mk248 Mod 1)<br />Rounds: 20 Kaliber: 7,62x67mm NATO (Mk248 Mod 1)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 1)<br />Cartouches: 20 @@ -1304,7 +1304,7 @@ Calibre: 7.26x67mm NATO (Mk248 Mod 1)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk248 Mod 1)<br />Lövedékek: 20 - + 7.62mm 20Rnd Mag (Berger Hybrid OTM) Magazynek 7,62mm 20rd (Berger Hybrid OTM) Ch. 7.62 20Cps (Berger Hybrid OTM) @@ -1316,7 +1316,7 @@ Carregador 7.62mm com 20 cartuchos (Berger Hybrid OTM) 7,62mm 20-lövedékes tár (Berger Hybrid OTM) - + 7.62mm OTM 7,62mm OTM 7.62mm OTM @@ -1328,7 +1328,7 @@ 7.62mm OTM 7,62mm OTM - + Caliber: 7.62x67mm NATO (Berger Hybrid OTM)<br />Rounds: 20 Kaliber: 7,62x67mm NATO (Berger Hybrid OTM)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Berger Hybrid OTM)<br />Cartouches: 20 @@ -1340,7 +1340,7 @@ Calibre: 7.26x67mm NATO (Berger Hybrid OTM)<br/>Cartuchos: 20 Kaliber: 7,62x67mm NATO (Berger Hybrid OTM)<br />Lövedékek: 20 - + 6.5x47mm 30Rnd Mag (HPBT Scenar) Ch. 6.5x47mm 30Cps (HPBT Scenar) Cargador de 30 balas de 6.5x47mm (HPBT Scenar) @@ -1352,7 +1352,7 @@ Carregador 6.5x47mm com 30 cartuchos (HPBT Scenar) 6,5x47mm 30-lövedékes tár (HPBT Scenar) - + 6.5mm Lapua 6.5mm Lapua 6.5mm Lapua @@ -1364,7 +1364,7 @@ 6.5mm Lapua 6,5mm Lapua - + Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30<br />Used in: MXM Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30<br />Se usa en: MXM @@ -1376,7 +1376,7 @@ Calibre: 6.5x47mm (HPBT Scenar)<br/>Cartuchos: 30<br/>Usado em: MXM Kaliber: 6,5x47mm (HPBT Scenar)<br />Lövedékek: 30<br />Használható: MXM - + 6.5mm Creedmor 30Rnd Mag Magazynek 6,5mm Creedmor 30rd 6.5mm Creedmor 30Rnd Mag @@ -1388,7 +1388,7 @@ Carregador 6.5mm com 30 cartuchos Creedmor 6,5mm Creedmor 30-lövedékes tár - + 6.5mm CM 6.5mm CM 6.5mm CM @@ -1400,7 +1400,7 @@ 6.5mm CM 6,5mm CM - + Caliber: 6.5x47mm Creedmor<br />Rounds: 30<br />Used in: MXM Kaliber: 6,5x47mm Creedmor<br />Pociski: 30<br />Używany w: MXM Kaliber: 6,5x47mm Creedmor<br />Patronen: 30<br />Eingesetzt von: MXM @@ -1412,7 +1412,7 @@ Calibre: 6.5x47mm Creedmor<br/>Cartuchos: 30<br/>Usado em: MXM Kaliber: 6,5x47mm Creedmor<br />Lövedékek: 30<br />Használható: MXM - + .338 10Rnd Mag (300gr Sierra MatchKing HPBT) Ch. .338 10 Cps (300gr Sierra MatchKing HPBT) Cargador de 10 balas de 8.6x70mm (300gr Sierra MatchKing HPBT) @@ -1424,7 +1424,7 @@ Carregador .338 (300gr Sierra MatchKing HPBT) com 10 cartuchos .338 10-lövedékes tár (300gr Sierra MatchKing HPBT) - + .338 HPBT .338 HPBT .338 HPBT @@ -1436,7 +1436,7 @@ .338 HPBT .338 HPBT - + Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Cartouches: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Balas: 10 @@ -1448,7 +1448,7 @@ Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br/>Cartuchos: 10 Kaliber: 8,6x70mm (300gr Sierra MatchKing HPBT)<br />Lövedékek: 10 - + .338 10Rnd Mag (API526) Ch. .338 10Cps (API526) Cargador de 10 balas de .338 (API526) @@ -1460,7 +1460,7 @@ Carregador .338 (API526) com 10 cartuchos .338 10-lövedékes tár (API526) - + .338 AP .338 AP .338 AP @@ -1472,7 +1472,7 @@ .338 AP .338 páncéltörő - + Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 Calibre: 8.6x70mm (API526)<br />Balas: 10 @@ -1484,7 +1484,7 @@ Calibre: 8.6x70mm (API526)<br/>Cartuchos: 10 Kaliber: 8,6x70mm (API526)<br />Lövedékek: 10 - + 12.7x99mm 5Rnd Mag Ch. 12.7x99mm 5Cps Cargador de 5 balas de 12.7x99mm @@ -1496,7 +1496,7 @@ Carregador 12.7x99mm com 5 cartuchos 12,7x99mm 5-lövedékes tár - + 12.7mm 12.7mm 12.7mm @@ -1508,7 +1508,7 @@ 12.7mm 12,7mm - + Caliber: 12.7x99mm<br />Rounds: 5 Calibre: 12.7x99mm<br />Cartouches: 5 Calibre: 12.7x99mm<br />Balas: 5 @@ -1520,7 +1520,7 @@ Calibre: 12.7x99mm<br/>Cartuchos: 5 Kaliber: 12,7x99mm<br />Lövedékek: 5 - + 12.7x99mm API 5Rnd Mag Ch. 12.7x99mm API 5Cps Cargador de 5 balas de 12.7x99mm API @@ -1532,7 +1532,7 @@ Carregador 12.7x99mm API com 5 cartuchos 12,7x99mm 5-lövedékes tár (páncéltörő-gyújtó) - + 12.7mm API 12.7mm API 12.7mm API @@ -1544,7 +1544,7 @@ 12.7mm API 12,7mm páncéltörő-gyújtó - + Caliber: 12.7x99mm API<br />Rounds: 5 Calibre: 12.7x99mm API<br />Cartouches: 5 Calibre: 12.7x99mm API<br />Balas: 5 @@ -1556,7 +1556,7 @@ Calibre: 12.7x99mm API<br/>Cartuchos: 5 Kaliber: 12,7x99mm API<br />Lövedékek: 5 - + 12.7x99mm 5Rnd Mag (AMAX) Ch. 12.7x99mm 5Cps (AMAX) Cargador de 5 balas de 12.7x99mm (AMAX) @@ -1568,7 +1568,7 @@ Carregador 12.7x99mm (AMAX) com 5 cartuchos 12,7x99mm 5-lövedékes tár (AMAX) - + 12.7mm 12.7mm 12.7mm @@ -1580,7 +1580,7 @@ 12.7mm 12,7mm - + Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 Calibre: 12.7x99mm (AMAX)<br />Cartouches: 5 Calibre: 12.7x99mm (AMAX)<br />Balas: 5 @@ -1592,9 +1592,13 @@ Calibre: 12.7x99mm (AMAX)<br/>Cartuchos: 5 Kaliber: 12,7x99mm (AMAX)<br />Lövedékek: 5 - + [ACE] Ammo Supply Crate [ACE] Skrzynka z amunicją + [ACE] Caja de suministros de munición + [ACE] Munitionskiste + [ACE] Bedna s municí + [ACE] Caixa com suprimentos de munição - + \ No newline at end of file diff --git a/addons/captives/ACE_Settings.hpp b/addons/captives/ACE_Settings.hpp new file mode 100644 index 0000000000..73bafbab41 --- /dev/null +++ b/addons/captives/ACE_Settings.hpp @@ -0,0 +1,14 @@ +class ACE_Settings { + class GVAR(allowHandcuffOwnSide) { + displayName = CSTRING(ModuleSettings_handcuffSide_name); + description = CSTRING(ModuleSettings_handcuffSide_description); + typeName = "BOOL"; + value = 1; + }; + class GVAR(allowSurrender) { + displayName = CSTRING(ModuleSettings_allowSurrender_name); + description = CSTRING(ModuleSettings_allowSurrender_description); + typeName = "BOOL"; + value = 1; + }; +}; diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 91c47824fd..746a1c4b63 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -4,7 +4,7 @@ class CfgVehicles { class ACE_Actions { class ACE_ApplyHandcuffs { - displayName = "$STR_ACE_Captives_SetCaptive"; + displayName = CSTRING(SetCaptive); selection = "righthand"; distance = 2; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); @@ -13,7 +13,7 @@ class CfgVehicles { icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); }; class ACE_RemoveHandcuffs { - displayName = "$STR_ACE_Captives_ReleaseCaptive"; + displayName = CSTRING(ReleaseCaptive); selection = "righthand"; distance = 2; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); @@ -24,7 +24,7 @@ class CfgVehicles { class ACE_MainActions { class ACE_EscortCaptive { - displayName = "$STR_ACE_Captives_EscortCaptive"; + displayName = CSTRING(EscortCaptive); distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive)); @@ -35,7 +35,7 @@ class CfgVehicles { hotkey = "E"; }; class ACE_StopEscorting { - displayName = "$STR_ACE_Captives_StopEscorting"; + displayName = CSTRING(StopEscorting); distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting)); statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive)); @@ -46,7 +46,7 @@ class CfgVehicles { hotkey = "E"; }; class ACE_LoadCaptive { - displayName = "$STR_ACE_Captives_LoadCaptive"; + displayName = CSTRING(LoadCaptive); distance = 4; condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive)); @@ -56,22 +56,19 @@ class CfgVehicles { priority = 2.2; hotkey = "L"; }; - class ACE_FriskPerson { - displayName = "$STR_ACE_Captives_FriskPerson"; - distance = 2; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doFriskPerson)); - showDisabled = 0; - //icon = ""; //@todo - priority = 3; - hotkey = "F"; + class GVAR(UnloadCaptive) { + displayName = CSTRING(UnloadCaptive); + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); + priority = 1.2; }; }; }; class ACE_SelfActions { class ACE_StopEscortingSelf { - displayName = "$STR_ACE_Captives_StopEscorting"; + displayName = CSTRING(StopEscorting); condition = QUOTE([ARR_2(_player, objNull)] call FUNC(canStopEscorting)); statement = QUOTE([ARR_3(_player,objNull, false)] call FUNC(doEscortCaptive)); exceptions[] = {"isNotEscorting"}; @@ -80,20 +77,22 @@ class CfgVehicles { hotkey = "C"; }; class ACE_StartSurrenderingSelf { - displayName = "$STR_ACE_Captives_StartSurrendering"; + displayName = CSTRING(StartSurrendering); condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender)); statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); exceptions[] = {}; showDisabled = 0; priority = 0; + icon = QUOTE(PATHTOF(UI\Surrender_ca.paa)); }; class ACE_StopSurrenderingSelf { - displayName = "$STR_ACE_Captives_StopSurrendering"; + displayName = CSTRING(StopSurrendering); condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender)); statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrendered)); exceptions[] = {"isNotSurrendering"}; showDisabled = 0; priority = 0; + icon = QUOTE(PATHTOF(UI\Surrender_ca.paa)); }; }; }; @@ -102,20 +101,13 @@ class CfgVehicles { class ACE_Actions { \ class ACE_MainActions { \ class GVAR(LoadCaptive) { \ - displayName = "$STR_ACE_Captives_LoadCaptive"; \ + displayName = CSTRING(LoadCaptive); \ distance = 4; \ condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \ exceptions[] = {"isNotEscorting"}; \ priority = 1.2; \ }; \ - class GVAR(UnloadCaptive) { \ - displayName = "$STR_ACE_Captives_UnloadCaptive"; \ - distance = 4; \ - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); \ - priority = 1.2; \ - }; \ }; \ }; @@ -159,21 +151,48 @@ class CfgVehicles { }; class GVAR(ModuleSurrender): Module_F { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Captives_ModuleSurrender_DisplayName"; //Make Unit Surrender - function = QUOTE(DFUNC(moduleSurrender)); + displayName = CSTRING(ModuleSurrender_DisplayName); //Make Unit Surrender + function = QFUNC(moduleSurrender); scope = 2; //show in editor - scopeCurator = 2; //show in zeus - curatorCost = 0; //??? isGlobal = 1; //run global isTriggerActivated = 1; //Wait for triggers icon = QUOTE(PATHTOF(UI\Icon_Module_Make_Unit_Surrender_ca.paa)); functionPriority = 0; class Arguments {}; class ModuleDescription: ModuleDescription { - description = "$STR_ACE_Captives_ModuleSurrender_Description"; //Sync a unit to make them surrender.
Source: ace_captives + description = CSTRING(ModuleSurrender_Description); //Sync a unit to make them surrender.
Source: ace_captives sync[] = {"AnyAI"}; }; }; -}; \ No newline at end of file + + class ACE_Module: Module_F {}; + class GVAR(moduleSettings): ACE_Module { + author = ECSTRING(common,ACETeam); + category = "ACE"; + displayName = CSTRING(ModuleSettings_DisplayName); + function = QFUNC(moduleSettings); + scope = 2; + icon = QUOTE(PATHTOF(UI\Icon_Module_settings_ca.paa)); + isGlobal = 1; + class Arguments { + class allowHandcuffOwnSide { + displayName = CSTRING(ModuleSettings_handcuffSide_name); + description = CSTRING(ModuleSettings_handcuffSide_description); + typeName = "BOOL"; + defaultValue = 1; + }; + class allowSurrender { + displayName = CSTRING(ModuleSettings_allowSurrender_name); + description = CSTRING(ModuleSettings_allowSurrender_description); + typeName = "BOOL"; + defaultValue = 1; + }; + }; + class ModuleDescription: ModuleDescription { + description = CSTRING(ModuleSettings_Description); + sync[] = {}; + }; + }; +}; diff --git a/addons/captives/CfgWeapons.hpp b/addons/captives/CfgWeapons.hpp index be2149ca88..7092962519 100644 --- a/addons/captives/CfgWeapons.hpp +++ b/addons/captives/CfgWeapons.hpp @@ -3,8 +3,8 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_CableTie: ACE_ItemCore { - displayName = "$STR_ACE_Captives_CableTie"; - descriptionShort = "$STR_ACE_Captives_CableTieDescription"; + displayName = CSTRING(CableTie); + descriptionShort = CSTRING(CableTieDescription); model = QUOTE(PATHTOF(models\ace_cabletie.p3d)); picture = QUOTE(PATHTOF(UI\ace_cabletie_ca.paa)); scope = 2; diff --git a/addons/captives/UI/Icon_Module_settings_ca.paa b/addons/captives/UI/Icon_Module_settings_ca.paa new file mode 100644 index 0000000000..365f02cb21 Binary files /dev/null and b/addons/captives/UI/Icon_Module_settings_ca.paa differ diff --git a/addons/captives/UI/Surrender_ca.paa b/addons/captives/UI/Surrender_ca.paa new file mode 100644 index 0000000000..6ddabf4d56 Binary files /dev/null and b/addons/captives/UI/Surrender_ca.paa differ diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index bc6a61bc4f..31bcbe8e02 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -24,6 +24,7 @@ PREP(handlePlayerChanged); PREP(handleRespawn); PREP(handleUnitInitPost); PREP(handleZeusDisplayChanged); +PREP(moduleSettings); PREP(moduleSurrender); PREP(setHandcuffed); PREP(setSurrendered); diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index 57de6ee970..cdaf6dc4e4 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {QGVAR(ModuleSurrender)}; + units[] = {QGVAR(ModuleSettings), QGVAR(ModuleSurrender)}; weapons[] = {"ACE_CableTie"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ACE_Interaction"}; @@ -12,6 +12,7 @@ class CfgPatches { }; }; +#include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" #include "CfgMoves.hpp" #include "CfgVehicles.hpp" diff --git a/addons/captives/functions/fnc_canApplyHandcuffs.sqf b/addons/captives/functions/fnc_canApplyHandcuffs.sqf index f69bb2544d..e42b5455ff 100644 --- a/addons/captives/functions/fnc_canApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_canApplyHandcuffs.sqf @@ -18,8 +18,9 @@ PARAMS_2(_unit,_target); -//Player has cableTie, target is alive and not already handcuffed +//Check sides, Player has cableTie, target is alive and not already handcuffed +(GVAR(allowHandcuffOwnSide) || {(side _unit) != (side _target)}) && ("ACE_CableTie" in (items _unit)) && {alive _target} && {!(_target getVariable [QGVAR(isHandcuffed), false])} diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf index 85bd8bbd3e..1d9480fd0b 100644 --- a/addons/captives/functions/fnc_canEscortCaptive.sqf +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -23,4 +23,6 @@ PARAMS_2(_unit,_target); (_target getVariable [QGVAR(isHandcuffed), false]) && {isNull (attachedTo _target)} && {alive _target} && -{!(_target getVariable ["ACE_isUnconscious", false])} +{!(_target getVariable ["ACE_isUnconscious", false])} && +{(vehicle _unit) == _unit} && +{(vehicle _target) == _target} diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index 9ba7cf6de0..059fb98d03 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -22,7 +22,7 @@ private "_returnValue"; _returnValue = if (_newSurrenderState) then { //no weapon equiped AND not currently surrendering and - (currentWeapon _unit == "") && {!(_unit getVariable [QGVAR(isSurrendering), false])} + GVAR(allowSurrender) && {(currentWeapon _unit) == ""} && {!(_unit getVariable [QGVAR(isSurrendering), false])} } else { //is Surrendering (_unit getVariable [QGVAR(isSurrendering), false]) diff --git a/addons/captives/functions/fnc_canUnloadCaptive.sqf b/addons/captives/functions/fnc_canUnloadCaptive.sqf index a86bdae588..59e798a24c 100644 --- a/addons/captives/functions/fnc_canUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_canUnloadCaptive.sqf @@ -3,15 +3,14 @@ * Check if the unit can unload a captive from the vehicle. * * Arguments: - * 0: Unit that wants to unload a captive - * 1: A captive. ObjNull for the first escorted captive - * 2: Vehicle to unload a captive from + * 0: Unit that wants to unload a captive (player) + * 1: A captive loaded in a vehicle * * Return Value: * The return value * * Example: - * [player, bob, car1] call ACE_captives_fnc_canUnloadCaptive; + * [player, bob] call ACE_captives_fnc_canUnloadCaptive; * * Public: No */ @@ -19,10 +18,6 @@ private ["_cargo"]; -PARAMS_2(_unit,_vehicle); +PARAMS_2(_player,_unit); -_cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. - -_cargo = [_cargo, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); - -count _cargo > 0 +((vehicle _unit) != _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]} diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index b8758065d8..bc2cd97ffd 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -30,7 +30,7 @@ if (_state) then { _unit setVariable [QGVAR(escortedUnit), _target, true]; //Add Actionmenu to release captive - _actionID = _unit addAction [format ["%1", localize "STR_ACE_Captives_StopEscorting"], + _actionID = _unit addAction [format ["%1", localize LSTRING(StopEscorting)], {[(_this select 0), ((_this select 0) getVariable [QGVAR(escortedUnit), objNull]), false] call FUNC(doEscortCaptive);}, nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))]; diff --git a/addons/captives/functions/fnc_doFriskPerson.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf index dd7cc3c675..d79c88a5fb 100644 --- a/addons/captives/functions/fnc_doFriskPerson.sqf +++ b/addons/captives/functions/fnc_doFriskPerson.sqf @@ -27,7 +27,7 @@ if (_weapon == primaryWeapon _player && {_weapon != ""}) then { _listedItemClasses = []; -_actions = [localize "STR_ACE_Captives_FriskMenuHeader", ""] call ACE_Interaction_fnc_prepareSelectMenu; +_actions = [localize LSTRING(FriskMenuHeader), ""] call ACE_Interaction_fnc_prepareSelectMenu; _allGear = []; diff --git a/addons/captives/functions/fnc_doUnloadCaptive.sqf b/addons/captives/functions/fnc_doUnloadCaptive.sqf index b7fa57a7bb..5d95189742 100644 --- a/addons/captives/functions/fnc_doUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_doUnloadCaptive.sqf @@ -4,29 +4,18 @@ * * Arguments: * 0: Unit that wants to unload a captive - * 1: Vehicle to unload a captive from. + * 1: A captive loaded in a vehicle * * Return Value: * Nothing * * Example: - * [bob, car] call ACE_captives_fnc_doUnloadCaptive + * [bob, prisoner] call ACE_captives_fnc_doUnloadCaptive * * Public: No */ #include "script_component.hpp" -PARAMS_2(_unit,_vehicle); +PARAMS_2(_unit,_target); -private ["_cargo", "_target"]; - -_cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. - -_cargo = [_cargo, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); - -if ((count _cargo) > 0) then { - _target = _cargo select 0; - ["MoveOutCaptive", [_target], [_target]] call EFUNC(common,targetEvent); -} else { - ERROR("No captive to unload"); -}; +["MoveOutCaptive", [_target], [_target]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_moduleSettings.sqf b/addons/captives/functions/fnc_moduleSettings.sqf new file mode 100644 index 0000000000..c12ac80b99 --- /dev/null +++ b/addons/captives/functions/fnc_moduleSettings.sqf @@ -0,0 +1,19 @@ +/* + * Author: PabstMirror + * Module for captivity settings + * + * Arguments: + * 0: The module logic + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +PARAMS_1(_logic); + +[_logic, QGVAR(allowHandcuffOwnSide), "allowHandcuffOwnSide"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(allowSurrender), "allowSurrender"] call EFUNC(common,readSettingFromModule); diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index bf0e04cd6a..5b40b7663e 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -23,37 +23,13 @@ private ["_bisMouseOver", "_mouseOverObject"]; if (!_activated) exitWith {}; if (local _logic) then { - if ((!isnull curatorcamera) && {((count curatorMouseOver) == 2) && {(curatorMouseOver select 1) == _logic}}) then {//in zeus interface and we placed the module - _bisMouseOver = missionNamespace getVariable ["bis_fnc_curatorObjectPlaced_mouseOver", []];//bis caches the previous curatorMouseOver - if ((count _bisMouseOver) == 2) then {//check what mouse was over before the module was placed - _mouseOverObject = _bisMouseOver select 1; - if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { - TRACE_2("Debug - module surrendering %1",_mouseOverObject,(name _mouseOverObject)); - if (alive _mouseOverObject) then { - if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { - ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); - } else { - ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); - }; - } else { - ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(common,displayTextStructured); - }; - } else { - ["STR_ACE_Captives_Zeus_OnlyInfantry"] call EFUNC(common,displayTextStructured); - }; - } else { - ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(common,displayTextStructured); - }; - } else { - //an editor module - //Modules run before postInit can instal the event handler, so we need to wait a little bit - [{ - PARAMS_1(_units); - { - ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); - } forEach _units; - }, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute); - }; + //Modules run before postInit can instal the event handler, so we need to wait a little bit + [{ + PARAMS_1(_units); + { + ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); + } forEach _units; + }, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute); deleteVehicle _logic; }; diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index 22de70921d..c1a34b636c 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -89,7 +89,7 @@ if (_state) then { PARAMS_2(_args,_pfID); EXPLODE_2_PVT(_args,_unit,_maxTime); //If waited long enough or they re-surrendered or they are unconscious, exit loop - if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith { + if ((ACE_time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; }; //Only break animation if they are actualy the "hands up" animation (because we are using switchmove there won't be an transition) @@ -98,6 +98,6 @@ if (_state) then { //Break out of hands up animation loop [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; - }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; + }, 0, [_unit, (ACE_time + 20)]] call CBA_fnc_addPerFrameHandler; }; }; diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 07cf780e19..a65daba683 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -140,7 +140,7 @@ Rendirse Render-se Vzdát se - Poddaj się + Kapituluj Сдаться Megadás Arrenditi @@ -157,49 +157,63 @@ Megadás abbahagyása Smetti di arrenderti - - Only use on alive units - Utiliser uniquement sur une unité vivante - Nur bei lebenden Einheiten verwendbar - Utilizar solo en unidades vivas - Použitelné jen na živé jednotky - Używaj tylko na żywych jednostkach - Применимо только к живым юнитам - Csak élő egységeken használni - Si può fare solo su persone vive - Usar somente em unidades vivas - - - Only use on dismounted inf - Utiliser uniquement sur du personnel à pied - Nur bei abgesessener Infanterie verwendbar - Utilizar solo en infanteria desmontada - Použitelné jen na pěsích jednotkách - Używaj tylko na piechocie poza wszelkimi pojazdami - Применимо только к пехоте вне техники - Csak járműben kívül lévő egységeken használni - Si può usare solo su fanteria a piedi - Usar somente em infantaria desmontada - - - Nothing under mouse - Rien sous le curseur - Es wurde nichts ausgewählt - Nada bajo el ratón - Nada debaixo do mouse - Nic není vybráno - Nie ma nic pod kursorem - Ничего не выделено - Semmi sincs az egér alatt - Nessuna selezione - Make Unit Surrender - Poddaj się! + Skapituluj jednostkę + Hacer que la unidad se rinda + Einheit kapitulieren lassen + Vzdávající se jednotka + Fazer unidade se render Sync a unit to make them surrender.<br />Source: ace_captives - Zsynchronizuj z jednostką aby sprawić by się poddała<br />Źródło: ace_captives + Zsynchronizuj z jednostką, aby skapitulowała.<br />Źródło: ace_captives + Sincroniza una unidad para hacer que se rinda.<br />Fuente: ace_captives + Einheit synchronisieren, um sie kapitulieren zu lassen.<br />Quelle: ace_captives + Synchronizuj s jednotkou, která se má vzdát.<br />Zdroj: ace_captives + Sincroniza uma unidade para fazer com que ela se renda. <br/>Fonte: ace_captives + + + Captives Settings + Ustawienia więźniów + Ajustes de prisioneros + Nastavení zajatce + Ajustes de prisioneiros + + + Controls settings for surrender and cable ties + Moduł ten kontroluje ustawienia kapitulacji oraz opasek zaciskowych + Ajustes de control para rendición y precintos + Toto kontroluje nastavení kapitulace a pout + Controla as configurações de rendição e abraçadeiras + + + Can handcuff own side + Skuwanie sojuszników + Se puede esposar el bando propio + Může spoutat spolubojovníky + Pode algemar o próprio lado + + + Can players cabletie units on their own side + Czy gracze mogą skuwać sojuszników? + Pueden los jugadores esposar unidades en su propio bando + Mohou hráči spoutat jednotky na své straně + Os jogadores podem algemar unidades do seu lado + + + Allow surrendering + Pozwól kapitulować + Permitir rendición + Povolit vzdávání + Permite rendição + + + Players can surrender after holstering their weapon + Gracze mogą skapitulować po schowaniu swojej broni do kabury + Los jugadores pueden rendirse después de enfundar su arma + Hráč se může vzdát poté, co si skryje zbraň + Jogadores podem se render depois de guardar sua arma - + \ No newline at end of file diff --git a/addons/common/ACE_Settings.hpp b/addons/common/ACE_Settings.hpp new file mode 100644 index 0000000000..d6226fd0ab --- /dev/null +++ b/addons/common/ACE_Settings.hpp @@ -0,0 +1,75 @@ +class ACE_Settings { + /* + * class GVAR(sampleSetting) { + * value = 1; // Value + * typeName = "SCALAR"; // Type (SCALAR, BOOL, STRING, ARRAY, COLOR) + * force = 0; // Force the setting? + * isClientSettable = 1; // Does it appear on the options menu? + * + * // The following settings only apply when isClientSettable == 1 + * displayName = "$STR_ACE_Common_SettingName"; // Stringtable entry with the setting name + * description = "$STR_ACE_Common_SettingDescription"; // Stringtable entry with the setting description + * + * // Only applies if typeName == "SCALAR"; + * values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; // Stringtable entries that describe the options + * }; + */ + class GVAR(forceAllSettings) { + value = 0; + typeName = "BOOL"; + }; + class GVAR(checkPBOsAction) { + value = 0; + typeName = "SCALAR"; + isClientSettable = 0; + values[] = {CSTRING(CheckPBO_Action_WarnOnce), CSTRING(CheckPBO_Action_WarnPerm), CSTRING(CheckPBO_Action_Kick)}; + }; + class GVAR(checkPBOsCheckAll) { + value = 0; + typeName = "BOOL"; + isClientSettable = 0; + }; + class GVAR(checkPBOsWhitelist) { + value = "[]"; + typeName = "STRING"; + isClientSettable = 0; + }; + /*class GVAR(enableNumberHotkeys) { + value = 1; + typeName = "BOOL"; + isClientSettable = 1; + displayName = CSTRING(EnableNumberHotkeys); + };*/ + class GVAR(settingFeedbackIcons) { + value = 1; + typeName = "SCALAR"; + force = 0; + isClientSettable = 1; + displayName = CSTRING(SettingFeedbackIconsName); + description = CSTRING(SettingFeedbackIconsDesc); + values[] = {ECSTRING(optionsmenu,Hide), ECSTRING(optionsmenu,TopRightDown), ECSTRING(optionsmenu,TopRightLeft), ECSTRING(optionsmenu,TopLeftDown), ECSTRING(optionsmenu,TopLeftRight)}; + }; + class GVAR(SettingProgressBarLocation) { + value = 0; + typeName = "SCALAR"; + force = 0; + isClientSettable = 1; + displayName = CSTRING(SettingProgressbarLocationName); + description = CSTRING(SettingProgressbarLocationDesc); + values[] = {ECSTRING(optionsmenu,Top), ECSTRING(optionsmenu,Bottom)}; + }; + class GVAR(displayTextColor) { + value[] = {0,0,0,0.1}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = CSTRING(SettingDisplayTextColorName); + description = CSTRING(SettingDisplayTextColorDesc); + }; + class GVAR(displayTextFontColor) { + value[] = {1,1,1,1}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = CSTRING(SettingDisplayTextFontColorName); + description = CSTRING(SettingDisplayTextFontColorDesc); + }; +}; diff --git a/addons/common/CfgUnitInsignia.hpp b/addons/common/CfgUnitInsignia.hpp index aba82823c9..c1cd541e9c 100644 --- a/addons/common/CfgUnitInsignia.hpp +++ b/addons/common/CfgUnitInsignia.hpp @@ -2,13 +2,13 @@ class CfgUnitInsignia { class ACE_insignia_logo { displayName = "ACE3"; - author = "$STR_ACE_Common_ACETeam"; + author = CSTRING(ACETeam); texture = PATHTOF(data\Insignia_ace3logo_ca.paa); textureVehicle = ""; }; class ACE_insignia_banana { displayName = "ABE3"; - author = "$STR_ACE_Common_ACETeam"; + author = CSTRING(ACETeam); texture = PATHTOF(data\insignia_banana_ca.paa); textureVehicle = ""; }; diff --git a/addons/common/CfgVehicles.hpp b/addons/common/CfgVehicles.hpp index 1adf622494..767822f4ea 100644 --- a/addons/common/CfgVehicles.hpp +++ b/addons/common/CfgVehicles.hpp @@ -1,124 +1,119 @@ - class CfgVehicles { - /*class Man; - class CAManBase: Man { - // @todo - class UserActions { - class ACE_Fire { - displayName = ""; - priority = -99; - available = 1; - radius = 2.5; - radiusView = 0; - position = ""; - showWindow = 0; - showIn3D = 0; - onlyForPlayer = 1; - shortcut = "DefaultAction"; - condition = QUOTE(call GVAR(UserActionFireCondition)); - statement = QUOTE(call GVAR(UserActionFire)); - userActionID = 100; - }; - }; - };*/ - - // += needs a non inherited entry in that class, otherwise it simply overwrites - //#include - - class Logic; - class Module_F: Logic { - class ModuleDescription {}; - }; - class ACE_ModuleCheckPBOs: Module_F { - author = "$STR_ACE_Common_ACETeam"; - category = "ACE"; - displayName = "$STR_ACE_Common_CheckPBO_DisplayName"; - function = QFUNC(moduleCheckPBOs); - scope = 2; - isGlobal = 1; - icon = QUOTE(PATHTOF(UI\Icon_Module_CheckPBO_ca.paa)); - class Arguments { - class Action { - displayName = "$STR_ACE_Common_CheckPBO_Action_DisplayName"; - description = "$STR_ACE_Common_CheckPBO_Action_Description"; - class values { - class WarnOnce { - default = 1; - name = "$STR_ACE_Common_CheckPBO_Action_WarnOnce"; - value = 0; - }; - class Warn { - name = "$STR_ACE_Common_CheckPBO_Action_WarnPerm"; - value = 1; - }; - class Kick { - name = "$STR_ACE_Common_CheckPBO_Action_Kick"; - value = 2; - }; + /*class Man; + class CAManBase: Man { + // @todo + class UserActions { + class ACE_Fire { + displayName = ""; + priority = -99; + available = 1; + radius = 2.5; + radiusView = 0; + position = ""; + showWindow = 0; + showIn3D = 0; + onlyForPlayer = 1; + shortcut = "DefaultAction"; + condition = QUOTE(call GVAR(UserActionFireCondition)); + statement = QUOTE(call GVAR(UserActionFire)); + userActionID = 100; + }; }; - }; - class CheckAll { - displayName = "$STR_ACE_Common_CheckPBO_CheckAll_DisplayName"; - description = "$STR_ACE_Common_CheckPBO_CheckAll_Description"; - typeName = "BOOL"; - defaultValue = 0; - }; - class Whitelist { - displayName = "$STR_ACE_Common_CheckPBO_Whitelist_DisplayName"; - description = "$STR_ACE_Common_CheckPBO_Whitelist_Description"; - typeName = "STRING"; - class values { - default = "[]"; + };*/ + + // += needs a non inherited entry in that class, otherwise it simply overwrites + //#include + class Logic; + class Module_F: Logic { + class ModuleDescription; + }; + class ACE_Module: Module_F {}; + class ACE_ModuleCheckPBOs: ACE_Module { + author = CSTRING(ACETeam); + category = "ACE"; + displayName = CSTRING(CheckPBO_DisplayName); + function = QFUNC(moduleCheckPBOs); + scope = 2; + isGlobal = 1; + icon = QUOTE(PATHTOF(UI\Icon_Module_CheckPBO_ca.paa)); + class Arguments { + class Action { + displayName = CSTRING(CheckPBO_Action_DisplayName); + description = CSTRING(CheckPBO_Action_Description); + typeName = "NUMBER"; + class values { + class WarnOnce { + default = 1; + name = CSTRING(CheckPBO_Action_WarnOnce); + value = 0; + }; + class Warn { + name = CSTRING(CheckPBO_Action_WarnPerm); + value = 1; + }; + class Kick { + name = CSTRING(CheckPBO_Action_Kick); + value = 2; + }; + }; + }; + class CheckAll { + displayName = CSTRING(CheckPBO_CheckAll_DisplayName); + description = CSTRING(CheckPBO_CheckAll_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class Whitelist { + displayName = CSTRING(CheckPBO_Whitelist_DisplayName); + description = CSTRING(CheckPBO_Whitelist_Description); + typeName = "STRING"; + defaultValue = "[]"; + }; + }; + class ModuleDescription: ModuleDescription { + description = CSTRING(CheckPBO_Description); }; - }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_Common_CheckPBO_Description"; - }; - }; - class ACE_ModuleLSDVehicles: Module_F { - author = "$STR_ACE_Common_ACETeam"; - category = "ACE"; - displayName = "$STR_ACE_Common_LSDVehicles_DisplayName"; - function = "ACE_Common_fnc_moduleLSDVehicles"; - scope = 2; - icon = QUOTE(PATHTOF(UI\Icon_Module_LSD_ca.paa)); - isGlobal = 1; - class Arguments { + class ACE_ModuleLSDVehicles: ACE_Module { + author = CSTRING(ACETeam); + category = "ACE"; + displayName = CSTRING(LSDVehicles_DisplayName); + function = "ACE_Common_fnc_moduleLSDVehicles"; + scope = 2; + icon = QUOTE(PATHTOF(UI\Icon_Module_LSD_ca.paa)); + isGlobal = 1; + class Arguments {}; + class ModuleDescription: ModuleDescription { + description = CSTRING(LSDVehicles_Description); + sync[] = {"AnyVehicle"}; + }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_Common_LSDVehicles_Description"; - sync[] = {"AnyVehicle"}; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + author = CSTRING(ACETeam); + displayName = CSTRING(MiscItems); + transportMaxWeapons = 9001; + transportMaxMagazines = 9001; + transportMaxItems = 9001; + maximumload = 9001; + + class TransportWeapons {}; + class TransportMagazines {}; + class TransportItems {}; + class TransportBackpacks {}; }; - }; - - class Box_NATO_Support_F; - class ACE_Box_Misc: Box_NATO_Support_F { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Common_MiscItems"; - transportMaxWeapons = 9001; - transportMaxMagazines = 9001; - transportMaxItems = 9001; - maximumload = 9001; - - class TransportWeapons {}; - class TransportMagazines {}; - class TransportItems {}; - class TransportBackpacks {}; - }; class Item_Base_F; class ACE_bananaItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = "$STR_ACE_Common_bananaDisplayName"; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(bananaDisplayName); + author = CSTRING(ACETeam); vehicleClass = "Items"; - class TransportItems - { - class ACE_banana - { + class TransportItems { + class ACE_banana { name = "ACE_banana"; count = 1; }; diff --git a/addons/common/CfgVoice.hpp b/addons/common/CfgVoice.hpp index 1fb0f5d2b6..22e0bd7066 100644 --- a/addons/common/CfgVoice.hpp +++ b/addons/common/CfgVoice.hpp @@ -209,7 +209,7 @@ class ACE_RadioProtocolNoRadio: RadioProtocolBase { class CfgVoice { class ACE_NoVoice { - author = "$STR_ACE_Common_ACETeam"; + author = CSTRING(ACETeam); protocol = "ACE_RadioProtocolNoRadio"; variants[] = {1}; directories[] = {"",""}; @@ -217,13 +217,13 @@ class CfgVoice { scope = 2; voiceType = ""; icon = "\a3\Ui_f\data\Map\Markers\Flags\nato_ca.paa"; - displayName = "$STR_ACE_Common_NoVoice"; + displayName = CSTRING(NoVoice); }; }; class CfgVoiceTypes { class ACE_NoVoice { - name = "$STR_ACE_Common_NoVoice"; + name = CSTRING(NoVoice); voices[] = {"ACE_NoVoice","ACE_NoVoice","ACE_NoVoice"}; preview = "ACE_NoVoice"; alternative = ""; diff --git a/addons/common/CfgWeapons.hpp b/addons/common/CfgWeapons.hpp index 59bb8f6b9a..aa905bb3e6 100644 --- a/addons/common/CfgWeapons.hpp +++ b/addons/common/CfgWeapons.hpp @@ -30,10 +30,10 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_Banana: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; + author = CSTRING(ACETeam); scope = 2; - displayName = "$STR_ACE_Common_bananaDisplayName"; - descriptionShort = "$STR_ACE_Common_bananaDescr"; + displayName = CSTRING(bananaDisplayName); + descriptionShort = CSTRING(bananaDescr); model = PATHTOF(data\banana.p3d); picture = PATHTOF(data\icon_banana_ca.paa); icon = "iconObject_circle"; diff --git a/addons/common/RscInfoType.hpp b/addons/common/RscInfoType.hpp index 9fd402f081..bad8a2b427 100644 --- a/addons/common/RscInfoType.hpp +++ b/addons/common/RscInfoType.hpp @@ -15,8 +15,12 @@ class RscInGameUI { class RscUnitInfoTank: RscUnitInfo { onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call compile preprocessfilelinenumbers ""A3\ui_f\scripts\initDisplay.sqf""; uiNamespace setVariable [ARR_2('ACE_dlgVehicle', _this select 0)]; [ARR_2('infoDisplayChanged', [ARR_2(_this select 0, 'Vehicle')])] call FUNC(localEvent);); }; + + class RscUnitInfoAirNoWeapon: RscUnitInfo { + onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call compile preprocessfilelinenumbers ""A3\ui_f\scripts\initDisplay.sqf""; uiNamespace setVariable [ARR_2('ACE_dlgAircraft', _this select 0)]; [ARR_2('infoDisplayChanged', [ARR_2(_this select 0, 'Aircraft')])] call FUNC(localEvent);); + }; - class RscUnitInfoAir: RscUnitInfo { + class RscUnitInfoAir: RscUnitInfoAirNoWeapon { onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call compile preprocessfilelinenumbers ""A3\ui_f\scripts\initDisplay.sqf""; uiNamespace setVariable [ARR_2('ACE_dlgAircraft', _this select 0)]; [ARR_2('infoDisplayChanged', [ARR_2(_this select 0, 'Aircraft')])] call FUNC(localEvent);); }; diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index ba238c2796..3796a4fdc8 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -3,11 +3,26 @@ //IGNORE_PRIVATE_WARNING("_handleNetEvent", "_handleRequestAllSyncedEvents", "_handleRequestSyncedEvent", "_handleSyncedEvent"); -// Load settings from profile -if (hasInterface) then { - call FUNC(loadSettingsFromProfile); - call FUNC(loadSettingsLocalizedText); -}; +//Singe PFEH to handle execNextFrame and waitAndExec: +[{ + private ["_entry"]; + + //Handle the waitAndExec array: + while {((count GVAR(waitAndExecArray)) > 0) && {((GVAR(waitAndExecArray) select 0) select 0) <= ACE_Time}} do { + _entry = GVAR(waitAndExecArray) deleteAt 0; + (_entry select 2) call (_entry select 1); + }; + + //Handle the execNextFrame array: + { + (_x select 0) call (_x select 1); + } forEach GVAR(nextFrameBufferA); + //Swap double-buffer: + GVAR(nextFrameBufferA) = GVAR(nextFrameBufferB); + GVAR(nextFrameBufferB) = []; + GVAR(nextFrameNo) = diag_frameno + 1; +}, 0, []] call CBA_fnc_addPerFrameHandler; + // Listens for global "SettingChanged" events, to update the force status locally ["SettingChanged", { @@ -26,6 +41,8 @@ if (hasInterface) then { ["fixFloating", DFUNC(fixFloating)] call FUNC(addEventhandler); ["fixPosition", DFUNC(fixPosition)] call FUNC(addEventhandler); +["unloadPersonEvent", DFUNC(unloadPersonLocal)] call FUNC(addEventhandler); + ["lockVehicle", { _this setVariable [QGVAR(lockStatus), locked _this]; _this lock 2; @@ -41,7 +58,7 @@ if (hasInterface) then { // hack to get PFH to work in briefing [QGVAR(onBriefingPFH), "onEachFrame", { - if (time > 0) exitWith { + if (ACE_time > 0) exitWith { [QGVAR(onBriefingPFH), "onEachFrame"] call BIS_fnc_removeStackedEventHandler; }; @@ -86,6 +103,52 @@ if(!isServer) then { call FUNC(checkFiles); + +// Create a pfh to wait until all postinits are ready and settings are initialized +[{ + PARAMS_1(_args); + EXPLODE_1_PVT(_args,_waitingMsgSent); + // If post inits are not ready then wait + if !(SLX_XEH_MACHINE select 8) exitWith {}; + + // If settings are not initialized then wait + if (isNil QGVAR(settings) || {(!isServer) && (isNil QEGVAR(modules,serverModulesRead))}) exitWith { + if (!_waitingMsgSent) then { + _args set [0, true]; + diag_log text format["[ACE] Waiting on settings from server"]; + }; + }; + + [(_this select 1)] call cba_fnc_removePerFrameHandler; + + diag_log text format["[ACE] Settings received from server"]; + + // Event so that ACE_Modules have their settings loaded: + ["InitSettingsFromModules", []] call FUNC(localEvent); + + // Load user settings from profile + if (hasInterface) then { + call FUNC(loadSettingsFromProfile); + call FUNC(loadSettingsLocalizedText); + }; + + diag_log text format["[ACE] Settings initialized"]; + + //Event that settings are safe to use: + ["SettingsInitialized", []] call FUNC(localEvent); + +}, 0, [false]] call cba_fnc_addPerFrameHandler; + + +["SettingsInitialized", { + [ + GVAR(checkPBOsAction), + GVAR(checkPBOsCheckAll), + call compile GVAR(checkPBOsWhitelist) + ] call FUNC(checkPBOs) +}] call FUNC(addEventHandler); + + /***************************************************************/ /***************************************************************/ /***************************************************************/ @@ -223,7 +286,7 @@ GVAR(OldIsCamera) = false; ["activeCameraChanged", [ACE_player, _isCamera]] call FUNC(localEvent); }; -}, 1, []] call cba_fnc_addPerFrameHandler; // feel free to decrease the sleep time if you need it. +}, 1, []] call cba_fnc_addPerFrameHandler; // feel free to decrease the sleep ACE_time if you need it. [QGVAR(StateArrested),false,true,QUOTE(ADDON)] call FUNC(defineVariable); @@ -244,7 +307,7 @@ GVAR(OldIsCamera) = false; // Lastly, do JIP events // JIP Detection and event trigger. Run this at the very end, just in case anything uses it -if(isMultiplayer && { time > 0 || isNull player } ) then { +if(isMultiplayer && { ACE_time > 0 || isNull player } ) then { // We are jipping! Get ready and wait, and throw the event [{ if(!(isNull player)) then { @@ -253,3 +316,42 @@ if(isMultiplayer && { time > 0 || isNull player } ) then { }; }, 0, []] call cba_fnc_addPerFrameHandler; }; + +//Device Handler: +GVAR(deviceKeyHandlingArray) = []; +GVAR(deviceKeyCurrentIndex) = -1; + +["ACE3 Equipment", QGVAR(openDevice), (localize "STR_ACE_Common_toggleHandheldDevice"), +{ + [] call FUNC(deviceKeyFindValidIndex); + if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; + [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 3); + true +}, +{false}, +[0xC7, [false, false, false]], false] call cba_fnc_addKeybind; //Home Key + +["ACE3 Equipment", QGVAR(closeDevice), (localize "STR_ACE_Common_closeHandheldDevice"), +{ + [] call FUNC(deviceKeyFindValidIndex); + if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; + [] call ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 4); + true +}, +{false}, +[0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key + +["ACE3 Equipment", QGVAR(cycleDevice), (localize "STR_ACE_Common_cycleHandheldDevices"), +{ + [1] call FUNC(deviceKeyFindValidIndex); + if (GVAR(deviceKeyCurrentIndex) == -1) exitWith {false}; + _displayName = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 0); + _iconImage = ((GVAR(deviceKeyHandlingArray) select GVAR(deviceKeyCurrentIndex)) select 1); + [_displayName, _iconImage] call FUNC(displayTextPicture); + true +}, +{false}, +[0xC7, [true, false, false]], false] call cba_fnc_addKeybind; //SHIFT + Home Key + + +GVAR(commonPostInited) = true; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index ce7623ea38..72e85e4b6b 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -11,7 +11,6 @@ PREP(addCanInteractWithCondition); PREP(addLineToDebugDraw); PREP(addSetting); PREP(addToInventory); -PREP(adminKick); PREP(ambientBrightness); PREP(applyForceWalkStatus); PREP(ASLToPosition); @@ -35,6 +34,8 @@ PREP(currentChannel); PREP(debug); PREP(debugModule); PREP(defineVariable); +PREP(deviceKeyFindValidIndex); +PREP(deviceKeyRegisterNew); PREP(disableAI); PREP(disableUserInput); PREP(displayIcon); @@ -180,6 +181,7 @@ PREP(toHex); PREP(toNumber); PREP(uniqueElementsOnly); PREP(unloadPerson); +PREP(unloadPersonLocal); PREP(unmuteUnit); PREP(useItem); PREP(useMagazine); @@ -287,12 +289,18 @@ PREP(_handleRequestAllSyncedEvents); GVAR(syncedEvents) = HASH_CREATE; +//GVARS for execNextFrame and waitAndExec +GVAR(waitAndExecArray) = []; +GVAR(nextFrameNo) = diag_frameno; +GVAR(nextFrameBufferA) = []; +GVAR(nextFrameBufferB) = []; + // @TODO: Generic local-managed global-synced objects (createVehicleLocal) //Debug ACE_COUNTERS = []; -// Load settings +// Load settings on the server and broadcast them if (isServer) then { call FUNC(loadSettingsOnServer); }; @@ -321,6 +329,8 @@ ACE_realTime = diag_tickTime; ACE_virtualTime = diag_tickTime; ACE_diagTime = diag_tickTime; ACE_gameTime = time; +ACE_pausedTime = 0; +ACE_virtualPausedTime = 0; PREP(timePFH); [FUNC(timePFH), 0, []] call cba_fnc_addPerFrameHandler; diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 3f1e5a6308..f1bca395f8 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {"ACE_Box_Misc", "ACE_bananaItem"}; weapons[] = {"ACE_ItemCore","ACE_FakePrimaryWeapon", "ACE_Banana"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_main"}; + requiredAddons[] = {"ace_main","ace_modules"}; author[] = {"KoffeinFlummi"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; @@ -57,77 +57,7 @@ class ACE_Rsc_Control_Base { h = 0; }; -class ACE_Settings { - /* - *class GVAR(sampleSetting) { - * Value - * value = 1; - * - * Type (SCALAR, BOOL, STRING, ARRAY, COLOR) - * typeName = "SCALAR"; - * - * Force the setting? - * force = 0; - * - * Does it appear on the options menu? - * isClientSettable = 1; - * - * The following settings only apply when isClientSettable == 1 - * Stringtable entry with the setting name - * displayName = "$STR_ACE_Common_SettingName"; - * - * Stringtable entry with the setting description - * description = "$STR_ACE_Common_SettingDescription"; - * - * Stringtable entries that describe the options - * Only applies if typeName == "SCALAR"; - * values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; - *}; - */ - class GVAR(forceAllSettings) { - value = 0; - typeName = "BOOL"; - }; - /*class GVAR(enableNumberHotkeys) { - value = 1; - typeName = "BOOL"; - isClientSettable = 1; - displayName = "$STR_ACE_Common_EnableNumberHotkeys"; - };*/ - class GVAR(settingFeedbackIcons) { - value = 1; - typeName = "SCALAR"; - force = 0; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingFeedbackIconsName"; - description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; - values[] = {"$STR_ACE_Common_Hide", "$STR_ACE_Common_TopRightDown", "$STR_ACE_Common_TopRightLeft", "$STR_ACE_Common_TopLeftDown", "$STR_ACE_Common_TopLeftRight"}; - }; - class GVAR(SettingProgressBarLocation) { - value = 0; - typeName = "SCALAR"; - force = 0; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingProgressbarLocationName"; - description = "$STR_ACE_Common_SettingProgressbarLocationDesc"; - values[] = {"$STR_ACE_Common_Top", "$STR_ACE_Common_Bottom"}; - }; - class GVAR(displayTextColor) { - value[] = {0,0,0,0.1}; - typeName = "COLOR"; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; - description = "$STR_ACE_Common_SettingDisplayTextColorDesc"; - }; - class GVAR(displayTextFontColor) { - value[] = {1,1,1,1}; - typeName = "COLOR"; - isClientSettable = 1; - displayName = "$STR_ACE_Common_SettingDisplayTextFontColorName"; - description = "$STR_ACE_Common_SettingDisplayTextFontColorDesc"; - }; -}; - +#include "ACE_Settings.hpp" #include "define.hpp" #include #include diff --git a/addons/common/functions/fnc__handleSyncedEvent.sqf b/addons/common/functions/fnc__handleSyncedEvent.sqf index 9807896358..053ecb60b7 100644 --- a/addons/common/functions/fnc__handleSyncedEvent.sqf +++ b/addons/common/functions/fnc__handleSyncedEvent.sqf @@ -28,7 +28,7 @@ if(isServer) then { if(_ttl > -1) then { _internalData = HASH_GET(GVAR(syncedEvents),_name); _eventLog = _internalData select 1; - _eventLog pushback [diag_tickTime, _args, _ttl]; + _eventLog pushback [ACE_diagTime, _args, _ttl]; }; }; diff --git a/addons/common/functions/fnc_addScrollWheelEventHandler.sqf b/addons/common/functions/fnc_addScrollWheelEventHandler.sqf index 9f63719649..d079b4b17e 100644 --- a/addons/common/functions/fnc_addScrollWheelEventHandler.sqf +++ b/addons/common/functions/fnc_addScrollWheelEventHandler.sqf @@ -1,7 +1,7 @@ /* * Author: commy2 * - * Add an event handler that executes every time the scroll wheel is used. This is needed, because adding a MouseZ display event handler to display 46 will break in save games. Argument will be [Interval] where 'Interval' is a number. + * Add an event handler that executes every ACE_time the scroll wheel is used. This is needed, because adding a MouseZ display event handler to display 46 will break in save games. Argument will be [Interval] where 'Interval' is a number. * * Argument: * 0: Code to execute (Code or String) diff --git a/addons/common/functions/fnc_adminKick.sqf b/addons/common/functions/fnc_adminKick.sqf deleted file mode 100644 index bc9afd9fcb..0000000000 --- a/addons/common/functions/fnc_adminKick.sqf +++ /dev/null @@ -1,8 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -private "_name"; - -_name = name (_this select 0); - -[_name, "{if (serverCommandAvailable '#kick') then {serverCommand format['#kick %1', _this]}}"] call FUNC(execRemoteFnc); diff --git a/addons/common/functions/fnc_cachedCall.sqf b/addons/common/functions/fnc_cachedCall.sqf index c03d498eaa..f9d9c74dd3 100644 --- a/addons/common/functions/fnc_cachedCall.sqf +++ b/addons/common/functions/fnc_cachedCall.sqf @@ -1,6 +1,6 @@ /* * Author: esteldunedain and Jaynus - * Returns the result of the function and caches it up to a given time or event + * Returns the result of the function and caches it up to a given ACE_time or event * * Arguments: * 0: Parameters @@ -21,8 +21,8 @@ PARAMS_5(_params,_function,_namespace,_uid,_duration); //IGNORE_PRIVATE_WARNING("_eventName"); -if (((_namespace getVariable [_uid, [-99999]]) select 0) < diag_tickTime) then { - _namespace setVariable [_uid, [diag_tickTime + _duration, _params call _function]]; +if (((_namespace getVariable [_uid, [-99999]]) select 0) < ACE_diagTime) then { + _namespace setVariable [_uid, [ACE_diagTime + _duration, _params call _function]]; // Does the cache needs to be cleared on an event? if (count _this > 5) then { diff --git a/addons/common/functions/fnc_checkPBOs.sqf b/addons/common/functions/fnc_checkPBOs.sqf index cce3dccab0..4733f1a81f 100644 --- a/addons/common/functions/fnc_checkPBOs.sqf +++ b/addons/common/functions/fnc_checkPBOs.sqf @@ -1,38 +1,97 @@ /* * Author: commy2 - * * Used to execute the checkPBOs module without placing the module. Don't use this together with the module. + * Checks PBO versions and compares to the one running on server. * - * Argument: - * 0: Mode (Number) + * Arguments: + * 0: Mode * 0: Warn once * 1: Warn permanently * 2: Kick - * 1: Check all PBOs? (Boolean, optional default: "[]") - * 2: Whitelist (String, optinal default: false) + * 1: Check all PBOs? (Optional - default: "[]") + * 2: Whitelist (Optinal - default: false) * * Return value: - * None. + * None */ #include "script_component.hpp" -private ["_logic"]; +private ["_mode", "_checkAll", "_whitelist"]; -_this resize 3; +_mode = _this select 0; +_checkAll = if (count _this > 1) then {_this select 1} else {false}; +_whitelist = if (count _this > 2) then {_this select 2} else {"[]"}; -PARAMS_3(_mode,_checkAll,_whitelist); +_whitelist = [_whitelist, {toLower _this}] call FUNC(map); -if (isNil "_checkAll") then { - _checkAll = false; +ACE_Version_CheckAll = _checkAll; +ACE_Version_Whitelist = _whitelist; + +if (!isServer) then { + [_mode, _checkAll, _whitelist] spawn { + private ["_missingAddon", "_missingAddonServer", "_oldVersionClient", "_oldVersionServer", "_text", "_error", "_rscLayer", "_ctrlHint"]; + PARAMS_3(_mode,_checkAll,_whitelist); + + waitUntil { + sleep 1; + !isNil "ACE_Version_ClientErrors" + }; + + _missingAddon = ACE_Version_ClientErrors select 0; + _missingAddonServer = ACE_Version_ClientErrors select 1; + _oldVersionClient = ACE_Version_ClientErrors select 2; + _oldVersionServer = ACE_Version_ClientErrors select 3; + + // Display error message. + if (_missingAddon || {_missingAddonServer} || {_oldVersionClient} || {_oldVersionServer}) then { + _text = "[ACE] Version mismatch:

"; + _error = format ["ACE version mismatch: %1: ", profileName]; + + if (_missingAddon) then { + _text = _text + "Detected missing addon on client
"; + _error = _error + "Missing file(s); "; + }; + if (_missingAddonServer) then { + _text = _text + "Detected missing addon on server
"; + _error = _error + "Additional file(s); "; + }; + if (_oldVersionClient) then { + _text = _text + "Detected old client version
"; + _error = _error + "Older version; "; + }; + if (_oldVersionServer) then { + _text = _text + "Detected old server version
"; + _error = _error + "Newer version; "; + }; + + //[_error, "{systemChat _this}"] call FUNC(execRemoteFnc); + diag_log text _error; + + if (_mode < 2) then { + _text = composeText [lineBreak, parseText format ["%1", _text]]; + + _rscLayer = "ACE_RscErrorHint" call BIS_fnc_rscLayer; + _rscLayer cutRsc ["ACE_RscErrorHint", "PLAIN", 0, true]; + + disableSerialization; + _ctrlHint = uiNamespace getVariable "ACE_ctrlErrorHint"; + _ctrlHint ctrlSetStructuredText _text; + + if (_mode == 0) then { + sleep 10; + _rscLayer cutFadeOut 0.2; + }; + }; + + if (_mode == 2) then { + waitUntil {alive player}; // To be able to show list if using checkAll + _text = composeText [parseText format ["%1", _text]]; + ["[ACE] ERROR", _text, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); + }; + }; + }; }; -if (isNil "_whitelist") then { - _whitelist = "[]"; +if (_checkAll) then { + 0 spawn COMPILE_FILE(scripts\Version\checkVersionNumber); }; - -_logic = "Logic" createVehicleLocal [0,0,0]; -_logic setVariable ["Action", _mode]; -_logic setVariable ["CheckAll", _checkAll]; -_logic setVariable ["Whitelist", _whitelist]; -[_logic, [], true] call FUNC(moduleCheckPBOs); -deleteVehicle _logic; diff --git a/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf new file mode 100644 index 0000000000..a8418cd4cd --- /dev/null +++ b/addons/common/functions/fnc_deviceKeyFindValidIndex.sqf @@ -0,0 +1,45 @@ +/* + * Author: PabstMirror + * Finds next valid index for the device array. + * + * Arguments: + * 0: Offset from currentIndex (use 1 to find next valid after current) or a displayName string or + * + * Return Value: + * The new index (-1 if no valid) + * + * Example: + * [] call ace_common_fnc_deviceKeyFindValidIndex + * ["kestral4500"] call ace_common_fnc_deviceKeyFindValidIndex + * + * Public: No + */ +#include "script_component.hpp" + +DEFAULT_PARAM(0,_searchOffsetOrName,0); + +private ["_validIndex", "_offsetBy", "_realIndex", "_offset"]; + +_validIndex = -1; + +if ((typeName _searchOffsetOrName) == "STRING") then { + { + if ((_x select 0) == _searchOffsetOrName) exitWith { + _validIndex = _forEachIndex; + }; + } forEach GVAR(deviceKeyHandlingArray); +} else { + if ((count GVAR(deviceKeyHandlingArray)) > 0) then { + _baseIndex = if (GVAR(deviceKeyCurrentIndex) == -1) then {0} else {GVAR(deviceKeyCurrentIndex) + _searchOffsetOrName}; + for "_offset" from _baseIndex to ((count GVAR(deviceKeyHandlingArray)) - 1 + _baseIndex) do { + _realIndex = _offset % (count GVAR(deviceKeyHandlingArray)); + if ([] call ((GVAR(deviceKeyHandlingArray) select _realIndex) select 2)) exitWith { + _validIndex = _realIndex; + }; + }; + }; +}; + +GVAR(deviceKeyCurrentIndex) = _validIndex; + +GVAR(deviceKeyCurrentIndex) diff --git a/addons/common/functions/fnc_deviceKeyRegisterNew.sqf b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf new file mode 100644 index 0000000000..88ffa84af7 --- /dev/null +++ b/addons/common/functions/fnc_deviceKeyRegisterNew.sqf @@ -0,0 +1,25 @@ +/* + * Author: PabstMirror + * Finds next valid index for the device array. + * + * Arguments: + * 0: Localized Device Display Name + * 1: Image + * 2: Condtion Code (do they have the device) + * 3: Toggle Code (on home press) + * 4: Close Code (on ctrl-home press) + * + * Return Value: + * Nothing + * + * Example: + * [(localize "STR_ACE_microdagr_itemName"), QUOTE(PATHTOF(images\microDAGR_item.paa)), _conditionCode, _toggleCode, _closeCode] call ace_common_fnc_deviceKeyRegisterNew + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_5(_displayName,_iconImage,_conditionCode,_toggleCode,_closeCode); + +GVAR(deviceKeyHandlingArray) pushBack [_displayName,_iconImage,_conditionCode,_toggleCode,_closeCode]; +[] call FUNC(deviceKeyFindValidIndex); diff --git a/addons/common/functions/fnc_displayIcon.sqf b/addons/common/functions/fnc_displayIcon.sqf index 6561dbf63b..2fd5245465 100644 --- a/addons/common/functions/fnc_displayIcon.sqf +++ b/addons/common/functions/fnc_displayIcon.sqf @@ -86,11 +86,11 @@ _refresh = { if (_show) then { if ({(_x select 0 == _iconId)} count _list == 0) then { - _list pushback [_iconId, _icon, _color, time]; + _list pushback [_iconId, _icon, _color, ACE_time]; } else { { if (_x select 0 == _iconId) exitwith { - _list set [_foreachIndex, [_iconId, _icon, _color, time]]; + _list set [_foreachIndex, [_iconId, _icon, _color, ACE_time]]; }; } forEach _list; }; diff --git a/addons/common/functions/fnc_displayText.sqf b/addons/common/functions/fnc_displayText.sqf index ced1fbb4af..22349962ac 100644 --- a/addons/common/functions/fnc_displayText.sqf +++ b/addons/common/functions/fnc_displayText.sqf @@ -36,7 +36,7 @@ if (isNil "_sound") then {_sound = DEFAULT_PLAY_SOUND}; if (isNil "_delay") then {_delay = DEFAULT_DELAY}; if (isNil "_priority") then {_priority = DEFAULT_PRIORITY}; -_time = time; +_time = ACE_time; if (_time > _lastHintTime + _delay || {_priority >= _lastHintPriority}) then { hintSilent _text; if (_sound) then {playSound "ACE_Sound_Click"}; diff --git a/addons/common/functions/fnc_execNextFrame.sqf b/addons/common/functions/fnc_execNextFrame.sqf index 39fef16519..ddd36be073 100644 --- a/addons/common/functions/fnc_execNextFrame.sqf +++ b/addons/common/functions/fnc_execNextFrame.sqf @@ -14,21 +14,8 @@ PARAMS_2(_func,_params); -[ - { - EXPLODE_2_PVT(_this,_params,_pfhId); - EXPLODE_2_PVT(_params,_delayedExecParams,_startFrame); - EXPLODE_2_PVT(_delayedExecParams,_func,_funcParams); - - // Exit if we are still on the same frame - if (diag_frameno == _startFrame) exitWith {}; - - // Remove the PFH - [_pfhId] call cba_fnc_removePerFrameHandler; - - // Execute the function - _funcParams call _func; - }, - 0, - [_this, diag_frameno] -] call CBA_fnc_addPerFrameHandler +if (diag_frameno != GVAR(nextFrameNo)) then { + GVAR(nextFrameBufferA) pushBack [_params, _func]; +} else { + GVAR(nextFrameBufferB) pushBack [_params, _func]; +}; diff --git a/addons/common/functions/fnc_getDeathAnim.sqf b/addons/common/functions/fnc_getDeathAnim.sqf index 1e84224b0f..539c8d2616 100644 --- a/addons/common/functions/fnc_getDeathAnim.sqf +++ b/addons/common/functions/fnc_getDeathAnim.sqf @@ -1,6 +1,6 @@ /* * Author: Glowbal, PabstMirror - * Get the death animation for the unit at current time + * Get the death animation for the unit at current ACE_time * * Arguments: * 0: unit diff --git a/addons/common/functions/fnc_hashGet.sqf b/addons/common/functions/fnc_hashGet.sqf index dfcf84e443..6b47b98ad9 100644 --- a/addons/common/functions/fnc_hashGet.sqf +++ b/addons/common/functions/fnc_hashGet.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" private ["_val", "_index"]; -// diag_log text format["%1 HASH GET: %2", diag_tickTime, _this]; +// diag_log text format["%1 HASH GET: %2", ACE_diagTime, _this]; PARAMS_2(_hash,_key); diff --git a/addons/common/functions/fnc_hashHasKey.sqf b/addons/common/functions/fnc_hashHasKey.sqf index 83ddfe3877..8d31a6fcb4 100644 --- a/addons/common/functions/fnc_hashHasKey.sqf +++ b/addons/common/functions/fnc_hashHasKey.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" private ["_val", "_index"]; -// diag_log text format["%1 HASH HAS KEY: %2", diag_tickTime, _this]; +// diag_log text format["%1 HASH HAS KEY: %2", ACE_diagTime, _this]; PARAMS_2(_hash,_key); diff --git a/addons/common/functions/fnc_hashSet.sqf b/addons/common/functions/fnc_hashSet.sqf index d6c9948e7a..1b3bded6e9 100644 --- a/addons/common/functions/fnc_hashSet.sqf +++ b/addons/common/functions/fnc_hashSet.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" private ["_index"]; -// diag_log text format["%1 HASH SET: %2", diag_tickTime, _this]; +// diag_log text format["%1 HASH SET: %2", ACE_diagTime, _this]; PARAMS_3(_hash,_key,_val); diff --git a/addons/common/functions/fnc_isPlayer.sqf b/addons/common/functions/fnc_isPlayer.sqf index 772fae1746..91e54a51c1 100644 --- a/addons/common/functions/fnc_isPlayer.sqf +++ b/addons/common/functions/fnc_isPlayer.sqf @@ -1,15 +1,21 @@ /* - * Author: bux578, commy2 + * Author: bux578, commy2, akalegman * * Checks if a unit is a player / curator controlled unit. * Currently returns false for non-local remote controlled zeus units. (Remotes from another zeus machine) * * Arguments: * 0: unit to be checked (object) + * 1: exclude remote controlled units (boolean) * * Return Value: * Bool: is unit a player? */ #include "script_component.hpp" -isPlayer (_this select 0) || {_this select 0 == call FUNC(player)} +private ["_unit", "_excludeRemoteControlled"]; + +_unit = _this select 0; +_excludeRemoteControlled = if (count _this > 1) then {_this select 1} else {false}; + +isPlayer _unit || (!_excludeRemoteControlled && {_unit == call FUNC(player)}) diff --git a/addons/common/functions/fnc_moduleCheckPBOs.sqf b/addons/common/functions/fnc_moduleCheckPBOs.sqf index 05e1037028..9543b3a5c9 100644 --- a/addons/common/functions/fnc_moduleCheckPBOs.sqf +++ b/addons/common/functions/fnc_moduleCheckPBOs.sqf @@ -1,6 +1,5 @@ /* * Author: KoffeinFlummi - * * Initializes the check-PBOs module. * * Arguments: @@ -11,92 +10,14 @@ */ #include "script_component.hpp" -PARAMS_3(_logic,_units,_activated); +if !(isServer) exitWith {}; -private ["_mode", "_checkAll", "_whitelist"]; +PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; -_mode = parseNumber (_logic getVariable "Action"); -_checkAll = _logic getVariable ["CheckAll", false]; -_whitelist = call compile (_logic getVariable ["Whitelist", "[]"]); +[_logic, QGVAR(checkPBOsAction), "Action" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(checkPBOsCheckAll), "CheckAll" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(checkPBOsWhitelist), "Whitelist" ] call EFUNC(common,readSettingFromModule); -if (isNil "_whitelist") then { - _whitelist = []; -}; - -_whitelist = [_whitelist, {toLower _this}] call FUNC(map); - -ACE_Version_CheckAll = _checkAll; -ACE_Version_Whitelist = _whitelist; - -if (!isServer) then { - [_mode, _checkAll, _whitelist] spawn { - private ["_mode", "_checkAll", "_whitelist", "_missingAddon", "_missingAddonServer", "_oldVersionClient", "_oldVersionServer", "_text", "_error", "_rscLayer", "_ctrlHint"]; - _mode = _this select 0; - _checkAll = _this select 1; - _whitelist = _this select 2; - - waitUntil { - sleep 1; - !isNil "ACE_Version_ClientErrors" - }; - - _missingAddon = ACE_Version_ClientErrors select 0; - _missingAddonServer = ACE_Version_ClientErrors select 1; - _oldVersionClient = ACE_Version_ClientErrors select 2; - _oldVersionServer = ACE_Version_ClientErrors select 3; - - // Display error message. - if (_missingAddon || {_missingAddonServer} || {_oldVersionClient} || {_oldVersionServer}) then { - _text = "[ACE] Version mismatch:

"; - _error = format ["ACE version mismatch: %1: ", profileName]; - - if (_missingAddon) then { - _text = _text + "Detected missing addon on client
"; - _error = _error + "Missing file(s); "; - }; - if (_missingAddonServer) then { - _text = _text + "Detected missing addon on server
"; - _error = _error + "Additional file(s); "; - }; - if (_oldVersionClient) then { - _text = _text + "Detected old client version
"; - _error = _error + "Older version; "; - }; - if (_oldVersionServer) then { - _text = _text + "Detected old server version
"; - _error = _error + "Newer version; "; - }; - - //[_error, "{systemChat _this}"] call FUNC(execRemoteFnc); - diag_log text _error; - - _text = composeText [lineBreak, parseText format ["%1", _text]]; - - _rscLayer = "ACE_RscErrorHint" call BIS_fnc_rscLayer; - _rscLayer cutRsc ["ACE_RscErrorHint", "PLAIN", 0, true]; - - disableSerialization; - _ctrlHint = uiNamespace getVariable "ACE_ctrlErrorHint"; - _ctrlHint ctrlSetStructuredText _text; - - if (_mode == 0) then { - sleep 10; - _rscLayer cutFadeOut 0.2; - }; - - if (_mode == 2) then { - sleep 10; - waitUntil {alive player}; - [player] call FUNC(adminKick); - }; - }; - }; -}; - -diag_log text format ["[ACE]: Check-PBOs Module Initialized. Mode: %1.", _mode]; - -if (_checkAll) then { - 0 spawn COMPILE_FILE(scripts\Version\checkVersionNumber); -}; +diag_log text format ["[ACE]: Check-PBOs Module Initialized. Mode: %1.", GVAR(checkPBOsAction)]; diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index f7d927556c..adc1b8d4c3 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -5,7 +5,7 @@ * Finish/Failure/Conditional are all passed [_args, _elapsedTime, _totalTime, _errorCode] * * Argument: - * 0: NUMBER - Total Time (in game "time" seconds) + * 0: NUMBER - Total Time (in game "ACE_time" seconds) * 1: ARRAY - Arguments, passed to condition, fail and finish * 2: CODE or STRING - On Finish: Code called or STRING raised as event. * 3: CODE or STRING - On Failure: Code called or STRING raised as event. @@ -53,14 +53,14 @@ _perFrameFunction = { EXPLODE_8_PVT(_parameters,_args,_onFinish,_onFail,_condition,_player,_startTime,_totalTime,_exceptions); private ["_elapsedTime", "_errorCode"]; - _elapsedTime = time - _startTime; + _elapsedTime = ACE_time - _startTime; _errorCode = -1; // this does not check: target fell unconscious, target died, target moved inside vehicle / left vehicle, target moved outside of players range, target moves at all. if (isNull (uiNamespace getVariable [QGVAR(ctrlProgressBar), controlNull])) then { _errorCode = 1; } else { - if (ACE_player != _player) then { + if (ACE_player != _player || !alive _player) then { _errorCode = 2; } else { if (!([_args, _elapsedTime, _totalTime, _errorCode] call _condition)) then { @@ -105,4 +105,4 @@ _perFrameFunction = { }; }; -[_perFrameFunction, 0, [_args, _onFinish, _onFail, _condition, _player, time, _totalTime, _exceptions]] call CBA_fnc_addPerFrameHandler; +[_perFrameFunction, 0, [_args, _onFinish, _onFail, _condition, _player, ACE_time, _totalTime, _exceptions]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/common/functions/fnc_receiveRequest.sqf b/addons/common/functions/fnc_receiveRequest.sqf index e7857b9436..dc028724f6 100644 --- a/addons/common/functions/fnc_receiveRequest.sqf +++ b/addons/common/functions/fnc_receiveRequest.sqf @@ -41,7 +41,7 @@ GVAR(RECIEVE_REQUEST_ADD_ACTION_DECLINE) = _target addAction ["Decline", compile GVAR(RECIEVE_REQUEST_ID_KEY_BINDING) = _requestID; -GVAR(RECIEVE_REQUEST_TIME_OUT_SCRIPT) = [time, _target, _requestID] spawn { +GVAR(RECIEVE_REQUEST_TIME_OUT_SCRIPT) = [ACE_time, _target, _requestID] spawn { private["_id", "_t", "_requestID", "_target"]; _t = (_this select 0) + 40; _target = _this select 1; @@ -50,7 +50,7 @@ GVAR(RECIEVE_REQUEST_TIME_OUT_SCRIPT) = [time, _target, _requestID] spawn { waituntil { _id = _target getvariable _requestID; - (time > _t || isnil "_id")}; + (ACE_time > _t || isnil "_id")}; _target setvariable [_requestID, nil]; GVAR(RECIEVE_REQUEST_ID_KEY_BINDING) = nil; if (!isnil QGVAR(RECIEVE_REQUEST_ADD_ACTION_ACCEPT)) then { diff --git a/addons/common/functions/fnc_setVariablePublic.sqf b/addons/common/functions/fnc_setVariablePublic.sqf index 791be6ad9c..f5ab1920db 100644 --- a/addons/common/functions/fnc_setVariablePublic.sqf +++ b/addons/common/functions/fnc_setVariablePublic.sqf @@ -1,13 +1,13 @@ /* * Author: commy2 * - * Sets a public variable, but wait a certain amount of time to transfer the value over the network. Changing the value by calling this function again resets the windup timer. + * Sets a public variable, but wait a certain amount of ACE_time to transfer the value over the network. Changing the value by calling this function again resets the windup timer. * * Argument: * 0: Object the variable should be assigned to (Object) * 1: Name of the variable (String) * 2: Value of the variable (Any) - * 3: Windup time (Number, optional. Default: 1) + * 3: Windup ACE_time (Number, optional. Default: 1) * * Return value: * Nothing. @@ -38,12 +38,12 @@ if (_idName in _allIdNames) exitWith {}; // when to push the value private "_syncTime"; -_syncTime = diag_tickTime + _sync; +_syncTime = ACE_diagTime + _sync; // add eventhandler [_idName, "onEachFrame", { // wait to sync the variable - if (diag_tickTime > _this select 2) then { + if (ACE_diagTime > _this select 2) then { // set value public (_this select 0) setVariable [_this select 1, (_this select 0) getVariable (_this select 1), true]; diff --git a/addons/common/functions/fnc_syncedEventPFH.sqf b/addons/common/functions/fnc_syncedEventPFH.sqf index 12ce0b0141..a5ec809706 100644 --- a/addons/common/functions/fnc_syncedEventPFH.sqf +++ b/addons/common/functions/fnc_syncedEventPFH.sqf @@ -24,7 +24,7 @@ private["_data"]; if(typeName _globalEventTTL == "CODE") then { _ttlReturn = [(_data select 0),_eventEntry] call _globalEventTTL; } else { - _ttlReturn = call { _globalEventTTL < 1 || {diag_tickTime < (_eventEntry select 0) + _globalEventTTL} }; + _ttlReturn = call { _globalEventTTL < 1 || {ACE_diagTime < (_eventEntry select 0) + _globalEventTTL} }; }; if(_ttlReturn) then { @@ -35,7 +35,7 @@ private["_data"]; if(typeName _eventTTL == "CODE") then { _ttlReturn = [(_data select 0),_eventEntry] call _eventTTL; } else { - _ttlReturn = call { _eventTTL < 1 || {diag_tickTime < (_eventEntry select 0) + _eventTTL} }; + _ttlReturn = call { _eventTTL < 1 || {ACE_diagTime < (_eventEntry select 0) + _eventTTL} }; }; }; diff --git a/addons/common/functions/fnc_throttledPublicVariable.sqf b/addons/common/functions/fnc_throttledPublicVariable.sqf index 3fc5fb288b..e7966c3b4d 100644 --- a/addons/common/functions/fnc_throttledPublicVariable.sqf +++ b/addons/common/functions/fnc_throttledPublicVariable.sqf @@ -19,7 +19,7 @@ PARAMS_3(_unit,_varName,_maxDelay); -// Create the publish scheduler PFH the first time +// Create the publish scheduler PFH the first ACE_time if (isNil QGVAR(publishSchedId)) then { GVAR(publishVarNames) = []; @@ -27,7 +27,7 @@ if (isNil QGVAR(publishSchedId)) then { GVAR(publishSchedId) = [{ - if (diag_tickTime > GVAR(publishNextTime)) then { + if (ACE_diagTime > GVAR(publishNextTime)) then { { EXPLODE_2_PVT(_x,_unit,_varName); _unit setVariable [_varName, (_unit getVariable _varName), true]; @@ -42,8 +42,8 @@ if (isNil QGVAR(publishSchedId)) then { // If the variable is not on the list if (GVAR(publishVarNames) find [_unit,_varName] == -1) exitWith { GVAR(publishVarNames) pushBack [_unit,_varName]; - GVAR(publishNextTime) = GVAR(publishNextTime) min (diag_tickTime + _maxDelay); + GVAR(publishNextTime) = GVAR(publishNextTime) min (ACE_diagTime + _maxDelay); }; // If the variable is on the list -GVAR(publishNextTime) = GVAR(publishNextTime) min (diag_tickTime + _maxDelay); \ No newline at end of file +GVAR(publishNextTime) = GVAR(publishNextTime) min (ACE_diagTime + _maxDelay); \ No newline at end of file diff --git a/addons/common/functions/fnc_timePFH.sqf b/addons/common/functions/fnc_timePFH.sqf index 6385c4d05e..40fef519a8 100644 --- a/addons/common/functions/fnc_timePFH.sqf +++ b/addons/common/functions/fnc_timePFH.sqf @@ -1,25 +1,26 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" -private["_lastRealTime", "_lastGameTime", "_delta"]; +private["_lastTickTime", "_lastGameTime", "_delta"]; -_lastRealTime = ACE_realTime; +_lastTickTime = ACE_diagTime; _lastGameTime = ACE_gameTime; ACE_gameTime = time; ACE_diagTime = diag_tickTime; -_delta = ACE_diagTime - _lastRealTime; +_delta = ACE_diagTime - _lastTickTime; if(ACE_gameTime <= _lastGameTime) then { + TRACE_1("paused",_delta); ACE_paused = true; // Game is paused or not running ACE_pausedTime = ACE_pausedTime + _delta; ACE_virtualPausedTime = ACE_pausedTime + (_delta * accTime); } else { + TRACE_1("live",_delta); ACE_paused = false; // Time is updating ACE_realTime = ACE_realTime + _delta; ACE_virtualTime = ACE_virtualTime + (_delta * accTime); ACE_time = ACE_virtualTime; }; - diff --git a/addons/common/functions/fnc_unloadPerson.sqf b/addons/common/functions/fnc_unloadPerson.sqf index 4db16a50a8..cd421fd3e5 100644 --- a/addons/common/functions/fnc_unloadPerson.sqf +++ b/addons/common/functions/fnc_unloadPerson.sqf @@ -10,12 +10,12 @@ * * Public: No */ - +//#define DEBUG_MODE_FULL #include "script_component.hpp" #define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson)) -private ["_vehicle", "_loaded", "_emptyPos"]; +private ["_vehicle","_emptyPos"]; PARAMS_1(_unit); _vehicle = vehicle _unit; @@ -25,20 +25,8 @@ if !(speed _vehicle <1 && (((getpos _vehicle) select 2) < 2)) exitwith {false;}; _emptyPos = ((getPos _vehicle) findEmptyPosition [0, 10, typeof _unit]); if (count _emptyPos == 0) exitwith {false}; -_unit setPos _emptyPos; -unassignVehicle _unit; -if (!alive _unit) then { - _unit action ["Eject", vehicle _unit]; -}; - -[_unit, false, GROUP_SWITCH_ID, side group _unit] call FUNC(switchToGroupSide); - -_loaded = _vehicle getvariable [QGVAR(loaded_persons),[]]; -_loaded = _loaded - [_unit]; -_vehicle setvariable [QGVAR(loaded_persons),_loaded,true]; - -if (!([_unit] call FUNC(isAwake))) then { - [_unit,([_unit] call FUNC(getDeathAnim)), 1, true] call FUNC(doAnimation); +if (!isNull _vehicle) then { + [[_unit], QUOTE(FUNC(unloadPersonLocal)), _unit, false] call EFUNC(common,execRemoteFnc); }; true; diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf new file mode 100644 index 0000000000..23d33e4bfe --- /dev/null +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -0,0 +1,60 @@ +/* + * Author: ViperMaul + * Unload a person from a vehicle, local + * + * Arguments: + * 0: unit + * + * Return Value: + * Returns true if succesfully unloaded person + * + * Public: No + */ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson)) + +private ["_loaded", "_emptyPos"]; +PARAMS_2(_unit,_vehicle); + +if (driver _vehicle == _unit) exitwith {TRACE_1("Exiting on Failed Driver Check", driver _vehicle == _unit); false;}; +TRACE_1("Vehicle Check", driver _vehicle == _unit); +if !(speed _vehicle <1 && (((getPos _vehicle) select 2) < 2)) exitwith {TRACE_1("Exiting on Failed speed check", getPosASL _vehicle == _unit); false;}; +TRACE_1("getPosASL Vehicle Check", getPos _vehicle); + +_emptyPos = ((getPosASL _vehicle) call EFUNC(common,ASLtoPosition) findEmptyPosition [0, 13, typeof _unit]); +if (count _emptyPos == 0) exitwith {false}; //consider displaying text saying there are no safe places to exit the vehicle + +unassignVehicle _unit; +[_unit] orderGetIn false; +TRACE_1("Ejecting", alive _unit); +_unit action ["Eject", vehicle _unit]; +[ { + private "_anim"; + PARAMS_2(_unit,_emptyPos); + _unit setPosASL (_emptyPos call EFUNC(common,PositiontoASL)); + if (!([_unit] call FUNC(isAwake))) then { + TRACE_1("Check if isAwake", [_unit] call FUNC(isAwake)); + if (driver _unit == _unit) then { + _anim = [_unit] call EFUNC(common,getDeathAnim); + [_unit, _anim, 1, true] call EFUNC(common,doAnimation); + [{ + _unit = _this select 0; + _anim = _this select 1; + if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { + [_unit, _anim, 2, true] call EFUNC(common,doAnimation); + }; + }, [_unit, _anim], 0.5, 0] call EFUNC(common,waitAndExecute); + }; + }; +},[_unit,_emptyPos], 0.5, 0] call EFUNC(common,waitAndExecute); + + +[_unit, false, GROUP_SWITCH_ID, side group _unit] call FUNC(switchToGroupSide); + +_loaded = _vehicle getvariable [QGVAR(loaded_persons),[]]; +_loaded = _loaded - [_unit]; +_vehicle setvariable [QGVAR(loaded_persons),_loaded,true]; + +true \ No newline at end of file diff --git a/addons/common/functions/fnc_waitAndExecute.sqf b/addons/common/functions/fnc_waitAndExecute.sqf index 41301f0f29..977e4f146d 100644 --- a/addons/common/functions/fnc_waitAndExecute.sqf +++ b/addons/common/functions/fnc_waitAndExecute.sqf @@ -1,36 +1,24 @@ /* * Author: esteldunedain * - * Executes a code once with a given game time delay, using a PFH + * Executes a code once with a given game ACE_time delay, using a PFH * * Argument: * 0: Code to execute (Code) * 1: Parameters to run the code with (Array) * 2: Delay in seconds before executing the code (Number) - * 3: Interval of time in which the execution is evaluated, 0 means every frame (Number) * * Return value: - * PFH handler ID + * None + * + * Example: + * [{(_this select 0) setVelocity [0,0,200];}, [player], 10] call ace_common_fnc_waitAndExecute + * + * Public: No */ #include "script_component.hpp" -PARAMS_4(_func,_params,_delay,_interval); +PARAMS_3(_func,_params,_delay); -[ - { - EXPLODE_2_PVT(_this,_params,_pfhId); - EXPLODE_2_PVT(_params,_delayedExecParams,_startTime); - EXPLODE_3_PVT(_delayedExecParams,_func,_funcParams,_delay); - - // Exit if the time was not reached yet - if (time < _startTime + _delay) exitWith {}; - - // Remove the PFH - [_pfhId] call cba_fnc_removePerFrameHandler; - - // Execute the function - _funcParams call _func; - }, - _interval, - [_this, time] -] call CBA_fnc_addPerFrameHandler +GVAR(waitAndExecArray) pushBack [(ACE_time + _delay), _func, _params]; +GVAR(waitAndExecArray) sort true; diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 1b960de982..353f3dea5e 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -39,7 +39,7 @@ ACE Options - ACE Optionen + ACE-Optionen Opciones ACE Ustawienia ACE Nastavení ACE @@ -473,54 +473,121 @@ Check PBOs Sprawdzaj PBO + Comprobar PBOs + Überprüfe PBOs + Zkontrolovat PBO + Verificar PBOs Sprawdzaj spójność addonów z serwerem + Este módulo verifica la integridad de los addons con los que iniciamos el simulador + Dieses Modul überprüft ob jeder Spieler die richtigen PBO-Dateien hat. + Zjistit addon který je v souladu se serverem + Este módulo verifica a integridade dos addons quando iniciamos a simulação Action Akcja + Acción + Aktion + Akce + Ação What to do with people who do not have the right PBOs? Co zrobić z graczami, którzy nie mają właściwych PBO? + ¿Qué hacer con la gente que no tiene correctamente los PBOs? + Was soll mit Leuten passieren, die nicht die richtigen PBOs haben? + Co udělat s lidmi, co nemají správné addony? + O que fazer com pessoas que não tem os PBOs corretos? Warn once Ostrzeż raz + Avisar una vez + Einmal verwarnen + Upozornit jednou + Avisar uma vez Warn (permanent) Ostrzeżenie (permanentne) + Avisar (permanente) + Immer verwarnen + Upozornit (permanentně) + Avisar (permanente) Kick Kick + Expulsar + Kicken + Vyhodit + Chutar Check all addons Sprawdź wsz. addony + Comprobar todos los addons + Alle Addons überprüfen + Zkontrolovat všechny addony + Verificar todos addons Check all addons instead of only those of ACE? Sprawdzaj wszystkie addony czy tylko te z ACE? + Comprobar todos los addons en vez de solo los del ACE + Alle Addons anstatt nur ACE überprüfen? + Zkontrolovat všechny addony namísto jen těch od ACE? + Verificar todos addons invés de só os do ACE? Whitelist Biała lista + Lista blanca + Whitelist + Seznam povolených + Lista branca What addons are allowed regardless? Jakie addony są dozwolone? + Qué addons están permitidos igualmente + Welche Addons werden dennoch erlaubt? + Jaké addony jsou povoleny? + Quais addons são permitidos de qualquer maneira? LSD Vehicles Pojazdy LSD + Vehículos LSD + LSD-Fahrzeuge + LSD vozidla + Veículos LSD Adds LSD effect to synchronized vehicle Dodaje efekt LSD pod zsynchronizowany pojazd + Añade el efecto LSD al vehículo sincronizado + Fügt einen LSD-Effekt zum synchronisierten Fahrzeug hinzu + Přidá LSD efekt pro synchronizované vozidla + Adiciona efeito LSD ao veículo sincronizado + + + Toggle Handheld Device + Seleccionar dispositivo de mano + Ativa dispositivo de mão + + + Close Handheld Device + Cerrar dispositivo de mano + Fecha dispositivo de mão + + + Cycle Handheld Devices + Cambiar dispositivos de mano + Troca dispositivos de mão - + \ No newline at end of file diff --git a/addons/concertina_wire/$PBOPREFIX$ b/addons/concertina_wire/$PBOPREFIX$ new file mode 100644 index 0000000000..0ca718ad15 --- /dev/null +++ b/addons/concertina_wire/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\concertina_wire \ No newline at end of file diff --git a/addons/concertina_wire/CfgEventHandlers.hpp b/addons/concertina_wire/CfgEventHandlers.hpp new file mode 100644 index 0000000000..026afb4e2d --- /dev/null +++ b/addons/concertina_wire/CfgEventHandlers.hpp @@ -0,0 +1,44 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; + +class Extended_Killed_EventHandlers { + // TODO: Probably needs handledamage eh for better tracking what killed the wire + // Also disallow wire becoming destroyed by small explosives e.g. 40mm + class ACE_ConcertinaWire { + class ADDON { + killed = QUOTE(call FUNC(handleKilled)); + }; + }; + class Land_Razorwire_F { + class ADDON { + killed = QUOTE(call FUNC(handleKilled)); + }; + }; +}; + +class Extended_Init_EventHandlers { + class ACE_ConcertinaWireCoil { + class ADDON { + init = QUOTE(_this call DEFUNC(dragging,initObject)); + }; + }; + class ACE_ConcertinaWire { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_init)); + }; + }; + class Land_Razorwire_F { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_init)); + }; + }; +}; diff --git a/addons/concertina_wire/CfgVehicles.hpp b/addons/concertina_wire/CfgVehicles.hpp new file mode 100644 index 0000000000..2592bf5b77 --- /dev/null +++ b/addons/concertina_wire/CfgVehicles.hpp @@ -0,0 +1,139 @@ + +class CfgVehicles { + class Fence; + class thingX; + class NonStrategic; + + class ACE_ConcertinaWireNoGeo: Fence { + XEH_ENABLED; + scope = 1; + displayName = ""; + model = PATHTOF(data\ACE_ConcertinaWireNoGeo.p3d); + destrType = "DestructTent"; + accuracy = 0.3; + mapSize = 2.8; + animated = 1; + autocenter = 0; + armor = 200; + class AnimationSources { + class fix1 { + source = "user"; + animPeriod = 1e-007; + initPhase = 0; + }; + class fix2: fix1 {}; + class fix3: fix1 {}; + class fix4: fix1 {}; + class rotate { + source = "user"; + animPeriod = 1e-007; + }; + class wire_2 { + source = "user"; + animPeriod = 1e-007; + }; + class wire_3: wire_2{}; + class wire_4: wire_2{}; + class wire_5: wire_2{}; + class wire_6: wire_2{}; + class wire_7: wire_2{}; + class wire_8: wire_2{}; + class wire_9: wire_2{}; + class wire_10: wire_2{}; + class wire_11: wire_2{}; + class wire_12: wire_2{}; + class wire_13: wire_2{}; + class wire_14: wire_2{}; + class wire_15: wire_2{}; + class wire_16: wire_2{}; + class wire_17: wire_2{}; + class wire_18: wire_2{}; + + class wire_2_1: wire_2 { + animPeriod = 8; + }; + class wire_3_1: wire_2_1 {}; + class wire_4_1: wire_2_1 {}; + class wire_5_1: wire_2_1 {}; + class wire_6_1: wire_2_1 {}; + class wire_7_1: wire_2_1 {}; + class wire_8_1: wire_2_1 {}; + class wire_9_1: wire_2_1 {}; + class wire_10_1: wire_2_1 {}; + class wire_11_1: wire_2_1 {}; + class wire_12_1: wire_2_1 {}; + class wire_13_1: wire_2_1 {}; + class wire_14_1: wire_2_1 {}; + class wire_15_1: wire_2_1 {}; + class wire_16_1: wire_2_1 {}; + class wire_17_1: wire_2_1 {}; + class wire_18_1: wire_2_1 {}; + }; + }; + class ACE_ConcertinaWire: ACE_ConcertinaWireNoGeo { + scope = 2; + displayName = $STR_ACE_CONCERTINA_WIRE; + model = PATHTOF(data\ACE_ConcertinaWire.p3d); + class ACE_Actions { + class ACE_MainActions { + selection = ""; + distance = 5; + condition = "true"; + class ACE_Dismount { + selection = ""; + displayName = "$STR_ACE_UNROLLWIRE"; + distance = 5; + condition = "true"; + statement = QUOTE([ARR_2(_target,_player)] call FUNC(dismount)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + icon = PATHTOF(UI\icon_sandbag_ca.paa); + }; + }; + }; + }; + class ACE_ConcertinaWireCoil: thingX { + XEH_ENABLED; + scope = 2; + displayName = $STR_ACE_CONCERTINA_WIRECOIL; + model = PATHTOF(data\ACE_ConcertinaWireCoil.p3d); + mapsize = 0.5; + animated = 0; + nameSound = "fence"; + typicalCargo[] = {}; + transportAmmo = 0; + transportRepair = 0; + transportFuel = 0; + cost = 0; + armor = 1000; + destrType = "DestructNo"; + accuracy = 1000; + autocenter = 0; + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition[]) = {0,0.5,0.5}; + EGVAR(dragging,dragDirection) = 0; + class ACE_Actions { + class ACE_MainActions { + selection = ""; + distance = 4; + condition = "true"; + class ACE_Deploy { + selection = ""; + displayName = "$STR_ACE_ROLLWIRE"; + distance = 4; + condition = "true"; + statement = QUOTE([ARR_2(_target,_player)] call FUNC(deploy)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + icon = PATHTOF(UI\icon_sandbag_ca.paa); + }; + }; + }; + }; + + class Land_Razorwire_F: NonStrategic { + XEH_ENABLED; + }; +}; diff --git a/addons/concertina_wire/README.md b/addons/concertina_wire/README.md new file mode 100644 index 0000000000..ab62458de9 --- /dev/null +++ b/addons/concertina_wire/README.md @@ -0,0 +1,10 @@ +ace_concertina_wire +=============== + +Adds concertina wire. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/concertina_wire/UI/icon_sandbag_ca.paa b/addons/concertina_wire/UI/icon_sandbag_ca.paa new file mode 100644 index 0000000000..5d6ea6d4d9 Binary files /dev/null and b/addons/concertina_wire/UI/icon_sandbag_ca.paa differ diff --git a/addons/concertina_wire/XEH_init.sqf b/addons/concertina_wire/XEH_init.sqf new file mode 100644 index 0000000000..dbce4a9b92 --- /dev/null +++ b/addons/concertina_wire/XEH_init.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" + +PARAMS_1(_wire); +_wire addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; \ No newline at end of file diff --git a/addons/concertina_wire/XEH_postInit.sqf b/addons/concertina_wire/XEH_postInit.sqf new file mode 100644 index 0000000000..ff3b5c5167 --- /dev/null +++ b/addons/concertina_wire/XEH_postInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +GVAR(placer) = objNull; +GVAR(deployPFH) = -1; + +// Deploy concertina wire if interact menu is opened +["interactMenuOpened", { + if (GVAR(deployPFH) != -1) then { + GVAR(placer) setVariable [QGVAR(wireDeployed), true]; + }; +}] call EFUNC(common,addEventHandler); diff --git a/addons/concertina_wire/XEH_preInit.sqf b/addons/concertina_wire/XEH_preInit.sqf new file mode 100644 index 0000000000..f15feb48bd --- /dev/null +++ b/addons/concertina_wire/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(deploy); +PREP(dismount); +PREP(dismountSuccess); +PREP(handleDamage); +PREP(handleKilled); + +ADDON = true; diff --git a/addons/concertina_wire/config.cpp b/addons/concertina_wire/config.cpp new file mode 100644 index 0000000000..06b7bf5d86 --- /dev/null +++ b/addons/concertina_wire/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_ConcertinaWire", "ACE_ConcertinaWireNoGeo", "ACE_ConcertinaWireCoil"}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_apl", "ace_interaction"}; + author[] = {"Rocko", "Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" \ No newline at end of file diff --git a/addons/concertina_wire/data/ACE_ConcertinaWire.p3d b/addons/concertina_wire/data/ACE_ConcertinaWire.p3d new file mode 100644 index 0000000000..3e1c9c881c Binary files /dev/null and b/addons/concertina_wire/data/ACE_ConcertinaWire.p3d differ diff --git a/addons/concertina_wire/data/ACE_ConcertinaWireCoil.p3d b/addons/concertina_wire/data/ACE_ConcertinaWireCoil.p3d new file mode 100644 index 0000000000..24f6ebf0fe Binary files /dev/null and b/addons/concertina_wire/data/ACE_ConcertinaWireCoil.p3d differ diff --git a/addons/concertina_wire/data/ACE_ConcertinaWireNoGeo.p3d b/addons/concertina_wire/data/ACE_ConcertinaWireNoGeo.p3d new file mode 100644 index 0000000000..3af6a40a15 Binary files /dev/null and b/addons/concertina_wire/data/ACE_ConcertinaWireNoGeo.p3d differ diff --git a/addons/concertina_wire/data/model.cfg b/addons/concertina_wire/data/model.cfg new file mode 100644 index 0000000000..20845cfacb --- /dev/null +++ b/addons/concertina_wire/data/model.cfg @@ -0,0 +1,290 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + class ACE_SB_Skeleton: Default {}; + class ACE_ConcertinaSkeleton { + isDiscrete = 0; + skeletonInherit = ""; + skeletonBones[] = { + "1","", + "2","1", + "3","2", + "4","3", + "5","4", + "6","5", + "7","6", + "8","7", + "9","8", + "10","9", + "11","10", + "12","11", + "13","12", + "14","13", + "15","14", + "16","15", + "17","16", + "18","17", + "fix1","", + "fix2","", + "fix3","", + "fix4","" + }; + }; + class ace_tacticalladder_skeleton: Default { + isDiscrete = 0; + skeletonInherit = ""; + skeletonBones[] = { + "base","", + "1","base", + "2","1", + "3","2", + "4","3", + "5","4", + "6","5", + "7","6", + "8","7", + "9","8", + "10","9", + "11","10", + "step","11" + }; + }; +}; + +class CfgModels { + class Default { + sectionsInherit=""; + sections[] = {""}; + skeletonName = ""; + }; + class ace_sandbag_build { + sectionsInherit = "Default"; + sections[] = {"zbytek"}; + skeletonName = "ACE_SB_Skeleton"; + }; + class ACE_ConcertinaWire { + skeletonName = "ACE_ConcertinaSkeleton"; + sections[] = {}; + sectionsInherit = ""; + class Animations { + class fix1 { + type="hide"; + source="user"; + selection="fix1"; + minValue = 0; + maxValue = 1; + minPhase = 0; + maxPhase = 1; + hideValue = 1; + }; + class fix2: fix1 { + selection="fix2"; + }; + class fix3: fix1 { + selection="fix3"; + }; + class fix4: fix1 { + selection="fix4"; + }; + class rotate { + type = "rotation"; + source = ""; + sourceAddress = "loop"; + selection = "1"; + axis = "rotate_axis"; + minValue = 0; + maxValue = 360; + + angle0="rad -360"; + angle1="rad +360"; + }; + class wire_2 { + type = "translation"; + source = ""; + selection = "2"; + axis = "2_axis"; + animPeriod = 0; + minValue = 0; + maxValue = 1; + minPhase = 0; + maxPhase = 1; + offset0 = 0; + offset1 = -1; + }; + class wire_3: wire_2 { + selection = "3"; axis = "3_axis"; + }; + class wire_4: wire_2 { + selection = "4"; axis = "4_axis"; + }; + class wire_5: wire_2 { + selection = "5"; axis = "5_axis"; + }; + class wire_6: wire_2 { + selection = "6"; axis = "6_axis"; + }; + class wire_7: wire_2 { + selection = "7"; axis = "7_axis"; + }; + class wire_8: wire_2 { + selection = "8"; axis = "8_axis"; + }; + class wire_9: wire_2 { + selection = "9"; axis = "9_axis"; + }; + class wire_10: wire_2 { + selection = "10"; axis = "10_axis"; + }; + class wire_11: wire_2 { + selection = "11"; axis = "11_axis"; + }; + class wire_12: wire_2 { + selection = "12"; axis = "12_axis"; + }; + class wire_13: wire_2 { + selection = "13"; axis = "13_axis"; + }; + class wire_14: wire_2 { + selection = "14"; axis = "14_axis"; + }; + class wire_15: wire_2 { + selection = "15"; axis = "15_axis"; + }; + class wire_16: wire_2 { + selection = "16"; axis = "16_axis"; + }; + class wire_17: wire_2 { + selection = "17"; axis = "17_axis"; + }; + class wire_18: wire_2 { + selection = "18"; axis = "18_axis"; + }; + class wire_2_1: wire_2 { + selection = "2";axis = "2_axis";offset1 = -1; + }; + class wire_3_1: wire_2_1 { + selection = "3"; axis = "3_axis"; + }; + class wire_4_1: wire_2_1 { + selection = "4"; axis = "4_axis"; + }; + class wire_5_1: wire_2_1 { + selection = "5"; axis = "5_axis"; + }; + class wire_6_1: wire_2_1 { + selection = "6"; axis = "6_axis"; + }; + class wire_7_1: wire_2_1 { + selection = "7"; axis = "7_axis"; + }; + class wire_8_1: wire_2_1 { + selection = "8"; axis = "8_axis"; + }; + class wire_9_1: wire_2_1 { + selection = "9"; axis = "9_axis"; + }; + class wire_10_1: wire_2_1 { + selection = "10"; axis = "10_axis"; + }; + class wire_11_1: wire_2_1 { + selection = "11"; axis = "11_axis"; + }; + class wire_12_1: wire_2_1 { + selection = "12"; axis = "12_axis"; + }; + class wire_13_1: wire_2_1 { + selection = "13"; axis = "13_axis"; + }; + class wire_14_1: wire_2_1 { + selection = "14"; axis = "14_axis"; + }; + class wire_15_1: wire_2_1 { + selection = "15"; axis = "15_axis"; + }; + class wire_16_1: wire_2_1 { + selection = "16"; axis = "16_axis"; + }; + class wire_17_1: wire_2_1 { + selection = "17"; axis = "17_axis"; + }; + class wire_18_1: wire_2_1 { + selection = "18"; axis = "18_axis"; + }; + }; + }; + class ACE_ConcertinaWireNoGeo: ACE_ConcertinaWire {}; + class ace_tacticalladder { + skeletonName = "ace_tacticalladder_skeleton"; + sections[] = { "roadway" }; + sectionsInherit = ""; + class Animations { + class rotate { + type = "rotation"; + source = ""; + sourceAddress = "clamp"; + selection = "base"; + axis = "axis_rotate"; + minValue = 0; + maxValue = 90; + angle0="rad 0"; + angle1="rad +90"; + }; + class extract_1 { + type = "translation"; + source = ""; + selection = "1"; + axis = "axis_1"; + animPeriod = 0; + minValue = 0; + maxValue = 1; + minPhase = 0; + maxPhase = 1; + offset0 = 0; + offset1 = 0.82; + }; + class extract_2: extract_1 { + selection = "2"; + axis = "axis_2"; + }; + class extract_3: extract_1 { + selection = "3"; + axis = "axis_3"; + }; + class extract_4: extract_1 { + selection = "4"; + axis = "axis_4"; + }; + class extract_5: extract_1 { + selection = "5"; + axis = "axis_5"; + }; + class extract_6: extract_1 { + selection = "6"; + axis = "axis_6"; + }; + class extract_7: extract_1 { + selection = "7"; + axis = "axis_7"; + }; + class extract_8: extract_1 { + selection = "8"; + axis = "axis_8"; + }; + class extract_9: extract_1 { + selection = "9"; + axis = "axis_9"; + }; + class extract_10: extract_1 { + selection = "10"; + axis = "axis_10"; + }; + class extract_11: extract_1 { + selection = "11"; + axis = "axis_11"; + }; + }; + }; +}; diff --git a/addons/concertina_wire/functions/fnc_deploy.sqf b/addons/concertina_wire/functions/fnc_deploy.sqf new file mode 100644 index 0000000000..c30e767266 --- /dev/null +++ b/addons/concertina_wire/functions/fnc_deploy.sqf @@ -0,0 +1,84 @@ +/* + * Author: Rocko, Ruthberg + * + * Deploys the concertina wire + * + * Arguments: + * 0: wire coil + * 1: unit + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_2(_wirecoil,_unit); + +private ["_wireNoGeo", "_dir", "_pos", "_wireNoGeoPos"]; + +_wireNoGeo = "ACE_ConcertinaWireNoGeo" createVehicle [0,0,0]; +{ + _wireNoGeo animate [_x, 1]; +} foreach WIRE_FAST; + +GVAR(placer) = _unit; +_dir = getDir _unit; +_pos = getPosASL _unit; +_wireNoGeoPos = _pos vectorAdd [1.1 * sin(_dir), 1.1 * cos(_dir), 0]; + +_wireNoGeo setDir _dir; +_wireNoGeo setPosASL _wireNoGeoPos; + +deleteVehicle _wirecoil; + +_unit setVariable [QGVAR(wireDeployed), false]; + +GVAR(deployPFH) = [{ + EXPLODE_4_PVT(_this select 0,_wireNoGeo,_wireNoGeoPos,_unit,_action); + + private ["_range", "_posStart", "_posEnd", "_dirVect", "_dir", "_anim", "_wire"]; + _posStart = (_wireNoGeo modelToWorldVisual (_wireNoGeo selectionPosition "start")) call EFUNC(common,positionToASL); + _posEnd = (getPosASL _unit) vectorAdd (vectorDir _unit); + _dirVect = _posStart vectorDiff _posEnd; + _dir = _dirVect call CBA_fnc_vectDir; + _range = vectorMagnitude _dirVect; + _anim = 0 max (1 - (_range / 12)); + + if (!(alive _unit) || _range >= 12 || (_unit getVariable [QGVAR(wireDeployed), false])) exitWith { + _wire = "ACE_ConcertinaWire" createvehicle [0, 0, 0]; + { + _wire animate [_x, _anim]; + } foreach WIRE_FAST; + + [{ + EXPLODE_5_PVT(_this select 0,_wireNoGeo,_wire,_anim,_dir,_wireNoGeoPos); + if (_wire animationPhase "wire_2" == _anim) then { + deleteVehicle _wireNoGeo; + _wire setDir _dir; + _wire setPosASL _wireNoGeoPos; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + }, 0, [_wireNoGeo, _wire, _anim, _dir, _wireNoGeoPos]] call CBA_fnc_addPerFrameHandler; + + [_unit, "DefaultAction", _unit getVariable [QGVAR(Deploy), -1]] call EFUNC(Common,removeActionEventHandler); + call EFUNC(interaction,hideMouseHint); + + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + + _wireNoGeo setDir _dir; + { + _wireNoGeo animate [_x, _anim]; + } foreach WIRE_FAST; +}, 0, [_wireNoGeo, _wireNoGeoPos, _unit, _action]] call CBA_fnc_addPerFrameHandler; + +[localize "STR_ACE_ROLLWIRE", "", ""] call EFUNC(interaction,showMouseHint); + +GVAR(placer) setVariable [QGVAR(Deploy), + [GVAR(placer), "DefaultAction", + {GVAR(deployPFH) != -1}, + {GVAR(placer) setVariable [QGVAR(wireDeployed), true]} +] call EFUNC(common,AddActionEventHandler)]; diff --git a/addons/concertina_wire/functions/fnc_dismount.sqf b/addons/concertina_wire/functions/fnc_dismount.sqf new file mode 100644 index 0000000000..c9a5d1f9ff --- /dev/null +++ b/addons/concertina_wire/functions/fnc_dismount.sqf @@ -0,0 +1,41 @@ +/* + * Author: Ruthberg + * + * Start dismounting the concertina wire + * + * Arguments: + * 0: wire + * 1: unit + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +// If the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine +if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith { + [{ + _this call FUNC(dismount); + }, _this] call EFUNC(common,execNextFrame); +}; + +PARAMS_2(_wire,_unit); + +private ["_config", "_delay"]; +_config = (configFile >> "CfgVehicles" >> typeOf _unit); +_delay = if (getNumber(_config >> "engineer") == 1 || getNumber(_config >> "canDeactivateMines") == 1) then {60} else {120}; + +// TODO: Animation? + +[ + _delay, + [_wire], + {(_this select 0) call FUNC(dismountSuccess)}, + {}, + localize "STR_ACE_UNROLLWIRE", + {true}, + ["isnotinside"] +] call EFUNC(common,progressBar); diff --git a/addons/concertina_wire/functions/fnc_dismountSuccess.sqf b/addons/concertina_wire/functions/fnc_dismountSuccess.sqf new file mode 100644 index 0000000000..a6e34fe44f --- /dev/null +++ b/addons/concertina_wire/functions/fnc_dismountSuccess.sqf @@ -0,0 +1,42 @@ +/* + * Author: Rocko, Ruthberg + * + * Dismounts the concertina wire + * + * Arguments: + * 0: wire + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_1(_wire); + +{ + _wire animate [_x, 1]; +} foreach WIRE_FAST; + +[{ + EXPLODE_1_PVT(_this select 0,_wire); + + if (_wire animationPhase "wire_2" == 1) then { + private ["_dir", "_pos", "_wirecoil"]; + + _dir = getDir _wire; + _pos = getPosASL _wire; + + _wirecoil = "ACE_ConcertinaWireCoil" createvehicle [0, 0, 0]; + + deleteVehicle _wire; + + _wirecoil setDir _dir; + _wirecoil setPosASL _pos; + _wirecoil setVelocity [0, 0, 0]; + + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; +}, 0, [_wire]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/concertina_wire/functions/fnc_handleDamage.sqf b/addons/concertina_wire/functions/fnc_handleDamage.sqf new file mode 100644 index 0000000000..61cd1c4e7c --- /dev/null +++ b/addons/concertina_wire/functions/fnc_handleDamage.sqf @@ -0,0 +1,29 @@ +/* + * Author: Ruthberg + * + * Handles wire damage + * + * Arguments: + * 0: wire + * 1: selectionName + * 2: damage + * 3: source + * 4: projectile + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_5(_wire,_selectionName,_damage,_source,_projectile); + +if (_damage < 0.5) exitWith { 0 }; + +if (!(isNull _source)) then { + _wire setVariable [QGVAR(lastDamager), _source]; +}; + +_damage diff --git a/addons/concertina_wire/functions/fnc_handleKilled.sqf b/addons/concertina_wire/functions/fnc_handleKilled.sqf new file mode 100644 index 0000000000..2d2cd7f789 --- /dev/null +++ b/addons/concertina_wire/functions/fnc_handleKilled.sqf @@ -0,0 +1,135 @@ +/* + * Author: Rocko + * + * Handles wire and vehicle damage + * + * Arguments: + * 0: wire + * 1: killer (vehicle) + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_2(_wire,_killer); + +if (isNull _killer) then { + _killer = _wire getVariable ["ace_concertina_wire_lastDamager", objNull]; + if (isNull _killer) then { + _killer = nearestObject [_wire, "car"]; + }; +}; +if (isNull _killer || {_killer == _wire} || {_killer == gunner (vehicle _killer)}) exitWith {}; + +private ["_type", "_mode", "_distance", "_anim", "_parts", "_selectionPart", "_selection", "_pos_w", "_dir_w", "_vehicle"]; +_type = typeOf _wire; +_mode = switch (_type) do { + case "ACE_ConcertinaWire": { 0 }; + case "Land_Razorwire_F": { 1 }; + default { -1 }; +}; + +if (_mode == -1) exitWith {}; + +// _mode = 0 = Single Coil +// _mode = 1 = Triple Coil + +// -------------------------------- +// L M R +// 4.54929 (4) +// 6.13564 (6) +//9.78744 (10) + +_distance = _wire distance _killer; +if (_distance > 14 || {_distance < 2}) exitWith {}; // Fix if shooting wire + +_type = typeOf _wire; +_anim = _wire animationPhase "wire_2"; +_pos_w = getPos _wire; +_dir_w = getDir _wire; +_vehicle = vehicle _killer; + +if (_mode == 0) then { + private ["_x", "_y", "_found", "_wireCheckPosAr", "_no"]; + _x = _pos_w select 0; + _y = _pos_w select 1; + // Check if two Single coils are placed next to each other (i.e playes have built a big wire obstacle) + _wireCheckPosAr = [ + [_x + (sin (_dir_w+90) * 1.5),_y + (cos (_dir_w+90) * 1.5)], + [(_x-(sin _dir_w)) + (sin (_dir_w+90) * 1.5),(_y-(cos _dir_w)) + (cos (_dir_w+90) * 1.5)], + [_x + (sin (_dir_w-90) * 1.5),_y + (cos (_dir_w-90) * 1.5)], + [(_x-(sin _dir_w)) + (sin (_dir_w-90) * 1.5),(_y-(cos _dir_w)) + (cos (_dir_w-90) * 1.5)] + ]; + { + _found = false; + _no = nearestObjects [_x, [typeOf _wire], 3]; //diag_log _no; diag_log "....."; + _no = _no - [_wire]; //diag_log _no; + if (count _no > 0) exitWith { + _found = true; //diag_log "found"; + }; + } foreach _wireCheckPosAr; + // Double coil found! + if (_found) then { + _mode = 1; + } else { + // Randomly make a single coil also catch tanks, if speed is high + if (_vehicle isKindOf "Tank" && {20 > random 100} && {speed _vehicle > 30}) then { + _mode = 1; + } else { + if !(_vehicle isKindOf "Tank") then { + _mode = 1; + }; + }; + }; +}; + +if (_mode == 1) then { + switch (true) do { + case (_vehicle isKindOf "Tank"): { + _parts = ["ltrack","rtrack"]; + }; + case (_vehicle isKindOf "Wheeled_APC" || {_vehicle isKindOf "Car"}): { + _parts = ["lfwheel","lf2wheel","lmwheel","lbwheel","rfwheel","rf2wheel","rmwheel","rbwheel"]; + }; + }; +} else { + switch (true) do { + case (_vehicle isKindOf "Wheeled_APC" || {_vehicle isKindOf "Car"}): { + _parts = ["lfwheel","lf2wheel","lmwheel","lbwheel","rfwheel","rf2wheel","rmwheel","rbwheel"]; + }; + }; +}; + +if (canMove _vehicle) then { + { + _selectionPart = "hit" + _x; + if (isText(configFile >> "CfgVehicles" >> typeOf _vehicle >> "hitpoints" >> _selectionPart >> "name")) then { + _selection = getText(configFile >> "CfgVehicles" >> typeOf _vehicle >> "hitpoints" >> _selectionPart >> "name"); + // TODO: Only the tires that have touched the wire should burst. + _vehicle setHit [_selection, 1]; + }; + } forEach _parts; +}; + +if (_mode == 1) then { + if (_vehicle isKindOf "StaticWeapon") exitWith {}; + [{ + PARAMS_2(_vehicle,_wire); + + _vehicle setVelocity ((velocity _vehicle) vectorMultiply 0.75); + + private ["_vPos", "_vDir"]; + // Set vehicle back in front of wire, since the wire will make the vehicle jump, and a wire with no geometry lod is undestructible and not recognizeable + _vPos = getPosASL _vehicle; + _vDir = getDir _vehicle; + _vehicle setPosASL (_vPos vectorAdd [-0.35 * sin(_vDir), -0.35 * cos(_vDir), 0]); + // TODO: Needs to be placed in safe distance to wire, so we do not constantly re-spawn new wires + }, [_vehicle, _wire], 0.1, 0] call EFUNC(common,waitAndExecute); +}; + +//TODO: Create broken geoless wire (two version) +//TODO: Make wire remains stop vehicles diff --git a/addons/concertina_wire/functions/script_component.hpp b/addons/concertina_wire/functions/script_component.hpp new file mode 100644 index 0000000000..5ec20093ef --- /dev/null +++ b/addons/concertina_wire/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\concertina_wire\script_component.hpp" \ No newline at end of file diff --git a/addons/concertina_wire/script_component.hpp b/addons/concertina_wire/script_component.hpp new file mode 100644 index 0000000000..f3f353f181 --- /dev/null +++ b/addons/concertina_wire/script_component.hpp @@ -0,0 +1,15 @@ +#define COMPONENT concertina_wire +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_CONCERTINA_WIRE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_CONCERTINA_WIRE + #define DEBUG_SETTINGS DEBUG_SETTINGS_CONCERTINA_WIRE +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define WIRE_FAST ["wire_2","wire_3","wire_4","wire_5","wire_6","wire_7","wire_8","wire_9","wire_10","wire_11","wire_12","wire_13","wire_14","wire_15","wire_16","wire_17","wire_18"] +#define WIRE_SLOW ["wire_2_1","wire_3_1","wire_4_1","wire_5_1","wire_6_1","wire_7_1","wire_8_1","wire_9_1","wire_10_1","wire_11_1","wire_12_1","wire_13_1","wire_14_1","wire_15_1","wire_16_1","wire_17_1","wire_18_1"] diff --git a/addons/concertina_wire/stringtable.xml b/addons/concertina_wire/stringtable.xml new file mode 100644 index 0000000000..4400866e87 --- /dev/null +++ b/addons/concertina_wire/stringtable.xml @@ -0,0 +1,53 @@ + + + + + Concertina Wire + NATO-Draht + Проволочная спираль + Drut kolczasty + Concertina wire + Concertina wire + Ostnatý drát + Concertina wire + Concertina wire + Arame farpado + + + Concertina Wire Coil + NATO-Draht Rolle + Проволочная спираль (моток) + Zwój drutu kolczastego + Concertina wire coil + Concertina wire coil + Smyčka ostnatého drátu + Concertina wire coil + Concertina wire coil + Bobina de arame farpado + + + Dismount Concertina Wire + NATO-Draht abbauen + Демонтировать проволочную спираль + Zwiń drut kolczasty + Dismount Concertina wire + Dismount Concertina wire + Svinout ostnatý drát + Dismount Concertina wire + Dismount Concertina wire + Desmontar arame farpado + + + Deploy Concertina Wire + NATO-Draht verlegen + Монтировать проволочную спираль + Rozwiń drut kolczasty + Deploy Concertina wire + Deploy Concertina wire + Rozvinout ostnatý drát + Deploy Concertina wire + Deploy Concertina wire + Colocar arame farpado + + + \ No newline at end of file diff --git a/addons/dagr/$PBOPREFIX$ b/addons/dagr/$PBOPREFIX$ new file mode 100644 index 0000000000..98e51ae9ea --- /dev/null +++ b/addons/dagr/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\dagr \ No newline at end of file diff --git a/addons/dagr/CfgEventHandlers.hpp b/addons/dagr/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a05b72298 --- /dev/null +++ b/addons/dagr/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; \ No newline at end of file diff --git a/addons/dagr/CfgVehicles.hpp b/addons/dagr/CfgVehicles.hpp new file mode 100644 index 0000000000..f26d8841ae --- /dev/null +++ b/addons/dagr/CfgVehicles.hpp @@ -0,0 +1,49 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(menu) { + displayName = "Configure DAGR"; + condition = QUOTE([ARR_2(_player,'ACE_DAGR')] call EFUNC(common,hasItem)); + statement = QUOTE(call FUNC(menuInit)); + showDisabled = 0; + priority = 0.1; + icon = QUOTE(PATHTOF(UI\DAGR_Icon.paa)); + exceptions[] = {"isNotInside", "isNotSitting"}; + class GVAR(toggle) { + displayName = "Toggle DAGR"; + condition = QUOTE([ARR_2(_player,'ACE_DAGR')] call EFUNC(common,hasItem)); + statement = QUOTE(call FUNC(toggleOverlay)); + showDisabled = 0; + priority = 0.2; + icon = QUOTE(PATHTOF(UI\DAGR_Icon.paa)); + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; + }; + }; + }; + }; + }; + + class Item_Base_F; + class ACE_Item_DAGR: Item_Base_F { + author[] = {"Rosuto", "Ruthberg"}; + scope = 2; + scopeCurator = 2; + displayName = "DAGR"; + vehicleClass = "Items"; + class TransportItems { + class ACE_DAGR { + name = "ACE_DAGR"; + count = 1; + }; + }; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_DAGR,6); + }; + }; +}; diff --git a/addons/dagr/CfgWeapons.hpp b/addons/dagr/CfgWeapons.hpp new file mode 100644 index 0000000000..31b0603ff2 --- /dev/null +++ b/addons/dagr/CfgWeapons.hpp @@ -0,0 +1,19 @@ + +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_DAGR: ACE_ItemCore { + author[] = {$STR_ACE_Common_ACETeam, "Ruthberg"}; + scope = 2; + displayName = "DAGR"; + descriptionShort = ""; + picture = PATHTOF(UI\DAGR_Icon.paa); + icon = "iconObject_circle"; + mapSize = 0.034; + + class ItemInfo: InventoryItem_Base_F { + mass = 10; + }; + }; +}; diff --git a/addons/dagr/Dialog.hpp b/addons/dagr/Dialog.hpp new file mode 100644 index 0000000000..2faeb03879 --- /dev/null +++ b/addons/dagr/Dialog.hpp @@ -0,0 +1,424 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUT_BUTTON 16 // Arma 2 - textured button + +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_List_N_Box 102 // Arma 2 - N columns list box + + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0c +#define ST_TYPE 0xF0 +#define ST_SINGLE 0 +#define ST_MULTI 16 +#define ST_TITLE_BAR 32 +#define ST_PICTURE 48 +#define ST_FRAME 64 +#define ST_BACKGROUND 80 +#define ST_GROUP_BOX 96 +#define ST_GROUP_BOX2 112 +#define ST_HUD_BACKGROUND 128 +#define ST_TILE_PICTURE 144 +#define ST_WITH_RECT 160 +#define ST_LINE 176 +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 +#define ST_TITLE ST_TITLE_BAR + ST_CENTER + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 +#define SL_TEXTURES 0x10 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 +#define FontM "PuristaMedium" + +class RscText; + +class DAGR_Button { + idc = -1; + type = CT_BUTTON; + style = ST_LEFT; + font = "PuristaMedium"; + sizeEx = 0.02; + colorText[] = { 0, 1, 0, 1 }; + colorFocused[] = { 0, 0, 0, 0 }; // border color for focused state + colorDisabled[] = { 0, 0, 0, 0 }; // text color for disabled state + colorBackground[] = { 0, 0, 0, 0 }; + colorBackgroundDisabled[] = { 0, 0, 0, 0 }; // background color for disabled state + colorBackgroundActive[] = { 0, 0, 0, 0 }; // background color for active state + offsetX = 0; + offsetY = 0; + offsetPressedX = 0; + offsetPressedY = 0; + colorShadow[] = { 0, 0, 0, 0 }; + colorBorder[] = { 0, 0, 0, 0 }; + borderSize = 0; + soundEnter[] = { "", 0, 1 }; // no sound + soundPush[] = { "", 0, 1 }; + soundClick[] = { "", 0, 1 }; // no sound + soundEscape[] = { "", 0, 1 }; // no sound + x = 0.5; + y = 0.5; + w = 0.07; + h = 0.05; + text = ""; + action = ""; +}; +class DAGR_Menu_Pic { + type = 0; + idc = -1; + style = 48; + x = 0; + y = 0; + w = 0.7; + h = 1.4; + text = ""; + colorBackground[] = {}; + colorText[] = {}; + font = "PuristaMedium"; + sizeEx = 0.04; + waitForLoad = 0; +}; + +class DAGR_Menu_Text { + type = 0; + idc = -1; + style = 0x00; + x = 0.5; + y = 0.5; + w = 0.15; + h = 0.15; + colorBackground[] = { 0, 0, 0, 0 }; + colorText[] = { 0.239, 0.216, 0.153, 1 }; + font = "PuristaMedium"; + sizeEx = 0.03; + waitForLoad = 0; + text = ""; +}; + +class DAGR_Menu { + idd = 266860; + movingEnable = false; + duration = 100000; + fadein = 0; + fadeout = 0; + name = "Dagr_Menu"; + onLoad = "uiNamespace setVariable ['DAGR_Menu', _this select 0]"; + onUnload = QUOTE(GVAR(PWR) = true); // Simulate pressing the power button + controls[] = {"DAGR_MENU_UI", "DAGR_PWR_Button", "DAGR_UP_Button", "DAGR_DOWN_Button", "DAGR_LEFT_Button", "DAGR_RIGHT_Button", "DAGR_NEXT_Button", + "DAGR_SEL_Button", "DAGR_MENU_Button", "DAGR_F1_Button", "DAGR_F2_Button", "DAGR_F3_Button", "DAGR_F1_Text", "DAGR_F2_Text", "DAGR_F3_Text", "DAGR_MENU_OPTION0", + "DAGR_MENU_OPTION1", "DAGR_MENU_OPTION2", "DAGR_MENU_OPTION3", "DAGR_MENU_OPTION4", "DAGR_MENU_SELECTION0", "DAGR_MENU_SELECTION1", "DAGR_MENU_SELECTION2", + "DAGR_MENU_SELECTION3", "DAGR_MENU_SELECTION4", "DAGR_MENU_Main_Text", "DAGR_MENU_PSELECTION1", "DAGR_MENU_PSELECTION2", "DAGR_MENU_PSELECTION3", + "DAGR_MENU_PSELECTION4", "DAGR_MENU_PSELECTION5", "DAGR_MENU_PSELECTION6","DAGR_MENU_PSELECTION7", "DAGR_MENU_PSELECTION8"}; + + class DAGR_MENU_UI : DAGR_Menu_Pic { + idc = 266861; + x = 0.175; + y = -0.173; + text = QUOTE(PATHTOF(UI\dagr_menu.paa)); + sizeEx = 0.1; + }; + + class DAGR_PWR_Button : DAGR_Button { + idc = 266863; + action = QUOTE(GVAR(PWR) = true); + x = 0.40; + y = 0.65; + }; + + class DAGR_UP_Button : DAGR_Button { + idc = 266864; + action = QUOTE(GVAR(UP) = true); + x = 0.50; + y = 0.675; + }; + + class DAGR_DOWN_Button : DAGR_Button { + idc = 266865; + action = QUOTE(GVAR(DOWN) = true); + x = 0.50; + y = 0.81; + }; + + class DAGR_LEFT_Button : DAGR_Button { + idc = 266866; + action = QUOTE(GVAR(LEFT) = true); + x = 0.40; + y = 0.735; + w = 0.05; + h = 0.07; + }; + + class DAGR_RIGHT_Button : DAGR_Button { + idc = 266867; + action = QUOTE(GVAR(RIGHT) = true); + x = 0.62; + y = 0.735; + w = 0.05; + h = 0.07; + }; + + class DAGR_NEXT_Button : DAGR_Button { + idc = 266868; + action = QUOTE(DAGR_NEXT = true); + x = 0.60; + y = 0.65; + }; + + class DAGR_SEL_Button : DAGR_Button { + idc = 266869; + action = QUOTE(GVAR(SEL) = true); + x = 0.54; + y = 0.735; + w = 0.06; + h = 0.06; + }; + + class DAGR_MENU_Button : DAGR_Button { + idc = 266870; + action = QUOTE(GVAR(MENU_B) = true); + x = 0.46; + y = 0.735; + w = 0.06; + h = 0.06; + }; + + class DAGR_F1_Button : DAGR_Button { + idc = 266871; + action = QUOTE(GVAR(F1) = true); + x = 0.40; + y = 0.575; + }; + + class DAGR_F2_Button : DAGR_Button { + idc = 266872; + action = QUOTE(GVAR(F2) = true); + x = 0.495; + y = 0.575; + }; + + class DAGR_F3_Button : DAGR_Button { + idc = 266873; + action = QUOTE(GVAR(F3) = true); + x = 0.59; + y = 0.575; + }; + + class DAGR_F1_Text : DAGR_Menu_Text { + idc = 266874; + x = 0.388; + y = 0.38; + text = ""; + }; + + class DAGR_F2_Text : DAGR_Menu_Text { + idc = 266875; + x = 0.506; + y = 0.38; + }; + + class DAGR_F3_Text : DAGR_Menu_Text { + idc = 266876; + x = 0.612; + y = 0.38; + }; + + class DAGR_MENU_OPTION0 : DAGR_Menu_Text { + idc = 2668777; + style = 0x02; + sizeEx = 0.035; + x = 0.43; + y = 0.19; + }; + + class DAGR_MENU_OPTION1 : DAGR_Menu_Text { + idc = 2668778; + style = 0x02; + sizeEx = 0.035; + x = 0.43; + y = 0.225; + }; + + class DAGR_MENU_OPTION2 : DAGR_Menu_Text { + idc = 2668779; + style = 0x02; + sizeEx = 0.035; + x = 0.43; + y = 0.26; + }; + + class DAGR_MENU_OPTION3 : DAGR_Menu_Text { + idc = 2668780; + style = 0x02; + sizeEx = 0.035; + x = 0.43; + y = 0.295; + }; + + class DAGR_MENU_OPTION4 : DAGR_Menu_Text { + idc = 2668781; + style = 0x02; + sizeEx = 0.035; + x = 0.43; + y = 0.33; + }; + class DAGR_MENU_SELECTION0 : DAGR_Menu_Pic { + idc = 2668783; + x = 0.42; + y = 0.246; + w = 0.17; + h = 0.035; + sizeEx = 0.05; + }; + + class DAGR_MENU_SELECTION1 : DAGR_Menu_Pic { + idc = 2668784; + x = 0.42; + y = 0.281; + w = 0.17; + h = 0.035; + sizeEx = 0.05; + }; + + class DAGR_MENU_SELECTION2 : DAGR_Menu_Pic { + idc = 2668785; + x = 0.42; + y = 0.316; + w = 0.17; + h = 0.035; + sizeEx = 0.05; + }; + + class DAGR_MENU_SELECTION3 : DAGR_Menu_Pic { + idc = 2668786; + x = 0.42; + y = 0.351; + w = 0.17; + h = 0.035; + sizeEx = 0.05; + }; + + class DAGR_MENU_SELECTION4 : DAGR_Menu_Pic { + idc = 2668787; + x = 0.42; + y = 0.386; + w = 0.17; + h = 0.035; + sizeEx = 0.05; + }; + + class DAGR_MENU_Main_Text : DAGR_Menu_Text { + idc = 2668782; + style = ST_CENTER; + x = 0.38; + y = 0.32; + w = 0.25; + h = 0.035; + sizeEx = 0.04; + }; + + class DAGR_MENU_PSELECTION1 : DAGR_Menu_Pic { + idc = 2668788; + x = 0.451; + y = 0.352; + w = 0.01; + h = 0.003; + }; + + class DAGR_MENU_PSELECTION2 : DAGR_Menu_Pic { + idc = 2668789; + x = 0.465; + y = 0.352; + w = 0.01; + h = 0.003; + }; + + class DAGR_MENU_PSELECTION3 : DAGR_Menu_Pic { + idc = 2668790; + x = 0.479; + y = 0.352; + w = 0.01; + h = 0.003; + }; + + class DAGR_MENU_PSELECTION4 : DAGR_Menu_Pic { + idc = 2668791; + x = 0.493; + y = 0.352; + w = 0.01; + h = 0.003; + }; + + class DAGR_MENU_PSELECTION5 : DAGR_Menu_Pic { + idc = 2668792; + x = 0.507; + y = 0.352; + w = 0.01; + h = 0.003; + }; + + class DAGR_MENU_PSELECTION6 : DAGR_Menu_Pic { + idc = 2668793; + x = 0.521; + y = 0.352; + w = 0.01; + h = 0.003; + }; + + class DAGR_MENU_PSELECTION7 : DAGR_Menu_Pic { + idc = 2668794; + x = 0.535; + y = 0.352; + w = 0.01; + h = 0.003; + }; + + class DAGR_MENU_PSELECTION8 : DAGR_Menu_Pic { + idc = 2668795; + x = 0.549; + y = 0.352; + w = 0.01; + h = 0.003; + }; +}; diff --git a/addons/dagr/README.md b/addons/dagr/README.md new file mode 100644 index 0000000000..33d095dca4 --- /dev/null +++ b/addons/dagr/README.md @@ -0,0 +1,10 @@ +ace_dagr +=============== + +Defense Advanced GPS Receiver + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/dagr/RscTitles.hpp b/addons/dagr/RscTitles.hpp new file mode 100644 index 0000000000..8467c70f66 --- /dev/null +++ b/addons/dagr/RscTitles.hpp @@ -0,0 +1,95 @@ +class RscTitles { + class DAGR_Text { + type = 0; + idc = -1; + style = 0x01; + x = 0; + y = 0; + w = 0.15; + h = 0.050; + text = ""; + colorBackground[] = { 0, 0, 0, 0 }; + colorText[] = { 0.239, 0.216, 0.153, 1 }; + font = "PuristaMedium"; + sizeEx = 0.04; + waitForLoad = 0; + }; + class DAGR_Pic { + type = 0; + idc = -1; + style = 48; + x = 0; + y = 0; + w = 0.50; + h = 0.50; + text = ""; + colorBackground[] = {}; + colorText[] = {}; + font = "PuristaMedium"; + sizeEx = 0.02; + waitForLoad = 0; + }; + + class DAGR_Display { + idd = 266850; + movingEnable = false; + duration = 100000; + fadein = 0; + fadeout = 0; + name = "Dagr_Display"; + onLoad="uiNamespace setVariable ['DAGR_Display', _this select 0]"; + controls[] = {"DAGR_UI", "DAGR_Grid", "DAGR_Speed", "DAGR_Elevation", "DAGR_Heading", "DAGR_Time", "DAGR_WP", "DAGR_Bearing", "DAGR_DIST"}; + + class DAGR_UI : DAGR_Pic { + idc = 266856; + x = "(SafeZoneW + SafeZoneX) - 0.45"; + y = "(SafeZoneH + SafeZoneY) - 0.47"; + }; + + class DAGR_Grid : DAGR_Text { + idc = 266851; + x = "(SafeZoneW + SafeZoneX) - 0.370";// 0.830 + y = "(SafeZoneH + SafeZoneY)- 0.250";// 0.845 + w = 0.25; + h = 0.06; + sizeEx = 0.07; + }; + class DAGR_Speed : DAGR_Text { + idc = 266852; + x = "(SafeZoneW + SafeZoneX) - 0.388"; //0.812 + y = "(SafeZoneH + SafeZoneY) - 0.181"; //0.914 + }; + class DAGR_Elevation : DAGR_Text { + idc = 266853; + x = "(SafeZoneW + SafeZoneX) - 0.270"; //0.930 + y = "(SafeZoneH + SafeZoneY) - 0.181"; //0.914 + }; + class DAGR_Heading : DAGR_Text { + idc = 266854; + x = "(SafeZoneW + SafeZoneX) - 0.413"; //0.787 + y = "(SafeZoneH + SafeZoneY) - 0.1294"; //0.9656 + }; + class DAGR_Time : DAGR_Text { + idc = 266855; + x = "(SafeZoneW + SafeZoneX) - 0.275"; //0.925 + y = "(SafeZoneH + SafeZoneY) - 0.129"; //0.965 + }; + + class DAGR_WP : DAGR_Text { + idc = 266857; + x = "(SafeZoneW + SafeZoneX) - 0.235"; //0.965 + y = "(SafeZoneH + SafeZoneY) - 0.181"; //0.914 + }; + + class DAGR_Bearing : DAGR_Text { + idc = 266858; + x = "(SafeZoneW + SafeZoneX) - 0.413"; //0.787 + y = "(SafeZoneH + SafeZoneY) - 0.181"; //0.914 + }; + class DAGR_DIST : DAGR_Text { + idc = 266859; + x = "(SafeZoneW + SafeZoneX) - 0.265"; //0.935 + y = "(SafeZoneH + SafeZoneY) - 0.129"; //0.965 + }; + }; +}; diff --git a/addons/dagr/UI/DAGR_Button.paa b/addons/dagr/UI/DAGR_Button.paa new file mode 100644 index 0000000000..f81a8cef4a Binary files /dev/null and b/addons/dagr/UI/DAGR_Button.paa differ diff --git a/addons/dagr/UI/DAGR_GPS.paa b/addons/dagr/UI/DAGR_GPS.paa new file mode 100644 index 0000000000..b0e05a5a65 Binary files /dev/null and b/addons/dagr/UI/DAGR_GPS.paa differ diff --git a/addons/dagr/UI/DAGR_GPS_SHOW.paa b/addons/dagr/UI/DAGR_GPS_SHOW.paa new file mode 100644 index 0000000000..71f93e5f01 Binary files /dev/null and b/addons/dagr/UI/DAGR_GPS_SHOW.paa differ diff --git a/addons/dagr/UI/DAGR_Icon.paa b/addons/dagr/UI/DAGR_Icon.paa new file mode 100644 index 0000000000..be4afe7b51 Binary files /dev/null and b/addons/dagr/UI/DAGR_Icon.paa differ diff --git a/addons/dagr/UI/DAGR_MENU.paa b/addons/dagr/UI/DAGR_MENU.paa new file mode 100644 index 0000000000..311e2a607a Binary files /dev/null and b/addons/dagr/UI/DAGR_MENU.paa differ diff --git a/addons/dagr/UI/DAGR_PSelection.paa b/addons/dagr/UI/DAGR_PSelection.paa new file mode 100644 index 0000000000..9e1eb679fa Binary files /dev/null and b/addons/dagr/UI/DAGR_PSelection.paa differ diff --git a/addons/dagr/UI/DAGR_Selection.paa b/addons/dagr/UI/DAGR_Selection.paa new file mode 100644 index 0000000000..16ecf82593 Binary files /dev/null and b/addons/dagr/UI/DAGR_Selection.paa differ diff --git a/addons/dagr/UI/DAGR_Vector.paa b/addons/dagr/UI/DAGR_Vector.paa new file mode 100644 index 0000000000..c414cbd7e7 Binary files /dev/null and b/addons/dagr/UI/DAGR_Vector.paa differ diff --git a/addons/dagr/UI/DAGR_WP.paa b/addons/dagr/UI/DAGR_WP.paa new file mode 100644 index 0000000000..e8e541a36f Binary files /dev/null and b/addons/dagr/UI/DAGR_WP.paa differ diff --git a/addons/dagr/XEH_postInit.sqf b/addons/dagr/XEH_postInit.sqf new file mode 100644 index 0000000000..39f2a7ea28 --- /dev/null +++ b/addons/dagr/XEH_postInit.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +#include "initKeybinds.sqf" + +GVAR(outputPFH) = -1; + +GVAR(run) = false; +GVAR(hidden) = true; +GVAR(menuRun) = false; +GVAR(useDegrees) = true; +GVAR(updateInterval) = 0.5; + +GVAR(numWaypoints) = 0; +GVAR(wpString0) = ""; +GVAR(wpString1) = ""; +GVAR(wpString2) = ""; +GVAR(wpString3) = ""; +GVAR(wpString4) = ""; +GVAR(wp0) = 0; +GVAR(wp1) = 0; +GVAR(wp2) = 0; +GVAR(wp3) = 0; +GVAR(wp4) = 0; + +GVAR(displaySelection) = "DATA"; + +GVAR(vectorConnected) = false; +GVAR(noVectorData) = true; +GVAR(vectorGrid) = "00000000"; + +["RangerfinderData", {_this call FUNC(handleRangeFinderData)}] call EFUNC(common,addEventHandler); diff --git a/addons/dagr/XEH_preInit.sqf b/addons/dagr/XEH_preInit.sqf new file mode 100644 index 0000000000..7c61d71775 --- /dev/null +++ b/addons/dagr/XEH_preInit.sqf @@ -0,0 +1,12 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(handleRangeFinderData); +PREP(menuInit); +PREP(outputData); +PREP(outputVector); +PREP(outputWP); +PREP(toggleOverlay); + +ADDON = true; diff --git a/addons/dagr/config.cpp b/addons/dagr/config.cpp new file mode 100644 index 0000000000..9f46660aaa --- /dev/null +++ b/addons/dagr/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_Item_DAGR"}; + weapons[] = {"ACE_DAGR"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_weather"}; + author[] = {"Rosuto", "Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "Dialog.hpp" +#include "RscTitles.hpp" diff --git a/addons/dagr/functions/fnc_handleRangeFinderData.sqf b/addons/dagr/functions/fnc_handleRangeFinderData.sqf new file mode 100644 index 0000000000..59e10a1711 --- /dev/null +++ b/addons/dagr/functions/fnc_handleRangeFinderData.sqf @@ -0,0 +1,30 @@ +/* + * Author: Rosuto, Ruthberg + * Handles incoming data packets from the Vectronix Vector LRF + * + * Arguments: + * 0: Slope distance (Meters) + * 1: Azimuth (Degrees) + * 2: Inclination (Degrees) + * + * Return Value: + * Nothing + * + * Example: + * [1000, 45, 1] call ace_dagr_fnc_handleRangeFinderData + * + * Public: No + */ +#include "script_component.hpp" + +#define EMP_RF_ACC 5 // Rangefinder Accuracy + +PARAMS_3(_slopeDistance,_azimuth,_inclination); + +if (GVAR(vectorConnected)) then { + GVAR(LAZPOS) = (eyePos player) vectorAdd ([_slopeDistance, _azimuth, _inclination] call CBA_fnc_polar2vect); + GVAR(LAZDIST) = _slopeDistance * cos(_inclination); + GVAR(LAZDIST) = floor (GVAR(LAZDIST) / EMP_RF_ACC) * EMP_RF_ACC; + GVAR(LAZHEADING) = _azimuth; + GVAR(noVectorData) = false; +}; diff --git a/addons/dagr/functions/fnc_menuInit.sqf b/addons/dagr/functions/fnc_menuInit.sqf new file mode 100644 index 0000000000..739f41df0b --- /dev/null +++ b/addons/dagr/functions/fnc_menuInit.sqf @@ -0,0 +1,607 @@ +/* + * Author: Rosuto, Ruthberg + * Creates the DAGR menu dialog + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +#define __dsp (uiNamespace getVariable "DAGR_MENU") +#define __F1 266874 +#define __F2 266875 +#define __F3 266876 +#define __Option0 2668777 +#define __Option1 2668778 +#define __Option2 2668779 +#define __Option3 2668780 +#define __Option4 2668781 +#define __Selection0 2668783 +#define __Selection1 2668784 +#define __Selection2 2668785 +#define __Selection3 2668786 +#define __Selection4 2668787 +#define __mainText 2668782 +#define __PSelection1 2668788 +#define __PSelection2 2668789 +#define __PSelection3 2668790 +#define __PSelection4 2668791 +#define __PSelection5 2668792 +#define __PSelection6 2668793 +#define __PSelection7 2668794 +#define __PSelection8 2668795 + +135471 cutText ["", "PLAIN"]; +closeDialog 0; +createDialog "DAGR_MENU"; + +GVAR(menu) = "main"; +GVAR(selection) = 0; +GVAR(numSelections) = 5; +GVAR(tmpUpdateRate) = GVAR(updateInterval); +GVAR(edit) = false; +GVAR(add) = false; +GVAR(pointer) = 0; +GVAR(digit1) = 0; +GVAR(digit2) = 0; +GVAR(digit3) = 0; +GVAR(digit4) = 0; +GVAR(digit5) = 0; +GVAR(digit6) = 0; +GVAR(digit7) = 0; +GVAR(digit8) = 0; + +GVAR(busy) = false; +GVAR(busyTimer) = 0; + +GVAR(showNoWaypointsFound) = false; +GVAR(showInfoUpdatin) = false; +GVAR(showDeleting) = false; +GVAR(showOutOfSpace) = false; + +GVAR(PWR) = false; +GVAR(menuRun) = true; +[{ + if (!dialog || GVAR(PWR) || !GVAR(menuRun)) exitWith { + closeDialog 266860; + GVAR(menuRun) = false; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + + if (GVAR(MENU_B)) then { + GVAR(menu) = "main"; + GVAR(selection) = 0; + GVAR(numSelections) = 5; + }; + + if (!GVAR(add) && !GVAR(edit)) then { + if (GVAR(DOWN)) then { + GVAR(selection) = (GVAR(numSelections) + GVAR(selection) + 1); + }; + if (GVAR(UP)) then { + GVAR(selection) = (GVAR(numSelections) + GVAR(selection) - 1); + }; + GVAR(selection) = if (GVAR(numSelections) > 0) then { GVAR(selection) % GVAR(numSelections) } else { 0 }; + }; + + if (GVAR(LEFT)) then { + GVAR(pointer) = (8 + GVAR(pointer) - 1); + }; + if (GVAR(RIGHT)) then { + GVAR(pointer) = (8 + GVAR(pointer) + 1); + }; + GVAR(pointer) = GVAR(pointer) % 8; + + (__dsp displayCtrl __PSelection1) ctrlSetText ""; + (__dsp displayCtrl __PSelection2) ctrlSetText ""; + (__dsp displayCtrl __PSelection3) ctrlSetText ""; + (__dsp displayCtrl __PSelection4) ctrlSetText ""; + (__dsp displayCtrl __PSelection5) ctrlSetText ""; + (__dsp displayCtrl __PSelection6) ctrlSetText ""; + (__dsp displayCtrl __PSelection7) ctrlSetText ""; + (__dsp displayCtrl __PSelection8) ctrlSetText ""; + + (__dsp displayCtrl __Selection0) ctrlSetText ""; + (__dsp displayCtrl __Selection1) ctrlSetText ""; + (__dsp displayCtrl __Selection2) ctrlSetText ""; + (__dsp displayCtrl __Selection3) ctrlSetText ""; + (__dsp displayCtrl __Selection4) ctrlSetText ""; + + (__dsp displayCtrl __F1) ctrlSetText ""; + (__dsp displayCtrl __F2) ctrlSetText ""; + (__dsp displayCtrl __F3) ctrlSetText ""; + + (__dsp displayCtrl __mainText) ctrlSetText ""; + (__dsp displayCtrl __Option0) ctrlSetText ""; + (__dsp displayCtrl __Option1) ctrlSetText ""; + (__dsp displayCtrl __Option2) ctrlSetText ""; + (__dsp displayCtrl __Option3) ctrlSetText ""; + (__dsp displayCtrl __Option4) ctrlSetText ""; + + switch (GVAR(menu)) do { + case "main": { + if (GVAR(SEL)) then { + switch (GVAR(selection)) do { + case 0: { + GVAR(displaySelection) = "DATA"; + GVAR(vectorConnected) = false; + if (!GVAR(busy)) then { + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + (__dsp displayCtrl __mainText) ctrlSetText "Acquiring Data."; + if (ACE_time - GVAR(busyTimer) > 0.5) then { + (__dsp displayCtrl __mainText) ctrlSetText "Acquiring Data.."; + }; + if (ACE_time - GVAR(busyTimer) > 1.0) then { + (__dsp displayCtrl __mainText) ctrlSetText "Acquiring Data..."; + }; + if (ACE_time - GVAR(busyTimer) > 1.5) then { + (__dsp displayCtrl __mainText) ctrlSetText "Position Acquired"; + }; + if (ACE_time - GVAR(busyTimer) > 3.0) then { + GVAR(busy) = false; + }; + }; + case 1: { + if (GVAR(numWaypoints) < 1) then { + (__dsp displayCtrl __mainText) ctrlSetText "No Waypoints Found"; + if (!GVAR(busy)) then { + GVAR(showNoWaypointsFound) = true; + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + } else { + GVAR(menu) = "goto_wp"; GVAR(numSelections) = GVAR(numWaypoints); GVAR(selection) = 0; + }; + }; + case 2: { GVAR(menu) = "wp_list"; GVAR(numSelections) = GVAR(numWaypoints); GVAR(selection) = 0 }; + case 3: { GVAR(menu) = "connect"; GVAR(numSelections) = 1; }; + case 4: { GVAR(menu) = "options"; GVAR(numSelections) = 2; }; + }; + }; + if (GVAR(busy) && GVAR(showNoWaypointsFound)) then { + if (ACE_time - GVAR(busyTimer) > 2) then { + GVAR(showNoWaypointsFound) = false; + GVAR(busy) = false; + }; + }; + if (!GVAR(busy)) then { + (__dsp displayCtrl __Option0) ctrlSetText "DATA VIEW"; + (__dsp displayCtrl __Option1) ctrlSetText "GOTO WP"; + (__dsp displayCtrl __Option2) ctrlSetText "WP LIST"; + (__dsp displayCtrl __Option3) ctrlSetText "CONNECT TO"; + (__dsp displayCtrl __Option4) ctrlSetText "OPTIONS"; + (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QUOTE(PATHTOF(UI\DAGR_Selection.paa)); + }; + }; + case "goto_wp": { + if (!GVAR(busy)) then { + (__dsp displayCtrl __Option0) ctrlSetText GVAR(wpString0); + (__dsp displayCtrl __Option1) ctrlSetText GVAR(wpString1); + (__dsp displayCtrl __Option2) ctrlSetText GVAR(wpString2); + (__dsp displayCtrl __Option3) ctrlSetText GVAR(wpString3); + (__dsp displayCtrl __Option4) ctrlSetText GVAR(wpString4); + if (GVAR(numSelections) > 0) then { + (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QUOTE(PATHTOF(UI\DAGR_Selection.paa)); + }; + }; + if (GVAR(SEL)) then { + GVAR(vectorConnected) = false; + GVAR(displaySelection) = "WP"; + switch (GVAR(selection)) do { + case 0: { DAGR_WP_INFO = GVAR(wp0); }; + case 1: { DAGR_WP_INFO = GVAR(wp1); }; + case 2: { DAGR_WP_INFO = GVAR(wp2); }; + case 3: { DAGR_WP_INFO = GVAR(wp3); }; + case 4: { DAGR_WP_INFO = GVAR(wp4); }; + }; + if (!GVAR(busy)) then { + GVAR(showInfoUpdating) = true; + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + }; + if (GVAR(busy) && GVAR(showInfoUpdating)) then { + (__dsp displayCtrl __mainText) ctrlSetText "Info Update."; + if (ACE_time - GVAR(busyTimer) > 1) then { + (__dsp displayCtrl __mainText) ctrlSetText "Info Update.."; + }; + if (ACE_time - GVAR(busyTimer) > 1.2) then { + (__dsp displayCtrl __mainText) ctrlSetText "Info Update..."; + }; + if (ACE_time - GVAR(busyTimer) > 1.4) then { + (__dsp displayCtrl __mainText) ctrlSetText "Info Updated"; + }; + if (ACE_time - GVAR(busyTimer) > 2.9) then { + GVAR(showInfoUpdating) = false; + GVAR(busy) = false; + }; + }; + }; + case "wp_list": { + if (!GVAR(add) && !GVAR(edit)) then { + if (!GVAR(busy)) then { + (__dsp displayCtrl __Option0) ctrlSetText GVAR(wpString0); + (__dsp displayCtrl __Option1) ctrlSetText GVAR(wpString1); + (__dsp displayCtrl __Option2) ctrlSetText GVAR(wpString2); + (__dsp displayCtrl __Option3) ctrlSetText GVAR(wpString3); + (__dsp displayCtrl __Option4) ctrlSetText GVAR(wpString4); + (__dsp displayCtrl __F1) ctrlSetText "Add"; + (__dsp displayCtrl __F2) ctrlSetText "Edit"; + (__dsp displayCtrl __F3) ctrlSetText "Delete"; + if (GVAR(numSelections) > 0) then { + (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QUOTE(PATHTOF(UI\DAGR_Selection.paa)); + }; + }; + if (GVAR(F3) && GVAR(numWaypoints) > 0) then { + if (!GVAR(busy)) then { + switch (GVAR(selection)) do { + case 0: { + GVAR(wpString0) = GVAR(wpString1); + GVAR(wp0) = GVAR(wp1); + GVAR(wpString1) = GVAR(wpString2); + GVAR(wp1) = GVAR(wp2); + GVAR(wpString2) = GVAR(wpString3); + GVAR(wp2) = GVAR(wp3); + GVAR(wpString3) = GVAR(wpString4); + GVAR(wp3) = GVAR(wp4); + GVAR(wpString4) = ""; + GVAR(wp4) = ""; + }; + case 1: { + GVAR(wpString1) = GVAR(wpString2); + GVAR(wp1) = GVAR(wp2); + GVAR(wpString2) = GVAR(wpString3); + GVAR(wp2) = GVAR(wp3); + GVAR(wpString3) = GVAR(wpString4); + GVAR(wp3) = GVAR(wp4); + GVAR(wpString4) = ""; + GVAR(wp4) = ""; + }; + case 2: { + GVAR(wpString2) = GVAR(wpString3); + GVAR(wp2) = GVAR(wp3); + GVAR(wpString3) = GVAR(wpString4); + GVAR(wp3) = GVAR(wp4); + GVAR(wpString4) = ""; + GVAR(wp4) = ""; + }; + case 3: { + GVAR(wpString3) = GVAR(wpString4); + GVAR(wp3) = GVAR(wp4); + GVAR(wpString4) = ""; + GVAR(wp4) = ""; + }; + case 4: { + GVAR(wpString4) = ""; + GVAR(wp4) = ""; + }; + }; + GVAR(numWaypoints) = GVAR(numWaypoints) - 1; + GVAR(numSelections) = GVAR(numWaypoints); + GVAR(showDeleting) = true; + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + }; + if (GVAR(busy) && GVAR(showDeleting)) then { + (__dsp displayCtrl __mainText) ctrlSetText "Deleting."; + if (ACE_time - GVAR(busyTimer) > 1) then { + (__dsp displayCtrl __mainText) ctrlSetText "Deleting.."; + }; + if (ACE_time - GVAR(busyTimer) > 1.2) then { + (__dsp displayCtrl __mainText) ctrlSetText "Deleting..."; + }; + if (ACE_time - GVAR(busyTimer) > 1.4) then { + (__dsp displayCtrl __mainText) ctrlSetText "Waypoint Deleted"; + }; + if (ACE_time - GVAR(busyTimer) > 2.9) then { + GVAR(showDeleting) = false; + GVAR(busy) = false; + }; + }; + if (GVAR(F1)) then { + if (GVAR(numWaypoints) == 5) then { + if (!GVAR(busy)) then { + GVAR(showOutOfSpace) = true; + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + } else { + GVAR(digit1) = 0; + GVAR(digit2) = 0; + GVAR(digit3) = 0; + GVAR(digit4) = 0; + GVAR(digit5) = 0; + GVAR(digit6) = 0; + GVAR(digit7) = 0; + GVAR(digit8) = 0; + GVAR(pointer) = 0; + GVAR(add) = true; + }; + }; + if (GVAR(busy) && GVAR(showOutOfSpace)) then { + (__dsp displayCtrl __mainText) ctrlSetText "Out of Space"; + if (ACE_time - GVAR(busyTimer) > 2.5) then { + GVAR(showOutOfSpace) = false; + GVAR(busy) = false; + }; + }; + if (GVAR(F2) && GVAR(numWaypoints) > 0) then { + GVAR(pointer) = 0; + GVAR(edit) = true; + GVAR(add) = false; + switch (GVAR(selection)) do { + case 0: { + GVAR(digit1) = floor (GVAR(wp0) / 10000000); + GVAR(digit2) = floor (GVAR(wp0) / 1000000 - GVAR(digit1) *10); + GVAR(digit3) = floor (GVAR(wp0) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100); + GVAR(digit4) = floor (GVAR(wp0) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); + GVAR(digit5) = floor (GVAR(wp0) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); + GVAR(digit6) = floor (GVAR(wp0) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); + GVAR(digit7) = floor (GVAR(wp0) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit8) = floor (GVAR(wp0) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); + }; + case 1: { + GVAR(digit1) = floor (GVAR(wp1) / 10000000); + GVAR(digit2) = floor (GVAR(wp1) / 1000000 - GVAR(digit1) *10); + GVAR(digit3) = floor (GVAR(wp1) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100); + GVAR(digit4) = floor (GVAR(wp1) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); + GVAR(digit5) = floor (GVAR(wp1) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); + GVAR(digit6) = floor (GVAR(wp1) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); + GVAR(digit7) = floor (GVAR(wp1) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit8) = floor (GVAR(wp1) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); + }; + case 2: { + GVAR(digit1) = floor (GVAR(wp2) / 10000000); + GVAR(digit2) = floor (GVAR(wp2) / 1000000 - GVAR(digit1) *10); + GVAR(digit3) = floor (GVAR(wp2) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100); + GVAR(digit4) = floor (GVAR(wp2) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); + GVAR(digit5) = floor (GVAR(wp2) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); + GVAR(digit6) = floor (GVAR(wp2) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); + GVAR(digit7) = floor (GVAR(wp2) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit8) = floor (GVAR(wp2) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); + }; + case 3: { + GVAR(digit1) = floor (GVAR(wp3) / 10000000); + GVAR(digit2) = floor (GVAR(wp3) / 1000000 - GVAR(digit1) *10); + GVAR(digit3) = floor (GVAR(wp3) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100); + GVAR(digit4) = floor (GVAR(wp3) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); + GVAR(digit5) = floor (GVAR(wp3) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); + GVAR(digit6) = floor (GVAR(wp3) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); + GVAR(digit7) = floor (GVAR(wp3) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit8) = floor (GVAR(wp3) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); + }; + case 4: { + GVAR(digit1) = floor (GVAR(wp4) / 10000000); + GVAR(digit2) = floor (GVAR(wp4) / 1000000 - GVAR(digit1) *10); + GVAR(digit3) = floor (GVAR(wp4) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100); + GVAR(digit4) = floor (GVAR(wp4) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); + GVAR(digit5) = floor (GVAR(wp4) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); + GVAR(digit6) = floor (GVAR(wp4) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); + GVAR(digit7) = floor (GVAR(wp4) / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit8) = floor (GVAR(wp4) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); + }; + }; + }; + } else { + if (!GVAR(busy)) then { + (__dsp displayCtrl __F1) ctrlSetText "Save"; + (__dsp displayCtrl __F2) ctrlSetText "Vector"; + (__dsp displayCtrl __F3) ctrlSetText "Cancel"; + GVAR(output) = str GVAR(digit1) + str GVAR(digit2) + str GVAR(digit3) + str GVAR(digit4) + str GVAR(digit5) + str GVAR(digit6) + str GVAR(digit7) + str GVAR(digit8); + (__dsp displayCtrl __mainText) ctrlSetText GVAR(output); + (__dsp displayCtrl __PSelection1 + GVAR(pointer)) ctrlSetText QUOTE(PATHTOF(UI\DAGR_PSelection.paa)); + }; + if (GVAR(F1)) then { + if (!GVAR(busy)) then { + if (GVAR(add)) then { + switch (GVAR(numWaypoints)) do { + case 0: { GVAR(wpString0) = GVAR(output); GVAR(wp0) = parseNumber GVAR(output); }; + case 1: { GVAR(wpString1) = GVAR(output); GVAR(wp1) = parseNumber GVAR(output); }; + case 2: { GVAR(wpString2) = GVAR(output); GVAR(wp2) = parseNumber GVAR(output); }; + case 3: { GVAR(wpString3) = GVAR(output); GVAR(wp3) = parseNumber GVAR(output); }; + case 4: { GVAR(wpString4) = GVAR(output); GVAR(wp4) = parseNumber GVAR(output); }; + }; + GVAR(numWaypoints) = GVAR(numWaypoints) + 1; + GVAR(numSelections) = GVAR(numWaypoints); + GVAR(selection) = 0; + }; + if (GVAR(edit)) then { + switch (GVAR(selection)) do { + case 0: { GVAR(wpString0) = GVAR(output); GVAR(wp0) = parseNumber GVAR(output); }; + case 1: { GVAR(wpString1) = GVAR(output); GVAR(wp1) = parseNumber GVAR(output); }; + case 2: { GVAR(wpString2) = GVAR(output); GVAR(wp2) = parseNumber GVAR(output); }; + case 3: { GVAR(wpString3) = GVAR(output); GVAR(wp3) = parseNumber GVAR(output); }; + case 4: { GVAR(wpString4) = GVAR(output); GVAR(wp4) = parseNumber GVAR(output); }; + }; + }; + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + (__dsp displayCtrl __F1) ctrlSetText ""; + (__dsp displayCtrl __F2) ctrlSetText ""; + (__dsp displayCtrl __F3) ctrlSetText ""; + (__dsp displayCtrl __mainText) ctrlSetText "Saving."; + if (ACE_time - GVAR(busyTimer) > 1) then { + (__dsp displayCtrl __mainText) ctrlSetText "Saving.."; + }; + if (ACE_time - GVAR(busyTimer) > 1.2) then { + (__dsp displayCtrl __mainText) ctrlSetText "Saving..."; + }; + if (ACE_time - GVAR(busyTimer) > 1.4) then { + (__dsp displayCtrl __mainText) ctrlSetText "Waypoint Saved"; + }; + if (ACE_time - GVAR(busyTimer) > 2.9) then { + GVAR(edit) = false; + GVAR(add) = false; + GVAR(busy) = false; + }; + }; + if (GVAR(F2)) then { + private ["_grid", "_gridVector"]; + _grid = toArray GVAR(vectorGrid); + _grid deleteAt 4; + _grid = toString _grid; + _gridVector = parseNumber _grid; + GVAR(digit1) = floor(_gridVector / 10000000); + GVAR(digit2) = floor(_gridVector / 1000000 - GVAR(digit1) *10); + GVAR(digit3) = floor(_gridVector / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100); + GVAR(digit4) = floor(_gridVector / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000); + GVAR(digit5) = floor(_gridVector / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000); + GVAR(digit6) = floor(_gridVector / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000); + GVAR(digit7) = floor(_gridVector / 10- GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000); + GVAR(digit8) = floor(_gridVector - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000); + }; + if (GVAR(F3)) then { + if (!GVAR(busy)) then { + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + } else { + (__dsp displayCtrl __F1) ctrlSetText "Save"; + (__dsp displayCtrl __F2) ctrlSetText "Vector"; + (__dsp displayCtrl __F3) ctrlSetText "Cancel"; + GVAR(output) = str GVAR(digit1) + str GVAR(digit2) + str GVAR(digit3) + str GVAR(digit4) + str GVAR(digit5) + str GVAR(digit6) + str GVAR(digit7) + str GVAR(digit8); + (__dsp displayCtrl __mainText) ctrlSetText GVAR(output); + }; + if (ACE_time - GVAR(busyTimer) > 0.1) then { + GVAR(add) = false; + GVAR(edit) = false; + GVAR(busy) = false; + }; + }; + if (GVAR(UP)) then { + switch (GVAR(pointer) + 1) do { + case 1: { GVAR(digit1) = (10 + GVAR(digit1) + 1) % 10 }; + case 2: { GVAR(digit2) = (10 + GVAR(digit2) + 1) % 10 }; + case 3: { GVAR(digit3) = (10 + GVAR(digit3) + 1) % 10 }; + case 4: { GVAR(digit4) = (10 + GVAR(digit4) + 1) % 10 }; + case 5: { GVAR(digit5) = (10 + GVAR(digit5) + 1) % 10 }; + case 6: { GVAR(digit6) = (10 + GVAR(digit6) + 1) % 10 }; + case 7: { GVAR(digit7) = (10 + GVAR(digit7) + 1) % 10 }; + case 8: { GVAR(digit8) = (10 + GVAR(digit8) + 1) % 10 }; + }; + }; + if (GVAR(DOWN)) then { + switch (GVAR(pointer) + 1) do { + case 1: { GVAR(digit1) = (10 + GVAR(digit1) - 1) % 10 }; + case 2: { GVAR(digit2) = (10 + GVAR(digit2) - 1) % 10 }; + case 3: { GVAR(digit3) = (10 + GVAR(digit3) - 1) % 10 }; + case 4: { GVAR(digit4) = (10 + GVAR(digit4) - 1) % 10 }; + case 5: { GVAR(digit5) = (10 + GVAR(digit5) - 1) % 10 }; + case 6: { GVAR(digit6) = (10 + GVAR(digit6) - 1) % 10 }; + case 7: { GVAR(digit7) = (10 + GVAR(digit7) - 1) % 10 }; + case 8: { GVAR(digit8) = (10 + GVAR(digit8) - 1) % 10 }; + }; + }; + }; + }; + case "connect": { + if (!GVAR(busy)) then { + (__dsp displayCtrl __Option0) ctrlSetText "Vector 21"; + (__dsp displayCtrl __Selection0) ctrlSetText QUOTE(PATHTOF(UI\DAGR_Selection.paa)); + }; + if (GVAR(SEL)) then { + if (!GVAR(busy)) then { + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + (__dsp displayCtrl __mainText) ctrlSetText "Connecting."; + if (ACE_time - GVAR(busyTimer) > 0.2) then { + (__dsp displayCtrl __mainText) ctrlSetText "Connecting.."; + }; + if (ACE_time - GVAR(busyTimer) > 0.4) then { + (__dsp displayCtrl __mainText) ctrlSetText "Connecting..."; + }; + if (ACE_time - GVAR(busyTimer) > 0.6) then { + if (ACE_player hasWeapon "ACE_Vector") then { + GVAR(displaySelection) = "VECTOR"; + (__dsp displayCtrl __mainText) ctrlSetText "Vector Connected"; + GVAR(vectorConnected) = true; + } else { + (__dsp displayCtrl __mainText) ctrlSetText "No Device Found"; + GVAR(vectorConnected) = false; + }; + }; + if (ACE_time - GVAR(busyTimer) > 3.1) then { + GVAR(busy) = false; + if (GVAR(vectorConnected)) then { + GVAR(menu) = "main"; GVAR(numSelections) = 5; + }; + }; + }; + }; + case "options": { + (__dsp displayCtrl __Option0) ctrlSetText "Signal Delay"; + (__dsp displayCtrl __Option1) ctrlSetText (if (GVAR(useDegrees)) then { "Direction: Deg" } else { "Direction: MIL" }); + (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QUOTE(PATHTOF(UI\DAGR_Selection.paa)); + if (GVAR(SEL)) then { + GVAR(vectorConnected) = false; + switch (GVAR(selection)) do { + case 0: { GVAR(menu) = "update_rate"; GVAR(numSelections) = 1; GVAR(tmpUpdateRate) = GVAR(updateInterval); }; + case 1: { GVAR(useDegrees) = !GVAR(useDegrees); }; + }; + } + }; + case "update_rate": { + if (GVAR(F1)) then { + GVAR(updateInterval) = GVAR(tmpUpdateRate); + if (!GVAR(busy)) then { + GVAR(busy) = true; + GVAR(busyTimer) = ACE_time; + }; + (__dsp displayCtrl __mainText) ctrlSetText "Updating."; + if (ACE_time - GVAR(busyTimer) > 0.2) then { + (__dsp displayCtrl __mainText) ctrlSetText "Updating.."; + }; + if (ACE_time - GVAR(busyTimer) > 0.4) then { + (__dsp displayCtrl __mainText) ctrlSetText "Updating..."; + }; + if (ACE_time - GVAR(busyTimer) > 0.6) then { + (__dsp displayCtrl __mainText) ctrlSetText "Update Success"; + }; + if (ACE_time - GVAR(busyTimer) > 2.1) then { + GVAR(busy) = false; + GVAR(menu) = "options"; GVAR(numSelections) = 2; + }; + }; + if (GVAR(F3)) then { + GVAR(menu) = "options"; GVAR(numSelections) = 2; + }; + if (GVAR(DOWN)) then { + GVAR(tmpUpdateRate) = GVAR(tmpUpdateRate) - 0.1; + }; + if (GVAR(UP)) then { + GVAR(tmpUpdateRate) = GVAR(tmpUpdateRate) + 0.1; + }; + GVAR(tmpUpdateRate) = 0.1 max GVAR(tmpUpdateRate) min 2.0; + if (!GVAR(busy)) then { + (__dsp displayCtrl __mainText) ctrlSetText (Str(GVAR(tmpUpdateRate) * 1000) + "ms"); + (__dsp displayCtrl __F1) ctrlSetText "Save"; + (__dsp displayCtrl __F3) ctrlSetText "Cancel"; + }; + }; + }; + + if (!GVAR(busy)) then { + GVAR(F3) = false; + GVAR(F2) = false; + GVAR(F1) = false; + GVAR(MENU_B) = false; + GVAR(SEL) = false; + DAGR_NEXT = false; + GVAR(RIGHT) = false; + GVAR(LEFT) = false; + GVAR(UP) = false; + GVAR(DOWN) = false; + GVAR(PWR) = false; + }; +}, 0, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/dagr/functions/fnc_outputData.sqf b/addons/dagr/functions/fnc_outputData.sqf new file mode 100644 index 0000000000..ff7429fa0a --- /dev/null +++ b/addons/dagr/functions/fnc_outputData.sqf @@ -0,0 +1,120 @@ +/* + * Author: Rosuto + * DAGR data output loop + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +135471 cutRsc ["DAGR_DISPLAY", "plain down"]; + +#define __display (uiNameSpace getVariable "DAGR_DISPLAY") + +#define __gridControl (__display displayCtrl 266851) +#define __speedControl (__display displayCtrl 266852) +#define __elevationControl (__display displayCtrl 266853) +#define __headingControl (__display displayCtrl 266854) +#define __timeControl (__display displayCtrl 266855) +#define __background (__display displayCtrl 266856) + +__background ctrlSetText QUOTE(PATHTOF(UI\dagr_gps.paa)); + +if (GVAR(outputPFH) != -1) exitWith {}; + +GVAR(outputPFH) = [{ + private ["_pos", "_mapSize", "_gridConfig", "_offsetX", "_offsetY", "_stepX", "_stepY", "_xgrid", "_ygrid", "_xcoord", "_ycoord", "_speed", "_dagrHeading", "_dagrGrid", "_dagrElevation", "_dagrSpeed", "_dagrTime", "_elevation"]; + + // Abort Condition + if !(GVAR(run) && [ACE_player, "ACE_DAGR"] call EFUNC(common,hasItem)) exitWith { + GVAR(outputPFH) = -1; + 135471 cutText ["", "PLAIN"]; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + + // GRID + _pos = getPosASL ACE_player; + + _mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"); + _gridConfig = (configFile >> "CfgWorlds" >> worldName >> "Grid"); + _offsetX = getNumber (_gridConfig >> "offsetX"); + _offsetY = getNumber (_gridConfig >> "offsetY"); + _stepX = getNumber (_gridConfig >> "Zoom1" >> "stepX"); + _stepY = getNumber (_gridConfig >> "Zoom1" >> "stepY"); + + if (_stepY >= 0) then { + _pos set [1, (_mapSize - 100) - (_pos select 1) - _offsetY]; + }; + + // Incase grids go neg due to 99-00 boundry + if (_pos select 0 < 0) then {_pos set [0, (_pos select 0) + 99999];}; + if (_pos select 1 < 0) then {_pos set [1, (_pos select 1) + 99999];}; + + _xGrid = toArray Str(round(_pos select 0)); + while {count _xGrid < 5} do { + _xGrid = [48] + _xGrid; + }; + _xGrid resize 4; + _xGrid = toString _xGrid; + _xGrid = parseNumber _xGrid; + + _yGrid = toArray Str(round(_pos select 1)); + while {count _yGrid < 5} do { + _yGrid = [48] + _yGrid; + }; + _yGrid resize 4; + _yGrid = toString _yGrid; + _yGrid = parseNumber _yGrid; + + _xCoord = switch true do { + case (_xGrid >= 1000): { "" + Str(_xGrid) }; + case (_xGrid >= 100): { "0" + Str(_xGrid) }; + case (_xGrid >= 10): { "00" + Str(_xGrid) }; + default { "000" + Str(_xGrid) }; + }; + + _yCoord = switch true do { + case (_yGrid >= 1000): { "" + Str(_yGrid) }; + case (_yGrid >= 100): { "0" + Str(_yGrid) }; + case (_yGrid >= 10): { "00" + Str(_yGrid) }; + default { "000" + Str(_yGrid) }; + }; + + _dagrGrid = _xcoord + " " + _ycoord; + + // SPEED + _speed = speed (vehicle ACE_player); + _speed = floor (_speed * 10) / 10; + _speed = abs(_speed); + _dagrspeed = str _speed + "kph"; + + // Elevation + _elevation = getPosASL ACE_player; + _elevation = floor ((_elevation select 2) + EGVAR(weather,altitude)); + _dagrElevation = str _elevation + "m"; + + // Heading + _dagrHeading = if (!GVAR(useDegrees)) then { + floor (DEG_TO_MIL(direction (vehicle ACE_player))) + } else { + floor (direction (vehicle ACE_player)) + }; + + // Time + _dagrTime = [daytime, "HH:MM"] call bis_fnc_timeToString; + + // Output + __gridControl ctrlSetText format ["%1", _dagrGrid]; + __speedControl ctrlSetText format ["%1", _dagrSpeed]; + __elevationControl ctrlSetText format ["%1", _dagrElevation]; + __headingControl ctrlSetText (if (!GVAR(useDegrees)) then { format ["%1", _dagrHeading] } else { format ["%1 ", _dagrHeading] }); + __timeControl ctrlSetText format ["%1", _dagrTime]; + +}, GVAR(updateInterval), []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/dagr/functions/fnc_outputVector.sqf b/addons/dagr/functions/fnc_outputVector.sqf new file mode 100644 index 0000000000..660e678a82 --- /dev/null +++ b/addons/dagr/functions/fnc_outputVector.sqf @@ -0,0 +1,98 @@ +/* + * Author: Rosuto + * DAGR vector output loop + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +private ["_pos", "_xGrid", "_yGrid", "_dagrGrid", "_bearing", "_dagrDist", "_dagrElevation", "_dagrTime", "_elevation", "_xCoord", "_yCoord"]; + +135471 cutRsc ["DAGR_DISPLAY", "plain down"]; + +#define __display (uiNameSpace getVariable "DAGR_DISPLAY") + +#define __gridControl (__display displayCtrl 266851) +#define __speedControl (__display displayCtrl 266858) +#define __elevationControl (__display displayCtrl 266853) +#define __headingControl (__display displayCtrl 266854) +#define __timeControl (__display displayCtrl 266855) +#define __background (__display displayCtrl 266856) + +__background ctrlSetText QUOTE(PATHTOF(UI\dagr_vector.paa)); + +if (GVAR(noVectorData)) exitwith {}; + +_pos = [GVAR(LAZPOS) select 0, GVAR(LAZPOS) select 1]; + +// Incase grids go neg due to 99-00 boundry +if (_pos select 0 < 0) then {_pos set [0, (_pos select 0) + 99999];}; +if (_pos select 1 < 0) then {_pos set [1, (_pos select 1) + 99999];}; + +// Find laser position +_xGrid = toArray Str(round(_pos select 0)); + +while {count _xGrid < 5} do { + _xGrid = [48] + _xGrid; +}; +_xGrid resize 4; +_xGrid = toString _xGrid; +_xGrid = parseNumber _xGrid; + +_yGrid = toArray Str(round(_pos select 1)); +while {count _yGrid < 5} do { + _yGrid = [48] + _yGrid; +}; +_yGrid resize 4; +_yGrid = toString _yGrid; +_yGrid = parseNumber _yGrid; + +_xCoord = switch true do { + case (_xGrid >= 1000): { "" + Str(_xGrid) }; + case (_xGrid >= 100): { "0" + Str(_xGrid) }; + case (_xGrid >= 10): { "00" + Str(_xGrid) }; + default { "000" + Str(_xGrid) }; +}; + +_yCoord = switch true do { + case (_yGrid >= 1000): { "" + Str(_yGrid) }; + case (_yGrid >= 100): { "0" + Str(_yGrid) }; + case (_yGrid >= 10): { "00" + Str(_yGrid) }; + default { "000" + Str(_yGrid) }; +}; + +_dagrGrid = _xCoord + " " + _yCoord; + +// Find target elevation +_elevation = floor ((GVAR(LAZPOS) select 2) + EGVAR(weather,altitude)); +_dagrElevation = str _elevation + "m"; + +// Time +_dagrTime = [daytime, "HH:MM"] call bis_fnc_timeToString; + +// Bearing +_bearing = GVAR(LAZHEADING); +if (_bearing >= 360) then {_bearing = _bearing - 360;}; +if (!GVAR(useDegrees)) then {_bearing = DEG_TO_MIL(_bearing)}; +_bearing = floor (_bearing); + +// Distance +_dagrDist = str GVAR(LAZDIST) + "m"; + +// Put grid into variable so DAGR menu can access it +GVAR(vectorGrid) = _dagrGrid; + +// OUTPUT +__gridControl ctrlSetText format ["%1", _dagrGrid]; +__speedControl ctrlSetText format ["%1", _dagrDist]; +__elevationControl ctrlSetText format ["%1", _dagrElevation]; +__headingControl ctrlSetText (if (!GVAR(useDegrees)) then { format ["%1", _bearing] } else { format ["%1", _bearing] }); +__timeControl ctrlSetText format ["%1", _dagrTime]; diff --git a/addons/dagr/functions/fnc_outputWP.sqf b/addons/dagr/functions/fnc_outputWP.sqf new file mode 100644 index 0000000000..d1fc2a47f2 --- /dev/null +++ b/addons/dagr/functions/fnc_outputWP.sqf @@ -0,0 +1,136 @@ +/* + * Author: Rosuto + * DAGR waypoint output loop + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +135471 cutRsc ["DAGR_DISPLAY", "plain down"]; + +#define __display (uiNameSpace getVariable "DAGR_DISPLAY") + +#define __gridControl (__display displayCtrl 266851) +#define __speedControl (__display displayCtrl 266858) +#define __elevationControl (__display displayCtrl 266857) +#define __headingControl (__display displayCtrl 266854) +#define __timeControl (__display displayCtrl 266859) +#define __background (__display displayCtrl 266856) + +__background ctrlSetText QUOTE(PATHTOF(UI\dagr_wp.paa)); + +if (GVAR(outputPFH) != -1) exitWith {}; + +GVAR(outputPFH) = [{ + private ["_pos", "_mapSize", "_gridConfig", "_offsetX", "_offsetY", "_stepX", "_stepY", "_xGrid", "_yGrid", "_xCoord", "_yCoord", "_dagrHeading", "_dagrGrid", "_bearing", "_MYpos", "_WPpos", "_dagrDistance", "_distance"]; + + // Abort Condition + if !(GVAR(run) && [ACE_player, "ACE_DAGR"] call EFUNC(common,hasItem)) exitWith { + GVAR(outputPFH) = -1; + 135471 cutText ["", "PLAIN"]; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + + // GRID + _pos = getPosASL ACE_player; + + _mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"); + _gridConfig = (configFile >> "CfgWorlds" >> worldName >> "Grid"); + _offsetX = getNumber (_gridConfig >> "offsetX"); + _offsetY = getNumber (_gridConfig >> "offsetY"); + _stepX = getNumber (_gridConfig >> "Zoom1" >> "stepX"); + _stepY = getNumber (_gridConfig >> "Zoom1" >> "stepY"); + + if (_stepY >= 0) then { + _pos set [1, (_mapSize - 100) - (_pos select 1) - _offsetY]; + }; + + // Incase grids go neg due to 99-00 boundry + if (_pos select 0 < 0) then {_pos set [0, (_pos select 0) + 99999];}; + if (_pos select 1 < 0) then {_pos set [1, (_pos select 1) + 99999];}; + + _xGrid = toArray Str(round(_pos select 0)); + while {count _xGrid < 5} do { + _xGrid = [48] + _xGrid; + }; + _xGrid resize 4; + _xGrid = toString _xGrid; + _xGrid = parseNumber _xGrid; + + _yGrid = toArray Str(round(_pos select 1)); + while {count _yGrid < 5} do { + _yGrid = [48] + _yGrid; + }; + _yGrid resize 4; + _yGrid = toString _yGrid; + _yGrid = parseNumber _yGrid; + + _xCoord = switch true do { + case (_xGrid >= 1000): { "" + Str(_xGrid) }; + case (_xGrid >= 100): { "0" + Str(_xGrid) }; + case (_xGrid >= 10): { "00" + Str(_xGrid) }; + default { "000" + Str(_xGrid) }; + }; + + _yCoord = switch true do { + case (_yGrid >= 1000): { "" + Str(_yGrid) }; + case (_yGrid >= 100): { "0" + Str(_yGrid) }; + case (_yGrid >= 10): { "00" + Str(_yGrid) }; + default { "000" + Str(_yGrid) }; + }; + + _dagrGrid = _xCoord + " " + _yCoord; + + // WP Grid + _xGrid2 = floor (DAGR_WP_INFO / 10000); + _yGrid2 = DAGR_WP_INFO - _xGrid2 * 10000; + + _xCoord2 = switch true do { + case (_xGrid2 >= 1000): { "" + Str(_xGrid2) }; + case (_xGrid2 >= 100): { "0" + Str(_xGrid2) }; + case (_xGrid2 >= 10): { "00" + Str(_xGrid2) }; + default { "000" + Str(_xGrid2) }; + }; + + _yCoord2 = switch true do { + case (_yGrid2 >= 1000): { "" + Str(_yGrid2) }; + case (_yGrid2 >= 100): { "0" + Str(_yGrid2) }; + case (_yGrid2 >= 10): { "00" + Str(_yGrid2) }; + default { "000" + Str(_yGrid2) }; + }; + + _dagrGrid2 = _xCoord2 + " " + _yCoord2; + + // Distance + _WPpos = [[_xCoord2, _yCoord2], true] call CBA_fnc_mapGridToPos; + _MYpos = [[_xCoord, _yCoord], true] call CBA_fnc_mapGridToPos; + _distance = _MYpos distance _WPpos; + _distance = floor (_distance * 10) / 10; + _dagrDistance = str _distance + "m"; + + // Heading + _dagrHeading = floor (if (GVAR(useDegrees)) then { + direction (vehicle ACE_player) + } else { + DEG_TO_MIL(direction (vehicle ACE_player)) + }); + + // WP Heading + _bearing = floor ((_WPpos vectorDiff _MYpos) call CBA_fnc_vectDir); + + // Output + __gridControl ctrlSetText format ["%1", _dagrGrid]; + __speedControl ctrlSetText format ["%1", _bearing]; + __elevationControl ctrlSetText format ["%1", _dagrGrid2]; + __headingControl ctrlSetText (if (!GVAR(useDegrees)) then { format ["%1", _dagrHeading] } else { format ["%1", _dagrHeading] }); + __timeControl ctrlSetText format ["%1", _dagrDistance]; + +}, GVAR(updateInterval), []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/dagr/functions/fnc_toggleOverlay.sqf b/addons/dagr/functions/fnc_toggleOverlay.sqf new file mode 100644 index 0000000000..1fcb87d0ff --- /dev/null +++ b/addons/dagr/functions/fnc_toggleOverlay.sqf @@ -0,0 +1,54 @@ +/* + * Author: Rosuto, Ruthberg + * Toggles the DAGR overlay + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(run) = !GVAR(run); + +if (GVAR(run)) then { + if (GVAR(menuRun) && dialog) then { + GVAR(menuRun) = false; + closeDialog 0; + }; + GVAR(hidden) = true; + [{ + EXPLODE_1_PVT(_this select 0,_vehicle); + if (!GVAR(run) || (!alive ACE_player) || (vehicle ACE_player != _vehicle)) exitWith { + GVAR(run) = false; + 135471 cutText ["", "PLAIN"]; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + if (cameraView == "GUNNER") then { + if (!GVAR(hidden)) then { + GVAR(hidden) = true; + 135471 cutText ["", "PLAIN"]; + }; + } else { + if (GVAR(hidden)) then { + GVAR(hidden) = false; + switch (toUpper GVAR(displaySelection)) do { + case "WP" : { + call FUNC(outputWP); + }; + case "VECTOR" : { + call FUNC(outputVector); + }; + case "DATA" : { + call FUNC(outputData); + }; + }; + }; + }; + }, 0.1, [vehicle ACE_player]] call CBA_fnc_addPerFrameHandler; +}; diff --git a/addons/dagr/functions/script_component.hpp b/addons/dagr/functions/script_component.hpp new file mode 100644 index 0000000000..18b02deaee --- /dev/null +++ b/addons/dagr/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\dagr\script_component.hpp" \ No newline at end of file diff --git a/addons/dagr/initKeybinds.sqf b/addons/dagr/initKeybinds.sqf new file mode 100644 index 0000000000..4575401feb --- /dev/null +++ b/addons/dagr/initKeybinds.sqf @@ -0,0 +1,59 @@ + +["ACE3 Equipment", QGVAR(MenuKey), "Configure DAGR", +{ + // Conditions: canInteract + if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, "ACE_DAGR"] call EFUNC(common,hasItem)) exitWith {false}; + + // Statement + if (!GVAR(menuRun)) then { + [] call FUNC(menuInit); + } else { + GVAR(PWR) = true; // Simulate pressing the power button + }; + true +}, +{false}, +[0, [false, true, false]], false] call cba_fnc_addKeybind; // (empty default key) + +["ACE3 Equipment", QGVAR(ToggleKey), "Toggle DAGR", +{ + // Conditions: canInteract + if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, "ACE_DAGR"] call EFUNC(common,hasItem)) exitWith {false}; + + // Statement + [] call FUNC(toggleOverlay); + true +}, +{false}, +[0, [false, false, false]], false] call cba_fnc_addKeybind; // (empty default key) + +//Add deviceKey entry: +private ["_conditonCode", "_toggleCode", "_closeCode"]; +_conditonCode = { + ([ACE_player, "ACE_DAGR"] call EFUNC(common,hasItem)); +}; +_toggleCode = { + // Conditions: canInteract + if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {}; + + // Statement + [] call FUNC(toggleOverlay); + if (!GVAR(run)) then { + [] call FUNC(menuInit); + }; +}; +_closeCode = { + // Statement + if (GVAR(run)) then { + //If dispaly is open, close it: + [] call FUNC(toggleOverlay); + }; + if (dialog && GVAR(menuRun)) then { + //If dialog is open, close it: + GVAR(menuRun) = false; + closeDialog 0; + }; +}; +["DAGR", QUOTE(PATHTOF(UI\DAGR_Icon.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); diff --git a/addons/dagr/script_component.hpp b/addons/dagr/script_component.hpp new file mode 100644 index 0000000000..f7a723e533 --- /dev/null +++ b/addons/dagr/script_component.hpp @@ -0,0 +1,15 @@ +#define COMPONENT dagr +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_DAGR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_DAGR + #define DEBUG_SETTINGS DEBUG_SETTINGS_DAGR +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define DEG_TO_MIL(d) (d / 360 * 6400) +#define MIL_TO_DEG(d) (d / 6400 * 360) diff --git a/addons/dagr/stringtable.xml b/addons/dagr/stringtable.xml new file mode 100644 index 0000000000..7da844d614 --- /dev/null +++ b/addons/dagr/stringtable.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/addons/disarming/CfgVehicles.hpp b/addons/disarming/CfgVehicles.hpp index 381aaed93e..b4a1a4c7dd 100644 --- a/addons/disarming/CfgVehicles.hpp +++ b/addons/disarming/CfgVehicles.hpp @@ -4,7 +4,7 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { class ACE_DisarmInventory { - displayName = "$STR_ACE_Disarming_OpenInventory"; + displayName = CSTRING(OpenInventory); distance = 3.5; condition = QUOTE([ARR_2(_player,_target)] call FUNC(canPlayerDisarmUnit)); statement = QUOTE([ARR_2(_player,_target)] call FUNC(openDisarmDialog)); diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index bc9abbf127..5422fd00a6 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -64,11 +64,11 @@ if (isNull _holder) then { if (isNull _holder) exitWith { [_caller, _target, "Debug: Null Holder"] call FUNC(eventTargetFinish); }; -//Make sure only one drop operation at a time (using PFEH system as a queue) +//Make sure only one drop operation at a ACE_time (using PFEH system as a queue) if (_holder getVariable [QGVAR(holderInUse), false]) exitWith { [{ _this call FUNC(disarmDropItems); - }, _this, 0, 0] call EFUNC(common,waitAndExecute); + }, _this] call EFUNC(common,execNextFrame); }; _holder setVariable [QGVAR(holderInUse), true]; @@ -178,7 +178,7 @@ if (_holderIsEmpty) then { _needToRemoveVest = ((vest _target) != "") && {(vest _target) in _listOfItemsToRemove}; _needToRemoveUniform = ((uniform _target) != "") && {(uniform _target) in _listOfItemsToRemove}; - if ((time < _maxWaitTime) && {[_target] call FUNC(canBeDisarmed)} && {_needToRemoveWeapon || _needToRemoveMagazines || _needToRemoveBackpack}) then { + if ((ACE_time < _maxWaitTime) && {[_target] call FUNC(canBeDisarmed)} && {_needToRemoveWeapon || _needToRemoveMagazines || _needToRemoveBackpack}) then { //action drop weapons (keeps loaded magazine and attachements) { if (_x in _listOfItemsToRemove) then { @@ -234,7 +234,7 @@ if (_holderIsEmpty) then { clearItemCargoGlobal _holder; }; //Verify we didn't timeout waiting on drop action - if (time >= _maxWaitTime) exitWith { + if (ACE_time >= _maxWaitTime) exitWith { _holder setVariable [QGVAR(holderInUse), false]; [_caller, _target, "Debug: Drop Actions Timeout"] call FUNC(eventTargetFinish); }; @@ -264,4 +264,4 @@ if (_holderIsEmpty) then { [_caller, _target, ""] call FUNC(eventTargetFinish); }; -}, 0.0, [_caller,_target, _listOfItemsToRemove, _holder, _holderIsEmpty, (time + TIME_MAX_WAIT), _doNotDropAmmo, _targetMagazinesEnd]] call CBA_fnc_addPerFrameHandler; +}, 0.0, [_caller,_target, _listOfItemsToRemove, _holder, _holderIsEmpty, (ACE_time + TIME_MAX_WAIT), _doNotDropAmmo, _targetMagazinesEnd]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/disarming/functions/fnc_eventCallerFinish.sqf b/addons/disarming/functions/fnc_eventCallerFinish.sqf index c87cb434b3..d95be98d5f 100644 --- a/addons/disarming/functions/fnc_eventCallerFinish.sqf +++ b/addons/disarming/functions/fnc_eventCallerFinish.sqf @@ -22,4 +22,4 @@ PARAMS_3(_caller,_target,_errorMsg); if (_caller != ACE_player) exitWith {}; systemChat format ["Debug-Caller: Disarm finished from [%1] with code [%2]", _target, _errorMsg]; -diag_log text format ["[ACE_Disarming] %1 - eventCallerFinish: %2", time, _this]; +diag_log text format ["[ACE_Disarming] %1 - eventCallerFinish: %2", ACE_time, _this]; diff --git a/addons/disarming/functions/fnc_eventTargetFinish.sqf b/addons/disarming/functions/fnc_eventTargetFinish.sqf index 8cc67fa486..d702a554a5 100644 --- a/addons/disarming/functions/fnc_eventTargetFinish.sqf +++ b/addons/disarming/functions/fnc_eventTargetFinish.sqf @@ -21,6 +21,6 @@ PARAMS_3(_caller,_target,_errorMsg); if (_errorMsg != "") then { - diag_log text format ["[ACE_Disarming] %1 - eventTargetFinish: %2", time, _this]; + diag_log text format ["[ACE_Disarming] %1 - eventTargetFinish: %2", ACE_time, _this]; ["DisarmDebugCallback", [_caller], [_caller, _target, _errorMsg]] call EFUNC(common,targetEvent); }; diff --git a/addons/disposable/CfgMagazines.hpp b/addons/disposable/CfgMagazines.hpp index 6265c06f50..484fa36238 100644 --- a/addons/disposable/CfgMagazines.hpp +++ b/addons/disposable/CfgMagazines.hpp @@ -1,10 +1,10 @@ class CfgMagazines { class NLAW_F; class ACE_PreloadedMissileDummy: NLAW_F { // The dummy magazine - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 1; scopeArsenal = 1; - displayName = "$STR_ACE_Disposable_PreloadedMissileDummy"; + displayName = CSTRING(PreloadedMissileDummy); picture = PATHTOEF(common,UI\blank_CO.paa); weaponPoolAvailable = 0; mass = 0; @@ -13,9 +13,9 @@ class CfgMagazines { count = 0; }; class ACE_UsedTube_F: NLAW_F { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Disposable_UsedTube"; - descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(UsedTube); + descriptionShort = CSTRING(UsedTubeDescription); displayNameShort = "-"; count = 0; weaponPoolAvailable = 0; diff --git a/addons/disposable/CfgWeapons.hpp b/addons/disposable/CfgWeapons.hpp index 965d97521c..0ca6763d63 100644 --- a/addons/disposable/CfgWeapons.hpp +++ b/addons/disposable/CfgWeapons.hpp @@ -7,9 +7,9 @@ class CfgWeapons { class ACE_launch_NLAW_Used_F: launch_NLAW_F { // the used tube should be a sub class of the disposable launcher scope = 1; ACE_isUsedLauncher = 1; - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Disposable_UsedTube"; - descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(UsedTube); + descriptionShort = CSTRING(UsedTubeDescription); magazines[] = {"ACE_FiredMissileDummy"}; // This will disable the used launcher class from being fired again. //picture = ""; @todo //model = ""; @todo diff --git a/addons/disposable/script_component.hpp b/addons/disposable/script_component.hpp index 375e44147d..af1f17bd86 100644 --- a/addons/disposable/script_component.hpp +++ b/addons/disposable/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT disposable -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_ATTACH #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_ATTACH #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/dragging/functions/fnc_carryObject.sqf b/addons/dragging/functions/fnc_carryObject.sqf index ee72dc9aa7..bb413d8240 100644 --- a/addons/dragging/functions/fnc_carryObject.sqf +++ b/addons/dragging/functions/fnc_carryObject.sqf @@ -58,7 +58,7 @@ if (_actionID != -1) then { }; _actionID = _unit addAction [ - format ["%1", localize "STR_ACE_Dragging_Drop"], + format ["%1", localize LSTRING(Drop)], QUOTE([ARR_2(_this select 0, (_this select 0) getVariable [ARR_2(QUOTE(QGVAR(carriedObject)),objNull)])] call FUNC(dropObject_carry)), nil, 20, diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf index f3a9329d35..3ad1f89f77 100644 --- a/addons/dragging/functions/fnc_carryObjectPFH.sqf +++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING - systemChat format ["%1 carryObjectPFH running", time]; + systemChat format ["%1 carryObjectPFH running", ACE_time]; #endif private ["_unit", "_target"]; diff --git a/addons/dragging/functions/fnc_dragObject.sqf b/addons/dragging/functions/fnc_dragObject.sqf index 35f8687ed0..e4b200c4dd 100644 --- a/addons/dragging/functions/fnc_dragObject.sqf +++ b/addons/dragging/functions/fnc_dragObject.sqf @@ -49,7 +49,7 @@ if (_actionID != -1) then { }; _actionID = _unit addAction [ - format ["%1", localize "STR_ACE_Dragging_Drop"], + format ["%1", localize LSTRING(Drop)], QUOTE([ARR_2(_this select 0, (_this select 0) getVariable [ARR_2(QUOTE(QGVAR(draggedObject)),objNull)])] call FUNC(dropObject)), nil, 20, diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf index 8af8e62b90..465107af39 100644 --- a/addons/dragging/functions/fnc_dragObjectPFH.sqf +++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING - systemChat format ["%1 dragObjectPFH running", time]; + systemChat format ["%1 dragObjectPFH running", ACE_time]; #endif private ["_unit", "_target"]; diff --git a/addons/dragging/functions/fnc_setCarryable.sqf b/addons/dragging/functions/fnc_setCarryable.sqf index 2a10ca4897..52c6e5643a 100644 --- a/addons/dragging/functions/fnc_setCarryable.sqf +++ b/addons/dragging/functions/fnc_setCarryable.sqf @@ -49,8 +49,8 @@ if (_type in _initializedClasses) exitWith {}; _initializedClasses pushBack _type; GVAR(initializedClasses_carry) = _initializedClasses; -_carryAction = [QGVAR(carry), localize "STR_ACE_Dragging_Carry", "", {[_player, _target] call FUNC(startCarry)}, {[_player, _target] call FUNC(canCarry)}] call EFUNC(interact_menu,createAction); -_dropAction = [QGVAR(drop_carry), localize "STR_ACE_Dragging_Drop", "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}] call EFUNC(interact_menu,createAction); +_carryAction = [QGVAR(carry), localize LSTRING(Carry), "", {[_player, _target] call FUNC(startCarry)}, {[_player, _target] call FUNC(canCarry)}] call EFUNC(interact_menu,createAction); +_dropAction = [QGVAR(drop_carry), localize LSTRING(Drop), "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}] call EFUNC(interact_menu,createAction); [_type, 0, ["ACE_MainActions"], _carryAction] call EFUNC(interact_menu,addActionToClass); [_type, 0, [], _dropAction] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/dragging/functions/fnc_setDraggable.sqf b/addons/dragging/functions/fnc_setDraggable.sqf index 5a42f4e439..7745bd2d3e 100644 --- a/addons/dragging/functions/fnc_setDraggable.sqf +++ b/addons/dragging/functions/fnc_setDraggable.sqf @@ -49,8 +49,8 @@ if (_type in _initializedClasses) exitWith {}; _initializedClasses pushBack _type; GVAR(initializedClasses) = _initializedClasses; -_dragAction = [QGVAR(drag), localize "STR_ACE_Dragging_Drag", "", {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}] call EFUNC(interact_menu,createAction); -_dropAction = [QGVAR(drop), localize "STR_ACE_Dragging_Drop", "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}] call EFUNC(interact_menu,createAction); +_dragAction = [QGVAR(drag), localize LSTRING(Drag), "", {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}] call EFUNC(interact_menu,createAction); +_dropAction = [QGVAR(drop), localize LSTRING(Drop), "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}] call EFUNC(interact_menu,createAction); [_type, 0, ["ACE_MainActions"], _dragAction] call EFUNC(interact_menu,addActionToClass); [_type, 0, [], _dropAction] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/dragging/functions/fnc_startCarry.sqf b/addons/dragging/functions/fnc_startCarry.sqf index ff201afb02..5521bec375 100644 --- a/addons/dragging/functions/fnc_startCarry.sqf +++ b/addons/dragging/functions/fnc_startCarry.sqf @@ -22,11 +22,11 @@ private "_weight"; _weight = [_target] call FUNC(getWeight); if (_weight > GETMVAR(ACE_maxWeightCarry,1E11)) exitWith { - [localize "STR_ACE_Dragging_UnableToDrag"] call EFUNC(common,displayTextStructured); + [localize LSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); }; private "_timer"; -_timer = time + 5; +_timer = ACE_time + 5; // handle objects vs persons if (_target isKindOf "CAManBase") then { @@ -41,12 +41,12 @@ if (_target isKindOf "CAManBase") then { // move a bit closer and adjust direction when trying to pick up a person _target setDir (getDir _unit + 180); - _target setPos (getPos _unit vectorAdd vectorDir _unit); + _target setPosASL (getPosASL _unit vectorAdd (vectorDir _unit)); [_unit, "AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon", 2, true] call EFUNC(common,doAnimation); [_target, "AinjPfalMstpSnonWrflDnon_carried_Up", 2, true] call EFUNC(common,doAnimation); - _timer = time + 15; + _timer = ACE_time + 15; } else { @@ -62,7 +62,7 @@ if (_target isKindOf "CAManBase") then { [_unit, _target, true] call EFUNC(common,claim); -// prevents draging and carrying at the same time +// prevents draging and carrying at the same ACE_time _unit setVariable [QGVAR(isCarrying), true, true]; // required for aborting animation diff --git a/addons/dragging/functions/fnc_startCarryPFH.sqf b/addons/dragging/functions/fnc_startCarryPFH.sqf index d98522c5f2..47824a8e76 100644 --- a/addons/dragging/functions/fnc_startCarryPFH.sqf +++ b/addons/dragging/functions/fnc_startCarryPFH.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING - systemChat format ["%1 startCarryPFH running", time]; + systemChat format ["%1 startCarryPFH running", ACE_time]; #endif private ["_unit", "_target", "_timeOut"]; @@ -24,13 +24,13 @@ if ((!([_target] call EFUNC(common,isAlive))) || {(_unit distance _target) > 10} // handle persons vs objects if (_target isKindOf "CAManBase") then { - if (time > _timeOut) exitWith { + if (ACE_time > _timeOut) exitWith { [_unit, _target] call FUNC(carryObject); [_this select 1] call CBA_fnc_removePerFrameHandler; }; } else { - if (time > _timeOut) exitWith { + if (ACE_time > _timeOut) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; // drop if in timeout diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf index fbf0f4608c..1d4eb9a158 100644 --- a/addons/dragging/functions/fnc_startDrag.sqf +++ b/addons/dragging/functions/fnc_startDrag.sqf @@ -22,7 +22,7 @@ private "_weight"; _weight = [_target] call FUNC(getWeight); if (_weight > GETMVAR(ACE_maxWeightDrag,1E11)) exitWith { - [localize "STR_ACE_Dragging_UnableToDrag"] call EFUNC(common,displayTextStructured); + [localize LSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); }; // add a primary weapon if the unit has none. @@ -43,12 +43,12 @@ _unit selectWeapon primaryWeapon _unit; // move a bit closer and adjust direction when trying to pick up a person if (_target isKindOf "CAManBase") then { _target setDir (getDir _unit + 180); - _target setPos (getPos _unit vectorAdd (vectorDir _unit vectorMultiply 1.5)); + _target setPosASL (getPosASL _unit vectorAdd (vectorDir _unit vectorMultiply 1.5)); [_target, "AinjPpneMrunSnonWnonDb_grab", 2, true] call EFUNC(common,doAnimation); }; -// prevents draging and carrying at the same time +// prevents draging and carrying at the same ACE_time _unit setVariable [QGVAR(isDragging), true, true]; -[FUNC(startDragPFH), 0.2, [_unit, _target, time + 5]] call CBA_fnc_addPerFrameHandler; +[FUNC(startDragPFH), 0.2, [_unit, _target, ACE_time + 5]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/dragging/functions/fnc_startDragPFH.sqf b/addons/dragging/functions/fnc_startDragPFH.sqf index d77a23457e..65cf0a2431 100644 --- a/addons/dragging/functions/fnc_startDragPFH.sqf +++ b/addons/dragging/functions/fnc_startDragPFH.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING - systemChat format ["%1 startDragPFH running", time]; + systemChat format ["%1 startDragPFH running", ACE_time]; #endif private ["_unit", "_target", "_timeOut"]; @@ -22,8 +22,8 @@ if ((!([_target] call EFUNC(common,isAlive))) || {(_unit distance _target) > 10} [_this select 1] call CBA_fnc_removePerFrameHandler; }; -// timeout. Do nothing. Quit. time, because anim length is linked to ingame time. -if (time > _timeOut) exitWith { +// timeout. Do nothing. Quit. ACE_time, because anim length is linked to ingame ACE_time. +if (ACE_time > _timeOut) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; // drop if in timeout diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index 956f004635..d1eb18d6b4 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -50,4 +50,4 @@ Нести - + \ No newline at end of file diff --git a/addons/explosives/ACE_Settings.hpp b/addons/explosives/ACE_Settings.hpp index 038f06291d..ef6a723d5b 100644 --- a/addons/explosives/ACE_Settings.hpp +++ b/addons/explosives/ACE_Settings.hpp @@ -7,4 +7,10 @@ class ACE_Settings { value = 1; typeName = "BOOL"; }; + class GVAR(ExplodeOnDefuse) { + displayName = CSTRING(ExplodeOnDefuse_DisplayName); + description = CSTRING(ExplodeOnDefuse_Description); + value = 1; + typeName = "BOOL"; + }; }; diff --git a/addons/explosives/ACE_Triggers.hpp b/addons/explosives/ACE_Triggers.hpp index 9c33246cd8..5df3d005bc 100644 --- a/addons/explosives/ACE_Triggers.hpp +++ b/addons/explosives/ACE_Triggers.hpp @@ -9,45 +9,45 @@ onSetup parameters: 0: STRING - Magazine Classname */ class Command { - displayName = $STR_ACE_Explosives_clacker_displayName; + displayName = CSTRING(clacker_displayName); picture = PATHTOF(Data\UI\Clacker.paa); onPlace = QUOTE(_this call FUNC(AddClacker);false); requires[] = {"ACE_Clacker"}; }; class MK16_Transmitter:Command { - displayName = $STR_ACE_Explosives_MK16_displayName; + displayName = CSTRING(MK16_displayName); picture = PATHTOF(Data\UI\MK16_Reciever_ca.paa); requires[] = {"ACE_M26_Clacker"}; }; class DeadManSwitch:Command { - displayName = $STR_ACE_Explosives_DeadManSwitch_displayName; + displayName = CSTRING(DeadManSwitch_displayName); picture = PATHTOF(Data\UI\DeadmanSwitch.paa); requires[] = {"ACE_DeadManSwitch"}; }; class Cellphone:Command { - displayName = $STR_ACE_Explosives_cellphone_displayName; + displayName = CSTRING(cellphone_displayName); picture = PATHTOF(Data\UI\Cellphone_UI.paa); onPlace = QUOTE(_this call FUNC(addCellphoneIED);false); requires[] = {"ACE_Cellphone"}; }; class PressurePlate { - displayName = $STR_ACE_Explosives_PressurePlate; + displayName = CSTRING(PressurePlate); picture = PATHTOF(Data\UI\PressurePlate.paa); onPlace = "_dist=GetNumber(ConfigFile >> 'CfgMagazines' >> (_this select 2) >> 'ACE_Triggers' >> 'PressurePlate' >> 'digDistance');_ex=_this select 1;_ex setPosATL ((getPosATL _ex) vectorDiff ((VectorUp _ex) vectorCrossProduct [0,0,_dist]));false"; }; class IRSensor { - displayName = $STR_ACE_Explosives_IRSensor; + displayName = CSTRING(IRSensor); picture = PATHTOF(Data\UI\PressurePlate.paa); onPlace = "false"; }; class Timer { - displayName = $STR_ACE_Explosives_timerName; + displayName = CSTRING(timerName); picture = PATHTOF(data\UI\Timer.paa); onPlace = QUOTE([ARR_2(_this select 1,(_this select 3) select 0)] call FUNC(startTimer);false); onSetup = QUOTE(_this call FUNC(openTimerSetUI);true); }; class Tripwire { - displayName = $STR_ACE_Explosives_TripWire; + displayName = CSTRING(TripWire); picture = PATHTOF(Data\UI\Tripwire.paa); onPlace = "false"; }; diff --git a/addons/explosives/CfgAmmo.hpp b/addons/explosives/CfgAmmo.hpp index c6d70bc64a..8299a979b3 100644 --- a/addons/explosives/CfgAmmo.hpp +++ b/addons/explosives/CfgAmmo.hpp @@ -69,25 +69,52 @@ class CfgAmmo { /*class DemoCharge_Remote_Ammo_Scripted: DemoCharge_Remote_Ammo; class SatchelCharge_Remote_Ammo_Scripted: SatchelCharge_Remote_Ammo;*/ - + class IEDUrbanBig_Remote_Ammo: PipeBombBase { - mineTrigger = "RangeTrigger"; triggerWhenDestroyed = 1; - soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.562341, 1, 40}; + ACE_explodeOnDefuse = 0.02; + soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.8, 1, 40}; }; - class IEDLandBig_Remote_Ammo: PipeBombBase { + class IEDUrbanBig_Command_Ammo: IEDUrbanBig_Remote_Ammo { + mineTrigger = "RemoteTrigger"; + }; + class IEDUrbanBig_Range_Ammo: IEDUrbanBig_Remote_Ammo { mineTrigger = "RangeTrigger"; - triggerWhenDestroyed = 1; - soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.562341, 1, 40}; }; + class IEDUrbanSmall_Remote_Ammo: PipeBombBase { - mineTrigger = "RangeTrigger"; triggerWhenDestroyed = 1; - soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.562341, 1, 40}; + ACE_explodeOnDefuse = 0.02; + soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.8, 1, 40}; + }; + class IEDUrbanSmall_Command_Ammo: IEDUrbanSmall_Remote_Ammo { + mineTrigger = "RemoteTrigger"; }; - class IEDLandSmall_Remote_Ammo: PipeBombBase { + class IEDUrbanSmall_Range_Ammo: IEDUrbanSmall_Remote_Ammo { mineTrigger = "RangeTrigger"; + }; + + class IEDLandBig_Remote_Ammo: PipeBombBase { triggerWhenDestroyed = 1; - soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.562341, 1, 40}; + ACE_explodeOnDefuse = 0.02; + soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.8, 1, 40}; + }; + class IEDLandBig_Command_Ammo: IEDLandBig_Remote_Ammo { + mineTrigger = "RemoteTrigger"; + }; + class IEDLandBig_Range_Ammo: IEDLandBig_Remote_Ammo { + mineTrigger = "RangeTrigger"; + }; + + class IEDLandSmall_Remote_Ammo: PipeBombBase { + triggerWhenDestroyed = 1; + ACE_explodeOnDefuse = 0.02; + soundTrigger[] = {"A3\Sounds_F\weapons\mines\mech_trigger_1", 0.8, 1, 40}; + }; + class IEDLandSmall_Command_Ammo: IEDLandSmall_Remote_Ammo { + mineTrigger = "RemoteTrigger"; + }; + class IEDLandSmall_Range_Ammo: IEDLandSmall_Remote_Ammo { + mineTrigger = "RangeTrigger"; }; }; diff --git a/addons/explosives/CfgEventHandlers.hpp b/addons/explosives/CfgEventHandlers.hpp index 8d0b110935..89e3017e8a 100644 --- a/addons/explosives/CfgEventHandlers.hpp +++ b/addons/explosives/CfgEventHandlers.hpp @@ -9,12 +9,19 @@ class Extended_PostInit_EventHandlers { }; }; -/* -TODO: Move the addEventHandlers out of PostInit into here or separate eventHandlers, -to enable them on all units, so unit switching works for explosives properly. -class Extended_Init_EventHandlers { -class CAManBase { -init = ""; -} -} -*/ +class Extended_Killed_EventHandlers { + class CAManBase { + GVAR(killedHandler) = QUOTE(_this call FUNC(onKilled)); + }; +}; + +class Extended_Take_EventHandlers { + class CAManBase { + GVAR(takeHandler) = QUOTE([ARR_3(_this select 0, _this select 1, _this select 2)] call FUNC(onInventoryChanged)); + }; +}; +class Extended_Put_EventHandlers { + class CAManBase { + GVAR(takeHandler) = QUOTE([ARR_3(_this select 1, _this select 0, _this select 2)] call FUNC(onInventoryChanged)); + }; +}; diff --git a/addons/explosives/CfgMagazines.hpp b/addons/explosives/CfgMagazines.hpp index 248ee12640..39d08917c3 100644 --- a/addons/explosives/CfgMagazines.hpp +++ b/addons/explosives/CfgMagazines.hpp @@ -44,10 +44,11 @@ class CfgMagazines { ACE_SetupObject = "ACE_Explosives_Place_Claymore"; ACE_DelayTime = 1.5; class ACE_Triggers { - SupportedTriggers[] = {"Command"}; + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; class Command { - FuseTime = 0.5; + FuseTime = 0.5; }; + class MK16_Transmitter: Command {}; }; }; @@ -78,13 +79,13 @@ class CfgMagazines { class ACE_Triggers { SupportedTriggers[] = {"IRSensor","PressurePlate","Timer","Command"}; class PressurePlate{ - displayName = $STR_ACE_Explosives_SLAME_Magnetic; + displayName = CSTRING(SLAME_Magnetic); digDistance = 0; ammo = "SLAMDirectionalMine_Magnetic_Ammo"; pitch = 90; }; class IRSensor{ - displayName = $STR_ACE_Explosives_SLAME_IRSensor; + displayName = CSTRING(SLAME_IRSensor); }; class Timer { ammo = "SLAMDirectionalMine_Timer_Ammo"; @@ -95,45 +96,51 @@ class CfgMagazines { }; }; }; - + class IEDUrbanBig_Remote_Mag: DemoCharge_Remote_Mag { ACE_SetupObject = "ACE_Explosives_Place_IEDUrbanBig"; class ACE_Triggers { - SupportedTriggers[] = {"Command","DeadmanSwitch", "Cellphone", "PressurePlate"}; + SupportedTriggers[] = {"Command", "DeadmanSwitch", "Cellphone", "PressurePlate"}; class Command { FuseTime = 0.5; + ammo = "IEDUrbanBig_Command_Ammo"; }; class DeadmanSwitch:Command {}; class Cellphone:Command {}; class PressurePlate { - displayName = $STR_ACE_Explosives_SLAME_Magnetic; + displayName = CSTRING(PressurePlate); digDistance = 0; - ammo = "IEDUrbanBig_Remote_Ammo"; + ammo = "IEDUrbanBig_Range_Ammo"; pitch = 0; }; - }; + }; }; + class IEDLandBig_Remote_Mag: IEDUrbanBig_Remote_Mag { ACE_SetupObject = "ACE_Explosives_Place_IEDLandBig"; class ACE_Triggers: ACE_Triggers { + class Command: Command { + ammo = "IEDLandBig_Command_Ammo"; + }; class PressurePlate: PressurePlate { - ammo = "IEDLandBig_Remote_Ammo"; + ammo = "IEDLandBig_Range_Ammo"; }; }; }; class IEDUrbanSmall_Remote_Mag: DemoCharge_Remote_Mag { ACE_SetupObject = "ACE_Explosives_Place_IEDUrbanSmall"; class ACE_Triggers { - SupportedTriggers[] = {"Command","DeadmanSwitch", "Cellphone", "PressurePlate"}; + SupportedTriggers[] = {"Command", "DeadmanSwitch", "Cellphone", "PressurePlate"}; class Command { FuseTime = 0.5; + ammo = "IEDUrbanSmall_Command_Ammo"; }; class DeadmanSwitch: Command {}; class Cellphone: Command {}; class PressurePlate { - displayName = $STR_ACE_Explosives_SLAME_Magnetic; + displayName = CSTRING(PressurePlate); digDistance = 0; - ammo = "IEDUrbanSmall_Remote_Ammo"; + ammo = "IEDUrbanSmall_Range_Ammo"; pitch = 0; }; }; @@ -141,8 +148,11 @@ class CfgMagazines { class IEDLandSmall_Remote_Mag: IEDUrbanSmall_Remote_Mag { ACE_SetupObject = "ACE_Explosives_Place_IEDLandSmall"; class ACE_Triggers: ACE_Triggers { + class Command: Command { + ammo = "IEDLandSmall_Command_Ammo"; + }; class PressurePlate: PressurePlate { - ammo = "IEDLandSmall_Remote_Ammo"; + ammo = "IEDLandSmall_Range_Ammo"; }; }; }; diff --git a/addons/explosives/CfgModule.hpp b/addons/explosives/CfgModule.hpp index 52f70ea3af..239ecd4e17 100644 --- a/addons/explosives/CfgModule.hpp +++ b/addons/explosives/CfgModule.hpp @@ -1,30 +1,33 @@ -class Logic; -class Module_F: Logic { - class ModuleDescription {}; -}; -class ACE_ModuleExplosive: Module_F { - author = "$STR_ACE_Common_ACETeam"; +class ACE_Module; +class ACE_ModuleExplosive: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Explosive_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QUOTE(FUNC(module)); scope = 2; isGlobal = 1; icon = PATHTOF(UI\Icon_Module_Explosives_ca.paa); class Arguments { class RequireSpecialist { - displayName = "$STR_ACE_Explosive_RequireSpecialist_DisplayName"; - description = "$STR_ACE_Explosive_RequireSpecialist_Description"; + displayName = CSTRING(RequireSpecialist_DisplayName); + description = CSTRING(RequireSpecialist_Description); typeName = "BOOL"; defaultValue = 0; }; class PunishNonSpecialists { - displayName = "$STR_ACE_Explosive_PunishNonSpecialists_DisplayName"; - description = "$STR_ACE_Explosive_PunishNonSpecialists_Description"; + displayName = CSTRING(PunishNonSpecialists_DisplayName); + description = CSTRING(PunishNonSpecialists_Description); + typeName = "BOOL"; + defaultValue = 1; + }; + class ExplodeOnDefuse { + displayName = "$STR_ACE_Explosive_ExplodeOnDefuse_DisplayName"; + description = "$STR_ACE_Explosive_ExplodeOnDefuse_Description"; typeName = "BOOL"; defaultValue = 1; }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_Explosive_Module_Description"; + class ModuleDescription { + description = CSTRING(Module_Description); }; -}; \ No newline at end of file +}; diff --git a/addons/explosives/CfgVehicles.hpp b/addons/explosives/CfgVehicles.hpp index 30e1ff151d..7a51a7d765 100644 --- a/addons/explosives/CfgVehicles.hpp +++ b/addons/explosives/CfgVehicles.hpp @@ -3,28 +3,28 @@ class CfgVehicles { class CAManBase: Man { class ACE_SelfActions { class ACE_Explosives { - displayName = $STR_ACE_Explosives_Menu; + displayName = CSTRING(Menu); condition = QUOTE(!(_player getVariable [ARR_2('ace_explosives_PlantingExplosive',false)])); statement = ""; - exceptions[] = {"isNotSwimming", "isNotInside"}; + exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 4; icon = PATHTOF(UI\Explosives_Menu_ca.paa); hotkey = "X"; //Sub-menu items class ACE_Detonate { - displayName = $STR_ACE_Explosives_Detonate; + displayName = CSTRING(Detonate); condition = QUOTE([_player] call FUNC(canDetonate)); statement = ""; insertChildren = QUOTE([_player] call FUNC(addTransmitterActions);); - exceptions[] = {"isNotSwimming", "isNotInside"}; + exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; showDisabled = 1; icon = PATHTOF(UI\Explosives_Menu_ca.paa); priority = 2; hotkey = "T"; }; class ACE_Place { - displayName = $STR_ACE_Explosives_Place; + displayName = CSTRING(Place); condition = QUOTE((vehicle _player == _player) and {[_player] call FUNC(hasExplosives)}); statement = ""; insertChildren = QUOTE([_player] call FUNC(addExplosiveActions);); @@ -35,10 +35,10 @@ class CfgVehicles { hotkey = "P"; }; class ACE_Cellphone { - displayName = $STR_ACE_Explosives_cellphone_displayName; + displayName = CSTRING(cellphone_displayName); condition = "('ACE_Cellphone' in (items ace_player))"; statement = "closeDialog 0;createDialog 'Rsc_ACE_PhoneInterface';"; - exceptions[] = {"isNotSwimming", "isNotInside"}; + exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; showDisabled = 0; icon = PATHTOF(Data\UI\Cellphone_UI.paa); priority = 0.8; @@ -65,7 +65,7 @@ class CfgVehicles { distance = 5; condition = "true"; class ACE_Defuse { - displayName = $STR_ACE_Explosives_Defuse; + displayName = CSTRING(Defuse); condition = QUOTE([ARR_2(_player,_target)] call FUNC(canDefuse)); statement = QUOTE([ARR_2(_player,_target)] call FUNC(startDefuse);); exceptions[] = {"isNotSwimming"}; @@ -97,24 +97,24 @@ class CfgVehicles { condition = "true"; class ACE_SetTrigger { selection = ""; - displayName = "$STR_ACE_Explosives_TriggerMenu"; + displayName = CSTRING(TriggerMenu); distance = 4; condition = "true"; statement = ""; insertChildren = QUOTE([ARR_3(_target getVariable QUOTE(QGVAR(class)),_target,_player)] call FUNC(addTriggerActions);); showDisabled = 0; - exceptions[] = {}; + exceptions[] = {"isNotSwimming"}; priority = 5; icon = QUOTE(PATHTOF(UI\Explosives_Menu_ca.paa)); }; class ACE_PickUp { selection = ""; - displayName = "$STR_ACE_Explosives_Pickup"; + displayName = CSTRING(Pickup); distance = 4; condition = "true"; statement = QUOTE([ARR_2(_player,_target getVariable QUOTE(QGVAR(class)))] call EFUNC(common,addToInventory);deleteVehicle _target;); showDisabled = 0; - exceptions[] = {}; + exceptions[] = {"isNotSwimming"}; priority = 5; icon = "\A3\ui_f\data\IGUI\Cfg\Actions\Obsolete\ui_action_takemine_ca.paa"; }; diff --git a/addons/explosives/CfgWeapons.hpp b/addons/explosives/CfgWeapons.hpp index a90b4d515f..7768515953 100644 --- a/addons/explosives/CfgWeapons.hpp +++ b/addons/explosives/CfgWeapons.hpp @@ -9,8 +9,8 @@ class CfgWeapons { class ACE_Clacker: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Explosives_clacker_displayName; - descriptionShort = $STR_ACE_Explosives_clacker_description; + displayName = CSTRING(clacker_displayName); + descriptionShort = CSTRING(clacker_description); picture = PATHTOF(Data\UI\Clacker.paa); model = "\A3\weapons_F\ammo\mag_univ.p3d"; ACE_Range = 250; @@ -22,14 +22,14 @@ class CfgWeapons { }; }; class ACE_M26_Clacker: ACE_Clacker { - displayName = $STR_ACE_Explosives_M26_displayName; + displayName = CSTRING(M26_displayName); picture = PATHTOF(Data\UI\MK26_Transmitter_ca.paa); ACE_Range = 5000; }; class ACE_DefusalKit: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Explosives_DefusalKit_displayName; - descriptionShort = $STR_ACE_Explosives_DefusalKit_description; + displayName = CSTRING(DefusalKit_displayName); + descriptionShort = CSTRING(DefusalKit_description); picture = PATHTOF(Data\UI\Pliers.paa); model = "\A3\Structures_F\Items\Tools\Pliers_F.p3d"; @@ -40,8 +40,8 @@ class CfgWeapons { }; class ACE_DeadManSwitch: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Explosives_DeadManSwitch_displayName; - descriptionShort = $STR_ACE_Explosives_DeadManSwitch_description; + displayName = CSTRING(DeadManSwitch_displayName); + descriptionShort = CSTRING(DeadManSwitch_description); picture = PATHTOF(Data\UI\DeadmanSwitch.paa); model = "\A3\weapons_F\ammo\mag_univ.p3d"; ACE_Range = 100; @@ -54,8 +54,8 @@ class CfgWeapons { }; class ACE_Cellphone: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Explosives_cellphone_displayName; - descriptionShort = $STR_ACE_Explosives_cellphone_description; + displayName = CSTRING(cellphone_displayName); + descriptionShort = CSTRING(cellphone_description); picture = PATHTOF(Data\UI\Cellphone_UI.paa); model = "\A3\weapons_F\ammo\mag_univ.p3d"; ACE_Range = 15000; diff --git a/addons/explosives/ExplosivesUI.hpp b/addons/explosives/ExplosivesUI.hpp index 6871f95f92..6e6374af12 100644 --- a/addons/explosives/ExplosivesUI.hpp +++ b/addons/explosives/ExplosivesUI.hpp @@ -15,7 +15,7 @@ class RscEdit; class Rsc_ACE_CallScreen_Edit:RscEdit { canModify = 1; - colorBackground[] = {0,0,0,1}; + colorBackground[] = {0,0,0,0}; colorText[] = {0,0,0,1}; colorDisabled[] = {1,1,1,0.25}; colorSelection[] = { @@ -89,7 +89,7 @@ class RscACE_SelectTimeUI { h = 0.1; y = 0.09; style = ST_CENTER; - text = $STR_ACE_Explosives_Cancel; + text = CSTRING(Cancel); action = "closeDialog 0;"; }; class approveBtn: RscButton { @@ -99,7 +99,7 @@ class RscACE_SelectTimeUI { h = 0.1; w = 0.15; style = ST_CENTER; - text = $STR_ACE_Explosives_SetTime; + text = CSTRING(SetTime); action = "closeDialog 0;"; }; }; @@ -215,7 +215,7 @@ class Rsc_ACE_PhoneInterface { y = 0.676 * safezoneH + safezoneY; w = 0.0309375 * safezoneW; h = 0.033 * safezoneH; - tooltip = "$STR_ACE_Explosives_Phone_AddToSpeedDial"; + tooltip = CSTRING(Phone_AddToSpeedDial); action = QUOTE([ARR_2(ctrlText 1401,ctrlText 1400)] call FUNC(addToSpeedDial);); }; class clear: Rsc_ACE_HiddenButton { @@ -224,7 +224,7 @@ class Rsc_ACE_PhoneInterface { y = 0.445 * safezoneH + safezoneY; w = 0.020625 * safezoneW; h = 0.033 * safezoneH; - tooltip = "$STR_ACE_Explosives_Clear"; + tooltip = CSTRING(Clear); action = QUOTE(ctrlSetText [ARR_2(1400,'')];[ctrlText 1401] call FUNC(removeFromSpeedDial);ctrlSetText [ARR_2(1401,'')];); }; class dial: Rsc_ACE_HiddenButton { @@ -233,7 +233,7 @@ class Rsc_ACE_PhoneInterface { y = 0.445 * safezoneH + safezoneY; w = 0.04125 * safezoneW; h = 0.033 * safezoneH; - tooltip = "$STR_ACE_Explosives_Phone_Dial"; + tooltip = CSTRING(Phone_Dial); action = QUOTE([ARR_2(ace_player,ctrlText 1400)] call FUNC(dialPhone);); }; class up: Rsc_ACE_HiddenButton { @@ -242,7 +242,7 @@ class Rsc_ACE_PhoneInterface { y = 0.445 * safezoneH + safezoneY; w = 0.020625 * safezoneW; h = 0.033 * safezoneH; - tooltip = "$STR_ACE_Explosives_Phone_Up"; + tooltip = CSTRING(Phone_Up); action = QUOTE([true] call FUNC(setSpeedDial)); }; class down: Rsc_ACE_HiddenButton { @@ -251,7 +251,7 @@ class Rsc_ACE_PhoneInterface { y = 0.485 * safezoneH + safezoneY; w = 0.020625 * safezoneW; h = 0.033 * safezoneH; - tooltip = "$STR_ACE_Explosives_Phone_Down"; + tooltip = CSTRING(Phone_Down); action = QUOTE([false] call FUNC(setSpeedDial)); }; class speedDial_Text: RscText { diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index 998f73ccaf..27a4703906 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -14,7 +14,11 @@ * Public: No */ #include "script_component.hpp" + if !(hasInterface) exitWith {}; + +["interactMenuOpened", {_this call FUNC(interactEH)}] call EFUNC(common,addEventHandler); + GVAR(PlacedCount) = 0; GVAR(Setup) = objNull; GVAR(pfeh_running) = false; @@ -28,47 +32,3 @@ GVAR(CurrentSpeedDial) = 0; }] call EFUNC(common,addEventHandler); [{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(Common,addScrollWheelEventHandler); -player addEventHandler ["Killed", { - private "_deadman"; - call FUNC(place_Cancel); - _deadman = [(_this select 0), "DeadManSwitch"] call FUNC(getPlacedExplosives); - { - [(_this select 0), -1, _x, true] call FUNC(detonateExplosive); - } count _deadman; -}]; -player addEventHandler ["Take", { - private ["_item", "_getter", "_giver", "_config", "_detonators"]; - _item = _this select 2; - _getter = _this select 0; - _giver = _this select 1; - - _config = ConfigFile >> "CfgWeapons" >> _item; - if (isClass _config && {getNumber(_config >> "ACE_Detonator") == 1}) then { - private ["_clackerItems"]; - _clackerItems = _giver getVariable [QGVAR(Clackers), []]; - _getter SetVariable [QGVAR(Clackers), (_getter getVariable [QGVAR(Clackers), []]) + _clackerItems, true]; - - _detonators = [_giver] call FUNC(getDetonators); - if (count _detonators == 0) then { - _giver setVariable [QGVAR(Clackers), nil, true]; - }; - }; -}]; -player addEventHandler ["Put", { - private ["_item", "_getter", "_giver", "_config"]; - _item = _this select 2; - _getter = _this select 1; - _giver = _this select 0; - - _config = ConfigFile >> "CfgWeapons" >> _item; - if (isClass _config && {getNumber(_config >> "ACE_Detonator") == 1}) then { - private ["_clackerItems"]; - _clackerItems = _giver getVariable [QGVAR(Clackers), []]; - _getter SetVariable [QGVAR(Clackers), (_getter getVariable [QGVAR(Clackers), []]) + _clackerItems, true]; - - _detonators = [_giver] call FUNC(getDetonators); - if (count _detonators == 0) then { - _giver setVariable [QGVAR(Clackers), nil, true]; - }; - }; -}]; diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index d010fd8d1e..b3888e1535 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -36,12 +36,16 @@ PREP(handleScrollWheel); PREP(hasExplosives); PREP(hasPlacedExplosives); +PREP(interactEH); + PREP(getDetonators); PREP(getPlacedExplosives); PREP(getSpeedDialExplosive); PREP(module); +PREP(onInventoryChanged); +PREP(onKilled); PREP(onLanded); PREP(openTimerSetUI); diff --git a/addons/explosives/functions/fnc_addClacker.sqf b/addons/explosives/functions/fnc_addClacker.sqf index b25c1e1bcd..d22b15eef4 100644 --- a/addons/explosives/functions/fnc_addClacker.sqf +++ b/addons/explosives/functions/fnc_addClacker.sqf @@ -37,8 +37,8 @@ _config = ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> co _clacker = _unit getVariable [QGVAR(Clackers), []]; GVAR(PlacedCount) = GVAR(PlacedCount) + 1; -_clacker pushBack [_explosive, getNumber(_config >> "FuseTime"), format [localize "STR_ACE_Explosives_DetonateCode", +_clacker pushBack [_explosive, getNumber(_config >> "FuseTime"), format [localize LSTRING(DetonateCode), GVAR(PlacedCount)], _magazineClass, configName ((_this select 3) select (count (_this select 3) - 1))]; _unit setVariable [QGVAR(Clackers), _clacker, true]; -_unit sideChat format [localize "STR_ACE_Explosives_DetonateCode", GVAR(PlacedCount)]; +_unit sideChat format [localize LSTRING(DetonateCode), GVAR(PlacedCount)]; diff --git a/addons/explosives/functions/fnc_defuseExplosive.sqf b/addons/explosives/functions/fnc_defuseExplosive.sqf index 5abfabe60f..e0c7f7c85d 100644 --- a/addons/explosives/functions/fnc_defuseExplosive.sqf +++ b/addons/explosives/functions/fnc_defuseExplosive.sqf @@ -17,14 +17,8 @@ #include "script_component.hpp" EXPLODE_2_PVT(_this,_unit,_explosive); -if (getNumber (ConfigFile >> "CfgAmmo" >> typeof _explosive >> "ACE_explodeOnDefuse") == 1) exitWith { +if (GVAR(ExplodeOnDefuse) && (random 1.0) < getNumber(ConfigFile >> "CfgAmmo" >> typeOf _explosive >> "ACE_explodeOnDefuse")) exitWith { [_unit, -1, [_explosive, 1], true] call FUNC(detonateExplosive); }; -{ - detach _x; - deleteVehicle _x; - false -} count (attachedObjects (_explosive)); - _unit action ["Deactivate", _unit, _explosive]; diff --git a/addons/explosives/functions/fnc_detonateExplosive.sqf b/addons/explosives/functions/fnc_detonateExplosive.sqf index 917c874af6..bfdf4a4b92 100644 --- a/addons/explosives/functions/fnc_detonateExplosive.sqf +++ b/addons/explosives/functions/fnc_detonateExplosive.sqf @@ -7,7 +7,7 @@ * 1: Max range (-1 to ignore) * 2: Explosive * 0: Explosive - * 1: Fuse time + * 1: Fuse ACE_time * * Return Value: * None @@ -26,12 +26,6 @@ _result = true; if (!_ignoreRange && {(_unit distance (_item select 0)) > _range}) exitWith {false}; -_helpers = attachedObjects (_item select 0); -{ - detach _x; - deleteVehicle _x; -} forEach _helpers; - if (getNumber (ConfigFile >> "CfgAmmo" >> typeof (_item select 0) >> "TriggerWhenDestroyed") == 0) then { private ["_exp", "_previousExp"]; _previousExp = _item select 0; diff --git a/addons/explosives/functions/fnc_interactEH.sqf b/addons/explosives/functions/fnc_interactEH.sqf new file mode 100644 index 0000000000..4e916edb82 --- /dev/null +++ b/addons/explosives/functions/fnc_interactEH.sqf @@ -0,0 +1,56 @@ +/* + * Author: PabstMirror + * When interact_menu starts rendering (from "interact_keyDown" event) + * Add defuse helpers to all nearby mines + * + * Arguments: + * Interact Menu Type (0 - world, 1 - self) + * + * Return Value: + * Nothing + * + * Example: + * [0] call ace_explosives_fnc_interactEH + * + * Public: Yes + */ +#include "script_component.hpp" + +PARAMS_1(_interactionType); + +//Ignore self-interaction menu +if (_interactionType != 0) exitWith {}; +//Ignore while mounted: +if ((vehicle ACE_player) != ACE_player) exitWith {}; +//Ignore if we don't have defuse kit +if (!("ACE_DefusalKit" in (items ACE_player))) exitWith {}; + +[{ + PARAMS_2(_args,_pfID); + EXPLODE_3_PVT(_args,_setPosition,_addedDefuseHelpers,_minesHelped); + + if (!EGVAR(interact_menu,keyDown)) then { + TRACE_1("Cleaning Defuse Helpers",(count _addedDefuseHelpers)); + {deleteVehicle _x;} forEach _addedDefuseHelpers; + [_pfID] call CBA_fnc_removePerFrameHandler; + } else { + private ["_defuseHelper"]; + // Prevent Rare Error when ending mission with interact key down: + if (isNull ace_player) exitWith {}; + + //If player moved >5 meters from last pos, then rescan + if (((getPosASL ace_player) distance _setPosition) > 5) then { + { + if (((_x distance ACE_player) < 15) && {!(_x in _minesHelped)}) then { + TRACE_2("Making Defuse Helper",(_x),(typeOf _x)); + _defuseHelper = "ACE_DefuseObject" createVehicleLocal (getPos _x); + _defuseHelper attachTo [_x, [0,0,0]]; + _defuseHelper setVariable [QGVAR(Explosive),_x]; + _addedDefuseHelpers pushBack _defuseHelper; + _minesHelped pushBack _x; + }; + } forEach allMines; + _args set [0, (getPosASL ace_player)]; + }; + }; +}, 0.5, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], []]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/explosives/functions/fnc_module.sqf b/addons/explosives/functions/fnc_module.sqf index 4080b41bde..56225d8ca8 100644 --- a/addons/explosives/functions/fnc_module.sqf +++ b/addons/explosives/functions/fnc_module.sqf @@ -27,5 +27,7 @@ if !(_activated) exitWith {}; call EFUNC(Common,readSettingFromModule); [_logic, QGVAR(PunishNonSpecialists),"PunishNonSpecialists"] call EFUNC(Common,readSettingFromModule); +[_logic, QGVAR(ExplodeOnDefuse),"ExplodeOnDefuse"] + call EFUNC(Common,readSettingFromModule); diag_log text "[ACE]: Explosive Module Initialized."; diff --git a/addons/explosives/functions/fnc_onInventoryChanged.sqf b/addons/explosives/functions/fnc_onInventoryChanged.sqf new file mode 100644 index 0000000000..53ebb2464d --- /dev/null +++ b/addons/explosives/functions/fnc_onInventoryChanged.sqf @@ -0,0 +1,35 @@ +/* + * Author: Garth 'L-H' de Wet + * When a take/put event handler fires and a detonator is changed hands. + * Then take "attached" explosives. + * + * Arguments: + * 0: Receiver + * 1: Giver + * 2: Item + * + * Return Value: + * None + * + * Example: + * Handled by CBA + * + * Public: No + */ +#include "script_component.hpp" +private ["_config", "_detonators"]; +PARAMS_3(_receiver,_giver,_item); + +if (_receiver != ace_player) exitWith {}; + +_config = ConfigFile >> "CfgWeapons" >> _item; +if (isClass _config && {getNumber(_config >> "ACE_Detonator") == 1}) then { + private ["_clackerItems"]; + _clackerItems = _giver getVariable [QGVAR(Clackers), []]; + _receiver SetVariable [QGVAR(Clackers), (_receiver getVariable [QGVAR(Clackers), []]) + _clackerItems, true]; + + _detonators = [_giver] call FUNC(getDetonators); + if (count _detonators == 0) then { + _giver setVariable [QGVAR(Clackers), nil, true]; + }; +}; diff --git a/addons/explosives/functions/fnc_onKilled.sqf b/addons/explosives/functions/fnc_onKilled.sqf new file mode 100644 index 0000000000..74775b2e66 --- /dev/null +++ b/addons/explosives/functions/fnc_onKilled.sqf @@ -0,0 +1,26 @@ +/* + * Author: Garth 'L-H' de Wet + * Detonates all attached deadman's switched triggered explosives. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * Handled by CBA + * + * Public: No + */ +#include "script_component.hpp" +private ["_deadman"]; +_unit = _this select 0; +if (_unit == ACE_player) then { + call FUNC(place_Cancel); +}; +if (!isServer) exitWith{}; +_deadman = [_unit, "DeadManSwitch"] call FUNC(getPlacedExplosives); +{ + [_unit, -1, _x, true] call FUNC(detonateExplosive); +} foreach _deadman; diff --git a/addons/explosives/functions/fnc_openTimerSetUI.sqf b/addons/explosives/functions/fnc_openTimerSetUI.sqf index e37bef06e3..d08d7444dd 100644 --- a/addons/explosives/functions/fnc_openTimerSetUI.sqf +++ b/addons/explosives/functions/fnc_openTimerSetUI.sqf @@ -38,4 +38,4 @@ DFUNC(SetTimer) = { buttonSetAction [8860, QUOTE(call DFUNC(SetTimer);)]; buttonSetAction [8855, QUOTE(closeDialog 0;)]; -ctrlSetText [8870, format[localize "STR_ACE_Explosives_TimerMenu",0, 30]]; +ctrlSetText [8870, format[localize LSTRING(TimerMenu),0, 30]]; diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf index 4bed019d47..68580c2ba0 100644 --- a/addons/explosives/functions/fnc_placeExplosive.sqf +++ b/addons/explosives/functions/fnc_placeExplosive.sqf @@ -25,6 +25,8 @@ private ["_ammo", "_explosive", "_attachedTo", "_expPos", "_magazineTrigger"]; EXPLODE_6_PVT(_this,_unit,_pos,_dir,_magazineClass,_triggerConfig,_triggerSpecificVars); DEFAULT_PARAM(6,_setupPlaceholderObject,objNull); +_unit playActionNow "PutDown"; + _attachedTo = objNull; if (!isNull _setupPlaceholderObject) then { _attachedTo = attachedTo _setupPlaceholderObject; @@ -49,16 +51,8 @@ if (isText(_magazineTrigger >> "ammo")) then { _ammo = getText (_magazineTrigger >> "ammo"); }; _triggerSpecificVars pushBack _triggerConfig; -private ["_defuseHelper"]; -_defuseHelper = createVehicle ["ACE_DefuseObject", _pos, [], 0, "NONE"]; -_defuseHelper setPosATL _pos; _explosive = createVehicle [_ammo, _pos, [], 0, "NONE"]; -_defuseHelper attachTo [_explosive, [0,0,0], ""]; -_defuseHelper setVariable [QGVAR(Explosive),_explosive,true]; - -_expPos = getPosATL _explosive; -_defuseHelper setPosATL (((getPosATL _defuseHelper) vectorAdd (_pos vectorDiff _expPos))); _explosive setPosATL _pos; if (!isNull _attachedTo) then { diff --git a/addons/explosives/functions/fnc_place_Approve.sqf b/addons/explosives/functions/fnc_place_Approve.sqf index f133dbb080..0604045f65 100644 --- a/addons/explosives/functions/fnc_place_Approve.sqf +++ b/addons/explosives/functions/fnc_place_Approve.sqf @@ -37,10 +37,10 @@ if (_dir > 180) then { } else { _dir = 180 + _dir; }; -_setup setVariable [QGVAR(Direction), _dir]; +_setup setVariable [QGVAR(Direction), _dir, true]; _player setVariable [QGVAR(PlantingExplosive), true]; [{_this setVariable [QGVAR(PlantingExplosive), false]}, _player, 1.5, 0.5] call EFUNC(common,waitAndExecute); _setup addEventHandler ["EpeContactStart", FUNC(onLanded)]; _setup enableSimulationGlobal true; -_player playActionNow "MedicOther"; +_player playActionNow "PutDown"; _player removeMagazine (_setup getVariable [QGVAR(Class), ""]); diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf index a0aad3d1ab..566ab9c281 100644 --- a/addons/explosives/functions/fnc_setupExplosive.sqf +++ b/addons/explosives/functions/fnc_setupExplosive.sqf @@ -41,8 +41,8 @@ GVAR(TweakedAngle) = 180; }; }] call CALLSTACK(BIS_fnc_addStackedEventHandler); -[localize "STR_ACE_Explosives_PlaceAction", localize "STR_ACE_Explosives_CancelAction", - localize "STR_ACE_Explosives_ScrollAction"] call EFUNC(interaction,showMouseHint); +[localize LSTRING(PlaceAction), localize LSTRING(CancelAction), + localize LSTRING(ScrollAction)] call EFUNC(interaction,showMouseHint); _unit setVariable [QGVAR(Place), [_unit, "DefaultAction", {GVAR(pfeh_running) AND !isNull (GVAR(Setup))}, {call FUNC(place_Approve);}] call EFUNC(common,AddActionEventHandler)]; _unit setVariable [QGVAR(Cancel), [_unit, "zoomtemp", diff --git a/addons/explosives/functions/fnc_startDefuse.sqf b/addons/explosives/functions/fnc_startDefuse.sqf index 11ca95f894..251e1e213d 100644 --- a/addons/explosives/functions/fnc_startDefuse.sqf +++ b/addons/explosives/functions/fnc_startDefuse.sqf @@ -59,6 +59,6 @@ if (ACE_player != _unit) then { _isEOD = [_unit] call EFUNC(Common,isEOD); _defuseTime = [_isEOD, _target] call _fnc_DefuseTime; if (_isEOD || {!GVAR(RequireSpecialist)}) then { - [_defuseTime, [_unit,_target], {(_this select 0) call FUNC(defuseExplosive)}, {}, (localize "STR_ACE_Explosives_DefusingExplosive")] call EFUNC(common,progressBar); + [_defuseTime, [_unit,_target], {(_this select 0) call FUNC(defuseExplosive)}, {}, (localize LSTRING(DefusingExplosive))] call EFUNC(common,progressBar); }; }; diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 5f5076175d..3227da5dff 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -505,29 +505,60 @@ Raccogli Pegar - + Explosive System System ładunków wybuchowych + Sistema de explosivos + Sprengstoffsystem + Systém výbušnin + Sistema de explosivos - + Require specialists? Wymagaj specjalistów? + ¿Requiere especialista? + Benötigt Sprengstoffexperten? + Vyžadovat specialistu? + Requer especialista? - + Require explosive specialists to disable explosives? Default: No Wymagać saperów do rozbrajania ładunków wybuchowych? Domyślnie: Nie + Requiere especialista en explosivos para desactivar explosivos?. Por defecto: No + Benötige Sprengstoffexperte um Sprengladungen zu entschärfen? Standard: Nein + Vyžadovat specialistu na zneškodnění výbušniny? Výchozí: Ne + Requer especialista em explosivos para desativar explosivos? Padrão: Não - + Punish non-specialists? Karaj nie-specjalistów? + ¿Penalizar a los no especialistas? + Bestrafe Nicht-Sprengstoffexperten? + Potrestat, pokud není specialista? + Punir não especialistas? - + Increase the time it takes to complete actions for non-specialists? Default: Yes Zwiększyć ilość wymaganego czasu do ukończenia akcji dla nie-specjalistów? Domyślnie: Tak + Aumenta el tiempo que lleva completar acciones para los no especialstas?. Por defecto: Si + Entschärfungszeit für Nicht-Sprengstoffexperten erhöhen? Standard: Ja + Zvýšit čas potřebný k dokončení akce pokud není specialista? Výchozí: Ano + Aumentar o tempo necessário para completar ações por não especialistas? Padrão: Sim - + + Explode on defusal? + Explosão no desarmamento? + + + Enable certain explosives to explode on defusal? Default: Yes + Ativa certos explosivos para detonar no desarmamento? Padrão: Sim + + Moduł ten pozwala dostosować opcje związane z ładunkami wybuchowymi, ich podkładaniem oraz rozbrajaniem. + Dieses Modul erlaubt die Einstellungen für Sprengstoffe zu verändern. + Tento modul umoňuje přizpůsobit nastavení týkajících se výbušnin. + Este módulo permite personalizar as definições relacionadas a explosivos. - + \ No newline at end of file diff --git a/addons/fcs/CfgVehicles.hpp b/addons/fcs/CfgVehicles.hpp index 5f357c9005..10cb868ca0 100644 --- a/addons/fcs/CfgVehicles.hpp +++ b/addons/fcs/CfgVehicles.hpp @@ -25,7 +25,7 @@ class CfgVehicles { class Car: LandVehicle { class ACE_SelfActions { class ResetFCS { - displayName = $STR_ACE_FCS_ResetFCS; + displayName = CSTRING(ResetFCS); condition = QUOTE(call FUNC(canResetFCS)); statement = QUOTE([ARR_2(vehicle _player,[_player] call DEFUNC(common,getTurretIndex))] call DFUNC(reset);); showDisabled = 0; @@ -38,7 +38,7 @@ class CfgVehicles { class Tank: LandVehicle { class ACE_SelfActions { class ResetFCS { - displayName = $STR_ACE_FCS_ResetFCS; + displayName = CSTRING(ResetFCS); condition = QUOTE(call FUNC(canResetFCS)); statement = QUOTE([ARR_2(vehicle _player,[_player] call DEFUNC(common,getTurretIndex))] call DFUNC(reset);); showDisabled = 0; diff --git a/addons/fcs/XEH_clientInit.sqf b/addons/fcs/XEH_clientInit.sqf index 3338e739e1..f5131dd135 100644 --- a/addons/fcs/XEH_clientInit.sqf +++ b/addons/fcs/XEH_clientInit.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" GVAR(enabled) = false; -GVAR(time) = 0; +GVAR(ACE_time) = 0; GVAR(position) = [0,0,0]; if (!hasInterface) exitWith {}; diff --git a/addons/fcs/functions/fnc_getAngle.sqf b/addons/fcs/functions/fnc_getAngle.sqf index 03024d8b98..91150c110d 100644 --- a/addons/fcs/functions/fnc_getAngle.sqf +++ b/addons/fcs/functions/fnc_getAngle.sqf @@ -19,7 +19,7 @@ #include "script_component.hpp" #define PRECISION 0.1 -private ["_distance","_angleTarget","_maxElev","_initSpeed","_airFriction","_timeToLive","_timeToLive","_simulationStep","_angle","_posTargetX","_posTargetY","_posX","_posY","_velocityX","_velocityY","_velocityMagnitude"]; +private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle1", "_angle2", "_it2", "_f1", "_f2", "_temp", "_it1", "_angle"]; _distance = _this select 0; _angleTarget = _this select 1; @@ -32,7 +32,7 @@ _simulationStep = _this select 6; if (_simulationStep == 0) exitWith {_angleTarget}; FUNC(traceBullet) = { - private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle", "_posTargetX", "_posTargetY", "_posX", "_posY", "_velocityX", "_velocityY", "_velocityMagnitude"]; + private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle", "_posTargetX", "_posTargetY", "_posX", "_posY", "_velocityX", "_velocityY", "_velocityMagnitude", "_i"]; _distance = _this select 0; _angleTarget = _this select 1; diff --git a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf index 31c2540790..899cf0da76 100644 --- a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf +++ b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf @@ -1,4 +1,7 @@ // by commy2 +#include "script_component.hpp" + +private ["_vehicle", "_projectile", "_zeroing", "_position", "_subMunition"]; _vehicle = _this select 0 select 0; _projectile = _this select 0 select 1; diff --git a/addons/fcs/functions/fnc_keyDown.sqf b/addons/fcs/functions/fnc_keyDown.sqf index 8646ce8468..a56e94bbf1 100644 --- a/addons/fcs/functions/fnc_keyDown.sqf +++ b/addons/fcs/functions/fnc_keyDown.sqf @@ -22,7 +22,7 @@ _distance = call FUNC(getRange); if !(!GVAR(enabled) && FUNC(canUseFCS)) exitWith {}; GVAR(Enabled) = true; -GVAR(Time) = time; +GVAR(Time) = ACE_time; if (_distance == 0) then { _distance = [5, 5000, 0] call EFUNC(common,getTargetDistance); // maximum distance: 5000m, 5m precision diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index a7bf8defe5..1e831d6df3 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -12,7 +12,7 @@ #include "script_component.hpp" -private ["_vehicle", "_turret", "_turretConfig", "_distance", "_weapons", "_magazines", "_showHint", "_playSound"]; +private ["_vehicle", "_turret", "_turretConfig", "_distance", "_weapons", "_magazines", "_showHint", "_playSound", "_i"]; _vehicle = _this select 0; _turret = _this select 1; @@ -60,7 +60,7 @@ private ["_movingAzimuth", "_posTarget", "_velocityTarget"]; // MOVING TARGETS _movingAzimuth = 0; -if (time - GVAR(time) > 1 and GVAR(time) != -1 and count _this < 3) then { +if (ACE_time - GVAR(ACE_time) > 1 and GVAR(ACE_time) != -1 and count _this < 3) then { // calculate speed of target _posTarget = [ (getPos _vehicle select 0) + _distance * (_weaponDirection select 0), @@ -68,14 +68,14 @@ if (time - GVAR(time) > 1 and GVAR(time) != -1 and count _this < 3) then { (getPos _vehicle select 2) + _distance * (_weaponDirection select 2) ]; _velocityTarget = [ - ((_posTarget select 0) - (GVAR(position) select 0)) / (time - GVAR(time)), - ((_posTarget select 1) - (GVAR(position) select 1)) / (time - GVAR(time)), - ((_posTarget select 2) - (GVAR(position) select 2)) / (time - GVAR(time)) + ((_posTarget select 0) - (GVAR(position) select 0)) / (ACE_time - GVAR(ACE_time)), + ((_posTarget select 1) - (GVAR(position) select 1)) / (ACE_time - GVAR(ACE_time)), + ((_posTarget select 2) - (GVAR(position) select 2)) / (ACE_time - GVAR(ACE_time)) ]; private ["_magazineType", "_ammoType", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_initSpeedCoef", "_velocityMagnitude"]; - // estimate time to target + // estimate ACE_time to target _magazineType = _vehicle currentMagazineTurret _turret; _ammoType = getText (configFile >> "CfgMagazines" >> _magazineType >> "ammo"); _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazineType >> "initSpeed"); @@ -130,7 +130,7 @@ if (time - GVAR(time) > 1 and GVAR(time) != -1 and count _this < 3) then { }; }; GVAR(enabled) = false; -GVAR(time) = -1; +GVAR(ACE_time) = -1; private ["_viewDiff", "_FCSAzimuth", "_FCSMagazines", "_FCSElevation"]; @@ -208,5 +208,5 @@ if(_playSound) then { }; if(_showHint) then { - [format ["%1: %2", localize "STR_ACE_FCS_ZeroedTo", _distance]] call EFUNC(common,displayTextStructured); + [format ["%1: %2", localize LSTRING(ZeroedTo), _distance]] call EFUNC(common,displayTextStructured); }; \ No newline at end of file diff --git a/addons/fcs/functions/fnc_reset.sqf b/addons/fcs/functions/fnc_reset.sqf index a23a759fa3..48e3803c83 100644 --- a/addons/fcs/functions/fnc_reset.sqf +++ b/addons/fcs/functions/fnc_reset.sqf @@ -22,4 +22,4 @@ _turret = _this select 1; [_vehicle, format ["%1_%2", QGVAR(Elevation), _turret], 0] call EFUNC(common,setVariablePublic); [_vehicle, format ["%1_%2", QGVAR(Azimuth), _turret], 0] call EFUNC(common,setVariablePublic); -[localize "STR_ACE_FCS_HasBeenReset"] call EFUNC(common,displayTextStructured); +[localize LSTRING(HasBeenReset)] call EFUNC(common,displayTextStructured); diff --git a/addons/fcs/functions/script_component.hpp b/addons/fcs/functions/script_component.hpp index 73e258a3b6..8ada0f7a71 100644 --- a/addons/fcs/functions/script_component.hpp +++ b/addons/fcs/functions/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT fcs -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_FCS #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_FCS #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/fcs/initKeybinds.sqf b/addons/fcs/initKeybinds.sqf index 96482ddd1c..3b22cb2262 100644 --- a/addons/fcs/initKeybinds.sqf +++ b/addons/fcs/initKeybinds.sqf @@ -1,6 +1,6 @@ // by commy2 -["ACE3 Vehicles", QGVAR(lazeTarget), localize "STR_ACE_FCS_LaseTarget", +["ACE3 Vehicles", QGVAR(lazeTarget), localize LSTRING(LaseTarget), { // Conditions: canInteract if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -30,7 +30,7 @@ }, [15, [false, false, false]], false] call cba_fnc_addKeybind; //Tab Key -["ACE3 Vehicles", QGVAR(adjustRangeUp), localize "STR_ACE_FCS_AdjustRangeUp", +["ACE3 Vehicles", QGVAR(adjustRangeUp), localize LSTRING(AdjustRangeUp), { // Conditions: canInteract if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -44,7 +44,7 @@ {false}, [201, [false, false, false]], false] call cba_fnc_addKeybind; //PageUp Key -["ACE3 Vehicles", QGVAR(adjustRangDown), localize "STR_ACE_FCS_AdjustRangeDown", +["ACE3 Vehicles", QGVAR(adjustRangDown), localize LSTRING(AdjustRangeDown), { // Conditions: canInteract if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/fcs/script_component.hpp b/addons/fcs/script_component.hpp index 73e258a3b6..8ada0f7a71 100644 --- a/addons/fcs/script_component.hpp +++ b/addons/fcs/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT fcs -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_FCS #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_FCS #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/fcs/stringtable.xml b/addons/fcs/stringtable.xml index d62a5d85ea..77d683fc98 100644 --- a/addons/fcs/stringtable.xml +++ b/addons/fcs/stringtable.xml @@ -3,7 +3,7 @@ Lase Target / Measure Distance - Ziel anlasern / Entfernung Messen + Ziel anlasern / Entfernung messen Télémétrer la cible Naświetl cel / Zmierz odległość Označit cíl / Změřit vzdálenost @@ -74,4 +74,4 @@ СУО обнулен. - + \ No newline at end of file diff --git a/addons/flashsuppressors/CfgWeapons.hpp b/addons/flashsuppressors/CfgWeapons.hpp index c070ada18d..198fec7316 100644 --- a/addons/flashsuppressors/CfgWeapons.hpp +++ b/addons/flashsuppressors/CfgWeapons.hpp @@ -230,7 +230,7 @@ class CfgWeapons { class InventoryMuzzleItem_Base_F; class ACE_muzzle_mzls_H: ItemCore { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_muzzle_mzls_H"; htMin = 1; htMax = 600; @@ -239,7 +239,7 @@ class CfgWeapons { mFact = 1; tBody = 100; scope = 2; - displayName = "$STR_ACE_muzzle_mzls_H"; + displayName = CSTRING(muzzle_mzls_H); picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_h_ca.paa"; model = "\A3\weapons_f\acc\acca_mzls_H_F"; @@ -283,9 +283,9 @@ class CfgWeapons { }; class ACE_muzzle_mzls_B: ACE_muzzle_mzls_H { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_muzzle_mzls_B"; - displayName = "$STR_ACE_muzzle_mzls_B"; + displayName = CSTRING(muzzle_mzls_B); picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_h_ca.paa"; model = "\A3\weapons_f\acc\acca_mzls_H_F"; @@ -329,9 +329,9 @@ class CfgWeapons { }; class ACE_muzzle_mzls_L: ACE_muzzle_mzls_H { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_muzzle_mzls_L"; - displayName = "$STR_ACE_muzzle_mzls_L"; + displayName = CSTRING(muzzle_mzls_L); picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_l_ca.paa"; model = "\A3\weapons_f\acc\acca_mzls_l_F"; @@ -375,9 +375,9 @@ class CfgWeapons { }; class ACE_muzzle_mzls_smg_01: ACE_muzzle_mzls_H { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_muzzle_mzls_smg_01"; - displayName = "$STR_ACE_muzzle_mzls_smg_01"; + displayName = CSTRING(muzzle_mzls_smg_01); picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_l_ca.paa"; model = "\A3\weapons_f\acc\acca_mzls_H_F"; //"\A3\weapons_f\acc\acca_mzls_smg_01_F"; @@ -421,9 +421,9 @@ class CfgWeapons { }; class ACE_muzzle_mzls_smg_02: ACE_muzzle_mzls_H { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_muzzle_mzls_smg_02"; - displayName = "$STR_ACE_muzzle_mzls_smg_02"; + displayName = CSTRING(muzzle_mzls_smg_02); picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_l_ca.paa"; model = "\A3\weapons_f\acc\acca_mzls_H_F"; //"\A3\weapons_f\acc\acca_mzls_smg_01_F"; @@ -467,9 +467,9 @@ class CfgWeapons { }; class ACE_muzzle_mzls_338: ACE_muzzle_mzls_H { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_muzzle_mzls_338"; - displayName = "$STR_ACE_muzzle_mzls_338"; + displayName = CSTRING(muzzle_mzls_338); picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_h_ca.paa"; model = "\A3\weapons_f\acc\acca_mzls_H_F"; @@ -513,9 +513,9 @@ class CfgWeapons { }; class ACE_muzzle_mzls_93mmg: ACE_muzzle_mzls_H { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_muzzle_mzls_93mmg"; - displayName = "$STR_ACE_muzzle_mzls_93mmg"; + displayName = CSTRING(muzzle_mzls_93mmg); picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_h_ca.paa"; model = "\A3\weapons_f\acc\acca_mzls_H_F"; diff --git a/addons/flashsuppressors/config.cpp b/addons/flashsuppressors/config.cpp index 10b9622d17..b8e0c1e120 100644 --- a/addons/flashsuppressors/config.cpp +++ b/addons/flashsuppressors/config.cpp @@ -4,13 +4,13 @@ class CfgPatches { class ADDON { units[] = {}; weapons[] = { - "ACE_muzzle_mzls_H", - "ACE_muzzle_mzls_B", - "ACE_muzzle_mzls_L", - "ACE_muzzle_mzls_smg_01", - "ACE_muzzle_mzls_smg_02", - "ACE_muzzle_mzls_338", - "ACE_muzzle_mzls_93mmg" + "ACE_muzzle_mzls_H", + "ACE_muzzle_mzls_B", + "ACE_muzzle_mzls_L", + "ACE_muzzle_mzls_smg_01", + "ACE_muzzle_mzls_smg_02", + "ACE_muzzle_mzls_338", + "ACE_muzzle_mzls_93mmg" }; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; diff --git a/addons/flashsuppressors/stringtable.xml b/addons/flashsuppressors/stringtable.xml index 509c16ddce..f075f1aa34 100644 --- a/addons/flashsuppressors/stringtable.xml +++ b/addons/flashsuppressors/stringtable.xml @@ -1,7 +1,7 @@  - + Flash Suppressor (6.5 mm) Lángrejtő (6,5 mm) Mündungsfeuerdämpfer (6,5 mm) @@ -13,7 +13,7 @@ Пламегаситель (6,5 мм) Bocacha (6,5 mm) - + Flash Suppressor (7.62 mm) Lángrejtő (7,62 mm) Mündungsfeuerdämpfer (7,62 mm) @@ -25,7 +25,7 @@ Пламегаситель (7,62 мм) Bocacha (7,62 mm) - + Flash Suppressor (5.56 mm) Lángrejtő (5,56 mm) Mündungsfeuerdämpfer (5,56 mm) @@ -37,7 +37,7 @@ Пламегаситель (5,56 мм) Bocacha (5,56 mm) - + Flash Suppressor (.45 ACP) Lángrejtő (.45 ACP) Mündungsfeuerdämpfer (.45 ACP) @@ -49,7 +49,7 @@ Пламегаситель (.45 ACP) Bocacha (.45 ACP) - + Flash Suppressor (9 mm) Lángrejtő (9 mm) Mündungsfeuerdämpfer (9 mm) @@ -61,7 +61,7 @@ Пламегаситель (9 мм) Bocacha (9 mm) - + Flash Suppressor (.338) Lángrejtő (.338) Mündungsfeuerdämpfer (.338) @@ -73,7 +73,7 @@ Пламегаситель (.338) Bocacha (.338) - + Flash Suppressor (9.3 mm) Lángrejtő (9,3 mm) Mündungsfeuerdämpfer (9,3 mm) diff --git a/addons/fonts/$NOBIN$ b/addons/fonts/$NOBIN$ new file mode 100644 index 0000000000..e69de29bb2 diff --git a/addons/fonts/$PBOPREFIX$ b/addons/fonts/$PBOPREFIX$ new file mode 100644 index 0000000000..3e0ff77f61 --- /dev/null +++ b/addons/fonts/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\fonts \ No newline at end of file diff --git a/addons/fonts/CfgFontFamilies.hpp b/addons/fonts/CfgFontFamilies.hpp new file mode 100644 index 0000000000..963a35fa8e --- /dev/null +++ b/addons/fonts/CfgFontFamilies.hpp @@ -0,0 +1,39 @@ +class CfgFontFamilies +{ + class PixelSplitterBold + { + fonts[] = { PATHTOF(PixelSplitterBold\PixelSplitterBold6), + PATHTOF(PixelSplitterBold\PixelSplitterBold7), + PATHTOF(PixelSplitterBold\PixelSplitterBold8), + PATHTOF(PixelSplitterBold\PixelSplitterBold9), + PATHTOF(PixelSplitterBold\PixelSplitterBold10), + PATHTOF(PixelSplitterBold\PixelSplitterBold11), + PATHTOF(PixelSplitterBold\PixelSplitterBold12), + PATHTOF(PixelSplitterBold\PixelSplitterBold13), + PATHTOF(PixelSplitterBold\PixelSplitterBold14), + PATHTOF(PixelSplitterBold\PixelSplitterBold15), + PATHTOF(PixelSplitterBold\PixelSplitterBold16), + PATHTOF(PixelSplitterBold\PixelSplitterBold17), + PATHTOF(PixelSplitterBold\PixelSplitterBold18), + PATHTOF(PixelSplitterBold\PixelSplitterBold19), + PATHTOF(PixelSplitterBold\PixelSplitterBold20), + PATHTOF(PixelSplitterBold\PixelSplitterBold21), + PATHTOF(PixelSplitterBold\PixelSplitterBold22), + PATHTOF(PixelSplitterBold\PixelSplitterBold23), + PATHTOF(PixelSplitterBold\PixelSplitterBold24), + PATHTOF(PixelSplitterBold\PixelSplitterBold25), + PATHTOF(PixelSplitterBold\PixelSplitterBold26), + PATHTOF(PixelSplitterBold\PixelSplitterBold27), + PATHTOF(PixelSplitterBold\PixelSplitterBold28), + PATHTOF(PixelSplitterBold\PixelSplitterBold29), + PATHTOF(PixelSplitterBold\PixelSplitterBold30), + PATHTOF(PixelSplitterBold\PixelSplitterBold31), + PATHTOF(PixelSplitterBold\PixelSplitterBold34), + PATHTOF(PixelSplitterBold\PixelSplitterBold35), + PATHTOF(PixelSplitterBold\PixelSplitterBold37), + PATHTOF(PixelSplitterBold\PixelSplitterBold46) + }; + spaceWidth = 0.5; + spacing = 0.065; + }; +}; \ No newline at end of file diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold10-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-01.paa new file mode 100644 index 0000000000..78b43acfc7 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold10-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold10-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold10-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-04.paa new file mode 100644 index 0000000000..e69cde44c0 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold10-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold10.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold10.fxy new file mode 100644 index 0000000000..72d19784a1 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold10.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold11-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-01.paa new file mode 100644 index 0000000000..2bf97b0f27 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold11-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold11-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold11-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-04.paa new file mode 100644 index 0000000000..3380b2bf89 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold11-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold11.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold11.fxy new file mode 100644 index 0000000000..99816f6fb5 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold11.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold12-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-01.paa new file mode 100644 index 0000000000..f501f2593b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold12-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold12-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold12-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-04.paa new file mode 100644 index 0000000000..c4bd46f004 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold12-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold12.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold12.fxy new file mode 100644 index 0000000000..1b3a245879 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold12.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold13-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-01.paa new file mode 100644 index 0000000000..4e9886d86b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold13-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold13-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold13-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-04.paa new file mode 100644 index 0000000000..54b7d03786 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold13-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold13.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold13.fxy new file mode 100644 index 0000000000..d5d1c2b97a Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold13.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold14-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-01.paa new file mode 100644 index 0000000000..38bcc7fec8 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold14-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold14-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold14-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-04.paa new file mode 100644 index 0000000000..b869615414 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold14-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold14.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold14.fxy new file mode 100644 index 0000000000..521aee9cd7 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold14.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold15-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-01.paa new file mode 100644 index 0000000000..2da68e44a4 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold15-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold15-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold15-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-04.paa new file mode 100644 index 0000000000..825cb08bff Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold15-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold15.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold15.fxy new file mode 100644 index 0000000000..24ed35a794 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold15.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold16-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-01.paa new file mode 100644 index 0000000000..c222ecde5d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold16-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold16-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold16-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-04.paa new file mode 100644 index 0000000000..e83ca4db68 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold16-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold16.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold16.fxy new file mode 100644 index 0000000000..160ce95f48 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold16.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold17-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-01.paa new file mode 100644 index 0000000000..a305aeb22b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold17-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold17-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold17-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-04.paa new file mode 100644 index 0000000000..86132e202a Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold17-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold17.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold17.fxy new file mode 100644 index 0000000000..f62a72aa44 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold17.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold18-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-01.paa new file mode 100644 index 0000000000..c8fccc0360 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold18-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold18-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold18-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-04.paa new file mode 100644 index 0000000000..fb1f319d7e Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold18-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold18.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold18.fxy new file mode 100644 index 0000000000..f1daafd800 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold18.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold19-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-01.paa new file mode 100644 index 0000000000..f10f953978 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold19-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold19-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold19-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-04.paa new file mode 100644 index 0000000000..9082ca9be1 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold19-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold19.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold19.fxy new file mode 100644 index 0000000000..7e2f36ddb0 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold19.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold20-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-01.paa new file mode 100644 index 0000000000..cdb9c27a1c Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold20-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold20-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold20-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-04.paa new file mode 100644 index 0000000000..eba8657321 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold20-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold20.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold20.fxy new file mode 100644 index 0000000000..f06b9c5220 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold20.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold21-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-01.paa new file mode 100644 index 0000000000..aef2913981 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold21-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold21-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold21-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-04.paa new file mode 100644 index 0000000000..9138800d94 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold21-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold21.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold21.fxy new file mode 100644 index 0000000000..fd68593304 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold21.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold22-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-01.paa new file mode 100644 index 0000000000..3856a801ce Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold22-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold22-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold22-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-04.paa new file mode 100644 index 0000000000..398cebc35e Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold22-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold22.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold22.fxy new file mode 100644 index 0000000000..51f292d305 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold22.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold23-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-01.paa new file mode 100644 index 0000000000..d47b92788e Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold23-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold23-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold23-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-04.paa new file mode 100644 index 0000000000..ff76bcc7ad Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold23-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold23.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold23.fxy new file mode 100644 index 0000000000..414e8bd522 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold23.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold24-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-01.paa new file mode 100644 index 0000000000..199c484061 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold24-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold24-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold24-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-04.paa new file mode 100644 index 0000000000..2642bc1ec0 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold24-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold24.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold24.fxy new file mode 100644 index 0000000000..5229e497c7 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold24.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold25-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-01.paa new file mode 100644 index 0000000000..bcadccf7d4 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold25-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold25-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold25-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-04.paa new file mode 100644 index 0000000000..2d5dfc2a2f Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold25-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold25.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold25.fxy new file mode 100644 index 0000000000..516cc9609b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold25.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold26-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-01.paa new file mode 100644 index 0000000000..d0e4c2120f Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold26-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold26-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold26-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-04.paa new file mode 100644 index 0000000000..de4f428730 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold26-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold26.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold26.fxy new file mode 100644 index 0000000000..24684f11ff Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold26.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold27-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-01.paa new file mode 100644 index 0000000000..152a4615c1 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold27-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold27-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold27-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-04.paa new file mode 100644 index 0000000000..d2eb7fc7ad Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold27-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold27.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold27.fxy new file mode 100644 index 0000000000..c6659bccaf Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold27.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold28-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-01.paa new file mode 100644 index 0000000000..09f14e9fa0 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold28-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold28-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold28-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-04.paa new file mode 100644 index 0000000000..9226ff30ae Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold28-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold28.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold28.fxy new file mode 100644 index 0000000000..d754c25e3d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold28.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold29-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-01.paa new file mode 100644 index 0000000000..05b0e57646 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold29-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold29-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold29-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-04.paa new file mode 100644 index 0000000000..c2fde72ac5 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold29-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold29.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold29.fxy new file mode 100644 index 0000000000..bd71731362 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold29.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold30-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-01.paa new file mode 100644 index 0000000000..bd0b967fd1 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold30-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold30-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold30-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-04.paa new file mode 100644 index 0000000000..a9dc6e6754 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold30-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold30.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold30.fxy new file mode 100644 index 0000000000..c1a63513ac Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold30.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold31-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-01.paa new file mode 100644 index 0000000000..e17b12e496 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold31-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold31-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold31-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-04.paa new file mode 100644 index 0000000000..fa2db13ffd Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold31-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold31.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold31.fxy new file mode 100644 index 0000000000..50b6284f32 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold31.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold34-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-01.paa new file mode 100644 index 0000000000..5668351dde Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold34-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold34-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold34-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-04.paa new file mode 100644 index 0000000000..e606e0ff53 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold34-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold34.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold34.fxy new file mode 100644 index 0000000000..eef16b2413 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold34.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold35-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-01.paa new file mode 100644 index 0000000000..c86eafbc81 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold35-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold35-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold35-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-04.paa new file mode 100644 index 0000000000..97ca9bae8b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold35-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold35.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold35.fxy new file mode 100644 index 0000000000..362f8a0ffc Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold35.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold37-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-01.paa new file mode 100644 index 0000000000..8d35477181 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold37-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold37-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold37-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-04.paa new file mode 100644 index 0000000000..fa36d3fa73 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold37-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold37.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold37.fxy new file mode 100644 index 0000000000..2bf38a4044 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold37.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold46-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-01.paa new file mode 100644 index 0000000000..23261136b9 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold46-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold46-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold46-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-04.paa new file mode 100644 index 0000000000..5bf7201a9a Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold46-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold46.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold46.fxy new file mode 100644 index 0000000000..a6bd7ea3ba Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold46.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold6-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-01.paa new file mode 100644 index 0000000000..3d2a0e102b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold6-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold6-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold6-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-04.paa new file mode 100644 index 0000000000..454956d448 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold6-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold6.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold6.fxy new file mode 100644 index 0000000000..6feee35d5b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold6.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold7-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-01.paa new file mode 100644 index 0000000000..392f2c7327 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold7-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold7-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold7-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-04.paa new file mode 100644 index 0000000000..896fb3261b Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold7-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold7.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold7.fxy new file mode 100644 index 0000000000..fa26952d21 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold7.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold8-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-01.paa new file mode 100644 index 0000000000..4138867d7e Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold8-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold8-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold8-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-04.paa new file mode 100644 index 0000000000..8972409d37 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold8-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold8.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold8.fxy new file mode 100644 index 0000000000..9deb881e39 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold8.fxy differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold9-01.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-01.paa new file mode 100644 index 0000000000..f450a93e43 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-01.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold9-02.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-02.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-02.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold9-03.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-03.paa new file mode 100644 index 0000000000..06dd11820d Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-03.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold9-04.paa b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-04.paa new file mode 100644 index 0000000000..e6a66810c8 Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold9-04.paa differ diff --git a/addons/fonts/PixelSplitterBold/PixelSplitterBold9.fxy b/addons/fonts/PixelSplitterBold/PixelSplitterBold9.fxy new file mode 100644 index 0000000000..f9f58bb7aa Binary files /dev/null and b/addons/fonts/PixelSplitterBold/PixelSplitterBold9.fxy differ diff --git a/optionals/compat_hlcmods_aug/config.cpp b/addons/fonts/config.cpp similarity index 56% rename from optionals/compat_hlcmods_aug/config.cpp rename to addons/fonts/config.cpp index 06192a6ffd..f37dba286c 100644 --- a/optionals/compat_hlcmods_aug/config.cpp +++ b/addons/fonts/config.cpp @@ -5,10 +5,11 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_AUG"}; - author[]={"Ruthberg"}; + requiredAddons[] = {"ace_main"}; + author[] = {"jaynus"}; + authorUrl = "https://github.com/jaynus/"; VERSION_CONFIG; }; }; -#include "CfgWeapons.hpp" +#include "CfgFontFamilies.hpp" diff --git a/addons/fonts/script_component.hpp b/addons/fonts/script_component.hpp new file mode 100644 index 0000000000..a8029b7105 --- /dev/null +++ b/addons/fonts/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT fonts +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_FONTS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_ENABLED_FONTS + #define DEBUG_SETTINGS DEBUG_SETTINGS_FONTS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/frag/ACE_Settings.hpp b/addons/frag/ACE_Settings.hpp index b160a127f3..84bba326f0 100644 --- a/addons/frag/ACE_Settings.hpp +++ b/addons/frag/ACE_Settings.hpp @@ -1,8 +1,33 @@ class ACE_Settings { - class GVAR(enabled) { - displayName = "Frag System"; - description = "Enables the shrapnel system for explosives"; + class GVAR(Enabled) { + displayName = CSTRING(EnableFrag); + description = CSTRING(EnableFrag_Desc); typeName = "BOOL"; value = 1; }; + class GVAR(SpallEnabled) { + displayName = CSTRING(EnableSpall); + description = CSTRING(EnableSpall_Desc); + typeName = "BOOL"; + value = 0; + }; + class GVAR(maxTrack) { + displayName = CSTRING(MaxTrack); + description = CSTRING(MaxTrack_Desc); + typeName = "SCALAR"; + value = 500; + }; + class GVAR(MaxTrackPerFrame) { + displayName = CSTRING(MaxTrackPerFrame); + description = CSTRING(MaxTrackPerFrame_Desc); + typeName = "SCALAR"; + value = 50; + }; + + class GVAR(EnableDebugTrace) { + displayName = CSTRING(EnableDebugTrace); + description = CSTRING(EnableDebugTrace_Desc); + typeName = "BOOL"; + value = 0; + }; }; diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 19414965b2..41734d2806 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -8,6 +8,7 @@ class CfgAmmo { //class ace_arty_105mm_m1_m782_delay: ace_arty_105mm_m1_m782_prox { // GVAR(skip) = 1; //}; + class Bo_GBU12_LGB; class ACE_GBU12 : Bo_GBU12_LGB { GVAR(enabled) = 1; @@ -470,4 +471,6 @@ class CfgAmmo { class ACE_frag_spall_huge: ACE_frag_huge { timeToLive = 0.3; }; + + #include "CfgAmmoReflections.hpp" }; diff --git a/addons/frag/CfgAmmoReflections.hpp b/addons/frag/CfgAmmoReflections.hpp new file mode 100644 index 0000000000..f59d67f89a --- /dev/null +++ b/addons/frag/CfgAmmoReflections.hpp @@ -0,0 +1,2522 @@ +//CfgAmmoReflections.hpp + +#define ACE_EXPLOSION_REFLECTION(range, hit) class ace_explosion_reflection_##range##_##hit : ace_explosion_reflection_base { indirectHitRange = range; indirectHit = hit; dangerRadiusHit = range*3; suppressionRadiusHit = range*2; }; +class ace_explosion_reflection_base : Sh_120mm_HE { + CraterWaterEffects = ""; + CraterEffects = ""; + effectsMissile = ""; + ExplosionEffects = ""; + effectFlare = ""; + class HitEffects { + hitWater = ""; + }; + multiSoundHit[] = {}; + explosionTime = 0.0001; + explosive = 1; + soundFakeFall[] = {}; + typicalSpeed = 0; + model = "\A3\Weapons_F\empty.p3d"; + craterShape = "\A3\weapons_f\empty.p3d"; +}; + +ACE_EXPLOSION_REFLECTION(2,10); +ACE_EXPLOSION_REFLECTION(2,20); +ACE_EXPLOSION_REFLECTION(2,30); +ACE_EXPLOSION_REFLECTION(2,40); +ACE_EXPLOSION_REFLECTION(2,50); +ACE_EXPLOSION_REFLECTION(2,60); +ACE_EXPLOSION_REFLECTION(2,70); +ACE_EXPLOSION_REFLECTION(2,80); +ACE_EXPLOSION_REFLECTION(2,90); +ACE_EXPLOSION_REFLECTION(2,100); +ACE_EXPLOSION_REFLECTION(2,110); +ACE_EXPLOSION_REFLECTION(2,120); +ACE_EXPLOSION_REFLECTION(2,130); +ACE_EXPLOSION_REFLECTION(2,140); +ACE_EXPLOSION_REFLECTION(2,150); +ACE_EXPLOSION_REFLECTION(2,160); +ACE_EXPLOSION_REFLECTION(2,170); +ACE_EXPLOSION_REFLECTION(2,180); +ACE_EXPLOSION_REFLECTION(2,190); +ACE_EXPLOSION_REFLECTION(2,200); +ACE_EXPLOSION_REFLECTION(2,210); +ACE_EXPLOSION_REFLECTION(2,220); +ACE_EXPLOSION_REFLECTION(2,230); +ACE_EXPLOSION_REFLECTION(2,240); +ACE_EXPLOSION_REFLECTION(2,250); +ACE_EXPLOSION_REFLECTION(2,260); +ACE_EXPLOSION_REFLECTION(2,270); +ACE_EXPLOSION_REFLECTION(2,280); +ACE_EXPLOSION_REFLECTION(2,290); +ACE_EXPLOSION_REFLECTION(2,300); +ACE_EXPLOSION_REFLECTION(2,310); +ACE_EXPLOSION_REFLECTION(2,320); +ACE_EXPLOSION_REFLECTION(2,330); +ACE_EXPLOSION_REFLECTION(2,340); +ACE_EXPLOSION_REFLECTION(2,350); +ACE_EXPLOSION_REFLECTION(2,360); +ACE_EXPLOSION_REFLECTION(2,370); +ACE_EXPLOSION_REFLECTION(2,380); +ACE_EXPLOSION_REFLECTION(2,390); +ACE_EXPLOSION_REFLECTION(2,400); +ACE_EXPLOSION_REFLECTION(2,410); +ACE_EXPLOSION_REFLECTION(2,420); +ACE_EXPLOSION_REFLECTION(2,430); +ACE_EXPLOSION_REFLECTION(2,440); +ACE_EXPLOSION_REFLECTION(2,450); +ACE_EXPLOSION_REFLECTION(2,460); +ACE_EXPLOSION_REFLECTION(2,470); +ACE_EXPLOSION_REFLECTION(2,480); +ACE_EXPLOSION_REFLECTION(2,490); +ACE_EXPLOSION_REFLECTION(2,500); +ACE_EXPLOSION_REFLECTION(4,10); +ACE_EXPLOSION_REFLECTION(4,20); +ACE_EXPLOSION_REFLECTION(4,30); +ACE_EXPLOSION_REFLECTION(4,40); +ACE_EXPLOSION_REFLECTION(4,50); +ACE_EXPLOSION_REFLECTION(4,60); +ACE_EXPLOSION_REFLECTION(4,70); +ACE_EXPLOSION_REFLECTION(4,80); +ACE_EXPLOSION_REFLECTION(4,90); +ACE_EXPLOSION_REFLECTION(4,100); +ACE_EXPLOSION_REFLECTION(4,110); +ACE_EXPLOSION_REFLECTION(4,120); +ACE_EXPLOSION_REFLECTION(4,130); +ACE_EXPLOSION_REFLECTION(4,140); +ACE_EXPLOSION_REFLECTION(4,150); +ACE_EXPLOSION_REFLECTION(4,160); +ACE_EXPLOSION_REFLECTION(4,170); +ACE_EXPLOSION_REFLECTION(4,180); +ACE_EXPLOSION_REFLECTION(4,190); +ACE_EXPLOSION_REFLECTION(4,200); +ACE_EXPLOSION_REFLECTION(4,210); +ACE_EXPLOSION_REFLECTION(4,220); +ACE_EXPLOSION_REFLECTION(4,230); +ACE_EXPLOSION_REFLECTION(4,240); +ACE_EXPLOSION_REFLECTION(4,250); +ACE_EXPLOSION_REFLECTION(4,260); +ACE_EXPLOSION_REFLECTION(4,270); +ACE_EXPLOSION_REFLECTION(4,280); +ACE_EXPLOSION_REFLECTION(4,290); +ACE_EXPLOSION_REFLECTION(4,300); +ACE_EXPLOSION_REFLECTION(4,310); +ACE_EXPLOSION_REFLECTION(4,320); +ACE_EXPLOSION_REFLECTION(4,330); +ACE_EXPLOSION_REFLECTION(4,340); +ACE_EXPLOSION_REFLECTION(4,350); +ACE_EXPLOSION_REFLECTION(4,360); +ACE_EXPLOSION_REFLECTION(4,370); +ACE_EXPLOSION_REFLECTION(4,380); +ACE_EXPLOSION_REFLECTION(4,390); +ACE_EXPLOSION_REFLECTION(4,400); +ACE_EXPLOSION_REFLECTION(4,410); +ACE_EXPLOSION_REFLECTION(4,420); +ACE_EXPLOSION_REFLECTION(4,430); +ACE_EXPLOSION_REFLECTION(4,440); +ACE_EXPLOSION_REFLECTION(4,450); +ACE_EXPLOSION_REFLECTION(4,460); +ACE_EXPLOSION_REFLECTION(4,470); +ACE_EXPLOSION_REFLECTION(4,480); +ACE_EXPLOSION_REFLECTION(4,490); +ACE_EXPLOSION_REFLECTION(4,500); +ACE_EXPLOSION_REFLECTION(6,10); +ACE_EXPLOSION_REFLECTION(6,20); +ACE_EXPLOSION_REFLECTION(6,30); +ACE_EXPLOSION_REFLECTION(6,40); +ACE_EXPLOSION_REFLECTION(6,50); +ACE_EXPLOSION_REFLECTION(6,60); +ACE_EXPLOSION_REFLECTION(6,70); +ACE_EXPLOSION_REFLECTION(6,80); +ACE_EXPLOSION_REFLECTION(6,90); +ACE_EXPLOSION_REFLECTION(6,100); +ACE_EXPLOSION_REFLECTION(6,110); +ACE_EXPLOSION_REFLECTION(6,120); +ACE_EXPLOSION_REFLECTION(6,130); +ACE_EXPLOSION_REFLECTION(6,140); +ACE_EXPLOSION_REFLECTION(6,150); +ACE_EXPLOSION_REFLECTION(6,160); +ACE_EXPLOSION_REFLECTION(6,170); +ACE_EXPLOSION_REFLECTION(6,180); +ACE_EXPLOSION_REFLECTION(6,190); +ACE_EXPLOSION_REFLECTION(6,200); +ACE_EXPLOSION_REFLECTION(6,210); +ACE_EXPLOSION_REFLECTION(6,220); +ACE_EXPLOSION_REFLECTION(6,230); +ACE_EXPLOSION_REFLECTION(6,240); +ACE_EXPLOSION_REFLECTION(6,250); +ACE_EXPLOSION_REFLECTION(6,260); +ACE_EXPLOSION_REFLECTION(6,270); +ACE_EXPLOSION_REFLECTION(6,280); +ACE_EXPLOSION_REFLECTION(6,290); +ACE_EXPLOSION_REFLECTION(6,300); +ACE_EXPLOSION_REFLECTION(6,310); +ACE_EXPLOSION_REFLECTION(6,320); +ACE_EXPLOSION_REFLECTION(6,330); +ACE_EXPLOSION_REFLECTION(6,340); +ACE_EXPLOSION_REFLECTION(6,350); +ACE_EXPLOSION_REFLECTION(6,360); +ACE_EXPLOSION_REFLECTION(6,370); +ACE_EXPLOSION_REFLECTION(6,380); +ACE_EXPLOSION_REFLECTION(6,390); +ACE_EXPLOSION_REFLECTION(6,400); +ACE_EXPLOSION_REFLECTION(6,410); +ACE_EXPLOSION_REFLECTION(6,420); +ACE_EXPLOSION_REFLECTION(6,430); +ACE_EXPLOSION_REFLECTION(6,440); +ACE_EXPLOSION_REFLECTION(6,450); +ACE_EXPLOSION_REFLECTION(6,460); +ACE_EXPLOSION_REFLECTION(6,470); +ACE_EXPLOSION_REFLECTION(6,480); +ACE_EXPLOSION_REFLECTION(6,490); +ACE_EXPLOSION_REFLECTION(6,500); +ACE_EXPLOSION_REFLECTION(8,10); +ACE_EXPLOSION_REFLECTION(8,20); +ACE_EXPLOSION_REFLECTION(8,30); +ACE_EXPLOSION_REFLECTION(8,40); +ACE_EXPLOSION_REFLECTION(8,50); +ACE_EXPLOSION_REFLECTION(8,60); +ACE_EXPLOSION_REFLECTION(8,70); +ACE_EXPLOSION_REFLECTION(8,80); +ACE_EXPLOSION_REFLECTION(8,90); +ACE_EXPLOSION_REFLECTION(8,100); +ACE_EXPLOSION_REFLECTION(8,110); +ACE_EXPLOSION_REFLECTION(8,120); +ACE_EXPLOSION_REFLECTION(8,130); +ACE_EXPLOSION_REFLECTION(8,140); +ACE_EXPLOSION_REFLECTION(8,150); +ACE_EXPLOSION_REFLECTION(8,160); +ACE_EXPLOSION_REFLECTION(8,170); +ACE_EXPLOSION_REFLECTION(8,180); +ACE_EXPLOSION_REFLECTION(8,190); +ACE_EXPLOSION_REFLECTION(8,200); +ACE_EXPLOSION_REFLECTION(8,210); +ACE_EXPLOSION_REFLECTION(8,220); +ACE_EXPLOSION_REFLECTION(8,230); +ACE_EXPLOSION_REFLECTION(8,240); +ACE_EXPLOSION_REFLECTION(8,250); +ACE_EXPLOSION_REFLECTION(8,260); +ACE_EXPLOSION_REFLECTION(8,270); +ACE_EXPLOSION_REFLECTION(8,280); +ACE_EXPLOSION_REFLECTION(8,290); +ACE_EXPLOSION_REFLECTION(8,300); +ACE_EXPLOSION_REFLECTION(8,310); +ACE_EXPLOSION_REFLECTION(8,320); +ACE_EXPLOSION_REFLECTION(8,330); +ACE_EXPLOSION_REFLECTION(8,340); +ACE_EXPLOSION_REFLECTION(8,350); +ACE_EXPLOSION_REFLECTION(8,360); +ACE_EXPLOSION_REFLECTION(8,370); +ACE_EXPLOSION_REFLECTION(8,380); +ACE_EXPLOSION_REFLECTION(8,390); +ACE_EXPLOSION_REFLECTION(8,400); +ACE_EXPLOSION_REFLECTION(8,410); +ACE_EXPLOSION_REFLECTION(8,420); +ACE_EXPLOSION_REFLECTION(8,430); +ACE_EXPLOSION_REFLECTION(8,440); +ACE_EXPLOSION_REFLECTION(8,450); +ACE_EXPLOSION_REFLECTION(8,460); +ACE_EXPLOSION_REFLECTION(8,470); +ACE_EXPLOSION_REFLECTION(8,480); +ACE_EXPLOSION_REFLECTION(8,490); +ACE_EXPLOSION_REFLECTION(8,500); +ACE_EXPLOSION_REFLECTION(10,10); +ACE_EXPLOSION_REFLECTION(10,20); +ACE_EXPLOSION_REFLECTION(10,30); +ACE_EXPLOSION_REFLECTION(10,40); +ACE_EXPLOSION_REFLECTION(10,50); +ACE_EXPLOSION_REFLECTION(10,60); +ACE_EXPLOSION_REFLECTION(10,70); +ACE_EXPLOSION_REFLECTION(10,80); +ACE_EXPLOSION_REFLECTION(10,90); +ACE_EXPLOSION_REFLECTION(10,100); +ACE_EXPLOSION_REFLECTION(10,110); +ACE_EXPLOSION_REFLECTION(10,120); +ACE_EXPLOSION_REFLECTION(10,130); +ACE_EXPLOSION_REFLECTION(10,140); +ACE_EXPLOSION_REFLECTION(10,150); +ACE_EXPLOSION_REFLECTION(10,160); +ACE_EXPLOSION_REFLECTION(10,170); +ACE_EXPLOSION_REFLECTION(10,180); +ACE_EXPLOSION_REFLECTION(10,190); +ACE_EXPLOSION_REFLECTION(10,200); +ACE_EXPLOSION_REFLECTION(10,210); +ACE_EXPLOSION_REFLECTION(10,220); +ACE_EXPLOSION_REFLECTION(10,230); +ACE_EXPLOSION_REFLECTION(10,240); +ACE_EXPLOSION_REFLECTION(10,250); +ACE_EXPLOSION_REFLECTION(10,260); +ACE_EXPLOSION_REFLECTION(10,270); +ACE_EXPLOSION_REFLECTION(10,280); +ACE_EXPLOSION_REFLECTION(10,290); +ACE_EXPLOSION_REFLECTION(10,300); +ACE_EXPLOSION_REFLECTION(10,310); +ACE_EXPLOSION_REFLECTION(10,320); +ACE_EXPLOSION_REFLECTION(10,330); +ACE_EXPLOSION_REFLECTION(10,340); +ACE_EXPLOSION_REFLECTION(10,350); +ACE_EXPLOSION_REFLECTION(10,360); +ACE_EXPLOSION_REFLECTION(10,370); +ACE_EXPLOSION_REFLECTION(10,380); +ACE_EXPLOSION_REFLECTION(10,390); +ACE_EXPLOSION_REFLECTION(10,400); +ACE_EXPLOSION_REFLECTION(10,410); +ACE_EXPLOSION_REFLECTION(10,420); +ACE_EXPLOSION_REFLECTION(10,430); +ACE_EXPLOSION_REFLECTION(10,440); +ACE_EXPLOSION_REFLECTION(10,450); +ACE_EXPLOSION_REFLECTION(10,460); +ACE_EXPLOSION_REFLECTION(10,470); +ACE_EXPLOSION_REFLECTION(10,480); +ACE_EXPLOSION_REFLECTION(10,490); +ACE_EXPLOSION_REFLECTION(10,500); +ACE_EXPLOSION_REFLECTION(12,10); +ACE_EXPLOSION_REFLECTION(12,20); +ACE_EXPLOSION_REFLECTION(12,30); +ACE_EXPLOSION_REFLECTION(12,40); +ACE_EXPLOSION_REFLECTION(12,50); +ACE_EXPLOSION_REFLECTION(12,60); +ACE_EXPLOSION_REFLECTION(12,70); +ACE_EXPLOSION_REFLECTION(12,80); +ACE_EXPLOSION_REFLECTION(12,90); +ACE_EXPLOSION_REFLECTION(12,100); +ACE_EXPLOSION_REFLECTION(12,110); +ACE_EXPLOSION_REFLECTION(12,120); +ACE_EXPLOSION_REFLECTION(12,130); +ACE_EXPLOSION_REFLECTION(12,140); +ACE_EXPLOSION_REFLECTION(12,150); +ACE_EXPLOSION_REFLECTION(12,160); +ACE_EXPLOSION_REFLECTION(12,170); +ACE_EXPLOSION_REFLECTION(12,180); +ACE_EXPLOSION_REFLECTION(12,190); +ACE_EXPLOSION_REFLECTION(12,200); +ACE_EXPLOSION_REFLECTION(12,210); +ACE_EXPLOSION_REFLECTION(12,220); +ACE_EXPLOSION_REFLECTION(12,230); +ACE_EXPLOSION_REFLECTION(12,240); +ACE_EXPLOSION_REFLECTION(12,250); +ACE_EXPLOSION_REFLECTION(12,260); +ACE_EXPLOSION_REFLECTION(12,270); +ACE_EXPLOSION_REFLECTION(12,280); +ACE_EXPLOSION_REFLECTION(12,290); +ACE_EXPLOSION_REFLECTION(12,300); +ACE_EXPLOSION_REFLECTION(12,310); +ACE_EXPLOSION_REFLECTION(12,320); +ACE_EXPLOSION_REFLECTION(12,330); +ACE_EXPLOSION_REFLECTION(12,340); +ACE_EXPLOSION_REFLECTION(12,350); +ACE_EXPLOSION_REFLECTION(12,360); +ACE_EXPLOSION_REFLECTION(12,370); +ACE_EXPLOSION_REFLECTION(12,380); +ACE_EXPLOSION_REFLECTION(12,390); +ACE_EXPLOSION_REFLECTION(12,400); +ACE_EXPLOSION_REFLECTION(12,410); +ACE_EXPLOSION_REFLECTION(12,420); +ACE_EXPLOSION_REFLECTION(12,430); +ACE_EXPLOSION_REFLECTION(12,440); +ACE_EXPLOSION_REFLECTION(12,450); +ACE_EXPLOSION_REFLECTION(12,460); +ACE_EXPLOSION_REFLECTION(12,470); +ACE_EXPLOSION_REFLECTION(12,480); +ACE_EXPLOSION_REFLECTION(12,490); +ACE_EXPLOSION_REFLECTION(12,500); +ACE_EXPLOSION_REFLECTION(14,10); +ACE_EXPLOSION_REFLECTION(14,20); +ACE_EXPLOSION_REFLECTION(14,30); +ACE_EXPLOSION_REFLECTION(14,40); +ACE_EXPLOSION_REFLECTION(14,50); +ACE_EXPLOSION_REFLECTION(14,60); +ACE_EXPLOSION_REFLECTION(14,70); +ACE_EXPLOSION_REFLECTION(14,80); +ACE_EXPLOSION_REFLECTION(14,90); +ACE_EXPLOSION_REFLECTION(14,100); +ACE_EXPLOSION_REFLECTION(14,110); +ACE_EXPLOSION_REFLECTION(14,120); +ACE_EXPLOSION_REFLECTION(14,130); +ACE_EXPLOSION_REFLECTION(14,140); +ACE_EXPLOSION_REFLECTION(14,150); +ACE_EXPLOSION_REFLECTION(14,160); +ACE_EXPLOSION_REFLECTION(14,170); +ACE_EXPLOSION_REFLECTION(14,180); +ACE_EXPLOSION_REFLECTION(14,190); +ACE_EXPLOSION_REFLECTION(14,200); +ACE_EXPLOSION_REFLECTION(14,210); +ACE_EXPLOSION_REFLECTION(14,220); +ACE_EXPLOSION_REFLECTION(14,230); +ACE_EXPLOSION_REFLECTION(14,240); +ACE_EXPLOSION_REFLECTION(14,250); +ACE_EXPLOSION_REFLECTION(14,260); +ACE_EXPLOSION_REFLECTION(14,270); +ACE_EXPLOSION_REFLECTION(14,280); +ACE_EXPLOSION_REFLECTION(14,290); +ACE_EXPLOSION_REFLECTION(14,300); +ACE_EXPLOSION_REFLECTION(14,310); +ACE_EXPLOSION_REFLECTION(14,320); +ACE_EXPLOSION_REFLECTION(14,330); +ACE_EXPLOSION_REFLECTION(14,340); +ACE_EXPLOSION_REFLECTION(14,350); +ACE_EXPLOSION_REFLECTION(14,360); +ACE_EXPLOSION_REFLECTION(14,370); +ACE_EXPLOSION_REFLECTION(14,380); +ACE_EXPLOSION_REFLECTION(14,390); +ACE_EXPLOSION_REFLECTION(14,400); +ACE_EXPLOSION_REFLECTION(14,410); +ACE_EXPLOSION_REFLECTION(14,420); +ACE_EXPLOSION_REFLECTION(14,430); +ACE_EXPLOSION_REFLECTION(14,440); +ACE_EXPLOSION_REFLECTION(14,450); +ACE_EXPLOSION_REFLECTION(14,460); +ACE_EXPLOSION_REFLECTION(14,470); +ACE_EXPLOSION_REFLECTION(14,480); +ACE_EXPLOSION_REFLECTION(14,490); +ACE_EXPLOSION_REFLECTION(14,500); +ACE_EXPLOSION_REFLECTION(16,10); +ACE_EXPLOSION_REFLECTION(16,20); +ACE_EXPLOSION_REFLECTION(16,30); +ACE_EXPLOSION_REFLECTION(16,40); +ACE_EXPLOSION_REFLECTION(16,50); +ACE_EXPLOSION_REFLECTION(16,60); +ACE_EXPLOSION_REFLECTION(16,70); +ACE_EXPLOSION_REFLECTION(16,80); +ACE_EXPLOSION_REFLECTION(16,90); +ACE_EXPLOSION_REFLECTION(16,100); +ACE_EXPLOSION_REFLECTION(16,110); +ACE_EXPLOSION_REFLECTION(16,120); +ACE_EXPLOSION_REFLECTION(16,130); +ACE_EXPLOSION_REFLECTION(16,140); +ACE_EXPLOSION_REFLECTION(16,150); +ACE_EXPLOSION_REFLECTION(16,160); +ACE_EXPLOSION_REFLECTION(16,170); +ACE_EXPLOSION_REFLECTION(16,180); +ACE_EXPLOSION_REFLECTION(16,190); +ACE_EXPLOSION_REFLECTION(16,200); +ACE_EXPLOSION_REFLECTION(16,210); +ACE_EXPLOSION_REFLECTION(16,220); +ACE_EXPLOSION_REFLECTION(16,230); +ACE_EXPLOSION_REFLECTION(16,240); +ACE_EXPLOSION_REFLECTION(16,250); +ACE_EXPLOSION_REFLECTION(16,260); +ACE_EXPLOSION_REFLECTION(16,270); +ACE_EXPLOSION_REFLECTION(16,280); +ACE_EXPLOSION_REFLECTION(16,290); +ACE_EXPLOSION_REFLECTION(16,300); +ACE_EXPLOSION_REFLECTION(16,310); +ACE_EXPLOSION_REFLECTION(16,320); +ACE_EXPLOSION_REFLECTION(16,330); +ACE_EXPLOSION_REFLECTION(16,340); +ACE_EXPLOSION_REFLECTION(16,350); +ACE_EXPLOSION_REFLECTION(16,360); +ACE_EXPLOSION_REFLECTION(16,370); +ACE_EXPLOSION_REFLECTION(16,380); +ACE_EXPLOSION_REFLECTION(16,390); +ACE_EXPLOSION_REFLECTION(16,400); +ACE_EXPLOSION_REFLECTION(16,410); +ACE_EXPLOSION_REFLECTION(16,420); +ACE_EXPLOSION_REFLECTION(16,430); +ACE_EXPLOSION_REFLECTION(16,440); +ACE_EXPLOSION_REFLECTION(16,450); +ACE_EXPLOSION_REFLECTION(16,460); +ACE_EXPLOSION_REFLECTION(16,470); +ACE_EXPLOSION_REFLECTION(16,480); +ACE_EXPLOSION_REFLECTION(16,490); +ACE_EXPLOSION_REFLECTION(16,500); +ACE_EXPLOSION_REFLECTION(18,10); +ACE_EXPLOSION_REFLECTION(18,20); +ACE_EXPLOSION_REFLECTION(18,30); +ACE_EXPLOSION_REFLECTION(18,40); +ACE_EXPLOSION_REFLECTION(18,50); +ACE_EXPLOSION_REFLECTION(18,60); +ACE_EXPLOSION_REFLECTION(18,70); +ACE_EXPLOSION_REFLECTION(18,80); +ACE_EXPLOSION_REFLECTION(18,90); +ACE_EXPLOSION_REFLECTION(18,100); +ACE_EXPLOSION_REFLECTION(18,110); +ACE_EXPLOSION_REFLECTION(18,120); +ACE_EXPLOSION_REFLECTION(18,130); +ACE_EXPLOSION_REFLECTION(18,140); +ACE_EXPLOSION_REFLECTION(18,150); +ACE_EXPLOSION_REFLECTION(18,160); +ACE_EXPLOSION_REFLECTION(18,170); +ACE_EXPLOSION_REFLECTION(18,180); +ACE_EXPLOSION_REFLECTION(18,190); +ACE_EXPLOSION_REFLECTION(18,200); +ACE_EXPLOSION_REFLECTION(18,210); +ACE_EXPLOSION_REFLECTION(18,220); +ACE_EXPLOSION_REFLECTION(18,230); +ACE_EXPLOSION_REFLECTION(18,240); +ACE_EXPLOSION_REFLECTION(18,250); +ACE_EXPLOSION_REFLECTION(18,260); +ACE_EXPLOSION_REFLECTION(18,270); +ACE_EXPLOSION_REFLECTION(18,280); +ACE_EXPLOSION_REFLECTION(18,290); +ACE_EXPLOSION_REFLECTION(18,300); +ACE_EXPLOSION_REFLECTION(18,310); +ACE_EXPLOSION_REFLECTION(18,320); +ACE_EXPLOSION_REFLECTION(18,330); +ACE_EXPLOSION_REFLECTION(18,340); +ACE_EXPLOSION_REFLECTION(18,350); +ACE_EXPLOSION_REFLECTION(18,360); +ACE_EXPLOSION_REFLECTION(18,370); +ACE_EXPLOSION_REFLECTION(18,380); +ACE_EXPLOSION_REFLECTION(18,390); +ACE_EXPLOSION_REFLECTION(18,400); +ACE_EXPLOSION_REFLECTION(18,410); +ACE_EXPLOSION_REFLECTION(18,420); +ACE_EXPLOSION_REFLECTION(18,430); +ACE_EXPLOSION_REFLECTION(18,440); +ACE_EXPLOSION_REFLECTION(18,450); +ACE_EXPLOSION_REFLECTION(18,460); +ACE_EXPLOSION_REFLECTION(18,470); +ACE_EXPLOSION_REFLECTION(18,480); +ACE_EXPLOSION_REFLECTION(18,490); +ACE_EXPLOSION_REFLECTION(18,500); +ACE_EXPLOSION_REFLECTION(20,10); +ACE_EXPLOSION_REFLECTION(20,20); +ACE_EXPLOSION_REFLECTION(20,30); +ACE_EXPLOSION_REFLECTION(20,40); +ACE_EXPLOSION_REFLECTION(20,50); +ACE_EXPLOSION_REFLECTION(20,60); +ACE_EXPLOSION_REFLECTION(20,70); +ACE_EXPLOSION_REFLECTION(20,80); +ACE_EXPLOSION_REFLECTION(20,90); +ACE_EXPLOSION_REFLECTION(20,100); +ACE_EXPLOSION_REFLECTION(20,110); +ACE_EXPLOSION_REFLECTION(20,120); +ACE_EXPLOSION_REFLECTION(20,130); +ACE_EXPLOSION_REFLECTION(20,140); +ACE_EXPLOSION_REFLECTION(20,150); +ACE_EXPLOSION_REFLECTION(20,160); +ACE_EXPLOSION_REFLECTION(20,170); +ACE_EXPLOSION_REFLECTION(20,180); +ACE_EXPLOSION_REFLECTION(20,190); +ACE_EXPLOSION_REFLECTION(20,200); +ACE_EXPLOSION_REFLECTION(20,210); +ACE_EXPLOSION_REFLECTION(20,220); +ACE_EXPLOSION_REFLECTION(20,230); +ACE_EXPLOSION_REFLECTION(20,240); +ACE_EXPLOSION_REFLECTION(20,250); +ACE_EXPLOSION_REFLECTION(20,260); +ACE_EXPLOSION_REFLECTION(20,270); +ACE_EXPLOSION_REFLECTION(20,280); +ACE_EXPLOSION_REFLECTION(20,290); +ACE_EXPLOSION_REFLECTION(20,300); +ACE_EXPLOSION_REFLECTION(20,310); +ACE_EXPLOSION_REFLECTION(20,320); +ACE_EXPLOSION_REFLECTION(20,330); +ACE_EXPLOSION_REFLECTION(20,340); +ACE_EXPLOSION_REFLECTION(20,350); +ACE_EXPLOSION_REFLECTION(20,360); +ACE_EXPLOSION_REFLECTION(20,370); +ACE_EXPLOSION_REFLECTION(20,380); +ACE_EXPLOSION_REFLECTION(20,390); +ACE_EXPLOSION_REFLECTION(20,400); +ACE_EXPLOSION_REFLECTION(20,410); +ACE_EXPLOSION_REFLECTION(20,420); +ACE_EXPLOSION_REFLECTION(20,430); +ACE_EXPLOSION_REFLECTION(20,440); +ACE_EXPLOSION_REFLECTION(20,450); +ACE_EXPLOSION_REFLECTION(20,460); +ACE_EXPLOSION_REFLECTION(20,470); +ACE_EXPLOSION_REFLECTION(20,480); +ACE_EXPLOSION_REFLECTION(20,490); +ACE_EXPLOSION_REFLECTION(20,500); +ACE_EXPLOSION_REFLECTION(22,10); +ACE_EXPLOSION_REFLECTION(22,20); +ACE_EXPLOSION_REFLECTION(22,30); +ACE_EXPLOSION_REFLECTION(22,40); +ACE_EXPLOSION_REFLECTION(22,50); +ACE_EXPLOSION_REFLECTION(22,60); +ACE_EXPLOSION_REFLECTION(22,70); +ACE_EXPLOSION_REFLECTION(22,80); +ACE_EXPLOSION_REFLECTION(22,90); +ACE_EXPLOSION_REFLECTION(22,100); +ACE_EXPLOSION_REFLECTION(22,110); +ACE_EXPLOSION_REFLECTION(22,120); +ACE_EXPLOSION_REFLECTION(22,130); +ACE_EXPLOSION_REFLECTION(22,140); +ACE_EXPLOSION_REFLECTION(22,150); +ACE_EXPLOSION_REFLECTION(22,160); +ACE_EXPLOSION_REFLECTION(22,170); +ACE_EXPLOSION_REFLECTION(22,180); +ACE_EXPLOSION_REFLECTION(22,190); +ACE_EXPLOSION_REFLECTION(22,200); +ACE_EXPLOSION_REFLECTION(22,210); +ACE_EXPLOSION_REFLECTION(22,220); +ACE_EXPLOSION_REFLECTION(22,230); +ACE_EXPLOSION_REFLECTION(22,240); +ACE_EXPLOSION_REFLECTION(22,250); +ACE_EXPLOSION_REFLECTION(22,260); +ACE_EXPLOSION_REFLECTION(22,270); +ACE_EXPLOSION_REFLECTION(22,280); +ACE_EXPLOSION_REFLECTION(22,290); +ACE_EXPLOSION_REFLECTION(22,300); +ACE_EXPLOSION_REFLECTION(22,310); +ACE_EXPLOSION_REFLECTION(22,320); +ACE_EXPLOSION_REFLECTION(22,330); +ACE_EXPLOSION_REFLECTION(22,340); +ACE_EXPLOSION_REFLECTION(22,350); +ACE_EXPLOSION_REFLECTION(22,360); +ACE_EXPLOSION_REFLECTION(22,370); +ACE_EXPLOSION_REFLECTION(22,380); +ACE_EXPLOSION_REFLECTION(22,390); +ACE_EXPLOSION_REFLECTION(22,400); +ACE_EXPLOSION_REFLECTION(22,410); +ACE_EXPLOSION_REFLECTION(22,420); +ACE_EXPLOSION_REFLECTION(22,430); +ACE_EXPLOSION_REFLECTION(22,440); +ACE_EXPLOSION_REFLECTION(22,450); +ACE_EXPLOSION_REFLECTION(22,460); +ACE_EXPLOSION_REFLECTION(22,470); +ACE_EXPLOSION_REFLECTION(22,480); +ACE_EXPLOSION_REFLECTION(22,490); +ACE_EXPLOSION_REFLECTION(22,500); +ACE_EXPLOSION_REFLECTION(24,10); +ACE_EXPLOSION_REFLECTION(24,20); +ACE_EXPLOSION_REFLECTION(24,30); +ACE_EXPLOSION_REFLECTION(24,40); +ACE_EXPLOSION_REFLECTION(24,50); +ACE_EXPLOSION_REFLECTION(24,60); +ACE_EXPLOSION_REFLECTION(24,70); +ACE_EXPLOSION_REFLECTION(24,80); +ACE_EXPLOSION_REFLECTION(24,90); +ACE_EXPLOSION_REFLECTION(24,100); +ACE_EXPLOSION_REFLECTION(24,110); +ACE_EXPLOSION_REFLECTION(24,120); +ACE_EXPLOSION_REFLECTION(24,130); +ACE_EXPLOSION_REFLECTION(24,140); +ACE_EXPLOSION_REFLECTION(24,150); +ACE_EXPLOSION_REFLECTION(24,160); +ACE_EXPLOSION_REFLECTION(24,170); +ACE_EXPLOSION_REFLECTION(24,180); +ACE_EXPLOSION_REFLECTION(24,190); +ACE_EXPLOSION_REFLECTION(24,200); +ACE_EXPLOSION_REFLECTION(24,210); +ACE_EXPLOSION_REFLECTION(24,220); +ACE_EXPLOSION_REFLECTION(24,230); +ACE_EXPLOSION_REFLECTION(24,240); +ACE_EXPLOSION_REFLECTION(24,250); +ACE_EXPLOSION_REFLECTION(24,260); +ACE_EXPLOSION_REFLECTION(24,270); +ACE_EXPLOSION_REFLECTION(24,280); +ACE_EXPLOSION_REFLECTION(24,290); +ACE_EXPLOSION_REFLECTION(24,300); +ACE_EXPLOSION_REFLECTION(24,310); +ACE_EXPLOSION_REFLECTION(24,320); +ACE_EXPLOSION_REFLECTION(24,330); +ACE_EXPLOSION_REFLECTION(24,340); +ACE_EXPLOSION_REFLECTION(24,350); +ACE_EXPLOSION_REFLECTION(24,360); +ACE_EXPLOSION_REFLECTION(24,370); +ACE_EXPLOSION_REFLECTION(24,380); +ACE_EXPLOSION_REFLECTION(24,390); +ACE_EXPLOSION_REFLECTION(24,400); +ACE_EXPLOSION_REFLECTION(24,410); +ACE_EXPLOSION_REFLECTION(24,420); +ACE_EXPLOSION_REFLECTION(24,430); +ACE_EXPLOSION_REFLECTION(24,440); +ACE_EXPLOSION_REFLECTION(24,450); +ACE_EXPLOSION_REFLECTION(24,460); +ACE_EXPLOSION_REFLECTION(24,470); +ACE_EXPLOSION_REFLECTION(24,480); +ACE_EXPLOSION_REFLECTION(24,490); +ACE_EXPLOSION_REFLECTION(24,500); +ACE_EXPLOSION_REFLECTION(26,10); +ACE_EXPLOSION_REFLECTION(26,20); +ACE_EXPLOSION_REFLECTION(26,30); +ACE_EXPLOSION_REFLECTION(26,40); +ACE_EXPLOSION_REFLECTION(26,50); +ACE_EXPLOSION_REFLECTION(26,60); +ACE_EXPLOSION_REFLECTION(26,70); +ACE_EXPLOSION_REFLECTION(26,80); +ACE_EXPLOSION_REFLECTION(26,90); +ACE_EXPLOSION_REFLECTION(26,100); +ACE_EXPLOSION_REFLECTION(26,110); +ACE_EXPLOSION_REFLECTION(26,120); +ACE_EXPLOSION_REFLECTION(26,130); +ACE_EXPLOSION_REFLECTION(26,140); +ACE_EXPLOSION_REFLECTION(26,150); +ACE_EXPLOSION_REFLECTION(26,160); +ACE_EXPLOSION_REFLECTION(26,170); +ACE_EXPLOSION_REFLECTION(26,180); +ACE_EXPLOSION_REFLECTION(26,190); +ACE_EXPLOSION_REFLECTION(26,200); +ACE_EXPLOSION_REFLECTION(26,210); +ACE_EXPLOSION_REFLECTION(26,220); +ACE_EXPLOSION_REFLECTION(26,230); +ACE_EXPLOSION_REFLECTION(26,240); +ACE_EXPLOSION_REFLECTION(26,250); +ACE_EXPLOSION_REFLECTION(26,260); +ACE_EXPLOSION_REFLECTION(26,270); +ACE_EXPLOSION_REFLECTION(26,280); +ACE_EXPLOSION_REFLECTION(26,290); +ACE_EXPLOSION_REFLECTION(26,300); +ACE_EXPLOSION_REFLECTION(26,310); +ACE_EXPLOSION_REFLECTION(26,320); +ACE_EXPLOSION_REFLECTION(26,330); +ACE_EXPLOSION_REFLECTION(26,340); +ACE_EXPLOSION_REFLECTION(26,350); +ACE_EXPLOSION_REFLECTION(26,360); +ACE_EXPLOSION_REFLECTION(26,370); +ACE_EXPLOSION_REFLECTION(26,380); +ACE_EXPLOSION_REFLECTION(26,390); +ACE_EXPLOSION_REFLECTION(26,400); +ACE_EXPLOSION_REFLECTION(26,410); +ACE_EXPLOSION_REFLECTION(26,420); +ACE_EXPLOSION_REFLECTION(26,430); +ACE_EXPLOSION_REFLECTION(26,440); +ACE_EXPLOSION_REFLECTION(26,450); +ACE_EXPLOSION_REFLECTION(26,460); +ACE_EXPLOSION_REFLECTION(26,470); +ACE_EXPLOSION_REFLECTION(26,480); +ACE_EXPLOSION_REFLECTION(26,490); +ACE_EXPLOSION_REFLECTION(26,500); +ACE_EXPLOSION_REFLECTION(28,10); +ACE_EXPLOSION_REFLECTION(28,20); +ACE_EXPLOSION_REFLECTION(28,30); +ACE_EXPLOSION_REFLECTION(28,40); +ACE_EXPLOSION_REFLECTION(28,50); +ACE_EXPLOSION_REFLECTION(28,60); +ACE_EXPLOSION_REFLECTION(28,70); +ACE_EXPLOSION_REFLECTION(28,80); +ACE_EXPLOSION_REFLECTION(28,90); +ACE_EXPLOSION_REFLECTION(28,100); +ACE_EXPLOSION_REFLECTION(28,110); +ACE_EXPLOSION_REFLECTION(28,120); +ACE_EXPLOSION_REFLECTION(28,130); +ACE_EXPLOSION_REFLECTION(28,140); +ACE_EXPLOSION_REFLECTION(28,150); +ACE_EXPLOSION_REFLECTION(28,160); +ACE_EXPLOSION_REFLECTION(28,170); +ACE_EXPLOSION_REFLECTION(28,180); +ACE_EXPLOSION_REFLECTION(28,190); +ACE_EXPLOSION_REFLECTION(28,200); +ACE_EXPLOSION_REFLECTION(28,210); +ACE_EXPLOSION_REFLECTION(28,220); +ACE_EXPLOSION_REFLECTION(28,230); +ACE_EXPLOSION_REFLECTION(28,240); +ACE_EXPLOSION_REFLECTION(28,250); +ACE_EXPLOSION_REFLECTION(28,260); +ACE_EXPLOSION_REFLECTION(28,270); +ACE_EXPLOSION_REFLECTION(28,280); +ACE_EXPLOSION_REFLECTION(28,290); +ACE_EXPLOSION_REFLECTION(28,300); +ACE_EXPLOSION_REFLECTION(28,310); +ACE_EXPLOSION_REFLECTION(28,320); +ACE_EXPLOSION_REFLECTION(28,330); +ACE_EXPLOSION_REFLECTION(28,340); +ACE_EXPLOSION_REFLECTION(28,350); +ACE_EXPLOSION_REFLECTION(28,360); +ACE_EXPLOSION_REFLECTION(28,370); +ACE_EXPLOSION_REFLECTION(28,380); +ACE_EXPLOSION_REFLECTION(28,390); +ACE_EXPLOSION_REFLECTION(28,400); +ACE_EXPLOSION_REFLECTION(28,410); +ACE_EXPLOSION_REFLECTION(28,420); +ACE_EXPLOSION_REFLECTION(28,430); +ACE_EXPLOSION_REFLECTION(28,440); +ACE_EXPLOSION_REFLECTION(28,450); +ACE_EXPLOSION_REFLECTION(28,460); +ACE_EXPLOSION_REFLECTION(28,470); +ACE_EXPLOSION_REFLECTION(28,480); +ACE_EXPLOSION_REFLECTION(28,490); +ACE_EXPLOSION_REFLECTION(28,500); +ACE_EXPLOSION_REFLECTION(30,10); +ACE_EXPLOSION_REFLECTION(30,20); +ACE_EXPLOSION_REFLECTION(30,30); +ACE_EXPLOSION_REFLECTION(30,40); +ACE_EXPLOSION_REFLECTION(30,50); +ACE_EXPLOSION_REFLECTION(30,60); +ACE_EXPLOSION_REFLECTION(30,70); +ACE_EXPLOSION_REFLECTION(30,80); +ACE_EXPLOSION_REFLECTION(30,90); +ACE_EXPLOSION_REFLECTION(30,100); +ACE_EXPLOSION_REFLECTION(30,110); +ACE_EXPLOSION_REFLECTION(30,120); +ACE_EXPLOSION_REFLECTION(30,130); +ACE_EXPLOSION_REFLECTION(30,140); +ACE_EXPLOSION_REFLECTION(30,150); +ACE_EXPLOSION_REFLECTION(30,160); +ACE_EXPLOSION_REFLECTION(30,170); +ACE_EXPLOSION_REFLECTION(30,180); +ACE_EXPLOSION_REFLECTION(30,190); +ACE_EXPLOSION_REFLECTION(30,200); +ACE_EXPLOSION_REFLECTION(30,210); +ACE_EXPLOSION_REFLECTION(30,220); +ACE_EXPLOSION_REFLECTION(30,230); +ACE_EXPLOSION_REFLECTION(30,240); +ACE_EXPLOSION_REFLECTION(30,250); +ACE_EXPLOSION_REFLECTION(30,260); +ACE_EXPLOSION_REFLECTION(30,270); +ACE_EXPLOSION_REFLECTION(30,280); +ACE_EXPLOSION_REFLECTION(30,290); +ACE_EXPLOSION_REFLECTION(30,300); +ACE_EXPLOSION_REFLECTION(30,310); +ACE_EXPLOSION_REFLECTION(30,320); +ACE_EXPLOSION_REFLECTION(30,330); +ACE_EXPLOSION_REFLECTION(30,340); +ACE_EXPLOSION_REFLECTION(30,350); +ACE_EXPLOSION_REFLECTION(30,360); +ACE_EXPLOSION_REFLECTION(30,370); +ACE_EXPLOSION_REFLECTION(30,380); +ACE_EXPLOSION_REFLECTION(30,390); +ACE_EXPLOSION_REFLECTION(30,400); +ACE_EXPLOSION_REFLECTION(30,410); +ACE_EXPLOSION_REFLECTION(30,420); +ACE_EXPLOSION_REFLECTION(30,430); +ACE_EXPLOSION_REFLECTION(30,440); +ACE_EXPLOSION_REFLECTION(30,450); +ACE_EXPLOSION_REFLECTION(30,460); +ACE_EXPLOSION_REFLECTION(30,470); +ACE_EXPLOSION_REFLECTION(30,480); +ACE_EXPLOSION_REFLECTION(30,490); +ACE_EXPLOSION_REFLECTION(30,500); +ACE_EXPLOSION_REFLECTION(32,10); +ACE_EXPLOSION_REFLECTION(32,20); +ACE_EXPLOSION_REFLECTION(32,30); +ACE_EXPLOSION_REFLECTION(32,40); +ACE_EXPLOSION_REFLECTION(32,50); +ACE_EXPLOSION_REFLECTION(32,60); +ACE_EXPLOSION_REFLECTION(32,70); +ACE_EXPLOSION_REFLECTION(32,80); +ACE_EXPLOSION_REFLECTION(32,90); +ACE_EXPLOSION_REFLECTION(32,100); +ACE_EXPLOSION_REFLECTION(32,110); +ACE_EXPLOSION_REFLECTION(32,120); +ACE_EXPLOSION_REFLECTION(32,130); +ACE_EXPLOSION_REFLECTION(32,140); +ACE_EXPLOSION_REFLECTION(32,150); +ACE_EXPLOSION_REFLECTION(32,160); +ACE_EXPLOSION_REFLECTION(32,170); +ACE_EXPLOSION_REFLECTION(32,180); +ACE_EXPLOSION_REFLECTION(32,190); +ACE_EXPLOSION_REFLECTION(32,200); +ACE_EXPLOSION_REFLECTION(32,210); +ACE_EXPLOSION_REFLECTION(32,220); +ACE_EXPLOSION_REFLECTION(32,230); +ACE_EXPLOSION_REFLECTION(32,240); +ACE_EXPLOSION_REFLECTION(32,250); +ACE_EXPLOSION_REFLECTION(32,260); +ACE_EXPLOSION_REFLECTION(32,270); +ACE_EXPLOSION_REFLECTION(32,280); +ACE_EXPLOSION_REFLECTION(32,290); +ACE_EXPLOSION_REFLECTION(32,300); +ACE_EXPLOSION_REFLECTION(32,310); +ACE_EXPLOSION_REFLECTION(32,320); +ACE_EXPLOSION_REFLECTION(32,330); +ACE_EXPLOSION_REFLECTION(32,340); +ACE_EXPLOSION_REFLECTION(32,350); +ACE_EXPLOSION_REFLECTION(32,360); +ACE_EXPLOSION_REFLECTION(32,370); +ACE_EXPLOSION_REFLECTION(32,380); +ACE_EXPLOSION_REFLECTION(32,390); +ACE_EXPLOSION_REFLECTION(32,400); +ACE_EXPLOSION_REFLECTION(32,410); +ACE_EXPLOSION_REFLECTION(32,420); +ACE_EXPLOSION_REFLECTION(32,430); +ACE_EXPLOSION_REFLECTION(32,440); +ACE_EXPLOSION_REFLECTION(32,450); +ACE_EXPLOSION_REFLECTION(32,460); +ACE_EXPLOSION_REFLECTION(32,470); +ACE_EXPLOSION_REFLECTION(32,480); +ACE_EXPLOSION_REFLECTION(32,490); +ACE_EXPLOSION_REFLECTION(32,500); +ACE_EXPLOSION_REFLECTION(34,10); +ACE_EXPLOSION_REFLECTION(34,20); +ACE_EXPLOSION_REFLECTION(34,30); +ACE_EXPLOSION_REFLECTION(34,40); +ACE_EXPLOSION_REFLECTION(34,50); +ACE_EXPLOSION_REFLECTION(34,60); +ACE_EXPLOSION_REFLECTION(34,70); +ACE_EXPLOSION_REFLECTION(34,80); +ACE_EXPLOSION_REFLECTION(34,90); +ACE_EXPLOSION_REFLECTION(34,100); +ACE_EXPLOSION_REFLECTION(34,110); +ACE_EXPLOSION_REFLECTION(34,120); +ACE_EXPLOSION_REFLECTION(34,130); +ACE_EXPLOSION_REFLECTION(34,140); +ACE_EXPLOSION_REFLECTION(34,150); +ACE_EXPLOSION_REFLECTION(34,160); +ACE_EXPLOSION_REFLECTION(34,170); +ACE_EXPLOSION_REFLECTION(34,180); +ACE_EXPLOSION_REFLECTION(34,190); +ACE_EXPLOSION_REFLECTION(34,200); +ACE_EXPLOSION_REFLECTION(34,210); +ACE_EXPLOSION_REFLECTION(34,220); +ACE_EXPLOSION_REFLECTION(34,230); +ACE_EXPLOSION_REFLECTION(34,240); +ACE_EXPLOSION_REFLECTION(34,250); +ACE_EXPLOSION_REFLECTION(34,260); +ACE_EXPLOSION_REFLECTION(34,270); +ACE_EXPLOSION_REFLECTION(34,280); +ACE_EXPLOSION_REFLECTION(34,290); +ACE_EXPLOSION_REFLECTION(34,300); +ACE_EXPLOSION_REFLECTION(34,310); +ACE_EXPLOSION_REFLECTION(34,320); +ACE_EXPLOSION_REFLECTION(34,330); +ACE_EXPLOSION_REFLECTION(34,340); +ACE_EXPLOSION_REFLECTION(34,350); +ACE_EXPLOSION_REFLECTION(34,360); +ACE_EXPLOSION_REFLECTION(34,370); +ACE_EXPLOSION_REFLECTION(34,380); +ACE_EXPLOSION_REFLECTION(34,390); +ACE_EXPLOSION_REFLECTION(34,400); +ACE_EXPLOSION_REFLECTION(34,410); +ACE_EXPLOSION_REFLECTION(34,420); +ACE_EXPLOSION_REFLECTION(34,430); +ACE_EXPLOSION_REFLECTION(34,440); +ACE_EXPLOSION_REFLECTION(34,450); +ACE_EXPLOSION_REFLECTION(34,460); +ACE_EXPLOSION_REFLECTION(34,470); +ACE_EXPLOSION_REFLECTION(34,480); +ACE_EXPLOSION_REFLECTION(34,490); +ACE_EXPLOSION_REFLECTION(34,500); +ACE_EXPLOSION_REFLECTION(36,10); +ACE_EXPLOSION_REFLECTION(36,20); +ACE_EXPLOSION_REFLECTION(36,30); +ACE_EXPLOSION_REFLECTION(36,40); +ACE_EXPLOSION_REFLECTION(36,50); +ACE_EXPLOSION_REFLECTION(36,60); +ACE_EXPLOSION_REFLECTION(36,70); +ACE_EXPLOSION_REFLECTION(36,80); +ACE_EXPLOSION_REFLECTION(36,90); +ACE_EXPLOSION_REFLECTION(36,100); +ACE_EXPLOSION_REFLECTION(36,110); +ACE_EXPLOSION_REFLECTION(36,120); +ACE_EXPLOSION_REFLECTION(36,130); +ACE_EXPLOSION_REFLECTION(36,140); +ACE_EXPLOSION_REFLECTION(36,150); +ACE_EXPLOSION_REFLECTION(36,160); +ACE_EXPLOSION_REFLECTION(36,170); +ACE_EXPLOSION_REFLECTION(36,180); +ACE_EXPLOSION_REFLECTION(36,190); +ACE_EXPLOSION_REFLECTION(36,200); +ACE_EXPLOSION_REFLECTION(36,210); +ACE_EXPLOSION_REFLECTION(36,220); +ACE_EXPLOSION_REFLECTION(36,230); +ACE_EXPLOSION_REFLECTION(36,240); +ACE_EXPLOSION_REFLECTION(36,250); +ACE_EXPLOSION_REFLECTION(36,260); +ACE_EXPLOSION_REFLECTION(36,270); +ACE_EXPLOSION_REFLECTION(36,280); +ACE_EXPLOSION_REFLECTION(36,290); +ACE_EXPLOSION_REFLECTION(36,300); +ACE_EXPLOSION_REFLECTION(36,310); +ACE_EXPLOSION_REFLECTION(36,320); +ACE_EXPLOSION_REFLECTION(36,330); +ACE_EXPLOSION_REFLECTION(36,340); +ACE_EXPLOSION_REFLECTION(36,350); +ACE_EXPLOSION_REFLECTION(36,360); +ACE_EXPLOSION_REFLECTION(36,370); +ACE_EXPLOSION_REFLECTION(36,380); +ACE_EXPLOSION_REFLECTION(36,390); +ACE_EXPLOSION_REFLECTION(36,400); +ACE_EXPLOSION_REFLECTION(36,410); +ACE_EXPLOSION_REFLECTION(36,420); +ACE_EXPLOSION_REFLECTION(36,430); +ACE_EXPLOSION_REFLECTION(36,440); +ACE_EXPLOSION_REFLECTION(36,450); +ACE_EXPLOSION_REFLECTION(36,460); +ACE_EXPLOSION_REFLECTION(36,470); +ACE_EXPLOSION_REFLECTION(36,480); +ACE_EXPLOSION_REFLECTION(36,490); +ACE_EXPLOSION_REFLECTION(36,500); +ACE_EXPLOSION_REFLECTION(38,10); +ACE_EXPLOSION_REFLECTION(38,20); +ACE_EXPLOSION_REFLECTION(38,30); +ACE_EXPLOSION_REFLECTION(38,40); +ACE_EXPLOSION_REFLECTION(38,50); +ACE_EXPLOSION_REFLECTION(38,60); +ACE_EXPLOSION_REFLECTION(38,70); +ACE_EXPLOSION_REFLECTION(38,80); +ACE_EXPLOSION_REFLECTION(38,90); +ACE_EXPLOSION_REFLECTION(38,100); +ACE_EXPLOSION_REFLECTION(38,110); +ACE_EXPLOSION_REFLECTION(38,120); +ACE_EXPLOSION_REFLECTION(38,130); +ACE_EXPLOSION_REFLECTION(38,140); +ACE_EXPLOSION_REFLECTION(38,150); +ACE_EXPLOSION_REFLECTION(38,160); +ACE_EXPLOSION_REFLECTION(38,170); +ACE_EXPLOSION_REFLECTION(38,180); +ACE_EXPLOSION_REFLECTION(38,190); +ACE_EXPLOSION_REFLECTION(38,200); +ACE_EXPLOSION_REFLECTION(38,210); +ACE_EXPLOSION_REFLECTION(38,220); +ACE_EXPLOSION_REFLECTION(38,230); +ACE_EXPLOSION_REFLECTION(38,240); +ACE_EXPLOSION_REFLECTION(38,250); +ACE_EXPLOSION_REFLECTION(38,260); +ACE_EXPLOSION_REFLECTION(38,270); +ACE_EXPLOSION_REFLECTION(38,280); +ACE_EXPLOSION_REFLECTION(38,290); +ACE_EXPLOSION_REFLECTION(38,300); +ACE_EXPLOSION_REFLECTION(38,310); +ACE_EXPLOSION_REFLECTION(38,320); +ACE_EXPLOSION_REFLECTION(38,330); +ACE_EXPLOSION_REFLECTION(38,340); +ACE_EXPLOSION_REFLECTION(38,350); +ACE_EXPLOSION_REFLECTION(38,360); +ACE_EXPLOSION_REFLECTION(38,370); +ACE_EXPLOSION_REFLECTION(38,380); +ACE_EXPLOSION_REFLECTION(38,390); +ACE_EXPLOSION_REFLECTION(38,400); +ACE_EXPLOSION_REFLECTION(38,410); +ACE_EXPLOSION_REFLECTION(38,420); +ACE_EXPLOSION_REFLECTION(38,430); +ACE_EXPLOSION_REFLECTION(38,440); +ACE_EXPLOSION_REFLECTION(38,450); +ACE_EXPLOSION_REFLECTION(38,460); +ACE_EXPLOSION_REFLECTION(38,470); +ACE_EXPLOSION_REFLECTION(38,480); +ACE_EXPLOSION_REFLECTION(38,490); +ACE_EXPLOSION_REFLECTION(38,500); +ACE_EXPLOSION_REFLECTION(40,10); +ACE_EXPLOSION_REFLECTION(40,20); +ACE_EXPLOSION_REFLECTION(40,30); +ACE_EXPLOSION_REFLECTION(40,40); +ACE_EXPLOSION_REFLECTION(40,50); +ACE_EXPLOSION_REFLECTION(40,60); +ACE_EXPLOSION_REFLECTION(40,70); +ACE_EXPLOSION_REFLECTION(40,80); +ACE_EXPLOSION_REFLECTION(40,90); +ACE_EXPLOSION_REFLECTION(40,100); +ACE_EXPLOSION_REFLECTION(40,110); +ACE_EXPLOSION_REFLECTION(40,120); +ACE_EXPLOSION_REFLECTION(40,130); +ACE_EXPLOSION_REFLECTION(40,140); +ACE_EXPLOSION_REFLECTION(40,150); +ACE_EXPLOSION_REFLECTION(40,160); +ACE_EXPLOSION_REFLECTION(40,170); +ACE_EXPLOSION_REFLECTION(40,180); +ACE_EXPLOSION_REFLECTION(40,190); +ACE_EXPLOSION_REFLECTION(40,200); +ACE_EXPLOSION_REFLECTION(40,210); +ACE_EXPLOSION_REFLECTION(40,220); +ACE_EXPLOSION_REFLECTION(40,230); +ACE_EXPLOSION_REFLECTION(40,240); +ACE_EXPLOSION_REFLECTION(40,250); +ACE_EXPLOSION_REFLECTION(40,260); +ACE_EXPLOSION_REFLECTION(40,270); +ACE_EXPLOSION_REFLECTION(40,280); +ACE_EXPLOSION_REFLECTION(40,290); +ACE_EXPLOSION_REFLECTION(40,300); +ACE_EXPLOSION_REFLECTION(40,310); +ACE_EXPLOSION_REFLECTION(40,320); +ACE_EXPLOSION_REFLECTION(40,330); +ACE_EXPLOSION_REFLECTION(40,340); +ACE_EXPLOSION_REFLECTION(40,350); +ACE_EXPLOSION_REFLECTION(40,360); +ACE_EXPLOSION_REFLECTION(40,370); +ACE_EXPLOSION_REFLECTION(40,380); +ACE_EXPLOSION_REFLECTION(40,390); +ACE_EXPLOSION_REFLECTION(40,400); +ACE_EXPLOSION_REFLECTION(40,410); +ACE_EXPLOSION_REFLECTION(40,420); +ACE_EXPLOSION_REFLECTION(40,430); +ACE_EXPLOSION_REFLECTION(40,440); +ACE_EXPLOSION_REFLECTION(40,450); +ACE_EXPLOSION_REFLECTION(40,460); +ACE_EXPLOSION_REFLECTION(40,470); +ACE_EXPLOSION_REFLECTION(40,480); +ACE_EXPLOSION_REFLECTION(40,490); +ACE_EXPLOSION_REFLECTION(40,500); +ACE_EXPLOSION_REFLECTION(42,10); +ACE_EXPLOSION_REFLECTION(42,20); +ACE_EXPLOSION_REFLECTION(42,30); +ACE_EXPLOSION_REFLECTION(42,40); +ACE_EXPLOSION_REFLECTION(42,50); +ACE_EXPLOSION_REFLECTION(42,60); +ACE_EXPLOSION_REFLECTION(42,70); +ACE_EXPLOSION_REFLECTION(42,80); +ACE_EXPLOSION_REFLECTION(42,90); +ACE_EXPLOSION_REFLECTION(42,100); +ACE_EXPLOSION_REFLECTION(42,110); +ACE_EXPLOSION_REFLECTION(42,120); +ACE_EXPLOSION_REFLECTION(42,130); +ACE_EXPLOSION_REFLECTION(42,140); +ACE_EXPLOSION_REFLECTION(42,150); +ACE_EXPLOSION_REFLECTION(42,160); +ACE_EXPLOSION_REFLECTION(42,170); +ACE_EXPLOSION_REFLECTION(42,180); +ACE_EXPLOSION_REFLECTION(42,190); +ACE_EXPLOSION_REFLECTION(42,200); +ACE_EXPLOSION_REFLECTION(42,210); +ACE_EXPLOSION_REFLECTION(42,220); +ACE_EXPLOSION_REFLECTION(42,230); +ACE_EXPLOSION_REFLECTION(42,240); +ACE_EXPLOSION_REFLECTION(42,250); +ACE_EXPLOSION_REFLECTION(42,260); +ACE_EXPLOSION_REFLECTION(42,270); +ACE_EXPLOSION_REFLECTION(42,280); +ACE_EXPLOSION_REFLECTION(42,290); +ACE_EXPLOSION_REFLECTION(42,300); +ACE_EXPLOSION_REFLECTION(42,310); +ACE_EXPLOSION_REFLECTION(42,320); +ACE_EXPLOSION_REFLECTION(42,330); +ACE_EXPLOSION_REFLECTION(42,340); +ACE_EXPLOSION_REFLECTION(42,350); +ACE_EXPLOSION_REFLECTION(42,360); +ACE_EXPLOSION_REFLECTION(42,370); +ACE_EXPLOSION_REFLECTION(42,380); +ACE_EXPLOSION_REFLECTION(42,390); +ACE_EXPLOSION_REFLECTION(42,400); +ACE_EXPLOSION_REFLECTION(42,410); +ACE_EXPLOSION_REFLECTION(42,420); +ACE_EXPLOSION_REFLECTION(42,430); +ACE_EXPLOSION_REFLECTION(42,440); +ACE_EXPLOSION_REFLECTION(42,450); +ACE_EXPLOSION_REFLECTION(42,460); +ACE_EXPLOSION_REFLECTION(42,470); +ACE_EXPLOSION_REFLECTION(42,480); +ACE_EXPLOSION_REFLECTION(42,490); +ACE_EXPLOSION_REFLECTION(42,500); +ACE_EXPLOSION_REFLECTION(44,10); +ACE_EXPLOSION_REFLECTION(44,20); +ACE_EXPLOSION_REFLECTION(44,30); +ACE_EXPLOSION_REFLECTION(44,40); +ACE_EXPLOSION_REFLECTION(44,50); +ACE_EXPLOSION_REFLECTION(44,60); +ACE_EXPLOSION_REFLECTION(44,70); +ACE_EXPLOSION_REFLECTION(44,80); +ACE_EXPLOSION_REFLECTION(44,90); +ACE_EXPLOSION_REFLECTION(44,100); +ACE_EXPLOSION_REFLECTION(44,110); +ACE_EXPLOSION_REFLECTION(44,120); +ACE_EXPLOSION_REFLECTION(44,130); +ACE_EXPLOSION_REFLECTION(44,140); +ACE_EXPLOSION_REFLECTION(44,150); +ACE_EXPLOSION_REFLECTION(44,160); +ACE_EXPLOSION_REFLECTION(44,170); +ACE_EXPLOSION_REFLECTION(44,180); +ACE_EXPLOSION_REFLECTION(44,190); +ACE_EXPLOSION_REFLECTION(44,200); +ACE_EXPLOSION_REFLECTION(44,210); +ACE_EXPLOSION_REFLECTION(44,220); +ACE_EXPLOSION_REFLECTION(44,230); +ACE_EXPLOSION_REFLECTION(44,240); +ACE_EXPLOSION_REFLECTION(44,250); +ACE_EXPLOSION_REFLECTION(44,260); +ACE_EXPLOSION_REFLECTION(44,270); +ACE_EXPLOSION_REFLECTION(44,280); +ACE_EXPLOSION_REFLECTION(44,290); +ACE_EXPLOSION_REFLECTION(44,300); +ACE_EXPLOSION_REFLECTION(44,310); +ACE_EXPLOSION_REFLECTION(44,320); +ACE_EXPLOSION_REFLECTION(44,330); +ACE_EXPLOSION_REFLECTION(44,340); +ACE_EXPLOSION_REFLECTION(44,350); +ACE_EXPLOSION_REFLECTION(44,360); +ACE_EXPLOSION_REFLECTION(44,370); +ACE_EXPLOSION_REFLECTION(44,380); +ACE_EXPLOSION_REFLECTION(44,390); +ACE_EXPLOSION_REFLECTION(44,400); +ACE_EXPLOSION_REFLECTION(44,410); +ACE_EXPLOSION_REFLECTION(44,420); +ACE_EXPLOSION_REFLECTION(44,430); +ACE_EXPLOSION_REFLECTION(44,440); +ACE_EXPLOSION_REFLECTION(44,450); +ACE_EXPLOSION_REFLECTION(44,460); +ACE_EXPLOSION_REFLECTION(44,470); +ACE_EXPLOSION_REFLECTION(44,480); +ACE_EXPLOSION_REFLECTION(44,490); +ACE_EXPLOSION_REFLECTION(44,500); +ACE_EXPLOSION_REFLECTION(46,10); +ACE_EXPLOSION_REFLECTION(46,20); +ACE_EXPLOSION_REFLECTION(46,30); +ACE_EXPLOSION_REFLECTION(46,40); +ACE_EXPLOSION_REFLECTION(46,50); +ACE_EXPLOSION_REFLECTION(46,60); +ACE_EXPLOSION_REFLECTION(46,70); +ACE_EXPLOSION_REFLECTION(46,80); +ACE_EXPLOSION_REFLECTION(46,90); +ACE_EXPLOSION_REFLECTION(46,100); +ACE_EXPLOSION_REFLECTION(46,110); +ACE_EXPLOSION_REFLECTION(46,120); +ACE_EXPLOSION_REFLECTION(46,130); +ACE_EXPLOSION_REFLECTION(46,140); +ACE_EXPLOSION_REFLECTION(46,150); +ACE_EXPLOSION_REFLECTION(46,160); +ACE_EXPLOSION_REFLECTION(46,170); +ACE_EXPLOSION_REFLECTION(46,180); +ACE_EXPLOSION_REFLECTION(46,190); +ACE_EXPLOSION_REFLECTION(46,200); +ACE_EXPLOSION_REFLECTION(46,210); +ACE_EXPLOSION_REFLECTION(46,220); +ACE_EXPLOSION_REFLECTION(46,230); +ACE_EXPLOSION_REFLECTION(46,240); +ACE_EXPLOSION_REFLECTION(46,250); +ACE_EXPLOSION_REFLECTION(46,260); +ACE_EXPLOSION_REFLECTION(46,270); +ACE_EXPLOSION_REFLECTION(46,280); +ACE_EXPLOSION_REFLECTION(46,290); +ACE_EXPLOSION_REFLECTION(46,300); +ACE_EXPLOSION_REFLECTION(46,310); +ACE_EXPLOSION_REFLECTION(46,320); +ACE_EXPLOSION_REFLECTION(46,330); +ACE_EXPLOSION_REFLECTION(46,340); +ACE_EXPLOSION_REFLECTION(46,350); +ACE_EXPLOSION_REFLECTION(46,360); +ACE_EXPLOSION_REFLECTION(46,370); +ACE_EXPLOSION_REFLECTION(46,380); +ACE_EXPLOSION_REFLECTION(46,390); +ACE_EXPLOSION_REFLECTION(46,400); +ACE_EXPLOSION_REFLECTION(46,410); +ACE_EXPLOSION_REFLECTION(46,420); +ACE_EXPLOSION_REFLECTION(46,430); +ACE_EXPLOSION_REFLECTION(46,440); +ACE_EXPLOSION_REFLECTION(46,450); +ACE_EXPLOSION_REFLECTION(46,460); +ACE_EXPLOSION_REFLECTION(46,470); +ACE_EXPLOSION_REFLECTION(46,480); +ACE_EXPLOSION_REFLECTION(46,490); +ACE_EXPLOSION_REFLECTION(46,500); +ACE_EXPLOSION_REFLECTION(48,10); +ACE_EXPLOSION_REFLECTION(48,20); +ACE_EXPLOSION_REFLECTION(48,30); +ACE_EXPLOSION_REFLECTION(48,40); +ACE_EXPLOSION_REFLECTION(48,50); +ACE_EXPLOSION_REFLECTION(48,60); +ACE_EXPLOSION_REFLECTION(48,70); +ACE_EXPLOSION_REFLECTION(48,80); +ACE_EXPLOSION_REFLECTION(48,90); +ACE_EXPLOSION_REFLECTION(48,100); +ACE_EXPLOSION_REFLECTION(48,110); +ACE_EXPLOSION_REFLECTION(48,120); +ACE_EXPLOSION_REFLECTION(48,130); +ACE_EXPLOSION_REFLECTION(48,140); +ACE_EXPLOSION_REFLECTION(48,150); +ACE_EXPLOSION_REFLECTION(48,160); +ACE_EXPLOSION_REFLECTION(48,170); +ACE_EXPLOSION_REFLECTION(48,180); +ACE_EXPLOSION_REFLECTION(48,190); +ACE_EXPLOSION_REFLECTION(48,200); +ACE_EXPLOSION_REFLECTION(48,210); +ACE_EXPLOSION_REFLECTION(48,220); +ACE_EXPLOSION_REFLECTION(48,230); +ACE_EXPLOSION_REFLECTION(48,240); +ACE_EXPLOSION_REFLECTION(48,250); +ACE_EXPLOSION_REFLECTION(48,260); +ACE_EXPLOSION_REFLECTION(48,270); +ACE_EXPLOSION_REFLECTION(48,280); +ACE_EXPLOSION_REFLECTION(48,290); +ACE_EXPLOSION_REFLECTION(48,300); +ACE_EXPLOSION_REFLECTION(48,310); +ACE_EXPLOSION_REFLECTION(48,320); +ACE_EXPLOSION_REFLECTION(48,330); +ACE_EXPLOSION_REFLECTION(48,340); +ACE_EXPLOSION_REFLECTION(48,350); +ACE_EXPLOSION_REFLECTION(48,360); +ACE_EXPLOSION_REFLECTION(48,370); +ACE_EXPLOSION_REFLECTION(48,380); +ACE_EXPLOSION_REFLECTION(48,390); +ACE_EXPLOSION_REFLECTION(48,400); +ACE_EXPLOSION_REFLECTION(48,410); +ACE_EXPLOSION_REFLECTION(48,420); +ACE_EXPLOSION_REFLECTION(48,430); +ACE_EXPLOSION_REFLECTION(48,440); +ACE_EXPLOSION_REFLECTION(48,450); +ACE_EXPLOSION_REFLECTION(48,460); +ACE_EXPLOSION_REFLECTION(48,470); +ACE_EXPLOSION_REFLECTION(48,480); +ACE_EXPLOSION_REFLECTION(48,490); +ACE_EXPLOSION_REFLECTION(48,500); +ACE_EXPLOSION_REFLECTION(50,10); +ACE_EXPLOSION_REFLECTION(50,20); +ACE_EXPLOSION_REFLECTION(50,30); +ACE_EXPLOSION_REFLECTION(50,40); +ACE_EXPLOSION_REFLECTION(50,50); +ACE_EXPLOSION_REFLECTION(50,60); +ACE_EXPLOSION_REFLECTION(50,70); +ACE_EXPLOSION_REFLECTION(50,80); +ACE_EXPLOSION_REFLECTION(50,90); +ACE_EXPLOSION_REFLECTION(50,100); +ACE_EXPLOSION_REFLECTION(50,110); +ACE_EXPLOSION_REFLECTION(50,120); +ACE_EXPLOSION_REFLECTION(50,130); +ACE_EXPLOSION_REFLECTION(50,140); +ACE_EXPLOSION_REFLECTION(50,150); +ACE_EXPLOSION_REFLECTION(50,160); +ACE_EXPLOSION_REFLECTION(50,170); +ACE_EXPLOSION_REFLECTION(50,180); +ACE_EXPLOSION_REFLECTION(50,190); +ACE_EXPLOSION_REFLECTION(50,200); +ACE_EXPLOSION_REFLECTION(50,210); +ACE_EXPLOSION_REFLECTION(50,220); +ACE_EXPLOSION_REFLECTION(50,230); +ACE_EXPLOSION_REFLECTION(50,240); +ACE_EXPLOSION_REFLECTION(50,250); +ACE_EXPLOSION_REFLECTION(50,260); +ACE_EXPLOSION_REFLECTION(50,270); +ACE_EXPLOSION_REFLECTION(50,280); +ACE_EXPLOSION_REFLECTION(50,290); +ACE_EXPLOSION_REFLECTION(50,300); +ACE_EXPLOSION_REFLECTION(50,310); +ACE_EXPLOSION_REFLECTION(50,320); +ACE_EXPLOSION_REFLECTION(50,330); +ACE_EXPLOSION_REFLECTION(50,340); +ACE_EXPLOSION_REFLECTION(50,350); +ACE_EXPLOSION_REFLECTION(50,360); +ACE_EXPLOSION_REFLECTION(50,370); +ACE_EXPLOSION_REFLECTION(50,380); +ACE_EXPLOSION_REFLECTION(50,390); +ACE_EXPLOSION_REFLECTION(50,400); +ACE_EXPLOSION_REFLECTION(50,410); +ACE_EXPLOSION_REFLECTION(50,420); +ACE_EXPLOSION_REFLECTION(50,430); +ACE_EXPLOSION_REFLECTION(50,440); +ACE_EXPLOSION_REFLECTION(50,450); +ACE_EXPLOSION_REFLECTION(50,460); +ACE_EXPLOSION_REFLECTION(50,470); +ACE_EXPLOSION_REFLECTION(50,480); +ACE_EXPLOSION_REFLECTION(50,490); +ACE_EXPLOSION_REFLECTION(50,500); +ACE_EXPLOSION_REFLECTION(52,10); +ACE_EXPLOSION_REFLECTION(52,20); +ACE_EXPLOSION_REFLECTION(52,30); +ACE_EXPLOSION_REFLECTION(52,40); +ACE_EXPLOSION_REFLECTION(52,50); +ACE_EXPLOSION_REFLECTION(52,60); +ACE_EXPLOSION_REFLECTION(52,70); +ACE_EXPLOSION_REFLECTION(52,80); +ACE_EXPLOSION_REFLECTION(52,90); +ACE_EXPLOSION_REFLECTION(52,100); +ACE_EXPLOSION_REFLECTION(52,110); +ACE_EXPLOSION_REFLECTION(52,120); +ACE_EXPLOSION_REFLECTION(52,130); +ACE_EXPLOSION_REFLECTION(52,140); +ACE_EXPLOSION_REFLECTION(52,150); +ACE_EXPLOSION_REFLECTION(52,160); +ACE_EXPLOSION_REFLECTION(52,170); +ACE_EXPLOSION_REFLECTION(52,180); +ACE_EXPLOSION_REFLECTION(52,190); +ACE_EXPLOSION_REFLECTION(52,200); +ACE_EXPLOSION_REFLECTION(52,210); +ACE_EXPLOSION_REFLECTION(52,220); +ACE_EXPLOSION_REFLECTION(52,230); +ACE_EXPLOSION_REFLECTION(52,240); +ACE_EXPLOSION_REFLECTION(52,250); +ACE_EXPLOSION_REFLECTION(52,260); +ACE_EXPLOSION_REFLECTION(52,270); +ACE_EXPLOSION_REFLECTION(52,280); +ACE_EXPLOSION_REFLECTION(52,290); +ACE_EXPLOSION_REFLECTION(52,300); +ACE_EXPLOSION_REFLECTION(52,310); +ACE_EXPLOSION_REFLECTION(52,320); +ACE_EXPLOSION_REFLECTION(52,330); +ACE_EXPLOSION_REFLECTION(52,340); +ACE_EXPLOSION_REFLECTION(52,350); +ACE_EXPLOSION_REFLECTION(52,360); +ACE_EXPLOSION_REFLECTION(52,370); +ACE_EXPLOSION_REFLECTION(52,380); +ACE_EXPLOSION_REFLECTION(52,390); +ACE_EXPLOSION_REFLECTION(52,400); +ACE_EXPLOSION_REFLECTION(52,410); +ACE_EXPLOSION_REFLECTION(52,420); +ACE_EXPLOSION_REFLECTION(52,430); +ACE_EXPLOSION_REFLECTION(52,440); +ACE_EXPLOSION_REFLECTION(52,450); +ACE_EXPLOSION_REFLECTION(52,460); +ACE_EXPLOSION_REFLECTION(52,470); +ACE_EXPLOSION_REFLECTION(52,480); +ACE_EXPLOSION_REFLECTION(52,490); +ACE_EXPLOSION_REFLECTION(52,500); +ACE_EXPLOSION_REFLECTION(54,10); +ACE_EXPLOSION_REFLECTION(54,20); +ACE_EXPLOSION_REFLECTION(54,30); +ACE_EXPLOSION_REFLECTION(54,40); +ACE_EXPLOSION_REFLECTION(54,50); +ACE_EXPLOSION_REFLECTION(54,60); +ACE_EXPLOSION_REFLECTION(54,70); +ACE_EXPLOSION_REFLECTION(54,80); +ACE_EXPLOSION_REFLECTION(54,90); +ACE_EXPLOSION_REFLECTION(54,100); +ACE_EXPLOSION_REFLECTION(54,110); +ACE_EXPLOSION_REFLECTION(54,120); +ACE_EXPLOSION_REFLECTION(54,130); +ACE_EXPLOSION_REFLECTION(54,140); +ACE_EXPLOSION_REFLECTION(54,150); +ACE_EXPLOSION_REFLECTION(54,160); +ACE_EXPLOSION_REFLECTION(54,170); +ACE_EXPLOSION_REFLECTION(54,180); +ACE_EXPLOSION_REFLECTION(54,190); +ACE_EXPLOSION_REFLECTION(54,200); +ACE_EXPLOSION_REFLECTION(54,210); +ACE_EXPLOSION_REFLECTION(54,220); +ACE_EXPLOSION_REFLECTION(54,230); +ACE_EXPLOSION_REFLECTION(54,240); +ACE_EXPLOSION_REFLECTION(54,250); +ACE_EXPLOSION_REFLECTION(54,260); +ACE_EXPLOSION_REFLECTION(54,270); +ACE_EXPLOSION_REFLECTION(54,280); +ACE_EXPLOSION_REFLECTION(54,290); +ACE_EXPLOSION_REFLECTION(54,300); +ACE_EXPLOSION_REFLECTION(54,310); +ACE_EXPLOSION_REFLECTION(54,320); +ACE_EXPLOSION_REFLECTION(54,330); +ACE_EXPLOSION_REFLECTION(54,340); +ACE_EXPLOSION_REFLECTION(54,350); +ACE_EXPLOSION_REFLECTION(54,360); +ACE_EXPLOSION_REFLECTION(54,370); +ACE_EXPLOSION_REFLECTION(54,380); +ACE_EXPLOSION_REFLECTION(54,390); +ACE_EXPLOSION_REFLECTION(54,400); +ACE_EXPLOSION_REFLECTION(54,410); +ACE_EXPLOSION_REFLECTION(54,420); +ACE_EXPLOSION_REFLECTION(54,430); +ACE_EXPLOSION_REFLECTION(54,440); +ACE_EXPLOSION_REFLECTION(54,450); +ACE_EXPLOSION_REFLECTION(54,460); +ACE_EXPLOSION_REFLECTION(54,470); +ACE_EXPLOSION_REFLECTION(54,480); +ACE_EXPLOSION_REFLECTION(54,490); +ACE_EXPLOSION_REFLECTION(54,500); +ACE_EXPLOSION_REFLECTION(56,10); +ACE_EXPLOSION_REFLECTION(56,20); +ACE_EXPLOSION_REFLECTION(56,30); +ACE_EXPLOSION_REFLECTION(56,40); +ACE_EXPLOSION_REFLECTION(56,50); +ACE_EXPLOSION_REFLECTION(56,60); +ACE_EXPLOSION_REFLECTION(56,70); +ACE_EXPLOSION_REFLECTION(56,80); +ACE_EXPLOSION_REFLECTION(56,90); +ACE_EXPLOSION_REFLECTION(56,100); +ACE_EXPLOSION_REFLECTION(56,110); +ACE_EXPLOSION_REFLECTION(56,120); +ACE_EXPLOSION_REFLECTION(56,130); +ACE_EXPLOSION_REFLECTION(56,140); +ACE_EXPLOSION_REFLECTION(56,150); +ACE_EXPLOSION_REFLECTION(56,160); +ACE_EXPLOSION_REFLECTION(56,170); +ACE_EXPLOSION_REFLECTION(56,180); +ACE_EXPLOSION_REFLECTION(56,190); +ACE_EXPLOSION_REFLECTION(56,200); +ACE_EXPLOSION_REFLECTION(56,210); +ACE_EXPLOSION_REFLECTION(56,220); +ACE_EXPLOSION_REFLECTION(56,230); +ACE_EXPLOSION_REFLECTION(56,240); +ACE_EXPLOSION_REFLECTION(56,250); +ACE_EXPLOSION_REFLECTION(56,260); +ACE_EXPLOSION_REFLECTION(56,270); +ACE_EXPLOSION_REFLECTION(56,280); +ACE_EXPLOSION_REFLECTION(56,290); +ACE_EXPLOSION_REFLECTION(56,300); +ACE_EXPLOSION_REFLECTION(56,310); +ACE_EXPLOSION_REFLECTION(56,320); +ACE_EXPLOSION_REFLECTION(56,330); +ACE_EXPLOSION_REFLECTION(56,340); +ACE_EXPLOSION_REFLECTION(56,350); +ACE_EXPLOSION_REFLECTION(56,360); +ACE_EXPLOSION_REFLECTION(56,370); +ACE_EXPLOSION_REFLECTION(56,380); +ACE_EXPLOSION_REFLECTION(56,390); +ACE_EXPLOSION_REFLECTION(56,400); +ACE_EXPLOSION_REFLECTION(56,410); +ACE_EXPLOSION_REFLECTION(56,420); +ACE_EXPLOSION_REFLECTION(56,430); +ACE_EXPLOSION_REFLECTION(56,440); +ACE_EXPLOSION_REFLECTION(56,450); +ACE_EXPLOSION_REFLECTION(56,460); +ACE_EXPLOSION_REFLECTION(56,470); +ACE_EXPLOSION_REFLECTION(56,480); +ACE_EXPLOSION_REFLECTION(56,490); +ACE_EXPLOSION_REFLECTION(56,500); +ACE_EXPLOSION_REFLECTION(58,10); +ACE_EXPLOSION_REFLECTION(58,20); +ACE_EXPLOSION_REFLECTION(58,30); +ACE_EXPLOSION_REFLECTION(58,40); +ACE_EXPLOSION_REFLECTION(58,50); +ACE_EXPLOSION_REFLECTION(58,60); +ACE_EXPLOSION_REFLECTION(58,70); +ACE_EXPLOSION_REFLECTION(58,80); +ACE_EXPLOSION_REFLECTION(58,90); +ACE_EXPLOSION_REFLECTION(58,100); +ACE_EXPLOSION_REFLECTION(58,110); +ACE_EXPLOSION_REFLECTION(58,120); +ACE_EXPLOSION_REFLECTION(58,130); +ACE_EXPLOSION_REFLECTION(58,140); +ACE_EXPLOSION_REFLECTION(58,150); +ACE_EXPLOSION_REFLECTION(58,160); +ACE_EXPLOSION_REFLECTION(58,170); +ACE_EXPLOSION_REFLECTION(58,180); +ACE_EXPLOSION_REFLECTION(58,190); +ACE_EXPLOSION_REFLECTION(58,200); +ACE_EXPLOSION_REFLECTION(58,210); +ACE_EXPLOSION_REFLECTION(58,220); +ACE_EXPLOSION_REFLECTION(58,230); +ACE_EXPLOSION_REFLECTION(58,240); +ACE_EXPLOSION_REFLECTION(58,250); +ACE_EXPLOSION_REFLECTION(58,260); +ACE_EXPLOSION_REFLECTION(58,270); +ACE_EXPLOSION_REFLECTION(58,280); +ACE_EXPLOSION_REFLECTION(58,290); +ACE_EXPLOSION_REFLECTION(58,300); +ACE_EXPLOSION_REFLECTION(58,310); +ACE_EXPLOSION_REFLECTION(58,320); +ACE_EXPLOSION_REFLECTION(58,330); +ACE_EXPLOSION_REFLECTION(58,340); +ACE_EXPLOSION_REFLECTION(58,350); +ACE_EXPLOSION_REFLECTION(58,360); +ACE_EXPLOSION_REFLECTION(58,370); +ACE_EXPLOSION_REFLECTION(58,380); +ACE_EXPLOSION_REFLECTION(58,390); +ACE_EXPLOSION_REFLECTION(58,400); +ACE_EXPLOSION_REFLECTION(58,410); +ACE_EXPLOSION_REFLECTION(58,420); +ACE_EXPLOSION_REFLECTION(58,430); +ACE_EXPLOSION_REFLECTION(58,440); +ACE_EXPLOSION_REFLECTION(58,450); +ACE_EXPLOSION_REFLECTION(58,460); +ACE_EXPLOSION_REFLECTION(58,470); +ACE_EXPLOSION_REFLECTION(58,480); +ACE_EXPLOSION_REFLECTION(58,490); +ACE_EXPLOSION_REFLECTION(58,500); +ACE_EXPLOSION_REFLECTION(60,10); +ACE_EXPLOSION_REFLECTION(60,20); +ACE_EXPLOSION_REFLECTION(60,30); +ACE_EXPLOSION_REFLECTION(60,40); +ACE_EXPLOSION_REFLECTION(60,50); +ACE_EXPLOSION_REFLECTION(60,60); +ACE_EXPLOSION_REFLECTION(60,70); +ACE_EXPLOSION_REFLECTION(60,80); +ACE_EXPLOSION_REFLECTION(60,90); +ACE_EXPLOSION_REFLECTION(60,100); +ACE_EXPLOSION_REFLECTION(60,110); +ACE_EXPLOSION_REFLECTION(60,120); +ACE_EXPLOSION_REFLECTION(60,130); +ACE_EXPLOSION_REFLECTION(60,140); +ACE_EXPLOSION_REFLECTION(60,150); +ACE_EXPLOSION_REFLECTION(60,160); +ACE_EXPLOSION_REFLECTION(60,170); +ACE_EXPLOSION_REFLECTION(60,180); +ACE_EXPLOSION_REFLECTION(60,190); +ACE_EXPLOSION_REFLECTION(60,200); +ACE_EXPLOSION_REFLECTION(60,210); +ACE_EXPLOSION_REFLECTION(60,220); +ACE_EXPLOSION_REFLECTION(60,230); +ACE_EXPLOSION_REFLECTION(60,240); +ACE_EXPLOSION_REFLECTION(60,250); +ACE_EXPLOSION_REFLECTION(60,260); +ACE_EXPLOSION_REFLECTION(60,270); +ACE_EXPLOSION_REFLECTION(60,280); +ACE_EXPLOSION_REFLECTION(60,290); +ACE_EXPLOSION_REFLECTION(60,300); +ACE_EXPLOSION_REFLECTION(60,310); +ACE_EXPLOSION_REFLECTION(60,320); +ACE_EXPLOSION_REFLECTION(60,330); +ACE_EXPLOSION_REFLECTION(60,340); +ACE_EXPLOSION_REFLECTION(60,350); +ACE_EXPLOSION_REFLECTION(60,360); +ACE_EXPLOSION_REFLECTION(60,370); +ACE_EXPLOSION_REFLECTION(60,380); +ACE_EXPLOSION_REFLECTION(60,390); +ACE_EXPLOSION_REFLECTION(60,400); +ACE_EXPLOSION_REFLECTION(60,410); +ACE_EXPLOSION_REFLECTION(60,420); +ACE_EXPLOSION_REFLECTION(60,430); +ACE_EXPLOSION_REFLECTION(60,440); +ACE_EXPLOSION_REFLECTION(60,450); +ACE_EXPLOSION_REFLECTION(60,460); +ACE_EXPLOSION_REFLECTION(60,470); +ACE_EXPLOSION_REFLECTION(60,480); +ACE_EXPLOSION_REFLECTION(60,490); +ACE_EXPLOSION_REFLECTION(60,500); +ACE_EXPLOSION_REFLECTION(62,10); +ACE_EXPLOSION_REFLECTION(62,20); +ACE_EXPLOSION_REFLECTION(62,30); +ACE_EXPLOSION_REFLECTION(62,40); +ACE_EXPLOSION_REFLECTION(62,50); +ACE_EXPLOSION_REFLECTION(62,60); +ACE_EXPLOSION_REFLECTION(62,70); +ACE_EXPLOSION_REFLECTION(62,80); +ACE_EXPLOSION_REFLECTION(62,90); +ACE_EXPLOSION_REFLECTION(62,100); +ACE_EXPLOSION_REFLECTION(62,110); +ACE_EXPLOSION_REFLECTION(62,120); +ACE_EXPLOSION_REFLECTION(62,130); +ACE_EXPLOSION_REFLECTION(62,140); +ACE_EXPLOSION_REFLECTION(62,150); +ACE_EXPLOSION_REFLECTION(62,160); +ACE_EXPLOSION_REFLECTION(62,170); +ACE_EXPLOSION_REFLECTION(62,180); +ACE_EXPLOSION_REFLECTION(62,190); +ACE_EXPLOSION_REFLECTION(62,200); +ACE_EXPLOSION_REFLECTION(62,210); +ACE_EXPLOSION_REFLECTION(62,220); +ACE_EXPLOSION_REFLECTION(62,230); +ACE_EXPLOSION_REFLECTION(62,240); +ACE_EXPLOSION_REFLECTION(62,250); +ACE_EXPLOSION_REFLECTION(62,260); +ACE_EXPLOSION_REFLECTION(62,270); +ACE_EXPLOSION_REFLECTION(62,280); +ACE_EXPLOSION_REFLECTION(62,290); +ACE_EXPLOSION_REFLECTION(62,300); +ACE_EXPLOSION_REFLECTION(62,310); +ACE_EXPLOSION_REFLECTION(62,320); +ACE_EXPLOSION_REFLECTION(62,330); +ACE_EXPLOSION_REFLECTION(62,340); +ACE_EXPLOSION_REFLECTION(62,350); +ACE_EXPLOSION_REFLECTION(62,360); +ACE_EXPLOSION_REFLECTION(62,370); +ACE_EXPLOSION_REFLECTION(62,380); +ACE_EXPLOSION_REFLECTION(62,390); +ACE_EXPLOSION_REFLECTION(62,400); +ACE_EXPLOSION_REFLECTION(62,410); +ACE_EXPLOSION_REFLECTION(62,420); +ACE_EXPLOSION_REFLECTION(62,430); +ACE_EXPLOSION_REFLECTION(62,440); +ACE_EXPLOSION_REFLECTION(62,450); +ACE_EXPLOSION_REFLECTION(62,460); +ACE_EXPLOSION_REFLECTION(62,470); +ACE_EXPLOSION_REFLECTION(62,480); +ACE_EXPLOSION_REFLECTION(62,490); +ACE_EXPLOSION_REFLECTION(62,500); +ACE_EXPLOSION_REFLECTION(64,10); +ACE_EXPLOSION_REFLECTION(64,20); +ACE_EXPLOSION_REFLECTION(64,30); +ACE_EXPLOSION_REFLECTION(64,40); +ACE_EXPLOSION_REFLECTION(64,50); +ACE_EXPLOSION_REFLECTION(64,60); +ACE_EXPLOSION_REFLECTION(64,70); +ACE_EXPLOSION_REFLECTION(64,80); +ACE_EXPLOSION_REFLECTION(64,90); +ACE_EXPLOSION_REFLECTION(64,100); +ACE_EXPLOSION_REFLECTION(64,110); +ACE_EXPLOSION_REFLECTION(64,120); +ACE_EXPLOSION_REFLECTION(64,130); +ACE_EXPLOSION_REFLECTION(64,140); +ACE_EXPLOSION_REFLECTION(64,150); +ACE_EXPLOSION_REFLECTION(64,160); +ACE_EXPLOSION_REFLECTION(64,170); +ACE_EXPLOSION_REFLECTION(64,180); +ACE_EXPLOSION_REFLECTION(64,190); +ACE_EXPLOSION_REFLECTION(64,200); +ACE_EXPLOSION_REFLECTION(64,210); +ACE_EXPLOSION_REFLECTION(64,220); +ACE_EXPLOSION_REFLECTION(64,230); +ACE_EXPLOSION_REFLECTION(64,240); +ACE_EXPLOSION_REFLECTION(64,250); +ACE_EXPLOSION_REFLECTION(64,260); +ACE_EXPLOSION_REFLECTION(64,270); +ACE_EXPLOSION_REFLECTION(64,280); +ACE_EXPLOSION_REFLECTION(64,290); +ACE_EXPLOSION_REFLECTION(64,300); +ACE_EXPLOSION_REFLECTION(64,310); +ACE_EXPLOSION_REFLECTION(64,320); +ACE_EXPLOSION_REFLECTION(64,330); +ACE_EXPLOSION_REFLECTION(64,340); +ACE_EXPLOSION_REFLECTION(64,350); +ACE_EXPLOSION_REFLECTION(64,360); +ACE_EXPLOSION_REFLECTION(64,370); +ACE_EXPLOSION_REFLECTION(64,380); +ACE_EXPLOSION_REFLECTION(64,390); +ACE_EXPLOSION_REFLECTION(64,400); +ACE_EXPLOSION_REFLECTION(64,410); +ACE_EXPLOSION_REFLECTION(64,420); +ACE_EXPLOSION_REFLECTION(64,430); +ACE_EXPLOSION_REFLECTION(64,440); +ACE_EXPLOSION_REFLECTION(64,450); +ACE_EXPLOSION_REFLECTION(64,460); +ACE_EXPLOSION_REFLECTION(64,470); +ACE_EXPLOSION_REFLECTION(64,480); +ACE_EXPLOSION_REFLECTION(64,490); +ACE_EXPLOSION_REFLECTION(64,500); +ACE_EXPLOSION_REFLECTION(66,10); +ACE_EXPLOSION_REFLECTION(66,20); +ACE_EXPLOSION_REFLECTION(66,30); +ACE_EXPLOSION_REFLECTION(66,40); +ACE_EXPLOSION_REFLECTION(66,50); +ACE_EXPLOSION_REFLECTION(66,60); +ACE_EXPLOSION_REFLECTION(66,70); +ACE_EXPLOSION_REFLECTION(66,80); +ACE_EXPLOSION_REFLECTION(66,90); +ACE_EXPLOSION_REFLECTION(66,100); +ACE_EXPLOSION_REFLECTION(66,110); +ACE_EXPLOSION_REFLECTION(66,120); +ACE_EXPLOSION_REFLECTION(66,130); +ACE_EXPLOSION_REFLECTION(66,140); +ACE_EXPLOSION_REFLECTION(66,150); +ACE_EXPLOSION_REFLECTION(66,160); +ACE_EXPLOSION_REFLECTION(66,170); +ACE_EXPLOSION_REFLECTION(66,180); +ACE_EXPLOSION_REFLECTION(66,190); +ACE_EXPLOSION_REFLECTION(66,200); +ACE_EXPLOSION_REFLECTION(66,210); +ACE_EXPLOSION_REFLECTION(66,220); +ACE_EXPLOSION_REFLECTION(66,230); +ACE_EXPLOSION_REFLECTION(66,240); +ACE_EXPLOSION_REFLECTION(66,250); +ACE_EXPLOSION_REFLECTION(66,260); +ACE_EXPLOSION_REFLECTION(66,270); +ACE_EXPLOSION_REFLECTION(66,280); +ACE_EXPLOSION_REFLECTION(66,290); +ACE_EXPLOSION_REFLECTION(66,300); +ACE_EXPLOSION_REFLECTION(66,310); +ACE_EXPLOSION_REFLECTION(66,320); +ACE_EXPLOSION_REFLECTION(66,330); +ACE_EXPLOSION_REFLECTION(66,340); +ACE_EXPLOSION_REFLECTION(66,350); +ACE_EXPLOSION_REFLECTION(66,360); +ACE_EXPLOSION_REFLECTION(66,370); +ACE_EXPLOSION_REFLECTION(66,380); +ACE_EXPLOSION_REFLECTION(66,390); +ACE_EXPLOSION_REFLECTION(66,400); +ACE_EXPLOSION_REFLECTION(66,410); +ACE_EXPLOSION_REFLECTION(66,420); +ACE_EXPLOSION_REFLECTION(66,430); +ACE_EXPLOSION_REFLECTION(66,440); +ACE_EXPLOSION_REFLECTION(66,450); +ACE_EXPLOSION_REFLECTION(66,460); +ACE_EXPLOSION_REFLECTION(66,470); +ACE_EXPLOSION_REFLECTION(66,480); +ACE_EXPLOSION_REFLECTION(66,490); +ACE_EXPLOSION_REFLECTION(66,500); +ACE_EXPLOSION_REFLECTION(68,10); +ACE_EXPLOSION_REFLECTION(68,20); +ACE_EXPLOSION_REFLECTION(68,30); +ACE_EXPLOSION_REFLECTION(68,40); +ACE_EXPLOSION_REFLECTION(68,50); +ACE_EXPLOSION_REFLECTION(68,60); +ACE_EXPLOSION_REFLECTION(68,70); +ACE_EXPLOSION_REFLECTION(68,80); +ACE_EXPLOSION_REFLECTION(68,90); +ACE_EXPLOSION_REFLECTION(68,100); +ACE_EXPLOSION_REFLECTION(68,110); +ACE_EXPLOSION_REFLECTION(68,120); +ACE_EXPLOSION_REFLECTION(68,130); +ACE_EXPLOSION_REFLECTION(68,140); +ACE_EXPLOSION_REFLECTION(68,150); +ACE_EXPLOSION_REFLECTION(68,160); +ACE_EXPLOSION_REFLECTION(68,170); +ACE_EXPLOSION_REFLECTION(68,180); +ACE_EXPLOSION_REFLECTION(68,190); +ACE_EXPLOSION_REFLECTION(68,200); +ACE_EXPLOSION_REFLECTION(68,210); +ACE_EXPLOSION_REFLECTION(68,220); +ACE_EXPLOSION_REFLECTION(68,230); +ACE_EXPLOSION_REFLECTION(68,240); +ACE_EXPLOSION_REFLECTION(68,250); +ACE_EXPLOSION_REFLECTION(68,260); +ACE_EXPLOSION_REFLECTION(68,270); +ACE_EXPLOSION_REFLECTION(68,280); +ACE_EXPLOSION_REFLECTION(68,290); +ACE_EXPLOSION_REFLECTION(68,300); +ACE_EXPLOSION_REFLECTION(68,310); +ACE_EXPLOSION_REFLECTION(68,320); +ACE_EXPLOSION_REFLECTION(68,330); +ACE_EXPLOSION_REFLECTION(68,340); +ACE_EXPLOSION_REFLECTION(68,350); +ACE_EXPLOSION_REFLECTION(68,360); +ACE_EXPLOSION_REFLECTION(68,370); +ACE_EXPLOSION_REFLECTION(68,380); +ACE_EXPLOSION_REFLECTION(68,390); +ACE_EXPLOSION_REFLECTION(68,400); +ACE_EXPLOSION_REFLECTION(68,410); +ACE_EXPLOSION_REFLECTION(68,420); +ACE_EXPLOSION_REFLECTION(68,430); +ACE_EXPLOSION_REFLECTION(68,440); +ACE_EXPLOSION_REFLECTION(68,450); +ACE_EXPLOSION_REFLECTION(68,460); +ACE_EXPLOSION_REFLECTION(68,470); +ACE_EXPLOSION_REFLECTION(68,480); +ACE_EXPLOSION_REFLECTION(68,490); +ACE_EXPLOSION_REFLECTION(68,500); +ACE_EXPLOSION_REFLECTION(70,10); +ACE_EXPLOSION_REFLECTION(70,20); +ACE_EXPLOSION_REFLECTION(70,30); +ACE_EXPLOSION_REFLECTION(70,40); +ACE_EXPLOSION_REFLECTION(70,50); +ACE_EXPLOSION_REFLECTION(70,60); +ACE_EXPLOSION_REFLECTION(70,70); +ACE_EXPLOSION_REFLECTION(70,80); +ACE_EXPLOSION_REFLECTION(70,90); +ACE_EXPLOSION_REFLECTION(70,100); +ACE_EXPLOSION_REFLECTION(70,110); +ACE_EXPLOSION_REFLECTION(70,120); +ACE_EXPLOSION_REFLECTION(70,130); +ACE_EXPLOSION_REFLECTION(70,140); +ACE_EXPLOSION_REFLECTION(70,150); +ACE_EXPLOSION_REFLECTION(70,160); +ACE_EXPLOSION_REFLECTION(70,170); +ACE_EXPLOSION_REFLECTION(70,180); +ACE_EXPLOSION_REFLECTION(70,190); +ACE_EXPLOSION_REFLECTION(70,200); +ACE_EXPLOSION_REFLECTION(70,210); +ACE_EXPLOSION_REFLECTION(70,220); +ACE_EXPLOSION_REFLECTION(70,230); +ACE_EXPLOSION_REFLECTION(70,240); +ACE_EXPLOSION_REFLECTION(70,250); +ACE_EXPLOSION_REFLECTION(70,260); +ACE_EXPLOSION_REFLECTION(70,270); +ACE_EXPLOSION_REFLECTION(70,280); +ACE_EXPLOSION_REFLECTION(70,290); +ACE_EXPLOSION_REFLECTION(70,300); +ACE_EXPLOSION_REFLECTION(70,310); +ACE_EXPLOSION_REFLECTION(70,320); +ACE_EXPLOSION_REFLECTION(70,330); +ACE_EXPLOSION_REFLECTION(70,340); +ACE_EXPLOSION_REFLECTION(70,350); +ACE_EXPLOSION_REFLECTION(70,360); +ACE_EXPLOSION_REFLECTION(70,370); +ACE_EXPLOSION_REFLECTION(70,380); +ACE_EXPLOSION_REFLECTION(70,390); +ACE_EXPLOSION_REFLECTION(70,400); +ACE_EXPLOSION_REFLECTION(70,410); +ACE_EXPLOSION_REFLECTION(70,420); +ACE_EXPLOSION_REFLECTION(70,430); +ACE_EXPLOSION_REFLECTION(70,440); +ACE_EXPLOSION_REFLECTION(70,450); +ACE_EXPLOSION_REFLECTION(70,460); +ACE_EXPLOSION_REFLECTION(70,470); +ACE_EXPLOSION_REFLECTION(70,480); +ACE_EXPLOSION_REFLECTION(70,490); +ACE_EXPLOSION_REFLECTION(70,500); +ACE_EXPLOSION_REFLECTION(72,10); +ACE_EXPLOSION_REFLECTION(72,20); +ACE_EXPLOSION_REFLECTION(72,30); +ACE_EXPLOSION_REFLECTION(72,40); +ACE_EXPLOSION_REFLECTION(72,50); +ACE_EXPLOSION_REFLECTION(72,60); +ACE_EXPLOSION_REFLECTION(72,70); +ACE_EXPLOSION_REFLECTION(72,80); +ACE_EXPLOSION_REFLECTION(72,90); +ACE_EXPLOSION_REFLECTION(72,100); +ACE_EXPLOSION_REFLECTION(72,110); +ACE_EXPLOSION_REFLECTION(72,120); +ACE_EXPLOSION_REFLECTION(72,130); +ACE_EXPLOSION_REFLECTION(72,140); +ACE_EXPLOSION_REFLECTION(72,150); +ACE_EXPLOSION_REFLECTION(72,160); +ACE_EXPLOSION_REFLECTION(72,170); +ACE_EXPLOSION_REFLECTION(72,180); +ACE_EXPLOSION_REFLECTION(72,190); +ACE_EXPLOSION_REFLECTION(72,200); +ACE_EXPLOSION_REFLECTION(72,210); +ACE_EXPLOSION_REFLECTION(72,220); +ACE_EXPLOSION_REFLECTION(72,230); +ACE_EXPLOSION_REFLECTION(72,240); +ACE_EXPLOSION_REFLECTION(72,250); +ACE_EXPLOSION_REFLECTION(72,260); +ACE_EXPLOSION_REFLECTION(72,270); +ACE_EXPLOSION_REFLECTION(72,280); +ACE_EXPLOSION_REFLECTION(72,290); +ACE_EXPLOSION_REFLECTION(72,300); +ACE_EXPLOSION_REFLECTION(72,310); +ACE_EXPLOSION_REFLECTION(72,320); +ACE_EXPLOSION_REFLECTION(72,330); +ACE_EXPLOSION_REFLECTION(72,340); +ACE_EXPLOSION_REFLECTION(72,350); +ACE_EXPLOSION_REFLECTION(72,360); +ACE_EXPLOSION_REFLECTION(72,370); +ACE_EXPLOSION_REFLECTION(72,380); +ACE_EXPLOSION_REFLECTION(72,390); +ACE_EXPLOSION_REFLECTION(72,400); +ACE_EXPLOSION_REFLECTION(72,410); +ACE_EXPLOSION_REFLECTION(72,420); +ACE_EXPLOSION_REFLECTION(72,430); +ACE_EXPLOSION_REFLECTION(72,440); +ACE_EXPLOSION_REFLECTION(72,450); +ACE_EXPLOSION_REFLECTION(72,460); +ACE_EXPLOSION_REFLECTION(72,470); +ACE_EXPLOSION_REFLECTION(72,480); +ACE_EXPLOSION_REFLECTION(72,490); +ACE_EXPLOSION_REFLECTION(72,500); +ACE_EXPLOSION_REFLECTION(74,10); +ACE_EXPLOSION_REFLECTION(74,20); +ACE_EXPLOSION_REFLECTION(74,30); +ACE_EXPLOSION_REFLECTION(74,40); +ACE_EXPLOSION_REFLECTION(74,50); +ACE_EXPLOSION_REFLECTION(74,60); +ACE_EXPLOSION_REFLECTION(74,70); +ACE_EXPLOSION_REFLECTION(74,80); +ACE_EXPLOSION_REFLECTION(74,90); +ACE_EXPLOSION_REFLECTION(74,100); +ACE_EXPLOSION_REFLECTION(74,110); +ACE_EXPLOSION_REFLECTION(74,120); +ACE_EXPLOSION_REFLECTION(74,130); +ACE_EXPLOSION_REFLECTION(74,140); +ACE_EXPLOSION_REFLECTION(74,150); +ACE_EXPLOSION_REFLECTION(74,160); +ACE_EXPLOSION_REFLECTION(74,170); +ACE_EXPLOSION_REFLECTION(74,180); +ACE_EXPLOSION_REFLECTION(74,190); +ACE_EXPLOSION_REFLECTION(74,200); +ACE_EXPLOSION_REFLECTION(74,210); +ACE_EXPLOSION_REFLECTION(74,220); +ACE_EXPLOSION_REFLECTION(74,230); +ACE_EXPLOSION_REFLECTION(74,240); +ACE_EXPLOSION_REFLECTION(74,250); +ACE_EXPLOSION_REFLECTION(74,260); +ACE_EXPLOSION_REFLECTION(74,270); +ACE_EXPLOSION_REFLECTION(74,280); +ACE_EXPLOSION_REFLECTION(74,290); +ACE_EXPLOSION_REFLECTION(74,300); +ACE_EXPLOSION_REFLECTION(74,310); +ACE_EXPLOSION_REFLECTION(74,320); +ACE_EXPLOSION_REFLECTION(74,330); +ACE_EXPLOSION_REFLECTION(74,340); +ACE_EXPLOSION_REFLECTION(74,350); +ACE_EXPLOSION_REFLECTION(74,360); +ACE_EXPLOSION_REFLECTION(74,370); +ACE_EXPLOSION_REFLECTION(74,380); +ACE_EXPLOSION_REFLECTION(74,390); +ACE_EXPLOSION_REFLECTION(74,400); +ACE_EXPLOSION_REFLECTION(74,410); +ACE_EXPLOSION_REFLECTION(74,420); +ACE_EXPLOSION_REFLECTION(74,430); +ACE_EXPLOSION_REFLECTION(74,440); +ACE_EXPLOSION_REFLECTION(74,450); +ACE_EXPLOSION_REFLECTION(74,460); +ACE_EXPLOSION_REFLECTION(74,470); +ACE_EXPLOSION_REFLECTION(74,480); +ACE_EXPLOSION_REFLECTION(74,490); +ACE_EXPLOSION_REFLECTION(74,500); +ACE_EXPLOSION_REFLECTION(76,10); +ACE_EXPLOSION_REFLECTION(76,20); +ACE_EXPLOSION_REFLECTION(76,30); +ACE_EXPLOSION_REFLECTION(76,40); +ACE_EXPLOSION_REFLECTION(76,50); +ACE_EXPLOSION_REFLECTION(76,60); +ACE_EXPLOSION_REFLECTION(76,70); +ACE_EXPLOSION_REFLECTION(76,80); +ACE_EXPLOSION_REFLECTION(76,90); +ACE_EXPLOSION_REFLECTION(76,100); +ACE_EXPLOSION_REFLECTION(76,110); +ACE_EXPLOSION_REFLECTION(76,120); +ACE_EXPLOSION_REFLECTION(76,130); +ACE_EXPLOSION_REFLECTION(76,140); +ACE_EXPLOSION_REFLECTION(76,150); +ACE_EXPLOSION_REFLECTION(76,160); +ACE_EXPLOSION_REFLECTION(76,170); +ACE_EXPLOSION_REFLECTION(76,180); +ACE_EXPLOSION_REFLECTION(76,190); +ACE_EXPLOSION_REFLECTION(76,200); +ACE_EXPLOSION_REFLECTION(76,210); +ACE_EXPLOSION_REFLECTION(76,220); +ACE_EXPLOSION_REFLECTION(76,230); +ACE_EXPLOSION_REFLECTION(76,240); +ACE_EXPLOSION_REFLECTION(76,250); +ACE_EXPLOSION_REFLECTION(76,260); +ACE_EXPLOSION_REFLECTION(76,270); +ACE_EXPLOSION_REFLECTION(76,280); +ACE_EXPLOSION_REFLECTION(76,290); +ACE_EXPLOSION_REFLECTION(76,300); +ACE_EXPLOSION_REFLECTION(76,310); +ACE_EXPLOSION_REFLECTION(76,320); +ACE_EXPLOSION_REFLECTION(76,330); +ACE_EXPLOSION_REFLECTION(76,340); +ACE_EXPLOSION_REFLECTION(76,350); +ACE_EXPLOSION_REFLECTION(76,360); +ACE_EXPLOSION_REFLECTION(76,370); +ACE_EXPLOSION_REFLECTION(76,380); +ACE_EXPLOSION_REFLECTION(76,390); +ACE_EXPLOSION_REFLECTION(76,400); +ACE_EXPLOSION_REFLECTION(76,410); +ACE_EXPLOSION_REFLECTION(76,420); +ACE_EXPLOSION_REFLECTION(76,430); +ACE_EXPLOSION_REFLECTION(76,440); +ACE_EXPLOSION_REFLECTION(76,450); +ACE_EXPLOSION_REFLECTION(76,460); +ACE_EXPLOSION_REFLECTION(76,470); +ACE_EXPLOSION_REFLECTION(76,480); +ACE_EXPLOSION_REFLECTION(76,490); +ACE_EXPLOSION_REFLECTION(76,500); +ACE_EXPLOSION_REFLECTION(78,10); +ACE_EXPLOSION_REFLECTION(78,20); +ACE_EXPLOSION_REFLECTION(78,30); +ACE_EXPLOSION_REFLECTION(78,40); +ACE_EXPLOSION_REFLECTION(78,50); +ACE_EXPLOSION_REFLECTION(78,60); +ACE_EXPLOSION_REFLECTION(78,70); +ACE_EXPLOSION_REFLECTION(78,80); +ACE_EXPLOSION_REFLECTION(78,90); +ACE_EXPLOSION_REFLECTION(78,100); +ACE_EXPLOSION_REFLECTION(78,110); +ACE_EXPLOSION_REFLECTION(78,120); +ACE_EXPLOSION_REFLECTION(78,130); +ACE_EXPLOSION_REFLECTION(78,140); +ACE_EXPLOSION_REFLECTION(78,150); +ACE_EXPLOSION_REFLECTION(78,160); +ACE_EXPLOSION_REFLECTION(78,170); +ACE_EXPLOSION_REFLECTION(78,180); +ACE_EXPLOSION_REFLECTION(78,190); +ACE_EXPLOSION_REFLECTION(78,200); +ACE_EXPLOSION_REFLECTION(78,210); +ACE_EXPLOSION_REFLECTION(78,220); +ACE_EXPLOSION_REFLECTION(78,230); +ACE_EXPLOSION_REFLECTION(78,240); +ACE_EXPLOSION_REFLECTION(78,250); +ACE_EXPLOSION_REFLECTION(78,260); +ACE_EXPLOSION_REFLECTION(78,270); +ACE_EXPLOSION_REFLECTION(78,280); +ACE_EXPLOSION_REFLECTION(78,290); +ACE_EXPLOSION_REFLECTION(78,300); +ACE_EXPLOSION_REFLECTION(78,310); +ACE_EXPLOSION_REFLECTION(78,320); +ACE_EXPLOSION_REFLECTION(78,330); +ACE_EXPLOSION_REFLECTION(78,340); +ACE_EXPLOSION_REFLECTION(78,350); +ACE_EXPLOSION_REFLECTION(78,360); +ACE_EXPLOSION_REFLECTION(78,370); +ACE_EXPLOSION_REFLECTION(78,380); +ACE_EXPLOSION_REFLECTION(78,390); +ACE_EXPLOSION_REFLECTION(78,400); +ACE_EXPLOSION_REFLECTION(78,410); +ACE_EXPLOSION_REFLECTION(78,420); +ACE_EXPLOSION_REFLECTION(78,430); +ACE_EXPLOSION_REFLECTION(78,440); +ACE_EXPLOSION_REFLECTION(78,450); +ACE_EXPLOSION_REFLECTION(78,460); +ACE_EXPLOSION_REFLECTION(78,470); +ACE_EXPLOSION_REFLECTION(78,480); +ACE_EXPLOSION_REFLECTION(78,490); +ACE_EXPLOSION_REFLECTION(78,500); +ACE_EXPLOSION_REFLECTION(80,10); +ACE_EXPLOSION_REFLECTION(80,20); +ACE_EXPLOSION_REFLECTION(80,30); +ACE_EXPLOSION_REFLECTION(80,40); +ACE_EXPLOSION_REFLECTION(80,50); +ACE_EXPLOSION_REFLECTION(80,60); +ACE_EXPLOSION_REFLECTION(80,70); +ACE_EXPLOSION_REFLECTION(80,80); +ACE_EXPLOSION_REFLECTION(80,90); +ACE_EXPLOSION_REFLECTION(80,100); +ACE_EXPLOSION_REFLECTION(80,110); +ACE_EXPLOSION_REFLECTION(80,120); +ACE_EXPLOSION_REFLECTION(80,130); +ACE_EXPLOSION_REFLECTION(80,140); +ACE_EXPLOSION_REFLECTION(80,150); +ACE_EXPLOSION_REFLECTION(80,160); +ACE_EXPLOSION_REFLECTION(80,170); +ACE_EXPLOSION_REFLECTION(80,180); +ACE_EXPLOSION_REFLECTION(80,190); +ACE_EXPLOSION_REFLECTION(80,200); +ACE_EXPLOSION_REFLECTION(80,210); +ACE_EXPLOSION_REFLECTION(80,220); +ACE_EXPLOSION_REFLECTION(80,230); +ACE_EXPLOSION_REFLECTION(80,240); +ACE_EXPLOSION_REFLECTION(80,250); +ACE_EXPLOSION_REFLECTION(80,260); +ACE_EXPLOSION_REFLECTION(80,270); +ACE_EXPLOSION_REFLECTION(80,280); +ACE_EXPLOSION_REFLECTION(80,290); +ACE_EXPLOSION_REFLECTION(80,300); +ACE_EXPLOSION_REFLECTION(80,310); +ACE_EXPLOSION_REFLECTION(80,320); +ACE_EXPLOSION_REFLECTION(80,330); +ACE_EXPLOSION_REFLECTION(80,340); +ACE_EXPLOSION_REFLECTION(80,350); +ACE_EXPLOSION_REFLECTION(80,360); +ACE_EXPLOSION_REFLECTION(80,370); +ACE_EXPLOSION_REFLECTION(80,380); +ACE_EXPLOSION_REFLECTION(80,390); +ACE_EXPLOSION_REFLECTION(80,400); +ACE_EXPLOSION_REFLECTION(80,410); +ACE_EXPLOSION_REFLECTION(80,420); +ACE_EXPLOSION_REFLECTION(80,430); +ACE_EXPLOSION_REFLECTION(80,440); +ACE_EXPLOSION_REFLECTION(80,450); +ACE_EXPLOSION_REFLECTION(80,460); +ACE_EXPLOSION_REFLECTION(80,470); +ACE_EXPLOSION_REFLECTION(80,480); +ACE_EXPLOSION_REFLECTION(80,490); +ACE_EXPLOSION_REFLECTION(80,500); +ACE_EXPLOSION_REFLECTION(82,10); +ACE_EXPLOSION_REFLECTION(82,20); +ACE_EXPLOSION_REFLECTION(82,30); +ACE_EXPLOSION_REFLECTION(82,40); +ACE_EXPLOSION_REFLECTION(82,50); +ACE_EXPLOSION_REFLECTION(82,60); +ACE_EXPLOSION_REFLECTION(82,70); +ACE_EXPLOSION_REFLECTION(82,80); +ACE_EXPLOSION_REFLECTION(82,90); +ACE_EXPLOSION_REFLECTION(82,100); +ACE_EXPLOSION_REFLECTION(82,110); +ACE_EXPLOSION_REFLECTION(82,120); +ACE_EXPLOSION_REFLECTION(82,130); +ACE_EXPLOSION_REFLECTION(82,140); +ACE_EXPLOSION_REFLECTION(82,150); +ACE_EXPLOSION_REFLECTION(82,160); +ACE_EXPLOSION_REFLECTION(82,170); +ACE_EXPLOSION_REFLECTION(82,180); +ACE_EXPLOSION_REFLECTION(82,190); +ACE_EXPLOSION_REFLECTION(82,200); +ACE_EXPLOSION_REFLECTION(82,210); +ACE_EXPLOSION_REFLECTION(82,220); +ACE_EXPLOSION_REFLECTION(82,230); +ACE_EXPLOSION_REFLECTION(82,240); +ACE_EXPLOSION_REFLECTION(82,250); +ACE_EXPLOSION_REFLECTION(82,260); +ACE_EXPLOSION_REFLECTION(82,270); +ACE_EXPLOSION_REFLECTION(82,280); +ACE_EXPLOSION_REFLECTION(82,290); +ACE_EXPLOSION_REFLECTION(82,300); +ACE_EXPLOSION_REFLECTION(82,310); +ACE_EXPLOSION_REFLECTION(82,320); +ACE_EXPLOSION_REFLECTION(82,330); +ACE_EXPLOSION_REFLECTION(82,340); +ACE_EXPLOSION_REFLECTION(82,350); +ACE_EXPLOSION_REFLECTION(82,360); +ACE_EXPLOSION_REFLECTION(82,370); +ACE_EXPLOSION_REFLECTION(82,380); +ACE_EXPLOSION_REFLECTION(82,390); +ACE_EXPLOSION_REFLECTION(82,400); +ACE_EXPLOSION_REFLECTION(82,410); +ACE_EXPLOSION_REFLECTION(82,420); +ACE_EXPLOSION_REFLECTION(82,430); +ACE_EXPLOSION_REFLECTION(82,440); +ACE_EXPLOSION_REFLECTION(82,450); +ACE_EXPLOSION_REFLECTION(82,460); +ACE_EXPLOSION_REFLECTION(82,470); +ACE_EXPLOSION_REFLECTION(82,480); +ACE_EXPLOSION_REFLECTION(82,490); +ACE_EXPLOSION_REFLECTION(82,500); +ACE_EXPLOSION_REFLECTION(84,10); +ACE_EXPLOSION_REFLECTION(84,20); +ACE_EXPLOSION_REFLECTION(84,30); +ACE_EXPLOSION_REFLECTION(84,40); +ACE_EXPLOSION_REFLECTION(84,50); +ACE_EXPLOSION_REFLECTION(84,60); +ACE_EXPLOSION_REFLECTION(84,70); +ACE_EXPLOSION_REFLECTION(84,80); +ACE_EXPLOSION_REFLECTION(84,90); +ACE_EXPLOSION_REFLECTION(84,100); +ACE_EXPLOSION_REFLECTION(84,110); +ACE_EXPLOSION_REFLECTION(84,120); +ACE_EXPLOSION_REFLECTION(84,130); +ACE_EXPLOSION_REFLECTION(84,140); +ACE_EXPLOSION_REFLECTION(84,150); +ACE_EXPLOSION_REFLECTION(84,160); +ACE_EXPLOSION_REFLECTION(84,170); +ACE_EXPLOSION_REFLECTION(84,180); +ACE_EXPLOSION_REFLECTION(84,190); +ACE_EXPLOSION_REFLECTION(84,200); +ACE_EXPLOSION_REFLECTION(84,210); +ACE_EXPLOSION_REFLECTION(84,220); +ACE_EXPLOSION_REFLECTION(84,230); +ACE_EXPLOSION_REFLECTION(84,240); +ACE_EXPLOSION_REFLECTION(84,250); +ACE_EXPLOSION_REFLECTION(84,260); +ACE_EXPLOSION_REFLECTION(84,270); +ACE_EXPLOSION_REFLECTION(84,280); +ACE_EXPLOSION_REFLECTION(84,290); +ACE_EXPLOSION_REFLECTION(84,300); +ACE_EXPLOSION_REFLECTION(84,310); +ACE_EXPLOSION_REFLECTION(84,320); +ACE_EXPLOSION_REFLECTION(84,330); +ACE_EXPLOSION_REFLECTION(84,340); +ACE_EXPLOSION_REFLECTION(84,350); +ACE_EXPLOSION_REFLECTION(84,360); +ACE_EXPLOSION_REFLECTION(84,370); +ACE_EXPLOSION_REFLECTION(84,380); +ACE_EXPLOSION_REFLECTION(84,390); +ACE_EXPLOSION_REFLECTION(84,400); +ACE_EXPLOSION_REFLECTION(84,410); +ACE_EXPLOSION_REFLECTION(84,420); +ACE_EXPLOSION_REFLECTION(84,430); +ACE_EXPLOSION_REFLECTION(84,440); +ACE_EXPLOSION_REFLECTION(84,450); +ACE_EXPLOSION_REFLECTION(84,460); +ACE_EXPLOSION_REFLECTION(84,470); +ACE_EXPLOSION_REFLECTION(84,480); +ACE_EXPLOSION_REFLECTION(84,490); +ACE_EXPLOSION_REFLECTION(84,500); +ACE_EXPLOSION_REFLECTION(86,10); +ACE_EXPLOSION_REFLECTION(86,20); +ACE_EXPLOSION_REFLECTION(86,30); +ACE_EXPLOSION_REFLECTION(86,40); +ACE_EXPLOSION_REFLECTION(86,50); +ACE_EXPLOSION_REFLECTION(86,60); +ACE_EXPLOSION_REFLECTION(86,70); +ACE_EXPLOSION_REFLECTION(86,80); +ACE_EXPLOSION_REFLECTION(86,90); +ACE_EXPLOSION_REFLECTION(86,100); +ACE_EXPLOSION_REFLECTION(86,110); +ACE_EXPLOSION_REFLECTION(86,120); +ACE_EXPLOSION_REFLECTION(86,130); +ACE_EXPLOSION_REFLECTION(86,140); +ACE_EXPLOSION_REFLECTION(86,150); +ACE_EXPLOSION_REFLECTION(86,160); +ACE_EXPLOSION_REFLECTION(86,170); +ACE_EXPLOSION_REFLECTION(86,180); +ACE_EXPLOSION_REFLECTION(86,190); +ACE_EXPLOSION_REFLECTION(86,200); +ACE_EXPLOSION_REFLECTION(86,210); +ACE_EXPLOSION_REFLECTION(86,220); +ACE_EXPLOSION_REFLECTION(86,230); +ACE_EXPLOSION_REFLECTION(86,240); +ACE_EXPLOSION_REFLECTION(86,250); +ACE_EXPLOSION_REFLECTION(86,260); +ACE_EXPLOSION_REFLECTION(86,270); +ACE_EXPLOSION_REFLECTION(86,280); +ACE_EXPLOSION_REFLECTION(86,290); +ACE_EXPLOSION_REFLECTION(86,300); +ACE_EXPLOSION_REFLECTION(86,310); +ACE_EXPLOSION_REFLECTION(86,320); +ACE_EXPLOSION_REFLECTION(86,330); +ACE_EXPLOSION_REFLECTION(86,340); +ACE_EXPLOSION_REFLECTION(86,350); +ACE_EXPLOSION_REFLECTION(86,360); +ACE_EXPLOSION_REFLECTION(86,370); +ACE_EXPLOSION_REFLECTION(86,380); +ACE_EXPLOSION_REFLECTION(86,390); +ACE_EXPLOSION_REFLECTION(86,400); +ACE_EXPLOSION_REFLECTION(86,410); +ACE_EXPLOSION_REFLECTION(86,420); +ACE_EXPLOSION_REFLECTION(86,430); +ACE_EXPLOSION_REFLECTION(86,440); +ACE_EXPLOSION_REFLECTION(86,450); +ACE_EXPLOSION_REFLECTION(86,460); +ACE_EXPLOSION_REFLECTION(86,470); +ACE_EXPLOSION_REFLECTION(86,480); +ACE_EXPLOSION_REFLECTION(86,490); +ACE_EXPLOSION_REFLECTION(86,500); +ACE_EXPLOSION_REFLECTION(88,10); +ACE_EXPLOSION_REFLECTION(88,20); +ACE_EXPLOSION_REFLECTION(88,30); +ACE_EXPLOSION_REFLECTION(88,40); +ACE_EXPLOSION_REFLECTION(88,50); +ACE_EXPLOSION_REFLECTION(88,60); +ACE_EXPLOSION_REFLECTION(88,70); +ACE_EXPLOSION_REFLECTION(88,80); +ACE_EXPLOSION_REFLECTION(88,90); +ACE_EXPLOSION_REFLECTION(88,100); +ACE_EXPLOSION_REFLECTION(88,110); +ACE_EXPLOSION_REFLECTION(88,120); +ACE_EXPLOSION_REFLECTION(88,130); +ACE_EXPLOSION_REFLECTION(88,140); +ACE_EXPLOSION_REFLECTION(88,150); +ACE_EXPLOSION_REFLECTION(88,160); +ACE_EXPLOSION_REFLECTION(88,170); +ACE_EXPLOSION_REFLECTION(88,180); +ACE_EXPLOSION_REFLECTION(88,190); +ACE_EXPLOSION_REFLECTION(88,200); +ACE_EXPLOSION_REFLECTION(88,210); +ACE_EXPLOSION_REFLECTION(88,220); +ACE_EXPLOSION_REFLECTION(88,230); +ACE_EXPLOSION_REFLECTION(88,240); +ACE_EXPLOSION_REFLECTION(88,250); +ACE_EXPLOSION_REFLECTION(88,260); +ACE_EXPLOSION_REFLECTION(88,270); +ACE_EXPLOSION_REFLECTION(88,280); +ACE_EXPLOSION_REFLECTION(88,290); +ACE_EXPLOSION_REFLECTION(88,300); +ACE_EXPLOSION_REFLECTION(88,310); +ACE_EXPLOSION_REFLECTION(88,320); +ACE_EXPLOSION_REFLECTION(88,330); +ACE_EXPLOSION_REFLECTION(88,340); +ACE_EXPLOSION_REFLECTION(88,350); +ACE_EXPLOSION_REFLECTION(88,360); +ACE_EXPLOSION_REFLECTION(88,370); +ACE_EXPLOSION_REFLECTION(88,380); +ACE_EXPLOSION_REFLECTION(88,390); +ACE_EXPLOSION_REFLECTION(88,400); +ACE_EXPLOSION_REFLECTION(88,410); +ACE_EXPLOSION_REFLECTION(88,420); +ACE_EXPLOSION_REFLECTION(88,430); +ACE_EXPLOSION_REFLECTION(88,440); +ACE_EXPLOSION_REFLECTION(88,450); +ACE_EXPLOSION_REFLECTION(88,460); +ACE_EXPLOSION_REFLECTION(88,470); +ACE_EXPLOSION_REFLECTION(88,480); +ACE_EXPLOSION_REFLECTION(88,490); +ACE_EXPLOSION_REFLECTION(88,500); +ACE_EXPLOSION_REFLECTION(90,10); +ACE_EXPLOSION_REFLECTION(90,20); +ACE_EXPLOSION_REFLECTION(90,30); +ACE_EXPLOSION_REFLECTION(90,40); +ACE_EXPLOSION_REFLECTION(90,50); +ACE_EXPLOSION_REFLECTION(90,60); +ACE_EXPLOSION_REFLECTION(90,70); +ACE_EXPLOSION_REFLECTION(90,80); +ACE_EXPLOSION_REFLECTION(90,90); +ACE_EXPLOSION_REFLECTION(90,100); +ACE_EXPLOSION_REFLECTION(90,110); +ACE_EXPLOSION_REFLECTION(90,120); +ACE_EXPLOSION_REFLECTION(90,130); +ACE_EXPLOSION_REFLECTION(90,140); +ACE_EXPLOSION_REFLECTION(90,150); +ACE_EXPLOSION_REFLECTION(90,160); +ACE_EXPLOSION_REFLECTION(90,170); +ACE_EXPLOSION_REFLECTION(90,180); +ACE_EXPLOSION_REFLECTION(90,190); +ACE_EXPLOSION_REFLECTION(90,200); +ACE_EXPLOSION_REFLECTION(90,210); +ACE_EXPLOSION_REFLECTION(90,220); +ACE_EXPLOSION_REFLECTION(90,230); +ACE_EXPLOSION_REFLECTION(90,240); +ACE_EXPLOSION_REFLECTION(90,250); +ACE_EXPLOSION_REFLECTION(90,260); +ACE_EXPLOSION_REFLECTION(90,270); +ACE_EXPLOSION_REFLECTION(90,280); +ACE_EXPLOSION_REFLECTION(90,290); +ACE_EXPLOSION_REFLECTION(90,300); +ACE_EXPLOSION_REFLECTION(90,310); +ACE_EXPLOSION_REFLECTION(90,320); +ACE_EXPLOSION_REFLECTION(90,330); +ACE_EXPLOSION_REFLECTION(90,340); +ACE_EXPLOSION_REFLECTION(90,350); +ACE_EXPLOSION_REFLECTION(90,360); +ACE_EXPLOSION_REFLECTION(90,370); +ACE_EXPLOSION_REFLECTION(90,380); +ACE_EXPLOSION_REFLECTION(90,390); +ACE_EXPLOSION_REFLECTION(90,400); +ACE_EXPLOSION_REFLECTION(90,410); +ACE_EXPLOSION_REFLECTION(90,420); +ACE_EXPLOSION_REFLECTION(90,430); +ACE_EXPLOSION_REFLECTION(90,440); +ACE_EXPLOSION_REFLECTION(90,450); +ACE_EXPLOSION_REFLECTION(90,460); +ACE_EXPLOSION_REFLECTION(90,470); +ACE_EXPLOSION_REFLECTION(90,480); +ACE_EXPLOSION_REFLECTION(90,490); +ACE_EXPLOSION_REFLECTION(90,500); +ACE_EXPLOSION_REFLECTION(92,10); +ACE_EXPLOSION_REFLECTION(92,20); +ACE_EXPLOSION_REFLECTION(92,30); +ACE_EXPLOSION_REFLECTION(92,40); +ACE_EXPLOSION_REFLECTION(92,50); +ACE_EXPLOSION_REFLECTION(92,60); +ACE_EXPLOSION_REFLECTION(92,70); +ACE_EXPLOSION_REFLECTION(92,80); +ACE_EXPLOSION_REFLECTION(92,90); +ACE_EXPLOSION_REFLECTION(92,100); +ACE_EXPLOSION_REFLECTION(92,110); +ACE_EXPLOSION_REFLECTION(92,120); +ACE_EXPLOSION_REFLECTION(92,130); +ACE_EXPLOSION_REFLECTION(92,140); +ACE_EXPLOSION_REFLECTION(92,150); +ACE_EXPLOSION_REFLECTION(92,160); +ACE_EXPLOSION_REFLECTION(92,170); +ACE_EXPLOSION_REFLECTION(92,180); +ACE_EXPLOSION_REFLECTION(92,190); +ACE_EXPLOSION_REFLECTION(92,200); +ACE_EXPLOSION_REFLECTION(92,210); +ACE_EXPLOSION_REFLECTION(92,220); +ACE_EXPLOSION_REFLECTION(92,230); +ACE_EXPLOSION_REFLECTION(92,240); +ACE_EXPLOSION_REFLECTION(92,250); +ACE_EXPLOSION_REFLECTION(92,260); +ACE_EXPLOSION_REFLECTION(92,270); +ACE_EXPLOSION_REFLECTION(92,280); +ACE_EXPLOSION_REFLECTION(92,290); +ACE_EXPLOSION_REFLECTION(92,300); +ACE_EXPLOSION_REFLECTION(92,310); +ACE_EXPLOSION_REFLECTION(92,320); +ACE_EXPLOSION_REFLECTION(92,330); +ACE_EXPLOSION_REFLECTION(92,340); +ACE_EXPLOSION_REFLECTION(92,350); +ACE_EXPLOSION_REFLECTION(92,360); +ACE_EXPLOSION_REFLECTION(92,370); +ACE_EXPLOSION_REFLECTION(92,380); +ACE_EXPLOSION_REFLECTION(92,390); +ACE_EXPLOSION_REFLECTION(92,400); +ACE_EXPLOSION_REFLECTION(92,410); +ACE_EXPLOSION_REFLECTION(92,420); +ACE_EXPLOSION_REFLECTION(92,430); +ACE_EXPLOSION_REFLECTION(92,440); +ACE_EXPLOSION_REFLECTION(92,450); +ACE_EXPLOSION_REFLECTION(92,460); +ACE_EXPLOSION_REFLECTION(92,470); +ACE_EXPLOSION_REFLECTION(92,480); +ACE_EXPLOSION_REFLECTION(92,490); +ACE_EXPLOSION_REFLECTION(92,500); +ACE_EXPLOSION_REFLECTION(94,10); +ACE_EXPLOSION_REFLECTION(94,20); +ACE_EXPLOSION_REFLECTION(94,30); +ACE_EXPLOSION_REFLECTION(94,40); +ACE_EXPLOSION_REFLECTION(94,50); +ACE_EXPLOSION_REFLECTION(94,60); +ACE_EXPLOSION_REFLECTION(94,70); +ACE_EXPLOSION_REFLECTION(94,80); +ACE_EXPLOSION_REFLECTION(94,90); +ACE_EXPLOSION_REFLECTION(94,100); +ACE_EXPLOSION_REFLECTION(94,110); +ACE_EXPLOSION_REFLECTION(94,120); +ACE_EXPLOSION_REFLECTION(94,130); +ACE_EXPLOSION_REFLECTION(94,140); +ACE_EXPLOSION_REFLECTION(94,150); +ACE_EXPLOSION_REFLECTION(94,160); +ACE_EXPLOSION_REFLECTION(94,170); +ACE_EXPLOSION_REFLECTION(94,180); +ACE_EXPLOSION_REFLECTION(94,190); +ACE_EXPLOSION_REFLECTION(94,200); +ACE_EXPLOSION_REFLECTION(94,210); +ACE_EXPLOSION_REFLECTION(94,220); +ACE_EXPLOSION_REFLECTION(94,230); +ACE_EXPLOSION_REFLECTION(94,240); +ACE_EXPLOSION_REFLECTION(94,250); +ACE_EXPLOSION_REFLECTION(94,260); +ACE_EXPLOSION_REFLECTION(94,270); +ACE_EXPLOSION_REFLECTION(94,280); +ACE_EXPLOSION_REFLECTION(94,290); +ACE_EXPLOSION_REFLECTION(94,300); +ACE_EXPLOSION_REFLECTION(94,310); +ACE_EXPLOSION_REFLECTION(94,320); +ACE_EXPLOSION_REFLECTION(94,330); +ACE_EXPLOSION_REFLECTION(94,340); +ACE_EXPLOSION_REFLECTION(94,350); +ACE_EXPLOSION_REFLECTION(94,360); +ACE_EXPLOSION_REFLECTION(94,370); +ACE_EXPLOSION_REFLECTION(94,380); +ACE_EXPLOSION_REFLECTION(94,390); +ACE_EXPLOSION_REFLECTION(94,400); +ACE_EXPLOSION_REFLECTION(94,410); +ACE_EXPLOSION_REFLECTION(94,420); +ACE_EXPLOSION_REFLECTION(94,430); +ACE_EXPLOSION_REFLECTION(94,440); +ACE_EXPLOSION_REFLECTION(94,450); +ACE_EXPLOSION_REFLECTION(94,460); +ACE_EXPLOSION_REFLECTION(94,470); +ACE_EXPLOSION_REFLECTION(94,480); +ACE_EXPLOSION_REFLECTION(94,490); +ACE_EXPLOSION_REFLECTION(94,500); +ACE_EXPLOSION_REFLECTION(96,10); +ACE_EXPLOSION_REFLECTION(96,20); +ACE_EXPLOSION_REFLECTION(96,30); +ACE_EXPLOSION_REFLECTION(96,40); +ACE_EXPLOSION_REFLECTION(96,50); +ACE_EXPLOSION_REFLECTION(96,60); +ACE_EXPLOSION_REFLECTION(96,70); +ACE_EXPLOSION_REFLECTION(96,80); +ACE_EXPLOSION_REFLECTION(96,90); +ACE_EXPLOSION_REFLECTION(96,100); +ACE_EXPLOSION_REFLECTION(96,110); +ACE_EXPLOSION_REFLECTION(96,120); +ACE_EXPLOSION_REFLECTION(96,130); +ACE_EXPLOSION_REFLECTION(96,140); +ACE_EXPLOSION_REFLECTION(96,150); +ACE_EXPLOSION_REFLECTION(96,160); +ACE_EXPLOSION_REFLECTION(96,170); +ACE_EXPLOSION_REFLECTION(96,180); +ACE_EXPLOSION_REFLECTION(96,190); +ACE_EXPLOSION_REFLECTION(96,200); +ACE_EXPLOSION_REFLECTION(96,210); +ACE_EXPLOSION_REFLECTION(96,220); +ACE_EXPLOSION_REFLECTION(96,230); +ACE_EXPLOSION_REFLECTION(96,240); +ACE_EXPLOSION_REFLECTION(96,250); +ACE_EXPLOSION_REFLECTION(96,260); +ACE_EXPLOSION_REFLECTION(96,270); +ACE_EXPLOSION_REFLECTION(96,280); +ACE_EXPLOSION_REFLECTION(96,290); +ACE_EXPLOSION_REFLECTION(96,300); +ACE_EXPLOSION_REFLECTION(96,310); +ACE_EXPLOSION_REFLECTION(96,320); +ACE_EXPLOSION_REFLECTION(96,330); +ACE_EXPLOSION_REFLECTION(96,340); +ACE_EXPLOSION_REFLECTION(96,350); +ACE_EXPLOSION_REFLECTION(96,360); +ACE_EXPLOSION_REFLECTION(96,370); +ACE_EXPLOSION_REFLECTION(96,380); +ACE_EXPLOSION_REFLECTION(96,390); +ACE_EXPLOSION_REFLECTION(96,400); +ACE_EXPLOSION_REFLECTION(96,410); +ACE_EXPLOSION_REFLECTION(96,420); +ACE_EXPLOSION_REFLECTION(96,430); +ACE_EXPLOSION_REFLECTION(96,440); +ACE_EXPLOSION_REFLECTION(96,450); +ACE_EXPLOSION_REFLECTION(96,460); +ACE_EXPLOSION_REFLECTION(96,470); +ACE_EXPLOSION_REFLECTION(96,480); +ACE_EXPLOSION_REFLECTION(96,490); +ACE_EXPLOSION_REFLECTION(96,500); +ACE_EXPLOSION_REFLECTION(98,10); +ACE_EXPLOSION_REFLECTION(98,20); +ACE_EXPLOSION_REFLECTION(98,30); +ACE_EXPLOSION_REFLECTION(98,40); +ACE_EXPLOSION_REFLECTION(98,50); +ACE_EXPLOSION_REFLECTION(98,60); +ACE_EXPLOSION_REFLECTION(98,70); +ACE_EXPLOSION_REFLECTION(98,80); +ACE_EXPLOSION_REFLECTION(98,90); +ACE_EXPLOSION_REFLECTION(98,100); +ACE_EXPLOSION_REFLECTION(98,110); +ACE_EXPLOSION_REFLECTION(98,120); +ACE_EXPLOSION_REFLECTION(98,130); +ACE_EXPLOSION_REFLECTION(98,140); +ACE_EXPLOSION_REFLECTION(98,150); +ACE_EXPLOSION_REFLECTION(98,160); +ACE_EXPLOSION_REFLECTION(98,170); +ACE_EXPLOSION_REFLECTION(98,180); +ACE_EXPLOSION_REFLECTION(98,190); +ACE_EXPLOSION_REFLECTION(98,200); +ACE_EXPLOSION_REFLECTION(98,210); +ACE_EXPLOSION_REFLECTION(98,220); +ACE_EXPLOSION_REFLECTION(98,230); +ACE_EXPLOSION_REFLECTION(98,240); +ACE_EXPLOSION_REFLECTION(98,250); +ACE_EXPLOSION_REFLECTION(98,260); +ACE_EXPLOSION_REFLECTION(98,270); +ACE_EXPLOSION_REFLECTION(98,280); +ACE_EXPLOSION_REFLECTION(98,290); +ACE_EXPLOSION_REFLECTION(98,300); +ACE_EXPLOSION_REFLECTION(98,310); +ACE_EXPLOSION_REFLECTION(98,320); +ACE_EXPLOSION_REFLECTION(98,330); +ACE_EXPLOSION_REFLECTION(98,340); +ACE_EXPLOSION_REFLECTION(98,350); +ACE_EXPLOSION_REFLECTION(98,360); +ACE_EXPLOSION_REFLECTION(98,370); +ACE_EXPLOSION_REFLECTION(98,380); +ACE_EXPLOSION_REFLECTION(98,390); +ACE_EXPLOSION_REFLECTION(98,400); +ACE_EXPLOSION_REFLECTION(98,410); +ACE_EXPLOSION_REFLECTION(98,420); +ACE_EXPLOSION_REFLECTION(98,430); +ACE_EXPLOSION_REFLECTION(98,440); +ACE_EXPLOSION_REFLECTION(98,450); +ACE_EXPLOSION_REFLECTION(98,460); +ACE_EXPLOSION_REFLECTION(98,470); +ACE_EXPLOSION_REFLECTION(98,480); +ACE_EXPLOSION_REFLECTION(98,490); +ACE_EXPLOSION_REFLECTION(98,500); +ACE_EXPLOSION_REFLECTION(100,10); +ACE_EXPLOSION_REFLECTION(100,20); +ACE_EXPLOSION_REFLECTION(100,30); +ACE_EXPLOSION_REFLECTION(100,40); +ACE_EXPLOSION_REFLECTION(100,50); +ACE_EXPLOSION_REFLECTION(100,60); +ACE_EXPLOSION_REFLECTION(100,70); +ACE_EXPLOSION_REFLECTION(100,80); +ACE_EXPLOSION_REFLECTION(100,90); +ACE_EXPLOSION_REFLECTION(100,100); +ACE_EXPLOSION_REFLECTION(100,110); +ACE_EXPLOSION_REFLECTION(100,120); +ACE_EXPLOSION_REFLECTION(100,130); +ACE_EXPLOSION_REFLECTION(100,140); +ACE_EXPLOSION_REFLECTION(100,150); +ACE_EXPLOSION_REFLECTION(100,160); +ACE_EXPLOSION_REFLECTION(100,170); +ACE_EXPLOSION_REFLECTION(100,180); +ACE_EXPLOSION_REFLECTION(100,190); +ACE_EXPLOSION_REFLECTION(100,200); +ACE_EXPLOSION_REFLECTION(100,210); +ACE_EXPLOSION_REFLECTION(100,220); +ACE_EXPLOSION_REFLECTION(100,230); +ACE_EXPLOSION_REFLECTION(100,240); +ACE_EXPLOSION_REFLECTION(100,250); +ACE_EXPLOSION_REFLECTION(100,260); +ACE_EXPLOSION_REFLECTION(100,270); +ACE_EXPLOSION_REFLECTION(100,280); +ACE_EXPLOSION_REFLECTION(100,290); +ACE_EXPLOSION_REFLECTION(100,300); +ACE_EXPLOSION_REFLECTION(100,310); +ACE_EXPLOSION_REFLECTION(100,320); +ACE_EXPLOSION_REFLECTION(100,330); +ACE_EXPLOSION_REFLECTION(100,340); +ACE_EXPLOSION_REFLECTION(100,350); +ACE_EXPLOSION_REFLECTION(100,360); +ACE_EXPLOSION_REFLECTION(100,370); +ACE_EXPLOSION_REFLECTION(100,380); +ACE_EXPLOSION_REFLECTION(100,390); +ACE_EXPLOSION_REFLECTION(100,400); +ACE_EXPLOSION_REFLECTION(100,410); +ACE_EXPLOSION_REFLECTION(100,420); +ACE_EXPLOSION_REFLECTION(100,430); +ACE_EXPLOSION_REFLECTION(100,440); +ACE_EXPLOSION_REFLECTION(100,450); +ACE_EXPLOSION_REFLECTION(100,460); +ACE_EXPLOSION_REFLECTION(100,470); +ACE_EXPLOSION_REFLECTION(100,480); +ACE_EXPLOSION_REFLECTION(100,490); +ACE_EXPLOSION_REFLECTION(100,500); + diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf index 6c8d64d1fb..95c921df64 100644 --- a/addons/frag/XEH_postInit.sqf +++ b/addons/frag/XEH_postInit.sqf @@ -1,5 +1,12 @@ #include "script_component.hpp" +if(GVAR(EnableDebugTrace) && !isMultiplayer) then { + GVAR(traceFrags) = true; + GVAR(autoTrace) = true; +}; + if(isServer) then { [QGVAR(frag_eh), { _this call FUNC(frago); }] call ace_common_fnc_addEventHandler; -}; \ No newline at end of file +}; + +[FUNC(masterPFH), 0, []] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/frag/XEH_preInit.sqf b/addons/frag/XEH_preInit.sqf index 906a696ebf..cdd9342ffd 100644 --- a/addons/frag/XEH_preInit.sqf +++ b/addons/frag/XEH_preInit.sqf @@ -6,18 +6,16 @@ PREP(doSpall); PREP(fired); PREP(frago); PREP(spallTrack); -PREP(trackFragRound); GVAR(blackList) = []; GVAR(traceFrags) = false; -GVAR(trackedObjects) = []; GVAR(TOTALFRAGS) = 0; GVAR(spallHPData) = []; GVAR(spallIsTrackingCount) = 0; -GVAR(autoTrace) = true; +GVAR(autoTrace) = false; GVAR(traceID) = -1; GVAR(traces) = []; GVAR(tracesStarted) = false; @@ -32,4 +30,22 @@ PREP(startTracing); PREP(stopTracing); PREP(trackTrace); +// New tracking mechanisms +PREP(masterPFH); +PREP(pfhRound); +PREP(addPfhRound); +PREP(removePfhRound); // THIS SHOULD ABE USED SPARINGLY + +// Explosive Reflection +GVAR(replacedBisArtyWrapper) = true; +PREP(findReflections); +PREP(doExplosions); +PREP(doReflections); + + +GVAR(lastIterationIndex) = 0; +GVAR(objects) = []; +GVAR(objectTypes) = []; +GVAR(arguments) = []; + ADDON = true; diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf new file mode 100644 index 0000000000..1fae55278e --- /dev/null +++ b/addons/frag/functions/fnc_addPfhRound.sqf @@ -0,0 +1,75 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +private ["_enabled","_doFragTrack", "_doSpall", "_spallTrack", "_spallTrackID"]; +PARAMS_3(_gun,_type,_round); + +if (!GVAR(enabled)) exitWith {}; + +//_enabled = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(enabled)); +//if(_enabled < 1) exitWith {}; + +if(_round in GVAR(blackList)) exitWith { + GVAR(blackList) = GVAR(blackList) - [_round]; +}; + +// Exit on max track +if( (count GVAR(objects)) > GVAR(MaxTrack)) exitWith { }; + +_doFragTrack = false; +if(_gun == ACE_player) then { + _doFragTrack = true; +} else { + if((gunner _gun) == ACE_player) then { + _doFragTrack = true; + } else { + if(local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}) then { + _doFragTrack = true; + }; + }; +}; +if(GVAR(SpallEnabled)) then { + if(GVAR(spallIsTrackingCount) <= 0) then { + GVAR(spallHPData) = []; + }; + if(GVAR(spallIsTrackingCount) > 5) then { + // ACE_player sideChat "LIMT!"; + _doSpall = false; + } else { + GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) + 1; + }; +}; +// ACE_player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; + +if(GVAR(autoTrace)) then { + [ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); +}; + +// We only do the single track object check here. +// We should do an {!(_round in GVAR(objects))} +// But we leave that out here for optimization. So this cannot be a framework function +// Otherwise, it should only be added once and from the FiredEH +if(_doFragTrack && alive _round) then { + _spallTrack = []; + _spallTrackID = []; + + private["_args"]; + _args = [_round, (getPosASL _round), (velocity _round), _type, diag_frameno, _gun, _doSpall, _spallTrack, _spallTrackID, + (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip))), + (getNumber (configFile >> "CfgAmmo" >> _type >> "explosive")), + (getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange")), + (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force))), + (getNumber(configFile >> "CfgAmmo" >> _type >> "indirecthit")*(sqrt((getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"))))) + ]; + TRACE_1("Initializing track", _round); + GVAR(objects) pushBack _round; + GVAR(arguments) pushBack _args; + + if(_doSpall) then { + [_round, 1, _spallTrack, _spallTrackID] call FUNC(spallTrack); + }; + // ACE_player sideChat "WTF2"; +}; + + + diff --git a/addons/frag/functions/fnc_addTrack.sqf b/addons/frag/functions/fnc_addTrack.sqf index d4a4272a9c..32dec890c9 100644 --- a/addons/frag/functions/fnc_addTrack.sqf +++ b/addons/frag/functions/fnc_addTrack.sqf @@ -20,4 +20,4 @@ _positions set[(count _positions), [(getPos _obj), _objSpd]]; _data = [_origin, typeOf _origin, typeOf _obj, _objSpd, _positions, _color]; GVAR(traces) set[_index, _data]; -[DFUNC(trackTrace), 0, [_obj, _index, time]] call cba_fnc_addPerFrameHandler; +[DFUNC(trackTrace), 0, [_obj, _index, ACE_time]] call cba_fnc_addPerFrameHandler; diff --git a/addons/frag/functions/fnc_doExplosions.sqf b/addons/frag/functions/fnc_doExplosions.sqf new file mode 100644 index 0000000000..749c4bd2ec --- /dev/null +++ b/addons/frag/functions/fnc_doExplosions.sqf @@ -0,0 +1,26 @@ +//fnc_doExplosions.sqf +#include "script_component.hpp" + +private ["_params", "_explosions", "_index", "_i", "_exp", "_refExp", "_bpos", "_hit", "_distance", "_indirectHitRange", "_depth"]; +_params = _this select 0; +_explosions = _params select 0; +_index = _params select 1; +for "_i" from _index to ((_index+2) min (count _explosions)) do { + _exp = _explosions select _i; + _refExp = _exp select 0; + _bpos = _exp select 1; + _hit = _exp select 2; + _distance = _exp select 3; + _indirectHitRange = _exp select 4; + _depth = _exp select 5; + _refExp createVehicle (ASLtoATL _bpos); + // if(_hit >= 150 && _distance > _indirectHitRange) then { + // [_bpos, _refExp, _depth] call FUNC(doReflections); + // }; +}; +_index = _index + 2; +if(_index >= (count _explosions)) then { + [(_this select 1)] call cba_fnc_removePerFrameHandler; +} else { + _params set[1, _index]; +}; diff --git a/addons/frag/functions/fnc_doReflections.sqf b/addons/frag/functions/fnc_doReflections.sqf new file mode 100644 index 0000000000..911203dc5f --- /dev/null +++ b/addons/frag/functions/fnc_doReflections.sqf @@ -0,0 +1,22 @@ +//fnc_doReflections.sqf +#include "script_component.hpp" + +private ["_pos", "_ammo", "_depth", "_hit", "_range", "_hitFactor", "_indirectHitRange", "_indirectHit", "_testParams"]; + +_pos = _this select 0; +_ammo = _this select 1; +_depth = 1; +if(count _this > 2) then { + _depth = _this select 2; +}; +// TEST_ICONS pushBack [_pos, format["EXP!", _hit, _range, _hitFactor]]; +if(_depth <= 2) then { + _indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"); + _indirectHit = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHit"); + + + + + _testParams = [_pos, [_indirectHitRange, _indirectHit], [], [], -4, _depth, 0]; + [DFUNC(findReflections), 0, _testParams] call cba_fnc_addPerFrameHandler; +}; diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index d2e64dbbfb..1e8e87bcb3 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -1,14 +1,10 @@ //fnc_doSpall.sqf #include "script_component.hpp" -#ifdef DEBUG_MODE_FULL - GVAR(traceFrags) = true; -#endif // ACE_player sideChat "WAAAAAAAAAAAAAAAAAAAAA"; private ["_params", "_hitData", "_initialData", "_hpData", "_object", "_foundObjects", "_index", "_foundObjecsts", "_roundType", "_round", "_caliber", "_explosive", "_idh", "_alive", "_exit", "_vm", "_velocity", "_oldVelocity", "_curVelocity", "_diff", "_polar", "_unitDir", "_spallPos", "_pos1", "_i", "_pos2", "_blah", "_data", "_spallPolar", "_warn", "_c", "_m", "_k", "_gC", "_fragPower", "_fragTypes", "_spread", "_spallCount", "_elev", "_dir", "_vel", "_spallFragVect", "_fragType", "_fragment", "_pos"]; _params = _this select 0; -[(_this select 1)] call cba_fnc_removePerFrameHandler; _hitData = _params select 0; _initialData = GVAR(spallHPData) select (_hitData select 0); _hpData = (_hitData select 1) select (_params select 1); @@ -124,6 +120,7 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; _fragment setPosASL _spallPos; _fragment setVelocity _spallFragVect; + if(GVAR(traceFrags)) then { [ACE_player, _fragment, [1,0.5,0,1]] call FUNC(addTrack); }; @@ -145,6 +142,7 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; _fragment setPosASL _spallPos; _fragment setVelocity _spallFragVect; + if(GVAR(traceFrags)) then { [ACE_player, _fragment, [1,0,0,1]] call FUNC(addTrack); }; diff --git a/addons/frag/functions/fnc_findReflections.sqf b/addons/frag/functions/fnc_findReflections.sqf new file mode 100644 index 0000000000..75c4ee2ae6 --- /dev/null +++ b/addons/frag/functions/fnc_findReflections.sqf @@ -0,0 +1,130 @@ +//fnc_findReflections.sqf +#include "script_component.hpp" + +private ["_split", "_radi", "_params", "_pos", "_explosiveInfo", "_los", "_nlos", "_zIndex", "_depth", "_indirectHitRange", + "_indirectHit", "_distanceCount", "_lastPos", "_test", "_vec", "_testPos", "_buckets", "_excludes", "_bucketIndex", "_bucketPos", + "_bucketList", "_c", "_index", "_blist", "_avgX", "_avgY", "_avgZ", "_bpos", "_distance", "_hitFactor", "_hit", "_range", "_refExp", + "_rand", "_i", "_x", "_res", "_forEachIndex", "_explosions", "_can", "_dirvec"]; + + +_params = _this select 0; +_pos = _params select 0; +_explosiveInfo = _params select 1; +_los = _params select 2; +_nlos = _params select 3; +_zIndex = _params select 4; +_depth = _params select 5; +_rand = _params select 6; + +_split = 15; +_radi = (360/_split*_depth); + +// player sideChat format["p: %1", _explosiveInfo]; +_indirectHitRange = _explosiveInfo select 0; +_indirectHit = _explosiveInfo select 1; +_distanceCount = (floor _indirectHitRange*4) min 100; + +if(_zIndex < 5) then { + _lastPos = _pos; + _zAng = _zIndex*20+2; + if(_zAng > 80) then { + _radi = 1; + _zAng = 90; + }; + for "_i" from 0 to _radi do { + _test = true; + _vec = [1, ((_i*_split)+_rand) mod 360, _zAng] call cba_fnc_polar2vect; + for "_x" from 1 to _distanceCount do { + _testPos = _pos vectorAdd (_vec vectorMultiply _x); + // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + _res = lineIntersectsWith [_pos, _testPos]; + if(count _res > 0) exitWith { + _test = false; + _nlos pushBack _lastPos; + // { + // _x addEventHandler ["HandleDamage", { diag_log text format["this: %1", _this]; }]; + // } forEach _res; + // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + // TEST_PAIRS pushBack [_pos, _lastPos, [1,0,0,1]]; + + }; + // if(terrainIntersectASL [_pos, _testPos]) exitWith {}; + _lastPos = _testPos; + }; + }; + _params set[4, _zIndex+1]; +} else { + _depth = _depth + 1; + _buckets = []; + _excludes = []; + _bucketIndex = 0; + _bucketPos = nil; + _bucketList = nil; + _c = 0; + while { count(_nlos) != count(_excludes) && _c < (count _nlos) } do { + scopeName "mainSearch"; + { + if(!(_forEachIndex in _excludes)) then { + _index = _buckets pushBack [_x, [_x]]; + _excludes pushBack _forEachIndex; + _bucketPos = _x; + _bucketList = (_buckets select _index) select 1; + breakTo "mainSearch"; + }; + } forEach _nlos; + { + if(!(_forEachIndex in _excludes)) then { + _testPos = _x; + if(_testPos vectorDistanceSqr _bucketPos <= 30) then { + _bucketList pushBack _x; + _excludes pushBack _forEachIndex; + }; + }; + } forEach _nlos; + _c = _c + 1; + }; + + // player sideChat format["c: %1", count _buckets]; + _explosions = []; + { + _blist = _x select 1; + _avgX = 0; + _avgY = 0; + _avgZ = 0; + + { + _avgX = _avgX + (_x select 0); + _avgY = _avgY + (_x select 1); + _avgZ = _avgZ + (_x select 2); + } forEach _blist; + _c = count _blist; + _bpos = [_avgX/_c, _avgY/_c, _avgZ/_c]; + + _distance = _pos vectorDistance _bpos; + _hitFactor = 1-(((_distance/(_indirectHitRange*4)) min 1) max 0); + // _hitFactor = 1/(_distance^2); + _hit = _indirectHit*_hitFactor; + _hit = (floor (_hit/4)) min 500; + _hit = _hit - (_hit%10); + _range = (floor (_indirectHitRange-(_distance/4))) min 100; + _range = _range - (_range%2); + + if(_hit >= 10 && _range > 0) then { + // TEST_ICONS pushBack [_bpos, format["h: %1, r: %2, hf: %3 d: %4 ihr: %5", _hit, _range, _hitFactor, _distance, _indirectHitRange*4]]; + // TEST_PAIRS pushBack [_pos, _bpos, [1,0,0,1]]; + _refExp = format["ace_explosion_reflection_%1_%2", _range, _hit]; + // _refExp createVehicle (ASLtoATL _bpos); + // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _bpos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + + _explosions pushBack [_refExp, _bpos, _hit, _distance, _indirectHitRange/4, _depth]; + + }; + if(count _explosions > (_radi*2)/_depth) exitWith {}; + } forEach _buckets; + // _can = "Land_Bricks_V4_F" createVehicle (ASLtoATL _pos); + // _dirvec = _pos vectorFromTo ((ATLtoASL (player modelToWorldVisual (player selectionPosition "Spine3")))); + // _dirvec = _dirvec vectorMultiply 100; + // _can setVelocity _dirvec; + [DFUNC(doExplosions), 0, [_explosions, 0]] call cba_fnc_addPerFrameHandler; + [(_this select 1)] call cba_fnc_removePerFrameHandler; +}; diff --git a/addons/frag/functions/fnc_fired.sqf b/addons/frag/functions/fnc_fired.sqf index 9b89e40897..a7c5577cb9 100644 --- a/addons/frag/functions/fnc_fired.sqf +++ b/addons/frag/functions/fnc_fired.sqf @@ -50,7 +50,7 @@ if(_doFragTrack && alive _round) then { GVAR(trackedObjects) pushBack _round; _spallTrack = []; _spallTrackID = []; - [DFUNC(trackFragRound), 0, [_round, (getPosASL _round), (velocity _round), _type, time, _gun, _doSpall, _spallTrack, _spallTrackID]] call cba_fnc_addPerFrameHandler; + [DFUNC(trackFragRound), 0, [_round, (getPosASL _round), (velocity _round), _type, ACE_time, _gun, _doSpall, _spallTrack, _spallTrackID]] call cba_fnc_addPerFrameHandler; if(_doSpall) then { [_round, 2, _spallTrack, _spallTrackID] call FUNC(spallTrack); }; diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 43eb9d5a67..e8d0f0ffa6 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -8,7 +8,7 @@ if(!isServer) exitWith { }; -// _startTime = diag_tickTime; +// _startTime = ACE_diagTime; private ["_startTime", "_round", "_lastPos", "_lastVel", "_shellType", "_gun", "_fragTypes", "_warn", "_atlPos", "_isArmed", "_fuseDist", "_indirectHitRange", "_fragRange", "_c", "_m", "_k", "_gC", "_fragPower", "_fragPowerRandom", "_manObjects", "_objects", "_crew", "_fragCount", "_fragArcs", "_doRandom", "_boundingBox", "_targetPos", "_distance", "_add", "_bbX", "_bbY", "_bbZ", "_cubic", "_targetVel", "_baseVec", "_dir", "_currentCount", "_count", "_vecVar", "_vec", "_fp", "_vel", "_fragType", "_fragObj", "_randomCount", "_sectorSize", "_sectorOffset", "_i", "_randomDir", "_endTime", "_target"]; @@ -106,8 +106,9 @@ _fragArcs set[360, 0]; ACE_player sideChat format["_fragRange: %1", _fragRange]; ACE_player sideChat format["_objects: %1", _objects]; #endif -_doRandom = false; +_doRandom = true; if(_isArmed && (count _objects) > 0) then { + [_lastPos, _shellType] call FUNC(doReflections); { //if(random(1) > 0.5) then { _target = _x; @@ -162,11 +163,8 @@ if(_isArmed && (count _objects) > 0) then { _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - #ifdef DEBUG_MODE_FULL - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; - GVAR(traceFrags) = true; - #endif if(GVAR(traceFrags)) then { + GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; [ACE_player, _fragObj, [1,0,0,1]] call FUNC(addTrack); }; _fragCount = _fragCount + 1; @@ -180,7 +178,7 @@ if(_isArmed && (count _objects) > 0) then { if(_fragCount > MAX_FRAG_COUNT) exitWith {}; } forEach _objects; if(_fragCount > MAX_FRAG_COUNT) exitWith {}; - _randomCount = (ceil((MAX_FRAG_COUNT-_fragCount)*0.1)) max 0; + _randomCount = ((ceil((MAX_FRAG_COUNT-_fragCount)*0.1)) max 0)+20; _sectorSize = 360 / (_randomCount max 1); // _doRandom = false; if(_doRandom) then { @@ -199,19 +197,18 @@ if(_isArmed && (count _objects) > 0) then { _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - #ifdef DEBUG_MODE_FULL - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; - GVAR(traceFrags) = true; - #endif + if(GVAR(traceFrags)) then { + GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; [ACE_player, _fragObj, [1,0.5,0,1]] call FUNC(addTrack); }; _fragCount = _fragCount + 1; }; }; + }; // #ifdef DEBUG_MODE_FULL // ACE_player sideChat format["total frags: %1", GVAR(TOTALFRAGS)]; // ACE_player sideChat format["tracks: %1", (count GVAR(trackedObjects))]; // #endif -// _endTime = diag_tickTime; +// _endTime = ACE_diagTime; diff --git a/addons/frag/functions/fnc_masterPFH.sqf b/addons/frag/functions/fnc_masterPFH.sqf new file mode 100644 index 0000000000..4e81c4c609 --- /dev/null +++ b/addons/frag/functions/fnc_masterPFH.sqf @@ -0,0 +1,58 @@ +/* + * Author: jaynus + * + * Master single PFH abstraction for all rounds being tracked by frag/spall + * + * Arguments: + * + * + * Return Value: + * None + */ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +//PARAMS_2(_pfhArgs,_handle); + +if (!GVAR(enabled)) exitWith {}; + +private["_gcIndex"]; +_gcIndex = []; + +_iter = 0; +while { (count GVAR(objects)) > 0 && { _iter < GVAR(MaxTrackPerFrame) } } do { + private["_object", "_args"]; + if(GVAR(lastIterationIndex) >= (count GVAR(objects))) then { + GVAR(lastIterationIndex) = 0; + }; + _object = GVAR(objects) select GVAR(lastIterationIndex); + + if(!isNil "_object") then { + if(isNull _object) then { + _gcIndex pushBack GVAR(lastIterationIndex); + } else { + _args = GVAR(arguments) select GVAR(lastIterationIndex); + + if(!(_args call FUNC(pfhRound))) then { + _gcIndex pushBack GVAR(lastIterationIndex); // Add it to the GC if it returns false + }; + // If its not alive anymore, remove it from the queue, it already ran once on dead + if(!alive _object) then { + _gcIndex pushBack GVAR(lastIterationIndex); + }; + }; + }; + _iter = _iter + 1; + GVAR(lastIterationIndex) = GVAR(lastIterationIndex) + 1; +}; + +// clean up dead object references +private["_deletionCount", "_deleteIndex"]; +_deletionCount = 0; +{ + TRACE_1("GC Projectile", _x); + _deleteIndex = _x - _deletionCount; + GVAR(objects) deleteAt _deleteIndex; + GVAR(arguments) deleteAt _deleteIndex; + + _deletionCount = _deletionCount + 1; +} forEach _gcIndex; \ No newline at end of file diff --git a/addons/frag/functions/fnc_pfhRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf new file mode 100644 index 0000000000..2c0d8944e7 --- /dev/null +++ b/addons/frag/functions/fnc_pfhRound.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +private ["_round", "_lastPos", "_lastVel", "_type", "_firedFrame", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; +_round = _this select 0; +_lastPos = _this select 1; +_lastVel = _this select 2; +_type = _this select 3; +_firedFrame = _this select 4; +_doSpall = _this select 6; +_spallTrack = _this select 7; +_foundObjectHPIds = _this select 8; +_skip = _this select 9; +_explosive = _this select 10; +_indirectRange = _this select 11; +_force = _this select 12; +_fragPower = _this select 13; + +if(_round in GVAR(blackList)) exitWith { + false +}; + +if (!alive _round) then { + if((diag_frameno - _firedFrame) > 1) then { + if(_skip == 0) then { + if((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1} ) then { + [QGVAR(frag_eh), _this] call ace_common_fnc_serverEvent; + }; + }; + }; + if(_doSpall) then { + GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) - 1; + // diag_log text format["F: %1", _foundObjectHPIds]; + { + if(!isNil "_x") then { + _x removeEventHandler ["hitPart", _foundObjectHPIds select _forEachIndex]; + }; + } forEach _spallTrack; + }; +} else { + + _params set[1, (getPosASL _round)]; + _params set[2, (velocity _round)]; + if(_doSpall) then { + private["_scale"]; + _scale = ( (count GVAR(objects)) / GVAR(MaxTrackPerFrame) ) max 0.1; + [_round, _scale, _spallTrack, _foundObjectHPIds] call FUNC(spallTrack); + }; +}; + +true \ No newline at end of file diff --git a/addons/frag/functions/fnc_removePfhRound.sqf b/addons/frag/functions/fnc_removePfhRound.sqf new file mode 100644 index 0000000000..7fe3994d55 --- /dev/null +++ b/addons/frag/functions/fnc_removePfhRound.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +// THIS FUNCTION SHOULD NOT BE USED BECAUSE IT CAUSES AN SEARCH AND REBUILD + +if(_round in GVAR(blackList)) then { + GVAR(blackList) = GVAR(blackList) - [_round]; +}; + +GVAR(objects) = GVAR(objects) - [_round]; \ No newline at end of file diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf index 4b7a06bc65..afe4bc1931 100644 --- a/addons/frag/functions/fnc_spallTrack.sqf +++ b/addons/frag/functions/fnc_spallTrack.sqf @@ -22,7 +22,7 @@ if (count _intersectsWith > 0) then { if(!(_x in _foundObjects)) then { // diag_log text format["Adding HP: %1", _x]; _index = (count GVAR(spallHPData)); - _hpId = _x addEventHandler ["hitPart", format["[%1, _this] call " + QUOTE(FUNC(spallHP)), _index]]; + _hpId = _x addEventHandler ["hitPart", compile format["[%1, _this] call " + QUOTE(FUNC(spallHP)), _index]]; _foundObjects set[(count _foundObjects), _x]; _foundObjectHPIds set[(count _foundObjectHPIds), _hpId]; _data = [_hpId, _x, typeOf _round, _round, _curPos, _velocity, 0, _foundObjects, _foundObjectHPIds]; diff --git a/addons/frag/functions/fnc_trackFragRound.sqf b/addons/frag/functions/fnc_trackFragRound.sqf index 8db68c99e8..e6a24f62bd 100644 --- a/addons/frag/functions/fnc_trackFragRound.sqf +++ b/addons/frag/functions/fnc_trackFragRound.sqf @@ -13,7 +13,7 @@ _foundObjectHPIds = _params select 8; if (!alive _round) then { [_this select 1] call cba_fnc_removePerFrameHandler; - if(_time != time && {_round in GVAR(trackedObjects)} && {!(_round in GVAR(blackList))}) then { + if(_time != ACE_time && {_round in GVAR(trackedObjects)} && {!(_round in GVAR(blackList))}) then { GVAR(trackedObjects) = GVAR(trackedObjects) - [_round]; _skip = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip)); if(_skip == 0) then { diff --git a/addons/frag/script_component.hpp b/addons/frag/script_component.hpp index 3740ed23fa..78e13c7863 100644 --- a/addons/frag/script_component.hpp +++ b/addons/frag/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT frag -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" //#define DEBUG_ENABLED_FRAG @@ -11,6 +11,6 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_FRAG #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" #define ACE_TRACE_DRAW_INC 1 \ No newline at end of file diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index e7ebb7c1bf..9fdb89ba87 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -1,17 +1,84 @@  - - Disable Fragmentation - Keine Schrapnelle - Zakázat fragmentaci granátů - Desactivar fragmentación - Wyłącz fragmentację odłamków - Выключить разлёт осколков - Désactive la fragmentation - Repeszek letiltása - Disattiva la frammentazione - Desabilitar Fragmentação + + Fragmentation Simulation + Symulacja fragmentacji + Simulación de fragmentación + Splittersimulation + Simulace fragmentace + Simulação de fragmentação + + + Enable the ACE Fragmentation Simulation + Activa la simulación de fragmentación ACE + Aktywuje symulację fragmentacji ACE + Aktiviere die ACE-Splittersimulation + Povolit ACE simulaci fragmentace + Ativa a simulação de fragmentação do ACE + + + Spalling Simulation + Simulación de astillamiento + Symulacja odprysków + Explosionssimulation + Simulace úlomků + Simulação de estilhaços + + + Enable the ACE Spalling Simulation + Activa la simulación de astillamiento ACE + Aktywuje symulację odprysków ACE + Aktiviere ACE-Explosionssimulation + Povolit ACE simulaci úlomků + Ativa a simulação de estilhaços do ACE + + + Maximum Projectiles Tracked + Máximos proyectiles rastreados + Maks. liczba śledzonych pocisków + Maximalzahl der verfolgten Projektile + Maximální počet sledovaných projektilů + Máximo de projéteis rastreados + + + This setting controls the maximum amount of projectiles the fragmentation and spalling system will track at any given time. If more projectiles are fired, they will not be tracked. Lower this setting if you do not want FPS drops at high-count projectile scenarios ( >200 rounds in the air at once) + Este ajuste controla la cantidad máxima de proyectiles del sistema de fragmentación y astillamiento de los que se hará un seguimiento en cualquier momento dado. Si se disparan más proyectiles, no serán rastreados. Baja esta opción si no deseas una bajada de FPS en escenarios con muchos proyectiles (>200 proyectiles en el aire a la vez) + To ustawienie kontroluje maksymalną ilość pocisków, jakie fragmentacja i odpryski symulują w danym momencie. Jeżeli więcej pocisków będzie wystrzelonych, wtedy nie będą one śledzone. Zmniejsz tą opcję jeżeli nie chcesz odczuwać spadków FPS podczas ciężkiej wymiany ognia (więcej niż 200 pocisków w powietrzu na raz). + Diese Einstellung steuert die maximale Anzahl an Projektilen, die das Splitter- und Explosionssystem gleichzeitig verfolgen wird. Wenn mehr Projektile abgefeuert werden, werden sie nicht verfolgt werden. Diese Einstellung zu verringern, kann FPS-Einbrüche bei Szenarien mit vielen Projektilen verhindern (>200 Objekte gleichzeitig in der Luft) + Toto nastavení kontroluje maximální množství projektilů z fragmentace a úlomků, která jsou sledována v dané době. Pokud je vystřeleno více projektilů, tak nebudou sledovány. Snižte toto nastavení pokud si nepřejete propady FPS v situacích, kde je velké množství projektilů ( >200 nábojů najednou ve vzduchu) + Esta definição controla a quantidade máxima de projéteis que o sistema de fragmentação e estilhaçamento irá acompanhar em qualquer momento. Se mais projéteis são disparados, eles não serão rastreados. Diminua essa configuração se você não quiser que o FPS caia em cenários com alta contagem de projéteis (> 200 projéteis no ar ao mesmo tempo) + + + Maximum Projectiles Per Frame + Máximos proyectiles por cuadro + Maximale Anzahl an Projektilen pro Frame + Maks. liczba pocisków na klatkę + Maximální počet projektilů ze jeden snímek + Projéteis máximos por quadro + + + The number of spall track calculations to perform in any given frame. This helps spread the FPS impact of tracking spall rounds across multiple frames, limiting its impact even further. + Ilość obliczeń wykonywanych przez symulację odprysków w danej klatce. Ta opcja pomaga rozprzestrzenić obliczenia odprysków na więcej klatek, zmniejszając spadek FPS jeszcze bardziej. + Gibt die Anzahl der Explosionverfolgungsberechnungen an, die gleichzeitig ausgeführt werden. Das kann dabei helfen den FPS-Einfluss abzuschwächen, wenn Teile über mehrere Frames hinweg verfolgt werden. + El número de cálculos de esquirlas que se hará en cualquier cuadro. Esto ayuda a dispersar el impacto en FPS del seguimiento de esquirlas de balas a través de múltiples cuadros, lo que limita aún más su impacto. + Počet úlomků v daném snímku. Toto pomáhá rozšířit FPS dopad sledovaného úlomku napříč více snímky, omezuje jeho vliv ještě více. + O número de cálculos por estilhaço rastreado para executar em qualquer quadro. Isso ajuda a distribuir o impacto no FPS do rastreamento de estilhaço em vários quadros, o que limita o seu impacto ainda mais. + + + (SP Only) Frag/Spall Debug Tracing + (Solo SP) Seguimiento de depuración de Fragmentación/Astillamiento + (Tylko SP) Wizualny debug odł./odpr. + (Pouze SP) Debug sledování Frag/Úlomků + (Somente SP) Depuração de fragmentação e estilhaços traçantes + + + (SP Only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only. + (Solo SP) Requiere un reinicio misión/editor. Permite el seguimiento visual de la fragmentación y astillamientos de los proyectiles en modo SP. + (Tylko SP) Wymaga restartu misji/edytora. Aktywuje wizualne śledzenie odłamków oraz odprysków w trybie gry Single Player. + (nur SP) Splitter-/Explosions-Debugging + (Pouze SP) Vyžaduje restart mise/editoru. Aktivuje vizuální stopování fragmentace a úlomů pouze v režimu jednoho hráče. + (Somente SP) Requer um reinício de missão / editor. Habilita o rastreamento visual de projéteis de fragmentação e estilhaçamento apenas no modo de jogo SP. - + \ No newline at end of file diff --git a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf index 29a4859651..a4cb047629 100644 --- a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf +++ b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf @@ -17,16 +17,16 @@ private ["_interval", "_player", "_newVel", "_accel", "_currentGForce", "_averag EXPLODE_2_PVT(_this,_params,_pfhId); -_interval = time - GVAR(lastUpdateTime); +_interval = ACE_time - GVAR(lastUpdateTime); -// Update the g-forces at constant game time intervals +// Update the g-forces at constant game ACE_time intervals if (_interval < INTERVAL) exitWith {}; if (isNull ACE_player) exitWith {}; if !(alive ACE_player) exitWith {}; -GVAR(lastUpdateTime) = time; +GVAR(lastUpdateTime) = ACE_time; /*if !(vehicle ACE_player isKindOf "Air") exitWith { GVAR(GForces) = []; diff --git a/addons/gforces/script_component.hpp b/addons/gforces/script_component.hpp index cf665c21ec..ab3289842d 100644 --- a/addons/gforces/script_component.hpp +++ b/addons/gforces/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT gforces -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_GFORCES #define DEBUG_MODE_FULL @@ -9,7 +9,7 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_GFORCES #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" #define AVERAGEDURATION 6 #define INTERVAL 0.20 diff --git a/addons/goggles/ACE_Settings.hpp b/addons/goggles/ACE_Settings.hpp index e25da3c274..6b3faa1823 100644 --- a/addons/goggles/ACE_Settings.hpp +++ b/addons/goggles/ACE_Settings.hpp @@ -3,6 +3,6 @@ class ACE_Settings { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Goggles_ShowInThirdPerson"; + displayName = CSTRING(ShowInThirdPerson); }; }; diff --git a/addons/goggles/XEH_postInit.sqf b/addons/goggles/XEH_postInit.sqf index a6fe7c415f..088ccc477a 100644 --- a/addons/goggles/XEH_postInit.sqf +++ b/addons/goggles/XEH_postInit.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" if (!hasInterface) exitWith {}; -["ACE3 Common", QGVAR(wipeGlasses), localize "STR_ACE_Goggles_WipeGlasses", +["ACE3 Common", QGVAR(wipeGlasses), localize LSTRING(WipeGlasses), { if (!(GETVAR(ace_player,ACE_isUnconscious,false))) exitWith { call FUNC(clearGlasses); @@ -47,6 +47,8 @@ GVAR(DustHandler) = -1; GVAR(RainDrops) = objNull; GVAR(RainActive) = false; GVAR(RainLastLevel) = 0; +GVAR(surfaceCache) = ""; +GVAR(surfaceCacheIsDust) = false; FUNC(CheckGlasses) = { if (GVAR(Current) != (goggles ace_player)) then { diff --git a/addons/goggles/functions/fnc_applyDust.sqf b/addons/goggles/functions/fnc_applyDust.sqf index 197b50b30d..17824253ff 100644 --- a/addons/goggles/functions/fnc_applyDust.sqf +++ b/addons/goggles/functions/fnc_applyDust.sqf @@ -38,7 +38,7 @@ if (GVAR(DustHandler) != -1) then { // should be fixed in dev CBA GVAR(DustHandler) = -1; }; GVAR(DustHandler) = [{ - if (diag_tickTime >= GETDUSTT(DTIME) + 3) then { + if (ACE_diagTime >= GETDUSTT(DTIME) + 3) then { SETDUST(DAMOUNT,CLAMP(GETDUSTT(DAMOUNT)-1,0,2)); private "_amount"; _amount = 1 - (GETDUSTT(DAMOUNT) * 0.125); diff --git a/addons/goggles/functions/fnc_dustHandler.sqf b/addons/goggles/functions/fnc_dustHandler.sqf index 9624fc21b3..44475d1acc 100644 --- a/addons/goggles/functions/fnc_dustHandler.sqf +++ b/addons/goggles/functions/fnc_dustHandler.sqf @@ -15,7 +15,7 @@ * Public: No */ #include "script_component.hpp" -private ["_bullets", "_position", "_surface", "_found", "_weapon", "_cloudType", "_unit"]; +private ["_bullets", "_position", "_surface", "_weapon", "_cloudType", "_unit"]; EXPLODE_2_PVT(_this,_unit,_weapon); if (_unit != ace_player) exitWith {true}; _cloudType = ""; @@ -39,22 +39,24 @@ if (surfaceIsWater _position) exitWith {}; if ((_position select 2) > 0.2) exitWith {}; _surface = surfaceType _position; -_surface = ([_surface, "#"] call CBA_fnc_split) select 1; -_found = false; -_found = getNumber (ConfigFile >> "CfgSurfaces" >> _surface >> "dust") >= 0.1; +if (_surface != GVAR(surfaceCache)) then { + GVAR(surfaceCache) = _surface; + _surface = ([_surface, "#"] call CBA_fnc_split) select 1; + GVAR(surfaceCacheIsDust) = getNumber (ConfigFile >> "CfgSurfaces" >> _surface >> "dust") >= 0.1; +}; -if (!_found) exitWith {}; +if (!GVAR(surfaceCacheIsDust)) exitWith {}; _bullets = GETDUSTT(DBULLETS); -if ((diag_tickTime - GETDUSTT(DTIME)) > 1) then { +if ((ACE_diagTime - GETDUSTT(DTIME)) > 1) then { _bullets = 0; }; _bullets = _bullets + 1; SETDUST(DBULLETS,_bullets); -SETDUST(DTIME,diag_tickTime); +SETDUST(DTIME,ACE_diagTime); if (GETDUSTT(DAMOUNT) < 2) then { private "_bulletsRequired"; diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 0c74f33940..61f20eb935 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -3,6 +3,7 @@ class CfgAmmo { class FlareBase: FlareCore { intensity = 20000; flareSize = 12; + timeToLive = 60; }; class F_40mm_White: FlareBase { intensity = 40000; @@ -10,7 +11,7 @@ class CfgAmmo { }; class F_20mm_White: FlareBase { intensity = 20000; - flareSize = 12; + flareSize = 6; }; class F_Signal_Green: FlareBase { intensity = 20000; @@ -19,6 +20,7 @@ class CfgAmmo { class Flare_82mm_AMOS_White: FlareCore { intensity = 80000; flareSize = 12; + timeToLive = 60; }; class F_20mm_Red: F_20mm_White {}; diff --git a/addons/grenades/CfgMagazines.hpp b/addons/grenades/CfgMagazines.hpp index 23eb4cb759..31e80dc545 100644 --- a/addons/grenades/CfgMagazines.hpp +++ b/addons/grenades/CfgMagazines.hpp @@ -9,50 +9,50 @@ class CfgMagazines { initSpeed = 22; }; class ACE_HandFlare_White: ACE_HandFlare_Base { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; ammo = "ACE_F_Hand_White"; - displayname = "$STR_ACE_Grenades_M127A1_White_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_White_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_White_NameShort"; + displayname = CSTRING(M127A1_White_Name); + descriptionshort = CSTRING(M127A1_White_Description); + displayNameShort = CSTRING(M127A1_White_NameShort); model = "\A3\weapons_f\ammo\flare_white"; picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa"; }; class ACE_HandFlare_Red: ACE_HandFlare_Base { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; ammo = "ACE_F_Hand_Red"; - displayname = "$STR_ACE_Grenades_M127A1_Red_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_Red_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_Red_NameShort"; + displayname = CSTRING(M127A1_Red_Name); + descriptionshort = CSTRING(M127A1_Red_Description); + displayNameShort = CSTRING(M127A1_Red_NameShort); model = "\A3\weapons_f\ammo\flare_red"; picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa"; }; class ACE_HandFlare_Green: ACE_HandFlare_Base { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; ammo = "ACE_F_Hand_Green"; - displayname = "$STR_ACE_Grenades_M127A1_Green_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_Green_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_Green_NameShort"; + displayname = CSTRING(M127A1_Green_Name); + descriptionshort = CSTRING(M127A1_Green_Description); + displayNameShort = CSTRING(M127A1_Green_NameShort); model = "\A3\weapons_f\ammo\flare_green"; picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa"; }; class ACE_HandFlare_Yellow: ACE_HandFlare_Base { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; ammo = "ACE_F_Hand_Yellow"; - displayname = "$STR_ACE_Grenades_M127A1_Yellow_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_Yellow_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_Yellow_NameShort"; + displayname = CSTRING(M127A1_Yellow_Name); + descriptionshort = CSTRING(M127A1_Yellow_Description); + displayNameShort = CSTRING(M127A1_Yellow_NameShort); model = "\A3\weapons_f\ammo\flare_yellow"; picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa"; }; class ACE_M84: HandGrenade { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "ACE_G_M84"; - displayname = "$STR_ACE_Grenades_M84_Name"; - descriptionshort = "$STR_ACE_Grenades_M84_Description"; + displayname = CSTRING(M84_Name); + descriptionshort = CSTRING(M84_Description); displayNameShort = "M84"; mass = 4; model = PATHTOF(models\ACE_m84.p3d); @@ -61,12 +61,12 @@ class CfgMagazines { class 3Rnd_UGL_FlareGreen_F; class 6Rnd_GreenSignal_F: 3Rnd_UGL_FlareGreen_F { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "F_40mm_Green"; initSpeed = 120; }; class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); ammo = "F_40mm_Red"; initSpeed = 120; }; diff --git a/addons/grenades/XEH_postInit.sqf b/addons/grenades/XEH_postInit.sqf index 63516407f3..b1559c6cfe 100644 --- a/addons/grenades/XEH_postInit.sqf +++ b/addons/grenades/XEH_postInit.sqf @@ -10,7 +10,7 @@ GVAR(flashbangPPEffectCC) = ppEffectCreate ["ColorCorrections", 4265]; GVAR(flashbangPPEffectCC) ppEffectForceInNVG true; // Add keybinds -["ACE3 Weapons", QGVAR(switchGrenadeMode), localize "STR_ACE_Grenades_SwitchGrenadeMode", +["ACE3 Weapons", QGVAR(switchGrenadeMode), localize LSTRING(SwitchGrenadeMode), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 9be24bcc47..50dc7cd288 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -103,7 +103,7 @@ _affected = _grenade nearEntities ["CAManBase", 20]; GVAR(flashbangPPEffectCC) ppEffectAdjust [1,1,(0.8 + _strength) min 1,[1,1,1,0],[0,0,0,1],[0,0,0,0]]; GVAR(flashbangPPEffectCC) ppEffectCommit 0.01; - //PARTIALRECOVERY - start decreasing effect over time + //PARTIALRECOVERY - start decreasing effect over ACE_time [{ PARAMS_1(_strength); GVAR(flashbangPPEffectCC) ppEffectAdjust [1,1,0,[1,1,1,0],[0,0,0,1],[0,0,0,0]]; diff --git a/addons/grenades/functions/fnc_nextMode.sqf b/addons/grenades/functions/fnc_nextMode.sqf index 7663e790f6..913906b8f8 100644 --- a/addons/grenades/functions/fnc_nextMode.sqf +++ b/addons/grenades/functions/fnc_nextMode.sqf @@ -31,11 +31,11 @@ if (_mode == 3) then { }; _hint = [ -localize "STR_ACE_Grenades_NormalThrow", -localize "STR_ACE_Grenades_HighThrow", -localize "STR_ACE_Grenades_PreciseThrow", -localize "STR_ACE_Grenades_RollGrenade", -localize "STR_ACE_Grenades_DropGrenade" +localize LSTRING(NormalThrow), +localize LSTRING(HighThrow), +localize LSTRING(PreciseThrow), +localize LSTRING(RollGrenade), +localize LSTRING(DropGrenade) ] select _mode; [_hint] call EFUNC(common,displayTextStructured); diff --git a/addons/hearing/ACE_Settings.hpp b/addons/hearing/ACE_Settings.hpp index a196b4affc..c0f69dda65 100644 --- a/addons/hearing/ACE_Settings.hpp +++ b/addons/hearing/ACE_Settings.hpp @@ -15,6 +15,6 @@ class ACE_Settings { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Hearing_DisableEarRinging"; + displayName = CSTRING(DisableEarRinging); }; }; diff --git a/addons/hearing/CfgSounds.hpp b/addons/hearing/CfgSounds.hpp index ac64f42c4e..2d757041be 100644 --- a/addons/hearing/CfgSounds.hpp +++ b/addons/hearing/CfgSounds.hpp @@ -11,4 +11,12 @@ class CfgSounds { sound[] = {QUOTE(PATHTOF(sounds\ACE_earringing_heavy.wav)),8,1.7}; titles[] = {}; }; + class ACE_Combat_Deafness { + sound[] = {QUOTE(PATHTOF(sounds\deafness.ogg)),3,1}; + titles[] = {}; + }; + class ACE_Ring_Backblast { + sound[] = {QUOTE(PATHTOF(sounds\backblast_ring.ogg)),1,1}; + titles[] = {}; + }; }; diff --git a/addons/hearing/CfgVehicles.hpp b/addons/hearing/CfgVehicles.hpp index 16bb47014a..1cf06910b0 100644 --- a/addons/hearing/CfgVehicles.hpp +++ b/addons/hearing/CfgVehicles.hpp @@ -4,9 +4,9 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class ACE_PutInEarplugs { - displayName = "$STR_ACE_Hearing_EarPlugs_On"; + displayName = CSTRING(EarPlugs_On); condition = QUOTE( !([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarPlugs' in items _player} ); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE( [_player] call FUNC(putInEarPlugs) ); showDisabled = 0; priority = 2.5; @@ -14,9 +14,9 @@ class CfgVehicles { hotkey = "E"; }; class ACE_RemoveEarplugs { - displayName = "$STR_ACE_Hearing_EarPlugs_Off"; + displayName = CSTRING(EarPlugs_Off); condition = QUOTE( [_player] call FUNC(hasEarPlugsIn) ); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE( [_player] call FUNC(removeEarPlugs) ); showDisabled = 0; priority = 2.5; @@ -93,26 +93,25 @@ class CfgVehicles { }; }; - - class Module_F; - class ACE_ModuleHearing: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class ACE_ModuleHearing: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Hearing_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QFUNC(moduleHearing); scope = 2; isGlobal = 1; icon = PATHTOF(UI\Icon_Module_Hearing_ca.paa); class Arguments { class EnableCombatDeafness { - displayName = "$STR_ACE_Hearing_CombatDeafness_DisplayName"; - description = "$STR_ACE_Hearing_CombatDeafness_Description"; + displayName = CSTRING(CombatDeafness_DisplayName); + description = CSTRING(CombatDeafness_Description); typeName = "BOOL"; defaultValue = 1; }; }; class ModuleDescription { - description = "$STR_ACE_Hearing_Module_Description"; + description = CSTRING(Module_Description); }; }; }; diff --git a/addons/hearing/CfgWeapons.hpp b/addons/hearing/CfgWeapons.hpp index e70cc62c25..11ad91f658 100644 --- a/addons/hearing/CfgWeapons.hpp +++ b/addons/hearing/CfgWeapons.hpp @@ -3,8 +3,8 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_EarPlugs: ACE_ItemCore { - displayName = "$STR_ACE_Hearing_EarPlugs_Name"; - descriptionShort = "$STR_ACE_Hearing_EarPlugs_Description"; + displayName = CSTRING(EarPlugs_Name); + descriptionShort = CSTRING(EarPlugs_Description); model = PATHTOF(ACE_earplugs.p3d); picture = PATHTOF(UI\ACE_earplugs_x_ca.paa); scope = 2; diff --git a/addons/hearing/XEH_postInit.sqf b/addons/hearing/XEH_postInit.sqf index 7b584f8397..ad7fddcd98 100644 --- a/addons/hearing/XEH_postInit.sqf +++ b/addons/hearing/XEH_postInit.sqf @@ -6,9 +6,30 @@ GVAR(currentDeafness) = 0; GVAR(newStrength) = 0; GVAR(playerVehAttenuation) = 1; +GVAR(beep) = false; +GVAR(beep2) = false; +GVAR(time2) = 0; +GVAR(time3) = 0; +GVAR(time4) = 0; +GVAR(earRingingPFH) = -1; + // Spawn volume updating process [FUNC(updateVolume), 0.1, [] ] call CBA_fnc_addPerFrameHandler; //Update veh attunation when player veh changes ["playerVehicleChanged", {_this call FUNC(updatePlayerVehAttenuation);}] call EFUNC(common,addEventHandler); ["playerTurretChanged", {_this call FUNC(updatePlayerVehAttenuation);}] call EFUNC(common,addEventHandler); + +//Reset deafness on respawn (or remote control player switch) +["playerChanged", { + ACE_player setVariable [QGVAR(dv), 0]; + ACE_player setVariable [QGVAR(prior), 0]; + ACE_player setvariable [QGVAR(deaf), false]; + GVAR(beep) = false; + GVAR(beep2) = false; + GVAR(time2) = 0; + GVAR(time3) = 0; + GVAR(time4) = 0; + GVAR(currentDeafness) = 0; + GVAR(newStrength) = 0; +}] call EFUNC(common,addEventhandler); diff --git a/addons/hearing/config.cpp b/addons/hearing/config.cpp index 777c44dd8f..1007b2095d 100644 --- a/addons/hearing/config.cpp +++ b/addons/hearing/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {"ACE_EarPlugs"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; - author[] = {"KoffeinFlummi", "esteldunedain", "HopeJ", "commy2"}; + author[] = {"KoffeinFlummi", "esteldunedain", "HopeJ", "commy2", "Rocko", "Rommel", "Ruthberg"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; }; diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf index 2460e0fd5c..96482f5b79 100644 --- a/addons/hearing/functions/fnc_earRinging.sqf +++ b/addons/hearing/functions/fnc_earRinging.sqf @@ -1,56 +1,92 @@ /* - * Author: KoffeinFlummi, commy2 - * Creates ear ringing effect with set strength. + * Author: KoffeinFlummi, commy2, Rocko, Rommel, Ruthberg + * Ear ringing PFH * * Arguments: - * 0: Unit (player) + * 0: unit * 1: strength of ear ringing (Number between 0 and 1) * * Return Value: * None * * Example: - * [clientExplosionEvent] call ace_hearing_fnc_earRinging + * [_unit, _strength] call ace_hearing_fnc_earRinging * * Public: No */ #include "script_component.hpp" -private ["_unit", "_strength"]; +if (GVAR(DisableEarRinging)) exitWith {}; -_unit = _this select 0; -_strength = _this select 1; +PARAMS_2(_unit,_strength); + +if (isNull _unit) exitWith {}; +if (_strength < 0.05) exitWith {}; if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { _strength = _strength / 4; }; -GVAR(newStrength) = GVAR(newStrength) max _strength; +_unit setVariable [QGVAR(dv), (_unit getVariable [QGVAR(dv), 0]) + _strength]; -if (missionNamespace getVariable [QGVAR(isEarRingingPlaying), false]) exitWith {}; +if (GVAR(earRingingPFH) != -1) exitWith {}; +GVAR(earRingingPFH) = [{ + EXPLODE_1_PVT(_this select 0,_unit); + private ["_prior"]; + _prior = (_unit getvariable [QGVAR(dv), 0]) min 20; + + if (!alive _unit || _prior <= 0) exitWith { + _unit setVariable [QGVAR(dv), 0]; + _unit setVariable [QGVAR(prior), 0]; + GVAR(beep) = false; + GVAR(beep2) = false; + GVAR(time2) = 0; + GVAR(time3) = 0; + GVAR(time4) = 0; + GVAR(earRingingPFH) = -1; + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + if (((_unit getvariable [QGVAR(dv), 0]) - (_unit getvariable [QGVAR(prior), 0])) > 2) then { + if (ACE_time > GVAR(time3)) then { + GVAR(beep2) = false; + }; + if (!GVAR(beep2)) then { + playSound "ACE_Combat_Deafness"; + GVAR(beep2) = true; + GVAR(time3) = ACE_time + 5; + }; + }; + + _unit setvariable [QGVAR(prior), _prior]; + GVAR(volume) = (1 - (_prior / 20)) max 0; + + if (_prior > 19.75) then { + _unit setvariable [QGVAR(deaf), true]; + } else { + _unit setvariable [QGVAR(deaf), false]; + }; + + if ((_unit getvariable [QGVAR(deaf), false]) && {ACE_time > GVAR(time4)}) then { + playSound "ACE_Combat_Deafness"; + GVAR(beep2) = true; + GVAR(time3) = ACE_time + 10; + GVAR(time4) = ACE_time + 30; + }; -if (GVAR(DisableEarRinging)) exitWith {}; - -if (_strength > 0.75) exitWith { - playSound "ACE_EarRinging_Heavy"; - GVAR(isEarRingingPlaying) = true; - [ - {GVAR(isEarRingingPlaying) = false;}, [], 7.0, 0.25 - ] call EFUNC(common,waitAndExecute); -}; -if (_strength > 0.5) exitWith { - playSound "ACE_EarRinging_Medium"; - GVAR(isEarRingingPlaying) = true; - [ - {GVAR(isEarRingingPlaying) = false;}, [], 5.0, 0.25 - ] call EFUNC(common,waitAndExecute); -}; -if (_strength > 0.2) exitWith { - playSound "ACE_EarRinging_Weak"; - GVAR(isEarRingingPlaying) = true; - GVAR(isEarRingingPlaying) = true; - [ - {GVAR(isEarRingingPlaying) = false;}, [], 3.0, 0.25 - ] call EFUNC(common,waitAndExecute); -}; + // Hearing takes longer to return to normal after it hits rock bottom + _unit setvariable [QGVAR(dv), _prior - (0.5 * (GVAR(volume) max 0.1))]; + + if (_prior > 10) then { + //check if the ringing is already being played + if (ACE_time > GVAR(time2)) then { + GVAR(beep) = false; + }; + if (!GVAR(beep)) then { + playSound "ACE_Ring_Backblast"; + GVAR(time2) = ACE_time + 22; + GVAR(beep) = true; + }; + }; +}, 1, [_unit]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/hearing/functions/fnc_explosionNear.sqf b/addons/hearing/functions/fnc_explosionNear.sqf index b213a1304a..cb9202618f 100644 --- a/addons/hearing/functions/fnc_explosionNear.sqf +++ b/addons/hearing/functions/fnc_explosionNear.sqf @@ -1,5 +1,5 @@ /* - * Author: KoffeinFlummi, commy2 + * Author: KoffeinFlummi, commy2, Ruthberg * Handles deafness due to explosions going off near the player. * * Arguments: @@ -16,12 +16,10 @@ */ #include "script_component.hpp" -private ["_unit", "_damage", "_strength"]; +PARAMS_2(_unit,_damage); -_unit = _this select 0; -_damage = _this select 1; - -_strength = (_damage * 2) min 1; +private ["_strength"]; +_strength = 0 max _damage; if (_strength < 0.01) exitWith {}; [{_this call FUNC(earRinging)}, [_unit, _strength], 0.2, 0] call EFUNC(common,waitAndExecute); diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index b456b3b872..4164f81b33 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -21,7 +21,7 @@ */ #include "script_component.hpp" -private ["_silencer", "_audibleFireCoef", "_audibleFire", "_loudness", "_strength", "_vehAttenuation"]; +private ["_silencer", "_audibleFireCoef", "_loudness", "_strength", "_vehAttenuation", "_magazine", "_muzzles", "_weaponMagazines", "_muzzleMagazines", "_ammoType", "_initSpeed", "_ammoConfig", "_caliber", "_parentClasses"]; PARAMS_7(_object,_firer,_distance,_weapon,_muzzle,_mode,_ammo); @@ -30,10 +30,11 @@ if (!GVAR(enableCombatDeafness)) exitWith {}; //Only run if firedNear object is player or player's vehicle: if ((ACE_player != _object) && {(vehicle ACE_player) != _object}) exitWith {}; if (_weapon in ["Throw", "Put"]) exitWith {}; +if (_distance > 50) exitWith {}; _vehAttenuation = if ((ACE_player == (vehicle ACE_player)) || {isTurnedOut ACE_player}) then {1} else {GVAR(playerVehAttenuation)}; -if (_distance < 1) then {_distance = 1;}; +_distance = 1 max _distance; _silencer = switch (_weapon) do { case (primaryWeapon _firer) : {(primaryWeaponItems _firer) select 0}; @@ -47,10 +48,51 @@ if (_silencer != "") then { _audibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "audibleFire"); }; -_audibleFire = getNumber (configFile >> "CfgAmmo" >> _ammo >> "audibleFire"); +_weaponMagazines = missionNamespace getVariable [format[QEGVAR(common,weaponMagazines_%1),_weapon], []]; +if (count _weaponMagazines == 0) then { + _muzzles = getArray (configFile >> "CfgWeapons" >> _weapon >> "muzzles"); + _weaponMagazines = getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"); + { + if (_x != "this") then { + _muzzleMagazines = getArray (configFile >> "CfgWeapons" >> _weapon >> _x >> "magazines"); + _weaponMagazines append _muzzleMagazines; + }; + } forEach _muzzles; + { + _ammoType = getText(configFile >> "CfgMagazines" >> _x >> "ammo"); + _weaponMagazines set [_forEachIndex, [_x, _ammoType]]; + } forEach _weaponMagazines; + missionNamespace setVariable [format[QEGVAR(common,weaponMagazines_%1),_weapon], _weaponMagazines]; +}; -_loudness = _audibleFireCoef * _audibleFire / 64; -_strength = _vehAttenuation * (_loudness - (_loudness/50 * _distance)); // linear drop off +_magazine = ""; +{ + EXPLODE_2_PVT(_x,_magazineType,_ammoType) + if (_ammoType == _ammo) exitWith { + _magazine = _magazineType; + }; +} forEach _weaponMagazines; + +if (_magazine == "") exitWith {}; + +_initSpeed = getNumber(configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); +_ammoConfig = (configFile >> "CfgAmmo" >> _ammo); +_parentClasses = [_ammoConfig, true] call BIS_fnc_returnParents; +_caliber = getNumber(_ammoConfig >> "ACE_caliber"); +_caliber = switch (true) do { + case ("ShellBase" in _parentClasses): { 80 }; + case ("RocketBase" in _parentClasses): { 200 }; + case ("MissileBase" in _parentClasses): { 600 }; + case ("SubmunitionBase" in _parentClasses): { 80 }; + default { + if (_caliber <= 0) then { 6.5 } else { _caliber }; + }; +}; +_loudness = (_caliber ^ 1.25 / 10) * (_initspeed / 1000) * _audibleFireCoef / 5; +_strength = _vehAttenuation * (_loudness - (_loudness / 50 * _distance)); // linear drop off + +//systemChat format["%1 : %2 : %3", _strength, _initSpeed, _parentClasses]; +//systemChat format["%1 : %2 : %3", _weapon, _magazine, _initSpeed]; if (_strength < 0.01) exitWith {}; diff --git a/addons/hearing/functions/fnc_putInEarplugs.sqf b/addons/hearing/functions/fnc_putInEarplugs.sqf index b02a19d5bc..e979360945 100644 --- a/addons/hearing/functions/fnc_putInEarplugs.sqf +++ b/addons/hearing/functions/fnc_putInEarplugs.sqf @@ -22,7 +22,7 @@ _player removeItem "ACE_EarPlugs"; _player setVariable ["ACE_hasEarPlugsIn", true, true]; -[localize "STR_ACE_Hearing_EarPlugs_Are_On"] call EFUNC(common,displayTextStructured); +[localize LSTRING(EarPlugs_Are_On)] call EFUNC(common,displayTextStructured); -/*// No Ear Plugs in inventory, telling user -[localize "STR_ACE_Hearing_NoPlugs"] call EFUNC(common,displayTextStructured);*/ +/*// No Earplugs in inventory, telling user +[localize LSTRING(NoPlugs)] call EFUNC(common,displayTextStructured);*/ diff --git a/addons/hearing/functions/fnc_removeEarplugs.sqf b/addons/hearing/functions/fnc_removeEarplugs.sqf index e2d0b68d51..bee3517235 100644 --- a/addons/hearing/functions/fnc_removeEarplugs.sqf +++ b/addons/hearing/functions/fnc_removeEarplugs.sqf @@ -18,7 +18,7 @@ PARAMS_1(_player); if !(_player canAdd "ACE_EarPlugs") exitWith { // inventory full - [localize "STR_ACE_Hearing_Inventory_Full"] call EFUNC(common,displayTextStructured); + [localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured); }; // Plugs already in and removing them. @@ -26,4 +26,4 @@ _player addItem "ACE_EarPlugs"; _player setVariable ["ACE_hasEarPlugsIn", false, true]; -[localize "STR_ACE_Hearing_EarPlugs_Are_Off"] call EFUNC(common,displayTextStructured); +[localize LSTRING(EarPlugs_Are_Off)] call EFUNC(common,displayTextStructured); diff --git a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf index a7285d5e2b..7d48ca7b34 100644 --- a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf +++ b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf @@ -15,6 +15,8 @@ */ #include "script_component.hpp" +private ["_effectType", "_newAttenuation", "_turretConfig", "_turretPath", "_vehicle"]; + _vehicle = vehicle ACE_player; if (isNull _vehicle) exitWith {}; diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index a0ca6af457..cfec318dc0 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -1,5 +1,5 @@ /* - * Author: commy2 and esteldunedain + * Author: commy2 and esteldunedain and Ruthberg * Updates and applys the current deafness. Called every 0.1 sec from a PFEH. * * Arguments: @@ -15,19 +15,16 @@ */ #include "script_component.hpp" -#define STRENGHTODEAFNESS 3 -#define MAXDEAFNESS 1.1 - private ["_recoverRate", "_volume"]; // Exit if combat deafness is disabled if !(GVAR(enableCombatDeafness)) exitWith {}; // Check if new noises increase deafness -if (GVAR(newStrength) * STRENGHTODEAFNESS > GVAR(currentDeafness)) then { - GVAR(currentDeafness) = GVAR(newStrength) * STRENGHTODEAFNESS min MAXDEAFNESS; +GVAR(newStrength) = (((ACE_player getvariable [QGVAR(dv), 0]) min 20) / 20) ^ 2; +if (GVAR(newStrength) > GVAR(currentDeafness)) then { + GVAR(currentDeafness) = GVAR(newStrength); }; -GVAR(newStrength) = 0; // Recover rate is slower if deafness is severe _recoverRate = 0.01; @@ -38,7 +35,7 @@ if (GVAR(currentDeafness) > 0.7) then { }; }; -// Deafness recovers with time +// Deafness recovers with ACE_time GVAR(currentDeafness) = GVAR(currentDeafness) - _recoverRate max 0; // needed until Bohemia fixes playSound to actually use the second argument diff --git a/addons/hearing/script_component.hpp b/addons/hearing/script_component.hpp index 6d4df68370..089bce86eb 100644 --- a/addons/hearing/script_component.hpp +++ b/addons/hearing/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT hearing -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_HEARING #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_HEARING #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/hearing/sounds/backblast_ring.ogg b/addons/hearing/sounds/backblast_ring.ogg new file mode 100644 index 0000000000..8d6207e326 Binary files /dev/null and b/addons/hearing/sounds/backblast_ring.ogg differ diff --git a/addons/hearing/sounds/deafness.ogg b/addons/hearing/sounds/deafness.ogg new file mode 100644 index 0000000000..52314e374e Binary files /dev/null and b/addons/hearing/sounds/deafness.ogg differ diff --git a/addons/hearing/sounds/flashbang_ring.ogg b/addons/hearing/sounds/flashbang_ring.ogg new file mode 100644 index 0000000000..0374cb413c Binary files /dev/null and b/addons/hearing/sounds/flashbang_ring.ogg differ diff --git a/addons/hearing/sounds/muzzleblast_ring1.ogg b/addons/hearing/sounds/muzzleblast_ring1.ogg new file mode 100644 index 0000000000..c164e93c02 Binary files /dev/null and b/addons/hearing/sounds/muzzleblast_ring1.ogg differ diff --git a/addons/hearing/sounds/muzzleblast_ring2.ogg b/addons/hearing/sounds/muzzleblast_ring2.ogg new file mode 100644 index 0000000000..3b6331e011 Binary files /dev/null and b/addons/hearing/sounds/muzzleblast_ring2.ogg differ diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 9e960f6d63..dbd063b752 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -2,7 +2,7 @@ - Ear Plugs + Earplugs Ohrenstöpsel Tapones para los oídos Stopery do uszu @@ -14,7 +14,7 @@ Tappi auricolari - Protective Ear Plugs allow the wearer to be near loud weaponry without damage to his hearing. + Protective Earplugs allow the wearer to be near loud weaponry without damage to his hearing. Schützende Ohrenstöpsel, die es dem Träger ermöglichen, sich in der Nähe lauter Waffen aufzuhalten ohne Gehörschäden davonzutragen.. Los tapones para los oídos permiten al usuario operar armamento ruidoso sin sufrir pérdida de audición. Stopery do uszu umożliwiają użytkownikowi przebywać w pobliżu głośnej broni bez poniesienia konsekwencji jaką jest utrata słuchu. @@ -74,7 +74,7 @@ Levati i tappi auricolari - You have no ear plugs + You have no earplugs Keine Ohrenstöpsel im Inventar No tienes tapones para los oídos Nie masz stoperów @@ -112,18 +112,33 @@ Hearing Słuch + Audición + Gehör + Sluch + Audição Enable combat deafness? Wł. głuchotę bojową + ¿Habilitar sordera de combate? + Aktiviere Taubheit im Gefecht? + Povolit ztrátu sluchu? + Ativar surdez em combate? Enable combat deafness? Możliwość chwilowej utraty słuchu przy głośnych wystrzałach i jednoczesnym braku włożonych stoperów + Habilita la sordera de combate + Aktiviere Taubheit im Gefecht? + Povolit ztrátu sluchu? + Ativar surdez em combate? Głuchota bojowa pojawia się w momentach, kiedy stoimy w pobliżu broni wielkokalibrowej bez ochrony słuchu, lub np. podczas ostrzału artyleryjskiego. Moduł ten pozwala na włączenie lub wyłączenie tego efektu. + Dieses Modul aktiviert/deaktiviert die Taubheit im Gefecht. Wenn aktiviert, können Spieler ohne Gehörschutz taub werden, wenn eine Waffe in ihrer Nähe abgefeuert wird oder eine Explosion stattfindet. + Ztráta sluchu je možná ve chvíly, kdy se v bezprostřední blízkosti střílí z velkorážní zbraně nebo při bombardování a osoba je bez ochrany sluchu (např. špunty). Tento modul umožňuje tuto věc povolit nebo zakázat. + Este módulo ativa / desativa surdez em combate. Quando ativado, os jogadores podem ficar surdos quando uma arma é disparada ao seu redor ou uma explosão ocorre sem proteção auditiva. \ No newline at end of file diff --git a/addons/hitreactions/ACE_Settings.hpp b/addons/hitreactions/ACE_Settings.hpp new file mode 100644 index 0000000000..adbbdacaf2 --- /dev/null +++ b/addons/hitreactions/ACE_Settings.hpp @@ -0,0 +1,7 @@ +class ACE_Settings { + class GVAR(minDamageToTrigger) { + //Minimum mamage needed to trigger falling down while moving. Set to -1 to disable completely. + typeName = "SCALAR"; + value = 0.1; + }; +}; diff --git a/addons/hitreactions/config.cpp b/addons/hitreactions/config.cpp index 33d2665311..77b68b77f5 100644 --- a/addons/hitreactions/config.cpp +++ b/addons/hitreactions/config.cpp @@ -12,4 +12,5 @@ class CfgPatches { }; }; +#include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" diff --git a/addons/hitreactions/functions/fnc_fallDown.sqf b/addons/hitreactions/functions/fnc_fallDown.sqf index fdad970950..b979d09a4f 100644 --- a/addons/hitreactions/functions/fnc_fallDown.sqf +++ b/addons/hitreactions/functions/fnc_fallDown.sqf @@ -10,6 +10,9 @@ _damage = _this select 2; // don't fall on collision damage if (_unit == _firer) exitWith {}; +//Exit if system disabled: +if (GVAR(minDamageToTrigger) == -1) exitWith {}; + // cam shake for player if (_unit == ACE_player) then { addCamShake [3, 5, _damage + random 10]; @@ -27,13 +30,16 @@ if (_vehicle isKindOf "StaticWeapon") exitwith { }; // don't fall after minor damage -if (_damage < 0.1) exitWith {}; +if (_damage < GVAR(minDamageToTrigger)) exitWith {}; // play sound if (!isNil QUOTE(EFUNC(medical,playInjuredSound))) then { [_unit] call EFUNC(medical,playInjuredSound); }; +//Don't do animations if in a vehicle (looks weird and animations never reset): +if (_vehicle != _unit) exitWith {}; + // this checks most things, so it doesn't mess with being inside vehicles or while dragging etc. if !([_unit, _vehicle] call EFUNC(common,canInteractWith)) exitWith {}; diff --git a/addons/huntir/$PBOPREFIX$ b/addons/huntir/$PBOPREFIX$ new file mode 100644 index 0000000000..b19f9d28e8 --- /dev/null +++ b/addons/huntir/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\huntir \ No newline at end of file diff --git a/addons/huntir/CfgAmmo.hpp b/addons/huntir/CfgAmmo.hpp new file mode 100644 index 0000000000..fac4d6fe60 --- /dev/null +++ b/addons/huntir/CfgAmmo.hpp @@ -0,0 +1,45 @@ +class CfgAmmo { + class FlareBase; + class F_HuntIR: FlareBase { + model = PATHTOF(data\ace_m1070_armed.p3d); + lightColor[] = {0, 0, 0, 0}; + smokeColor[] = {0, 0, 0, 0}; + timeToLive = 6; + }; + + class ShellBase; + class ACE_HuntIR_Propell: ShellBase { + supersonicCrackNear[] = {"",0.316228,1,50}; + supersonicCrackFar[] = {"",0.223872,1,150}; + CraterEffects = ""; + CraterWaterEffects = ""; + ExplosionEffects = "ACE_HuntIR_Propell_Fx"; + visibleFire = 1; + audibleFire = 1; + dangerRadiusHit = -1; + suppressionRadiusHit = 0; + soundHit1[] = {"",3.16228,1,2000}; + soundHit2[] = {"",3.16228,1,2000}; + soundHit3[] = {"",3.16228,1,2000}; + soundHit4[] = {"",3.16228,1,2000}; + soundHit5[] = {"",3.16228,1,2000}; + soundHit6[] = {"",3.16228,1,2000}; + soundHit7[] = {"",3.16228,1,2000}; + soundHit8[] = {"",3.16228,1,2000}; + multiSoundHit[] = {}; + class HitEffects {}; + soundFakeFall0[] = {"",3.16228,1,1000}; + soundFakeFall1[] = {"",3.16228,1,1000}; + soundFakeFall2[] = {"",3.16228,1,1000}; + soundFakeFall3[] = {"",3.16228,1,1000}; + soundFakeFall[] = {}; + hit = 0; + indirectHit = 0; + indirectHitRange = 0; + explosive = 1; + model = "\A3\weapons_f\empty"; + airFriction = 0; + timeToLive = 1; + explosionTime = 0.001; + }; +}; diff --git a/addons/huntir/CfgCloudlets.hpp b/addons/huntir/CfgCloudlets.hpp new file mode 100644 index 0000000000..4ff0ff2f6f --- /dev/null +++ b/addons/huntir/CfgCloudlets.hpp @@ -0,0 +1,92 @@ +class ACE_HuntIR_Propell_Fx { + class ACE_HuntIR_ExploAmmoFlash { + simulation = "particles"; + type = "ACE_HuntIR_ExploAmmoFlash"; + position[] = { 0, 0, 0 }; + intensity = 1; + interval = 1; + lifeTime = 1; + }; + class ACE_HuntIR_ExploAmmoSmoke { + simulation = "particles"; + type = "ACE_HuntIR_ExploAmmoSmoke"; + position[] = { 0, 0, 0 }; + intensity = 1; + interval = 1; + lifeTime = 0.8; + }; +}; + +class CfgCloudlets { + class Default; + class ACE_HuntIR_ExploAmmoFlash: Default { + interval = 0.1; + circleRadius = 0; + circleVelocity[] = { 0, 0, 0 }; + particleShape = "\A3\data_f\ParticleEffects\Universal\Universal"; + particleFSNtieth = 16; + particleFSIndex = 0; + particleFSFrameCount = 32; + particleFSLoop = 0; + angleVar = 1; + animationName = ""; + particleType = "Billboard"; + timerPeriod = 1; + lifeTime = 0.5; + moveVelocity[] = { 0, 1, 0 }; + rotationVelocity = 1; + weight = 10; + volume = 7.9; + rubbing = 0.1; + size[] = { "0.0125 * intensity + 0.25", "0.0125 * intensity + 0.125" }; + color[] = { { 1, 1, 1, -1 }, { 1, 1, 1, 0 } }; + animationSpeed[] = { 2 }; + randomDirectionPeriod = 0.2; + randomDirectionIntensity = 0.2; + onTimerScript = ""; + beforeDestroyScript = ""; + lifeTimeVar = 0; + positionVar[] = { 0, 0.1, 0 }; + MoveVelocityVar[] = { 0.2, 0.5, 0.2 }; + rotationVelocityVar = 1; + sizeVar = 0.5; + colorVar[] = { 0, 0, 0, 0 }; + randomDirectionPeriodVar = 0; + randomDirectionIntensityVar = 0; + }; + class ACE_HuntIR_ExploAmmoSmoke: Default { + interval = "0.02 * interval + 0.02"; + circleRadius = 0; + circleVelocity[] = { 0, 0, 0 }; + particleShape = "\A3\data_f\ParticleEffects\Universal\Universal"; + particleFSNtieth = 16; + particleFSIndex = 7; + particleFSFrameCount = 48; + particleFSLoop = 1; + angleVar = 1; + animationName = ""; + particleType = "Billboard"; + timerPeriod = 1; + lifeTime = 0.25; + moveVelocity[] = { 0, 1, 0 }; + rotationVelocity = 1; + weight = 0.053; + volume = 0.04; + rubbing = 0.2; + size[] = { "0.0125 * intensity + 0.25", "0.0125 * intensity + 1.25", "0.0125 * intensity + 2.75", "0.0125 * intensity + 3.75" }; + color[] = { { 0.6, 0.6, 0.6, 1 }, { 0.7, 0.7, 0.7, 0.5 }, { 0.78, 0.78, 0.78, 0.25 } }; + animationSpeed[] = { 1.7, 0.6, 0.4, 0.3, 0.3 }; + randomDirectionPeriod = 0.2; + randomDirectionIntensity = 0.2; + onTimerScript = ""; + beforeDestroyScript = ""; + lifeTimeVar = 2; + positionVar[] = { 0.5, 0.3, 0.5 }; + MoveVelocityVar[] = { 1.5, 2, 1.5 }; + rotationVelocityVar = 1; + sizeVar = 0.5; + colorVar[] = { 0, 0, 0, 0 }; + randomDirectionPeriodVar = 0; + randomDirectionIntensityVar = 0; + }; +}; diff --git a/addons/huntir/CfgEventhandlers.hpp b/addons/huntir/CfgEventhandlers.hpp new file mode 100644 index 0000000000..308df09c1b --- /dev/null +++ b/addons/huntir/CfgEventhandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; + +class Extended_FiredBIS_EventHandlers { + class CAManBase { + class ADDON { + clientFiredBIS = QUOTE(_this call FUNC(handleFired)); + }; + }; +}; \ No newline at end of file diff --git a/addons/huntir/CfgMagazines.hpp b/addons/huntir/CfgMagazines.hpp new file mode 100644 index 0000000000..c11f81a98c --- /dev/null +++ b/addons/huntir/CfgMagazines.hpp @@ -0,0 +1,11 @@ + +class CfgMagazines { + class 1Rnd_HE_Grenade_shell; + class ACE_HuntIR_M203: 1Rnd_HE_Grenade_shell { + displayName = CSTRING(magazine_displayName); + displayNameShort = "HuntIR"; + descriptionShort = ""; + picture = PATHTOF(data\m_m1070_ca.paa); + ammo = "F_HuntIR"; + }; +}; diff --git a/addons/huntir/CfgVehicles.hpp b/addons/huntir/CfgVehicles.hpp new file mode 100644 index 0000000000..bc8ed4fc83 --- /dev/null +++ b/addons/huntir/CfgVehicles.hpp @@ -0,0 +1,98 @@ + +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(open) { + displayName = CSTRING(activateMonitor); + condition = QUOTE([ARR_2(ACE_player,'ACE_HuntIR_monitor')] call EFUNC(common,hasItem)); + statement = QUOTE(call FUNC(huntir)); + showDisabled = 0; + priority = 2; + icon = PATHTOF(UI\w_huntir_monitor_ca.paa); + exceptions[] = {}; + }; + }; + }; + }; + + class Parachute_02_base_F; + class ACE_HuntIR: Parachute_02_base_F { + author = ECSTRING(common,ACETeam); + castDriverShadow = 0; + destrType = "DestructDefault"; + displayName = "HuntIR"; + model = PATHTOF(data\huntir.p3d); + scope = 1; + soundCrash[] = {"", db-30, 1 }; + soundEnviron[] = {"z\ace\addons\apl\sounds\padak_let", 0.316228, 1, 80}; + soundLandCrash[] = {"", db-30, 1 }; + soundWaterCrash[] = {"", db10, 1 }; + class HitPoints { + class HitEngine { + armor = 0; + material = -1; + name = ""; + visual = ""; + radius = 0; + passThrough = 0; + explosionShielding = 0; + }; + class HitParachute { + armor = 0.0001; + material = -1; + name = "parachute"; + visual = ""; + radius = 0.2; + passThrough = 1; + explosionShielding = 0; + }; + class HitCamera { + armor = 0.001; + material = -1; + name = "camera"; + visual = ""; + radius = 0.025; + passThrough = 1; + explosionShielding = 1; + }; + }; + }; + + class Item_Base_F; + class ACE_Item_HuntIR_monitor: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(monitor_displayName); + vehicleClass = "Items"; + class TransportItems { + class ACE_HuntIR_monitor { + name = "ACE_HuntIR_monitor"; + count = 1; + }; + }; + }; + + class ReammoBox_F; + class ACE_HuntIR_Box: ReammoBox_F { + model = PATHTOF(data\ace_huntirbox.p3d); + displayName = $STR_DN_ACE_HUNTIRBOX; + class TransportItems { + MACRO_ADDITEM(ACE_HuntIR_monitor,5); + }; + class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_HuntIR_M203,20); + }; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_HuntIR_monitor,5); + }; + class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_HuntIR_M203,20); + }; + }; +}; diff --git a/addons/huntir/CfgWeapons.hpp b/addons/huntir/CfgWeapons.hpp new file mode 100644 index 0000000000..6ff271d604 --- /dev/null +++ b/addons/huntir/CfgWeapons.hpp @@ -0,0 +1,34 @@ + +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_HuntIR_monitor: ACE_ItemCore { + scope = 2; + displayName = CSTRING(monitor_displayName); + picture = PATHTOF(UI\w_huntir_monitor_ca.paa); + descriptionShort = CSTRING(monitor_displayName); + model = PATHTOF(data\ace_huntir_monitor.p3d); + + class ItemInfo: InventoryItem_Base_F { + mass = 20; + }; + }; + + class GrenadeLauncher; + class UGL_F: GrenadeLauncher { + magazines[] += {"ACE_HuntIR_M203"}; + }; + class GL_3GL_F: UGL_F { + //magazines[] += {"ACE_HuntIR_M203"}; + magazines[] = {"1Rnd_HE_Grenade_shell","UGL_FlareWhite_F","UGL_FlareGreen_F","UGL_FlareRed_F","UGL_FlareYellow_F","UGL_FlareCIR_F","1Rnd_Smoke_Grenade_shell","1Rnd_SmokeRed_Grenade_shell","1Rnd_SmokeGreen_Grenade_shell","1Rnd_SmokeYellow_Grenade_shell","1Rnd_SmokePurple_Grenade_shell","1Rnd_SmokeBlue_Grenade_shell","1Rnd_SmokeOrange_Grenade_shell","3Rnd_HE_Grenade_shell","3Rnd_UGL_FlareWhite_F","3Rnd_UGL_FlareGreen_F","3Rnd_UGL_FlareRed_F","3Rnd_UGL_FlareYellow_F","3Rnd_UGL_FlareCIR_F","3Rnd_Smoke_Grenade_shell","3Rnd_SmokeRed_Grenade_shell","3Rnd_SmokeGreen_Grenade_shell","3Rnd_SmokeYellow_Grenade_shell","3Rnd_SmokePurple_Grenade_shell","3Rnd_SmokeBlue_Grenade_shell","3Rnd_SmokeOrange_Grenade_shell","ACE_HuntIR_M203"}; + }; + + class Rifle_Base_F; + class arifle_MX_Base_F: Rifle_Base_F { + class GL_3GL_F: UGL_F { + //magazines[] += {"ACE_HuntIR_M203"}; + magazines[] = {"1Rnd_HE_Grenade_shell","UGL_FlareWhite_F","UGL_FlareGreen_F","UGL_FlareRed_F","UGL_FlareYellow_F","UGL_FlareCIR_F","1Rnd_Smoke_Grenade_shell","1Rnd_SmokeRed_Grenade_shell","1Rnd_SmokeGreen_Grenade_shell","1Rnd_SmokeYellow_Grenade_shell","1Rnd_SmokePurple_Grenade_shell","1Rnd_SmokeBlue_Grenade_shell","1Rnd_SmokeOrange_Grenade_shell","3Rnd_HE_Grenade_shell","3Rnd_UGL_FlareWhite_F","3Rnd_UGL_FlareGreen_F","3Rnd_UGL_FlareRed_F","3Rnd_UGL_FlareYellow_F","3Rnd_UGL_FlareCIR_F","3Rnd_Smoke_Grenade_shell","3Rnd_SmokeRed_Grenade_shell","3Rnd_SmokeGreen_Grenade_shell","3Rnd_SmokeYellow_Grenade_shell","3Rnd_SmokePurple_Grenade_shell","3Rnd_SmokeBlue_Grenade_shell","3Rnd_SmokeOrange_Grenade_shell","ACE_HuntIR_M203"}; + }; + }; +}; diff --git a/addons/huntir/Dialog.hpp b/addons/huntir/Dialog.hpp new file mode 100644 index 0000000000..97058394a5 --- /dev/null +++ b/addons/huntir/Dialog.hpp @@ -0,0 +1,401 @@ +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0c +#define ST_TYPE 0xF0 +#define ST_SINGLE 0 +#define ST_MULTI 16 +#define ST_TITLE_BAR 32 +#define ST_PICTURE 48 +#define ST_FRAME 64 +#define ST_BACKGROUND 80 +#define ST_GROUP_BOX 96 +#define ST_GROUP_BOX2 112 +#define ST_HUD_BACKGROUND 128 +#define ST_TILE_PICTURE 144 +#define ST_WITH_RECT 160 +#define ST_LINE 176 +#define FontM "PuristaMedium" +#define __XA SafeZoneXAbs +#define __X SafeZoneX +#define __Y SafeZoneY +#define __WA SafeZoneWAbs +#define __W SafeZoneW +#define __H SafeZoneH + +class ace_huntir_cam_dialog { + idd = 18880; + movingEnable = true; + controlsBackground[] = { }; + objects[] = { }; + controls[] = { + TOP_BORDER, + BOTTOM_BORDER, + LEFT_BORDER, + RIGHT_BORDER, + //HELP_DIALOG, + CAM_BG, + CAM_HEIGHT, + CAM_ALT, + CAM_No, + CAM_NO_x, + CAM_TIME_REMAIN, + CAM_TIME, + CAM_ZOOM, + ZOOM_X, + CAM_POS, + CAM_POS_X, + CAM_DIR, + CAM_DIR_x + }; + + class TOP_BORDER { + idc = -1; + type = CT_STATIC; + style = ST_CENTER; + x = __XA; + y = __Y; + w = __WA; + h = 0.08; + font = FontM; + sizeEx = 0.04; + colorText[] = { 1, 1, 1, 1 }; + colorBackground[] = {0,0,0,1}; + text = ""; + blinkingPeriod = 0; + }; + class BOTTOM_BORDER: TOP_BORDER { + y = __Y + __H - 0.05; + h = 0.05; + }; + class LEFT_BORDER: TOP_BORDER { + w = (abs(__XA) - abs(__X)) + 0.05; + h = __H; + }; + class RIGHT_BORDER: TOP_BORDER { + x = __X + __W - 0.05; + w = (__WA - __W) + 0.05; + h = __H; + }; + class HELP_DIALOG { + idc = -1; + type = CT_BUTTON; + style = ST_CENTER; + font = FontM; + sizeEx = 0.025; + colorText[] = { 1, 1, 1, 1 }; + colorFocused[] = { 0.31, 0.31, 0.31, 0.31 }; + colorDisabled[] = { 0, 0, 1, 0.7 }; + colorBackground[] = { 0, 0, 0, 0 }; + colorBackgroundDisabled[] = { 1, 1, 1, 0.5 }; + colorBackgroundActive[] = { 0.5, 0.5, 0.5, 0.5 }; + offsetX = 0.003; + offsetY = 0.003; + offsetPressedX = 0.002; + offsetPressedY = 0.002; + colorShadow[] = { 0, 0, 0, 0.5 }; + colorBorder[] = { 0, 0, 0, 0 }; + borderSize = 0; + soundEnter[] = { "", 0, 1 }; + soundPush[] = { "buttonpushed.ogg", 0.1, 1 }; + soundClick[] = { "", 0, 1 }; + soundEscape[] = { "", 0, 1 }; + x = __X + (2*0.8); y = __Y + 0.045; + w = 0.05; h = 0.02; + text = CSTRING(HELP); + action = "createDialog 'ace_huntir_help_dialog'"; + }; + class CAM_BG { + idc = -1; + type = 0; + style = 48; + colorText[ ]={ 1,1,1,1 }; + colorBackground[ ]={ 0.4,0.4,0.4,1 }; + font = "PuristaMedium"; + sizeEx = 0.021; + lineSpacing = 1; + x = __X; + y = __Y + 0.08; + w = __W; + h = __H + 0.2; + border = 0; + text = PATHTOF(UI\ace_huntir_monitor_on.paa); + }; + class CAM_HEIGHT { + type = CT_STATIC; + idc = 1; + style = ST_LEFT; + colorBackground[] = {0, 0, 0, 0}; + colorText[] = {1, 1, 1, 1}; + font = FontM; + sizeEx = 0.02; + x = __X + 0.42; + y = __Y + 0.32; + w = 0.08; + h = 0.04; + text = ""; + blinkingPeriod = 0; + }; + class CAM_ALT: CAM_HEIGHT { + x = __X + 0.35; + text = CSTRING(ALT); + }; + class CAM_No: CAM_HEIGHT { + x = __X + __W - 0.64; + text = CSTRING(CAM); + }; + class CAM_NO_x: CAM_HEIGHT { + idc = 2; + x = __X + __W - 0.56; + y = __Y + 0.32; + text = ""; + }; + class CAM_TIME: CAM_HEIGHT { + x = __X + 0.35; + y = __Y + __H - 0.65; + w = 0.12; + text = CSTRING(TIME); + }; + class CAM_TIME_REMAIN: CAM_TIME { + idc = 3; + x = __X + 0.46; + text = ""; + }; + class CAM_ZOOM: CAM_No { + y = __Y + 0.36; + text = "Zoom:"; + }; + class ZOOM_X: CAM_ZOOM { + idc = 4; + x = __X + __W - 0.56; + text = ""; + }; + class CAM_POS: CAM_HEIGHT { + x = __X + 0.35; + y = __Y + 0.36; + text = "GPS Pos:"; + }; + class CAM_POS_X: CAM_POS { + idc = 5; + x = __X + 0.42; + w = 0.16; + text = ""; + }; + class CAM_DIR: CAM_POS { + y = __Y + 0.4; + text = ""; //"Az:"; + }; + class CAM_DIR_x: CAM_DIR { + idc = 6; + x = __X + 0.42; + w = 0.16; + text = ""; + }; +}; + +class ace_huntir_cam_dialog_inactive: ace_huntir_cam_dialog { + idd = 18881; + controls[] = { + TOP_BORDER, + BOTTOM_BORDER, + LEFT_BORDER, + RIGHT_BORDER, + //HELP_DIALOG, + //PRESS_HELP, + CAM_BG, + SEARCHING_CAM + }; + + class TOP_BORDER: TOP_BORDER {}; + class BOTTOM_BORDER: BOTTOM_BORDER {}; + class LEFT_BORDER: LEFT_BORDER {}; + class RIGHT_BORDER: RIGHT_BORDER {}; + class PRESS_HELP { + idc = -1; + type = CT_STATIC; + style = ST_LEFT; + x = __X + (__W - 0.2); + y = __Y + 0.06; + w = 0.4; + h = 0.02; + font = FontM; + sizeEx = 0.02; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0,0,0,0}; + text = ""; + blinkingPeriod = 0; + }; + class HELP_DIALOG { + idc = -1; + type = CT_STATIC; + style = ST_LEFT; + x = __X + (__W - 0.2); + y = __Y + 0.03; + w = 0.4; + h = 0.02; + font = FontM; + sizeEx = 0.02; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0,0,0,0}; + text = CSTRING(ESC); + blinkingPeriod = 0; + }; + class CAM_BG: CAM_BG {}; + class SEARCHING_CAM { + idc = 1; + type = CT_STATIC; + style = ST_LEFT; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0,0,0,0}; + x = __X + (__W/2) - 0.07; + y = __Y + (__H/2); + w = 0.6; + h = 0.08; + font = FontM; + sizeEx = 0.04; + text = ""; + blinkingPeriod = 0; + }; +}; + +class ace_huntir_cam_dialog_off: ace_huntir_cam_dialog_inactive { + idd = 18882; + controls[] = { + TOP_BORDER, + BOTTOM_BORDER, + LEFT_BORDER, + RIGHT_BORDER, + //HELP_DIALOG, + //PRESS_HELP, + CAM_BG + }; + + class TOP_BORDER: TOP_BORDER {}; + class BOTTOM_BORDER: BOTTOM_BORDER {}; + class LEFT_BORDER: LEFT_BORDER {}; + class RIGHT_BORDER: RIGHT_BORDER {}; + class PRESS_HELP: PRESS_HELP {}; + class HELP_DIALOG: HELP_DIALOG {}; + class CAM_BG: CAM_BG { text = PATHTOF(UI\ace_huntir_monitor_off.paa); }; +}; +//ACTIVE PARA CAMERA DIALOG +class ace_huntir_help_dialog: ace_huntir_cam_dialog { + idd = -1; + controls[] = { + TOP_BORDER, + BOTTOM_BORDER, + LEFT_BORDER, + RIGHT_BORDER, + CAM_BG, + CAM_HEIGHT, + CAM_ALT, + CAM_TIME_REMAIN, + CAM_TIME, + CAM_ZOOM, + ZOOM_X, + CAM_POS, + CAM_POS_x, + CAM_No, + CAM_No_X, + CAM_DIR, + CAM_DIR_x, + HELP0, + HELP1, + HELP2, + HELP3, + HELP4, + HELP5, + HELP6 + }; + class TOP_BORDER: TOP_BORDER {}; + class BOTTOM_BORDER: BOTTOM_BORDER {}; + class LEFT_BORDER: LEFT_BORDER {}; + class RIGHT_BORDER: RIGHT_BORDER {}; + class CAM_BG: CAM_BG {}; + class CAM_HEIGHT: CAM_HEIGHT {}; + class CAM_ALT: CAM_ALT {}; + class CAM_No: CAM_No {}; + class CAM_NO_x: CAM_NO_x {}; + class CAM_TIME_REMAIN: CAM_TIME_REMAIN {}; + class CAM_TIME: CAM_TIME {}; + class CAM_ZOOM: CAM_ZOOM {}; + class ZOOM_X: ZOOM_X {}; + class CAM_POS: CAM_POS {}; + class CAM_POS_X: CAM_POS_X {}; + class CAM_DIR: CAM_DIR {}; + class CAM_DIR_x: CAM_DIR_x {}; + class HELP0 { + idc = -1; + type = CT_STATIC; + style = ST_LEFT; + x = __X + (__W - 0.3); + y = __Y + 0.03; + w = 0.4; + h = 0.03; + font = FontM; + sizeEx = 0.022; + colorText[] = { 1, 1, 1, 1 }; + colorBackground[] = {0,0,0,1}; + text = CSTRING(HELP_EXIT); + blinkingPeriod = 0; + }; + class HELP1: HELP0 { + y = __Y + 0.06; + text = CSTRING(HELP_ZOOM); + }; + class HELP2: HELP0 { + y = __Y + 0.09; + text = CSTRING(HELP_CAM); + }; + class HELP3: HELP0 { + y = __Y + 0.12; + text = CSTRING(HELP_ROT); + }; + class HELP4: HELP0 { + y = __Y + 0.15; + text = CSTRING(HELP_ELV); + }; + class HELP5: HELP0 { + y = __Y + 0.18; + text = CSTRING(HELP_MOD); + }; + class HELP6: HELP0 { + y = __Y + 0.21; + text = CSTRING(HELP_RES); + }; +}; diff --git a/addons/huntir/RscTitles.hpp b/addons/huntir/RscTitles.hpp new file mode 100644 index 0000000000..de94f17a5e --- /dev/null +++ b/addons/huntir/RscTitles.hpp @@ -0,0 +1,41 @@ +#define __FONTHEIGHT 0.02 + +class RscTitles { + class ace_huntir_cam_rose { + idd=-1; + movingEnable = true; + fadein = 0; + fadeout = 1; + duration = 1e+011; + name="ace_huntir_cam_rose"; + onLoad = "uiNamespace setVariable ['ace_huntir_cam_rose', _this select 0]"; + class controls { + class CHAR_N { + type = 0; + idc = 64432; + style = 0; + x = 0.497;y = 0.297;w = 0.2;h = 0.2; + font = "PuristaMedium"; + sizeEx = __FONTHEIGHT; + colorText[] = {1, 1, 1, 1}; + colorBackground[]={0,0,0,0}; + text = "N"; + }; + class CHAR_E: CHAR_N { + idc = 64433; + x = 0.697;y = 0.497; + text = "E"; + }; + class CHAR_S: CHAR_N { + idc = 64434; + x = 0.497;y = 0.697; + text = "S"; + }; + class CHAR_W: CHAR_N { + idc = 64435; + x = 0.297;y = 0.497; + text = "W"; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/huntir/UI/ace_huntir_monitor_off.paa b/addons/huntir/UI/ace_huntir_monitor_off.paa new file mode 100644 index 0000000000..be37d17b99 Binary files /dev/null and b/addons/huntir/UI/ace_huntir_monitor_off.paa differ diff --git a/addons/huntir/UI/ace_huntir_monitor_on.paa b/addons/huntir/UI/ace_huntir_monitor_on.paa new file mode 100644 index 0000000000..a2941a8b94 Binary files /dev/null and b/addons/huntir/UI/ace_huntir_monitor_on.paa differ diff --git a/addons/huntir/UI/w_huntir_monitor_ca.paa b/addons/huntir/UI/w_huntir_monitor_ca.paa new file mode 100644 index 0000000000..7ecb6f1338 Binary files /dev/null and b/addons/huntir/UI/w_huntir_monitor_ca.paa differ diff --git a/addons/huntir/XEH_postInit.sqf b/addons/huntir/XEH_postInit.sqf new file mode 100644 index 0000000000..c5526500ac --- /dev/null +++ b/addons/huntir/XEH_postInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +GVAR(ZOOM) = 0; +GVAR(NV) = 0; +GVAR(IRON) = false; +GVAR(TI) = 0; +GVAR(cur_cam) = 0; +GVAR(ROTATE) = 0; +GVAR(ELEVAT) = 0.01; diff --git a/addons/huntir/XEH_preInit.sqf b/addons/huntir/XEH_preInit.sqf new file mode 100644 index 0000000000..0ae45c1540 --- /dev/null +++ b/addons/huntir/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(cam); +PREP(handleFired); +PREP(huntir); +PREP(huntirCompass); +PREP(keypressed); + +ADDON = true; diff --git a/addons/huntir/config.cpp b/addons/huntir/config.cpp new file mode 100644 index 0000000000..5fb106ad2d --- /dev/null +++ b/addons/huntir/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_HuntIR", "ACE_HuntIRBox"}; + weapons[] = {"ACE_HuntIR_monitor"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"Norrin", "Rocko", "Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventhandlers.hpp" +#include "CfgCloudlets.hpp" +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "Dialog.hpp" +#include "RscTitles.hpp" diff --git a/addons/huntir/data/ace_huntir_monitor.p3d b/addons/huntir/data/ace_huntir_monitor.p3d new file mode 100644 index 0000000000..059e7050ed Binary files /dev/null and b/addons/huntir/data/ace_huntir_monitor.p3d differ diff --git a/addons/huntir/data/ace_huntirbox.p3d b/addons/huntir/data/ace_huntirbox.p3d new file mode 100644 index 0000000000..d26bd85c22 Binary files /dev/null and b/addons/huntir/data/ace_huntirbox.p3d differ diff --git a/addons/huntir/data/ace_m1070.p3d b/addons/huntir/data/ace_m1070.p3d new file mode 100644 index 0000000000..e110e6291d Binary files /dev/null and b/addons/huntir/data/ace_m1070.p3d differ diff --git a/addons/huntir/data/ace_m1070_armed.p3d b/addons/huntir/data/ace_m1070_armed.p3d new file mode 100644 index 0000000000..cf4da73533 Binary files /dev/null and b/addons/huntir/data/ace_m1070_armed.p3d differ diff --git a/addons/huntir/data/bedna_ammo2.rvmat b/addons/huntir/data/bedna_ammo2.rvmat new file mode 100644 index 0000000000..b56d21c650 --- /dev/null +++ b/addons/huntir/data/bedna_ammo2.rvmat @@ -0,0 +1,31 @@ +ambient[] = {1.0, 1.0, 1.0, 1.0}; +diffuse[] = {1.0, 1.0, 1.0, 1.0}; +forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0}; +emmisive[] = {0.0, 0.0, 0.0, 1.0}; +specular[] = {1.0, 1.0, 1.0, 1.0}; +specularPower = 71.9; +PixelShaderID = "NormalMapSpecularDIMap"; +VertexShaderID = "NormalMap"; +class Stage1 { + texture = "z\ace\addons\huntir\data\bedna_ammo2_nohq.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage2 { + texture = "z\ace\addons\huntir\data\bedna_ammo2_smdi.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class StageTI { + texture = "z\ace\addons\apl\data\default_vehicle_ti_ca.paa"; +}; diff --git a/addons/huntir/data/bedna_ammo2_co.paa b/addons/huntir/data/bedna_ammo2_co.paa new file mode 100644 index 0000000000..fa759b6140 Binary files /dev/null and b/addons/huntir/data/bedna_ammo2_co.paa differ diff --git a/addons/huntir/data/bedna_ammo2_nohq.paa b/addons/huntir/data/bedna_ammo2_nohq.paa new file mode 100644 index 0000000000..4df88e4b91 Binary files /dev/null and b/addons/huntir/data/bedna_ammo2_nohq.paa differ diff --git a/addons/huntir/data/bedna_ammo2_smdi.paa b/addons/huntir/data/bedna_ammo2_smdi.paa new file mode 100644 index 0000000000..60fc404720 Binary files /dev/null and b/addons/huntir/data/bedna_ammo2_smdi.paa differ diff --git a/addons/huntir/data/camchute_co.paa b/addons/huntir/data/camchute_co.paa new file mode 100644 index 0000000000..9d927ccce1 Binary files /dev/null and b/addons/huntir/data/camchute_co.paa differ diff --git a/addons/huntir/data/huntir.p3d b/addons/huntir/data/huntir.p3d new file mode 100644 index 0000000000..a1c5b94e99 Binary files /dev/null and b/addons/huntir/data/huntir.p3d differ diff --git a/addons/huntir/data/huntir_monitor_co.paa b/addons/huntir/data/huntir_monitor_co.paa new file mode 100644 index 0000000000..7ecb6f1338 Binary files /dev/null and b/addons/huntir/data/huntir_monitor_co.paa differ diff --git a/addons/huntir/data/m_M1070_ca.paa b/addons/huntir/data/m_M1070_ca.paa new file mode 100644 index 0000000000..e3d342ccf0 Binary files /dev/null and b/addons/huntir/data/m_M1070_ca.paa differ diff --git a/addons/huntir/functions/fnc_cam.sqf b/addons/huntir/functions/fnc_cam.sqf new file mode 100644 index 0000000000..264c0c74b6 --- /dev/null +++ b/addons/huntir/functions/fnc_cam.sqf @@ -0,0 +1,147 @@ +/* + * Author: Norrin, Rocko, Ruthberg + * + * Handles HuntIR camera + * + * Arguments: + * 0: HuntIR + * + * Return Value: + * Nothing + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_huntIR); + +GVAR(huntIR) = _huntIR; +GVAR(pos) = getPosVisual GVAR(huntIR); + +GVAR(ZOOM) = 0; +GVAR(NV) = 0; +GVAR(TI) = 0; +GVAR(cur_cam) = 0; +GVAR(ROTATE) = 0; +GVAR(ELEVAT) = 0.01; + +HUNTIR_BACKGROUND_LAYER_ID cutText["","PLAIN"]; + +closedialog 0; +createDialog "ace_huntir_cam_dialog"; +uiNameSpace setVariable ["ace_huntir_monitor", findDisplay 18880]; +(uiNameSpace getVariable "ace_huntir_monitor") displaySetEventHandler ["Keydown", QUOTE(_this call FUNC(keyPressed))]; + +ctrlSetText [4, "0X"]; + +GVAR(logic) = "Logic" createVehicleLocal [0, 0, 0]; +GVAR(logic) setPosATL (GVAR(pos) vectorAdd [0, 0, -5]); +GVAR(logic) setVectorUp [0.001, 0.001, 1]; + +GVAR(cam) = "camera" camCreate GVAR(pos); +GVAR(cam) camSetTarget GVAR(logic); +GVAR(cam) cameraEffect ["internal", "BACK"]; +GVAR(cam) camSetRelPos [0, 0, 2]; +GVAR(cam) camCommit 0; +showCinemaBorder false; +camUseNVG false; + +GVAR(pphandle) = ppEffectCreate ["colorCorrections", 135522]; +GVAR(pphandle) ppEffectAdjust [1, 1, 0, [0.01, 0.02, 0.04, 0.01], [0.87, 1.08, 1.196, 0.3], [0.399, 0.287, 0.014, 0.0]]; +GVAR(pphandle) ppEffectCommit 0; +GVAR(pphandle) ppEffectEnable true; + +GVAR(stop) = false; +call FUNC(huntirCompass); + +GVAR(no_cams) = ACE_player nearEntities ["ACE_HuntIR", HUNTIR_MAX_TRANSMISSION_RANGE]; +{ + GVAR(no_cams) set [_forEachIndex, [(getPosVisual ACE_player) vectorDistance (getPosVisual _x), _x]]; +} forEach GVAR(no_cams); +GVAR(no_cams) sort true; +{ + GVAR(no_cams) set [_forEachIndex, _x select 1]; +} forEach GVAR(no_cams); +[{ + GVAR(nearHuntIRs) = ACE_player nearEntities ["ACE_HuntIR", HUNTIR_MAX_TRANSMISSION_RANGE]; + { + if (((getPosVisual _x) select 2) > 20 && {!(_x in GVAR(no_cams))} && {_x getHitPointDamage "HitCamera" < 0.25}) then { + GVAR(no_cams) pushBack _x; + }; + } forEach GVAR(nearHuntIRs); + { + if (((getPosVisual _x) select 2) <= 20 || {!(_x in GVAR(nearHuntIRs))} || {_x getHitPointDamage "HitCamera" >= 0.25}) then { + GVAR(no_cams) deleteAt _forEachIndex; + if (_forEachIndex < GVAR(cur_cam)) then { + GVAR(cur_cam) = GVAR(cur_cam) - 1; + }; + }; + } forEach GVAR(no_cams); + + GVAR(cur_cam) = 0 max GVAR(cur_cam) min ((count GVAR(no_cams)) - 1); + if (count GVAR(no_cams) > 0) then { + GVAR(huntIR) = GVAR(no_cams) select GVAR(cur_cam); + }; + + GVAR(pos) = getPosVisual GVAR(huntIR); + + if ((!dialog) || (count GVAR(no_cams) == 0) || ((GVAR(pos) select 2) <= 20)) exitWith { + [_this select 1] call cba_fnc_removePerFrameHandler; + + GVAR(stop) = true; + + GVAR(pphandle) ppEffectEnable true; + ppEffectDestroy GVAR(pphandle); + + GVAR(NV) = 0; + setAperture -1; + closedialog 0; + titletext [" ", "BLACK IN", 4]; + ACE_player switchCamera "INTERNAL"; + GVAR(cam) CameraEffect ["Terminate", "Back"]; + CamDestroy GVAR(cam); + deleteVehicle GVAR(logic); + if (player != ACE_player) then { + player remoteControl ACE_player; + }; + }; + + switch (GVAR(ZOOM)) do { + case 0: { + GVAR(cam) camsetFOV 0.7; + GVAR(cam) camSetFocus [GVAR(pos) select 2, 1]; + }; + case 1: { + GVAR(cam) camsetFOV 0.35; + GVAR(cam) camSetFocus [(GVAR(pos) select 2)/2, 1]; + }; + case 2: { + GVAR(cam) camsetFOV 0.17; + GVAR(cam) camSetFocus [(GVAR(pos) select 2)/4, 1]; + }; + case 3: { + GVAR(cam) camsetFOV 0.1; + GVAR(cam) camSetFocus [(GVAR(pos) select 2)/8, 1]; + }; + }; + + private ["_cam_coord_y", "_cam_coord_x", "_cam_time", "_cam_pos"]; + + GVAR(logic) setPosATL (GVAR(pos) vectorAdd [0, 0, -5]); + GVAR(logic) setDir GVAR(ROTATE); + GVAR(logic) setVectorUp [0.0001, 0.0001, 1]; + GVAR(cam) CameraEffect ["internal", "BACK"]; + _cam_coord_y = GVAR(ELEVAT) * cos(GVAR(ROTATE)); + _cam_coord_x = GVAR(ELEVAT) * sin(GVAR(ROTATE)); + GVAR(cam) camSetRelPos [_cam_coord_x, _cam_coord_y, 2]; + GVAR(cam) camCommit 0; + + ctrlSetText [1, format["%1 m", round(GVAR(pos) select 2)]]; + ctrlSetText [2, format["%1", GVAR(cur_cam) + 1]]; + _cam_time = ACE_time - (GVAR(huntIR) getVariable [QGVAR(startTime), ACE_time]); + ctrlSetText [3, format["%1 s", round(_cam_time)]]; + _cam_pos = getPosVisual GVAR(huntIR); + _cam_pos = format ["X = %1, Y = %2", round (_cam_pos select 0), round (_cam_pos select 1)]; + ctrlSetText [5, _cam_pos]; + ctrlSetText [6, ""]; +}, 0, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/huntir/functions/fnc_handleFired.sqf b/addons/huntir/functions/fnc_handleFired.sqf new file mode 100644 index 0000000000..23c7df04f0 --- /dev/null +++ b/addons/huntir/functions/fnc_handleFired.sqf @@ -0,0 +1,50 @@ +/* + * Author: Norrin, Rocko, Ruthberg + * + * Handles HuntIR projectiles + * + * Arguments: + * 0: unit - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * + * Return Value: + * Nothing + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_7(_unit,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + +if (_ammo != "F_HuntIR") exitWith {}; + +[{ + PARAMS_1(_projectile); + "ACE_HuntIR_Propell" createVehicle (getPosATL _projectile); + [{ + PARAMS_1(_position); + private ["_huntir"]; + _huntir = createVehicle ["ACE_HuntIR", _position, [], 0, "FLY"]; + _huntir setPosATL _position; + _huntir setVariable [QGVAR(startTime), ACE_time, true]; + [{ + EXPLODE_1_PVT(_this select 0,_huntir); + if (isNull _huntir) exitWith { + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + private ["_parachuteDamage", "_velocity"]; + _parachuteDamage = _huntir getHitPointDamage "HitParachute"; + if (_parachuteDamage > 0) then { + _velocity = velocity _huntir; + _velocity set [2, -1 min -20 * sqrt(_parachuteDamage)]; + _huntir setVelocity _velocity; + _huntir setVectorUp [0, 0, 1]; + }; + }, 0, [_huntir]] call CBA_fnc_addPerFrameHandler; + }, [getPosATL _projectile vectorAdd [0, 0, 50]], 2, 0] call EFUNC(common,waitAndExecute); +}, [_projectile], 5, 0] call EFUNC(common,waitAndExecute); diff --git a/addons/huntir/functions/fnc_huntir.sqf b/addons/huntir/functions/fnc_huntir.sqf new file mode 100644 index 0000000000..f8aed93880 --- /dev/null +++ b/addons/huntir/functions/fnc_huntir.sqf @@ -0,0 +1,93 @@ +/* + * Author: Norrin, Rocko, Ruthberg + * + * HuntIR monitor system + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Public: No + */ +#include "script_component.hpp" + +#define __TYPE_WRITER_DELAY 0.05 + +if ((ACE_player call CBA_fnc_getUnitAnim) select 0 == "stand") then { + ACE_player playMove "AmovPercMstpSrasWrflDnon_diary"; +}; + +HUNTIR_BACKGROUND_LAYER_ID cutText ["", "BLACK", 0]; +createDialog "ace_huntir_cam_dialog_off"; + +[{ + if (!dialog) exitWith { + HUNTIR_BACKGROUND_LAYER_ID cutText ["", "PLAIN", 0]; + }; + closeDialog 0; + createDialog "ace_huntir_cam_dialog_inactive"; + uiNameSpace setVariable ["ace_huntir_monitor", findDisplay 18881]; + [{ + GVAR(startTime) = ACE_time; + GVAR(done) = false; + GVAR(connectionDelay) = 5; + GVAR(state) = "searching"; + GVAR(message) = []; + GVAR(messageSearching) = toArray "Searching....."; + GVAR(messageConnecting) = toArray "Connecting....."; + [{ + private ["_elapsedTime", "_nearestHuntIRs"]; + _elapsedTime = ACE_time - GVAR(startTime); + _nearestHuntIRs = ACE_player nearEntities ["ACE_HuntIR", HUNTIR_MAX_TRANSMISSION_RANGE]; + + if ((!dialog) || GVAR(done)) exitWith { + [_this select 1] call cba_fnc_removePerFrameHandler; + + if (dialog && GVAR(state) == "connected") then { + [_nearestHuntIRs select 0] call FUNC(cam); + } else { + HUNTIR_BACKGROUND_LAYER_ID cutText ["", "PLAIN"]; + }; + }; + switch (GVAR(state)) do { + case "searching": { + if (count GVAR(message) < count GVAR(messageSearching)) then { + GVAR(message) pushBack (GVAR(messageSearching) select (count GVAR(message))); + ctrlSetText [1, toString GVAR(message)]; + } else { + GVAR(message) = []; + if (_elapsedTime > 10) then { + GVAR(state) = "noGDS"; + }; + if (_elapsedTime > 5 && {{_x getHitPointDamage "HitCamera" < 0.25} count _nearestHuntIRs > 0}) then { + GVAR(state) = "connecting"; + }; + }; + }; + case "connecting": { + if (count GVAR(message) < count GVAR(messageConnecting)) then { + GVAR(message) pushBack (GVAR(messageConnecting) select (count GVAR(message))); + ctrlSetText [1, toString GVAR(message)]; + } else { + GVAR(message) = []; + GVAR(connectionDelay) = GVAR(connectionDelay) - 1; + if (GVAR(connectionDelay) <= 0) then { + GVAR(done) = true; + GVAR(state) = "connected"; + }; + }; + }; + case "noGDS": { + ctrlSetText [1, "No GDS System detected"]; + [{ + GVAR(done) = true; + closedialog 0; + HUNTIR_BACKGROUND_LAYER_ID cutText ["", "PLAIN"]; + }, [], 3, 0] call EFUNC(common,waitAndExecute); + }; + }; + }, __TYPE_WRITER_DELAY, []] call CBA_fnc_addPerFrameHandler; + }, [], 0.5, 0] call EFUNC(common,waitAndExecute); +}, [], 1, 0] call EFUNC(common,waitAndExecute); diff --git a/addons/huntir/functions/fnc_huntirCompass.sqf b/addons/huntir/functions/fnc_huntirCompass.sqf new file mode 100644 index 0000000000..30fcf45900 --- /dev/null +++ b/addons/huntir/functions/fnc_huntirCompass.sqf @@ -0,0 +1,88 @@ +/* + * Author: Norrin, Rocko, Ruthberg + * + * HuntIR monitor compass + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Public: No + */ +#include "script_component.hpp" + +disableSerialization; + +#define __DSP (uiNamespace getVariable "ace_huntir_cam_rose") +#define __CHAR_N (__DSP displayCtrl 64432) +#define __CHAR_E (__DSP displayCtrl 64433) +#define __CHAR_S (__DSP displayCtrl 64434) +#define __CHAR_W (__DSP displayCtrl 64435) + +#define __OFFSET_X 0.003 +#define __OFFSET_Y 0.003 +#define __WIDTH 0.1 +#define __HEIGHT 0.1 +#define __RADIUS 0.05 +#define __CENTER_X 0.70 +#define __CENTER_Y 0.65 + +private ["_fnc_correctIt"]; + +_fnc_correctIt = { + PARAMS_2(_pos,_dir); + if (_dir >= 270 || {_dir <= 90}) then { + _pos set [1, (_pos select 1) + __OFFSET_Y] + }; + if (_dir >= 0 && {_dir <= 180}) then { + _pos set [0, (_pos select 0) - __OFFSET_X] + }; + if (_dir >= 90 && {_dir <= 270}) then { + _pos set [1, (_pos select 1) - __OFFSET_Y] + }; + if (_dir >= 180 && {_dir <= 360}) then { + _pos set [0, (_pos select 0) + __OFFSET_X] + }; + _pos +}; + +HUNTIR_CAM_ROSE_LAYER_ID cutRsc ["ace_huntir_cam_rose", "PLAIN"]; + +[{ + EXPLODE_1_PVT(_this select 0,_fnc_correctIt); + + if (GVAR(stop)) exitWith { + HUNTIR_CAM_ROSE_LAYER_ID cutText ["", "PLAIN"]; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + + private ["_dir", "_x1", "_y1", "_pos"]; + _dir = getDir GVAR(cam); // direction player; + + _x1 = __CENTER_X - (__RADIUS * sin(_dir)); + _y1 = __CENTER_Y - (__RADIUS * cos(_dir)); + _pos = [[_x1, _y1], _dir] call _fnc_correctIt; + __CHAR_N ctrlSetPosition [_pos select 0, _pos select 1, __WIDTH, __HEIGHT]; + __CHAR_N ctrlCommit 0; + + _x1 = __CENTER_X - (__RADIUS * sin(_dir + 90)); + _y1 = __CENTER_Y - (__RADIUS * cos(_dir + 90)); + _pos = [[_x1, _y1], _dir] call _fnc_correctIt; + __CHAR_W ctrlSetPosition [_pos select 0, _pos select 1, __WIDTH, __HEIGHT]; + __CHAR_W ctrlCommit 0; + + _x1 = __CENTER_X - (__RADIUS * sin(_dir + 180)); + _y1 = __CENTER_Y - (__RADIUS * cos(_dir + 180)); + _pos = [[_x1, _y1], _dir] call _fnc_correctIt; + __CHAR_S ctrlSetPosition [_pos select 0, _pos select 1, __WIDTH, __HEIGHT]; + __CHAR_S ctrlCommit 0; + + _x1 = __CENTER_X - (__RADIUS * sin(_dir + 270)); + _y1 = __CENTER_Y - (__RADIUS * cos(_dir + 270)); + _pos = [[_x1, _y1], _dir] call _fnc_correctIt; + __CHAR_E ctrlSetPosition [_pos select 0, _pos select 1, __WIDTH, __HEIGHT]; + __CHAR_E ctrlCommit 0; + +}, 0.01, [_fnc_correctIt]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/huntir/functions/fnc_keyPressed.sqf b/addons/huntir/functions/fnc_keyPressed.sqf new file mode 100644 index 0000000000..509dcb9de5 --- /dev/null +++ b/addons/huntir/functions/fnc_keyPressed.sqf @@ -0,0 +1,113 @@ +/* + * Author: Norrin, Rocko + * Handles the HuntIR monitor key interaction + * + * Arguments: + * 0: ? + * 1: keycode + * + * Return Value: + * handled? + * + * Example: + * [] call ace_huntir_fnc_keyPressed + * + * Public: No + */ +#include "script_component.hpp" + +private ["_ret"]; +_ret = false; + +switch (_this select 1) do { + // A = Lower zoom level + case 30: { + if (GVAR(ZOOM) > 0) then { + GVAR(ZOOM) = GVAR(ZOOM) - 1; + }; + switch (GVAR(ZOOM)) do { + case 0: { ctrlSetText [4, "0X"];}; + case 1: { ctrlSetText [4, "2X"];}; + case 2: { ctrlSetText [4, "4X"];}; + case 3: { ctrlSetText [4, "8X"];}; + }; + _ret = true; + }; + // D = Increase zoom level + case 32: { + if (GVAR(ZOOM) < 3) then { + GVAR(ZOOM) = GVAR(ZOOM) + 1; + }; + switch (GVAR(ZOOM)) do { + case 0: { ctrlSetText [4, "0X"];}; + case 1: { ctrlSetText [4, "2X"];}; + case 2: { ctrlSetText [4, "4X"];}; + case 3: { ctrlSetText [4, "8X"];}; + }; + _ret = true; + }; + //N key ( Toggle NV and TI modes ) + case 49: { + if (GVAR(NV) == 0) then { + setAperture -1; + camUseNVG true; + GVAR(NV) = 1; + if (!GVAR(IRON)) then { + GVAR(IRON) = true; + }; + } else { + setAperture -1; + camUseNVG false; + GVAR(NV) = 0; + GVAR(IRON) = false; + }; + _ret = true; + }; + // S = Next camera + case 31: { + GVAR(cur_cam) = GVAR(cur_cam) + 1; + _ret = true; + }; + // W = Previous camera + case 17: { + GVAR(cur_cam) = GVAR(cur_cam) - 1; + _ret = true; + }; + // Rotate camera anticlockwise + case 203: { + GVAR(ROTATE) = GVAR(ROTATE) - 3; + _ret = true; + }; + // Rotate camera clockwise + case 205: { + GVAR(ROTATE) = GVAR(ROTATE) + 3; + _ret = true; + }; + // Raise camera + case 200: { + if (GVAR(ELEVAT) < 4.01) then { + GVAR(ELEVAT) = GVAR(ELEVAT) + 0.12; + }; + _ret = true; + }; + // Lower camera + case 208: { + if (GVAR(ELEVAT) > -3.99) then { + GVAR(ELEVAT) = GVAR(ELEVAT) - 0.12; + }; + _ret = true; + }; + // Reset camera + case 19: { + GVAR(ROTATE) = 0; + GVAR(ELEVAT) = 0.01; + GVAR(ZOOM) = 0; + ctrlSetText [4, "0X"]; + GVAR(NV) = 0; + camUseNVG false; + setAperture -1; + _ret = true; + }; +}; + +_ret diff --git a/addons/huntir/functions/script_component.hpp b/addons/huntir/functions/script_component.hpp new file mode 100644 index 0000000000..29e0fbff41 --- /dev/null +++ b/addons/huntir/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\huntir\script_component.hpp" \ No newline at end of file diff --git a/addons/huntir/script_component.hpp b/addons/huntir/script_component.hpp new file mode 100644 index 0000000000..9f99437f67 --- /dev/null +++ b/addons/huntir/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT huntir +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_HUNTIR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_HUNTIR + #define DEBUG_SETTINGS DEBUG_SETTINGS_HUNTIR +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define HUNTIR_BACKGROUND_LAYER_ID 13521 +#define HUNTIR_CAM_ROSE_LAYER_ID 13522 + +#define HUNTIR_MAX_TRANSMISSION_RANGE 1600 diff --git a/addons/huntir/stringtable.xml b/addons/huntir/stringtable.xml new file mode 100644 index 0000000000..79f9a778e1 --- /dev/null +++ b/addons/huntir/stringtable.xml @@ -0,0 +1,197 @@ + + + + + HuntIR Transport Box + HuntIR Transportkiste + HuntIR Transport Box + Trasnportní bedna HuntIR + Ящик с HuntIR + HuntIR Transport Box + Skrzynia HuntIR + HuntIR Transport Box + HuntIR Transport Box + Caixa de transporte do HuntIR + + + HuntIR Round + HuntIR Granate + HuntIR Round + HuntIR Round + HuntIR снаряд + HuntIR Round + Nabój HuntIR + Munition HuntIR + HuntIR lövedék + Cartucho HuntIR + + + HuntIR monitor + HuntIR Monitor + HuntIR monitor + HuntIR monitor + HuntIR монитор + HuntIR monitor + Odbiornik HuntIR + Ecran HuntIR + HuntIR monitor + Monitor HuntIR + + + Activate HuntIR monitor + HuntIR Monitor aktivieren + Activate HuntIR monitor + Zapnout HuntIR monitor + Включить HuntIR монитор + Activate HuntIR monitor + Włącz odbiornik HuntIR + Allumer écran HuntIR + HuntIR monitor aktiválása + Ativar monitor do HuntIR + + + Camera: + Kamera: + Camera: + Kamera: + Камера: + Camera: + Kamera: + Caméra: + Kamera: + Câmera: + + + Altitude: + Höhe: + Altitude: + Výška: + Высота: + Altitude: + Wysokość: + Altitude: + Magasság: + Altitude: + + + Recording Time: + Aufnahmezeit: + Recording Time: + Čas nahrávání: + Время записи: + Recording Time: + Czas nagrywania: + Temps d'enregistrement: + Felvételi idő: + Tempo de gravação: + + + Press ESC to quit camera + Zum Verlassen ESC drücken + Press ESC to quit camera + Stiskni ESC pro opustění kamery + Нажмите ESC чтобы выйти из режима камеры + Press ESC to quit camera + Wciśnij ESC by wyjść z widoku kamery + Appuyer sur ESC pour quitter camera + Nyomj ESC-ket a kamerából való kilépéshez + Pressione ESC para sair da câmera + + + Help + Hilfe + Help + Pomoc + Помощь + Help + Pomoc + Aide + Súgó + Ajuda + + + A/D - Cycle zoom + A/D - Zoom + A/D - Cycle zoom + A/D - Změna přiblížení + A/D - Приближение + A/D - Cycle zoom + A/D - powiększenie + A/D - Changement zoom + A/D - Nagyítás + A/D - Troca zoom + + + W/S - Select camera + W/S - Wähle Kamera + W/S - Select camera + W/S - Výběr kamery + W/S - Выбрать камеру + W/S - Select camera + W/S - wybór kamery + W/S - Sélectionner caméra + W/S - Kamera váltás + W/S - Seleciona câmera + + + Left/Right - Rotate camera + Links/Rechts - Rotiere Kamera + Left/Right - Rotate camera + Levá/Pravá - Rotace kamery + Влево/Вправо - Вращать камеру + Left/Right - Rotate camera + Lewo/Prawo - obrót kamery w poziomie + Gauche/Droite - Rotation caméra + Jobb/Bal - Kamera forgatás + Esquerda/Direita - Rotaciona câmera + + + Up/Down - Elevate/lower camera + Hoch/Runter - Neige Kamera + Up/Down - Elevate/lower camera + Nahoru/Dolu - Zvýšít/snížit úhel pohledu kamery + Вверх/Вниз - Поднять/Опустить камеру + Up/Down - Elevate/lower camera + Góra/Dół - obrót kamery w pionie + Haut/Bas - Monter/descendre caméra + Fel/Le - Kamera döntése/süllyesztése + Acima/Abaixo - Eleva/Abaixa a câmera + + + N - Cycle IT modes + N - Sichtmodi + N - Cycle IT modes + N - Změna režimů kamery + N - Режимы камеры + N - Cycle IT modes + N - wybór trybu IT + N - Changement de modes IT + N - Hőkép módok + N - Troca modo IT + + + R - Reset camera + R - Reset + R - Reset camera + R - Reset kamery + R - Сбросить настройки камеры + R - Reset camera + R - resetuj kamerę + R - Reset caméra + R - Kamera visszaállítása + R - Redefine a câmera + + + Esc - Exit help + ESC - Hilfe verlassen + Esc - Exit help + Esc - Ukončit pomoc + Esc - Выйти из помощи + Esc - Exit help + Esc - wyjście z ekranu Pomocy + Esc - Sortir de l'aide + Exit - Kilépés a súgóból + Esc - Sai do Ajuda + + + \ No newline at end of file diff --git a/addons/interact_menu/ACE_Settings.hpp b/addons/interact_menu/ACE_Settings.hpp index 19347b0d6d..e9e16f78f1 100644 --- a/addons/interact_menu/ACE_Settings.hpp +++ b/addons/interact_menu/ACE_Settings.hpp @@ -3,70 +3,77 @@ class ACE_Settings { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorSelfInteraction"; - }; + displayName = CSTRING(AlwaysUseCursorSelfInteraction); + }; class GVAR(cursorKeepCentered) { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_cursorKeepCentered"; - description = "$STR_ACE_Interact_cursorKeepCenteredDescription"; + displayName = CSTRING(cursorKeepCentered); + description = CSTRING(cursorKeepCenteredDescription); }; class GVAR(AlwaysUseCursorInteraction) { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorInteraction"; + displayName = CSTRING(AlwaysUseCursorInteraction); }; class GVAR(UseListMenu) { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_UseListMenu"; + displayName = CSTRING(UseListMenu); }; class GVAR(colorTextMax) { value[] = {1, 1, 1, 1}; typeName = "COLOR"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_ColorTextMax"; + displayName = CSTRING(ColorTextMax); }; class GVAR(colorTextMin) { value[] = {1, 1, 1, 0.25}; typeName = "COLOR"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_ColorTextMin"; + displayName = CSTRING(ColorTextMin); }; class GVAR(colorShadowMax) { value[] = {0, 0, 0, 1}; typeName = "COLOR"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_ColorShadowMax"; + displayName = CSTRING(ColorShadowMax); }; class GVAR(colorShadowMin) { value[] = {0, 0, 0, 0.25}; typeName = "COLOR"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_ColorShadowMin"; + displayName = CSTRING(ColorShadowMin); }; class GVAR(textSize) { value = 2; typeName = "SCALAR"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_textSize"; + displayName = CSTRING(textSize); values[] = {"$str_very_small", "$str_small", "$str_medium", "$str_large", "$str_very_large"}; - }; + }; class GVAR(shadowSetting) { value = 2; typeName = "SCALAR"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_shadowSetting"; - description = "$STR_ACE_Interact_shadowSettingDescription"; - values[] = {"$STR_A3_OPTIONS_DISABLED", "$STR_A3_OPTIONS_ENABLED", "$STR_ACE_Interact_shadowOutline"}; + displayName = CSTRING(shadowSetting); + description = CSTRING(shadowSettingDescription); + values[] = {"$STR_A3_OPTIONS_DISABLED", "$STR_A3_OPTIONS_ENABLED", CSTRING(shadowOutline)}; }; class GVAR(actionOnKeyRelease) { value = 1; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Interact_Menu_ActionOnKeyRelease"; + displayName = CSTRING(ActionOnKeyRelease); + }; + class GVAR(menuBackground) { + value = 0; + typeName = "SCALAR"; + isClientSettable = 1; + displayName = CSTRING(background); + values[] = {"$STR_A3_OPTIONS_DISABLED", CSTRING(backgroundBlur), CSTRING(backgroundBlack)}; }; }; diff --git a/addons/interact_menu/CursorMenus.hpp b/addons/interact_menu/CursorMenus.hpp index 16ced412ec..7705f3fcd2 100644 --- a/addons/interact_menu/CursorMenus.hpp +++ b/addons/interact_menu/CursorMenus.hpp @@ -6,3 +6,36 @@ class GVAR(cursorMenu) { onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(dlgCursorMenu)),_this select 0)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(cursorMenuOpened)),true)]); onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(cursorMenuOpened)),false)]); }; +class RscTitles { + class GVAR(menuBackground) { + idd = -1; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuBackground)),_this select 0)]); + onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuBackground)),displayNull)]); + fadeIn = 0.25; + fadeOut = 0.25; + movingEnable = false; + duration = 10e10; + name = QGVAR(menuBackground); + class controls {}; + class controlsBackground { + class background { + idc = -1; + moving = 0; + font = "TahomaB"; + text = ""; + sizeEx = 0; + lineSpacing = 0; + access = 0; + type = 0; + style = 0; + size = 1; + colorBackground[] = {0, 0, 0, 0.65}; + colorText[] = {0, 0, 0, 0}; + x = "safezoneX"; + y = "safezoneY"; + w = "safezoneW"; + h = "safezoneH"; + }; + }; + }; +}; diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index bbd2b74263..02bc94688c 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -28,19 +28,15 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; }; -["ACE3 Common", QGVAR(InteractKey), (localize "STR_ACE_Interact_Menu_InteractKey"), +["ACE3 Common", QGVAR(InteractKey), (localize LSTRING(InteractKey)), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement [0] call FUNC(keyDown) },{[0,false] call FUNC(keyUp)}, [219, [false, false, false]], false] call cba_fnc_addKeybind; //Left Windows Key -["ACE3 Common", QGVAR(SelfInteractKey), (localize "STR_ACE_Interact_Menu_SelfInteractKey"), +["ACE3 Common", QGVAR(SelfInteractKey), (localize LSTRING(SelfInteractKey)), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement [1] call FUNC(keyDown) },{[1,false] call FUNC(keyUp)}, @@ -62,3 +58,21 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; // disable firing while the interact menu is is is opened ["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventHandler); + +// background options +["interactMenuOpened", { + if (GVAR(menuBackground)==1) then {[QGVAR(menuBackground), true] call EFUNC(common,blurScreen);}; + if (GVAR(menuBackground)==2) then {0 cutRsc[QGVAR(menuBackground), "PLAIN", 1, false];}; +}] call EFUNC(common,addEventHandler); +["interactMenuClosed", { + if (GVAR(menuBackground)==1) then {[QGVAR(menuBackground), false] call EFUNC(common,blurScreen);}; + if (GVAR(menuBackground)==2) then {(uiNamespace getVariable [QGVAR(menuBackground), displayNull]) closeDisplay 0;}; +}] call EFUNC(common,addEventHandler); + +// Let key work with zeus open (not perfect, enables all added hotkeys in zeus interface rather than only menu) +["zeusDisplayChanged",{ + if (_this select 1) then { + (finddisplay 312) displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}]; + (finddisplay 312) displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; + }; +}] call EFUNC(common,addEventHandler); diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index ee0ffe9504..1539f8e2aa 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -6,6 +6,7 @@ PREP(addActionToClass); PREP(addActionToObject); PREP(compileMenu); PREP(compileMenuSelfAction); +PREP(compileMenuZeus); PREP(collectActiveActionTree); PREP(createAction); PREP(ctrlSetParsedTextCached); @@ -45,7 +46,7 @@ GVAR(keyDownSelfAction) = false; GVAR(keyDownTime) = 0; GVAR(openedMenuType) = -1; -GVAR(lastTime) = diag_tickTime; +GVAR(lastTime) = ACE_diagTime; GVAR(rotationAngle) = 0; GVAR(selectedAction) = [[],[]]; @@ -61,8 +62,8 @@ GVAR(lastPath) = []; GVAR(expanded) = false; -GVAR(startHoverTime) = diag_tickTime; -GVAR(expandedTime) = diag_tickTime; +GVAR(startHoverTime) = ACE_diagTime; +GVAR(expandedTime) = ACE_diagTime; GVAR(iconCtrls) = []; GVAR(iconCount) = 0; @@ -70,4 +71,12 @@ GVAR(collectedActionPoints) = []; GVAR(foundActions) = []; GVAR(lastTimeSearchedActions) = -1000; + +// Init CAManBase menus +["CAManBase"] call FUNC(compileMenu); +["CAManBase"] call FUNC(compileMenuSelfAction); + +// Init zeus menu +[] call FUNC(compileMenuZeus); + ADDON = true; diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 7b995375b7..8d68a34268 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -14,10 +14,12 @@ EXPLODE_1_PVT(_this,_target); -private ["_objectType","_actionsVarName"]; +private ["_objectType","_actionsVarName","_isMan"]; _objectType = _target; +_isMan = false; if (typeName _target == "OBJECT") then { _objectType = typeOf _target; + _isMan = _target isKindOf "CAManBase"; }; _actionsVarName = format [QGVAR(Act_%1), _objectType]; @@ -26,12 +28,12 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { - private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_position", "_condition", "_showDisabled", "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction", "_i"]; + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_position", "_condition", "_showDisabled", "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; - for "_i" from 0 to (count _actionsCfg) - 1 do { - _entryCfg = _actionsCfg select _i; + { + _entryCfg = _x; if(isClass _entryCfg) then { _displayName = getText (_entryCfg >> "displayName"); _distance = getNumber (_entryCfg >> "distance"); @@ -67,7 +69,12 @@ _recurseFnc = { _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; _canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0; - _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; + _runOnHover = false; + if (isText (_entryCfg >> "runOnHover")) then { + _runOnHover = compile getText (_entryCfg >> "runOnHover"); + } else { + _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; + }; _condition = compile _condition; _children = [_entryCfg] call _recurseFnc; @@ -90,14 +97,20 @@ _recurseFnc = { ]; _actions pushBack _entry; }; - }; + } forEach (configProperties [_actionsCfg, "isClass _x", true]); _actions }; -private "_actionsCfg"; +private ["_actionsCfg","_actions"]; _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; -missionNamespace setVariable [_actionsVarName, [_actionsCfg] call _recurseFnc]; +// If the classname inherits from CAManBase, just copy it's menu without recompiling a new one +_actions = if (_isMan) then { + + (missionNamespace getVariable QGVAR(Act_CAManBase)) +} else { + [_actionsCfg] call _recurseFnc +}; +missionNamespace setVariable [_actionsVarName, _actions]; /* [ diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index e767c3525d..27f841c505 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -14,10 +14,12 @@ EXPLODE_1_PVT(_this,_target); -private ["_objectType","_actionsVarName", "_canCollapse", "_children", "_enableInside", "_entry", "_entryCfg", "_i", "_insertChildren", "_modifierFunction", "_runOnHover"]; +private ["_objectType","_actionsVarName","_isMan"]; _objectType = _target; +_isMan = false; if (typeName _target == "OBJECT") then { _objectType = typeOf _target; + _isMan = _target isKindOf "CAManBase"; }; _actionsVarName = format [QGVAR(SelfAct_%1), _objectType]; @@ -31,8 +33,8 @@ _recurseFnc = { EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; - for "_i" from 0 to (count _actionsCfg) - 1 do { - _entryCfg = _actionsCfg select _i; + { + _entryCfg = _x; if(isClass _entryCfg) then { _displayName = getText (_entryCfg >> "displayName"); @@ -51,7 +53,12 @@ _recurseFnc = { _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; _canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0; - _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; + _runOnHover = true; + if (isText (_entryCfg >> "runOnHover")) then { + _runOnHover = compile getText (_entryCfg >> "runOnHover"); + } else { + _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; + }; _condition = compile _condition; _children = [_entryCfg] call _recurseFnc; @@ -74,23 +81,23 @@ _recurseFnc = { ]; _actions pushBack _entry; }; - }; + } forEach (configProperties [_actionsCfg, "isClass _x", true]); _actions }; -private "_actionsCfg"; +private ["_actionsCfg","_actions"]; _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; private ["_baseDisplayName", "_baseIcon"]; _baseDisplayName = ""; _baseIcon = ""; if (_objectType isKindOf "CAManBase") then { - _baseDisplayName = localize "STR_ACE_Interact_Menu_SelfActionsRoot"; + _baseDisplayName = localize LSTRING(SelfActionsRoot); _baseIcon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; } else { _baseDisplayName = getText (configFile >> "CfgVehicles" >> _objectType >> "displayName"); //Alt would be to just use a static text, if veh names end up being too long: - // _baseDisplayName = localize "STR_ACE_Interact_Menu_VehicleActionsRoot"; + // _baseDisplayName = localize LSTRING(VehicleActionsRoot); //Pull the icon from the vehicle's config: _baseIcon = getText (configFile >> "CfgVehicles" >> _objectType >> "Icon"); @@ -100,26 +107,31 @@ if (_objectType isKindOf "CAManBase") then { }; }; -// Create a master action to base on self action -_actions = [ +// If the classname inherits from CAManBase, just copy it's menu without recompiling a new one +_actions = if (_isMan) then { + + (missionNamespace getVariable QGVAR(SelfAct_CAManBase)) +} else { + // Create a master action to base on self action [ [ - "ACE_SelfActions", - _baseDisplayName, - _baseIcon, - { - // Dummy statement so it's not collapsed when there's no available actions - true - }, - {[ACE_player, _target, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering"]] call EFUNC(common,canInteractWith)}, - {}, - {}, - "Spine3", - 10, - [false,true,false] - ], - [_actionsCfg] call _recurseFnc + [ + "ACE_SelfActions", + _baseDisplayName, + _baseIcon, + { + // Dummy statement so it's not collapsed when there's no available actions + true + }, + {[ACE_player, _target, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting"]] call EFUNC(common,canInteractWith)}, + {}, + {}, + "Spine3", + 10, + [false,true,false] + ], + [_actionsCfg] call _recurseFnc + ] ] -]; +}; missionNamespace setVariable [_actionsVarName, _actions]; diff --git a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf new file mode 100644 index 0000000000..9dc212ac40 --- /dev/null +++ b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf @@ -0,0 +1,94 @@ +/* + * Author: SilentSpike + * Compile the zeus action menu (only to be done once) + * + * Argument: + * nil + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp"; + +// Exit if the action menu is already compiled for zeus +if !(isNil {missionNamespace getVariable [QGVAR(ZeusActions), nil]}) exitWith {}; + +private "_recurseFnc"; +_recurseFnc = { + private ["_actions", "_displayName", "_icon", "_statement", "_condition", "_showDisabled", + "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; + EXPLODE_1_PVT(_this,_actionsCfg); + _actions = []; + + { + _entryCfg = _x; + if(isClass _entryCfg) then { + _displayName = getText (_entryCfg >> "displayName"); + + _icon = getText (_entryCfg >> "icon"); + _statement = compile (getText (_entryCfg >> "statement")); + + _condition = getText (_entryCfg >> "condition"); + if (_condition == "") then {_condition = "true"}; + + _insertChildren = compile (getText (_entryCfg >> "insertChildren")); + _modifierFunction = compile (getText (_entryCfg >> "modifierFunction")); + + _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; + _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; + _canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0; + _runOnHover = true; + if (isText (_entryCfg >> "runOnHover")) then { + _runOnHover = compile getText (_entryCfg >> "runOnHover"); + } else { + _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; + }; + + _condition = compile _condition; + _children = [_entryCfg] call _recurseFnc; + + _entry = [ + [ + configName _entryCfg, + _displayName, + _icon, + _statement, + _condition, + _insertChildren, + {}, + [0,0,0], + 10, //distace + [_showDisabled,_enableInside,_canCollapse,_runOnHover], + _modifierFunction + ], + _children + ]; + _actions pushBack _entry; + }; + } forEach (configProperties [_actionsCfg, "isClass _x", true]); + _actions +}; + +private ["_actionsCfg"]; +_actionsCfg = configFile >> "ACE_ZeusActions"; + +// Create a master action to base zeus actions on +GVAR(ZeusActions) = [ + [ + [ + "ACE_ZeusActions", + localize LSTRING(ZeusActionsRoot), + "\A3\Ui_F_Curator\Data\Logos\arma3_zeus_icon_ca.paa", + {true}, + {true}, + {}, + {}, + {[0,0,0]}, + 10, + [false,true,false] + ], + [_actionsCfg] call _recurseFnc + ] +]; diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 5976b99223..5bf156b69e 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -16,6 +16,11 @@ EXPLODE_1_PVT(_this,_menuType); if (GVAR(openedMenuType) == _menuType) exitWith {true}; +// Conditions: canInteract (these don't apply to zeus) +if ((isNull curatorCamera) && { + !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting"]] call EFUNC(common,canInteractWith)) +}) exitWith {false}; + while {dialog} do { closeDialog 0; }; @@ -27,13 +32,14 @@ if (_menuType == 0) then { GVAR(keyDown) = false; GVAR(keyDownSelfAction) = true; }; -GVAR(keyDownTime) = diag_tickTime; +GVAR(keyDownTime) = ACE_diagTime; GVAR(openedMenuType) = _menuType; GVAR(lastTimeSearchedActions) = -1000; GVAR(ParsedTextCached) = []; GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) || visibleMap || + (!isNull curatorCamera) || {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}} || {(_menuType == 0) && GVAR(AlwaysUseCursorInteraction)}; @@ -46,7 +52,12 @@ for "_i" from 0 to (count GVAR(iconCtrls))-1 do { GVAR(iconCtrls) resize GVAR(iconCount); if (GVAR(useCursorMenu)) then { - (findDisplay 46) createDisplay QGVAR(cursorMenu); //"RscCinemaBorder";// + // Don't close zeus interface if open + if (isNull curatorCamera) then { + (findDisplay 46) createDisplay QGVAR(cursorMenu); //"RscCinemaBorder";// + } else { + createDialog QGVAR(cursorMenu); + }; (finddisplay 91919) displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}]; (finddisplay 91919) displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; // The dialog sets: diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 6f1d00276f..02e2d4db01 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -46,6 +46,8 @@ if(GVAR(actionSelected)) then { }; }; +["interactMenuClosed", [GVAR(openedMenuType)]] call EFUNC(common,localEvent); + GVAR(keyDown) = false; GVAR(keyDownSelfAction) = false; GVAR(openedMenuType) = -1; @@ -54,6 +56,4 @@ GVAR(expanded) = false; GVAR(lastPath) = []; GVAR(menuDepthPath) = []; -["interactMenuClosed", [GVAR(openedMenuType)]] call EFUNC(common,localEvent); - true diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 06c155ac54..55ca280c43 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -48,7 +48,7 @@ if (GVAR(openedMenuType) >= 0) then { _closest = GVAR(currentOptions) select _closestSelection; _sPos = _closest select 1; - _cTime = diag_tickTime; + _cTime = ACE_diagTime; _delta = _cTime - GVAR(lastTime); GVAR(lastTime) = _cTime; @@ -73,23 +73,33 @@ if (GVAR(openedMenuType) >= 0) then { } forEach GVAR(lastPath); }; - if(_misMatch && {diag_tickTime-GVAR(expandedTime) > 0.25}) then { - GVAR(startHoverTime) = diag_tickTime; + if(_misMatch && {ACE_diagTime-GVAR(expandedTime) > 0.25}) then { + GVAR(startHoverTime) = ACE_diagTime; GVAR(lastPath) = _hoverPath; GVAR(expanded) = false; } else { - if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { + if(!GVAR(expanded) && ACE_diagTime-GVAR(startHoverTime) > 0.25) then { GVAR(expanded) = true; // Start the expanding menu animation only if the user is not going up the menu if !([GVAR(menuDepthPath),GVAR(lastPath)] call FUNC(isSubPath)) then { - GVAR(expandedTime) = diag_tickTime; + GVAR(expandedTime) = ACE_diagTime; }; GVAR(menuDepthPath) = +GVAR(lastPath); // Execute the current action if it's run on hover private "_runOnHover"; - _runOnHover = ((GVAR(selectedAction) select 0) select 9) select 3; + _tmp = ((GVAR(selectedAction) select 0) select 9) select 3; + _runOnHover = true; + if ((typeName _tmp) == "CODE" ) then { + _runOnHover = call _tmp; + } else { + if ((typeName _tmp) == "BOOL" ) then { + _runOnHover = _tmp; + } else { + _runOnHover = _tmp > 0; + }; + }; if (_runOnHover) then { this = GVAR(selectedTarget); _player = ACE_Player; diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index 0f4f17c017..8ca7f8aa33 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -25,7 +25,7 @@ _fnc_renderNearbyActions = { #define MAXINTERACTOBJECTS 3 GVAR(foundActions) = []; - GVAR(lastTimeSearchedActions) = diag_tickTime; + GVAR(lastTimeSearchedActions) = ACE_diagTime; _numInteractObjects = 0; _nearestObjects = nearestObjects [ACE_player, ["All"], 13]; @@ -118,24 +118,35 @@ _fnc_renderSelfActions = { } forEach _classActions; }; +_fnc_renderZeusActions = { + { + _action = _x; + [_this, _action, [0.5, 0.5]] call FUNC(renderBaseMenu); + } forEach GVAR(ZeusActions); +}; + GVAR(collectedActionPoints) resize 0; // Render nearby actions, unit self actions or vehicle self actions as appropiate if (GVAR(openedMenuType) == 0) then { - - if (vehicle ACE_player == ACE_player) then { - if (diag_tickTime > GVAR(lastTimeSearchedActions) + 0.20) then { - // Once every 0.2 secs, collect nearby objects active and visible action points and render them - call _fnc_renderNearbyActions; + if (isNull curatorCamera) then { + if (vehicle ACE_player == ACE_player) then { + if (ACE_diagTime > GVAR(lastTimeSearchedActions) + 0.20) then { + // Once every 0.2 secs, collect nearby objects active and visible action points and render them + call _fnc_renderNearbyActions; + } else { + // The rest of the frames just draw the same action points rendered the last frame + call _fnc_renderLastFrameActions; + }; } else { - // The rest of the frames just draw the same action points rendered the last frame - call _fnc_renderLastFrameActions; + // Render vehicle self actions when in vehicle + (vehicle ACE_player) call _fnc_renderSelfActions; }; } else { - (vehicle ACE_player) call _fnc_renderSelfActions; + // Render zeus actions when zeus open + (getAssignedCuratorLogic player) call _fnc_renderZeusActions; }; - } else { ACE_player call _fnc_renderSelfActions; }; diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 5ee698b547..a844930a7c 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -36,7 +36,7 @@ _pos = if((count _this) > 2) then { }; // For non-self actions, exit if the action is too far away or ocluded -if (GVAR(openedMenuType) == 0 && vehicle ACE_player == ACE_player && +if (GVAR(openedMenuType) == 0 && (vehicle ACE_player == ACE_player) && (isNull curatorCamera) && { private ["_headPos","_actualDistance"]; _headPos = ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot"); diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 84c7799684..a82b82dcb7 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -102,8 +102,8 @@ if (GVAR(UseListMenu)) then { // Animate menu scale if (_menuInSelectedPath && (_menuDepth == count _path)) then { - _scaleX = _scaleX * (0.3 + 0.7 * (((diag_tickTime - GVAR(expandedTime)) * 8) min 1)); - _scaleY = _scaleY * (0.3 + 0.7 * (((diag_tickTime - GVAR(expandedTime)) * 8) min 1)); + _scaleX = _scaleX * (0.3 + 0.7 * (((ACE_diagTime - GVAR(expandedTime)) * 8) min 1)); + _scaleY = _scaleY * (0.3 + 0.7 * (((ACE_diagTime - GVAR(expandedTime)) * 8) min 1)); }; _target = _actionObject; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 8f60fa6879..054f17512c 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -85,6 +85,9 @@ Interazioni con veicoli Ações de Veículos + + Zeus Actions + Interaction - Text Max Interakcja - Tekst max @@ -133,7 +136,7 @@ Cselekvés - Árnyék min. Interação - Min. de Sombra - + Keep cursor centered Garder le curseur au centre Центрировать курсор @@ -145,7 +148,7 @@ Manter o cursor centralizado Mantieni il cursore centrato - + Keeps cursor centered and pans the option menu around. Useful if screen size is limited. Udržuje kurzor na středu. Užitečné, pokud je velikost obrazovky omezena. Garde le curseur au milieu et dispose le menu des options autour. Utile si la taille de l'écran est limitée. @@ -169,7 +172,7 @@ Cselekvés végrehajtása a menügomb elengedésekor Esegui l'azione quando rilasci il tasto menu - + Interaction Text Size Velikost textu interakce Menü-Schriftgröße @@ -181,7 +184,7 @@ Cselekvő szöveg mérete Dimensione del testo d'interazione - + Interaction Text Shadow Stín textu interakce Menü-Hintergrundschatten @@ -193,7 +196,7 @@ Cselekvő szöveg árnyéka Ombra del testo d'interazione - + Allows controlling the text's shadow. Outline ignores custom shadow colors. Umožňuje změnit stíny textu v menu interakce. Barva stínu je u tahu písma ignorována. Stellt den Hintergrundschatten ein. Die Einstellung 'Kontur' ignoriert die Farbe des Schattens. @@ -205,7 +208,7 @@ Hozzáférést biztosít a szöveg árnyékának kezeléséhez. A körvonal nem veszi figyelembe az egyedi árnyékszíneket. Permette di controllare l'ombra del testo. L'impostazione "Contorno" ignora il colore dell'ombra. - + Outline Kontura Kontur @@ -217,5 +220,33 @@ Körvonal Contorno + + Interaction menu background + Tło menu interakcji + Fondo del menú de interacción + Pozadí menu interakce + Fundo do menu de interação + + + Blur the background while the interaction menu is open. + Rozmywa lub przyciemnia tło na czas otwarcia menu interakcji + Desenfocar el fondo mientras el menú de interacción está abierto. + Rozmazat obraz pokud je interakční menu otevřené. + Desfocar o fundo enquanto o menu de interação está aberto. + + + Blur screen + Rozmycie ekranu + Pantalla de desenfoque + Rozmazaný obraz + Desfoque de tela + + + Black + Przyciemnienie ekranu + Negra + Černý obraz + Preto + diff --git a/addons/interaction/ACE_ZeusActions.hpp b/addons/interaction/ACE_ZeusActions.hpp new file mode 100644 index 0000000000..913e7a7c85 --- /dev/null +++ b/addons/interaction/ACE_ZeusActions.hpp @@ -0,0 +1,268 @@ +class ACE_ZeusActions { + // _target = curatorLogic + // curatorSelected = [objects,groups,waypoints,markers] + class ZeusUnits { + displayName = "$STR_A3_RscDisplayCurator_ModeUnits_tooltip"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeUnits_ca.paa"; + + class stance { + displayName = "$STR_A3_RscAttributeUnitPos_Title"; + + class limited { + displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; + statement = "{_x setUnitPos 'DOWN';} forEach (curatorSelected select 0);"; + }; + class normal { + displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; + statement = "{_x setUnitPos 'MIDDLE';} forEach (curatorSelected select 0);"; + }; + class full { + displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; + statement = "{_x setUnitPos 'UP';} forEach (curatorSelected select 0);"; + }; + class auto { + displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; + icon = "\A3\UI_F_Curator\Data\default_ca.paa"; + statement = "{_x setUnitPos 'AUTO';} forEach (curatorSelected select 0);"; + }; + }; + class remoteControl { + displayName = "$STR_A3_CfgVehicles_ModuleRemoteControl_F"; + icon = "\A3\Modules_F_Curator\Data\portraitRemoteControl_ca.paa"; + statement = "_unit = objNull; { if ((side _x in [east,west,resistance,civilian]) && !(isPlayer _x)) exitWith { _unit = _x; }; } forEach (curatorSelected select 0); bis_fnc_curatorObjectPlaced_mouseOver = ['OBJECT',_unit]; (group _target) createUnit ['ModuleRemoteControl_F',[0,0,0],[],0,''];"; + }; + }; + class ZeusGroups { + displayName = "$STR_A3_RscDisplayCurator_ModeGroups_tooltip"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeGroups_ca.paa"; + + class behaviour { + displayName = CSTRING(Zeus_Behaviour); + + class careless { + displayName = CSTRING(Zeus_Behaviour_careless); + statement = "{ _x setBehaviour 'CARELESS'; } forEach (curatorSelected select 1);"; + }; + class safe { + displayName = "$STR_safe"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; + statement = "{ _x setBehaviour 'SAFE'; } forEach (curatorSelected select 1);"; + }; + class aware { + displayName = "$STR_aware"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; + statement = "{ _x setBehaviour 'AWARE'; } forEach (curatorSelected select 1);"; + }; + class combat { + displayName = "$STR_combat"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; + statement = "{ _x setBehaviour 'COMBAT'; } forEach (curatorSelected select 1);"; + }; + class stealth { + displayName = "$STR_stealth"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; + statement = "{ _x setBehaviour 'STEALTH'; } forEach (curatorSelected select 1);"; + }; + }; + class speed { + displayName = CSTRING(Zeus_Speed); + + class limited { + displayName = "$STR_speed_limited"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; + statement = "{_x setSpeedMode 'LIMITED';} forEach (curatorSelected select 1);"; + }; + class normal { + displayName = "$STR_speed_normal"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; + statement = "{_x setSpeedMode 'NORMAL';} forEach (curatorSelected select 1);"; + }; + class full { + displayName = "$STR_speed_full"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; + statement = "{_x setSpeedMode 'FULL';} forEach (curatorSelected select 1);"; + }; + }; + class stance { + displayName = "$STR_A3_RscAttributeUnitPos_Title"; + + class limited { + displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; + statement = "{ {_x setUnitPos 'DOWN'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + class normal { + displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; + statement = "{ {_x setUnitPos 'MIDDLE'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + class full { + displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; + statement = "{ {_x setUnitPos 'UP'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + class auto { + displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; + icon = "\A3\UI_F_Curator\Data\default_ca.paa"; + statement = "{ {_x setUnitPos 'AUTO'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + }; + class formation { + displayName = CSTRING(Zeus_Formation); + + class wedge { + displayName = "$STR_wedge"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; + statement = "{_x setFormation 'WEDGE';} forEach (curatorSelected select 1);"; + }; + class vee { + displayName = "$STR_vee"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; + statement = "{_x setFormation 'VEE';} forEach (curatorSelected select 1);"; + }; + class line { + displayName = "$STR_line"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; + statement = "{_x setFormation 'LINE';} forEach (curatorSelected select 1);"; + }; + class column { + displayName = "$STR_column"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; + statement = "{_x setFormation 'COLUMN';} forEach (curatorSelected select 1);"; + }; + class file { + displayName = "$STR_file"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; + statement = "{_x setFormation 'FILE';} forEach (curatorSelected select 1);"; + }; + class stag_column { + displayName = "$STR_staggered"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; + statement = "{_x setFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; + }; + class ech_left { + displayName = "$STR_echl"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; + statement = "{_x setFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; + }; + class ech_right { + displayName = "$STR_echr"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; + statement = "{_x setFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; + }; + class diamond { + displayName = "$STR_diamond"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; + statement = "{_x setFormation 'DIAMOND';} forEach (curatorSelected select 1);"; + }; + }; + }; + class ZeusWaypoints { + displayName = "Waypoints"; + icon = "\A3\UI_F_Curator\Data\CfgCurator\waypoint_ca.paa"; + + class behaviour { + displayName = CSTRING(Zeus_Behaviour); + + class careless { + displayName = CSTRING(Zeus_Behaviour_careless); + statement = "{ _x setWaypointBehaviour 'CARELESS'; } forEach (curatorSelected select 2);"; + }; + class safe { + displayName = "$STR_safe"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; + statement = "{ _x setWaypointBehaviour 'SAFE'; } forEach (curatorSelected select 2);"; + }; + class aware { + displayName = "$STR_aware"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; + statement = "{ _x setWaypointBehaviour 'AWARE'; } forEach (curatorSelected select 2);"; + }; + class combat { + displayName = "$STR_combat"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; + statement = "{ _x setWaypointBehaviour 'COMBAT'; } forEach (curatorSelected select 2);"; + }; + class stealth { + displayName = "$STR_stealth"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; + statement = "{ _x setWaypointBehaviour 'STEALTH'; } forEach (curatorSelected select 2);"; + }; + }; + class speed { + displayName = CSTRING(Zeus_Speed); + + class limited { + displayName = "$STR_speed_limited"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; + statement = "{ _x setWaypointSpeed 'LIMITED'; } forEach (curatorSelected select 2);"; + }; + class normal { + displayName = "$STR_speed_normal"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; + statement = "{ _x setWaypointSpeed 'NORMAL'; } forEach (curatorSelected select 2);"; + }; + class full { + displayName = "$STR_speed_full"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; + statement = "{ _x setWaypointSpeed 'FULL'; } forEach (curatorSelected select 2);"; + }; + }; + class formation { + displayName = CSTRING(Zeus_Formation); + + class wedge { + displayName = "$STR_wedge"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; + statement = "{_x setWaypointFormation 'WEDGE';} forEach (curatorSelected select 1);"; + }; + class vee { + displayName = "$STR_vee"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; + statement = "{_x setWaypointFormation 'VEE';} forEach (curatorSelected select 1);"; + }; + class line { + displayName = "$STR_line"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; + statement = "{_x setWaypointFormation 'LINE';} forEach (curatorSelected select 1);"; + }; + class column { + displayName = "$STR_column"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; + statement = "{_x setWaypointFormation 'COLUMN';} forEach (curatorSelected select 1);"; + }; + class file { + displayName = "$STR_file"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; + statement = "{_x setWaypointFormation 'FILE';} forEach (curatorSelected select 1);"; + }; + class stag_column { + displayName = "$STR_staggered"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; + statement = "{_x setWaypointFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; + }; + class ech_left { + displayName = "$STR_echl"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; + statement = "{_x setWaypointFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; + }; + class ech_right { + displayName = "$STR_echr"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; + statement = "{_x setWaypointFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; + }; + class diamond { + displayName = "$STR_diamond"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; + statement = "{_x setWaypointFormation 'DIAMOND';} forEach (curatorSelected select 1);"; + }; + }; + }; + class ZeusMarkers { + displayName = "$STR_A3_RscDisplayCurator_ModeMarkers_tooltip"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeMarkers_ca.paa"; + }; +}; diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 804aba1100..9e9dc4bc76 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -1,24 +1,23 @@ class CfgVehicles { - - class Module_F; - class ACE_ModuleInteraction: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class ACE_ModuleInteraction: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_InteractionSystem_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = "ACE_Interaction_fnc_moduleInteraction"; scope = 2; isGlobal = 1; icon = PATHTOF(UI\Icon_Module_Interaction_ca.paa); class Arguments { class EnableTeamManagement { - displayName = "$STR_ACE_InteractionSystem_EnableTeamManagement_DisplayName"; - description = "$STR_ACE_InteractionSystem_EnableTeamManagement_Description"; + displayName = CSTRING(EnableTeamManagement_DisplayName); + description = CSTRING(EnableTeamManagement_Description); typeName = "BOOL"; defaultValue = 1; }; }; class ModuleDescription { - description = "$STR_ACE_InteractionSystem_Module_Description"; + description = CSTRING(Module_Description); }; }; @@ -26,7 +25,7 @@ class CfgVehicles { class CAManBase: Man { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); distance = 4; condition = QUOTE(true); statement = ""; @@ -34,7 +33,7 @@ class CfgVehicles { selection = "pelvis"; class ACE_TeamManagement { - displayName = "$STR_ACE_Interaction_TeamManagement"; + displayName = CSTRING(TeamManagement); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {GVAR(EnableTeamManagement)}); statement = ""; showDisabled = 0; @@ -43,7 +42,7 @@ class CfgVehicles { hotkey = "M"; class ACE_AssignTeamRed { - displayName = "$STR_ACE_Interaction_AssignTeamRed"; + displayName = CSTRING(AssignTeamRed); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam)); showDisabled = 1; @@ -52,7 +51,7 @@ class CfgVehicles { hotkey = "R"; }; class ACE_AssignTeamGreen { - displayName = "$STR_ACE_Interaction_AssignTeamGreen"; + displayName = CSTRING(AssignTeamGreen); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam)); showDisabled = 1; @@ -61,7 +60,7 @@ class CfgVehicles { hotkey = "G"; }; class ACE_AssignTeamBlue { - displayName = "$STR_ACE_Interaction_AssignTeamBlue"; + displayName = CSTRING(AssignTeamBlue); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam)); showDisabled = 1; @@ -70,7 +69,7 @@ class CfgVehicles { hotkey = "B"; }; class ACE_AssignTeamYellow { - displayName = "$STR_ACE_Interaction_AssignTeamYellow"; + displayName = CSTRING(AssignTeamYellow); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam)); showDisabled = 1; @@ -80,7 +79,7 @@ class CfgVehicles { }; class ACE_UnassignTeam { - displayName = "$STR_ACE_Interaction_LeaveTeam"; + displayName = CSTRING(LeaveTeam); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _target != 'MAIN'}); statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam)); showDisabled = 1; @@ -91,7 +90,7 @@ class CfgVehicles { }; class ACE_JoinGroup { - displayName = "$STR_ACE_Interaction_JoinGroup"; + displayName = CSTRING(JoinGroup); condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinGroup)); statement = QUOTE([_player] joinSilent group _target); showDisabled = 0; @@ -101,21 +100,21 @@ class CfgVehicles { }; class ACE_GetDown { - displayName = "$STR_ACE_Interaction_GetDown"; + displayName = CSTRING(GetDown); condition = QUOTE([_target] call DFUNC(canInteractWithCivilian)); statement = QUOTE([_target] call DFUNC(getDown)); showDisabled = 0; priority = 2.2; }; class ACE_SendAway { - displayName = "$STR_ACE_Interaction_SendAway"; + displayName = CSTRING(SendAway); condition = QUOTE([_target] call DFUNC(canInteractWithCivilian)); statement = QUOTE([_target] call DFUNC(sendAway)); showDisabled = 0; priority = 2.0; }; class ACE_Pardon { - displayName = "$STR_ACE_Interaction_Pardon"; + displayName = CSTRING(Pardon); condition = QUOTE(rating _target < -2000 && {alive _target} && {side group _player == side group _target}); statement = QUOTE([ARR_3(_target,'{_this addRating -rating _this}',_target)] call DEFUNC(common,execRemoteFnc)); showDisabled = 0; @@ -123,49 +122,49 @@ class CfgVehicles { }; }; class ACE_Torso { - displayName = "$STR_ACE_Interaction_Torso"; + displayName = CSTRING(Torso); selection = "spine3"; distance = 1.50; condition = ""; statement = ""; }; class ACE_Head { - displayName = "$STR_ACE_Interaction_Head"; + displayName = CSTRING(Head); selection = "pilot"; distance = 1.50; condition = ""; statement = ""; }; class ACE_ArmLeft { - displayName = "$STR_ACE_Interaction_ArmLeft"; + displayName = CSTRING(ArmLeft); selection = "LeftForeArm"; distance = 1.50; condition = ""; statement = ""; }; class ACE_ArmRight { - displayName = "$STR_ACE_Interaction_ArmRight"; + displayName = CSTRING(ArmRight); selection = "RightForeArm"; distance = 1.50; condition = ""; statement = ""; }; class ACE_LegLeft { - displayName = "$STR_ACE_Interaction_LegLeft"; + displayName = CSTRING(LegLeft); selection = "LKnee"; distance = 1.50; condition = ""; statement = ""; }; class ACE_LegRight { - displayName = "$STR_ACE_Interaction_LegRight"; + displayName = CSTRING(LegRight); selection = "RKnee"; distance = 1.50; condition = ""; statement = ""; }; class ACE_Weapon { - displayName = "$STR_ACE_Interaction_Weapon"; + displayName = CSTRING(Weapon); position = QUOTE(call FUNC(getWeaponPos)); distance = 1.50; condition = ""; @@ -173,14 +172,14 @@ class CfgVehicles { }; class ACE_TapShoulderRight { - displayName = "$STR_ACE_Interaction_TapShoulder"; + displayName = CSTRING(TapShoulder); selection = "rightshoulder"; distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); statement = QUOTE([ARR_3(_player, _target, 0)] call DFUNC(tapShoulder)); }; class ACE_TapShoulderLeft { - displayName = "$STR_ACE_Interaction_TapShoulder"; + displayName = CSTRING(TapShoulder); selection = "leftshoulder"; distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); @@ -190,9 +189,9 @@ class CfgVehicles { class ACE_SelfActions { class ACE_TeamManagement { - displayName = "$STR_ACE_Interaction_TeamManagement"; + displayName = CSTRING(TeamManagement); condition = QUOTE(GVAR(EnableTeamManagement)); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = ""; showDisabled = 1; priority = 3.2; @@ -200,9 +199,9 @@ class CfgVehicles { hotkey = "M"; class ACE_JoinTeamRed { - displayName = "$STR_ACE_Interaction_JoinTeamRed"; + displayName = CSTRING(JoinTeamRed); condition = QUOTE(true); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_2(_player,'RED')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.4; @@ -210,9 +209,9 @@ class CfgVehicles { hotkey = "R"; }; class ACE_JoinTeamGreen { - displayName = "$STR_ACE_Interaction_JoinTeamGreen"; + displayName = CSTRING(JoinTeamGreen); condition = QUOTE(true); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_2(_player,'GREEN')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.3; @@ -220,9 +219,9 @@ class CfgVehicles { hotkey = "G"; }; class ACE_JoinTeamBlue { - displayName = "$STR_ACE_Interaction_JoinTeamBlue"; + displayName = CSTRING(JoinTeamBlue); condition = QUOTE(true); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_2(_player,'BLUE')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.2; @@ -230,9 +229,9 @@ class CfgVehicles { hotkey = "B"; }; class ACE_JoinTeamYellow { - displayName = "$STR_ACE_Interaction_JoinTeamYellow"; + displayName = CSTRING(JoinTeamYellow); condition = QUOTE(true); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_2(_player,'YELLOW')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.1; @@ -241,9 +240,9 @@ class CfgVehicles { }; class ACE_LeaveTeam { - displayName = "$STR_ACE_Interaction_LeaveTeam"; + displayName = CSTRING(LeaveTeam); condition = QUOTE(assignedTeam _player != 'MAIN'); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_2(_player,'MAIN')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.5; @@ -251,9 +250,9 @@ class CfgVehicles { hotkey = "N"; }; class ACE_BecomeLeader { - displayName = "$STR_ACE_Interaction_BecomeLeader"; + displayName = CSTRING(BecomeLeader); condition = QUOTE(_this call DFUNC(canBecomeLeader)); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE(_this call DFUNC(doBecomeLeader)); showDisabled = 1; priority = 1.0; @@ -261,9 +260,9 @@ class CfgVehicles { hotkey = "L"; }; class ACE_LeaveGroup { - displayName = "$STR_ACE_Interaction_LeaveGroup"; + displayName = CSTRING(LeaveGroup); condition = QUOTE(count (units group _player) > 1); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE(_oldGroup = units group _player; _newGroup = createGroup side _player; [_player] joinSilent _newGroup; {_player reveal _x} forEach _oldGroup;); showDisabled = 1; priority = 1.2; @@ -273,7 +272,7 @@ class CfgVehicles { }; class ACE_Gestures { - displayName = "$STR_ACE_Interaction_Gestures"; + displayName = CSTRING(Gestures); condition = "canStand _target"; statement = ""; showDisabled = 1; @@ -282,14 +281,14 @@ class CfgVehicles { hotkey = "G"; /*class ACE_Gesture_Advance { - displayName = "$STR_ACE_Interaction_Gestures_Attack"; + displayName = CSTRING(Gestures_Attack); condition = "canStand _target"; statement = "_target playActionNow 'gestureAttack';"; showDisabled = 1; priority = 2.0; };*/ class ACE_Gesture_Advance { - displayName = "$STR_ACE_Interaction_Gestures_Advance"; + displayName = CSTRING(Gestures_Advance); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gestureAdvance';); showDisabled = 1; @@ -297,7 +296,7 @@ class CfgVehicles { hotkey = "1"; }; class ACE_Gesture_Go { - displayName = "$STR_ACE_Interaction_Gestures_Go"; + displayName = CSTRING(Gestures_Go); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow ([ARR_2('gestureGo','gestureGoB')] select floor random 2);); showDisabled = 1; @@ -305,7 +304,7 @@ class CfgVehicles { hotkey = "2"; }; class ACE_Gesture_Follow { - displayName = "$STR_ACE_Interaction_Gestures_Follow"; + displayName = CSTRING(Gestures_Follow); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gestureFollow';); showDisabled = 1; @@ -313,14 +312,14 @@ class CfgVehicles { hotkey = "3"; }; /*class ACE_Gesture_Point { - displayName = "$STR_ACE_Interaction_Gestures_Point"; + displayName = CSTRING(Gestures_Point); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gesturePoint';); showDisabled = 1; priority = 1.6; };*/ class ACE_Gesture_Up { - displayName = "$STR_ACE_Interaction_Gestures_Up"; + displayName = CSTRING(Gestures_Up); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gestureUp';); showDisabled = 1; @@ -328,7 +327,7 @@ class CfgVehicles { hotkey = "4"; }; class ACE_Gesture_Cover { - displayName = "$STR_ACE_Interaction_Gestures_Cover"; + displayName = CSTRING(Gestures_Cover); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gestureCover';); showDisabled = 1; @@ -336,7 +335,7 @@ class CfgVehicles { hotkey = "5"; }; class ACE_Gesture_CeaseFire { - displayName = "$STR_ACE_Interaction_Gestures_Cease_Fire"; + displayName = CSTRING(Gestures_Cease_Fire); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gestureCeaseFire';); showDisabled = 1; @@ -344,7 +343,7 @@ class CfgVehicles { hotkey = "6"; }; class ACE_Gesture_Freeze { - displayName = "$STR_ACE_Interaction_Gestures_Freeze"; + displayName = CSTRING(Gestures_Freeze); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gestureFreeze';); showDisabled = 1; @@ -352,7 +351,7 @@ class CfgVehicles { hotkey = "7"; }; class ACE_Gesture_Yes { - displayName = "$STR_ACE_Interaction_Gestures_Yes"; + displayName = CSTRING(Gestures_Yes); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow ([ARR_2('gestureYes','gestureNod')] select floor random 2);); showDisabled = 1; @@ -360,7 +359,7 @@ class CfgVehicles { hotkey = "8"; }; class ACE_Gesture_No { - displayName = "$STR_ACE_Interaction_Gestures_No"; + displayName = CSTRING(Gestures_No); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow 'gestureNo';); showDisabled = 1; @@ -368,7 +367,7 @@ class CfgVehicles { hotkey = "9"; }; class ACE_Gesture_Hi { - displayName = "$STR_ACE_Interaction_Gestures_Hi"; + displayName = CSTRING(Gestures_Hi); condition = QUOTE(canStand _target); statement = QUOTE(_target playActionNow ([ARR_3('gestureHi','gestureHiB','gestureHiC')] select floor random 3);); showDisabled = 1; @@ -378,9 +377,9 @@ class CfgVehicles { }; class ACE_Equipment { - displayName = "$STR_ACE_Interaction_Equipment"; + displayName = CSTRING(Equipment); condition = QUOTE(true); - exceptions[] = {"isNotInside","notOnMap"}; + exceptions[] = {"isNotInside","notOnMap", "isNotSitting"}; statement = ""; showDisabled = 1; priority = 4.5; @@ -394,12 +393,12 @@ class CfgVehicles { class Car: LandVehicle { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); selection = ""; distance = 10; condition = "true"; class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -408,7 +407,7 @@ class CfgVehicles { }; class ACE_SelfActions { class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -418,12 +417,12 @@ class CfgVehicles { class Tank: LandVehicle { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); selection = ""; distance = 10; condition = "true"; class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -432,7 +431,7 @@ class CfgVehicles { }; class ACE_SelfActions { class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -444,12 +443,12 @@ class CfgVehicles { class Helicopter: Air { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); selection = ""; distance = 10; condition = "true"; class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -458,7 +457,7 @@ class CfgVehicles { }; class ACE_SelfActions { class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -468,12 +467,12 @@ class CfgVehicles { class Plane: Air { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); selection = ""; distance = 10; condition = "true"; class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -482,7 +481,7 @@ class CfgVehicles { }; class ACE_SelfActions { class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -494,13 +493,13 @@ class CfgVehicles { class Ship_F: Ship { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); selection = ""; distance = 10; condition = "true"; class ACE_Push { - displayName = "$STR_ACE_Interaction_Push"; + displayName = CSTRING(Push); distance = 6; condition = QUOTE(getMass _target < 1000 && {alive _target}); statement = QUOTE([ARR_2(_target, [ARR_3(2 * (vectorDir _player select 0), 2 * (vectorDir _player select 1), 0.5)])] call DFUNC(push);); @@ -508,7 +507,7 @@ class CfgVehicles { priority = -1; }; class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -517,7 +516,7 @@ class CfgVehicles { }; class ACE_SelfActions { class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -528,12 +527,12 @@ class CfgVehicles { class StaticWeapon: LandVehicle { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); selection = "gunnerview"; distance = 2; condition = "true"; class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -542,19 +541,43 @@ class CfgVehicles { }; class ACE_SelfActions { class ACE_Passengers { - displayName = "$STR_ACE_Interaction_Passengers"; + displayName = CSTRING(Passengers); condition = "true"; statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; }; }; + + class StaticMGWeapon: StaticWeapon {}; + class HMG_01_base_F: StaticMGWeapon {}; + class HMG_01_high_base_F: HMG_01_base_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.172852,0.164063,-0.476091]"; + }; + }; + }; + class AA_01_base_F: StaticMGWeapon { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0,0.515869,-0.200671]"; + }; + }; + }; + class AT_01_base_F: StaticMGWeapon { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0,0.515869,-0.200671]"; + }; + }; + }; class thingX; class ReammoBox_F: thingX { class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = CSTRING(MainAction); selection = ""; distance = 2; condition = "true"; diff --git a/addons/interaction/Menu_Config.hpp b/addons/interaction/Menu_Config.hpp index 790874a1ac..8359ee560a 100644 --- a/addons/interaction/Menu_Config.hpp +++ b/addons/interaction/Menu_Config.hpp @@ -105,7 +105,7 @@ class RscACE_SelectAnItem { h = 0.1; y = 0.605; style = 2; - text = $STR_ACE_Interaction_Back; //$STR_ACE_Interaction_CancelSelection; + text = CSTRING(Back); action = "call ACE_Interaction_fnc_hideMenu;"; //'Default' call ACE_Interaction_fnc_openMenu; 'Default' call ACE_Interaction_fnc_openMenuSelf; colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; @@ -119,7 +119,7 @@ class RscACE_SelectAnItem { h = 0.1; w = 0.15; style = 2; - text = $STR_ACE_Interaction_MakeSelection; + text = CSTRING(MakeSelection); action = "call ACE_Interaction_fnc_hideMenu;"; colorBackground[] = {0,0,0,0}; colorBackgroundDisabled[] = {0,0,0,0}; @@ -170,7 +170,7 @@ class RscTitles { class SelectText: RscInteractionText{ idc = 1000; y = 17 * GUI_GRID_H; - text = $STR_ACE_Interaction_MakeSelection; + text = CSTRING(MakeSelection); }; class GoBackIcon: RscInteractionHelperIcon{ idc = 1201; @@ -180,7 +180,7 @@ class RscTitles { class GoBackText: RscInteractionText{ idc = 1001; y = 19 * GUI_GRID_H; - text = $STR_ACE_Interaction_Back; + text = CSTRING(Back); }; class ScrollIcon: RscInteractionHelperIcon{ idc = 1202; @@ -190,7 +190,7 @@ class RscTitles { class ScrollText: RscInteractionText{ idc = 1002; y = 18 * GUI_GRID_H; - text = $STR_ACE_Interaction_ScrollHint; + text = CSTRING(ScrollHint); }; }; }; diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf index e5b2e99291..7fe151dac1 100644 --- a/addons/interaction/XEH_postInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -23,7 +23,7 @@ private ["_team"]; // Add keybinds -["ACE3 Common", QGVAR(openDoor), localize "STR_ACE_Interaction_OpenDoor", +["ACE3 Common", QGVAR(openDoor), localize LSTRING(OpenDoor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -43,7 +43,7 @@ private ["_team"]; [57, [false, true, false]], false] call cba_fnc_addKeybind; //Key CTRL+Space -["ACE3 Common", QGVAR(tapShoulder), localize "STR_ACE_Interaction_TapShoulder", +["ACE3 Common", QGVAR(tapShoulder), localize LSTRING(TapShoulder), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -57,7 +57,7 @@ private ["_team"]; {false}, [20, [true, false, false]], false] call cba_fnc_addKeybind; -["ACE3 Common", QGVAR(modifierKey), localize "STR_ACE_Interaction_ModifierKey", +["ACE3 Common", QGVAR(modifierKey), localize LSTRING(ModifierKey), { // Conditions: canInteract //if !([ACE_player, objNull, ["isNotDragging"]] call EFUNC(common,canInteractWith)) exitWith {false}; // not needed diff --git a/addons/interaction/config.cpp b/addons/interaction/config.cpp index 7a68b2c12a..0afb2fc0fe 100644 --- a/addons/interaction/config.cpp +++ b/addons/interaction/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "Menu_Config.hpp" #include "ACE_Settings.hpp" +#include "ACE_ZeusActions.hpp" diff --git a/addons/interaction/functions/fnc_addPassengersActions.sqf b/addons/interaction/functions/fnc_addPassengersActions.sqf index 7ee56415bf..fe557e7ada 100644 --- a/addons/interaction/functions/fnc_addPassengersActions.sqf +++ b/addons/interaction/functions/fnc_addPassengersActions.sqf @@ -23,15 +23,24 @@ private ["_actions"]; _actions = []; { - private ["_unit"]; + private ["_unit", "_icon"]; _unit = _x; if ((_unit != _player) && {(getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "simulation")) != "UAVPilot"}) then { + _icon = switch _unit do { + case (driver _vehicle): { QUOTE(A3\ui_f\data\IGUI\RscIngameUI\RscUnitInfo\role_driver_ca.paa) }; + case (gunner _vehicle): { QUOTE(A3\ui_f\data\IGUI\RscIngameUI\RscUnitInfo\role_gunner_ca.paa) }; + case (commander _vehicle): { QUOTE(A3\ui_f\data\IGUI\RscIngameUI\RscUnitInfo\role_commander_ca.paa) }; + default { "" }; + }; + if (_unit getVariable [QEGVAR(captives,isHandcuffed), false]) then { + _icon = QUOTE(PATHTOEF(captives,UI\handcuff_ca.paa)); + }; _actions pushBack [ [ str(_unit), [_unit, true] call EFUNC(common,getName), - "", + _icon, {}, {true}, {_this call FUNC(addPassengerActions);}, diff --git a/addons/interaction/functions/fnc_joinTeam.sqf b/addons/interaction/functions/fnc_joinTeam.sqf index cd2ea8c880..c2a542d4af 100644 --- a/addons/interaction/functions/fnc_joinTeam.sqf +++ b/addons/interaction/functions/fnc_joinTeam.sqf @@ -25,10 +25,10 @@ _unit setVariable [QGVAR(assignedFireTeam), _team, true]; if (_unit == ACE_player) then { _message = if (_team == "MAIN") then { - localize "STR_ACE_Interaction_LeftTeam"; + localize LSTRING(LeftTeam); } else { - _team = localize format ["STR_ACE_Interaction_Team%1", _team]; - format [localize "STR_ACE_Interaction_JoinedTeam", _team]; + _team = localize format [LSTRING(Team%1), _team]; + format [localize LSTRING(JoinedTeam), _team]; }; [_message] call EFUNC(common,displayTextStructured); diff --git a/addons/interaction/functions/fnc_openDoor.sqf b/addons/interaction/functions/fnc_openDoor.sqf index f9053e59f2..db808e2eba 100644 --- a/addons/interaction/functions/fnc_openDoor.sqf +++ b/addons/interaction/functions/fnc_openDoor.sqf @@ -46,7 +46,7 @@ playSound "ACE_Sound_Click"; _phase = _house animationPhase (_animations select 0); _position = getPosASL ACE_player; - _time = time + 0.2; + _time = ACE_time + 0.2; _usedMouseWheel = false; waitUntil { if (inputAction "PrevAction" > 0 || {inputAction "NextAction" > 0}) then { @@ -61,7 +61,7 @@ playSound "ACE_Sound_Click"; !GVAR(isOpeningDoor) || {getPosASL ACE_player distance _position > 1} }; - if (!_usedMouseWheel && {time < _time} && {[ACE_player, objNull, []] call EFUNC(common,canInteractWith)}) then { + if (!_usedMouseWheel && {ACE_time < _time} && {[ACE_player, objNull, []] call EFUNC(common,canInteractWith)}) then { _phase = [0, 1] select (_house animationPhase (_animations select 0) < 0.5); {_house animate [_x, _phase]} forEach _animations; diff --git a/addons/interaction/functions/fnc_openMenuSelectUI.sqf b/addons/interaction/functions/fnc_openMenuSelectUI.sqf index e1b6a30df1..6141e839b8 100644 --- a/addons/interaction/functions/fnc_openMenuSelectUI.sqf +++ b/addons/interaction/functions/fnc_openMenuSelectUI.sqf @@ -29,7 +29,7 @@ if !(_unit in _cargo) exitWith {}; GVAR(InteractionMenu_Crew) = _cargo; // Prepare: add header and "OK" button to select menu -_actions = [localize "STR_ACE_Interaction_InteractionMenu", localize "STR_ACE_Interaction_Interact"] call FUNC(prepareSelectMenu); +_actions = [localize LSTRING(InteractionMenu), localize LSTRING(Interact)] call FUNC(prepareSelectMenu); // Prepare: add all cargo units as options to select menu { diff --git a/addons/interaction/functions/fnc_prepareSelectMenu.sqf b/addons/interaction/functions/fnc_prepareSelectMenu.sqf index 07bef07b37..f42d95b75b 100644 --- a/addons/interaction/functions/fnc_prepareSelectMenu.sqf +++ b/addons/interaction/functions/fnc_prepareSelectMenu.sqf @@ -21,7 +21,7 @@ PARAMS_2(_header,_buttonText); closeDialog 0; if (isNil "_buttonText" or {_buttonText == ""}) then { - _buttonText = localize "STR_ACE_Interaction_MakeSelection"; + _buttonText = localize LSTRING(MakeSelection); }; createDialog "RscACE_SelectAnItem"; diff --git a/addons/interaction/functions/fnc_tapShoulder.sqf b/addons/interaction/functions/fnc_tapShoulder.sqf index 23391651cc..b8bb591c6d 100644 --- a/addons/interaction/functions/fnc_tapShoulder.sqf +++ b/addons/interaction/functions/fnc_tapShoulder.sqf @@ -32,9 +32,9 @@ addCamShake [4, 0.5, 5]; private ["_message"]; //localize is converting the escaped <> symbols, so just add them here instead of in the stringtable if (_shoulderNum == 0) then { - _message = format ["%1 >", (localize "STR_ACE_Interaction_YouWereTappedRight")]; + _message = format ["%1 >", (localize LSTRING(YouWereTappedRight))]; } else { - _message = format ["< %1", (localize "STR_ACE_Interaction_YouWereTappedLeft")]; + _message = format ["< %1", (localize LSTRING(YouWereTappedLeft))]; }; [parseText _message] call EFUNC(common,displayTextStructured); diff --git a/addons/interaction/script_component.hpp b/addons/interaction/script_component.hpp index caa87ce3ce..68f22e96d7 100644 --- a/addons/interaction/script_component.hpp +++ b/addons/interaction/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT interaction -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_INTERACTION #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_INTERACTION #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index b2e75ccdff..068814995a 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -77,7 +77,7 @@ Right Leg Rechtes Bein Pierna derecha - Pravá hona + Pravá noha Prawa noga Jambe droite Правая нога @@ -111,7 +111,7 @@ Interaction Menu (Self) - Interaktionsmenü (Selbst) + Interaktionsmenü (selbst) Menú de interacción (Propio) Menu interakcji (własne) Menu interakce (vlastní) @@ -495,7 +495,7 @@ Get Down! - Auf Den Boden! + Auf den Boden! Al suelo! Padnij! K zemi! @@ -507,7 +507,7 @@ Team Management - Team Management + Gruppenverwaltung Gestión de equipo Gestion d'équipe Zarządzanie oddziałem @@ -632,7 +632,7 @@ Dołącz do zielonych Entrar em Verde Belépés a Zöldbe - Připojit k zeleným + Připojit k zeleným Присоединиться к Зеленой группе Rejoindre vert Unirsi al team verde @@ -691,7 +691,7 @@ Has dejado el equipo Tu as quitté l'équipe Opuściłeś drużynę - Opustil si tým + Opustil jsi tým Вы покинули группу Você deixou a Equipe Hai lasciato il team @@ -793,21 +793,48 @@ Passeggeri Passageiros - + Interaction System System interakcji + Sistema de interacción + Interaktionssystem + Systém interakce + Sistema de interação - + Enable Team Management Wł. zarządzanie drużyną + Habilitar gestión de equipos + Aktiviere Gruppenverwaltung + Povolit správu týmu + Habilitar gestão de equipes - + Should players be allowed to use the Team Management Menu? Default: Yes Czy gracze mogą korzystać z menu zarządzania drużyną? Domyślnie: Tak + ¿Deben tener permitido los jugadores el uso del menu de gestión de equipos? Por defecto: Si + Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja + Mohou hráči použít menu správy týmu? Výchozí: Ano + Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim - - + + Team management allows color allocation for team members, taking team command and joining/leaving teams. Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. + Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. + Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. + O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. + + + Behaviour + + + Careless + + + Formation + + + Speed Mode - \ No newline at end of file + diff --git a/addons/inventory/ACE_Settings.hpp b/addons/inventory/ACE_Settings.hpp index 9e1b7fc15a..87f2b59550 100644 --- a/addons/inventory/ACE_Settings.hpp +++ b/addons/inventory/ACE_Settings.hpp @@ -3,8 +3,8 @@ class ACE_Settings { value = 0; typeName = "SCALAR"; isClientSettable = 1; - displayName = "$STR_ACE_Inventory_SettingName"; - description = "$STR_ACE_Inventory_SettingDescription"; + displayName = CSTRING(SettingName); + description = CSTRING(SettingDescription); values[] = {"$str_medium", "$str_large", "$str_very_large"}; }; }; \ No newline at end of file diff --git a/addons/inventory/script_component.hpp b/addons/inventory/script_component.hpp index dd7c439c1a..248f324b36 100644 --- a/addons/inventory/script_component.hpp +++ b/addons/inventory/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT inventory -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_INVENTORY #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_INVENTORY #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index 6ad5ec0408..8272594df5 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -15,7 +15,7 @@ Normally inventory display is scaled by UI size. This allows scaling the Inventory UI size up, but doesn't increase font size allowing more rows displayed. - Im Regelfall wird die Inventargröße durch die Größe der Nutzeroberfläche bestimmt. Diese Einstellung erlaubt es das Inventar unter Ausschluss der Schriftgröße zu vergrößern. Dadurch können mehr Gegenstände angezeigt werden. + Im Regelfall wird die Inventargröße durch die Größe der Nutzeroberfläche bestimmt. Diese Einstellung erlaubt es, das Inventar unter Ausschluss der Schriftgröße zu vergrößern. Dadurch können mehr Gegenstände angezeigt werden. Normalmente la pantalla de inventario se escala por el tamaño de la interfaz de usuario. Esto permite ampliar el tamaño de la interfaz de usuario de inventario, pero no aumenta el tamaño de fuente, permitiendo mostrar más filas. Обычно, размер окна инвентаря зависит от размеров пользовательского интерфейса. Эта настройка позволяет увеличить размер окна инвентаря, не увеличивая размеры шрифтов, так что отображется большее количество строк. Normálně se velikost invetáře škáluje s velikostí UI. Toto nastavení dovoluje škálování velikost inventáře ale nežvětšuje velikost fontu. To dovoluje zobrazení více řad v inventáři. @@ -26,4 +26,4 @@ Normalmente o tamanho da tela do inventário é ditada pelo tamanho da UI. Isso permite aumentar o tamanho da tela de inventário, mas não aumenta o tamanho da fonte, permitindo que mais linhas sejam visualizadas. - + \ No newline at end of file diff --git a/addons/javelin/CfgMagazines.hpp b/addons/javelin/CfgMagazines.hpp new file mode 100644 index 0000000000..3053cf1fa1 --- /dev/null +++ b/addons/javelin/CfgMagazines.hpp @@ -0,0 +1,18 @@ +class CfgMagazines { + //Static Titan Magazine + class 5Rnd_GAT_missiles; + class 1Rnd_GAT_missiles: 5Rnd_GAT_missiles { + ammo = "ACE_Javelin_FGM148_static"; //from misssileGuidance, was "M_Titan_AT_static" + }; + + //Handheld Titan "AT" Magazine (Locking - "Anti-Tank") + class Titan_AA; + class Titan_AT: Titan_AA { + ammo = "ACE_Javelin_FGM148"; //from misssileGuidance, was "M_Titan_AT" + }; + + //Handheld Titan "AP" Magazine (SACLOS? "Anti-personal") + // class Titan_AP: Titan_AA { + //??? + // }; +}; diff --git a/addons/javelin/config.cpp b/addons/javelin/config.cpp index cb76da0010..8dfc970902 100644 --- a/addons/javelin/config.cpp +++ b/addons/javelin/config.cpp @@ -14,4 +14,5 @@ class CfgPatches { #include "RscInGameUI.hpp" #include "CfgSounds.hpp" #include "CfgWeapons.hpp" -#include "CfgVehicles.hpp" \ No newline at end of file +#include "CfgVehicles.hpp" +#include "CfgMagazines.hpp" diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 039484d1af..3e293fcb9c 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -7,7 +7,7 @@ TRACE_1("enter", _this); private["_apos", "_aposX", "_aposY", "_args", "_boundsInput", "_bpos", "_canFire", "_constraintBottom"]; private["_constraintLeft", "_constraintRight", "_constraintTop", "_currentTarget", "_fireDisabledEH"]; -private["_firedEH", "_fov", "_lastTick", "_lockTime", "_maxX", "_maxY", "_minX", "_minY", "_newTarget"]; +private["_firedEH", "_fov", "_lastTick", "_lockTime", "_maxX", "_maxY", "_minX", "_minY", "_newTarget"]; private["_offsetX", "_offsetY", "_pos", "_randomLockInterval", "_randomPosWithinBounds", "_range"]; private["_runTime", "_soundTime", "_targetArray", "_zamerny", "_currentShooter"]; @@ -20,7 +20,7 @@ _currentShooter = (vehicle ACE_player); _args = uiNamespace getVariable[QGVAR(arguments), [] ]; if( (count _args) > 0) then { _lastTick = _args select 0; - if(diag_tickTime - _lastTick > 1) then { + if(ACE_diagTime - _lastTick > 1) then { [] call FUNC(onOpticLoad); }; }; @@ -35,24 +35,33 @@ _soundTime = _args select 4; _randomLockInterval = _args select 5; _fireDisabledEH = _args select 6; -_configs = configProperties [configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)), QUOTE(configName _x == QUOTE(QGVAR(enabled))), false]; -if (((count _configs) < 1) || {(getNumber (_configs select 0)) != 1}) exitWith { +private["_ammo", "_magazineConfig", "_weaponConfig"]; +_weaponConfig = configProperties [configFile >> "CfgWeapons" >> (currentWeapon _currentShooter), QUOTE(configName _x == QUOTE(QGVAR(enabled))), false]; +_magazineConfig = if ((currentMagazine _currentShooter) != "") then { + _ammo = getText (configFile >> "CfgMagazines" >> (currentMagazine _currentShooter) >> "ammo"); + configProperties [(configFile >> "CfgAmmo" >> _ammo), "(configName _x) == 'ace_missileguidance'", false]; +} else { + [] +}; + +//If weapon does not have "javelin enabled", then exit PFEH +if (((count _weaponConfig) < 1) || {(getNumber (_weaponConfig select 0)) != 1}) exitWith { __JavelinIGUITargeting ctrlShow false; __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; __JavelinIGUITargetingConstraints ctrlShow false; - + if(!isNil "_fireDisabledEH") then { _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); }; - + [(_this select 1)] call cba_fnc_removePerFrameHandler; uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil]; }; // Find a target within the optic range _newTarget = objNull; - + // Bail on fast movement if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) exitWith { // keep it steady. ACE_player switchCamera "INTERNAL"; @@ -60,19 +69,20 @@ if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && // Refresh the firemode [] call FUNC(showFireMode); - - -// bail on not loaded -if( (vehicle ACE_player) != ACE_player) then { - if( (vehicle player) magazineTurretAmmo ["1Rnd_GAT_missiles", [0]] < 1) exitWith { - TRACE_1("No turret ammo, exit", ""); + +_ammo = _currentShooter ammo (currentWeapon _currentShooter); +// not loaded or not "javelin enabled" for magazine, hide targeting and enable firing +if ((_ammo == 0) || {(count _magazineConfig) < 1} || {(getNumber ((_magazineConfig select 0) >> "enabled")) != 1}) exitWith { + __JavelinIGUITargeting ctrlShow false; + __JavelinIGUITargetingGate ctrlShow false; + __JavelinIGUITargetingLines ctrlShow false; + __JavelinIGUITargetingConstraints ctrlShow false; + + if(!isNil "_fireDisabledEH") then { + _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); }; -} else { - if (ACE_player ammo (currentWeapon ACE_player) < 1 ) exitWith { - TRACE_1("No ammo, exit", ""); - }; }; - + _range = parseNumber (ctrlText __JavelinIGUIRangefinder); TRACE_1("Viewing range", _range); if (_range > 50 && {_range < 2500}) then { @@ -104,7 +114,7 @@ _zamerny = if (_currentTarget isKindOf "CAManBase") then {_currentTarget selecti _randomPosWithinBounds = [(_zamerny select 0) + 1 - (random 2.0),(_zamerny select 1) + 1 - (random 2.0),(_zamerny select 2) + 0.5 - (random 1.0)]; _apos = worldToScreen (_currentTarget modelToWorld _randomPosWithinBounds); - + _aposX = 0; _aposY = 0; if (count _apos < 2) then { @@ -115,7 +125,7 @@ if (count _apos < 2) then { _aposY = (_apos select 1) + _offsetY; }; -if((call CBA_fnc_getFoV) select 1 > 9) then { +if((call CBA_fnc_getFoV) select 1 > 9) then { __JavelinIGUINFOV ctrlSetTextColor __ColorGreen; __JavelinIGUIWFOV ctrlSetTextColor __ColorGray; } else { @@ -125,9 +135,9 @@ if((call CBA_fnc_getFoV) select 1 > 9) then { FUNC(disableFire) = { _firedEH = _this select 0; - + if(_firedEH < 0 && difficulty > 0) then { - _firedEH = [ACE_player, "DefaultAction", {true}, { + _firedEH = [ACE_player, "DefaultAction", {true}, { _canFire = (_this select 1) getVariable["ace_missileguidance_target", nil]; if(!isNil "_canFire") exitWith { false }; true @@ -137,7 +147,7 @@ FUNC(disableFire) = { }; FUNC(enableFire) = { _firedEH = _this select 0; - + if(_firedEH > 0 && difficulty > 0) then { [ACE_player, "DefaultAction", _firedEH] call EFUNC(common,removeActionEventHandler); }; @@ -148,38 +158,38 @@ if (isNull _newTarget) then { // No targets found _currentTarget = objNull; _lockTime = 0; - + __JavelinIGUISeek ctrlSetTextColor __ColorGray; __JavelinIGUITargeting ctrlShow false; __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; __JavelinIGUITargetingConstraints ctrlShow false; - - _currentShooter setVariable ["ace_missileguidance_target",nil, false]; - + + _currentShooter setVariable ["ace_missileguidance_target",nil, false]; + // Disallow fire _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); } else { _fov = [] call CBA_fnc_getFoV; TRACE_1("FOV", _fov); if (_newTarget distance ACE_player < 2500 - && {(call CBA_fnc_getFoV) select 1 > 9} - && { (currentVisionMode ACE_player == 2)} - && GVAR(isLockKeyDown) - ) then { + && {(call CBA_fnc_getFoV) select 1 > 9} + && { (currentVisionMode ACE_player == 2)} + && GVAR(isLockKeyDown) + ) then { // Lock on after 3 seconds - if(_currentTarget != _newTarget) then { + if(_currentTarget != _newTarget) then { TRACE_1("New Target, reseting locking", _newTarget); - _lockTime = diag_tickTime; + _lockTime = ACE_diagTime; _currentTarget = _newTarget; - + playSound "ACE_Javelin_Locking"; } else { - if(diag_tickTime - _lockTime > __LOCKONTIME + _randomLockInterval) then { + if(ACE_diagTime - _lockTime > __LOCKONTIME + _randomLockInterval) then { TRACE_2("LOCKED!", _currentTarget, _lockTime); - + __JavelinIGUISeek ctrlSetTextColor __ColorGreen; - + __JavelinIGUITargeting ctrlShow true; __JavelinIGUITargetingConstrains ctrlShow false; __JavelinIGUITargetingGate ctrlShow true; @@ -189,98 +199,98 @@ if (isNull _newTarget) then { //__JavelinIGUITargetingLineV ctrlSetPosition [_aposX,ctrlPosition __JavelinIGUITargetingLineV select 1]; //__JavelinIGUITargetingLineH ctrlSetPosition [ctrlPosition __JavelinIGUITargetingLineH select 0,_aposY]; //{_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingLineH,__JavelinIGUITargetingLineV]; - + _boundsInput = if (_currentTarget isKindOf "CAManBase") then { [_currentTarget,[-1,-1,-2],_currentTarget selectionPosition "body"]; } else { [_currentTarget,[-1,-1,-2],_currentTarget selectionPosition "zamerny"]; }; - + _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); _minX = ((_bpos select 0) + _offsetX) max _constraintLeft; _minY = ((_bpos select 1) + _offsetY) max _constraintTop; _maxX = ((_bpos select 2) + _offsetX) min (_constraintRight - 0.025*(3/4)*SafezoneH); _maxY = ((_bpos select 3) + _offsetY) min (_constraintBottom - 0.025*SafezoneH); - + TRACE_4("", _boundsInput, _bpos, _minX, _minY); - + __JavelinIGUITargetingGateTL ctrlSetPosition [_minX,_minY]; __JavelinIGUITargetingGateTR ctrlSetPosition [_maxX,_minY]; __JavelinIGUITargetingGateBL ctrlSetPosition [_minX,_maxY]; __JavelinIGUITargetingGateBR ctrlSetPosition [_maxX,_maxY]; - + {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL,__JavelinIGUITargetingGateTR,__JavelinIGUITargetingGateBL,__JavelinIGUITargetingGateBR]; - + _currentShooter setVariable["ace_missileguidance_target", _currentTarget, false]; - + // Allow fire _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); - - if(diag_tickTime > _soundTime) then { + + if(ACE_diagTime > _soundTime) then { playSound "ACE_Javelin_Locked"; - _soundTime = diag_tickTime + 0.25; + _soundTime = ACE_diagTime + 0.25; }; } else { __JavelinIGUITargeting ctrlShow true; __JavelinIGUITargetingGate ctrlShow true; - __JavelinIGUITargetingConstrains ctrlShow true; + __JavelinIGUITargetingConstrains ctrlShow true; __JavelinIGUITargetingLines ctrlShow false; _currentShooter setVariable["ace_missileguidance_target", nil, false]; - + _boundsInput = if (_currentTarget isKindOf "CAManBase") then { [_newTarget,[-1,-1,-2],_currentTarget selectionPosition "body"]; } else { [_newTarget,[-1,-1,-1],_currentTarget selectionPosition "zamerny"]; }; - + _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); - + _minX = ((_bpos select 0) + _offsetX) max _constraintLeft; _minY = ((_bpos select 1) + _offsetY) max _constraintTop; _maxX = ((_bpos select 2) + _offsetX) min (_constraintRight - 0.025*(3/4)*SafezoneH); _maxY = ((_bpos select 3) + _offsetY) min (_constraintBottom - 0.025*SafezoneH); - + TRACE_4("", _boundsInput, _bpos, _minX, _minY); - + __JavelinIGUITargetingGateTL ctrlSetPosition [_minX,_minY]; __JavelinIGUITargetingGateTR ctrlSetPosition [_maxX,_minY]; __JavelinIGUITargetingGateBL ctrlSetPosition [_minX,_maxY]; __JavelinIGUITargetingGateBR ctrlSetPosition [_maxX,_maxY]; - + {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL,__JavelinIGUITargetingGateTR,__JavelinIGUITargetingGateBL,__JavelinIGUITargetingGateBR]; - if(diag_tickTime > _soundTime) then { + if(ACE_diagTime > _soundTime) then { playSound "ACE_Javelin_Locking"; - _soundTime = diag_tickTime + 0.25; + _soundTime = ACE_diagTime + 0.25; }; // Disallow fire - _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); + _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); }; }; - } else { + } else { // No targets found _currentTarget = objNull; _lockTime = 0; - + __JavelinIGUISeek ctrlSetTextColor __ColorGray; __JavelinIGUITargeting ctrlShow false; __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; __JavelinIGUITargetingConstraints ctrlShow false; - + _currentShooter setVariable ["ace_missileguidance_target",nil, false]; - + // Disallow fire _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); - }; + }; }; //TRACE_2("", _newTarget, _currentTarget); // Save arguments for next run -_args set[0, diag_tickTime]; +_args set[0, ACE_diagTime]; _args set[1, _currentTarget]; _args set[2, _runTime]; _args set[3, _lockTime]; diff --git a/addons/javelin/functions/fnc_onOpticLoad.sqf b/addons/javelin/functions/fnc_onOpticLoad.sqf index 8e26806162..0332c132e9 100644 --- a/addons/javelin/functions/fnc_onOpticLoad.sqf +++ b/addons/javelin/functions/fnc_onOpticLoad.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" TRACE_1("enter", _this); -#define __LOCKONTIMERANDOM 2 // Deviation in lock on time +#define __LOCKONTIMERANDOM 2 // Deviation in lock on ACE_time if((count _this) > 0) then { uiNameSpace setVariable ['ACE_RscOptics_javelin',_this select 0]; @@ -20,12 +20,12 @@ __JavelinIGUITargetingLines ctrlShow false; uiNameSpace setVariable [QGVAR(arguments), [ - 0, // Last runtime + ACE_diagTime, // Last runtime objNull, // currentTargetObject 0, // Run Time 0, // Lock Time 0, // Sound timer - (random __LOCKONTIMERANDOM), // random lock time addition + (random __LOCKONTIMERANDOM), // random lock ACE_time addition -1 ] ]; diff --git a/addons/javelin/initKeybinds.sqf b/addons/javelin/initKeybinds.sqf index 2c095b93fc..15215466e8 100644 --- a/addons/javelin/initKeybinds.sqf +++ b/addons/javelin/initKeybinds.sqf @@ -1,6 +1,6 @@ // by commy2 -["ACE3 Weapons", QGVAR(lockTarget), localize "STR_ACE_JAVELIN_LockTarget", +["ACE3 Weapons", QGVAR(lockTarget), localize LSTRING(LockTarget), { if (GETGVAR(isLockKeyDown,false)) exitWith {false}; @@ -21,7 +21,7 @@ }, [15, [false, false, false]], false] call cba_fnc_addKeybind; //Tab Key -["ACE3 Weapons", QGVAR(cycleFireMode), localize "STR_ACE_JAVELIN_CycleFireMode", +["ACE3 Weapons", QGVAR(cycleFireMode), localize LSTRING(CycleFireMode), { false }, { [ACE_player] call FUNC(cycleFireMode); diff --git a/addons/javelin/script_component.hpp b/addons/javelin/script_component.hpp index 7234a1e3d4..984edc6988 100644 --- a/addons/javelin/script_component.hpp +++ b/addons/javelin/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT javelin -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_JAVELIN #define DEBUG_MODE_FULL @@ -9,7 +9,7 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_JAVELIN #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" #define ACE_JAV_FIREMODE_DIR 1 #define ACE_JAV_FIREMODE_TOP 2 diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 0557968115..e826263100 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -1,7 +1,7 @@  - - + + Lock Target (Hold) Ziel aufschalten Захватить цель (удерживать) @@ -13,7 +13,7 @@ Fijar objetivo (Mantener) Travar Alvo(Segurar) - + Cycle Fire Mode Wechsle Feuermodus Переключение режимов огня diff --git a/addons/kestrel4500/CfgVehicles.hpp b/addons/kestrel4500/CfgVehicles.hpp index 20d8bf5b62..776bd8dcf5 100644 --- a/addons/kestrel4500/CfgVehicles.hpp +++ b/addons/kestrel4500/CfgVehicles.hpp @@ -4,31 +4,31 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class GVAR(open) { - displayName = "$STR_ACE_Kestrel4500_OpenKestrel"; + displayName = CSTRING(OpenKestrel); condition = QUOTE(call FUNC(canShow) && !GVAR(Kestrel4500)); statement = QUOTE(call FUNC(createKestrelDialog)); showDisabled = 0; priority = 0.1; icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); - exceptions[] = {"notOnMap"}; - }; - class GVAR(show) { - displayName = "$STR_ACE_Kestrel4500_ShowKestrel"; - condition = QUOTE(call FUNC(canShow) && !GVAR(Overlay)); - statement = QUOTE(call FUNC(displayKestrel)); - showDisabled = 0; - priority = 0.2; - icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; - }; - class GVAR(hide) { - displayName = "$STR_ACE_Kestrel4500_HideKestrel"; - condition = QUOTE(GVAR(Overlay)); - statement = QUOTE(call FUNC(displayKestrel)); - showDisabled = 0; - priority = 0.3; - icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; + class GVAR(show) { + displayName = CSTRING(ShowKestrel); + condition = QUOTE(call FUNC(canShow) && !GVAR(Overlay)); + statement = QUOTE(call FUNC(displayKestrel)); + showDisabled = 0; + priority = 0.2; + icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; + }; + class GVAR(hide) { + displayName = CSTRING(HideKestrel); + condition = QUOTE(GVAR(Overlay)); + statement = QUOTE(call FUNC(displayKestrel)); + showDisabled = 0; + priority = 0.3; + icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa)); + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; + }; }; }; }; diff --git a/addons/kestrel4500/CfgWeapons.hpp b/addons/kestrel4500/CfgWeapons.hpp index 881edca202..c31b736ac6 100644 --- a/addons/kestrel4500/CfgWeapons.hpp +++ b/addons/kestrel4500/CfgWeapons.hpp @@ -4,11 +4,11 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_Kestrel4500: ACE_ItemCore { - author[] = {$STR_ACE_Common_ACETeam, "Ruthberg"}; + author = ECSTRING(common,ACETeam); scope = 2; - displayName = "$STR_ACE_Kestrel_Name"; - descriptionShort = "$STR_ACE_Kestrel_Description"; - model = PATHTOF(kestrel4500.p3d); + displayName = CSTRING(Name); + descriptionShort = CSTRING(Description); + model = PATHTOF(data\kestrel4500.p3d); picture = PATHTOF(UI\Kestrel4500.paa); icon = "iconObject_circle"; mapSize = 0.034; diff --git a/addons/kestrel4500/XEH_postInit.sqf b/addons/kestrel4500/XEH_postInit.sqf index 7790386cf7..f22fc2228f 100644 --- a/addons/kestrel4500/XEH_postInit.sqf +++ b/addons/kestrel4500/XEH_postInit.sqf @@ -2,16 +2,16 @@ #include "initKeybinds.sqf" -GVAR(Menus) = ["Date", "Direction", "Wind SPD m/s", "CROSSWIND m/s", "HEADWIND m/s", "TEMP °C", "CHILL °C", "HUMIDITY %", "HEAT INDEX °C", "DEW POINT °C", "WET BULB °C", "BARO hPA", "ALTITUDE m", "User Screen 1", "User Screen 2"]; +GVAR(Menus) = ["Date", "Direction", "Wind SPD m/s", "CROSSWIND m/s", "HEADWIND m/s", "TEMP °C", "CHILL °C", "HUMIDITY %", "HEAT INDEX °C", "DEW POINT °C", "WET BULB °C", "BARO hPA", "ALTITUDE m", "DENS ALT m", "User Screen 1", "User Screen 2"]; -GVAR(TOTAL) = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; -GVAR(ENTRIES) = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +GVAR(TOTAL) = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +GVAR(ENTRIES) = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; GVAR(MinAvgMax) = false; GVAR(MinAvgMaxMode) = 0; GVAR(referenceHeadingMenu) = 0; GVAR(referenceHeadingAutoSet) = true; -GVAR(manualSetCooldown) = diag_tickTime; +GVAR(manualSetCooldown) = ACE_diagTime; GVAR(headingSetDisplayTimer) = 0; GVAR(Menu) = 1; diff --git a/addons/kestrel4500/config.cpp b/addons/kestrel4500/config.cpp index 8e558af44f..95a533fd9f 100644 --- a/addons/kestrel4500/config.cpp +++ b/addons/kestrel4500/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {"ACE_Kestrel4500"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ACE_common", "ACE_weather"}; - author[] = {$STR_ACE_Common_ACETeam, "Ruthberg"}; + author[] = {ECSTRING(common,ACETeam), "Ruthberg"}; VERSION_CONFIG; }; }; diff --git a/addons/kestrel4500/data/Kestrel4500.p3d b/addons/kestrel4500/data/Kestrel4500.p3d new file mode 100644 index 0000000000..8166e552f2 Binary files /dev/null and b/addons/kestrel4500/data/Kestrel4500.p3d differ diff --git a/addons/kestrel4500/data/Kestrel4500.rvmat b/addons/kestrel4500/data/Kestrel4500.rvmat new file mode 100644 index 0000000000..256b6b86bb --- /dev/null +++ b/addons/kestrel4500/data/Kestrel4500.rvmat @@ -0,0 +1,82 @@ +class StageTI { + texture = "a3\data_f\default_glass_ti_ca.paa"; +}; +ambient[] = {1,1,1,1}; +diffuse[] = {1,1,1,1}; +forcedDiffuse[] = {0,0,0,0}; +emmisive[] = {0,0,0,1}; +specular[] = {0.3,0.3,0.3,1}; +specularPower = 50; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 { + texture = "z\ace\addons\kestrel4500\data\Kestrel4500_nohq.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage2 { + texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage3 { + texture = "#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage4 { + texture = "#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage5 { + texture = "#(argb,8,8,3)color(0,0.6,1,1,SMDI)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage6 { + texture = "#(ai,32,128,1)fresnel(0.85,0.36)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; +class Stage7 { + useWorldEnvMap = "true"; + texture = "a3\data_f\env_interier_car_ca.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,1}; + pos[] = {0,0,0}; + }; +}; diff --git a/addons/kestrel4500/data/Kestrel4500_co.paa b/addons/kestrel4500/data/Kestrel4500_co.paa new file mode 100644 index 0000000000..c34d195a7e Binary files /dev/null and b/addons/kestrel4500/data/Kestrel4500_co.paa differ diff --git a/addons/kestrel4500/data/Kestrel4500_nohq.paa b/addons/kestrel4500/data/Kestrel4500_nohq.paa new file mode 100644 index 0000000000..7c8886d688 Binary files /dev/null and b/addons/kestrel4500/data/Kestrel4500_nohq.paa differ diff --git a/addons/kestrel4500/data/arrow1.paa b/addons/kestrel4500/data/arrow1.paa deleted file mode 100644 index 8edb257ead..0000000000 Binary files a/addons/kestrel4500/data/arrow1.paa and /dev/null differ diff --git a/addons/kestrel4500/data/body.paa b/addons/kestrel4500/data/body.paa deleted file mode 100644 index dfaa44723e..0000000000 Binary files a/addons/kestrel4500/data/body.paa and /dev/null differ diff --git a/addons/kestrel4500/data/gpstemp.paa b/addons/kestrel4500/data/gpstemp.paa deleted file mode 100644 index ef45fe406c..0000000000 Binary files a/addons/kestrel4500/data/gpstemp.paa and /dev/null differ diff --git a/addons/kestrel4500/data/rad.paa b/addons/kestrel4500/data/rad.paa deleted file mode 100644 index 13a3ffe6f7..0000000000 Binary files a/addons/kestrel4500/data/rad.paa and /dev/null differ diff --git a/addons/kestrel4500/data/tasten.paa b/addons/kestrel4500/data/tasten.paa deleted file mode 100644 index 8a140ec5f0..0000000000 Binary files a/addons/kestrel4500/data/tasten.paa and /dev/null differ diff --git a/addons/kestrel4500/data/tasten1.paa b/addons/kestrel4500/data/tasten1.paa deleted file mode 100644 index af441a51de..0000000000 Binary files a/addons/kestrel4500/data/tasten1.paa and /dev/null differ diff --git a/addons/kestrel4500/functions/fnc_buttonPressed.sqf b/addons/kestrel4500/functions/fnc_buttonPressed.sqf index c88d9df72f..8f38568462 100644 --- a/addons/kestrel4500/functions/fnc_buttonPressed.sqf +++ b/addons/kestrel4500/functions/fnc_buttonPressed.sqf @@ -33,12 +33,12 @@ switch (_this) do { case 2: { // Auto set GVAR(RefHeading) = (getDir ACE_player) % 360; GVAR(referenceHeadingMenu) = 0; - GVAR(headingSetDisplayTimer) = diag_tickTime; + GVAR(headingSetDisplayTimer) = ACE_diagTime; }; case 3: { // Manual set GVAR(RefHeading) = GVAR(TmpHeading); GVAR(referenceHeadingMenu) = 0; - GVAR(headingSetDisplayTimer) = diag_tickTime; + GVAR(headingSetDisplayTimer) = ACE_diagTime; }; }; }; @@ -73,13 +73,13 @@ switch (_this) do { GVAR(MinAvgMax) = !GVAR(MinAvgMax); } else { if (GVAR(referenceHeadingMenu) == 3) then { - if (diag_tickTime - GVAR(manualSetCooldown) < 0.2) then { + if (ACE_diagTime - GVAR(manualSetCooldown) < 0.2) then { GVAR(TmpHeading) = GVAR(TmpHeading) - 10; } else { GVAR(TmpHeading) = GVAR(TmpHeading) - 1; }; GVAR(TmpHeading) = (GVAR(TmpHeading) + 360) % 360; - GVAR(manualSetCooldown) = diag_tickTime; + GVAR(manualSetCooldown) = ACE_diagTime; }; }; }; @@ -88,13 +88,13 @@ switch (_this) do { GVAR(MinAvgMax) = !GVAR(MinAvgMax); } else { if (GVAR(referenceHeadingMenu) == 3) then { - if (diag_tickTime - GVAR(manualSetCooldown) < 0.2) then { + if (ACE_diagTime - GVAR(manualSetCooldown) < 0.2) then { GVAR(TmpHeading) = GVAR(TmpHeading) + 10; } else { GVAR(TmpHeading) = GVAR(TmpHeading) + 1; }; GVAR(TmpHeading) = (GVAR(TmpHeading) + 360) % 360; - GVAR(manualSetCooldown) = diag_tickTime; + GVAR(manualSetCooldown) = ACE_diagTime; }; }; }; diff --git a/addons/kestrel4500/functions/fnc_collectData.sqf b/addons/kestrel4500/functions/fnc_collectData.sqf index a20c944d1e..4858ad80b2 100644 --- a/addons/kestrel4500/functions/fnc_collectData.sqf +++ b/addons/kestrel4500/functions/fnc_collectData.sqf @@ -14,26 +14,28 @@ */ #include "script_component.hpp" -private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_altitude", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_fnc_updateMemory", "_windSpeed", "_crosswind", "_headwind"]; +private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_altitude", "_airDensity", "_densityAltitude", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_fnc_updateMemory", "_windSpeed", "_crosswind", "_headwind"]; _playerDir = getDir ACE_player; _playerAltitude = (getPosASL ACE_player) select 2; _temperature = _playerAltitude call EFUNC(weather,calculateTemperatureAtHeight); _humidity = EGVAR(weather,currentHumidity); _barometricPressure = _playerAltitude call EFUNC(weather,calculateBarometricPressure); _altitude = EGVAR(weather,Altitude) + _playerAltitude; +_airDensity = [_temperature, _barometricPressure, _humidity] call EFUNC(weather,calculateAirDensity); +_densityAltitude = _airDensity call EFUNC(weather,calculateDensityAltitude); _chill = [_temperature, _humidity] call EFUNC(weather,calculateWindChill); _heatIndex = [_temperature, _humidity] call EFUNC(weather,calculateHeatIndex); _dewPoint = [_temperature, _humidity] call EFUNC(weather,calculateDewPoint); _wetBulb = [_temperature, _barometricPressure, _humidity] call EFUNC(weather,calculateWetBulb); if (isNil QGVAR(MIN) || isNil QGVAR(MAX)) then { - GVAR(MIN) = [0, _playerDir, 0, 0, 0, _temperature, _chill, _humidity, _heatIndex, _dewPoint, _wetBulb, _barometricPressure, _altitude]; - GVAR(MAX) = [0, _playerDir, 0, 0, 0, _temperature, _chill, _humidity, _heatIndex, _dewPoint, _wetBulb, _barometricPressure, _altitude]; + GVAR(MIN) = [0, _playerDir, 0, 0, 0, _temperature, _chill, _humidity, _heatIndex, _dewPoint, _wetBulb, _barometricPressure, _altitude, _densityAltitude]; + GVAR(MAX) = [0, _playerDir, 0, 0, 0, _temperature, _chill, _humidity, _heatIndex, _dewPoint, _wetBulb, _barometricPressure, _altitude, _densityAltitude]; }; { GVAR(ENTRIES) set [_x, (GVAR(ENTRIES) select _x) + 1]; -} forEach [1, 5, 6, 7, 8, 9, 10, 11, 12]; +} forEach [1, 5, 6, 7, 8, 9, 10, 11, 12, 13]; _fnc_updateMemory = { PARAMS_2(_slot,_value); @@ -65,11 +67,17 @@ if (GVAR(MinAvgMaxMode) == 1) then { // HEADWIND _headwind = 0; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - _headwind = abs(cos(GVAR(RefHeading) - _playerDir) * _windSpeed); + _headwind = cos(GVAR(RefHeading) - _playerDir) * _windSpeed; } else { - _headwind = abs(cos(GVAR(RefHeading)) * _windSpeed); + _headwind = cos(GVAR(RefHeading)) * _windSpeed; }; - [4, _headwind] call _fnc_updateMemory; + if (abs(_headwind) > abs(GVAR(MAX) select 4)) then { + GVAR(MAX) set [4, _headwind]; + }; + if (abs(_headwind) < abs(GVAR(MIN) select 4)) then { + GVAR(MIN) set [4, _headwind]; + }; + GVAR(TOTAL) set [4, (GVAR(TOTAL) select 4) + _headwind]; }; [5, _temperature] call _fnc_updateMemory; @@ -80,3 +88,4 @@ if (GVAR(MinAvgMaxMode) == 1) then { [10, _wetBulb] call _fnc_updateMemory; [11, _barometricPressure] call _fnc_updateMemory; [12, _altitude] call _fnc_updateMemory; +[13, _densityAltitude] call _fnc_updateMemory; diff --git a/addons/kestrel4500/functions/fnc_displayKestrel.sqf b/addons/kestrel4500/functions/fnc_displayKestrel.sqf index fc0a1f278a..679ecce6af 100644 --- a/addons/kestrel4500/functions/fnc_displayKestrel.sqf +++ b/addons/kestrel4500/functions/fnc_displayKestrel.sqf @@ -58,8 +58,8 @@ GVAR(Overlay) = true; [_this select 1] call CBA_fnc_removePerFrameHandler; }; - if (diag_tickTime > GVAR(updateTimer)) then { - GVAR(updateTimer) = diag_tickTime + 1; + if (ACE_diagTime > GVAR(updateTimer)) then { + GVAR(updateTimer) = ACE_diagTime + 1; private ["_outputData"]; _outputData = [] call FUNC(generateOutputData); diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf index 106c1f3d32..fce359de6f 100644 --- a/addons/kestrel4500/functions/fnc_generateOutputData.sqf +++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf @@ -14,9 +14,9 @@ */ #include "script_component.hpp" -if (diag_tickTime - GVAR(headingSetDisplayTimer) < 0.8) exitWith {["", "", " Heading Set", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]}; +if (ACE_diagTime - GVAR(headingSetDisplayTimer) < 0.8) exitWith {["", "", " Heading Set", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]}; -private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_fnc_dayOfWeek", "_dayString", "_monthString", "_windSpeed", "_windDir", "_textTop", "_textCenterBig", "_textCenter", "_textCenterLine1Left", "_textCenterLine2Left", "_textCenterLine3Left", "_textCenterLine1Right", "_textCenterLine2Right", "_textCenterLine3Right", "_textInfoLine1", "_textInfoLine2", "_textBottomBig", "_textCenterLine1", "_textCenterLine2", "_textCenterLine3", "_textCenterLine4", "_textCenterLine5", "_textCenterLine6"]; +private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_airDensity", "_densityAltitude", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_fnc_dayOfWeek", "_dayString", "_monthString", "_windSpeed", "_windDir", "_textTop", "_textCenterBig", "_textCenter", "_textCenterLine1Left", "_textCenterLine2Left", "_textCenterLine3Left", "_textCenterLine1Right", "_textCenterLine2Right", "_textCenterLine3Right", "_textInfoLine1", "_textInfoLine2", "_textBottomBig", "_textCenterLine1", "_textCenterLine2", "_textCenterLine3", "_textCenterLine4", "_textCenterLine5", "_textCenterLine6"]; [] call FUNC(collectData); @@ -52,6 +52,8 @@ _playerAltitude = (getPosASL ACE_player) select 2; _temperature = _playerAltitude call EFUNC(weather,calculateTemperatureAtHeight); _humidity = EGVAR(weather,currentHumidity); _barometricPressure = _playerAltitude call EFUNC(weather,calculateBarometricPressure); +_airDensity = [_temperature, _barometricPressure, _humidity] call EFUNC(weather,calculateAirDensity); +_densityAltitude = _airDensity call EFUNC(weather,calculateDensityAltitude); _chill = [_temperature, _humidity] call EFUNC(weather,calculateWindChill); _heatIndex = [_temperature, _humidity] call EFUNC(weather,calculateHeatIndex); _dewPoint = [_temperature, _humidity] call EFUNC(weather,calculateDewPoint); @@ -159,10 +161,10 @@ if (GVAR(referenceHeadingMenu) == 0) then { case 4: { // HEADWIND if (!GVAR(MinAvgMax)) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - _textCenterBig = Str(round(abs(cos(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10); + _textCenterBig = Str(round(cos(GVAR(RefHeading) - _playerDir) * _windSpeed * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round((abs(cos(_playerDir - _windDir)) * _windSpeed) * 10) / 10, round(_playerDir)]; } else { - _textCenterBig = Str(round(abs(cos(GVAR(RefHeading)) * _windSpeed) * 10) / 10); + _textCenterBig = Str(round(cos(GVAR(RefHeading)) * _windSpeed * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)]; }; _textInfoLine2 = "- set heading"; @@ -284,7 +286,19 @@ if (GVAR(referenceHeadingMenu) == 0) then { _textCenterLine3Right = Str(round(GVAR(Max) select 12)); }; }; - case 13: { // User Screen 1 + case 13: { // DENSITY ALTITUDE + if (!GVAR(MinAvgMax)) then { + _textCenterBig = Str(round(_densityAltitude)); + } else { + _textCenterLine1Left = "Min"; + _textCenterLine2Left = "Avg"; + _textCenterLine3Left = "Max"; + _textCenterLine1Right = Str(round(GVAR(Min) select 13)); + _textCenterLine2Right = Str(round((GVAR(Total) select 13) / (GVAR(Entries) select 13))); + _textCenterLine3Right = Str(round(GVAR(Max) select 13)); + }; + }; + case 14: { // User Screen 1 _textCenterLine1Left = Str(round(_playerDir)); _textCenterLine2Left = Str(round(EGVAR(weather,Altitude) + _playerAltitude)); _textCenterLine3Left = Str(round(abs(_windSpeed) * 10) / 10); @@ -292,7 +306,7 @@ if (GVAR(referenceHeadingMenu) == 0) then { _textCenterLine2Right = "m"; _textCenterLine3Right = "m/s"; }; - case 14: { // User Screen 2 + case 15: { // User Screen 2 _textCenterLine1Left = Str(round(_temperature * 10) / 10); _textCenterLine2Left = Str(round(_humidity * 100 * 10) / 10); _textCenterLine3Left = Str(round((_playerAltitude call EFUNC(weather,calculateBarometricPressure)) * 10) / 10); diff --git a/addons/kestrel4500/functions/fnc_restoreUserData.sqf b/addons/kestrel4500/functions/fnc_restoreUserData.sqf index 3cd96d80af..0ce463ad67 100644 --- a/addons/kestrel4500/functions/fnc_restoreUserData.sqf +++ b/addons/kestrel4500/functions/fnc_restoreUserData.sqf @@ -16,3 +16,4 @@ #include "script_component.hpp" GVAR(Menu) = 0 max (profileNamespace getVariable ["ACE_Kestrel4500_menu", 0]) min ((count GVAR(Menus)) - 1); +GVAR(RefHeading) = 0 max (profileNamespace getVariable ["ACE_Kestrel4500_RefHeading", 0]) min 359; diff --git a/addons/kestrel4500/functions/fnc_storeUserData.sqf b/addons/kestrel4500/functions/fnc_storeUserData.sqf index 3b7ce9dd4d..a5d069b31d 100644 --- a/addons/kestrel4500/functions/fnc_storeUserData.sqf +++ b/addons/kestrel4500/functions/fnc_storeUserData.sqf @@ -16,3 +16,4 @@ #include "script_component.hpp" profileNamespace setVariable ["ACE_Kestrel4500_menu", GVAR(menu)]; +profileNamespace setVariable ["ACE_Kestrel4500_RefHeading", GVAR(RefHeading)]; diff --git a/addons/kestrel4500/initKeybinds.sqf b/addons/kestrel4500/initKeybinds.sqf index 2105d906d8..5793d36976 100644 --- a/addons/kestrel4500/initKeybinds.sqf +++ b/addons/kestrel4500/initKeybinds.sqf @@ -1,7 +1,7 @@ -["ACE3 Equipment", QGVAR(KestrelDialogKey), localize "STR_ACE_Kestrel4500_KestrelDialogKey", +["ACE3 Equipment", QGVAR(KestrelDialogKey), localize LSTRING(KestrelDialogKey), { // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; if (GVAR(Kestrel4500)) exitWith { closeDialog 0; false @@ -13,10 +13,10 @@ {false}, [0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) -["ACE3 Equipment", QGVAR(DisplayKestrelKey), localize "STR_ACE_Kestrel4500_DisplayKestrelKey", +["ACE3 Equipment", QGVAR(DisplayKestrelKey), localize LSTRING(DisplayKestrelKey), { // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement [] call FUNC(displayKestrel); @@ -24,3 +24,36 @@ }, {false}, [0, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) + + +//Add deviceKey entry: +private ["_conditonCode", "_toggleCode", "_closeCode"]; +_conditonCode = { + [] call FUNC(canShow); +}; +_toggleCode = { + // Conditions: canInteract + if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {}; + + // Statement + if (!GVAR(Overlay)) then { + //If no overlay, show it: + [] call FUNC(displayKestrel); + } else { + //If overlay is up, switch to dialog: + [] call FUNC(createKestrelDialog); + }; +}; +_closeCode = { + // Statement + if (GVAR(Overlay)) then { + //If dispaly is open, close it: + GVAR(Overlay) = false; + }; + if (dialog && {!isNull (uiNamespace getVariable ["Kestrel4500_Display", displayNull])}) then { + //If dialog is open, close it: + GVAR(Kestrel4500) = false; + closeDialog 0; + }; +}; +[(localize LSTRING(Name)), QUOTE(PATHTOF(UI\Kestrel4500.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); diff --git a/addons/kestrel4500/kestrel4500.p3d b/addons/kestrel4500/kestrel4500.p3d deleted file mode 100644 index bb4edd2706..0000000000 Binary files a/addons/kestrel4500/kestrel4500.p3d and /dev/null differ diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index e584b9120c..3ad9e8824f 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -1,7 +1,7 @@  - + Kestrel 4500NV Kestrel 4500NV Kestrel 4500NV @@ -13,7 +13,7 @@ Kestrel 4500NV Kestrel 4500NV - + Kestrel 4500 Pocket Weather Tracker Anemomentr skrzydełkowy Kestrel 4500 Карманная метеостанция Kestrel 4500NV diff --git a/addons/laser/functions/fnc_keyLaserCodeDown.sqf b/addons/laser/functions/fnc_keyLaserCodeDown.sqf index a27b376d59..f833c477c6 100644 --- a/addons/laser/functions/fnc_keyLaserCodeDown.sqf +++ b/addons/laser/functions/fnc_keyLaserCodeDown.sqf @@ -8,5 +8,5 @@ if(_oldLaserCode > ACE_DEFAULT_LASER_CODE) then { ACE_player setVariable [QGVAR(code), _laserCode, false]; }; if(_laserCode != _oldLaserCode) then { - [format ["%1: %2", localize "STR_ACE_laser_laserCode", _laserCode]] call EFUNC(common,displayTextStructured); + [format ["%1: %2", localize LSTRING(laserCode), _laserCode]] call EFUNC(common,displayTextStructured); }; \ No newline at end of file diff --git a/addons/laser/functions/fnc_keyLaserCodeUp.sqf b/addons/laser/functions/fnc_keyLaserCodeUp.sqf index 4e8750164c..5357cec14c 100644 --- a/addons/laser/functions/fnc_keyLaserCodeUp.sqf +++ b/addons/laser/functions/fnc_keyLaserCodeUp.sqf @@ -6,5 +6,5 @@ _oldLaserCode = ACE_player getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE]; _laserCode = _oldLaserCode + 1; ACE_player setVariable [QGVAR(code), _laserCode, false]; if(_laserCode != _oldLaserCode) then { -[format ["%1: %2", localize "STR_ACE_laser_laserCode", _laserCode]] call EFUNC(common,displayTextStructured); +[format ["%1: %2", localize LSTRING(laserCode), _laserCode]] call EFUNC(common,displayTextStructured); }; \ No newline at end of file diff --git a/addons/laser/functions/fnc_laserOn.sqf b/addons/laser/functions/fnc_laserOn.sqf index 9b5faa3859..901fa04b9a 100644 --- a/addons/laser/functions/fnc_laserOn.sqf +++ b/addons/laser/functions/fnc_laserOn.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" private ["_uuid", "_args"]; -_uuid = format["%1%2%3", floor diag_tickTime, floor random 1000, floor random 10000]; +_uuid = format["%1%2%3", floor ACE_diagTime, floor random 1000, floor random 10000]; _args = [_uuid, _this]; ["laser_laserOn", _args] call EFUNC(common,globalEvent); _uuid; diff --git a/addons/laser/initKeybinds.sqf b/addons/laser/initKeybinds.sqf index d367b3553c..5e3d017103 100644 --- a/addons/laser/initKeybinds.sqf +++ b/addons/laser/initKeybinds.sqf @@ -1,4 +1,4 @@ -["ACE3 Equipment", QGVAR(LaserCodeUp), localize "STR_ACE_laser_laserCodeUp", +["ACE3 Equipment", QGVAR(LaserCodeUp), localize LSTRING(laserCodeUp), { if( EGVAR(laser_selfdesignate,active) || @@ -12,7 +12,7 @@ {false}, [16, [false, true, true]], false, 0] call CBA_fnc_addKeybind; // (ALT+CTRL+Q) -["ACE3 Equipment", QGVAR(LaserCodeDown), localize "STR_ACE_laser_laserCodeDown", +["ACE3 Equipment", QGVAR(LaserCodeDown), localize LSTRING(laserCodeDown), { if( EGVAR(laser_selfdesignate,active) || diff --git a/addons/laser/script_component.hpp b/addons/laser/script_component.hpp index 77369ead96..6620f63c4d 100644 --- a/addons/laser/script_component.hpp +++ b/addons/laser/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT laser -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_LASER #define DEBUG_MODE_FULL @@ -9,7 +9,7 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_LASER #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" #define FIREMODE_DIRECT_LOAL 1 diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index 8ea28398e0..4a478096d0 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -1,7 +1,7 @@  - - + + Laser Code Lasercode Kod lasera @@ -13,7 +13,7 @@ Laser kód Codice laser - + Laser - Cycle Code Up Lasercode + Laser - Następny kod @@ -25,7 +25,7 @@ Laser - Kód + Codice laser + - + Laser - Cycle Code Down Lasercode - Laser - Poprzedni kod diff --git a/addons/laser_selfdesignate/$PBOPREFIX$ b/addons/laser_selfdesignate/$PBOPREFIX$ index 3871f5df99..821ffd07ea 100644 --- a/addons/laser_selfdesignate/$PBOPREFIX$ +++ b/addons/laser_selfdesignate/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\Addons\laser_selfdesignate \ No newline at end of file +z\ace\addons\laser_selfdesignate \ No newline at end of file diff --git a/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf index 6514c889a1..a75e58f533 100644 --- a/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf +++ b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf @@ -31,7 +31,7 @@ GVAR(initializedClasses) = _initializedClasses; // e.g.: _vehicle setVariable [format ["%1_%2", QGVAR(active), _x], false]; // Add actions - _onAction = [QGVAR(LaserOn), localize "STR_ACE_Laser_SelfDesignate_DesignatorOn", "", + _onAction = [QGVAR(LaserOn), localize LSTRING(DesignatorOn), "", { // Statement _this call FUNC(laserHudDesignateOn) @@ -41,7 +41,7 @@ GVAR(initializedClasses) = _initializedClasses; !GVAR(active) && {[ACE_player] call FUNC(unitTurretHasDesignator)} }] call EFUNC(interact_menu,createAction); - _offAction = [QGVAR(LaserOff), localize "STR_ACE_Laser_SelfDesignate_DesignatorOff", "", + _offAction = [QGVAR(LaserOff), localize LSTRING(DesignatorOff), "", { // Statement _this call FUNC(laserHudDesignateOff) diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index e0c835814e..0da2866738 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -32,7 +32,7 @@ FUNC(laserHudDesignatePFH) = { }; if( (count _args) < 4) then { - _args set[3, diag_tickTime + FCS_UPDATE_DELAY]; + _args set[3, ACE_diagTime + FCS_UPDATE_DELAY]; }; _forceUpdateTime = _args select 3; @@ -57,9 +57,9 @@ FUNC(laserHudDesignatePFH) = { }; */ - if(diag_tickTime > _forceUpdateTime) then { + if(ACE_diagTime > _forceUpdateTime) then { ["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent; - _args set[3, diag_tickTime + FCS_UPDATE_DELAY]; + _args set[3, ACE_diagTime + FCS_UPDATE_DELAY]; }; _this set[0, _args]; diff --git a/addons/laser_selfdesignate/functions/script_component.hpp b/addons/laser_selfdesignate/functions/script_component.hpp index 38c6d2c44b..320dc825c7 100644 --- a/addons/laser_selfdesignate/functions/script_component.hpp +++ b/addons/laser_selfdesignate/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\Addons\laser_selfdesignate\script_component.hpp" +#include "\z\ace\addons\laser_selfdesignate\script_component.hpp" diff --git a/addons/laser_selfdesignate/script_component.hpp b/addons/laser_selfdesignate/script_component.hpp index 46e9c48d2f..d0e095924d 100644 --- a/addons/laser_selfdesignate/script_component.hpp +++ b/addons/laser_selfdesignate/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT laser_selfdesignate -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_LASER_SELFDESIGNATE #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_LASER_SELFDESIGNATE #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/laserpointer/ACE_Settings.hpp b/addons/laserpointer/ACE_Settings.hpp new file mode 100644 index 0000000000..0536db730d --- /dev/null +++ b/addons/laserpointer/ACE_Settings.hpp @@ -0,0 +1,6 @@ +class ACE_Settings { + class GVAR(enabled) { + typeName = "BOOL"; + value = 1; + }; +}; diff --git a/addons/laserpointer/CfgWeapons.hpp b/addons/laserpointer/CfgWeapons.hpp index 6223c3a988..608d025a01 100644 --- a/addons/laserpointer/CfgWeapons.hpp +++ b/addons/laserpointer/CfgWeapons.hpp @@ -10,26 +10,26 @@ class CfgWeapons { class acc_pointer_IR: ItemCore { ACE_nextModeClass = "ACE_acc_pointer_red"; - ACE_modeDescription = "$STR_ACE_Laserpointer_IRLaser"; + ACE_modeDescription = CSTRING(IRLaser); - displayName = "$STR_ACE_Laserpointer_red"; - descriptionUse = "$STR_ACE_Laserpointer_useLaser"; + displayName = CSTRING(red); + descriptionUse = CSTRING(useLaser); }; class ACE_acc_pointer_red: ItemCore { ACE_nextModeClass = "acc_pointer_IR"; - ACE_modeDescription = "$STR_ACE_Laserpointer_Laser"; + ACE_modeDescription = CSTRING(Laser); ACE_laserpointer = 1; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_acc_pointer_red"; scope = 1; - displayName = "$STR_ACE_Laserpointer_red"; - descriptionUse = "$STR_ACE_Laserpointer_useLaser"; + displayName = CSTRING(red); + descriptionUse = CSTRING(useLaser); picture = "\A3\weapons_F\Data\UI\gear_accv_pointer_CA.paa"; model = "\A3\weapons_f\acc\accv_pointer_F"; - descriptionShort = "$STR_ACE_Laserpointer_Description"; + descriptionShort = CSTRING(Description); class ItemInfo: InventoryFlashLightItem_Base_F { mass = 6; @@ -69,23 +69,23 @@ class CfgWeapons { class ACE_acc_pointer_green_IR: acc_pointer_IR { ACE_nextModeClass = "ACE_acc_pointer_green"; - ACE_modeDescription = "$STR_ACE_Laserpointer_IRLaser"; + ACE_modeDescription = CSTRING(IRLaser); - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_acc_pointer_green"; scope = 1; - displayName = "$STR_ACE_Laserpointer_green"; + displayName = CSTRING(green); }; class ACE_acc_pointer_green: ACE_acc_pointer_red { ACE_nextModeClass = "ACE_acc_pointer_green_IR"; - ACE_modeDescription = "$STR_ACE_Laserpointer_Laser"; + ACE_modeDescription = CSTRING(Laser); ACE_laserpointer = 2; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_acc_pointer_green"; scope = 2; - displayName = "$STR_ACE_Laserpointer_green"; + displayName = CSTRING(green); }; }; diff --git a/addons/laserpointer/XEH_postInit.sqf b/addons/laserpointer/XEH_postInit.sqf index 38fc35f262..133931578a 100644 --- a/addons/laserpointer/XEH_postInit.sqf +++ b/addons/laserpointer/XEH_postInit.sqf @@ -1,33 +1,41 @@ // by commy2 #include "script_component.hpp" -// fixes laser when being captured. Needed, because the selectionpsoition of the right hand is used +// fixes laser when being captured. Needed, because the selectionPosition of the right hand is used ["SetHandcuffed", {if (_this select 1) then {(_this select 0) action ["GunLightOff", _this select 0]};}] call EFUNC(common,addEventHandler); +//If user has ASDG JR without the compat patch, then ace's' laser pointers won't be compatible with anything +if ((isClass (configFile >> "CfgPatches" >> "asdg_jointrails")) && {!(isClass (configFile >> "CfgPatches" >> "ace_asdg_comp"))}) then { + diag_log text format ["[ACE_laserpointer] - ASDG Joint Rails but no ace_asdg_comp"]; +}; + + if !(hasInterface) exitWith {}; GVAR(nearUnits) = []; -// @todo. Maybe move to common? -[{ - private "_nearUnits"; - _nearUnits = []; - - { - _nearUnits append crew _x; - - if (count _nearUnits > 10) exitWith { - _nearUnits resize 10; - }; - - } forEach nearestObjects [positionCameraToWorld [0,0,0], ["AllVehicles"], 50]; // when moving this, search also for units inside vehicles. currently breaks the laser in FFV - - GVAR(nearUnits) = _nearUnits; - -} , 5, []] call CBA_fnc_addPerFrameHandler; - -addMissionEventHandler ["Draw3D", { - call FUNC(onDraw); -}]; - #include "initKeybinds.sqf" + +["SettingsInitialized", { + //If not enabled, dont't add draw eventhandler or PFEH (for performance) + if (!GVAR(enabled)) exitWith {}; + + // @todo. Maybe move to common? + [{ + private "_nearUnits"; + _nearUnits = []; + { + _nearUnits append crew _x; + if (count _nearUnits > 10) exitWith { + _nearUnits resize 10; + }; + } forEach nearestObjects [positionCameraToWorld [0,0,0], ["AllVehicles"], 50]; // when moving this, search also for units inside vehicles. currently breaks the laser in FFV + + GVAR(nearUnits) = _nearUnits; + + } , 5, []] call CBA_fnc_addPerFrameHandler; + + addMissionEventHandler ["Draw3D", { + call FUNC(onDraw); + }]; +}] call EFUNC(common,addEventHandler); diff --git a/addons/laserpointer/config.cpp b/addons/laserpointer/config.cpp index 5ca5ce3470..d368512257 100644 --- a/addons/laserpointer/config.cpp +++ b/addons/laserpointer/config.cpp @@ -12,6 +12,7 @@ class CfgPatches { }; }; +#include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf index 93a421a094..e69fc5e271 100644 --- a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf +++ b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf @@ -1,6 +1,8 @@ // by commy2 and esteldunedain #include "script_component.hpp" +private ["_p0", "_p1", "_p0Pos", "_offV1", "_offV2", "_offV3", "_camPos", "_intermediatePos", "_iteration", "_light", "_line", "_pL", "_pL2", "_pX", "_size", "_units", "_fnc_getDistanceToTerrain", "_fnc_doesIntersectWithMan"]; + // init object /*if (isNil QGVAR(laserdot)) then { _light = "#lightpoint" createVehicleLocal [0,0,0]; @@ -14,7 +16,7 @@ GVAR(laserdot) = _light; };*/ -EXPLODE_3_PVT(_this,_unit,_range,_isGreen); +EXPLODE_4_PVT(_this,_unit,_range,_isGreen,_brightness); _p0Pos = _unit modelToWorldVisual (_unit selectionPosition "righthand"); @@ -47,7 +49,7 @@ _p1 = _p0 vectorAdd (_v1 vectorMultiply _range); //Debugaaa = lineIntersectsObjs [_p0, _p1, objNull, _unit, false, 2]; _fnc_getDistanceToTerrain = { - private "_distance"; + private ["_distance"]; _pX = + _p0; _line = [_p0, _pX]; @@ -55,9 +57,7 @@ _fnc_getDistanceToTerrain = { _distance = _this; _iteration = _distance; - while { - _iteration > 0.05 / 2 - } do { + while {_iteration > 0.05 / 2} do { _iteration = _iteration / 2; _pX = _p0 vectorAdd (_v1 vectorMultiply _distance); diff --git a/addons/laserpointer/functions/fnc_onDraw.sqf b/addons/laserpointer/functions/fnc_onDraw.sqf index c1e955d028..09663f9ecf 100644 --- a/addons/laserpointer/functions/fnc_onDraw.sqf +++ b/addons/laserpointer/functions/fnc_onDraw.sqf @@ -1,18 +1,19 @@ // by commy2 #include "script_component.hpp" -_brightness = 2 - call EFUNC(common,ambientBrightness); -_isIR = currentVisionMode ACE_player; +private ["_brightness", "_cacheName", "_isIR", "_laser", "_laserID", "_weapon"]; +_isIR = currentVisionMode ACE_player; if (_isIR == 2) exitWith {}; _isIR = _isIR == 1; +_brightness = 2 - call EFUNC(common,ambientBrightness); + { _weapon = currentWeapon _x; _laser = switch (_weapon) do { - case (""): {""}; case (primaryWeapon _x): { primaryWeaponItems _x select 1; }; @@ -34,7 +35,7 @@ _isIR = _isIR == 1; }; if (_laserID > 0 && {_x isFlashlightOn _weapon}) then { - [_x, 50, _laserID == 2 || _isIR] call FUNC(drawLaserpoint); + [_x, 50, (_laserID == 2 || _isIR), _brightness] call FUNC(drawLaserpoint); }; }; diff --git a/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf b/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf index 423090796f..99549ec18f 100644 --- a/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf +++ b/addons/laserpointer/functions/fnc_switchLaserLightMode.sqf @@ -1,7 +1,7 @@ // by commy2 #include "script_component.hpp" -private ["_unit", "_weapon"]; +private ["_unit", "_weapon", "_error"]; _unit = _this select 0; _weapon = _this select 1; @@ -37,6 +37,11 @@ _nextPointer = getText (_config >> "ACE_nextModeClass"); if (_nextPointer == "") exitWith {}; +//If system disabled, don't switch to a laser: +private "_nextPointerIsLaser"; +_nextPointerIsLaser = getNumber (configFile >> "CfgWeapons" >> _nextPointer >> "ACE_laserpointer"); +if ((!GVAR(enabled)) && {_nextPointerIsLaser == 1}) exitWith {}; + // disable inheritance for this entry, because addons claim this as a base class for convenience if !((_config >> "ACE_nextModeClass") in configProperties [_config, "true", false]) exitWith {}; @@ -44,21 +49,41 @@ private ["_description", "_picture"]; _description = getText (configFile >> "CfgWeapons" >> _nextPointer >> "ACE_modeDescription"); _picture = getText (configFile >> "CfgWeapons" >> _nextPointer >> "picture"); +_error = false; switch (_currentWeaponType) do { - case 1: { - _unit removePrimaryWeaponItem _pointer; - _unit addPrimaryWeaponItem _nextPointer; - }; - case 2: { - _unit removeSecondaryWeaponItem _pointer; - _unit addSecondaryWeaponItem _nextPointer; - }; - case 3: { - _unit removeHandgunItem _pointer; - _unit addHandgunItem _nextPointer; - }; + case 1: { + _unit removePrimaryWeaponItem _pointer; + _unit addPrimaryWeaponItem _nextPointer; + if (((primaryWeaponItems _unit) select 1) != _nextPointer) then { + ERROR("NextPointer not compatible"); + _unit addPrimaryWeaponItem _pointer; + _error = true; + }; + }; + case 2: { + _unit removeSecondaryWeaponItem _pointer; + _unit addSecondaryWeaponItem _nextPointer; + if (((secondaryWeaponItems _unit) select 1) != _nextPointer) then { + ERROR("NextPointer not compatible"); + _unit addSecondaryWeaponItem _pointer; + _error = true; + }; + }; + case 3: { + _unit removeHandgunItem _pointer; + _unit addHandgunItem _nextPointer; + if (((handgunItems _unit) select 1) != _nextPointer) then { + ERROR("NextPointer not compatible"); + _unit addHandgunItem _pointer; + _error = true; + }; + }; }; -[_description, _picture] call EFUNC(common,displayTextPicture); +if (!_error) then { + [_description, _picture] call EFUNC(common,displayTextPicture); +} else { + diag_log text format ["Failed to add %1 to %2 - reverting to %3", _nextPointer, _weapon, _pointer]; +}; playSound "ACE_Sound_Click"; diff --git a/addons/laserpointer/initKeybinds.sqf b/addons/laserpointer/initKeybinds.sqf index e01f3be5fa..a4164d420e 100644 --- a/addons/laserpointer/initKeybinds.sqf +++ b/addons/laserpointer/initKeybinds.sqf @@ -1,9 +1,9 @@ // by commy2 -["ACE3 Weapons", QGVAR(switchLaserLightMode), localize "STR_ACE_Laserpointer_switchLaserLight", +["ACE3 Weapons", QGVAR(switchLaserLightMode), localize LSTRING(switchLaserLight), { // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; diff --git a/addons/logistics_uavbattery/CfgVehicles.hpp b/addons/logistics_uavbattery/CfgVehicles.hpp index 5feba4c9a8..ca924a1cb8 100644 --- a/addons/logistics_uavbattery/CfgVehicles.hpp +++ b/addons/logistics_uavbattery/CfgVehicles.hpp @@ -1,15 +1,25 @@ class CfgVehicles { - class Helicopter_Base_F; - class UAV_01_base_F: Helicopter_Base_F { + class Air; + class Helicopter: Air { class ACE_Actions { - class ACE_MainActions { + class ACE_MainActions {}; + }; + }; + class Helicopter_Base_F: Helicopter { + class ACE_Actions: ACE_Actions{ + class ACE_MainActions: ACE_MainActions {}; + }; + }; + class UAV_01_base_F: Helicopter_Base_F { + class ACE_Actions: ACE_Actions{ + class ACE_MainActions: ACE_MainActions { class GVAR(RefuelUAV) { - displayName = "$STR_ACE_logistics_uavbattery_Recharge"; + displayName = CSTRING(Recharge); distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRefuelUAV)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(refuelUAV)); - showDisabled = 0; \ - priority = 1.245; \ + showDisabled = 0; + priority = 1.245; icon = QUOTE(PATHTOF(ui\UAV_battery_ca.paa)); }; }; diff --git a/addons/logistics_uavbattery/CfgWeapons.hpp b/addons/logistics_uavbattery/CfgWeapons.hpp index 1986b4f80f..923d2dd934 100644 --- a/addons/logistics_uavbattery/CfgWeapons.hpp +++ b/addons/logistics_uavbattery/CfgWeapons.hpp @@ -4,8 +4,8 @@ class CfgWeapons { class ACE_UAVBattery: ACE_ItemCore { scope = 2; - displayName = "$STR_ACE_logistics_uavbattery_Battery_Name"; - descriptionShort = "$STR_ACE_logistics_uavbattery_Battery_Description"; + displayName = CSTRING(Battery_Name); + descriptionShort = CSTRING(Battery_Description); model = QUOTE(PATHTOF(models\ace_battery.p3d)); picture = QUOTE(PATHTOF(ui\UAV_battery_ca.paa)); class ItemInfo: InventoryItem_Base_F { diff --git a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf index 6fda0fed10..e51f17777e 100644 --- a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf @@ -36,4 +36,4 @@ _onFailure = { [_caller, "AinvPknlMstpSnonWnonDr_medic5", 0] call EFUNC(common,doAnimation); -[10, [_caller, _target], _onFinish, _onFailure, (localize "STR_ACE_logistics_uavbattery_Battery_Recharge"), {(_this select 0) call FUNC(canRefuelUAV)}] call EFUNC(common,progressBar); +[10, [_caller, _target], _onFinish, _onFailure, (localize LSTRING(Battery_Recharge)), {(_this select 0) call FUNC(canRefuelUAV)}] call EFUNC(common,progressBar); diff --git a/addons/logistics_uavbattery/stringtable.xml b/addons/logistics_uavbattery/stringtable.xml index 8c0bd56675..5b3a219a30 100644 --- a/addons/logistics_uavbattery/stringtable.xml +++ b/addons/logistics_uavbattery/stringtable.xml @@ -1,7 +1,7 @@  - - + + Drone is full Drohne ist voll El VANT está lleno @@ -13,7 +13,7 @@ Il drone è pieno БПЛА полностью заряжен - + You need a UAV Battery Du brauchst eine UAV-Batterie Necesitas una batería para VANT @@ -25,7 +25,7 @@ Hai bisogno di una Batteria UAV Требуется аккумулятор для БПЛА - + Recharge Aufladen Recargar @@ -37,7 +37,7 @@ Ricarica Зарядить - + UAV Battery UAV-Batterie Batería para VANT @@ -49,7 +49,7 @@ Batteria UAV Аккумулятор БПЛА - + Used to refuel Carried UAV's Verwendet zum Aufladen von tragbaren UAVs Usada para reabastecer el VANT @@ -61,7 +61,7 @@ Usata per ricaricare la Batteria dell'UAV Используется для зарядки переносных БПЛА - + Recharging ... Aufladen ... Recargando ... diff --git a/addons/logistics_wirecutter/CfgWeapons.hpp b/addons/logistics_wirecutter/CfgWeapons.hpp index 648bc3a3f8..31de39cf2c 100644 --- a/addons/logistics_wirecutter/CfgWeapons.hpp +++ b/addons/logistics_wirecutter/CfgWeapons.hpp @@ -3,9 +3,9 @@ class CfgWeapons { class ACE_ItemCore; class ACE_wirecutter: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_logistics_wirecutter_wirecutterName"; - descriptionShort = "$STR_ACE_logistics_wirecutter_wirecutterDescription"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(wirecutterName); + descriptionShort = CSTRING(wirecutterDescription); model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = QUOTE(PATHTOF(ui\item_wirecutter_ca.paa)); scope = 2; diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf index 0cab7ab461..f45f0c1511 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf @@ -38,4 +38,4 @@ _progressCheck = { ((!isNull _fenceObject) && {(damage _fenceObject) < 1} && {("ACE_wirecutter" in (items ACE_player))}) }; -[_timeToCut, [_fenceObject,0], {(_this select 0) call FUNC(cutDownFenceCallback)}, {(_this select 0) call FUNC(cutDownFenceAbort)}, localize "STR_ACE_logistics_wirecutter_CuttingFence", _progressCheck] call EFUNC(common,progressBar); +[_timeToCut, [_fenceObject,0], {(_this select 0) call FUNC(cutDownFenceCallback)}, {(_this select 0) call FUNC(cutDownFenceAbort)}, localize LSTRING(CuttingFence), _progressCheck] call EFUNC(common,progressBar); diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFenceCallback.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFenceCallback.sqf index 77bc4f2ba6..57495a2a03 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFenceCallback.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFenceCallback.sqf @@ -18,5 +18,5 @@ PARAMS_1(_fenceObject); _fenceObject setdamage 1; -// [localize "STR_ACE_logistics_wirecutter_FenceCut"] call EFUNC(common,displayTextStructured); +// [localize LSTRING(FenceCut)] call EFUNC(common,displayTextStructured); [ACE_player, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); diff --git a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf index efb8f292c9..05c47c4454 100644 --- a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf +++ b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf @@ -53,7 +53,7 @@ if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; if ([_x] call FUNC(isFence)) then { _fencesHelped pushBack _x; _helper = "Sign_Sphere25cm_F" createVehicleLocal (getpos _x); - _action = [QGVAR(helperCutFence), (localize "STR_ACE_logistics_wirecutter_CutFence"), QUOTE(PATHTOF(ui\wirecutter_ca.paa)), _fncStatement, _fncCondition, {}, _x, [0,0,0], 5] call EFUNC(interact_menu,createAction); + _action = [QGVAR(helperCutFence), (localize LSTRING(CutFence)), QUOTE(PATHTOF(ui\wirecutter_ca.paa)), _fncStatement, _fncCondition, {}, _x, [0,0,0], 5] call EFUNC(interact_menu,createAction); [_helper, 0, [],_action] call EFUNC(interact_menu,addActionToObject); _helper setPosASL ((getPosASL _x) vectorAdd [0,0,1.25]); _helper hideObject true; diff --git a/addons/logistics_wirecutter/functions/fnc_isFence.sqf b/addons/logistics_wirecutter/functions/fnc_isFence.sqf index 1ab97a67af..4c247b268a 100644 --- a/addons/logistics_wirecutter/functions/fnc_isFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_isFence.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" //find is case sensitive, so keep everything lowercase -#define FENCE_TYPENAMES ["land_net_fence_4m_f", "land_net_fence_8m_f", "land_net_fenced_8m_f", "land_new_wiredfence_5m_f", "land_new_wiredfence_10m_dam_f", "land_new_wiredfence_10m_f", "land_pipe_fence_4m_f", "land_pipe_fence_4mnolc_f", "land_sportground_fence_f", "land_wired_fence_4m_f", "land_wired_fence_4md_f", "land_wired_fence_8m_f", "land_wired_fence_8md_f", "land_razorwire_f"] +#define FENCE_TYPENAMES ["land_net_fence_4m_f", "land_net_fence_8m_f", "land_net_fenced_8m_f", "land_new_wiredfence_5m_f", "land_new_wiredfence_10m_dam_f", "land_new_wiredfence_10m_f", "land_pipe_fence_4m_f", "land_pipe_fence_4mnolc_f", "land_sportground_fence_f", "land_wired_fence_4m_f", "land_wired_fence_4md_f", "land_wired_fence_8m_f", "land_wired_fence_8md_f", "land_razorwire_f", "ace_concertinawire"] #define FENCE_P3DS ["mil_wiredfence_f.p3d","wall_indfnc_3.p3d", "wall_indfnc_9.p3d", "wall_indfnc_corner.p3d", "pletivo_wired.p3d", "wall_fen1_5.p3d"] diff --git a/addons/logistics_wirecutter/stringtable.xml b/addons/logistics_wirecutter/stringtable.xml index b9e4023765..085971264c 100644 --- a/addons/logistics_wirecutter/stringtable.xml +++ b/addons/logistics_wirecutter/stringtable.xml @@ -1,7 +1,7 @@  - - + + Wirecutter Pince coupante Drahtschneider @@ -13,7 +13,7 @@ Trancia Cortador de Arame - + Wirecutter Schneidet Draht. Cortador de cables @@ -25,7 +25,7 @@ Trancia da ferro Cortador de Arame - + Cut Fence Zaun schneiden Cortar alambrado @@ -37,7 +37,7 @@ Drótkerítés átvágása Разрезать забор - + Cutting Fences / Wires ... Zaun / Draht schneiden ... Cortando alambrado / cables ... @@ -49,7 +49,7 @@ Drótok elvágása ... Разрезаем забор / провода ... - + Fence cut Zaun geschnitten Alambrado cortado diff --git a/addons/magazinerepack/CfgVehicles.hpp b/addons/magazinerepack/CfgVehicles.hpp index a5312369d5..78af19bcfe 100644 --- a/addons/magazinerepack/CfgVehicles.hpp +++ b/addons/magazinerepack/CfgVehicles.hpp @@ -3,9 +3,9 @@ class CfgVehicles { class CAManBase: Man { class ACE_SelfActions { class ACE_RepackMagazines { - displayName = "$STR_ACE_MagazineRepack_RepackMagazines"; + displayName = CSTRING(RepackMagazines); condition = QUOTE(true); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; insertChildren = QUOTE(_this call FUNC(getMagazineChildren)); priority = -2; icon = QUOTE(PATHTOF(UI\repack_ca.paa)); diff --git a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf index c4ddb2d93d..1f5be8f72a 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf @@ -26,12 +26,12 @@ EXPLODE_2_PVT(_args,_magazineClassname,_lastAmmoCount); _fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _magazineClassname >> "count"); //Don't show anything if player can't interact: -if (!([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith))) exitWith {}; +if (!([ACE_player, objNull, ["isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith))) exitWith {}; _structuredOutputText = if (_errorCode == 0) then { - format ["%1
", (localize "STR_ACE_MagazineRepack_RepackComplete")]; + format ["%1
", (localize LSTRING(RepackComplete))]; } else { - format ["%1
", (localize "STR_ACE_MagazineRepack_RepackInterrupted")]; + format ["%1
", (localize LSTRING(RepackInterrupted))]; }; _picture = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "picture"); @@ -51,6 +51,6 @@ _structuredOutputText = _structuredOutputText + format ["" + (localize "STR_ACE_MagazineRepack_RepackedMagazinesCount") + ""), _fullMags, _partialMags]; +// _structuredOutputText = _structuredOutputText + format [("" + (localize LSTRING(RepackedMagazinesCount)) + ""), _fullMags, _partialMags]; [parseText _structuredOutputText, 2] call EFUNC(common,displayTextStructured); diff --git a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf index 67c5c4630b..e57e569dc1 100644 --- a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf +++ b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf @@ -9,7 +9,7 @@ * 2: Magazine is a belt * * Return Value: - * Array in format [time, isBullet, array of ammo counts] + * Array in format [ACE_time, isBullet, array of ammo counts] * * Example: * [10, [1,2,3,8], false] call ace_magazinerepack_fnc_simulateRepackEvents = diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index bb98461316..e0621a41be 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -31,7 +31,7 @@ _fullMagazineCount = getNumber (_magazineCfg >> "count"); _isBelt = (isNumber (_magazineCfg >> "ACE_isBelt")) && {(getNumber (_magazineCfg >> "ACE_isBelt")) == 1}; //Check canInteractWith: -if (!([_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith))) exitWith {}; +if (!([_player, objNull, ["isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith))) exitWith {}; [_player] call EFUNC(common,goKneeling); @@ -67,7 +67,7 @@ _totalTime, [_magazineClassname, _startingAmmoCounts, _simEvents], {_this call FUNC(magazineRepackFinish)}, {_this call FUNC(magazineRepackFinish)}, -(localize "STR_ACE_MagazineRepack_RepackingMagazine"), +(localize LSTRING(RepackingMagazine)), {_this call FUNC(magazineRepackProgress)}, -["isNotInside"] +["isNotInside", "isNotSitting"] ] call EFUNC(common,progressBar); diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 8c1a0e01dc..c6879280da 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -76,7 +76,7 @@ Repacking Finished Réorganisation terminée - Wiederverpacken Fertig + Wiederverpacken fertig Reorganización finalizada Перепаковка завершена Páskování dokončeno @@ -88,7 +88,7 @@ Repacking Interrupted Réorganisation interrompue - Umpacken Unterbrochen + Umpacken unterbrochen Reorganización interrumpida Перепаковка прервана Páskování přerušeno @@ -110,4 +110,4 @@ %1 Total e %2 Parcial
-
+
\ No newline at end of file diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 175e5f63c7..1fb4a0b622 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -22,6 +22,13 @@ #define PATHTOEF(var1,var2) PATHTOF_SYS(PREFIX,var1,var2) +#ifndef STRING_MACROS_GUARD +#define STRING_MACROS_GUARD + #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) + #define LESTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) + #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) +#endif #define GETVAR_SYS(var1,var2) getVariable [ARR_2(QUOTE(var1),var2)] #define SETVAR_SYS(var1,var2) setVariable [ARR_2(QUOTE(var1),var2)] diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index c4bd23f779..b94cde4b31 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -4,9 +4,9 @@ #define PREFIX ace #define MAJOR 3 -#define MINOR 0 -#define PATCHLVL 0 -#define BUILD 3 +#define MINOR 1 +#define PATCHLVL 2 +#define BUILD 0 #define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD diff --git a/addons/map/$PBOPREFIX$ b/addons/map/$PBOPREFIX$ index 11a24a58d8..6fde8eb5b8 100644 --- a/addons/map/$PBOPREFIX$ +++ b/addons/map/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\Addons\map \ No newline at end of file +z\ace\addons\map \ No newline at end of file diff --git a/addons/map/CfgVehicles.hpp b/addons/map/CfgVehicles.hpp index a5194e015e..d1b7e38dba 100644 --- a/addons/map/CfgVehicles.hpp +++ b/addons/map/CfgVehicles.hpp @@ -1,68 +1,75 @@ class CfgVehicles { - class Module_F; - class ACE_ModuleMap: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class ACE_ModuleMap: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Map_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QFUNC(moduleMap); scope = 2; isGlobal = 1; icon = PATHTOF(UI\Icon_Module_Map_ca.paa); class Arguments { class MapIllumination { - displayName = "$STR_ACE_Map_MapIllumination_DisplayName"; - description = "$STR_ACE_Map_MapIllumination_Description"; + displayName = CSTRING(MapIllumination_DisplayName); + description = CSTRING(MapIllumination_Description); typeName = "BOOL"; defaultValue = 1; }; class MapShake { - displayName = "$STR_ACE_Map_MapShake_DisplayName"; - description = "$STR_ACE_Map_MapShake_Description"; + displayName = CSTRING(MapShake_DisplayName); + description = CSTRING(MapShake_Description); typeName = "BOOL"; defaultValue = 1; }; class MapLimitZoom { - displayName = "$STR_ACE_Map_MapLimitZoom_DisplayName"; - description = "$STR_ACE_Map_MapLimitZoom_Description"; + displayName = CSTRING(MapLimitZoom_DisplayName); + description = CSTRING(MapLimitZoom_Description); typeName = "BOOL"; defaultValue = 0; }; class MapShowCursorCoordinates { - displayName = "$STR_ACE_Map_MapShowCursorCoordinates_DisplayName"; - description = "$STR_ACE_Map_MapShowCursorCoordinates_Description"; + displayName = CSTRING(MapShowCursorCoordinates_DisplayName); + description = CSTRING(MapShowCursorCoordinates_Description); typeName = "BOOL"; defaultValue = 0; }; }; class ModuleDescription { - description = "$STR_ACE_Map_Module_Description"; + description = CSTRING(Module_Description); }; }; + class Module_F; class ACE_ModuleBlueForceTracking: Module_F { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Map_BFT_Module_DisplayName"; + displayName = CSTRING(BFT_Module_DisplayName); function = QFUNC(blueForceTrackingModule); scope = 2; isGlobal = 1; icon = PATHTOF(UI\Icon_Module_BFTracking_ca.paa); class Arguments { + class Enabled { + displayName = CSTRING(BFT_Enabled_DisplayName); + description = CSTRING(BFT_Enabled_Description); + typeName = "BOOL"; + defaultValue = 0; + }; class Interval { - displayName = "$STR_ACE_Map_BFT_Interval_DisplayName"; - description = "$STR_ACE_Map_BFT_Interval_Description"; + displayName = CSTRING(BFT_Interval_DisplayName); + description = CSTRING(BFT_Interval_Description); typeName = "NUMBER"; defaultValue = 1; }; class HideAiGroups { - displayName = "$STR_ACE_Map_BFT_HideAiGroups_DisplayName"; - description = "$STR_ACE_Map_BFT_HideAiGroups_Description"; + displayName = CSTRING(BFT_HideAiGroups_DisplayName); + description = CSTRING(BFT_HideAiGroups_Description); typeName = "BOOL"; defaultValue = 0; }; }; class ModuleDescription { - description = "$STR_ACE_Map_BFT_Module_Description"; + description = CSTRING(BFT_Module_Description); }; }; -}; \ No newline at end of file +}; diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index ccaf9041ab..a3f377544b 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -1,6 +1,8 @@ #include "script_component.hpp" -ADDON = false; +// Exit on Headless as well +if !(hasInterface) exitWith {}; + LOG(MSG_INIT); // Calculate the maximum zoom allowed for this map @@ -13,10 +15,16 @@ call FUNC(determineZoom); waitUntil {(!isNull findDisplay 12)}; GVAR(lastStillPosition) = ((findDisplay 12) displayCtrl 51) ctrlMapScreenToWorld [0.5, 0.5]; - GVAR(lastStillTime) = time; + GVAR(lastStillTime) = ACE_time; GVAR(isShaking) = false; ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}]; }; -ADDON = true; +["SettingsInitialized", { + // Start Blue Force Tracking if Enabled + if (GVAR(BFT_Enabled)) then { + GVAR(BFT_markers) = []; + [FUNC(blueForceTrackingUpdate), GVAR(BFT_Interval), []] call CBA_fnc_addPerFrameHandler; + }; +}] call EFUNC(common,addEventHandler); diff --git a/addons/map/functions/fnc_blueForceTrackingModule.sqf b/addons/map/functions/fnc_blueForceTrackingModule.sqf index c156c9527d..bab776c9ab 100644 --- a/addons/map/functions/fnc_blueForceTrackingModule.sqf +++ b/addons/map/functions/fnc_blueForceTrackingModule.sqf @@ -18,13 +18,9 @@ PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; -GVAR(BFT_Enabled) = true; +[_logic, QGVAR(BFT_Enabled), "Enabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(BFT_Interval), "Interval"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(BFT_HideAiGroups), "HideAiGroups"] call EFUNC(common,readSettingFromModule); diag_log text "[ACE]: Blue Force Tracking Module initialized."; -TRACE_2("[ACE]: Blue Force Tracking Module initialized.",GVAR(BFT_Interval), GVAR(BFT_HideAiGroups)); - -//start BFT: -GVAR(BFT_markers) = []; -[FUNC(blueForceTrackingUpdate), GVAR(BFT_Interval), []] call CBA_fnc_addPerFrameHandler; +TRACE_2("[ACE]: Blue Force Tracking Module initialized.", GVAR(BFT_Interval), GVAR(BFT_HideAiGroups)); diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index 441dc8103a..9c205299e6 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -26,7 +26,7 @@ _fnc_blendColor = { (_c1 select 3) * (1 - _alpha) + (_c2 select 3) * _alpha] }; -// Ambient light tint depending on time of day +// Ambient light tint depending on ACE_time of day _lightTint = switch (true) do { case (sunOrMoon == 1.0) : { [0.5,0.5,0.5,1] }; case (sunOrMoon > 0.80) : {[[1.0 - overcast,0.2,0,1], [1,1,1,1], (sunOrMoon - 0.8)/0.2] call _fnc_blendColor}; diff --git a/addons/map/functions/fnc_moduleMap.sqf b/addons/map/functions/fnc_moduleMap.sqf index 4bcdb69269..514d2af034 100644 --- a/addons/map/functions/fnc_moduleMap.sqf +++ b/addons/map/functions/fnc_moduleMap.sqf @@ -10,6 +10,8 @@ */ #include "script_component.hpp" +if !(isServer) exitWith {}; + PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; @@ -19,4 +21,4 @@ if !(_activated) exitWith {}; [_logic, QGVAR(mapLimitZoom), "MapLimitZoom" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(mapShowCursorCoordinates), "MapShowCursorCoordinates"] call EFUNC(common,readSettingFromModule); -diag_log text "[ACE]: Interaction Module Initialized."; +diag_log text "[ACE]: Map Module Initialized."; diff --git a/addons/map/functions/fnc_updateMapEffects.sqf b/addons/map/functions/fnc_updateMapEffects.sqf index 027197a150..3550df517c 100644 --- a/addons/map/functions/fnc_updateMapEffects.sqf +++ b/addons/map/functions/fnc_updateMapEffects.sqf @@ -46,8 +46,8 @@ if (GVAR(mapShake)) then { _amplitude = (_speed - 0.1) / 5 * (1000 * _mapScale); _time = 0.1; - _shakePos = [(GVAR(lastStillPosition) select 0) + sin((time + _time - GVAR(lastStillTime))*100) * _amplitude * 0.25, - (GVAR(lastStillPosition) select 1) + sin((time + _time - GVAR(lastStillTime))*260) * _amplitude]; + _shakePos = [(GVAR(lastStillPosition) select 0) + sin((ACE_time + _time - GVAR(lastStillTime))*100) * _amplitude * 0.25, + (GVAR(lastStillPosition) select 1) + sin((ACE_time + _time - GVAR(lastStillTime))*260) * _amplitude]; _mapCtrl ctrlMapAnimAdd [_time, _mapScale, _shakePos]; ctrlMapAnimCommit _mapCtrl; @@ -57,14 +57,14 @@ if (GVAR(mapShake)) then { } else { if (GVAR(isShaking)) then { // Stop shaking, return to original position + ctrlMapAnimClear _mapCtrl; _mapCtrl ctrlMapAnimAdd [0, _mapScale, GVAR(lastStillPosition)]; ctrlMapAnimCommit _mapCtrl; GVAR(isShaking) = false; } else { // The map is still, store state - ctrlMapAnimClear _mapCtrl; GVAR(lastStillPosition) = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; - GVAR(lastStillTime) = time; + GVAR(lastStillTime) = ACE_time; }; }; }; diff --git a/addons/map/script_component.hpp b/addons/map/script_component.hpp index 3f126eb653..c62086b03a 100644 --- a/addons/map/script_component.hpp +++ b/addons/map/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT map -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_MAP #define DEBUG_MODE_FULL @@ -9,7 +9,7 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MAP #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" #define MARKERNAME_MAPTOOL_FIXED "ACE_MapToolFixed" diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index c93ff4c286..8e3ae52da5 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -4,66 +4,136 @@ Map Mapa + Mapa + Karte + Mapa + Mapa Map illumination? Oświetlenie mapy + ¿Iluminación de mapa? + Kartenausleuchtung + Osvětlení mapy + Iluminação do mapa? Calculate dynamic map illumination based on light conditions? Oblicza dynamiczne oświetlenie mapy bazujące na warunkach oświetleniowych + Calcula la iluminación dinámica del mapa basandose en las condiciones de luz + Berechne die Kartenauslichtung anhand des Umgebungslichts? + Vypočítat dynamické osvětlení mapy na základně světelných podmínek? + Calcular a iluminação dinâmica do mapa de acordo com as condições de luz? Map shake? Drżenie mapy + ¿Temblor de mapa? + Kamerawackeln + Třesení mapy? + Tremor de mapa? Make map shake when walking? Ekran mapy drży podczas ruchu + Hace que el mapa tiemble cuando caminas + Kamerawackeln beim Gehen? + Umožnit třesení mapy za pochodu? + Tremer o mapa enquanto caminha? Limit map zoom? Ograniczony zoom + ¿Limitar el zoom de mapa? + Kartenzoom einschränken + Omezit přiblížení mapy? + Limitar zoom do mapa? Limit the amount of zoom available for the map? Ogranicza maksymalny stopień przybliżenia mapy + Limita la cantidad de zoom disponible para el mapa + Zoomstufe der Karte einschränken? + Omezit stupeň přiblížení pro mapu? + Limitar a quantidade de zoom disponível para o mapa? Show cursor coordinates? Koordynaty pod kursorem + ¿Mostrar coordenadas de cursor? + Zeige Cursor-Koordinaten? + Zobrazit souřadnice u kurzoru? + Mostrar coordenadas no cursor? Show the grid coordinates on the mouse pointer? Pokazuje pod kursorem koordynaty wskazanego kwadratu mapy + Muestra las coordenadas de la cuadricula en el puntero del ratón + Gitter-Koordinaten auf dem Mauszeiger anzeigen? + Zobrazit souřadnice u kurzoru v mapě? + Mostrar as coordenadas de grade no ponteiro do mouse? Moduł ten pozwala dostosować opcje widoku ekranu mapy. + Dieses Modul erweitert die Kartenfunktionen. + Tento modul umožňuje přizpůsobit mapu s obrazem. + Este módulo permite que você personalize a tela de mapa. Blue Force Tracking Blue Force Tracking + Seguimiento de fuerzas amigas + Blue Force Tracking + Blue Force Tracking + Rastreio de forças azuis + + + BFT Enable + RFA ativo + + + Enable Blue Force Tracking. Default: No + Ativa Rastreio de Forças Azuis. Padrão: Não Interval Interwał + Intervalo + Intervall + Interval + Intervalo How often the markers should be refreshed (in seconds) Jak często markery powinny być odświeżane (w sekundach) + Frecuencia de actualización de los marcadores (en segundos) + Wie oft sollen die Markierungen aktualisiert werden (in Sekunden) + Jak často budou značky aktualizovány (v sekundách) + Frequência em que os marcadores devem ser atualizados (em segundos) Hide AI groups? Ukryj grupy AI + ¿Ocultar grupos de IA? + KI-Gruppen verstecken? + Skrýt AI skupiny? + Esconder grupos de IA? Hide markers for 'AI only' groups? Ukrywa markery dla grup złożonych tylko z AI + Oculta las marcas de grupos 'solo IA' + Verstecke Marker für "nur KI"-Gruppen? + Skrýt značky pouze pro AI skupiny? + Esconder marcadores que pertencem ao grupo de IA? Pozwala śledzić na mapie pozycje sojuszniczych jednostek za pomocą markerów BFT. + Dieses Modul ermöglicht es verbündete Einheiten mit dem BFT auf der Karte zu verfolgen. + Umožňuje sledovat přátelské jednokty na mapě v rámci BFT. + Permite que você acompanhe as posições no mapa das unidades aliadas com marcadores RFA.
\ No newline at end of file diff --git a/addons/maptools/$PBOPREFIX$ b/addons/maptools/$PBOPREFIX$ index 15fe8ae13f..89df7fa624 100644 --- a/addons/maptools/$PBOPREFIX$ +++ b/addons/maptools/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\Addons\maptools \ No newline at end of file +z\ace\addons\maptools \ No newline at end of file diff --git a/addons/maptools/CfgVehicles.hpp b/addons/maptools/CfgVehicles.hpp index d9eb295871..5c3266d2d6 100644 --- a/addons/maptools/CfgVehicles.hpp +++ b/addons/maptools/CfgVehicles.hpp @@ -4,66 +4,66 @@ class CfgVehicles { class ACE_SelfActions { class ACE_MapTools { - displayName = "$STR_ACE_MapTools_MapTools_Menu"; + displayName = CSTRING(MapTools_Menu); condition = QUOTE((call FUNC(canUseMapTools) || {call FUNC(canUseMapGPS)})); statement = ""; - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 0; priority = 100; class ACE_MapToolsHide { - displayName = "$STR_ACE_MapTools_MapToolsHide"; + displayName = CSTRING(MapToolsHide); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 0})); statement = QUOTE(GVAR(mapTool_Shown) = 0; [] call FUNC(updateMapToolMarkers)); - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 5; }; class ACE_MapToolsShowNormal { - displayName = "$STR_ACE_MapTools_MapToolsShowNormal"; + displayName = CSTRING(MapToolsShowNormal); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 1})); statement = QUOTE(GVAR(mapTool_Shown) = 1; [] call FUNC(updateMapToolMarkers)); - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 4; }; class ACE_MapToolsShowSmall { - displayName = "$STR_ACE_MapTools_MapToolsShowSmall"; + displayName = CSTRING(MapToolsShowSmall); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 2})); statement = QUOTE(GVAR(mapTool_Shown) = 2; [] call FUNC(updateMapToolMarkers)); - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 3; }; class ACE_MapToolsAlignNorth { - displayName = "$STR_ACE_MapTools_MapToolsAlignNorth"; + displayName = CSTRING(MapToolsAlignNorth); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 0})); statement = QUOTE(GVAR(mapTool_angle) = 0; [] call FUNC(updateMapToolMarkers)); - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 2; }; class ACE_MapToolsAlignCompass { - displayName = "$STR_ACE_MapTools_MapToolsAlignCompass"; + displayName = CSTRING(MapToolsAlignCompass); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 0} && {('ItemCompass' in assigneditems ACE_player) || {'ItemCompass' in assigneditems ACE_player}})); statement = QUOTE(GVAR(mapTool_angle) = getDir ACE_player; [] call FUNC(updateMapToolMarkers)); - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 1; }; class ACE_MapGpsShow { - displayName = "$STR_ACE_MapTools_MapGpsShow"; + displayName = CSTRING(MapGpsShow); condition = QUOTE((call FUNC(canUseMapGPS) && {!GVAR(mapGpsShow)})); statement = QUOTE(GVAR(mapGpsShow) = true; [GVAR(mapGpsShow)] call FUNC(openMapGps)); - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 0; priority = 0; }; class ACE_MapGpsHide { - displayName = "$STR_ACE_MapTools_MapGpsHide"; + displayName = CSTRING(MapGpsHide); condition = QUOTE((call FUNC(canUseMapGPS) && {GVAR(mapGpsShow)})); statement = QUOTE(GVAR(mapGpsShow) = false; [GVAR(mapGpsShow)] call FUNC(openMapGps)); - exceptions[] = {"isNotDragging", "notOnMap", "isNotInside"}; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 0; priority = 0; }; @@ -73,7 +73,7 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { class ACE_CopyMap { - displayName = "$STR_ACE_MapTools_CopyMap"; + displayName = CSTRING(CopyMap); condition = QUOTE(([_target] call EFUNC(common,isPlayer) && {'ItemMap' in assigneditems _player} && {'ACE_MapTools' in items _player} && {'ItemMap' in assignedItems _target})); statement = QUOTE([ARR_2(_player,_target)] call FUNC(copyMapStart)); showDisabled = 0; diff --git a/addons/maptools/CfgWeapons.hpp b/addons/maptools/CfgWeapons.hpp index 9d4d313c43..2e2271509b 100644 --- a/addons/maptools/CfgWeapons.hpp +++ b/addons/maptools/CfgWeapons.hpp @@ -3,8 +3,8 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_MapTools: ACE_ItemCore { - displayName = "$STR_ACE_MapTools_Name"; - descriptionShort = "$STR_ACE_MapTools_Description"; + displayName = CSTRING(Name); + descriptionShort = CSTRING(Description); model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = PATHTOF(UI\maptool_item.paa); scope = 2; diff --git a/addons/maptools/script_component.hpp b/addons/maptools/script_component.hpp index 30a9f83d0d..5d5c524419 100644 --- a/addons/maptools/script_component.hpp +++ b/addons/maptools/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT maptools -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_MAPTOOLS #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MAPTOOLS #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index d9bdcb02c5..07b2e5dc88 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -1,6 +1,6 @@  - + Map Tools Herramientas de mapa diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index 6c5160c031..c55e07c360 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -25,7 +25,7 @@ PARAMS_1(_display); //Can't place markers when can't interact - if (!([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith))) exitWith { + if (!([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith))) exitWith { _display closeDisplay 2; //emulate "Cancel" button }; diff --git a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf index 747c0d4bbb..1210b8ce71 100644 --- a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf +++ b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf @@ -25,6 +25,6 @@ if (_direction < 0) then { _direction = _direction + 360; }; -((ctrlParent _ctrl) displayCtrl 1221) ctrlSetText format [localize "STR_ACE_Markers_MarkerDirection", _direction]; +((ctrlParent _ctrl) displayCtrl 1221) ctrlSetText format [localize LSTRING(MarkerDirection), _direction]; GVAR(currentMarkerAngle) = _data; diff --git a/addons/medical/ACE_Medical_Actions.hpp b/addons/medical/ACE_Medical_Actions.hpp index 9052df81da..ecb9afdfe4 100644 --- a/addons/medical/ACE_Medical_Actions.hpp +++ b/addons/medical/ACE_Medical_Actions.hpp @@ -1,6 +1,6 @@ class ACE_Head { - displayName = "$STR_ACE_Interaction_Head"; + displayName = CSTRING(Head); runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); ACTION_CONDITION @@ -9,7 +9,7 @@ class ACE_Head { icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(treatment)); @@ -21,7 +21,7 @@ class ACE_Head { }; // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(treatment)); @@ -32,54 +32,54 @@ class ACE_Head { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\bandage.paa); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\bandage.paa); }; class CheckPulse: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CheckPulse"; + displayName = CSTRING(Actions_CheckPulse); condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(treatment)); EXCEPTIONS icon = ""; }; class CheckBloodPressure: CheckPulse { - displayName = "$STR_ACE_Medical_Actions_CheckBloodPressure"; + displayName = CSTRING(Actions_CheckBloodPressure); condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(treatment)); EXCEPTIONS }; class CheckResponse: CheckPulse { - displayName = "$STR_ACE_Medical_Check_Response"; + displayName = CSTRING(Check_Response); condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(treatment)); EXCEPTIONS }; class Diagnose: CheckPulse { - displayName = "$STR_ACE_Medical_Actions_Diagnose"; + displayName = CSTRING(Actions_Diagnose); condition = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(treatment)); EXCEPTIONS }; }; class ACE_Torso { - displayName = "$STR_ACE_Interaction_Torso"; + displayName = CSTRING(Torso); runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); ACTION_CONDITION @@ -88,7 +88,7 @@ class ACE_Torso { icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(treatment)); @@ -100,7 +100,7 @@ class ACE_Torso { icon = PATHTOF(UI\icons\bandage.paa); }; class PlaceInBodyBag { - displayName = "$STR_ACE_Medical_PlaceInBodyBag"; + displayName = CSTRING(PlaceInBodyBag); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'body', 'BodyBag')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'BodyBag')] call DFUNC(treatment)); @@ -111,7 +111,7 @@ class ACE_Torso { enableInside = 1; }; class TriageCard { - displayName = "$STR_ACE_Medical_Actions_TriageCard"; + displayName = CSTRING(Actions_TriageCard); distance = 2.0; condition = "true"; statement = QUOTE([ARR_2(_target, true)] call DFUNC(displayTriageCard)); @@ -125,7 +125,7 @@ class ACE_Torso { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(treatment)); @@ -137,42 +137,42 @@ class ACE_Torso { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\bandage.paa); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\bandage.paa); }; class SurgicalKit: fieldDressing { - displayName = "$STR_ACE_Medical_Use_SurgicalKit"; + displayName = CSTRING(Use_SurgicalKit); condition = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\surgicalKit.paa); }; class PersonalAidKit: fieldDressing { - displayName = "$STR_ACE_Medical_Use_Aid_Kit"; + displayName = CSTRING(Use_Aid_Kit); condition = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(treatment)); EXCEPTIONS icon = ""; }; class CPR: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CPR"; + displayName = CSTRING(Actions_CPR); condition = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(treatment)); EXCEPTIONS @@ -180,7 +180,7 @@ class ACE_Torso { }; }; class ACE_ArmLeft { - displayName = "$STR_ACE_Interaction_ArmLeft"; + displayName = ECSTRING(interaction,ArmLeft); runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); ACTION_CONDITION @@ -190,7 +190,7 @@ class ACE_ArmLeft { distance = MEDICAL_ACTION_DISTANCE; class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(treatment)); @@ -203,7 +203,7 @@ class ACE_ArmLeft { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(treatment)); @@ -214,131 +214,131 @@ class ACE_ArmLeft { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\bandage.paa); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\bandage.paa); }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\autoInjector.paa); }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\autoInjector.paa); }; class BloodIV: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Blood4_1000"; + displayName = CSTRING(Actions_Blood4_1000); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\iv.paa); }; class BloodIV_500: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_500"; + displayName = CSTRING(Actions_Blood4_500); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class BloodIV_250: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_250"; + displayName = CSTRING(Actions_Blood4_250); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'BloodIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_1000"; + displayName = CSTRING(Actions_Plasma4_1000); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_500: PlasmaIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_500"; + displayName = CSTRING(Actions_Plasma4_500); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_250: PlasmaIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_250"; + displayName = CSTRING(Actions_Plasma4_250); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PlasmaIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_1000"; + displayName = CSTRING(Actions_Saline4_1000); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_500: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_500"; + displayName = CSTRING(Actions_Saline4_500); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_250: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_250"; + displayName = CSTRING(Actions_Saline4_250); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'SalineIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class CheckPulse: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CheckPulse"; + displayName = CSTRING(Actions_CheckPulse); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(treatment)); EXCEPTIONS icon = ""; }; class CheckBloodPressure: CheckPulse { - displayName = "$STR_ACE_Medical_Actions_CheckBloodPressure"; + displayName = CSTRING(Actions_CheckBloodPressure); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(treatment)); EXCEPTIONS }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(treatment)); EXCEPTIONS }; }; class ACE_ArmRight { - displayName = "$STR_ACE_Interaction_ArmRight"; + displayName = ECSTRING(interaction,ArmRight); runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); ACTION_CONDITION @@ -348,7 +348,7 @@ class ACE_ArmRight { distance = MEDICAL_ACTION_DISTANCE; class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(treatment)); @@ -361,7 +361,7 @@ class ACE_ArmRight { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(treatment)); @@ -372,120 +372,120 @@ class ACE_ArmRight { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(treatment)); EXCEPTIONS }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(treatment)); EXCEPTIONS }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(treatment)); EXCEPTIONS }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(treatment)); EXCEPTIONS }; class BloodIV: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Blood4_1000"; + displayName = CSTRING(Actions_Blood4_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)); EXCEPTIONS icon = PATHTOF(UI\icons\iv.paa); }; class BloodIV_500: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_500"; + displayName = CSTRING(Actions_Blood4_500); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class BloodIV_250: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_250"; + displayName = CSTRING(Actions_Blood4_250); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_1000"; + displayName = CSTRING(Actions_Plasma4_1000); 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 { - displayName = "$STR_ACE_Medical_Actions_Plasma4_500"; + displayName = CSTRING(Actions_Plasma4_500); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_250: PlasmaIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_250"; + displayName = CSTRING(Actions_Plasma4_250); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_1000"; + displayName = CSTRING(Actions_Saline4_1000); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_500: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_500"; + displayName = CSTRING(Actions_Saline4_500); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_250: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_250"; + displayName = CSTRING(Actions_Saline4_250); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'SalineIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class CheckPulse: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CheckPulse"; + displayName = CSTRING(Actions_CheckPulse); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(treatment)); EXCEPTIONS icon = ""; }; class CheckBloodPressure: CheckPulse { - displayName = "$STR_ACE_Medical_Actions_CheckBloodPressure"; + displayName = CSTRING(Actions_CheckBloodPressure); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(treatment)); EXCEPTIONS }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(treatment)); EXCEPTIONS @@ -493,7 +493,7 @@ class ACE_ArmRight { }; class ACE_LegLeft { - displayName = "$STR_ACE_Interaction_LegLeft"; + displayName = ECSTRING(interaction,LegLeft); runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); ACTION_CONDITION @@ -503,7 +503,7 @@ class ACE_LegLeft { distance = MEDICAL_ACTION_DISTANCE; class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(treatment)); @@ -517,7 +517,7 @@ class ACE_LegLeft { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(treatment)); @@ -528,115 +528,115 @@ class ACE_LegLeft { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(treatment)); EXCEPTIONS }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(treatment)); EXCEPTIONS }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\autoInjector.paa); }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(treatment)); EXCEPTIONS }; class BloodIV: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Blood4_1000"; + displayName = CSTRING(Actions_Blood4_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)); EXCEPTIONS icon = PATHTOF(UI\icons\iv.paa); }; class BloodIV_500: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_500"; + displayName = CSTRING(Actions_Blood4_500); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class BloodIV_250: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_250"; + displayName = CSTRING(Actions_Blood4_250); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_1000"; + displayName = CSTRING(Actions_Plasma4_1000); 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 { - displayName = "$STR_ACE_Medical_Actions_Plasma4_500"; + displayName = CSTRING(Actions_Plasma4_500); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_250: PlasmaIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_250"; + displayName = CSTRING(Actions_Plasma4_250); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_1000"; + displayName = CSTRING(Actions_Saline4_1000); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_500: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_500"; + displayName = CSTRING(Actions_Saline4_500); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_250: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_250"; + displayName = CSTRING(Actions_Saline4_250); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'SalineIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(treatment)); EXCEPTIONS }; }; class ACE_LegRight { - displayName = "$STR_ACE_Interaction_LegRight"; + displayName = ECSTRING(interaction,LegRight); runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); ACTION_CONDITION @@ -646,7 +646,7 @@ class ACE_LegRight { distance = MEDICAL_ACTION_DISTANCE; class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(treatment)); @@ -660,7 +660,7 @@ class ACE_LegRight { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(treatment)); @@ -671,107 +671,107 @@ class ACE_LegRight { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(treatment)); EXCEPTIONS }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(treatment)); EXCEPTIONS }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(treatment)); EXCEPTIONS }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(treatment)); EXCEPTIONS }; class BloodIV: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Blood4_1000"; + displayName = CSTRING(Actions_Blood4_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)); EXCEPTIONS icon = PATHTOF(UI\icons\iv.paa); }; class BloodIV_500: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_500"; + displayName = CSTRING(Actions_Blood4_500); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class BloodIV_250: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Blood4_250"; + displayName = CSTRING(Actions_Blood4_250); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_1000"; + displayName = CSTRING(Actions_Plasma4_1000); 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 { - displayName = "$STR_ACE_Medical_Actions_Plasma4_500"; + displayName = CSTRING(Actions_Plasma4_500); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_250: PlasmaIV { - displayName = "$STR_ACE_Medical_Actions_Plasma4_250"; + displayName = CSTRING(Actions_Plasma4_250); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV: BloodIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_1000"; + displayName = CSTRING(Actions_Saline4_1000); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_500: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_500"; + displayName = CSTRING(Actions_Saline4_500); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_500')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_500')] call DFUNC(treatment)); EXCEPTIONS }; class SalineIV_250: SalineIV { - displayName = "$STR_ACE_Medical_Actions_Saline4_250"; + displayName = CSTRING(Actions_Saline4_250); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_250')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'SalineIV_250')] call DFUNC(treatment)); EXCEPTIONS }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(treatment)); EXCEPTIONS diff --git a/addons/medical/ACE_Medical_SelfActions.hpp b/addons/medical/ACE_Medical_SelfActions.hpp index 5b98448664..0f85930f51 100644 --- a/addons/medical/ACE_Medical_SelfActions.hpp +++ b/addons/medical/ACE_Medical_SelfActions.hpp @@ -1,23 +1,23 @@ class Medical { - displayName = "$STR_ACE_Medical_Actions_Medical"; + displayName = CSTRING(Actions_Medical); runOnHover = 1; hotkey = "M"; - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class ACE_Head { - displayName = "$STR_ACE_Interaction_Head"; + displayName = CSTRING(Head); icon = PATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); modifierFunction = QUOTE([ARR_4(_target,_player,0,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; runOnHover = 1; class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -29,7 +29,7 @@ class Medical { }; // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'head', 'FieldDressing')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -40,46 +40,46 @@ class Medical { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'head', 'PackingBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'head', 'ElasticBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\bandage.paa); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'head', 'QuikClot')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\bandage.paa); }; class CheckPulse: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CheckPulse"; + displayName = CSTRING(Actions_CheckPulse); condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckPulse')] call DFUNC(treatment)); icon = ""; }; class CheckBloodPressure: CheckPulse { - displayName = "$STR_ACE_Medical_Actions_CheckBloodPressure"; + displayName = CSTRING(Actions_CheckBloodPressure); condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckBloodPressure')] call DFUNC(treatment)); }; }; class ACE_Torso { - displayName = "$STR_ACE_Interaction_Torso"; + displayName = CSTRING(Torso); distance = 5.0; condition = "true"; runOnHover = 1; - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); modifierFunction = QUOTE([ARR_4(_target,_player,1,_this select 3)] call FUNC(modifyMedicalAction)); showDisabled = 1; @@ -88,7 +88,7 @@ class Medical { icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -100,7 +100,7 @@ class Medical { }; class TriageCard { - displayName = "$STR_ACE_Medical_Actions_TriageCard"; + displayName = CSTRING(Actions_TriageCard); distance = 2.0; condition = "true"; exceptions[] = {"isNotInside"}; @@ -113,7 +113,7 @@ class Medical { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'body', 'FieldDressing')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -124,21 +124,21 @@ class Medical { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'body', 'PackingBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'body', 'ElasticBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\bandage.paa); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(treatment)); @@ -146,16 +146,16 @@ class Medical { }; }; class ACE_ArmLeft { - displayName = "$STR_ACE_Interaction_ArmLeft"; + displayName = ECSTRING(interaction,ArmLeft); runOnHover = 1; - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); modifierFunction = QUOTE([ARR_4(_target,_player,2,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -168,7 +168,7 @@ class Medical { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'FieldDressing')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -179,85 +179,85 @@ class Medical { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'PackingBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'ElasticBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\bandage.paa); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'QuikClot')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\bandage.paa); }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\autoInjector.paa); }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\autoInjector.paa); }; class CheckPulse: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CheckPulse"; + displayName = CSTRING(Actions_CheckPulse); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckPulse')] call DFUNC(treatment)); icon = ""; }; class CheckBloodPressure: CheckPulse { - displayName = "$STR_ACE_Medical_Actions_CheckBloodPressure"; + displayName = CSTRING(Actions_CheckBloodPressure); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'CheckBloodPressure')] call DFUNC(treatment)); }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'RemoveTourniquet')] call DFUNC(treatment)); }; }; class ACE_ArmRight { - displayName = "$STR_ACE_Interaction_ArmRight"; + displayName = ECSTRING(interaction,ArmRight); runOnHover = 1; - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); modifierFunction = QUOTE([ARR_4(_target,_player,3,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -270,7 +270,7 @@ class Medical { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'FieldDressing')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -281,81 +281,81 @@ class Medical { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PackingBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'ElasticBandage')] call DFUNC(treatment)); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'QuikClot')] call DFUNC(treatment)); }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(treatment)); }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(treatment)); }; class CheckPulse: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CheckPulse"; + displayName = CSTRING(Actions_CheckPulse); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckPulse')] call DFUNC(treatment)); icon = ""; }; class CheckBloodPressure: CheckPulse { - displayName = "$STR_ACE_Medical_Actions_CheckBloodPressure"; + displayName = CSTRING(Actions_CheckBloodPressure); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'CheckBloodPressure')] call DFUNC(treatment)); }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'RemoveTourniquet')] call DFUNC(treatment)); }; }; class ACE_LegLeft { - displayName = "$STR_ACE_Interaction_LegLeft"; + displayName = ECSTRING(interaction,LegLeft); runOnHover = 1; - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); modifierFunction = QUOTE([ARR_4(_target,_player,4,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -369,7 +369,7 @@ class Medical { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'FieldDressing')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -380,69 +380,69 @@ class Medical { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PackingBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'ElasticBandage')] call DFUNC(treatment)); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'QuikClot')] call DFUNC(treatment)); }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\autoInjector.paa); }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(treatment)); }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'RemoveTourniquet')] call DFUNC(treatment)); }; }; class ACE_LegRight { - displayName = "$STR_ACE_Interaction_LegRight"; + displayName = ECSTRING(interaction,LegRight); runOnHover = 1; - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); modifierFunction = QUOTE([ARR_4(_target,_player,5,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; + displayName = CSTRING(Bandage); distance = 2.0; condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -456,7 +456,7 @@ class Medical { // Advanced medical class FieldDressing { - displayName = "$STR_ACE_Medical_Actions_FieldDressing"; + displayName = CSTRING(Actions_FieldDressing); distance = 5.0; condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'FieldDressing')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; @@ -467,52 +467,52 @@ class Medical { icon = PATHTOF(UI\icons\bandage.paa); }; class PackingBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_PackingBandage"; + displayName = CSTRING(Actions_PackingBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PackingBandage')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\packingBandage.paa); }; class ElasticBandage: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_ElasticBandage"; + displayName = CSTRING(Actions_ElasticBandage); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'ElasticBandage')] call DFUNC(treatment)); }; class QuikClot: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_QuikClot"; + displayName = CSTRING(Actions_QuikClot); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'QuikClot')] call DFUNC(treatment)); }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_Tourniquet"; + displayName = CSTRING(Actions_Tourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\tourniquet.paa); }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; + displayName = CSTRING(Inject_Morphine); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(treatment)); icon = PATHTOF(UI\icons\autoInjector.paa); }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; + displayName = CSTRING(Inject_Atropine); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(treatment)); }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(treatment)); }; class RemoveTourniquet: Tourniquet { - displayName = "$STR_ACE_Medical_Actions_RemoveTourniquet"; + displayName = CSTRING(Actions_RemoveTourniquet); condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(canTreatCached)); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'RemoveTourniquet')] call DFUNC(treatment)); diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 9848410c8c..8eacf39006 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -2,8 +2,8 @@ class ACE_Medical_Actions { class Basic { class Bandage { - displayName = "$STR_ACE_Medical_Bandage"; - displayNameProgress = "$STR_ACE_Medical_Bandaging"; + displayName = CSTRING(Bandage); + displayNameProgress = CSTRING(Bandaging); treatmentLocations[] = {"All"}; requiredMedic = 0; @@ -27,8 +27,8 @@ class ACE_Medical_Actions { litter[] = { {"All", "", {{"ACE_MedicalLitterBase", "ACE_MedicalLitter_bandage1", "ACE_MedicalLitter_bandage2", "ACE_MedicalLitter_bandage3"}}} }; }; class Morphine: Bandage { - displayName = "$STR_ACE_Medical_Inject_Morphine"; - displayNameProgress = "$STR_ACE_Medical_Injecting_Morphine"; + displayName = CSTRING(Inject_Morphine); + displayNameProgress = CSTRING(Injecting_Morphine); treatmentTime = 2; items[] = {"ACE_morphine"}; callbackSuccess = QUOTE(DFUNC(treatmentBasic_morphine)); @@ -36,8 +36,8 @@ class ACE_Medical_Actions { litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; }; class Epinephrine: Bandage { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; - displayNameProgress = "$STR_ACE_Medical_Injecting_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); + displayNameProgress = CSTRING(Injecting_Epinephrine); requiredMedic = 1; treatmentTime = 3; items[] = {"ACE_epinephrine"}; @@ -46,21 +46,27 @@ class ACE_Medical_Actions { litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; }; class BloodIV: Bandage { - displayName = "$STR_ACE_Medical_Transfuse_Blood"; - displayNameProgress = "$STR_ACE_Medical_Transfusing_Blood"; + displayName = CSTRING(Transfuse_Blood); + displayNameProgress = CSTRING(Transfusing_Blood); requiredMedic = 1; treatmentTime = 20; - items[] = {{"ACE_bloodIV", "ACE_bloodIV_500", "ACE_bloodIV_250"}}; + items[] = {"ACE_bloodIV"}; callbackSuccess = QUOTE(DFUNC(treatmentBasic_bloodbag)); animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; litter[] = {}; }; + class BloodIV_500: BloodIV { + items[] = {"ACE_bloodIV_500"}; + }; + class BloodIV_250: BloodIV { + items[] = {"ACE_bloodIV_250"}; + }; class BodyBag: Bandage { - displayName = "$STR_ACE_Medical_PlaceInBodyBag"; - displayNameProgress = "$STR_ACE_Medical_PlacingInBodyBag"; + displayName = CSTRING(PlaceInBodyBag); + displayNameProgress = CSTRING(PlacingInBodyBag); treatmentLocations[] = {"All"}; requiredMedic = 0; - treatmentTime = 2; + treatmentTime = 4; items[] = {"ACE_bodyBag"}; condition = "!alive (_this select 1);"; callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag)); @@ -72,8 +78,8 @@ class ACE_Medical_Actions { litter[] = {}; }; class Diagnose: Bandage { - displayName = "$STR_ACE_Medical_Actions_Diagnose"; - displayNameProgress = "$STR_ACE_Medical_Actions_Diagnosing"; + displayName = CSTRING(Actions_Diagnose); + displayNameProgress = CSTRING(Actions_Diagnosing); treatmentLocations[] = {"All"}; requiredMedic = 0; treatmentTime = 1; @@ -90,8 +96,8 @@ class ACE_Medical_Actions { class Advanced { class FieldDressing { - displayName = "$STR_ACE_Medical_Bandage"; - displayNameProgress = "$STR_ACE_Medical_Bandaging"; + displayName = CSTRING(Bandage); + displayNameProgress = CSTRING(Bandaging); // Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All. treatmentLocations[] = {"All"}; // What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor @@ -125,8 +131,8 @@ class ACE_Medical_Actions { items[] = {"ACE_quikclot"}; }; class Tourniquet: fieldDressing { - displayName = "$STR_ACE_Medical_Apply_Tourniquet"; - displayNameProgress = "$STR_ACE_Medical_Applying_Tourniquet"; + displayName = CSTRING(Apply_Tourniquet); + displayNameProgress = CSTRING(Applying_Tourniquet); items[] = {"ACE_tourniquet"}; treatmentTime = 6; callbackSuccess = QUOTE(DFUNC(treatmentTourniquet)); @@ -134,8 +140,8 @@ class ACE_Medical_Actions { litter[] = {}; }; class Morphine: fieldDressing { - displayName = "$STR_ACE_Medical_Inject_Morphine"; - displayNameProgress = "$STR_ACE_Medical_Injecting_Morphine"; + displayName = CSTRING(Inject_Morphine); + displayNameProgress = CSTRING(Injecting_Morphine); items[] = {"ACE_morphine"}; treatmentTime = 3; callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_medication)); @@ -143,20 +149,20 @@ class ACE_Medical_Actions { litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} }; }; class Atropine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Atropine"; - displayNameProgress = "$STR_ACE_Medical_Injecting_Atropine"; + displayName = CSTRING(Inject_Atropine); + displayNameProgress = CSTRING(Injecting_Atropine); items[] = {"ACE_atropine"}; litter[] = { {"All", "", {"ACE_MedicalLitter_atropine"}} }; }; class Epinephrine: Morphine { - displayName = "$STR_ACE_Medical_Inject_Epinephrine"; - displayNameProgress = "$STR_ACE_Medical_Injecting_Epinephrine"; + displayName = CSTRING(Inject_Epinephrine); + displayNameProgress = CSTRING(Injecting_Epinephrine); items[] = {"ACE_epinephrine"}; litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} }; }; class BloodIV: fieldDressing { - displayName = "$STR_ACE_Medical_Transfuse_Blood"; - displayNameProgress = "$STR_ACE_Medical_Transfusing_Blood"; + displayName = CSTRING(Transfuse_Blood); + displayNameProgress = CSTRING(Transfusing_Blood); items[] = {"ACE_bloodIV"}; requiredMedic = 1; treatmentTime = 7; @@ -171,8 +177,8 @@ class ACE_Medical_Actions { items[] = {"ACE_bloodIV_250"}; }; class PlasmaIV: BloodIV { - displayName = "$STR_ACE_Medical_Transfuse_Plasma"; - displayNameProgress = "$STR_ACE_Medical_Transfusing_Plasma"; + displayName = CSTRING(Transfuse_Plasma); + displayNameProgress = CSTRING(Transfusing_Plasma); items[] = {"ACE_plasmaIV"}; animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; }; @@ -183,8 +189,8 @@ class ACE_Medical_Actions { items[] = {"ACE_plasmaIV_250"}; }; class SalineIV: BloodIV { - displayName = "$STR_ACE_Medical_Transfuse_Saline"; - displayNameProgress = "$STR_ACE_Medical_Transfusing_Saline"; + displayName = CSTRING(Transfuse_Saline); + displayNameProgress = CSTRING(Transfusing_Saline); items[] = {"ACE_salineIV"}; animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; }; @@ -196,23 +202,24 @@ class ACE_Medical_Actions { }; class SurgicalKit: fieldDressing { displayName = ""; - displayNameProgress = "$STR_ACE_Medical_TreatmentAction"; + displayNameProgress = CSTRING(TreatmentAction); items[] = {"ACE_surgicalKit"}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; requiredMedic = QGVAR(medicSetting_SurgicalKit); - treatmentTime = 10; - callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_surgicalKit)); + treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; + callbackSuccess = ""; + callbackProgress = QUOTE(DFUNC(treatmentAdvanced_surgicalKit_onProgress)); itemConsumed = QGVAR(consumeItem_SurgicalKit); animationCaller = "AinvPknlMstpSnonWnonDnon_medic1"; litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"} }}; }; class PersonalAidKit: fieldDressing { displayName = ""; - displayNameProgress = "$STR_ACE_Medical_TreatmentAction"; + displayNameProgress = CSTRING(TreatmentAction); items[] = {"ACE_personalAidKit"}; treatmentLocations[] = {QGVAR(useLocation_PAK)}; requiredMedic = QGVAR(medicSetting_PAK); - treatmentTime = 10; + treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_fullHeal)); itemConsumed = QGVAR(consumeItem_PAK); animationPatient = ""; @@ -225,7 +232,7 @@ class ACE_Medical_Actions { }; class CheckPulse: fieldDressing { displayName = ""; - displayNameProgress = "$STR_ACE_Medical_Check_Pulse_Content"; + displayNameProgress = CSTRING(Check_Pulse_Content); treatmentLocations[] = {"All"}; requiredMedic = 0; treatmentTime = 2; @@ -240,21 +247,21 @@ class ACE_Medical_Actions { }; class CheckBloodPressure: CheckPulse { callbackSuccess = QUOTE(DFUNC(actionCheckBloodPressure)); - displayNameProgress = "$STR_ACE_Medical_Check_Bloodpressure_Content"; + displayNameProgress = CSTRING(Check_Bloodpressure_Content); }; class CheckResponse: CheckPulse { callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); - displayNameProgress = "$STR_ACE_Medical_Check_Response_Content"; + displayNameProgress = CSTRING(Check_Response_Content); }; class RemoveTourniquet: CheckPulse { treatmentTime = 2.5; callbackSuccess = QUOTE(DFUNC(actionRemoveTourniquet)); condition = QUOTE([ARR_2(_this select 1, _this select 2)] call FUNC(hasTourniquetAppliedTo)); - displayNameProgress = "$STR_ACE_Medical_RemovingTourniquet"; + displayNameProgress = CSTRING(RemovingTourniquet); }; class CPR: fieldDressing { - displayName = "$STR_ACE_Medical_Actions_CPR"; - displayNameProgress = "$STR_ACE_Medical_Actions_PerformingCPR"; + displayName = CSTRING(Actions_CPR); + displayNameProgress = CSTRING(Actions_PerformingCPR); treatmentLocations[] = {"All"}; requiredMedic = 0; treatmentTime = 15; @@ -273,8 +280,8 @@ class ACE_Medical_Actions { litter[] = {}; }; class BodyBag: fieldDressing { - displayName = "$STR_ACE_Medical_PlaceInBodyBag"; - displayNameProgress = "$STR_ACE_Medical_PlacingInBodyBag"; + displayName = CSTRING(PlaceInBodyBag); + displayNameProgress = CSTRING(PlacingInBodyBag); treatmentLocations[] = {"All"}; requiredMedic = 0; treatmentTime = 2; @@ -300,53 +307,54 @@ class ACE_Medical_Advanced { // Source: Scarle // Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). class Abrasion { - name = "$STR_ACE_Medical_Wounds_Abrasion"; + name = CSTRING(Wounds_Abrasion); selections[] = {"All"}; bleedingRate = 0.0001; pain = 0.01; causes[] = {"falling", "ropeburn", "vehiclecrash", "unknown"}; minDamage = 0.01; class Minor { - name = "$STR_ACE_Medical_Wounds_Abrasion_Minor"; + name = CSTRING(Wounds_Abrasion_Minor); minDamage = 0.01; maxDamage = 0.2; bleedingRate = 0.0001; }; class Medium { - name = "$STR_ACE_Medical_Wounds_Abrasion_Medium"; + name = CSTRING(Wounds_Abrasion_Medium); minDamage = 0.2; maxDamage = 0.3; bleedingRate = 0.00015; }; class Large { - name = "$STR_ACE_Medical_Wounds_Abrasion_Large"; + name = CSTRING(Wounds_Abrasion_Large); minDamage = 0.3; + maxDamage = 0.5; bleedingRate = 0.0002; }; }; // Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. class Avulsions { - name = "$STR_ACE_Medical_Wounds_Avulsion"; + name = CSTRING(Wounds_Avulsion); selections[] = {"All"}; bleedingRate = 0.01; pain = 0.3; causes[] = {"explosive", "vehiclecrash", "grenade", "shell", "bullet", "backblast", "bite"}; minDamage = 0.2; class Minor { - name = "$STR_ACE_Medical_Wounds_Avulsion_Minor"; + name = CSTRING(Wounds_Avulsion_Minor); minDamage = 0.2; maxDamage = 0.3; bleedingRate = 0.01; }; class Medium { - name = "$STR_ACE_Medical_Wounds_Avulsion_Medium"; + name = CSTRING(Wounds_Avulsion_Medium); minDamage = 0.3; maxDamage = 0.6; bleedingRate = 0.02; }; class Large { - name = "$STR_ACE_Medical_Wounds_Avulsion_Large"; + name = CSTRING(Wounds_Avulsion_Large); minDamage = 0.5; bleedingRate = 0.05; }; @@ -354,7 +362,7 @@ class ACE_Medical_Advanced { // Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. class Contusion { - name = "$STR_ACE_Medical_Wounds_Contusion"; + name = CSTRING(Wounds_Contusion); selections[] = {"All"}; bleedingRate = 0.0; pain = 0.05; @@ -362,17 +370,17 @@ class ACE_Medical_Advanced { minDamage = 0.01; maxDamage = 0.1; class Minor { - name = "$STR_ACE_Medical_Wounds_Contusion_Minor"; + name = CSTRING(Wounds_Contusion_Minor); minDamage = 0.01; maxDamage = 0.1; }; class Medium { - name = "$STR_ACE_Medical_Wounds_Contusion_Medium"; + name = CSTRING(Wounds_Contusion_Medium); minDamage = 0.1; maxDamage = 0.15; }; class Large { - name = "$STR_ACE_Medical_Wounds_Contusion_Large"; + name = CSTRING(Wounds_Contusion_Large); minDamage = 0.15; maxDamage = 0.2; }; @@ -380,26 +388,26 @@ class ACE_Medical_Advanced { // Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. class CrushWound { - name = "$STR_ACE_Medical_Wounds_Crush"; + name = CSTRING(Wounds_Crush); selections[] = {"All"}; bleedingRate = 0.01; pain = 0.1; causes[] = {"falling", "vehiclecrash", "punch", "unknown"}; minDamage = 0.1; class Minor { - name = "$STR_ACE_Medical_Wounds_Crush_Minor"; + name = CSTRING(Wounds_Crush_Minor); minDamage = 0.1; maxDamage = 0.45; bleedingRate = 0.005; }; class Medium { - name = "$STR_ACE_Medical_Wounds_Crush_Medium"; + name = CSTRING(Wounds_Crush_Medium); minDamage = 0.4; maxDamage = 0.7; bleedingRate = 0.007; }; class Large { - name = "$STR_ACE_Medical_Wounds_Crush_Large"; + name = CSTRING(Wounds_Crush_Large); minDamage = 0.6; bleedingRate = 0.0095; }; @@ -407,26 +415,26 @@ class ACE_Medical_Advanced { // Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. class Cut { - name = "$STR_ACE_Medical_Wounds_Cut"; + name = CSTRING(Wounds_Cut); selections[] = {"All"}; bleedingRate = 0.01; pain = 0.075; causes[] = {"vehiclecrash", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; minDamage = 0.1; class Minor { - name = "$STR_ACE_Medical_Wounds_Cut_Minor"; + name = CSTRING(Wounds_Cut_Minor); minDamage = 0.1; maxDamage = 0.3; bleedingRate = 0.005; }; class Medium { - name = "$STR_ACE_Medical_Wounds_Cut_Medium"; + name = CSTRING(Wounds_Cut_Medium); minDamage = 0.3; maxDamage = 0.65; bleedingRate = 0.02; }; class Large { - name = "$STR_ACE_Medical_Wounds_Cut_Large"; + name = CSTRING(Wounds_Cut_Large); minDamage = 0.65; bleedingRate = 0.05; }; @@ -434,26 +442,26 @@ class ACE_Medical_Advanced { // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. class Laceration { - name = "$STR_ACE_Medical_Wounds_Laceration"; + name = CSTRING(Wounds_Laceration); selections[] = {"All"}; bleedingRate = 0.01; pain = 0.075; causes[] = {"vehiclecrash", "punch"}; minDamage = 0.01; class Minor { - name = "$STR_ACE_Medical_Wounds_Laceration_Minor"; + name = CSTRING(Wounds_Laceration_Minor); minDamage = 0.1; maxDamage = 0.5; bleedingRate = 0.005; }; class Medium { - name = "$STR_ACE_Medical_Wounds_Laceration_Medium"; + name = CSTRING(Wounds_Laceration_Medium); minDamage = 0.5; maxDamage = 0.7; bleedingRate = 0.01; }; class Large { - name = "$STR_ACE_Medical_Wounds_Laceration_Large"; + name = CSTRING(Wounds_Laceration_Large); minDamage = 0.7; bleedingRate = 0.03; }; @@ -461,25 +469,25 @@ class ACE_Medical_Advanced { // Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel. class velocityWound { - name = "$STR_ACE_Medical_Wounds_VelocityWound"; + name = CSTRING(Wounds_VelocityWound); selections[] = {"All"}; bleedingRate = 0.01; pain = 0.2; causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; minDamage = 0.15; class Minor { - name = "$STR_ACE_Medical_Wounds_VelocityWound_Minor"; + name = CSTRING(Wounds_VelocityWound_Minor); minDamage = 0.15; maxDamage = 0.3; bleedingRate = 0.025; }; class Medium { - name = "$STR_ACE_Medical_Wounds_VelocityWound_Medium"; + name = CSTRING(Wounds_VelocityWound_Medium); minDamage = 0.3; bleedingRate = 0.05; }; class Large { - name = "$STR_ACE_Medical_Wounds_VelocityWound_Large"; + name = CSTRING(Wounds_VelocityWound_Large); minDamage = 0.75; bleedingRate = 0.1; }; @@ -487,26 +495,26 @@ class ACE_Medical_Advanced { // Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. class punctureWound { - name = "$STR_ACE_Medical_Wounds_PunctureWound"; + name = CSTRING(Wounds_PunctureWound); selections[] = {"All"}; bleedingRate = 0.01; pain = 0.075; causes[] = {"stab", "grenade"}; minDamage = 0.01; class Minor { - name = "$STR_ACE_Medical_Wounds_PunctureWound_Minor"; + name = CSTRING(Wounds_PunctureWound_Minor); minDamage = 0.01; maxDamage = 0.5; bleedingRate = 0.01; }; class Medium { - name = "$STR_ACE_Medical_Wounds_PunctureWound_Medium"; + name = CSTRING(Wounds_PunctureWound_Medium); minDamage = 0.5; maxDamage = 0.75; bleedingRate = 0.03; }; class Large { - name = "$STR_ACE_Medical_Wounds_PunctureWound_Large"; + name = CSTRING(Wounds_PunctureWound_Large); minDamage = 0.65; bleedingRate = 0.08; }; @@ -514,7 +522,7 @@ class ACE_Medical_Advanced { }; class fractures { class Femur { - name = "$STR_ACE_Medical_Wounds_Femur"; + name = CSTRING(Wounds_Femur); selections[] = {"Head", "Torso"}; pain = 0.2; causes[] = {"Bullet", "VehicleCrash", "Backblast", "Explosive", "Shell", "Grenade"}; @@ -804,11 +812,11 @@ class ACE_Medical_Advanced { // specific details for the ACE_Morphine treatment action class Morphine { - painReduce = 1; + painReduce = 15; hrIncreaseLow[] = {-10, -30, 35}; hrIncreaseNormal[] = {-10, -50, 40}; hrIncreaseHigh[] = {-10, -40, 50}; - timeInSystem = 500; + timeInSystem = 900; maxDose = 4; inCompatableMedication[] = {}; viscosityChange = 10; @@ -824,9 +832,9 @@ class ACE_Medical_Advanced { }; class Atropine { painReduce = 0; - hrIncreaseLow[] = {20, 30, 15}; - hrIncreaseNormal[] = {-10, -50, 20}; - hrIncreaseHigh[] = {-10, -40, 10}; + hrIncreaseLow[] = {-5, -7, 15}; + hrIncreaseNormal[] = {-10, -30, 20}; + hrIncreaseHigh[] = {-10, -20, 10}; timeInSystem = 120; maxDose = 6; inCompatableMedication[] = {}; diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index b3c2152df1..2b28e91882 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -59,6 +59,10 @@ class ACE_Settings { typeName = "SCALAR"; values[] = {"Disabled", "50/50", "Enabled"}; }; + class GVAR(remoteControlledAI) { + typeName = "BOOL"; + value = 1; + }; class GVAR(preventInstaDeath) { typeName = "BOOL"; value = 0; @@ -85,8 +89,8 @@ class ACE_Settings { value = 1; }; class GVAR(litterSimulationDetail) { - displayName = "$STR_ACE_Medical_litterSimulationDetail"; - description = "$STR_ACE_Medical_litterSimulationDetail_Desc"; + displayName = CSTRING(litterSimulationDetail); + description = CSTRING(litterSimulationDetail_Desc); typeName = "SCALAR"; value = 3; @@ -134,14 +138,20 @@ class ACE_Settings { value = 1; }; class GVAR(healHitPointAfterAdvBandage) { + displayName = CSTRING(healHitPointAfterAdvBandage); + typeName = "BOOL"; + value = 0; + }; + class GVAR(painIsOnlySuppressed) { + displayName = CSTRING(painIsOnlySuppressed); typeName = "BOOL"; value = 1; }; class GVAR(painEffectType) { - displayName = "$STR_ACE_Medical_painEffectType"; + displayName = CSTRING(painEffectType); typeName = "SCALAR"; value = 0; - values[] = {"$STR_ACE_Medical_painEffect_Flash", "$STR_ACE_Medical_painEffect_Chroma"}; + values[] = {CSTRING(painEffect_Flash), CSTRING(painEffect_Chroma)}; isClientSettable = 1; }; class GVAR(allowUnconsciousAnimationOnTreatment) { @@ -154,11 +164,11 @@ class ACE_Settings { }; class GVAR(menuTypeStyle) { - displayName = "$STR_ACE_Medical_menuTypeDisplay"; - description = "$STR_ACE_Medical_menuTypeDescription"; + displayName = CSTRING(menuTypeDisplay); + description = CSTRING(menuTypeDescription); typeName = "SCALAR"; value = 0; - values[] = {"$STR_ACE_Medical_useSelection"/*, "$STR_ACE_Medical_useRadial"*/}; + values[] = {CSTRING(useSelection)/*, CSTRING(useRadial)*/}; // isClientSettable = 1; }; }; diff --git a/addons/medical/CfgFactionClasses.hpp b/addons/medical/CfgFactionClasses.hpp index 67e3404e91..0ca922c8a6 100644 --- a/addons/medical/CfgFactionClasses.hpp +++ b/addons/medical/CfgFactionClasses.hpp @@ -1,6 +1,6 @@ class CfgFactionClasses { class NO_CATEGORY; class ADDON: NO_CATEGORY { - displayName = "$STR_ACE_Medical_Category_DisplayName"; + displayName = CSTRING(Category_DisplayName); }; }; diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index e0a6fbcfa0..c8a4528ca5 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -11,88 +11,88 @@ class CfgVehicles { class ACE_Module; class ACE_moduleMedicalSettings: ACE_Module { scope = 2; - displayName = "$STR_ACE_MedicalSettings_Module_DisplayName"; + displayName = CSTRING(MedicalSettings_Module_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); category = "ACE_medical"; function = QUOTE(DFUNC(moduleMedicalSettings)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class level { - displayName = "$STR_ACE_MedicalSettings_level_DisplayName"; - description = "$STR_ACE_MedicalSettings_level_Description"; + displayName = CSTRING(MedicalSettings_level_DisplayName); + description = CSTRING(MedicalSettings_level_Description); typeName = "NUMBER"; class values { class normal { - name = "$STR_ACE_MedicalSettings_basic"; + name = CSTRING(MedicalSettings_basic); value = 1; default = 1; }; class full { - name = "$STR_ACE_MedicalSettings_advanced"; + name = CSTRING(MedicalSettings_advanced); value = 2; }; }; }; class medicSetting { - displayName = "$STR_ACE_MedicalSettings_medicSetting_DisplayName"; - description = "$STR_ACE_MedicalSettings_medicSetting_Description"; + displayName = CSTRING(MedicalSettings_medicSetting_DisplayName); + description = CSTRING(MedicalSettings_medicSetting_Description); typeName = "NUMBER"; class values { class disable { - name = "$STR_ACE_MedicalSettings_medicSetting_disable"; + name = CSTRING(MedicalSettings_medicSetting_disable); value = 0; }; class normal { - name = "$STR_ACE_MedicalSettings_basic"; + name = CSTRING(MedicalSettings_basic); value = 1; default = 1; }; class full { - name = "$STR_ACE_MedicalSettings_advanced"; + name = CSTRING(MedicalSettings_advanced); value = 2; }; }; }; class allowLitterCreation { - displayName = "$STR_ACE_MedicalSettings_allowLitterCreation_DisplayName"; - description = "$STR_ACE_MedicalSettings_allowLitterCreation_Description"; + displayName = CSTRING(MedicalSettings_allowLitterCreation_DisplayName); + description = CSTRING(MedicalSettings_allowLitterCreation_Description); typeName = "BOOL"; defaultValue = 1; }; class litterCleanUpDelay { - displayName = "$STR_ACE_MedicalSettings_litterCleanUpDelay_DisplayName"; - description = "$STR_ACE_MedicalSettings_litterCleanUpDelay_Description"; + displayName = CSTRING(MedicalSettings_litterCleanUpDelay_DisplayName); + description = CSTRING(MedicalSettings_litterCleanUpDelay_Description); typeName = "NUMBER"; defaultValue = 1800; }; class enableScreams { - displayName = "$STR_ACE_MedicalSettings_enableScreams_DisplayName"; - description = "$STR_ACE_MedicalSettings_enableScreams_Description"; + displayName = CSTRING(MedicalSettings_enableScreams_DisplayName); + description = CSTRING(MedicalSettings_enableScreams_Description); typeName = "BOOL"; defaultValue = 1; }; class playerDamageThreshold { - displayName = "$STR_ACE_MedicalSettings_playerDamageThreshold_DisplayName"; - description = "$STR_ACE_MedicalSettings_playerDamageThreshold_Description"; + displayName = CSTRING(MedicalSettings_playerDamageThreshold_DisplayName); + description = CSTRING(MedicalSettings_playerDamageThreshold_Description); typeName = "NUMBER"; defaultValue = 1; }; class AIDamageThreshold { - displayName = "$STR_ACE_MedicalSettings_AIDamageThreshold_DisplayName"; - description = "$STR_ACE_MedicalSettings_AIDamageThreshold_Description"; + displayName = CSTRING(MedicalSettings_AIDamageThreshold_DisplayName); + description = CSTRING(MedicalSettings_AIDamageThreshold_Description); typeName = "NUMBER"; defaultValue = 1; }; class enableUnconsciousnessAI { - displayName = "$STR_ACE_MedicalSettings_enableUnconsciousnessAI_DisplayName"; - description = "$STR_ACE_MedicalSettings_enableUnconsciousnessAI_Description"; + displayName = CSTRING(MedicalSettings_enableUnconsciousnessAI_DisplayName); + description = CSTRING(MedicalSettings_enableUnconsciousnessAI_Description); typeName = "NUMBER"; class values { class disable { - name = "$STR_ACE_Medical_disabled"; + name = CSTRING(disabled); value = 0; }; class normal { @@ -101,45 +101,51 @@ class CfgVehicles { default = 1; }; class full { - name = "$STR_ACE_Medical_enabled"; + name = CSTRING(enabled); value = 2; }; }; }; + class remoteControlledAI { + displayName = CSTRING(MedicalSettings_remoteControlledAI_DisplayName); + description = CSTRING(MedicalSettings_remoteControlledAI_Description); + typeName = "BOOL"; + defaultValue = 1; + }; class preventInstaDeath { - displayName = "$STR_ACE_MedicalSettings_preventInstaDeath_DisplayName"; - description = "$STR_ACE_MedicalSettings_preventInstaDeath_Description"; + displayName = CSTRING(MedicalSettings_preventInstaDeath_DisplayName); + description = CSTRING(MedicalSettings_preventInstaDeath_Description); typeName = "BOOL"; defaultValue = 0; }; class bleedingCoefficient { - displayName = "$STR_ACE_MedicalSettings_bleedingCoefficient_DisplayName"; - description = "$STR_ACE_MedicalSettings_bleedingCoefficient_Description"; + displayName = CSTRING(MedicalSettings_bleedingCoefficient_DisplayName); + description = CSTRING(MedicalSettings_bleedingCoefficient_Description); typeName = "NUMBER"; defaultValue = 1; }; class painCoefficient { - displayName = "$STR_ACE_MedicalSettings_painCoefficient_DisplayName"; - description = "$STR_ACE_MedicalSettings_painCoefficient_Description"; + displayName = CSTRING(MedicalSettings_painCoefficient_DisplayName); + description = CSTRING(MedicalSettings_painCoefficient_Description); typeName = "NUMBER"; defaultValue = 1; }; class keepLocalSettingsSynced { - displayName = "$STR_ACE_MedicalSettings_keepLocalSettingsSynced_DisplayName"; - description = "$STR_ACE_MedicalSettings_keepLocalSettingsSynced_Description"; + displayName = CSTRING(MedicalSettings_keepLocalSettingsSynced_DisplayName); + description = CSTRING(MedicalSettings_keepLocalSettingsSynced_Description); typeName = "BOOL"; defaultValue = 1; }; }; class ModuleDescription { - description = "$STR_ACE_MedicalSettings_Module_Description"; + description = CSTRING(MedicalSettings_Module_Description); sync[] = {}; }; }; class ACE_moduleAdvancedMedicalSettings: ACE_Module { scope = 2; - displayName = "$STR_ACE_AdvancedMedicalSettings_Module_DisplayName"; + displayName = CSTRING(AdvancedMedicalSettings_Module_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); category = "ACE_medical"; function = QUOTE(FUNC(moduleAdvancedMedicalSettings)); @@ -147,84 +153,95 @@ class CfgVehicles { isGlobal = 2; isTriggerActivated = 0; isDisposable = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class enableFor { - displayName = "$STR_ACE_AdvancedMedicalSettings_enableFor_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_enableFor_Description"; + displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); + description = CSTRING(AdvancedMedicalSettings_enableFor_Description); typeName = "NUMBER"; class values { class playableUnits { - name = "$STR_ACE_Medical_playeronly"; + name = CSTRING(playeronly); value = 0; default = 1; }; class playableUnitsAndAI { - name = "$STR_ACE_Medical_playersandai"; + name = CSTRING(playersandai); value = 1; }; }; }; class enableAdvancedWounds { - displayName = "$STR_ACE_AdvancedMedicalSettings_enableAdvancedWounds_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_enableAdvancedWounds_Description"; + displayName = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_DisplayName); + description = CSTRING(AdvancedMedicalSettings_enableAdvancedWounds_Description); typeName = "BOOL"; defaultValue = 0; }; class enableVehicleCrashes { - displayName = "$STR_ACE_AdvancedMedicalSettings_enableVehicleCrashes_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_enableVehicleCrashes_Description"; + displayName = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_DisplayName); + description = CSTRING(AdvancedMedicalSettings_enableVehicleCrashes_Description); typeName = "BOOL"; defaultValue = 1; }; class medicSetting_PAK { - displayName = "$STR_ACE_AdvancedMedicalSettings_medicSetting_PAK_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_medicSetting_PAK_Description"; + displayName = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_DisplayName); + description = CSTRING(AdvancedMedicalSettings_medicSetting_PAK_Description); typeName = "NUMBER"; class values { - class anyone { name = "$STR_ACE_AdvancedMedicalSettings_anyone"; value = 0; }; - class Medic { name = "$STR_ACE_AdvancedMedicalSettings_Medic"; value = 1; default = 1; }; - class Special { name = "$STR_ACE_AdvancedMedicalSettings_Special"; value = 2; }; + class anyone { name = CSTRING(AdvancedMedicalSettings_anyone); value = 0; }; + class Medic { name = CSTRING(AdvancedMedicalSettings_Medic); value = 1; default = 1; }; + class Special { name = CSTRING(AdvancedMedicalSettings_Special); value = 2; }; }; }; class consumeItem_PAK { - displayName = "$STR_ACE_AdvancedMedicalSettings_consumeItem_PAK_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_consumeItem_PAK_Description"; + displayName = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_DisplayName); + description = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_Description); typeName = "NUMBER"; class values { - class keep { name = "$STR_ACE_Medical_No"; value = 0; }; - class remove { name = "$STR_ACE_Medical_Yes"; value = 1; default = 1; }; + class keep { name = CSTRING(No); value = 0; }; + class remove { name = CSTRING(Yes); value = 1; default = 1; }; }; }; class useLocation_PAK { - displayName = "$STR_ACE_AdvancedMedicalSettings_useLocation_PAK_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_useLocation_PAK_Description"; + displayName = CSTRING(AdvancedMedicalSettings_useLocation_PAK_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useLocation_PAK_Description); typeName = "NUMBER"; class values { - class anywhere { name = "$STR_ACE_AdvancedMedicalSettings_anywhere"; value = 0; }; - class vehicle { name = "$STR_ACE_AdvancedMedicalSettings_vehicle"; value = 1; }; - class facility { name = "$STR_ACE_AdvancedMedicalSettings_facility"; value = 2; }; - class vehicleAndFacility { name = "$STR_ACE_AdvancedMedicalSettings_vehicleAndFacility"; value = 3; default = 1; }; - class disabled { name = "$STR_ACE_AdvancedMedicalSettings_disabled"; value = 4;}; + class anywhere { name = CSTRING(AdvancedMedicalSettings_anywhere); value = 0; }; + class vehicle { name = CSTRING(AdvancedMedicalSettings_vehicle); value = 1; }; + class facility { name = CSTRING(AdvancedMedicalSettings_facility); value = 2; }; + class vehicleAndFacility { name = CSTRING(AdvancedMedicalSettings_vehicleAndFacility); value = 3; default = 1; }; + class disabled { name = CSTRING(AdvancedMedicalSettings_disabled); value = 4;}; }; }; class medicSetting_SurgicalKit: medicSetting_PAK { - displayName = "$STR_ACE_AdvancedMedicalSettings_medicSetting_SurgicalKit_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_medicSetting_SurgicalKit_Description"; + displayName = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_DisplayName); + description = CSTRING(AdvancedMedicalSettings_medicSetting_SurgicalKit_Description); }; class consumeItem_SurgicalKit: consumeItem_PAK { - displayName = "$STR_ACE_AdvancedMedicalSettings_consumeItem_SurgicalKit_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_consumeItem_SurgicalKit_Description"; + displayName = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_DisplayName); + description = CSTRING(AdvancedMedicalSettings_consumeItem_SurgicalKit_Description); }; class useLocation_SurgicalKit: useLocation_PAK { - displayName = "$STR_ACE_AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName"; - description = "$STR_ACE_AdvancedMedicalSettings_useLocation_SurgicalKit_Description"; + displayName = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_Description); + }; + class healHitPointAfterAdvBandage { + displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); + description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class painIsOnlySuppressed { + displayName = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_DisplayName); + description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); + typeName = "BOOL"; + defaultValue = 1; }; - }; class ModuleDescription { - description = "$STR_ACE_AdvancedMedicalSettings_Module_Description"; + description = CSTRING(AdvancedMedicalSettings_Module_Description); sync[] = {}; }; }; @@ -232,47 +249,47 @@ class CfgVehicles { class ACE_moduleReviveSettings: ACE_Module { scope = 2; - displayName = "$STR_ACE_ReviveSettings_Module_DisplayName"; + displayName = CSTRING(ReviveSettings_Module_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); category = "ACE_medical"; function = QUOTE(DFUNC(moduleReviveSettings)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class enableRevive { - displayName = "$STR_ACE_ReviveSettings_enableRevive_DisplayName"; - description = "$STR_ACE_ReviveSettings_enableRevive_Description"; + displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); + description = CSTRING(ReviveSettings_enableRevive_Description); typeName = "NUMBER"; defaultValue = 0; class values { - class disable { name = "$STR_ACE_Medical_disabled"; value = 0; default = 1;}; - class playerOnly { name = "$STR_ACE_Medical_playeronly"; value = 1; }; - class playerAndAI { name = "$STR_ACE_Medical_playersandai"; value = 2; }; + class disable { name = CSTRING(disabled); value = 0; default = 1;}; + class playerOnly { name = CSTRING(playeronly); value = 1; }; + class playerAndAI { name = CSTRING(playersandai); value = 2; }; }; }; class maxReviveTime { - displayName = "$STR_ACE_ReviveSettings_maxReviveTime_DisplayName"; - description = "$STR_ACE_ReviveSettings_maxReviveTime_Description"; + displayName = CSTRING(ReviveSettings_maxReviveTime_DisplayName); + description = CSTRING(ReviveSettings_maxReviveTime_Description); typeName = "NUMBER"; defaultValue = 120; }; class amountOfReviveLives { - displayName = "$STR_ACE_ReviveSettings_amountOfReviveLives_DisplayName"; - description = "$STR_ACE_ReviveSettings_amountOfReviveLives_Description"; + displayName = CSTRING(ReviveSettings_amountOfReviveLives_DisplayName); + description = CSTRING(ReviveSettings_amountOfReviveLives_Description); typeName = "NUMBER"; defaultValue = -1; }; }; class ModuleDescription { - description = "$STR_ACE_ReviveSettings_Module_Description"; + description = CSTRING(ReviveSettings_Module_Description); sync[] = {}; }; }; class ACE_moduleAssignMedicRoles: Module_F { scope = 2; - displayName = "$STR_ACE_AssignMedicRoles_Module_DisplayName"; + displayName = CSTRING(AssignMedicRoles_Module_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); category = "ACE_medical"; function = QUOTE(FUNC(moduleAssignMedicRoles)); @@ -280,44 +297,44 @@ class CfgVehicles { isGlobal = 2; isTriggerActivated = 0; isDisposable = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class EnableList { - displayName = "$STR_ACE_AssignMedicRoles_EnableList_DisplayName"; - description = "$STR_ACE_AssignMedicRoles_EnableList_Description"; + displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName); + description = CSTRING(AssignMedicRoles_EnableList_Description); defaultValue = ""; typeName = "STRING"; }; class role { - displayName = "$STR_ACE_AssignMedicRoles_role_DisplayName"; - description = "$STR_ACE_AssignMedicRoles_role_Description"; + displayName = CSTRING(AssignMedicRoles_role_DisplayName); + description = CSTRING(AssignMedicRoles_role_Description); typeName = "NUMBER"; class values { class none { - name = "$STR_ACE_AssignMedicRoles_role_none"; + name = CSTRING(AssignMedicRoles_role_none); value = 0; }; class medic { - name = "$STR_ACE_AssignMedicRoles_role_medic"; + name = CSTRING(AssignMedicRoles_role_medic); value = 1; default = 1; }; class doctor { - name = "$STR_ACE_AssignMedicRoles_role_doctor"; + name = CSTRING(AssignMedicRoles_role_doctor); value = 2; }; }; }; }; class ModuleDescription { - description = "$STR_ACE_AssignMedicRoles_Module_Description"; + description = CSTRING(AssignMedicRoles_Module_Description); sync[] = {}; }; }; class ACE_moduleAssignMedicVehicle: Module_F { scope = 2; - displayName = "$STR_ACE_AssignMedicVehicle_Module_DisplayName"; + displayName = CSTRING(AssignMedicVehicle_Module_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); category = "ACE_medical"; function = QUOTE(FUNC(moduleAssignMedicalVehicle)); @@ -325,26 +342,26 @@ class CfgVehicles { isGlobal = 2; isTriggerActivated = 0; isDisposable = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class EnableList { - displayName = "$STR_ACE_AssignMedicVehicle_EnableList_DisplayName"; - description = "$STR_ACE_AssignMedicVehicle_EnableList_Description"; + displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName); + description = CSTRING(AssignMedicVehicle_EnableList_Description); defaultValue = ""; typeName = "STRING"; }; class enabled { - displayName = "$STR_ACE_AssignMedicVehicle_enabled_DisplayName"; - description = "$STR_ACE_AssignMedicVehicle_enabled_Description"; + displayName = CSTRING(AssignMedicVehicle_enabled_DisplayName); + description = CSTRING(AssignMedicVehicle_enabled_Description); typeName = "NUMBER"; class values { class none { - name = "$STR_ACE_Medical_No"; + name = CSTRING(No); value = 0; }; class medic { - name = "$STR_ACE_Medical_Yes"; + name = CSTRING(Yes); value = 1; default = 1; }; @@ -352,13 +369,13 @@ class CfgVehicles { }; }; class ModuleDescription { - description = "$STR_ACE_AssignMedicVehicle_Module_Description"; + description = CSTRING(AssignMedicVehicle_Module_Description); sync[] = {}; }; }; class ACE_moduleAssignMedicalFacility: Module_F { scope = 2; - displayName = "$STR_ACE_AssignMedicalFacility_Module_DisplayName"; + displayName = CSTRING(AssignMedicalFacility_Module_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); category = "ACE_medical"; function = QUOTE(FUNC(moduleAssignMedicalFacility)); @@ -366,16 +383,16 @@ class CfgVehicles { isGlobal = 2; isTriggerActivated = 0; isDisposable = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class enabled { - displayName = "$STR_ACE_AssignMedicalFacility_enabled_DisplayName"; - description = "$STR_ACE_AssignMedicalFacility_enabled_Description"; + displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); + description = CSTRING(AssignMedicalFacility_enabled_Description); typeName = "BOOL"; }; }; class ModuleDescription { - description = "$STR_ACE_AssignMedicalFacility_Module_Description"; + description = CSTRING(AssignMedicalFacility_Module_Description); sync[] = {}; }; }; @@ -451,7 +468,7 @@ class CfgVehicles { // Create a consolidates medical menu for treatment while boarded class ACE_MainActions { class Medical { - displayName = "$STR_ACE_Medical_Actions_Medical"; + displayName = CSTRING(Actions_Medical); runOnHover = 1; exceptions[] = {"isNotInside"}; condition = QUOTE((vehicle _target != _target && vehicle _target == vehicle _player) || GVAR(menuTypeStyle) == 1); @@ -465,7 +482,7 @@ class CfgVehicles { #include "ACE_Medical_Actions.hpp" }; class GVAR(loadPatient) { - displayName = "$STR_ACE_Medical_LoadPatient"; + displayName = CSTRING(LoadPatient); distance = 5; condition = QUOTE(_target getvariable[ARR_2(QUOTE(QUOTE(ACE_isUnconscious)),false)] && vehicle _target == _target); statement = QUOTE([ARR_2(_player, _target)] call DFUNC(actionLoadUnit)); @@ -475,7 +492,7 @@ class CfgVehicles { exceptions[] = {"isNotDragging", "isNotCarrying"}; }; class GVAR(UnLoadPatient) { - displayName = "$STR_ACE_Medical_UnloadPatient"; + displayName = CSTRING(UnloadPatient); distance = 5; condition = QUOTE(_target getvariable[ARR_2(QUOTE(QUOTE(ACE_isUnconscious)),false)] && vehicle _target != _target); statement = QUOTE([ARR_2(_player, _target)] call DFUNC(actionUnloadUnit)); @@ -660,13 +677,13 @@ class CfgVehicles { side = -1; model = QUOTE(PATHTOEF(apl,bodybag.p3d)); icon = ""; - displayName = $STR_ACE_Medical_Bodybag_Display; + displayName = CSTRING(Bodybag_Display); EGVAR(dragging,canDrag) = 1; EGVAR(dragging,dragPosition[]) = {0,1.2,0}; EGVAR(dragging,dragDirection) = 0; class ACE_Actions { class ACE_MainActions { - displayName = "$STR_ACE_Interaction_MainAction"; + displayName = ECSTRING(interaction,MainAction); distance = 5; condition = QUOTE(true); statement = ""; @@ -713,8 +730,8 @@ class CfgVehicles { class ACE_fieldDressingItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Bandage_Basic_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Bandage_Basic_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_fieldDressing { @@ -726,8 +743,8 @@ class CfgVehicles { class ACE_packingBandageItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Packing_Bandage_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Packing_Bandage_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_packingBandage { @@ -739,8 +756,8 @@ class CfgVehicles { class ACE_elasticBandageItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Bandage_Elastic_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Bandage_Elastic_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_elasticBandage { @@ -752,8 +769,8 @@ class CfgVehicles { class ACE_tourniquetItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Tourniquet_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Tourniquet_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_tourniquet { @@ -765,8 +782,8 @@ class CfgVehicles { class ACE_morphineItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Morphine_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Morphine_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_morphine { @@ -778,8 +795,8 @@ class CfgVehicles { class ACE_atropineItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Atropine_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Atropine_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_atropine { @@ -791,8 +808,8 @@ class CfgVehicles { class ACE_epinephrineItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Epinephrine_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Epinephrine_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_epinephrine { @@ -804,8 +821,8 @@ class CfgVehicles { class ACE_plasmaIVItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Plasma_IV; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Plasma_IV); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_plasmaIV { @@ -818,8 +835,8 @@ class CfgVehicles { class ACE_bloodIVItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Blood_IV; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Blood_IV); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_bloodIV { @@ -831,8 +848,8 @@ class CfgVehicles { class ACE_salineIVItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Saline_IV; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Saline_IV); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_salineIV { @@ -844,8 +861,8 @@ class CfgVehicles { class ACE_quikClotItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_QuikClot_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(QuikClot_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_quikClot { @@ -857,8 +874,8 @@ class CfgVehicles { class ACE_personalAidKitItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Aid_Kit_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Aid_Kit_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_personalAidKit { @@ -870,8 +887,8 @@ class CfgVehicles { class ACE_surgicalKitItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_SurgicalKit_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(SurgicalKit_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_surgicalKit { @@ -883,8 +900,8 @@ class CfgVehicles { class ACE_bodyBagItem: Item_Base_F { scope = 2; scopeCurator = 2; - displayName = $STR_ACE_Medical_Bodybag_Display; - author = "$STR_ACE_Common_ACETeam"; + displayName = CSTRING(Bodybag_Display); + author = ECSTRING(common,ACETeam); vehicleClass = "Items"; class TransportItems { class ACE_bodyBag { @@ -898,9 +915,9 @@ class CfgVehicles { class ACE_medicalSupplyCrate: NATO_Box_Base { scope = 2; accuracy = 1000; - displayName = "$STR_ACE_medicalSupplyCrate"; + displayName = CSTRING(medicalSupplyCrate); model = PATHTOF(data\ace_medcrate.p3d); - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class TransportItems { class ACE_fieldDressing { name = "ACE_fieldDressing"; @@ -933,7 +950,7 @@ class CfgVehicles { }; }; class ACE_medicalSupplyCrate_advanced: ACE_medicalSupplyCrate { - displayName = "$STR_ACE_medicalSupplyCrate_advanced"; + displayName = CSTRING(medicalSupplyCrate_advanced); class TransportItems { class ACE_fieldDressing { name = "ACE_fieldDressing"; diff --git a/addons/medical/CfgWeapons.hpp b/addons/medical/CfgWeapons.hpp index d70b64a1d2..ef6c702604 100644 --- a/addons/medical/CfgWeapons.hpp +++ b/addons/medical/CfgWeapons.hpp @@ -24,64 +24,64 @@ class CfgWeapons { scope = 2; model = QUOTE(PATHTOF(data\bandage.p3d)); picture = QUOTE(PATHTOF(ui\items\fieldDressing_x_ca.paa)); - displayName = $STR_ACE_Medical_Bandage_Basic_Display; - descriptionShort = $STR_ACE_Medical_Bandage_Basic_Desc_Short; - descriptionUse = $STR_ACE_Medical_Bandage_Basic_Desc_Use; + displayName = CSTRING(Bandage_Basic_Display); + descriptionShort = CSTRING(Bandage_Basic_Desc_Short); + descriptionUse = CSTRING(Bandage_Basic_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; class ACE_packingBandage: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Packing_Bandage_Display; + displayName = CSTRING(Packing_Bandage_Display); picture = QUOTE(PATHTOF(ui\items\packingBandage_x_ca.paa)); model = QUOTE(PATHTOF(data\packingbandage.p3d)); - descriptionShort = $STR_ACE_Medical_Packing_Bandage_Desc_Short; - descriptionUse = $STR_ACE_Medical_Packing_Bandage_Desc_Use; + descriptionShort = CSTRING(Packing_Bandage_Desc_Short); + descriptionUse = CSTRING(Packing_Bandage_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; class ACE_elasticBandage: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Bandage_Elastic_Display; + displayName = CSTRING(Bandage_Elastic_Display); picture = QUOTE(PATHTOF(ui\items\elasticBandage_x_ca.paa)); model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d"; - descriptionShort = $STR_ACE_Medical_Bandage_Elastic_Desc_Short; - descriptionUse = $STR_ACE_Medical_Bandage_Elastic_Desc_Use; + descriptionShort = CSTRING(Bandage_Elastic_Desc_Short); + descriptionUse = CSTRING(Bandage_Elastic_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; class ACE_tourniquet: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Tourniquet_Display; + displayName = CSTRING(Tourniquet_Display); picture = QUOTE(PATHTOF(ui\items\tourniquet_x_ca.paa)); model = QUOTE(PATHTOF(data\tourniquet.p3d)); - descriptionShort = $STR_ACE_Medical_Tourniquet_Desc_Short; - descriptionUse = $STR_ACE_Medical_Tourniquet_Desc_Use; + descriptionShort = CSTRING(Tourniquet_Desc_Short); + descriptionUse = CSTRING(Tourniquet_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; class ACE_morphine: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Morphine_Display; + displayName = CSTRING(Morphine_Display); picture = QUOTE(PATHTOF(ui\items\morphine_x_ca.paa)); model = QUOTE(PATHTOF(data\morphine.p3d)); - descriptionShort = $STR_ACE_Medical_Morphine_Desc_Short; - descriptionUse = $STR_ACE_Medical_Morphine_Desc_Use; + descriptionShort = CSTRING(Morphine_Desc_Short); + descriptionUse = CSTRING(Morphine_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; class ACE_atropine: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Atropine_Display; + displayName = CSTRING(Atropine_Display); picture = QUOTE(PATHTOF(ui\items\atropine_x_ca.paa)); model = QUOTE(PATHTOF(data\atropine.p3d)); - descriptionShort = $STR_ACE_Medical_Atropine_Desc_Short; - descriptionUse = $STR_ACE_Medical_Atropine_Desc_Use; + descriptionShort = CSTRING(Atropine_Desc_Short); + descriptionUse = CSTRING(Atropine_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; @@ -89,33 +89,33 @@ class CfgWeapons { }; class ACE_epinephrine: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Epinephrine_Display; + displayName = CSTRING(Epinephrine_Display); picture = QUOTE(PATHTOF(ui\items\epinephrine_x_ca.paa)); model = QUOTE(PATHTOF(data\epinephrine.p3d)); - descriptionShort = $STR_ACE_Medical_Epinephrine_Desc_Short; - descriptionUse = $STR_ACE_Medical_Epinephrine_Desc_Use; + descriptionShort = CSTRING(Epinephrine_Desc_Short); + descriptionUse = CSTRING(Epinephrine_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; class ACE_plasmaIV: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Plasma_IV; + displayName = CSTRING(Plasma_IV); picture = QUOTE(PATHTOF(ui\items\plasmaIV_x_ca.paa)); - descriptionShort = $STR_ACE_Medical_Plasma_IV_Desc_Short; - descriptionUse = $STR_ACE_Medical_Plasma_IV_Desc_Use; + descriptionShort = CSTRING(Plasma_IV_Desc_Short); + descriptionUse = CSTRING(Plasma_IV_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 10; }; }; class ACE_plasmaIV_500: ACE_plasmaIV { - displayName = $STR_ACE_Medical_Plasma_IV_500; + displayName = CSTRING(Plasma_IV_500); class ItemInfo: InventoryItem_Base_F { mass = 5; }; }; class ACE_plasmaIV_250: ACE_plasmaIV { - displayName = $STR_ACE_Medical_Plasma_IV_250; + displayName = CSTRING(Plasma_IV_250); class ItemInfo: InventoryItem_Base_F { mass = 2.5; }; @@ -123,88 +123,88 @@ class CfgWeapons { class ACE_bloodIV: ACE_ItemCore { scope = 2; model = "\A3\Structures_F_EPA\Items\Medical\BloodBag_F.p3d"; - displayName = $STR_ACE_Medical_Blood_IV; + displayName = CSTRING(Blood_IV); picture = QUOTE(PATHTOF(ui\items\bloodIV_x_ca.paa)); - descriptionShort = $STR_ACE_Medical_Blood_IV_Desc_Short; - descriptionUse = $STR_ACE_Medical_Blood_IV_Desc_Use; + descriptionShort = CSTRING(Blood_IV_Desc_Short); + descriptionUse = CSTRING(Blood_IV_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 10; }; }; class ACE_bloodIV_500: ACE_bloodIV { - displayName = $STR_ACE_Medical_Blood_IV_500; + displayName = CSTRING(Blood_IV_500); class ItemInfo: InventoryItem_Base_F { mass = 5; }; }; class ACE_bloodIV_250: ACE_bloodIV { - displayName = $STR_ACE_Medical_Blood_IV_250; + displayName = CSTRING(Blood_IV_250); class ItemInfo: InventoryItem_Base_F { mass = 2.5; }; }; class ACE_salineIV: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Saline_IV; + displayName = CSTRING(Saline_IV); picture = QUOTE(PATHTOF(ui\items\salineIV_x_ca.paa)); - descriptionShort = $STR_ACE_Medical_Saline_IV_Desc_Short; - descriptionUse = $STR_ACE_Medical_Saline_IV_Desc_Use; + descriptionShort = CSTRING(Saline_IV_Desc_Short); + descriptionUse = CSTRING(Saline_IV_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 10; }; }; class ACE_salineIV_500: ACE_salineIV { - displayName = $STR_ACE_Medical_Saline_IV_500; + displayName = CSTRING(Saline_IV_500); class ItemInfo: InventoryItem_Base_F { - mass = 2.5; + mass = 5; }; }; class ACE_salineIV_250: ACE_salineIV { - displayName = $STR_ACE_Medical_Saline_IV_250; + displayName = CSTRING(Saline_IV_250); class ItemInfo: InventoryItem_Base_F { mass = 2.5; }; }; class ACE_quikclot: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_QuikClot_Display; + displayName = CSTRING(QuikClot_Display); picture = QUOTE(PATHTOF(ui\items\quickclot_x_ca.paa)); - descriptionShort = $STR_ACE_Medical_QuikClot_Desc_Short; - descriptionUse = $STR_ACE_Medical_QuikClot_Desc_Use; + descriptionShort = CSTRING(QuikClot_Desc_Short); + descriptionUse = CSTRING(QuikClot_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; class ACE_personalAidKit: ACE_ItemCore { scope = 2; - displayName = $STR_ACE_Medical_Aid_Kit_Display; + displayName = CSTRING(Aid_Kit_Display); picture = QUOTE(PATHTOF(ui\items\personal_aid_kit_x_ca.paa)); - descriptionShort = $STR_ACE_Medical_Aid_Kit_Desc_Short; - descriptionUse = $STR_ACE_Medical_Aid_Kit_Desc_Use; + descriptionShort = CSTRING(Aid_Kit_Desc_Short); + descriptionUse = CSTRING(Aid_Kit_Desc_Use); class ItemInfo: InventoryItem_Base_F { - mass = 2; + mass = 10; }; }; class ACE_surgicalKit: ACE_ItemCore { scope=2; - displayName= $STR_ACE_Medical_SurgicalKit_Display; + displayName= CSTRING(SurgicalKit_Display); model = QUOTE(PATHTOF(data\surgical_kit.p3d)); picture = QUOTE(PATHTOF(ui\items\surgicalKit_x_ca.paa)); - descriptionShort = $STR_ACE_Medical_SurgicalKit_Desc_Short; - descriptionUse = $STR_ACE_Medical_SurgicalKit_Desc_Use; - class ItemInfo: InventoryItem_Base_F { - mass = 5; - }; - }; - class ACE_bodyBag: ACE_ItemCore { - scope=2; - displayName= $STR_ACE_Medical_Bodybag_Display; - model = QUOTE(PATHTOF(data\bodybagItem.p3d)); - picture = QUOTE(PATHTOF(ui\items\bodybag_x_ca.paa)); - descriptionShort = $STR_ACE_Medical_Bodybag_Desc_Short; - descriptionUse = $STR_ACE_Medical_Bodybag_Desc_Use; + descriptionShort = CSTRING(SurgicalKit_Desc_Short); + descriptionUse = CSTRING(SurgicalKit_Desc_Use); class ItemInfo: InventoryItem_Base_F { mass = 15; }; }; + class ACE_bodyBag: ACE_ItemCore { + scope=2; + displayName= CSTRING(Bodybag_Display); + model = QUOTE(PATHTOF(data\bodybagItem.p3d)); + picture = QUOTE(PATHTOF(ui\items\bodybag_x_ca.paa)); + descriptionShort = CSTRING(Bodybag_Desc_Short); + descriptionUse = CSTRING(Bodybag_Desc_Use); + class ItemInfo: InventoryItem_Base_F { + mass = 20; + }; + }; }; diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index f8129e5e78..0b51f57165 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -6,9 +6,9 @@ GVAR(heartBeatSounds_Fast) = ["ACE_heartbeat_fast_1", "ACE_heartbeat_fast_2", "A GVAR(heartBeatSounds_Normal) = ["ACE_heartbeat_norm_1", "ACE_heartbeat_norm_2"]; GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]; -["medical_propagateWound", FUNC(onPropagateWound)] call ace_common_fnc_addEventHandler; -["medical_woundUpdateRequest", FUNC(onWoundUpdateRequest)] call ace_common_fnc_addEventHandler; -["interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call ace_common_fnc_addEventHandler; +["medical_propagateWound", FUNC(onPropagateWound)] call EFUNC(common,addEventHandler); +["medical_woundUpdateRequest", FUNC(onWoundUpdateRequest)] call EFUNC(common,addEventHandler); +["interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call EFUNC(common,addEventHandler); ["medical_onUnconscious", { if (local (_this select 0)) then { @@ -30,7 +30,7 @@ GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]; if (!isNil "acre_api_fnc_setGlobalVolume") then { [1] call acre_api_fnc_setGlobalVolume; }; }; }; -}] call ace_common_fnc_addEventHandler; +}] call EFUNC(common,addEventHandler); // Initialize all effects @@ -86,7 +86,7 @@ GVAR(effectPainCC) = [ // Initialize Other Variables GVAR(effectBlind) = false; -GVAR(effectTimeBlood) = time; +GVAR(effectTimeBlood) = ACE_time; // MAIN EFFECTS LOOP [{ @@ -133,8 +133,8 @@ GVAR(effectTimeBlood) = time; _bleeding = [ACE_player] call FUNC(getBloodLoss); // Bleeding Indicator - if (_bleeding > 0 and GVAR(effectTimeBlood) + 3.5 < time) then { - GVAR(effectTimeBlood) = time; + if (_bleeding > 0 and GVAR(effectTimeBlood) + 3.5 < ACE_time) then { + GVAR(effectTimeBlood) = ACE_time; [600 * _bleeding] call BIS_fnc_bloodEffect; }; @@ -150,75 +150,85 @@ GVAR(effectTimeBlood) = time; }, 0.5, []] call CBA_fnc_addPerFrameHandler; -GVAR(lastHeartBeat) = time; -GVAR(lastHeartBeatSound) = time; +GVAR(lastHeartBeat) = ACE_time; +GVAR(lastHeartBeatSound) = ACE_time; // HEARTRATE BASED EFFECTS [{ - private["_heartRate", "_interval", "_minTime", "_sound", "_strength"]; + private["_heartRate", "_interval", "_minTime", "_sound", "_strength", "_pain"]; _heartRate = ACE_player getVariable [QGVAR(heartRate), 70]; + _pain = ACE_player getVariable [QGVAR(pain), 0]; if (GVAR(level) == 1) then { - _heartRate = 60 + 40 * (ACE_player getVariable [QGVAR(pain), 0]); + _heartRate = 60 + 40 * _pain; }; if (_heartRate <= 0) exitwith {}; _interval = 60 / (_heartRate min 50); - if (time > GVAR(lastHeartBeat) + _interval) then { - GVAR(lastHeartBeat) = time; - // Pain effect - _strength = ACE_player getVariable [QGVAR(pain), 0]; - _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); + if ((ACE_player getVariable ["ACE_isUnconscious", false])) then { if (GVAR(painEffectType) == 1) then { + GVAR(effectPainCA) ppEffectEnable false; + } else { GVAR(effectPainCC) ppEffectEnable false; - if ((ACE_player getVariable [QGVAR(pain), 0]) > 0 && {alive ACE_player}) then { - _strength = _strength * 0.15; - GVAR(effectPainCA) ppEffectEnable true; - GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; - GVAR(effectPainCA) ppEffectCommit 0.01; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + }; + } else { + if ((ACE_time > GVAR(lastHeartBeat) + _interval)) then { + GVAR(lastHeartBeat) = ACE_time; + + // Pain effect + _strength = (_pain - (ACE_player getvariable [QGVAR(painSuppress), 0])) max 0; + _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); + if (GVAR(painEffectType) == 1) then { + GVAR(effectPainCC) ppEffectEnable false; + if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { + _strength = _strength * 0.15; + GVAR(effectPainCA) ppEffectEnable true; + GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; GVAR(effectPainCA) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit 0.01; + }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + } else { + GVAR(effectPainCA) ppEffectEnable false; + }; } else { GVAR(effectPainCA) ppEffectEnable false; - }; - } else { - GVAR(effectPainCA) ppEffectEnable false; - if ((ACE_player getVariable [QGVAR(pain), 0]) > 0 && {alive ACE_player}) then { - _strength = _strength * 0.9; - GVAR(effectPainCC) ppEffectEnable true; - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit 0.01; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { + _strength = _strength * 0.9; + GVAR(effectPainCC) ppEffectEnable true; + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; GVAR(effectPainCC) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); - } else { - GVAR(effectPainCC) ppEffectEnable false; + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit 0.01; + }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + } else { + GVAR(effectPainCC) ppEffectEnable false; + }; }; }; }; if (GVAR(level) >= 2 && {_heartRate > 0}) then { _minTime = 60 / _heartRate; - if (time - GVAR(lastHeartBeatSound) > _minTime) then { - GVAR(lastHeartBeatSound) = time; + if (ACE_time - GVAR(lastHeartBeatSound) > _minTime) then { + GVAR(lastHeartBeatSound) = ACE_time; // Heart rate sound effect if (_heartRate < 60) then { _sound = GVAR(heartBeatSounds_Normal) select (random((count GVAR(heartBeatSounds_Normal)) -1)); @@ -250,7 +260,7 @@ if (USE_WOUND_EVENT_SYNC) then { [ {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, - {(((_this select 0) getvariable [QGVAR(pain), 0]) > 0.9)}, + {(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.9}, {(([_this select 0] call FUNC(getBloodLoss)) > 0.25)}, {((_this select 0) getvariable [QGVAR(inReviveState), false])}, {((_this select 0) getvariable [QGVAR(inCardiacArrest), false])}, @@ -274,5 +284,5 @@ if (hasInterface) then { ["PlayerJip", { diag_log format["[ACE] JIP Medical init for player"]; [player] call FUNC(init); - }] call FUNC(addEventHandler); + }] call EFUNC(common,addEventHandler); }; diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 4f4ff5bc30..a932ee5c9d 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -40,6 +40,7 @@ PREP(handleDamage_caching); PREP(handleDamage_fractures); PREP(handleDamage_internalInjuries); PREP(handleDamage_wounds); +PREP(handleDamage_woundsOld); PREP(handleUnitVitals); PREP(handleKilled); PREP(handleLocal); @@ -76,8 +77,10 @@ PREP(treatmentAdvanced_CPR); PREP(treatmentAdvanced_CPRLocal); PREP(treatmentAdvanced_fullHeal); PREP(treatmentAdvanced_fullHealLocal); +PREP(treatmentAdvanced_fullHealTreatmentTime); PREP(treatmentAdvanced_medication); PREP(treatmentAdvanced_medicationLocal); +PREP(treatmentAdvanced_surgicalKit_onProgress); PREP(treatmentBasic_bandage); PREP(treatmentBasic_bloodbag); PREP(treatmentBasic_bloodbagLocal); @@ -110,6 +113,8 @@ PREP(handleCreateLitter); GVAR(injuredUnitCollection) = []; GVAR(IVBags) = []; +DFUNC(handleDamage_assignWounds) = if ("ace_medical" callExtension "version" == "") then { DFUNC(handleDamage_woundsOld) } else { DFUNC(handleDamage_wounds)}; + call FUNC(parseConfigForInjuries); GVAR(HITPOINTS) = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; diff --git a/addons/medical/XEH_respawn.sqf b/addons/medical/XEH_respawn.sqf index 0a95e064fd..44060fa15c 100644 --- a/addons/medical/XEH_respawn.sqf +++ b/addons/medical/XEH_respawn.sqf @@ -13,7 +13,7 @@ if (!(_unit getVariable ["ACE_isUnconscious", false])) then { [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); }; -// Remove maximum unconsciousness time handler +// Remove maximum unconsciousness ACE_time handler _maxUnconHandle = _unit getVariable [QGVAR(maxUnconTimeHandle), -1]; if (_maxUnconHandle > 0) then { [_maxUnconHandle] call CBA_fnc_removePerFrameHandler; diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index cd0fe0e66c..463ed95406 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {"ACE_medicalSupplyCrate", "ACE_medicalSupplyCrate_advanced", "ACE_fieldDressingItem", "ACE_packingBandageItem", "ACE_elasticBandageItem", "ACE_tourniquetItem", "ACE_morphineItem", "ACE_atropineItem", "ACE_epinephrineItem", "ACE_plasmaIVItem", "ACE_bloodIVItem", "ACE_salineIVItem", "ACE_quikclotItem", "ACE_personalAidKitItem", "ACE_surgicalKitItem", "ACE_bodyBagItem", "ACE_bodyBagObject"}; weapons[] = {"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_tourniquet", "ACE_morphine", "ACE_atropine", "ACE_epinephrine", "ACE_plasmaIV", "ACE_plasmaIV_500", "ACE_plasmaIV_250", "ACE_bloodIV", "ACE_bloodIV_500", "ACE_bloodIV_250", "ACE_salineIV", "ACE_salineIV_500", "ACE_salineIV_250", "ACE_quikclot", "ACE_personalAidKit", "ACE_surgicalKit", "ACE_bodyBag"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_interaction","ace_modules", "ace_apl"}; + requiredAddons[] = {"ace_interaction", "ace_apl"}; author[] = {"Glowbal", "KoffeinFlummi"}; authorUrl = ""; VERSION_CONFIG; @@ -21,3 +21,7 @@ class CfgPatches { #include "ACE_Settings.hpp" #include "UI\RscTitles.hpp" #include "UI\triagecard.hpp" + +class ACE_Extensions { + extensions[] += {"ace_medical"}; +}; diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf index 560b171400..19bd75caad 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -28,27 +28,28 @@ _bloodPressureLow = _bloodPressure select 0; _output = ""; _logOutPut = ""; if ([_caller] call FUNC(isMedic)) then { - _output = "STR_ACE_Medical_Check_Bloodpressure_Output_1"; + _output = LSTRING(Check_Bloodpressure_Output_1); _logOutPut = format["%1/%2",round(_bloodPressureHigh),round(_bloodPressureLow)]; } else { if (_bloodPressureHigh > 20) then { - _output = "STR_ACE_Medical_Check_Bloodpressure_Output_2"; - _logOutPut = localize "STR_ACE_Medical_Check_Bloodpressure_Low"; + _output = LSTRING(Check_Bloodpressure_Output_2); + _logOutPut = LSTRING(Check_Bloodpressure_Low); if (_bloodPressureHigh > 100) then { - _output = "STR_ACE_Medical_Check_Bloodpressure_Output_3"; - _logOutPut = localize "STR_ACE_Medical_Check_Bloodpressure_Normal"; + _output = LSTRING(Check_Bloodpressure_Output_3); + _logOutPut = LSTRING(Check_Bloodpressure_Normal); if (_bloodPressureHigh > 160) then { - _output = "STR_ACE_Medical_Check_Bloodpressure_Output_4"; - _logOutPut = localize "STR_ACE_Medical_Check_Bloodpressure_High"; + _output = LSTRING(Check_Bloodpressure_Output_4); + _logOutPut = LSTRING(Check_Bloodpressure_High); }; }; } else { if (random(10) > 3) then { - _output = "STR_ACE_Medical_Check_Bloodpressure_Output_5"; - _logOutPut = localize "STR_ACE_Medical_Check_Bloodpressure_NoBloodpressure"; + _output = LSTRING(Check_Bloodpressure_Output_5); + _logOutPut = LSTRING(Check_Bloodpressure_NoBloodpressure); } else { - _output = "STR_ACE_Medical_Check_Bloodpressure_Output_6"; + _output = LSTRING(Check_Bloodpressure_Output_6); + //Fail to find pressure, no logoutput }; }; }; @@ -56,5 +57,5 @@ if ([_caller] call FUNC(isMedic)) then { ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)], 1.75, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { - [_target,"activity", localize "STR_ACE_Medical_Check_Bloodpressure_Log", [[_caller] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); + [_target,"activity", LSTRING(Check_Bloodpressure_Log), [[_caller] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); }; diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index b283068ec7..9af18d0a6d 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -23,24 +23,24 @@ _heartRate = _unit getvariable [QGVAR(heartRate), 80]; if (!alive _unit) then { _heartRate = 0; }; -_heartRateOutput = "STR_ACE_Medical_Check_Pulse_Output_5"; -_logOutPut = localize "STR_ACE_Medical_Check_Pulse_None"; +_heartRateOutput = LSTRING(Check_Pulse_Output_5); +_logOutPut = LSTRING(Check_Pulse_None); if (_heartRate > 1.0) then { if ([_caller] call FUNC(isMedic)) then { - _heartRateOutput = "STR_ACE_Medical_Check_Pulse_Output_1"; + _heartRateOutput = LSTRING(Check_Pulse_Output_1); _logOutPut = format["%1",round(_heartRate)]; } else { // non medical personel will only find a pulse/HR - _heartRateOutput = "STR_ACE_Medical_Check_Pulse_Output_2"; - _logOutPut = localize "STR_ACE_Medical_Check_Pulse_Weak"; + _heartRateOutput = LSTRING(Check_Pulse_Output_2); + _logOutPut = LSTRING(Check_Pulse_Weak); if (_heartRate > 60) then { if (_heartRate > 100) then { - _heartRateOutput = "STR_ACE_Medical_Check_Pulse_Output_3"; - _logOutPut = localize "STR_ACE_Medical_Check_Pulse_Strong"; + _heartRateOutput = LSTRING(Check_Pulse_Output_3); + _logOutPut = LSTRING(Check_Pulse_Strong); } else { - _heartRateOutput = "STR_ACE_Medical_Check_Pulse_Output_4"; - _logOutPut = localize "STR_ACE_Medical_Check_Pulse_Normal"; + _heartRateOutput = LSTRING(Check_Pulse_Output_4); + _logOutPut = LSTRING(Check_Pulse_Normal); }; }; }; @@ -49,5 +49,5 @@ if (_heartRate > 1.0) then { ["displayTextStructured", [_caller], [[_heartRateOutput, [_unit] call EFUNC(common,getName), round(_heartRate)], 1.5, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { - [_unit,"activity", localize "STR_ACE_Medical_Check_Pulse_Log",[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); + [_unit,"activity", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); }; diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical/functions/fnc_actionCheckResponse.sqf index 92e724a3e0..2d62df12f6 100644 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ b/addons/medical/functions/fnc_actionCheckResponse.sqf @@ -20,9 +20,9 @@ _target = _this select 1; _output = ""; if ([_target] call EFUNC(common,isAwake)) then { - _output = "STR_ACE_Medical_Check_Response_Responsive"; + _output = LSTRING(Check_Response_Responsive); } else { - _output = "STR_ACE_Medical_Check_Response_Unresponsive"; + _output = LSTRING(Check_Response_Unresponsive); }; ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName)], 2, _caller]] call EFUNC(common,targetEvent); diff --git a/addons/medical/functions/fnc_actionDiagnose.sqf b/addons/medical/functions/fnc_actionDiagnose.sqf index d0a5aebc9f..243edbdef8 100644 --- a/addons/medical/functions/fnc_actionDiagnose.sqf +++ b/addons/medical/functions/fnc_actionDiagnose.sqf @@ -18,28 +18,28 @@ private ["_caller", "_target", "_genericMessages"]; _caller = _this select 0; _target = _this select 1; -_genericMessages = ["STR_ACE_Medical_diagnoseMessage"]; +_genericMessages = [LSTRING(diagnoseMessage)]; _genericMessages pushBack ([_target] call EFUNC(common,getName)); if (alive _target) then { - _genericMessages pushback "STR_ACE_Medical_diagnoseAlive"; + _genericMessages pushback LSTRING(diagnoseAlive); } else { - _genericMessages pushback "STR_ACE_Medical_diagnoseDead"; + _genericMessages pushback LSTRING(diagnoseDead); }; if (_target getvariable[QGVAR(hasLostBlood), 0] > 0) then { if (_target getvariable[QGVAR(hasLostBlood), 0] > 1) then { - _genericMessages pushback "STR_ACE_Medical_lostBloodALot"; + _genericMessages pushback LSTRING(lostBloodALot); } else { - _genericMessages pushback "STR_ACE_Medical_lostBlood"; + _genericMessages pushback LSTRING(lostBlood); }; } else { - _genericMessages pushback "STR_ACE_Medical_noBloodloss"; + _genericMessages pushback LSTRING(noBloodloss); }; if (_target getvariable[QGVAR(hasPain), false]) then { - _genericMessages pushback "STR_ACE_Medical_inPain"; + _genericMessages pushback LSTRING(inPain); } else { - _genericMessages pushback "STR_ACE_Medical_noPain"; + _genericMessages pushback LSTRING(noPain); }; ["displayTextStructured", [_caller], [_genericMessages, 3.0, _caller]] call EFUNC(common,targetEvent); diff --git a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf index 872b9a628a..73f9eeca4d 100644 --- a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf +++ b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf @@ -1,31 +1,40 @@ /* * Author: Glowbal - * Replace a dead body by a bodybag + * Replace a (dead) body by a body bag * * Arguments: - * 0: The patient - * 1: The new item classname + * 0: The actor + * 1: The patient * * Return Value: - * nil + * body bag * * Public: Yes */ #include "script_component.hpp" -private ["_target","_caller", "_nameOfUnit", "_onPosition", "_bodyBagCreated"]; -_caller = _this select 0; -_target = _this select 1; +PARAMS_2(_caller,_target); + +private ["_position", "_headPos", "_spinePos", "_dirVect", "_direction", "_bodyBag"]; -_nameOfUnit = [_target] call EFUNC(common,getName); if (alive _target) then { [_target, true] call FUNC(setDead); }; -_onPosition = getPos _target; -deleteVehicle _target; -_bodyBagCreated = createVehicle ["ACE_bodyBagObject", _onPosition, [], 0, "NONE"]; -// reset the position to ensure it is on the correct one. -_bodyBagCreated setPos [_onPosition select 0, _onPosition select 1, (_onPosition select 2) + 0.2]; -_bodyBagCreated; +_position = (getPosASL _target) vectorAdd [0, 0, 0.2]; + +_headPos = _target modelToWorldVisual (_target selectionPosition "head"); +_spinePos = _target modelToWorldVisual (_target selectionPosition "Spine3"); +_dirVect = _headPos vectorFromTo _spinePos; +_direction = _dirVect call CBA_fnc_vectDir; + +deleteVehicle _target; + +_bodyBag = createVehicle ["ACE_bodyBagObject", _position, [], 0, "CAN_COLLIDE"]; + +// prevent body bag from flipping +_bodyBag setPosASL _position; +_bodyBag setDir _direction; + +_bodyBag diff --git a/addons/medical/functions/fnc_actionUnloadUnit.sqf b/addons/medical/functions/fnc_actionUnloadUnit.sqf index bb66147f2a..a73f32265a 100644 --- a/addons/medical/functions/fnc_actionUnloadUnit.sqf +++ b/addons/medical/functions/fnc_actionUnloadUnit.sqf @@ -22,12 +22,6 @@ _drag = if (count _this > 2) then {_this select 2} else {false}; // cannot unload a unit not in a vehicle. if (vehicle _target == _target) exitwith {}; -if (([_target] call cse_fnc_isAwake)) exitwith {}; +if (([_target] call EFUNC(common,isAwake))) exitwith {}; -if ([_target] call EFUNC(common,unloadPerson)) then { - if (_drag) then { - if ((vehicle _caller) == _caller) then { - [[_caller, _target, true], QUOTE(DFUNC(actionDragUnit)), _caller, false] call EFUNC(common,execRemoteFnc); // TODO replace by event - }; - }; -}; +["unloadPersonEvent", _target, [_target, vehicle _target]] call EFUNC(common,targetEvent) \ No newline at end of file diff --git a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf b/addons/medical/functions/fnc_addHeartRateAdjustment.sqf index dbe0271e99..f4516a100c 100644 --- a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf +++ b/addons/medical/functions/fnc_addHeartRateAdjustment.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: The unit * 1: value - * 2: time in seconds + * 2: ACE_time in seconds * 3: callback * * Return Value: @@ -25,4 +25,4 @@ _callBack = [_this, 3, {}, [{}]] call BIS_fnc_Param; _adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []]; _adjustment pushback [_value, _time, _callBack]; _unit setvariable [QGVAR(heartRateAdjustments), _adjustment ]; -["Medical_onHeartRateAdjustmentAdded", [_unit, _value, _time]] call ace_common_fnc_localEvent; +["Medical_onHeartRateAdjustmentAdded", [_unit, _value, _time]] call EFUNC(common,localEvent); diff --git a/addons/medical/functions/fnc_addToInjuredCollection.sqf b/addons/medical/functions/fnc_addToInjuredCollection.sqf index 23ca283693..083f949d9d 100644 --- a/addons/medical/functions/fnc_addToInjuredCollection.sqf +++ b/addons/medical/functions/fnc_addToInjuredCollection.sqf @@ -29,8 +29,8 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { [{ private ["_unit", "_interval"]; _unit = (_this select 0) select 0; - _interval = time - ((_this select 0) select 1); - (_this select 0) set [1, time]; + _interval = ACE_time - ((_this select 0) select 1); + (_this select 0) set [1, ACE_time]; if (!alive _unit || !local _unit) then { [_this select 1] call CBA_fnc_removePerFrameHandler; @@ -46,7 +46,7 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { private "_pain"; _pain = _unit getvariable [QGVAR(pain), 0]; - if (_pain > 0) then { + if (_pain > (_unit getvariable [QGVAR(painSuppress), 0])) then { if (_pain > 0.7 && {random(1) > 0.6}) then { [_unit] call FUNC(setUnconscious); }; @@ -54,5 +54,5 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { [_unit, _pain] call FUNC(playInjuredSound); }; }; - }, 1, [_unit, time]] call CBA_fnc_addPerFrameHandler; + }, 1, [_unit, ACE_time]] call CBA_fnc_addPerFrameHandler; }; diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical/functions/fnc_addToLog.sqf index 46bacf2349..af7d9f3170 100644 --- a/addons/medical/functions/fnc_addToLog.sqf +++ b/addons/medical/functions/fnc_addToLog.sqf @@ -47,7 +47,7 @@ if (count _log >= 8) then { _log pushback [_message,_moment,_type, _arguments]; _unit setvariable [_logVarName, _log, true]; -["medical_onLogEntryAdded", [_unit, _type, _message, _arguments]] call ace_common_fnc_localEvent; +["medical_onLogEntryAdded", [_unit, _type, _message, _arguments]] call EFUNC(common,localEvent); _logs = _unit getvariable [QGVAR(allLogs), []]; if !(_logVarName in _logs) then { diff --git a/addons/medical/functions/fnc_addToTriageCard.sqf b/addons/medical/functions/fnc_addToTriageCard.sqf index 61add24cfc..7495c04a8a 100644 --- a/addons/medical/functions/fnc_addToTriageCard.sqf +++ b/addons/medical/functions/fnc_addToTriageCard.sqf @@ -30,7 +30,7 @@ _amount = 1; private "_info"; _info = _log select _foreachIndex; _info set [1,(_info select 1) + 1]; - _info set [2, time]; + _info set [2, ACE_time]; _log set [_foreachIndex, _info]; _amount = (_info select 1); @@ -39,7 +39,7 @@ _amount = 1; }foreach _log; if (!_inList) then { - _log pushback [_newItem, 1, time]; + _log pushback [_newItem, 1, ACE_time]; }; _unit setvariable [QGVAR(triageCard), _log, true]; -["Medical_onItemAddedToTriageCard", [_unit, _newItem, _amount]] call ace_common_fnc_localEvent; +["Medical_onItemAddedToTriageCard", [_unit, _newItem, _amount]] call EFUNC(common,localEvent); diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index c5c5d23a01..cd61550152 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -50,22 +50,22 @@ if (_show) then { _genericMessages = []; if (GVAR(level) >= 2) then { - _partText = ["STR_ACE_Interaction_Head", "STR_ACE_Interaction_Torso", "STR_ACE_Interaction_ArmLeft" ,"STR_ACE_Interaction_ArmRight" ,"STR_ACE_Interaction_LegLeft", "STR_ACE_Interaction_LegRight"] select _selectionN; + _partText = [LSTRING(Head), LSTRING(Torso), LSTRING(LeftArm) ,LSTRING(RightArm) ,LSTRING(LeftLeg), LSTRING(RightLeg)] select _selectionN; _genericMessages pushback [localize _partText, [1, 1, 1, 1]]; }; if (_target getvariable[QGVAR(isBleeding), false]) then { - _genericMessages pushback [localize "STR_ACE_Medical_Status_Bleeding", [1, 0.1, 0.1, 1]]; + _genericMessages pushback [localize LSTRING(Status_Bleeding), [1, 0.1, 0.1, 1]]; }; if (_target getvariable[QGVAR(hasLostBlood), 0] > 1) then { - _genericMessages pushback [localize "STR_ACE_Medical_Status_Lost_Blood", [1, 0.1, 0.1, 1]]; + _genericMessages pushback [localize LSTRING(Status_Lost_Blood), [1, 0.1, 0.1, 1]]; }; if (((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select _selectionN) > 0) then { - _genericMessages pushback [localize "STR_ACE_Medical_Status_Tourniquet_Applied", [0.77, 0.51, 0.08, 1]]; + _genericMessages pushback [localize LSTRING(Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]]; }; if (_target getvariable[QGVAR(hasPain), false]) then { - _genericMessages pushback [localize "STR_ACE_Medical_Status_Pain", [1, 1, 1, 1]]; + _genericMessages pushback [localize LSTRING(Status_Pain), [1, 1, 1, 1]]; }; _totalIvVolume = 0; @@ -77,7 +77,7 @@ if (_show) then { }; }foreach GVAR(IVBags); if (_totalIvVolume >= 1) then { - _genericMessages pushback [format[localize "STR_ACE_Medical_receivingIvVolume", floor _totalIvVolume], [1, 1, 1, 1]]; + _genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; }; _damaged = [false, false, false, false, false, false]; @@ -133,17 +133,17 @@ if (_show) then { if (_target getHitPointDamage _x > 0 && {_forEachIndex == _selectionN}) then { _pointDamage = _target getHitPointDamage _x; _severity = switch (true) do { - case (_pointDamage > 0.5): {localize "STR_ACE_Medical_HeavilyWounded"}; - case (_pointDamage > 0.1): {localize "STR_ACE_Medical_LightlyWounded"}; - default {localize "STR_ACE_Medical_VeryLightlyWounded"}; + case (_pointDamage > 0.5): {localize LSTRING(HeavilyWounded)}; + case (_pointDamage > 0.1): {localize LSTRING(LightlyWounded)}; + default {localize LSTRING(VeryLightlyWounded)}; }; _part = localize ([ - "STR_ACE_Medical_Head", - "STR_ACE_Medical_Torso", - "STR_ACE_Medical_LeftArm", - "STR_ACE_Medical_RightArm", - "STR_ACE_Medical_LeftLeg", - "STR_ACE_Medical_RightLeg" + LSTRING(Head), + LSTRING(Torso), + LSTRING(LeftArm), + LSTRING(RightArm), + LSTRING(LeftLeg), + LSTRING(RightLeg) ] select _forEachIndex); _allInjuryTexts pushBack [format ["%1 %2", _severity, toLower _part], [1,1,1,1]]; }; @@ -186,7 +186,7 @@ if (_show) then { _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _x select 1]; }foreach _allInjuryTexts; if (count _allInjuryTexts == 0) then { - _lbCtrl lbAdd (localize "STR_ACE_Medical_NoInjuriesBodypart"); + _lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart)); }; _logCtrl = (_display displayCtrl 302); diff --git a/addons/medical/functions/fnc_displayTriageCard.sqf b/addons/medical/functions/fnc_displayTriageCard.sqf index a9054dac46..c4ed4ad829 100644 --- a/addons/medical/functions/fnc_displayTriageCard.sqf +++ b/addons/medical/functions/fnc_displayTriageCard.sqf @@ -58,7 +58,7 @@ if (_show) then { }foreach _log; if (count _triageCardTexts == 0) then { - _lbCtrl lbAdd (localize "STR_ACE_Medical_TriageCard_NoEntry"); + _lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry)); }; { _lbCtrl lbAdd _x; diff --git a/addons/medical/functions/fnc_getCardiacOutput.sqf b/addons/medical/functions/fnc_getCardiacOutput.sqf index a44e8a8e29..34d7be33af 100644 --- a/addons/medical/functions/fnc_getCardiacOutput.sqf +++ b/addons/medical/functions/fnc_getCardiacOutput.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" /* - Cardiac output (Q or or CO ) is the volume of blood being pumped by the heart, in particular by a left or right ventricle in the time interval of one minute. CO may be measured in many ways, for example dm3/min (1 dm3 equals 1 litre). + Cardiac output (Q or or CO ) is the volume of blood being pumped by the heart, in particular by a left or right ventricle in the ACE_time interval of one minute. CO may be measured in many ways, for example dm3/min (1 dm3 equals 1 litre). Source: http://en.wikipedia.org/wiki/Cardiac_output */ diff --git a/addons/medical/functions/fnc_getTriageStatus.sqf b/addons/medical/functions/fnc_getTriageStatus.sqf index aaeec2d516..812c20ed2a 100644 --- a/addons/medical/functions/fnc_getTriageStatus.sqf +++ b/addons/medical/functions/fnc_getTriageStatus.sqf @@ -17,10 +17,10 @@ private ["_unit","_return","_status"]; _unit = _this select 0; _status = _unit getvariable [QGVAR(triageLevel), -1]; _return = switch (_status) do { - case 1: {[localize "STR_ACE_Medical_Triage_Status_Minor", 1, [0, 0.5, 0, 0.9]]}; - case 2: {[localize "STR_ACE_Medical_Triage_Status_Delayed", 2, [0.7, 0.5, 0, 0.9]]}; - case 3: {[localize "STR_ACE_Medical_Triage_Status_Immediate", 3, [0.4, 0.07, 0.07, 0.9]]}; - case 4: {[localize "STR_ACE_Medical_Triage_Status_Deceased", 4, [0, 0, 0, 0.9]]}; - default {[localize "STR_ACE_Medical_Triage_Status_None", 0, [0, 0, 0, 0.9]]}; + case 1: {[localize LSTRING(Triage_Status_Minor), 1, [0, 0.5, 0, 0.9]]}; + case 2: {[localize LSTRING(Triage_Status_Delayed), 2, [0.7, 0.5, 0, 0.9]]}; + case 3: {[localize LSTRING(Triage_Status_Immediate), 3, [0.4, 0.07, 0.07, 0.9]]}; + case 4: {[localize LSTRING(Triage_Status_Deceased), 4, [0, 0, 0, 0.9]]}; + default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]}; }; _return; diff --git a/addons/medical/functions/fnc_getTypeOfDamage.sqf b/addons/medical/functions/fnc_getTypeOfDamage.sqf index 4dd517679a..d51131ce0c 100644 --- a/addons/medical/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical/functions/fnc_getTypeOfDamage.sqf @@ -13,22 +13,23 @@ #include "script_component.hpp" -private ["_typeOfProjectile","_typeOfInjury"]; -_typeOfProjectile = _this select 0; -_typeOfInjury = switch (true) do { - case (_typeOfProjectile iskindof "BulletBase"): {"Bullet"}; - case (_typeOfProjectile iskindof "GrenadeCore"): {"Grenade"}; - case (_typeOfProjectile iskindof "TimeBombCore"): {"Explosive"}; - case (_typeOfProjectile iskindof "MineCore"): {"Explosive"}; - case (_typeOfProjectile iskindof "FuelExplosion"): {"Explosive"}; - case (_typeOfProjectile iskindof "ShellBase"): {"Shell"}; - case (_typeOfProjectile iskindof "RocketBase"): {"Explosive"}; - case (_typeOfProjectile iskindof "MissileBase"): {"Explosive"}; - case (_typeOfProjectile iskindof "LaserBombCore"): {"Explosive"}; - case (_typeOfProjectile iskindof "BombCore"): {"Explosive"}; - case (_typeOfProjectile iskindof "Grenade"): {"Grenade"}; - case (_typeOfProjectile == "VehicleCrash"): {"VehicleCrash"}; - default {_typeOfProjectile}; +PARAMS_1(_typeOfProjectile); + +private ["_typeOfDamage"]; + +_typeOfDamage = switch (true) do { + case (_typeOfProjectile isKindOf "BulletBase"): {"bullet"}; + case (_typeOfProjectile isKindOf "GrenadeCore"): {"grenade"}; + case (_typeOfProjectile isKindOf "TimeBombCore"): {"explosive"}; + case (_typeOfProjectile isKindOf "MineCore"): {"explosive"}; + case (_typeOfProjectile isKindOf "FuelExplosion"): {"explosive"}; + case (_typeOfProjectile isKindOf "ShellBase"): {"shell"}; + case (_typeOfProjectile isKindOf "RocketBase"): {"explosive"}; + case (_typeOfProjectile isKindOf "MissileBase"): {"explosive"}; + case (_typeOfProjectile isKindOf "LaserBombCore"): {"explosive"}; + case (_typeOfProjectile isKindOf "BombCore"): {"explosive"}; + case (_typeOfProjectile isKindOf "Grenade"): {"grenade"}; + default {toLower _typeOfProjectile}; }; -// TODO replace the capitalization on the switch results instead.. -toLower _typeOfInjury; + +_typeOfDamage diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf index 681116f226..f13fbc8c05 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -28,12 +28,12 @@ if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then { } forEach (_oldLitter select 1); }; -GVAR(allCreatedLitter) pushBack [time, [_litterObject]]; +GVAR(allCreatedLitter) pushBack [ACE_time, [_litterObject]]; if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { [{ { - if (time - (_x select 0) >= GVAR(litterCleanUpDelay)) then { + if (ACE_time - (_x select 0) >= GVAR(litterCleanUpDelay)) then { { deleteVehicle _x; } forEach (_x select 1); diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 1d8c821d1f..ab6e6f2a68 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -41,22 +41,6 @@ if (_selection in GVAR(SELECTIONS)) then { }; if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith {_damageOld}; -// Figure out whether to prevent death before handling damage -if (diag_frameno > (_unit getVariable [QGVAR(frameNo), -3]) + 2) then { - _unit setVariable [QGVAR(frameNo), diag_frameno]; - _unit setVariable [QGVAR(wasUnconscious), _unit getVariable ["ACE_isUnconscious", false]]; - - _preventDeath = _unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]; - if (_unit getVariable ["ACE_isUnconscious", false]) then { - _preventDeath = _unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]; - if !([_unit] call EFUNC(common,isPlayer)) then { - _preventDeath = _preventDeath - 1; - }; - _preventDeath = _preventDeath > 0; - }; - _unit setVariable [QGVAR(preventDeath), _preventDeath]; -}; - // Get return damage _damageReturn = _damage; if (GVAR(level) < 2) then { @@ -64,10 +48,12 @@ if (GVAR(level) < 2) then { } else { if !([_unit] call FUNC(hasMedicalEnabled)) exitwith { // Because of the config changes, we cannot properly disable the medical system for a unit. - // lets use basic for the time being.. + // lets use basic for the ACE_time being.. _damageReturn = _this call FUNC(handleDamage_basic); }; _newDamage = _this call FUNC(handleDamage_caching); + // handleDamage_caching may have modified the projectile string + _projectile = _this select 4; _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); @@ -82,7 +68,7 @@ if (GVAR(level) < 2) then { }; }; - if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)} || !alive vehicle _unit) then { + if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith { _damageReturn = 0.9; }; @@ -97,30 +83,45 @@ if (GVAR(level) < 2) then { }; [_unit] call FUNC(addToInjuredCollection); -// Prevent death if necessary -if (_unit getVariable QGVAR(preventDeath)) then { - if (_selection in ["", "head", "body"]) then { - _damageReturn = _damageReturn min 0.89; - }; - // Move the unit out of the vehicle if necessary - if (vehicle _unit != _unit and damage (vehicle _unit) == 1) then { +if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { + if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { [_unit] call EFUNC(common,unloadPerson); - if (_unit getVariable QGVAR(wasUnconscious)) then { - [_unit] call FUNC(setDead); - } else { - [_unit, true] call FUNC(setUnconscious); - }; }; - // Temporarily disable all damage to prevent stuff like - // being killed during the animation etc. - if (!_wasUnconscious and (_unit getVariable ["ACE_isUnconscious", false])) then { - _unit setVariable [QGVAR(allowDamage), false]; - [{ - _this setVariable [QGVAR(allowDamage), true]; - }, _unit, 0.7, 0] call EFUNC(common,waitAndExecute); + private "_delayedUnconsicous"; + _delayedUnconsicous = false; + if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { + [_unit] call EFUNC(common,unloadPerson); + _delayedUnconsicous = true; }; + + if (_damageReturn >= 0.9 && {_selection in ["", "head", "body"]}) exitWith { + if (_unit getvariable ["ACE_isUnconscious", false]) exitwith { + [_unit] call FUNC(setDead); + 0.89 + }; + if (_delayedUnconsicous) then { + [{ + [_this select 0, true] call FUNC(setUnconscious); + }, [_unit], 0.7, 0] call EFUNC(common,waitAndExec); + } else { + [{ + [_this select 0, true] call FUNC(setUnconscious); + }, [_unit]] call EFUNC(common,execNextFrame); + }; + 0.89 + }; + _damageReturn min 0.89; +}; + +if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { + if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { + [_unit] call EFUNC(common,unloadPerson); + }; + [_unit] call FUNC(setDead); + + 0.89 }; _damageReturn diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index 8bd0267d3f..9da0d065ed 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -12,7 +12,7 @@ * 6: Type of Damage * * Return Value: - * Damage To Be Inflicted + * Nothing * * Public: No */ @@ -28,10 +28,7 @@ _typeOfProjectile = _this select 4; _newDamage = _this select 5; // Most likely taking exessive fire damage. Lets exit. -if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) exitwith { - 0 -}; -_typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); +if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) exitwith {}; _part = [_selectionName] call FUNC(selectionNameToNumber); if (_part < 0) exitwith {}; @@ -44,7 +41,8 @@ _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; [_unit] call FUNC(handleDamage_advancedSetDamage); -[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_wounds); +_typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); +[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); // TODO Disabled until implemented fully //if (GVAR(enableAirway)) then { @@ -63,5 +61,3 @@ if (alive _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then { [_unit] call FUNC(setUnconscious); }; }; - -_amountOfDamage; diff --git a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf index f464ef5a94..3df8a5ce0c 100644 --- a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf @@ -13,42 +13,22 @@ #include "script_component.hpp" -private ["_unit", "_bodyStatus", "_headDamage", "_torsoDamage", "_handsDamage", "_legsDamage"]; -_unit = _this select 0; +PARAMS_1(_unit); if (!local _unit) exitwith {}; -_bodyStatus = _unit getvariable [QGVAR(bodyPartStatus),[0,0,0,0,0,0]]; +private ["_bodyStatus", "_headDamage", "_torsoDamage", "_handsDamage", "_legsDamage"]; + // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] -_headDamage = _bodyStatus select 0; -if (_headDamage > 0.95) then { - _unit setHitPointDamage ["hitHead", 0.95]; -} else { - _unit setHitPointDamage ["hitHead", _headDamage]; -}; +_bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; -_torsoDamage = _bodyStatus select 1; -if (_torsoDamage > 0.95) then { - _unit setHitPointDamage ["hitBody", 0.95]; -} else { - _unit setHitPointDamage ["hitBody", _torsoDamage]; -}; +EXPLODE_6_PVT(_bodyStatus,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); +_unit setHitPointDamage ["hitHead", _headDamage min 0.95]; +_unit setHitPointDamage ["hitBody", _torsoDamage min 0.95]; +_unit setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; +_unit setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; -_handsDamage = (_bodyStatus select 2) + (_bodyStatus select 3); -if (_handsDamage > 0.95) then { - _unit setHitPointDamage ["hitHands", 0.95]; -} else { - _unit setHitPointDamage ["hitHands", _handsDamage]; -}; - -_legsDamage = (_bodyStatus select 4) + (_bodyStatus select 5); -if (_legsDamage > 0.95) then { - _unit setHitPointDamage ["hitLegs", 0.95]; -} else { - _unit setHitPointDamage ["hitLegs", _legsDamage]; -}; - -if ({_x > 0} count _bodyStatus == 0) then { +if (_bodyStatus isEqualTo [0,0,0,0,0,0]) then { _unit setDamage 0; }; diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index 7b308ad188..04049cfa7c 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -48,20 +48,28 @@ if (diag_frameno > (_unit getVariable [QGVAR(basic_frameNo), -3]) + 2) then { _unit setVariable [QGVAR(hitPoints), []]; _unit setVariable [QGVAR(damages), []]; _unit setVariable [QGVAR(structDamage), 0]; + + if (isnil {_unit getvariable QGVAR(structDamagePFH)}) then { // Assign orphan structural damage to torso - [{ - private ["_unit", "_damagesum"]; - _unit = _this select 0; - _damagesum = (_unit getHitPointDamage "HitHead") + - (_unit getHitPointDamage "HitBody") + - (_unit getHitPointDamage "HitLeftArm") + - (_unit getHitPointDamage "HitRightArm") + - (_unit getHitPointDamage "HitLeftLeg") + - (_unit getHitPointDamage "HitRightLeg"); - if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then { - _unit setHitPointDamage ["HitBody", damage _unit]; - }; - }, [_unit], 2, 0.1] call EFUNC(common,waitAndExecute); + [{ + private ["_unit", "_damagesum"]; + _unit = (_this select 0) select 0; + if (ACE_diagTime - (_unit getvariable [QGVAR(structDamagePFH),-2]) >= 2) then { + _unit setVariable [QGVAR(structDamagePFH), nil]; + _damagesum = (_unit getHitPointDamage "HitHead") + + (_unit getHitPointDamage "HitBody") + + (_unit getHitPointDamage "HitLeftArm") + + (_unit getHitPointDamage "HitRightArm") + + (_unit getHitPointDamage "HitLeftLeg") + + (_unit getHitPointDamage "HitRightLeg"); + if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then { + _unit setHitPointDamage ["HitBody", damage _unit]; + }; + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + }, 0, [_unit]] call CBA_fnc_addPerFrameHandler; + }; + _unit setVariable [QGVAR(structDamagePFH), ACE_diagTime]; // Assign starting ACE_time or reset it }; _newDamage = _damage - (damage _unit); diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 95d750843d..9760770d71 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -18,7 +18,7 @@ #include "script_component.hpp" -private ["_unit", "_selectionName","_damage", "_source","_projectile","_hitSelections","_hitPoints","_newDamage","_cache_hitpoints","_cache_projectiles","_cache_params","_cache_damages"]; +private ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; _unit = _this select 0; _selectionName = _this select 1; _damage = _this select 2; @@ -41,18 +41,33 @@ if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isN if (GVAR(enableVehicleCrashes)) then { _selectionName = _hitSelections select (floor(random(count _hitSelections))); _projectile = "vehiclecrash"; + _this set [1, _selectionName]; + _this set [4, _projectile]; }; }; -// From AGM medical: -// Exclude falling damage to everything other than legs; reduce structural damage. -if (((velocity _unit) select 2 < -5) && {(vehicle _unit == _unit)}) then { - _unit setVariable [QGVAR(isFalling), True]; +// Handle falling damage +_impactVelocity = (velocity _unit) select 2; +if (_impactVelocity < -5 && {vehicle _unit == _unit}) then { + _unit setVariable [QGVAR(isFalling), true]; + _unit setVariable [QGVAR(impactVelocity), _impactVelocity]; }; - -if (_unit getVariable [QGVAR(isFalling), false] && {!(_selectionName in ["", "leg_l", "leg_r"])}) exitWith {}; if (_unit getVariable [QGVAR(isFalling), false]) then { - _newDamage = _newDamage * 0.7; + if !(_selectionName in ["", "leg_l", "leg_r"]) then { + if (_selectionName == "body") then { + _newDamage = _newDamage * abs(_unit getVariable [QGVAR(impactVelocity), _impactVelocity]) / 50; + } else { + _newDamage = _newDamage * 0.5; + }; + } else { + if (_selectionName == "") then { + _selectionName = ["leg_l", "leg_r"] select (floor(random 2)); + _this set [1, _selectionName]; + }; + _newDamage = _newDamage * 0.7; + }; + _projectile = "falling"; + _this set [4, "falling"]; }; // Finished with the current frame, reset variables @@ -88,7 +103,7 @@ if (_selectionName != "") then { private ["_index","_otherDamage"]; _index = _cache_projectiles find _projectile; // Check if the current projectile has already been handled once - if (_index >= 0) exitwith { + if (_index >= 0 && {_projectile != "falling"}) exitwith { _cache_damages = _unit getVariable QGVAR(cachedDamages); // Find the previous damage this projectile has done _otherDamage = (_cache_damages select _index); diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 9172304dd2..70eeb74f9d 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -24,120 +24,43 @@ _damage = _this select 2; _typeOfProjectile = _this select 3; _typeOfDamage = _this select 4; -// Convert the selectionName to a number and ensure it is a valid selection. -_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); -if (_bodyPartn < 0) exitwith {}; - -// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] -_injuryTypeInfo = missionNamespace getvariable [format[QGVAR(woundInjuryType_%1), _typeOfDamage],[[], false, []]]; - -// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] -_allInjuriesForDamageType = _injuryTypeInfo select 2; -// It appears we are dealing with an unknown type of damage. - -if (count _allInjuriesForDamageType == 0) then { - // grabbing the configuration for unknown damage type - _injuryTypeInfo = missionNamespace getvariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; - _allInjuriesForDamageType = _injuryTypeInfo select 2; -}; - -// find the available injuries for this damage type and damage amount -_highestPossibleSpot = -1; -_highestPossibleDamage = -1; -_allPossibleInjuries = []; -{ - _damageLevels = _x select 4; - _minDamage = _damageLevels select 0; - _maxDamage = _damageLevels select 1; - - // Check if the damage is higher as the min damage for the specific injury - if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { - //_classType = _x select 0; - _selections = _x select 1; - //_bloodLoss = _x select 2; - //_pain = _x select 3; - - // Check if the injury can be applied to the given selection name - if ("All" in _selections || _selectionName in _selections) then { - - // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries - if (_minDamage > _highestPossibleDamage) then { - _highestPossibleSpot = _foreachIndex; - _highestPossibleDamage = _minDamage; - }; - - // Store the valid possible injury for the damage type, damage amount and selection - _allPossibleInjuries pushback _x; - }; - }; -}foreach _allInjuriesForDamageType; - -// No possible wounds available for this damage type or damage amount. -if (_highestPossibleSpot < 0) exitwith {}; - // Administration for open wounds and ids _openWounds = _unit getvariable[QGVAR(openWounds), []]; _woundID = _unit getvariable[QGVAR(lastUniqueWoundID), 1]; +_extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _selectionName, _damage, _typeOfDamage, _woundID]; + _painToAdd = 0; _woundsCreated = []; + +call compile _extensionOutput; +_foundIndex = -1; { - if (_x select 0 <= _damage) exitwith { - for "_i" from 0 to (1+ floor(random(_x select 1)-1)) /* step +1 */ do { - - // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] - _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {_allPossibleInjuries select (floor(random (count _allPossibleInjuries)));}; - _toAddClassID = _toAddInjury select 0; - _foundIndex = -1; - - _bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))}; - // If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it.. - if ((_injuryTypeInfo select 1)) then { - { - // Check if we have an id of the given class on the given bodypart already - if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { - _foundIndex = _foreachIndex; - }; - }foreach _openWounds; - }; - - _injury = []; - if (_foundIndex < 0) then { - // Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate] - _injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2]; - - // Since it is a new injury, we will have to add it to the open wounds array to store it - _openWounds pushback _injury; - - // New injuries will also increase the wound ID - _woundID = _woundID + 1; - } else { - // We already have one of these, so we are just going to increase the number that we have of it with a new one. - _injury = _openWounds select _foundIndex; - _injury set [3, (_injury select 3) + 1]; - }; - // Store the injury so we can process it later correctly. - _woundsCreated pushback _injury; - - // Collect the pain that is caused by this injury - _painToAdd = _painToAdd + (_toAddInjury select 3); + _toAddClassID = _x select 1; + _bodyPartNToAdd = _x select 2; + { + // Check if we have an id of the given class on the given bodypart already + if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { + _foundIndex = _foreachIndex; }; - }; -}foreach (_injuryTypeInfo select 0); // foreach damage thresholds + }foreach _openWounds; -_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; + if (_foundIndex < 0) then { + // Since it is a new injury, we will have to add it to the open wounds array to store it + _openWounds pushback _x; + } else { + // We already have one of these, so we are just going to increase the number that we have of it with a new one. + _injury = _openWounds select _foundIndex; + _injury set [3, (_injury select 3) + 1]; + }; +}foreach _woundsCreated; + +_unit setvariable [QGVAR(openWounds), _openWounds, true]; // Only update if new wounds have been created if (count _woundsCreated > 0) then { _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; }; -if (USE_WOUND_EVENT_SYNC) then { - // 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); - }foreach _woundsCreated; -}; - _painLevel = _unit getvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf new file mode 100644 index 0000000000..1034ba9cae --- /dev/null +++ b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf @@ -0,0 +1,143 @@ +/* + * Author: Glowbal + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Name Of Hit Selection + * 2: Amount Of Damage + * 3: Shooter or source of the damage + * 4: Type of the damage done + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; +_unit = _this select 0; +_selectionName = _this select 1; +_damage = _this select 2; +_typeOfProjectile = _this select 3; +_typeOfDamage = _this select 4; + +// Convert the selectionName to a number and ensure it is a valid selection. +_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); +if (_bodyPartn < 0) exitwith {}; + +// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] +_injuryTypeInfo = missionNamespace getvariable [format[QGVAR(woundInjuryType_%1), _typeOfDamage],[[], false, []]]; + +// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..] +_allInjuriesForDamageType = _injuryTypeInfo select 2; +// It appears we are dealing with an unknown type of damage. + +if (count _allInjuriesForDamageType == 0) then { + // grabbing the configuration for unknown damage type + _injuryTypeInfo = missionNamespace getvariable [QGVAR(woundInjuryType_unknown),[[], false, []]]; + _allInjuriesForDamageType = _injuryTypeInfo select 2; +}; + +// find the available injuries for this damage type and damage amount +_highestPossibleSpot = -1; +_highestPossibleDamage = -1; +_allPossibleInjuries = []; +{ + _damageLevels = _x select 4; + _minDamage = _damageLevels select 0; + _maxDamage = _damageLevels select 1; + + // Check if the damage is higher as the min damage for the specific injury + if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { + //_classType = _x select 0; + _selections = _x select 1; + //_bloodLoss = _x select 2; + //_pain = _x select 3; + + // Check if the injury can be applied to the given selection name + if ("All" in _selections || _selectionName in _selections) then { + + // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries + if (_minDamage > _highestPossibleDamage) then { + _highestPossibleSpot = _foreachIndex; + _highestPossibleDamage = _minDamage; + }; + + // Store the valid possible injury for the damage type, damage amount and selection + _allPossibleInjuries pushback _x; + }; + }; +}foreach _allInjuriesForDamageType; + +// No possible wounds available for this damage type or damage amount. +if (_highestPossibleSpot < 0) exitwith {}; + +// Administration for open wounds and ids +_openWounds = _unit getvariable[QGVAR(openWounds), []]; +_woundID = _unit getvariable[QGVAR(lastUniqueWoundID), 1]; + +_painToAdd = 0; +_woundsCreated = []; +{ + if (_x select 0 <= _damage) exitwith { + for "_i" from 0 to (1+ floor(random(_x select 1)-1)) /* step +1 */ do { + + // Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage] + _toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {_allPossibleInjuries select (floor(random (count _allPossibleInjuries)));}; + _toAddClassID = _toAddInjury select 0; + _foundIndex = -1; + + _bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))}; + // If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it.. + if ((_injuryTypeInfo select 1)) then { + { + // Check if we have an id of the given class on the given bodypart already + if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { + _foundIndex = _foreachIndex; + }; + }foreach _openWounds; + }; + + _injury = []; + if (_foundIndex < 0) then { + // Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate] + _injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2]; + + // Since it is a new injury, we will have to add it to the open wounds array to store it + _openWounds pushback _injury; + + // New injuries will also increase the wound ID + _woundID = _woundID + 1; + } else { + // We already have one of these, so we are just going to increase the number that we have of it with a new one. + _injury = _openWounds select _foundIndex; + _injury set [3, (_injury select 3) + 1]; + }; + // Store the injury so we can process it later correctly. + _woundsCreated pushback _injury; + + // Collect the pain that is caused by this injury + _painToAdd = _painToAdd + (_toAddInjury select 3); + }; + }; +}foreach (_injuryTypeInfo select 0); // foreach damage thresholds + +_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; + +// Only update if new wounds have been created +if (count _woundsCreated > 0) then { +// _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; +}; + +if (USE_WOUND_EVENT_SYNC) then { + // 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); + }foreach _woundsCreated; +}; + +_painLevel = _unit getvariable [QGVAR(pain), 0]; +_unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; diff --git a/addons/medical/functions/fnc_handleLocal.sqf b/addons/medical/functions/fnc_handleLocal.sqf index 216fb8ed49..c0f9c15292 100644 --- a/addons/medical/functions/fnc_handleLocal.sqf +++ b/addons/medical/functions/fnc_handleLocal.sqf @@ -26,7 +26,7 @@ if (_local) then { if ((_unit getvariable ["ACE_isUnconscious",false]) && {count (_unit getvariable [QGVAR(unconsciousArguments), []]) >= 6}) then { private "_arguments"; _arguments = (_unit getvariable [QGVAR(unconsciousArguments), []]); - _arguments set [2, time]; + _arguments set [2, ACE_time]; [DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 3877faf85d..c96c1b05f8 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -20,9 +20,9 @@ _interval = _this select 1; if (_interval == 0) exitWith {}; _lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0]; -_syncValues = (time - _lastTimeValuesSynced >= (10 + floor(random(10))) && GVAR(keepLocalSettingsSynced)); +_syncValues = (ACE_time - _lastTimeValuesSynced >= (10 + floor(random(10))) && GVAR(keepLocalSettingsSynced)); if (_syncValues) then { - _unit setvariable [QGVAR(lastMomentValuesSynced), time]; + _unit setvariable [QGVAR(lastMomentValuesSynced), ACE_time]; }; _bloodVolume = (_unit getvariable [QGVAR(bloodVolume), 100]) + ([_unit] call FUNC(getBloodVolumeChange)); @@ -58,7 +58,7 @@ if (([_unit] call FUNC(getBloodLoss)) > 0) then { }; _painStatus = _unit getvariable [QGVAR(pain), 0]; -if (_painStatus > 0) then { +if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { if !(_unit getvariable [QGVAR(hasPain), false]) then { _unit setvariable [QGVAR(hasPain), true, true]; }; diff --git a/addons/medical/functions/fnc_hasMedicalEnabled.sqf b/addons/medical/functions/fnc_hasMedicalEnabled.sqf index fb5a45fe70..63fddd16b4 100644 --- a/addons/medical/functions/fnc_hasMedicalEnabled.sqf +++ b/addons/medical/functions/fnc_hasMedicalEnabled.sqf @@ -15,7 +15,7 @@ _unit = _this select 0; _medicalEnabled = _unit getvariable QGVAR(enableMedical); if (isnil "_medicalEnabled") exitwith { - (((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getvariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1)); + (((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getvariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1) || GVAR(level) == 1); }; _medicalEnabled; diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index 0ec6ce3ce2..27d80163a5 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -64,6 +64,7 @@ _unit setvariable [QGVAR(hasLostBlood), 0, true]; _unit setvariable [QGVAR(isBleeding), false, true]; _unit setvariable [QGVAR(hasPain), false, true]; _unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; +_unit setvariable [QGVAR(painSuppress), 0, true]; // medication _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; diff --git a/addons/medical/functions/fnc_isInMedicalVehicle.sqf b/addons/medical/functions/fnc_isInMedicalVehicle.sqf index 5422ce8e1f..d376ce3824 100644 --- a/addons/medical/functions/fnc_isInMedicalVehicle.sqf +++ b/addons/medical/functions/fnc_isInMedicalVehicle.sqf @@ -21,4 +21,4 @@ _vehicle = vehicle _unit; if (_unit == _vehicle) exitWith {false}; if (_unit in [driver _vehicle, gunner _vehicle, commander _vehicle]) exitWith {false}; -_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant") == 1] +(_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 diff --git a/addons/medical/functions/fnc_modifyMedicalAction.sqf b/addons/medical/functions/fnc_modifyMedicalAction.sqf index 179ae9eb83..268ba8e253 100644 --- a/addons/medical/functions/fnc_modifyMedicalAction.sqf +++ b/addons/medical/functions/fnc_modifyMedicalAction.sqf @@ -34,7 +34,7 @@ private ["_openWounds", "_amountOf"]; _openWounds = _target getvariable [QGVAR(openWounds), []]; { _amountOf = _x select 3; - if (_amountOf > 0 && {(_selectionN == (_x select 2))}) exitwith { + if (_amountOf > 0 && {(_selectionN == (_x select 2))} && {(_x select 4) > 0}) exitwith { _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; }; } foreach _openWounds; diff --git a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf index cf884e0ab0..5263044583 100644 --- a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf @@ -33,3 +33,5 @@ if !(_activated) exitWith {}; [_logic, QGVAR(consumeItem_SurgicalKit), "consumeItem_SurgicalKit"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(useLocation_PAK), "useLocation_PAK"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(useLocation_SurgicalKit), "useLocation_SurgicalKit"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(healHitPointAfterAdvBandage), "healHitPointAfterAdvBandage"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(painIsOnlySuppressed), "painIsOnlySuppressed"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleMedicalSettings.sqf b/addons/medical/functions/fnc_moduleMedicalSettings.sqf index 296b4f1d56..00b7a15fcf 100644 --- a/addons/medical/functions/fnc_moduleMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleMedicalSettings.sqf @@ -30,6 +30,7 @@ if !(_activated) exitWith {}; [_logic, QGVAR(playerDamageThreshold), "playerDamageThreshold"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(AIDamageThreshold), "AIDamageThreshold"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(enableUnconsciousnessAI), "enableUnconsciousnessAI"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(remoteControlledAI), "remoteControlledAI"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(preventInstaDeath), "preventInstaDeath"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(bleedingCoefficient), "bleedingCoefficient"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(painCoefficient), "painCoefficient"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_onMedicationUsage.sqf b/addons/medical/functions/fnc_onMedicationUsage.sqf index c56f676744..904ad3ef88 100644 --- a/addons/medical/functions/fnc_onMedicationUsage.sqf +++ b/addons/medical/functions/fnc_onMedicationUsage.sqf @@ -7,7 +7,7 @@ * 1: Medication Treatment classname * 2: The medication treatment variablename * 3: Max dosage - * 4: The time in the system + * 4: The ACE_time in the system * 5: Incompatable medication > * * Return Value: @@ -18,7 +18,7 @@ #include "script_component.hpp" -private ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_foundEntry", "_allUsedMedication","_allMedsFromClassname", "_usedMeds", "_hasOverDosed", "_med", "_limit", "_classNamesUsed", "_decreaseAmount", "_viscosityChange", "_viscosityAdjustment", "_medicationConfig", "_onOverDose"]; +private ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_foundEntry", "_allUsedMedication","_allMedsFromClassname", "_usedMeds", "_hasOverDosed", "_med", "_limit", "_classNamesUsed", "_decreaseAmount", "_viscosityChange", "_viscosityAdjustment", "_medicationConfig", "_onOverDose", "_painReduce"]; _target = _this select 0; _className = _this select 1; _variable = _this select 2; @@ -26,6 +26,7 @@ _maxDosage = _this select 3; _timeInSystem = _this select 4; _incompatabileMeds = _this select 5; _viscosityChange = _this select 6; +_painReduce = _this select 7; _foundEntry = false; _allUsedMedication = _target getvariable [QGVAR(allUsedMedication), []]; @@ -84,7 +85,7 @@ _decreaseAmount = 1 / _timeInSystem; _viscosityAdjustment = _viscosityChange / _timeInSystem; [{ - private ["_args", "_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_usedMeds", "_viscosityAdjustment"]; + private ["_args", "_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_usedMeds", "_viscosityAdjustment", "_painReduce"]; _args = _this select 0; _target = _args select 0; _timeInSystem = _args select 1; @@ -92,6 +93,7 @@ _viscosityAdjustment = _viscosityChange / _timeInSystem; _amountDecreased = _args select 3; _decreaseAmount = _args select 4; _viscosityAdjustment = _args select 5; + _painReduce = _args select 6; _usedMeds = _target getvariable [_variable, 0]; _usedMeds = _usedMeds - _decreaseAmount; @@ -101,9 +103,10 @@ _viscosityAdjustment = _viscosityChange / _timeInSystem; // Restoring the viscosity while the medication is leaving the system _target setvariable [QGVAR(peripheralResistance), ((_target getvariable [QGVAR(peripheralResistance), 100]) - _viscosityAdjustment) max 0]; + _target setvariable [QGVAR(painSuppress), ((_target getvariable [QGVAR(painSuppress), 0]) - _painReduce) max 0]; if (_amountDecreased >= 1 || (_usedMeds <= 0) || !alive _target) then { [(_this select 1)] call cba_fnc_removePerFrameHandler; }; _args set [3, _amountDecreased]; -}, 1, [_target, _timeInSystem, _variable, 0, _decreaseAmount, _viscosityAdjustment] ] call CBA_fnc_addPerFrameHandler; +}, 1, [_target, _timeInSystem, _variable, 0, _decreaseAmount, _viscosityAdjustment, _painReduce / _timeInSystem] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf index 503ff9833e..1b2db7c278 100644 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical/functions/fnc_parseConfigForInjuries.sqf @@ -118,4 +118,58 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); if (isNumber(_damageTypesConfig >> _x >> "selectionSpecific")) then { _selectionSpecificType = getNumber(_damageTypesConfig >> _x >> "selectionSpecific");}; }; missionNamespace setvariable [_varName, [_typeThresholds, _selectionSpecificType > 0, _woundTypes]]; + + private ["_minDamageThresholds", "_amountThresholds"]; + // extension loading + _minDamageThresholds = ""; + _amountThresholds = ""; + { + _minDamageThresholds = _minDamageThresholds + str(_x select 0); + _amountThresholds = _amountThresholds + str(_x select 1); + if (_forEachIndex < (count _typeThresholds) - 1) then { + _minDamageThresholds = _minDamageThresholds + ":"; + _amountThresholds = _amountThresholds + ":"; + }; + }foreach _typeThresholds; + + "ace_medical" callExtension format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _foreachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; + }foreach _allFoundDamageTypes; + + +// Extension loading + +{ + private ["_classID", "_className", "_allowedSelections", "_bloodLoss", "_pain", "_minDamage", "_maxDamage", "_causes", "_classDisplayName", "_extensionInput", "_selections", "_causesArray"]; + // add shit to addInjuryType + _classID = _x select 0; + _className = GVAR(woundClassNames) select _forEachIndex; + _allowedSelections = ""; + + _selections = _x select 1; + { + _allowedSelections = _allowedSelections + _x; + if (_forEachIndex < (count _selections) - 1) then { + _allowedSelections = _allowedSelections + ":"; + }; + }foreach _selections; + + _bloodLoss = _x select 2; + _pain = _x select 3; + _minDamage = (_x select 4) select 0; + _maxDamage = (_x select 4) select 1; + _causes = ""; + _causesArray = (_x select 5); + { + _causes = _causes + _x; + if (_forEachIndex < (count _causesArray) - 1) then { + _causes = _causes + ":"; + }; + }foreach _causesArray; + _classDisplayName = _x select 6; + + "ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; + +}foreach _allWoundClasses; + +"ace_medical" callExtension "ConfigComplete"; diff --git a/addons/medical/functions/fnc_playInjuredSound.sqf b/addons/medical/functions/fnc_playInjuredSound.sqf index c48e3d0a4c..3d41ec70db 100644 --- a/addons/medical/functions/fnc_playInjuredSound.sqf +++ b/addons/medical/functions/fnc_playInjuredSound.sqf @@ -1,7 +1,7 @@ /* * Author: Glowbal * Play the injured sound for a unit if the unit is damaged. The sound broadcasted across MP. - * Will not play if the unit has already played a sound within to close a time frame. + * Will not play if the unit has already played a sound within to close a ACE_time frame. * Delay: With minimal damage (below 1), the delay is (10 + random(50)) seconds. Otherwise it is 60 seconds / damage. * * Arguments: diff --git a/addons/medical/functions/fnc_setCardiacArrest.sqf b/addons/medical/functions/fnc_setCardiacArrest.sqf index b4483defc2..c33d83bb40 100644 --- a/addons/medical/functions/fnc_setCardiacArrest.sqf +++ b/addons/medical/functions/fnc_setCardiacArrest.sqf @@ -21,7 +21,7 @@ if (_unit getvariable [QGVAR(inCardiacArrest),false]) exitwith {}; _unit setvariable [QGVAR(inCardiacArrest), true,true]; _unit setvariable [QGVAR(heartRate), 0]; -["Medical_onEnteredCardiacArrest", [_unit]] call ace_common_fnc_localEvent; +["Medical_onEnteredCardiacArrest", [_unit]] call EFUNC(common,localEvent); [_unit, true] call FUNC(setUnconscious); _timeInCardiacArrest = 120 + round(random(600)); @@ -38,10 +38,10 @@ _timeInCardiacArrest = 120 + round(random(600)); [(_this select 1)] call cba_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; }; - if (time - _startTime >= _timeInCardiacArrest) exitwith { + if (ACE_time - _startTime >= _timeInCardiacArrest) exitwith { [(_this select 1)] call cba_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; [_unit] call FUNC(setDead); }; -}, 1, [_unit, time, _timeInCardiacArrest] ] call CBA_fnc_addPerFrameHandler; +}, 1, [_unit, ACE_time, _timeInCardiacArrest] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index 411fd6dc06..fe18ac581f 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -40,7 +40,7 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == }; _unit setvariable [QGVAR(inReviveState), true, true]; - _unit setvariable [QGVAR(reviveStartTime), time]; + _unit setvariable [QGVAR(reviveStartTime), ACE_time]; [_unit, true] call FUNC(setUnconscious); [{ @@ -49,7 +49,7 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == _unit = _args select 0; _startTime = _unit getvariable [QGVAR(reviveStartTime), 0]; - if (time - _startTime > GVAR(maxReviveTime)) exitwith { + if (ACE_time - _startTime > GVAR(maxReviveTime)) exitwith { [(_this select 1)] call cba_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inReviveState), nil, true]; _unit setvariable [QGVAR(reviveStartTime), nil]; @@ -74,5 +74,8 @@ _unit setvariable ["ACE_isDead", true, true]; if (isPLayer _unit) then { _unit setvariable ["isDeadPlayer", true, true]; }; + +["medical_onSetDead", [_unit]] call EFUNC(common,localEvent); + _unit setdamage 1; true; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 72d297b2c8..3298c0a869 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: The unit that will be put in an unconscious state * 1: Set unconsciouns - * 2: Minimum unconscious time + * 2: Minimum unconscious ACE_time * * ReturnValue: * nil @@ -17,10 +17,11 @@ #define DEFAULT_DELAY (round(random(10)+5)) -private ["_unit", "_set", "_animState", "_originalPos", "_startingTime","_minWaitingTime"]; +private ["_unit", "_set", "_animState", "_originalPos", "_startingTime","_minWaitingTime", "_force", "_isDead"]; _unit = _this select 0; _set = if (count _this > 1) then {_this select 1} else {true}; _minWaitingTime = if (count _this > 2) then {_this select 2} else {DEFAULT_DELAY}; +_force = if (count _this > 3) then {_this select 3} else {false}; // No change, fuck off. (why is there no xor?) if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {}; @@ -32,7 +33,7 @@ if !(_set) exitwith { if !(!(isNull _unit) && {(_unit isKindOf "CAManBase") && ([_unit] call EFUNC(common,isAwake))}) exitwith{}; if (!local _unit) exitwith { - [[_unit], QUOTE(DFUNC(setUnconscious)), _unit, false] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ + [[_unit, _set, _minWaitingTime, _force], QUOTE(DFUNC(setUnconscious)), _unit, false] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ }; _unit setvariable ["ACE_isUnconscious", true, true]; @@ -46,12 +47,15 @@ if (_unit == ACE_player) then { }; // if we have unconsciousness for AI disabled, we will kill the unit instead -if !([_unit] call EFUNC(common,isPlayer)) then { +_isDead = false; +if (!([_unit, GVAR(remoteControlledAI)] call EFUNC(common,isPlayer)) && !_force) then { _enableUncon = _unit getVariable [QGVAR(enableUnconsciousnessAI), GVAR(enableUnconsciousnessAI)]; - if (_enableUncon == 0 or {_enableUncon == 1 and (random 1) < 0.5}) exitWith { + if (_enableUncon == 0 or {_enableUncon == 1 and (random 1) < 0.5}) then { [_unit, true] call FUNC(setDead); + _isDead = true; }; }; +if (_isDead) exitWith {}; // If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious, // therefor we force it to select the primairy weapon before going unconscious @@ -96,7 +100,7 @@ _anim = [_unit] call EFUNC(common,getDeathAnim); }; }, [_unit, _anim], 0.5, 0] call EFUNC(common,waitAndExecute); -_startingTime = time; +_startingTime = ACE_time; [DFUNC(unconsciousPFH), 0.1, [_unit, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index f50ff505e0..06cea8dfe3 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn"]; +private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; @@ -26,7 +26,7 @@ _className = _this select 3; if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith { [{ _this call FUNC(treatment); - }, _this, 0, 0] call EFUNC(common,waitAndExecute); + }, _this] call EFUNC(common,execNextFrame); }; if !(_target isKindOf "CAManBase") exitWith {false}; @@ -156,7 +156,7 @@ if (currentWeapon _caller == secondaryWeapon _caller) then { _caller selectWeapon (primaryWeapon _caller); }; -_wpn = ["non", "rfl", "pst"] select (["", primaryWeapon _caller, handgunWeapon _caller] find (currentWeapon _caller)); +_wpn = ["non", "rfl", "pst"] select (1 + ([primaryWeapon _caller, handgunWeapon _caller] find (currentWeapon _caller))); _callerAnim = [_callerAnim, "[wpn]", _wpn] call CBA_fnc_replace; if (vehicle _caller == _caller && {_callerAnim != ""}) then { if (primaryWeapon _caller == "") then { @@ -174,8 +174,26 @@ if (vehicle _caller == _caller && {_callerAnim != ""}) then { [_caller, _callerAnim] call EFUNC(common,doAnimation); }; +//Get treatment time +_treatmentTime = if (isNumber (_config >> "treatmentTime")) then { + getNumber (_config >> "treatmentTime"); +} else { + if (isText (_config >> "treatmentTime")) exitwith { + _treatmentTimeConfig = getText(_config >> "treatmentTime"); + if (isnil _treatmentTimeConfig) then { + _treatmentTimeConfig = compile _treatmentTimeConfig; + } else { + _treatmentTimeConfig = missionNamespace getvariable _treatmentTimeConfig; + }; + if (typeName _treatmentTimeConfig == "SCALAR") exitwith { + _treatmentTimeConfig; + }; + [_caller, _target, _selectionName, _className] call _treatmentTimeConfig; + }; + 0; +}; + // Start treatment -_treatmentTime = getNumber (_config >> "treatmentTime"); [ _treatmentTime, [_caller, _target, _selectionName, _className, _items, _usersOfItems], diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf index 394595ade3..6b6b7adb81 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf @@ -37,6 +37,6 @@ if !([_target] call FUNC(hasMedicalEnabled)) exitwith { }; }foreach _items;*/ -[_target, "activity", "STR_ACE_Medical_Activity_bandagedPatient", [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity", LSTRING(Activity_bandagedPatient), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf index e385c5f7c0..544ef6ae55 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf @@ -58,6 +58,7 @@ if (alive _target) exitwith { _target setvariable [QGVAR(hasLostBlood), 0, true]; _target setvariable [QGVAR(isBleeding), false, true]; _target setvariable [QGVAR(hasPain), false, true]; + _target setvariable [QGVAR(painSuppress), 0, true]; // medication _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf new file mode 100644 index 0000000000..108bdd4a5d --- /dev/null +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf @@ -0,0 +1,26 @@ +/* + * Author: Ruthberg + * Calculates the personal aid kit treatment time based on amount of damage to heal + * + * Arguments: + * unit + * + * Return Value: + * treatment time + * + * Example: + * [_target] call ace_medical_fnc_treatmentAdvanced_fullHealTreatmentTime + * + * Public: No + */ +#include "script_component.hpp" + +private ["_target", "_totalDamage"]; +_target = _this; +_totalDamage = 0; + +{ + _totalDamage = _totalDamage + _x; +} forEach (_target getVariable [QGVAR(bodyPartStatus), []]); + +(10 max (_totalDamage * 10) min 120) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf index c6ac2dc8e5..e3d07616f3 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf @@ -32,6 +32,6 @@ _items = _this select 4; }; }foreach _items; -[_target, "activity", "STR_ACE_Medical_Activity_usedItem", [[_caller] call EFUNC(common,getName), _className]] call FUNC(addToLog); +[_target, "activity", LSTRING(Activity_usedItem), [[_caller] call EFUNC(common,getName), _className]] call FUNC(addToLog); true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf index 934bc9239a..c4ba840398 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf @@ -60,28 +60,32 @@ _heartRate = _target getvariable [QGVAR(heartRate), 70]; if (alive _target) then { if (_heartRate > 0) then { if (_heartRate <= 45) then { - [_target, ((_hrIncreaseLow select 0) + random((_hrIncreaseLow select 1))), (_hrIncreaseLow select 2), _hrCallback] call FUNC(addHeartRateAdjustment); + [_target, ((_hrIncreaseLow select 0) + random ((_hrIncreaseLow select 1) - (_hrIncreaseLow select 0))), (_hrIncreaseLow select 2), _hrCallback] call FUNC(addHeartRateAdjustment); } else { if (_heartRate > 120) then { - [_target, ((_hrIncreaseHigh select 0) + random((_hrIncreaseHigh select 1))), (_hrIncreaseHigh select 2), _hrCallback] call FUNC(addHeartRateAdjustment); + [_target, ((_hrIncreaseHigh select 0) + random ((_hrIncreaseHigh select 1) - (_hrIncreaseHigh select 0))), (_hrIncreaseHigh select 2), _hrCallback] call FUNC(addHeartRateAdjustment); } else { - [_target, ((_hrIncreaseNorm select 0) + random((_hrIncreaseNorm select 1))), (_hrIncreaseNorm select 2), _hrCallback] call FUNC(addHeartRateAdjustment); + [_target, ((_hrIncreaseNorm select 0) + random ((_hrIncreaseNorm select 1) - (_hrIncreaseNorm select 0))), (_hrIncreaseNorm select 2), _hrCallback] call FUNC(addHeartRateAdjustment); }; }; }; }; if (_painReduce > 0) then { - // Reduce the pain level - _pain = _target getvariable [QGVAR(pain), 0]; - _target setvariable [QGVAR(pain), (_pain - (_pain * _painReduce)) max 0]; + // Reduce pain + _painSuppress = _target getvariable [QGVAR(painSuppress), 0]; + _target setvariable [QGVAR(painSuppress), (_painSuppress + _painReduce) max 0]; + if (!GVAR(painIsOnlySuppressed)) then { + _pain = _target getvariable [QGVAR(pain), 0]; + _target setvariable [QGVAR(pain), (_pain - _painReduce) max 0, true]; + }; }; _resistance = _target getvariable [QGVAR(peripheralResistance), 100]; _resistance = _resistance + _viscosityChange; _target setvariable [QGVAR(peripheralResistance), _resistance max 0]; -// Call back to ensure that the medication is decreased over time -[_target, _classname, _varName, _maxDose, _timeInSystem, _inCompatableMedication, _viscosityChange] call FUNC(onMedicationUsage); +// Call back to ensure that the medication is decreased over ACE_time +[_target, _classname, _varName, _maxDose, _timeInSystem, _inCompatableMedication, _viscosityChange, _painReduce] call FUNC(onMedicationUsage); true diff --git a/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf b/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf new file mode 100644 index 0000000000..c0e1037027 --- /dev/null +++ b/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf @@ -0,0 +1,28 @@ +/* + * Author: BaerMitUmlaut + * Handles treatment via surgical kit per frame. + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_args", "_target", "_caller", "_elapsedTime", "_totalTime", "_bandagedWounds"]; +_args = _this select 0; +_caller = _args select 0; +_target = _args select 1; +_elapsedTime = _this select 1; +_totalTime = _this select 2; + +_bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; + +//In case two people stitch up one patient and the last wound has already been closed we can stop already +if (count _bandagedWounds == 0) exitWith {false}; + +//Has enough time elapsed that we can close another wound? +if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then { + _bandagedWounds deleteAt 0; + _target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; +}; + +true \ No newline at end of file diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf index 9d2c12280d..7cfb65a909 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf @@ -16,8 +16,9 @@ #include "script_component.hpp" -private ["_caller", "_target"]; +private ["_caller", "_target", "_treatmentClassname"]; _caller = _this select 0; _target = _this select 1; +_treatmentClassname = _this select 3; -[[_target], QUOTE(DFUNC(treatmentBasic_bloodbagLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +[[_target, _treatmentClassname], QUOTE(DFUNC(treatmentBasic_bloodbagLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf index 9bbe04b35f..08057c9492 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf @@ -4,6 +4,7 @@ * * Arguments: * 0: The patient + * 1: Treatment Classname * * Return Value: * nil @@ -14,8 +15,15 @@ #include "script_component.hpp" #define BLOODBAGHEAL 70 -private ["_target","_blood"]; -_target = _this select 0; +PARAMS_2(_target,_treatmentClassname); -_blood = ((_target getVariable [QGVAR(bloodVolume), 100]) + BLOODBAGHEAL) min 100; +private ["_blood", "_bloodAdded"]; + +_bloodAdded = switch (true) do { + case (_treatmentClassname == "BloodIV_250"): {0.25 * BLOODBAGHEAL}; + case (_treatmentClassname == "BloodIV_500"): {0.5 * BLOODBAGHEAL}; + default {BLOODBAGHEAL}; +}; + +_blood = ((_target getVariable [QGVAR(bloodVolume), 100]) + _bloodAdded) min 100; _target setVariable [QGVAR(bloodVolume), _blood, true]; diff --git a/addons/medical/functions/fnc_treatmentIV.sqf b/addons/medical/functions/fnc_treatmentIV.sqf index c0f4e4681f..fc6b91b057 100644 --- a/addons/medical/functions/fnc_treatmentIV.sqf +++ b/addons/medical/functions/fnc_treatmentIV.sqf @@ -27,6 +27,6 @@ _items = _this select 4; if (count _items == 0) exitwith {}; _removeItem = _items select 0; -[[_target, _removeItem], QUOTE(DFUNC(treatmentIVLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +[[_target, _className], QUOTE(DFUNC(treatmentIVLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", "STR_ACE_Medical_Activity_gaveIV", [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity", LSTRING(Activity_gaveIV), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical/functions/fnc_treatmentIVLocal.sqf b/addons/medical/functions/fnc_treatmentIVLocal.sqf index 04708b965f..9abb5fda2f 100644 --- a/addons/medical/functions/fnc_treatmentIVLocal.sqf +++ b/addons/medical/functions/fnc_treatmentIVLocal.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: The medic - * 1: Item used classname + * 1: Treatment classname * * * Return Value: @@ -15,9 +15,9 @@ #include "script_component.hpp" -private ["_target", "_ivItem", "_config", "_volumeAdded", "_typeOf", "_varName", "_bloodVolume"]; +private ["_target", "_treatmentClassname", "_config", "_volumeAdded", "_typeOf", "_varName", "_bloodVolume"]; _target = _this select 0; -_ivItem = _this select 1; +_treatmentClassname = _this select 1; _bloodVolume = _target getvariable [QGVAR(bloodVolume), 100]; if (_bloodVolume >= 100) exitwith {}; @@ -27,10 +27,12 @@ _config = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "IV"); _volumeAdded = getNumber (_config >> "volume"); _typeOf = getText (_config >> "type"); -if (isClass (_config >> _ivItem)) then { - _config = (_config >> _ivItem); +if (isClass (_config >> _treatmentClassname)) then { + _config = (_config >> _treatmentClassname); if (isNumber (_config >> "volume")) then { _volumeAdded = getNumber (_config >> "volume");}; if (isText (_config >> "type")) then { _typeOf = getText (_config >> "type"); }; +} else { + ERROR("IV Treatment Classname not found"); }; _varName = format["ACE_Medical_IVVolume_%1",_typeOf]; diff --git a/addons/medical/functions/fnc_treatmentTourniquet.sqf b/addons/medical/functions/fnc_treatmentTourniquet.sqf index c4ee10011e..cab44d3295 100644 --- a/addons/medical/functions/fnc_treatmentTourniquet.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquet.sqf @@ -43,7 +43,7 @@ _removeItem = _items select 0; [[_target, _removeItem, _selectionName], QUOTE(DFUNC(treatmentTourniquetLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_target, _removeItem] call FUNC(addToTriageCard); -[_target, "activity", "STR_ACE_Medical_Activity_appliedTourniquet", [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity", LSTRING(Activity_appliedTourniquet), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); true; diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf index 02484bbca6..5108bf8433 100644 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf @@ -44,9 +44,9 @@ _target setvariable [QGVAR(tourniquets), _tourniquets, true]; // Tourniquet has been removed [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - if (time - _time > 120) then { + if (ACE_time - _time > 120) then { _target setvariable [QGVAR(pain), (_target getvariable [QGVAR(pain), 0]) + 0.005]; }; -}, 5, [_target, _applyingTo, _part, time] ] call CBA_fnc_addPerFrameHandler; +}, 5, [_target, _applyingTo, _part, ACE_time] ] call CBA_fnc_addPerFrameHandler; true; diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf index f0759a66ba..5b1ca04d2d 100644 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ b/addons/medical/functions/fnc_unconsciousPFH.sqf @@ -30,6 +30,10 @@ _hasMovedOut = _args select 4; _parachuteCheck = _args select 5; if (!alive _unit) exitwith { + if ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { + TRACE_1("Removing fake weapon [on death]",_unit); + _unit removeWeapon "ACE_FakePrimaryWeapon"; + }; if (GVAR(moveUnitsFromGroupOnUnconscious)) then { [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); }; @@ -49,6 +53,11 @@ 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 ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { + TRACE_1("Removing fake weapon [on wakeup]",_unit); + _unit removeWeapon "ACE_FakePrimaryWeapon"; + }; + if (vehicle _unit == _unit) then { if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then { [_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation); @@ -121,13 +130,13 @@ if (_parachuteCheck) then { }; if (!local _unit) exitwith { - _args set [3, _minWaitingTime - (time - _startingTime)]; + _args set [3, _minWaitingTime - (ACE_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 ((ACE_time - _startingTime) >= _minWaitingTime) exitwith { if (!([_unit] call FUNC(getUnconsciousCondition))) then { _unit setvariable ["ACE_isUnconscious", false, true]; }; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9e818e8ca3..e2fee86715 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -44,7 +44,7 @@ Устанавливает количество мусора, который появляется после использования мед. препаратов. Большое количество мусора может уменьшить производительность, поэтому данная настройка локальна для клиента. Il livello di dettagli della simulazione dei rifiuti indica il numero di rifiuti che verranno creati localmente nel client. La creazione di troppi rifiuti in aree locali potrebbe causare lag e calo di FPS. Questo è un settaggio client. Le niveau de simulation des détritus règle la quantité de déchets qui vont être créés localement chez le client. Des quantitées excessive chez certains clients peuvent causer des chutes de FPS, c'est donc une option client uniquement. - Die Einstellung für das Abfall-Detaillevel stellt die Menge der lokal erzeugten medizinischen Abfälle ein. Zuviel erzeugte Abfälle können FPS-Lags erzeugen, deswegen ist diese Einstellung nur clientseitig. + Die Einstellung für das Abfall-Detaillevel stellt die Menge der lokal erzeugten medizinischen Abfälle ein. Zuviel erzeugte Abfälle können FPS-Einbrüche erzeugen, deswegen ist diese Einstellung nur clientseitig. A hulladékszimuláció részletessége megszabja a kliens által megjelenített hulladékobjektumok mennyiségét. Súlyos mennyiségek izolált területeken alacsony FPS-t okozhatnak, így ez egy kliensoldali beállítás. O nível de detalhe de sujeira determina o número de itens que irão aparecer no cliente. Quantidades excessivas em áreas locais podem aumentar o lag do FPS, então esta é uma opção somente para o cliente. Počet zobrazených předmětů po použití zdravotnického materiálu ovlivňuje počet objektů, které budou zobrazeny klientovi v místě použití zdravotnického materiálu. Vyšší množství objektů může způsobovat poklesy FPS a proto je toto nastavení čistě na klientovi. @@ -111,7 +111,7 @@ Transfuse Saline - Salzlösungtransfusion + Salzlösungstransfusion Transfundir salino Transfúze fyziologický roztoku Przetocz sól fizjologiczną @@ -171,7 +171,7 @@ Bandage Left Arm - Arm links verbinden + Linken Arm verbinden Vendar el brazo izquierdo Bandażuj lewe ramię Obvázat levou ruku @@ -183,7 +183,7 @@ Bandage Right Arm - Arm rechts verbinden + Rechten Arm verbinden Vendar el brazo derecho Bandażuj prawe ramię Obvázat pravou ruku @@ -195,7 +195,7 @@ Bandage Left Leg - Bein links verbinden + Linkes Bein verbinden Vendar la pierna izquierda Bandażuj lewą nogę Obvázat levou nohu @@ -207,7 +207,7 @@ Bandage Right Leg - Bein rechts verbinden + Rechtes Bein verbinden Vendar la pierna derecha Bandażuj prawą nogę Obvázat pravou nohu @@ -267,7 +267,7 @@ Transfusing Saline ... - Sallösungtransfusion ... + Salzlösungtransfusion ... Transfusión de salino ... Probíha transfúze fyziologický roztoku ... Przetaczanie soli fizjologicznej ... @@ -787,7 +787,7 @@ Utilizado para cubrir una herida Utilisé pour couvrir une blessure Używany w celu przykrycia i ochrony miejsca zranienia - Verwendet, um Wunden abzudecken + Verwendet um Wunden abzudecken Sebesülések befedésére alkalmas Usato per coprire una ferita Usado para cobrir um ferimento @@ -915,7 +915,7 @@ Morphine autoinjector - Morphium Autoinjektor + Morphium-Autoinjektor Морфин в пневмошприце Morfina auto-inyectable Auto-injecteur de Morphine @@ -955,7 +955,7 @@ Atropina auto-inyectable Auto-injecteur d'Atropine Autostrzykawka AtroPen - Atropin Autoinjektor + Atropin-Autoinjektor Autoinjektor atropin Atropin autoinjektor Autoiniettore di atropina @@ -967,7 +967,7 @@ Usado en escenarios NBQ Utilisé en cas d'attaque CBRN Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. - Verwendet bei ABC Kontamination + Verwendet bei ABC-Kontamination NBK helyzetek esetén használandó Usato in situazioni con gas nervino. Usado em casos de ataque QBRN @@ -979,7 +979,7 @@ Medicamento usado por militares en escenarios NBQ Médicament utilisé par l'armée en cas d'attaque CBRN Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w przypadku zagrożeń NBC. - Ein Medikament, das vom Militär bei ABC Kontamination verwendet wird. + Ein Medikament, das vom Militär bei ABC-Kontamination verwendet wird. Egy instabil alkaloid, NBK helyzetek esetén a katonai szervezetek veszik használatba. E' un farmaco usato in ambito militare in scenari con presenza di gas nervino. Uma droga usada por militares em casos de ataque QBRN. @@ -991,7 +991,7 @@ Epinefrina auto-inyectable Auto-injecteur d'épinéphrine Autostrzykawka EpiPen - Epiniphrin Autoinjektor + Epiniphrin-Autoinjektor Autoinjektor adrenalin Epinefrin autoinjektor Autoiniettore di epinefrina @@ -1016,7 +1016,7 @@ Medicament qui fonctionne sur le système nerveux sympathique créant une dilatation des bronches, augmente la fréquence cardiaque et annule les effets d'une réaction allergique (anaphylaxie). Utilisé lors d'arrêt cardio-respiratoire pour augmenter les chances de retrouver un pouls. EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności. Una sostanza che permette di dilatare i bronchi, aumentare il battito cardiaco e combattere effetti di reazioni allergiche. Usato anche in casi di arresto cardiaco. - Ein Medikament, dass die Bronchien erweitert, die Herzfrequenz erhöht und Symptome von allergischen Reaktionen(Anaphylaxie) bekämpft. Wird bei plötzlichem Herzstillstand verabreicht. + Ein Medikament, das die Bronchien erweitert, die Herzfrequenz erhöht und Symptome von allergischen Reaktionen(Anaphylaxie) bekämpft. Wird bei plötzlichem Herzstillstand verabreicht. Uma droga trabalha dilatando os bronquios, aumentando a frequência cardíaca e combate efeitos de reações alérgicas(anáfilaticas). Usado em casos de parada cardiaca com poucas changes de recuperação. Egy hormon, mely a szimpatikus idegrendszer által kitágítja a hörgőket, valamint megnöveli a szívverést, ezzel ellensúlyozva ilyen jellegű allergiás reakciókat (anafilaxiás sokk). Hirtelen szívmegállás esetén is használt, idő alatt csökkenő hatásfokkal. Zúžení periferních cév díky působení na alfa receptory a následné kontrakci hladkých svalů, tím dochází k tzv. centralizaci oběhu, krev se soustřeďuje v životně důležitých centrálních orgánech (srdce, mozek, plíce), působí také pozitivně na srdeční činnost a dochází ke zvýšení krevního tlaku a tepu. Dále se používá při náhlé srdeční zástavě. @@ -1585,6 +1585,15 @@ %1 zkontroloval srdeční tep: %2 %1 verificou a frequência cardíaca: %2 + + None + Нет + Żadna + Nada + Keine + Žádný + Nada + Weak Schwach @@ -2197,6 +2206,22 @@ Pravá noha Perna Direita + + Bandaging removes bloodstains + Bandagieren entfernt Blutflecken + Bandażowanie usuwa ślady krwi + Obvázání odstraňuje skvrny od krve + El vendaje elimina las manchas de sangre + Bandagem remove manchas de sangue + + + Pain is only temporarily suppressed + Schmerzen werden nur vorübergehend unterdrückt + Ból jest tymczasowo zwalczany + Bolest je potlačena pouze dočasně + El dolor se suprime solo temporalmente + Dor é suprimida somente temporáriamente + Pain Effect Type Schmerzeffekt-Typ @@ -2703,367 +2728,862 @@ ACE Medical + ACE: медицина ACE Opcje medyczne + Médico ACE + ACE-Medicsystem + ACE Zdravotnické + ACE Médico - + Medical Settings [ACE] + Настройки медицины [ACE] Ustawienia medyczne [ACE] + Ajustes médicos [ACE] + Medizinische Einstellungen [ACE] + Lékařské nastavení [ACE] + Ajustes médicos [ACE] - + Medical Level + Сложность медицины Poziom medyczny + Nivel médico + Medizinisches Level + Úroveň medického + Nível médico - + What is the medical simulation level? + Каков уровень сложности медицинской системы? Jaki jest poziom symulacji medycznej? + ¿Cuál es el nivel de simulación médica? + Wie hoch soll das medizinische Simulationslevel sein? + Jaká je úroveň lékařské simulace? + Qual o nível de simulação médica? - + Basic + Базовый Podstawowy + Básico + Standard + Základní + Básica - + Advanced + Усложненный Zaawansowany + Avanzado + Erweitert + Pokročilé + Avançada - + Medics setting + Настройки медиков Poziom medyków + Configuración médica + Medizinische Einstellungen + Úroveň zdravotníků + Configuração médica - + What is the level of detail prefered for medics? + Каков уровень подробностей для медиков? Jaki jest poziom detali medycznych wyświetlanych dla medyków? + ¿Cuál es el nivel de detalle preferido para los médicos? + Jaká úroveň detailů je preferována pro zdravotníky? + Qual o nível de detalhe preferido para os médicos? - + Disable medics + Отключить медиков Wyłącz medyków + Desactivar médicos + Sanitäter deaktivieren + Zakázat zdravotníky + Desativar médicos - + Enable Litter + Включить мусор Aktywuj odpadki + Activar restos médicos + Abfälle aktivieren + Povolit odpadky + Ativar lixo médico - + Enable litter being created upon treatment + Включить появление мусора после лечения Twórz odpadki medyczne podczas leczenia + Activar los restos médicos que se crean en el tratamiento + Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde + Vytváří odpad zdravotnického materiálu pří léčení + Ativar lixo ser criado após tratamento - + Life time of litter objects + Время удаления мусора Długość życia odpadków + Tiempo de vida de los restos médicos + Dauer des angezeigten Abfalls + Životnost pro odpadky + Tempo de vida dos objetos do lixo - + How long should litter objects stay? In seconds. -1 is forever. + Как долго мусор будет оставаться на земле? В секундах. -1 означает бесконечное время. Ile czasu musi upłynąć, aby odpadki zaczęły znikać? W sekundach. -1 dla nieskończoności. + ¿Por cuánto tiempo deben permanecer los restos médicos? En segundos. -1 es para siempre. + Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer. + Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy. + Quanto tempo os objetos do lixo devem ficar? Em segundos. -1 é para sempre. - + Enable Screams + Включить крики Aktywuj wrzaski + Activar gritos + Schreie aktivieren + Povolit křik + Ativar gritos - + Enable screaming by injuried units + Включить крики раненных бойцов Aktywuj wrzeszczenie z bólu przez ranne jednostki + Activar gritos para unidades heridas + Aktiviere Schreie bei verletzten Einheiten + Povolit křičení zraněných jednotek + Ativa gritos para unidades feridas - + Player Damage + Урон игроку Próg obrażeń graczy + Daño de jugador + Spielerschaden + Poškození hráče + Dano do jogador - + What is the damage a player can take before being killed? + Какой уровень урона необходим, чтобы убить игрока? Jaki jest próg obrażeń, jakie gracz może otrzymać zanim zostanie zabity? + ¿Cuál es el daño que un jugador puede sufrir antes de morir? + Wie viel Schaden kann ein Spieler erleiden, bevor er getötet wird? + Jaké poškození může hráč dostat než bude zabit? + Qal é o dano que um jogador pode sofrer antes de morrer? - + AI Damage + Урон ботам Próg obrażeń AI + Daño IA + KI-Schaden + Poškození AI + Dano da IA - + What is the damage an AI can take before being killed? + Какой уровень урона необходим, чтобы убить бота? Jaki jest próg obrażeń, jakie AI może otrzymać zanim zostanie zabite? + ¿Cuál es el daño que la IA puede sufrir antes de morir? + Wie viel Schaden kann eine KI erleiden, bis sie getötet wird? + Jaké poškození může AI dostat než bude zabito? + Qual é o dano que uma IA pode sofrer antes de morrer? - + AI Unconsciousness + Потеря сознания ботами Nieprzytomność AI + Inconsciencia IA + KI-Bewusstlosigkeit + Bezvědomí AI + Inconsciência da IA - + Allow AI to go unconscious + Позволить ботам терять сознание Czy AI może być nieprzytomne od odniesionych obrażeń? + Permita a la IA caer inconsciente + KI kann bewusstlos werden + Umožňuje AI upadnout do bezvědomí + Permite IA ficar inconsciente + + + Remote Controlled AI + IA controlada remotamente + IA controlada remotamente + + + Treat remote controlled units as AI not players? + ¿Tratar unidades remotamente controladas como IA? + Tratar unidades remotamente controladas como IA? Disabled + Отключено Wyłączone + Desactivado + Deaktiviert + Zakázáno + Desativado Enabled + Включено Włączone + Activado + Aktiviert + Povoleno + Ativado - + Prevent instant death + Отключить мгновенную смерть Wył. natychmiast. śmierć + Prevenir muerte instantánea + Verhindere direkten Tod + Zabránit okamžité smrti + Previnir morte instantânea - + Have a unit move to unconscious instead of death + Бойцы теряют сознание вместо того, чтобы умирать Spraw, aby jednostka została przeniesiona do stanu nieprzytomności zamiast ginąć na miejscu od śmiertelnych obrażeń + Mover una unidad a inconsciente en vez de a muerta + Lässt eine Einheit bewusstlos werden anstatt zu sterben + Jednotka upadne do bezvědomí namísto smrti + Fazer a unidade ficar inconsciente invés de morrer - + Bleeding coefficient + Коэффициент потери крови Mnożnik krwawienia + Coeficiente de sangrado + Verblutungsmultiplikator + Koeficient krvácení + Coeficiente de sangramento - + Coefficient to modify the bleeding speed + Коэффициент, изменяющий скорость кровопотери Mnożnik modyfikujący prędkość wykrwawiania się + Coeficiente para modificar la velocidad de sangrado + Multiplikator um die Verblutungsgeschwindigkeit zu verändern + Koeficient rychlosti krvácení + Coeficiente para modificar a velocidade do sangramento - + Pain coefficient + Коэффициент боли Mnożnik bólu + Coeficiente de dolor + Schmerzmultiplikator + Koeficient bolesti + Coeficiente de dor - + Coefficient to modify the pain intensity + Коэффициент, изменяющий уровень боли Mnożnik modyfikujący intensywność bólu + Coeficiente para modificar la intensidad del dolor + Multiplikator um den Schmerzintensität zu verändern + Koeficient intenzity bolesti + Coeficiente para modificar a instensidade de dor - + Sync status + Синхронизация статуса Synchronizuj status + Sincronizador estado + Status synchronisieren + Synchronizovat status + Sincronizar estado - + Keep unit status synced. Recommended on. + Синхронизировать статус юнитов. Рекомендуется включить. Utrzymuj synchronizację statusu jednostek. Zalecane zostawienie tej opcji włączonej. + Mantener el estado de la unidad sincronizado. Recomendado activado + Status der Einheit synchron halten. Sollte aktiviert bleiben. + Udržuje status jednotky synchronizovaný. Doporučeno zapnout. + Mater o estado da unidade sincronizado. Recomendado ativado. - + Provides a medical system for both players and AI. + Включает медицинскую систему как для игроков, так и для ботов. Moduł ten dostarcza system medyczny dla graczy oraz AI. + Proporciona un sistema médico para jugadores e IA. + Aktiviert ein medizinisches System für Spieler und KI. + Poskytuje zdravotní systém pro hráče a AI. + Proporciona o sistema médico para os jogadores e a IA. - + Advanced Medical Settings [ACE] + Настройки усложненной медицины [ACE] Zaawansowane ustawienia medyczne [ACE] + Ajustes médicos avanzados [ACE] + Erweiterte medizinische Einstellungen [ACE] + Pokročilé zdravotnické nastavení [ACE] + Ajustes médicos avançados [ACE] - + Enabled for + Включено для Aktywne dla + Hablitado para + Aktiviert für + Povoleno pro + Habilitado para - + Select what units the advanced medical system will be enabled for + Выберите, на кого будет распространяться усложненная система медицины Wybierz dla kogo zaawansowany system medyczny będzie aktywny + Seleccione para qué unidades será habilitado el sistema médico avanzado + Wähle aus welche Einheiten das erweiterte medizinische System haben + Vyberte, pro jaké jednotky bude pokročilý zdravotní systém povolen + Selecione quais unidades o sistema médico avançado será habilitado Players only + Игроков Tylko dla graczy + Solo jugadores + Nur Spieler + Pouze hráči + Somente jogadores Players and AI + Игроков и ботов Gracze oraz AI + Jugadors e IA + Spieler und KI + Hráči a AI + Jogadores e IA - + Enable Advanced wounds + Включить усложненные ранения Akt. zaawansowane rany + Activa heridas avanzadas + Aktiviere erweiterte Wunden + Povolit pokročilé zranění + Ativar ferimentos avançados - + Allow reopening of bandaged wounds? + Будут ли открываться уже перевязанные раны? Pozwól na otwieranie się zabandażowanych ran? + Permitir la reapertura de las heridas vendadas? + Erlaube das Öffnen von bandagierten Wunden? + Umožnit znovuotevření zavázané rány? + Permitr reabertura de ferimentos enfaixados? - + Vehicle Crashes + Аварии транспорта Obrażenia od kolizji + Accidentes de vehículos + Fahrzeugunfälle + Poškození z kolize + Batidas de veículos - + Do units take damage from a vehicle crash? + Должны ли юниты получать повреждения от аварий на транспорте? Czy jednostki otrzymują obrażenia w wyniku kolizji pojazdów? + ¿Las unidades reciben daño de un accidente de tráfico? + Bekommen Einheiten von Fahrzeugunfällen Schaden? + Dostane jednotka poškození při autonehodě? + As unidades recebem dano de uma batida de veículo? - + Allow PAK + Использование аптечки Ust. apteczek osobistych + Permitir EPA + Erlaube Erstehilfekasten + Povolit osobní lékárničky + Permitir Kit de Primeiros Socorros - + Who can use the PAK for full heal? + Кому разрешено выполнять полное лечение с помощью аптечки? Kto może skorzystać z apteczki osobistej w celu pełnego uleczenia? + ¿Quién puede utilizar el EPA para una cura completa? + Wer kann den Erstehilfekasten für eine Endheilung verwenden? + Kdo může použít osobní lékárničku pro plné vyléčení? + Quem pode usar o KPS para cura completa? - + Anyone + Кем угодно Wszyscy + Nadie + Jeder + Kdokoliv + Qualquer um - + Medics only + Только медиками Tylko medycy + Solo médicos + Nur Sanitäter + Pouze zdravotník + Somente médicos - + Doctors only + Только врачами Tylko doktorzy + Solo doctores + Nur Ärzte + Pouze doktor + Somente doutores - + Remove PAK on use + Удалять аптечки после использования Usuń apteczkę po użyciu + Eliminar EPA después del uso + Entferne Erstehilfekasten bei Verwendung + Odebrat osobní lékárničku po použití + Remover o KPS depois do uso - + Should PAK be removed on usage? + Нужно ли удалять аптечки после использования? Czy apteczka osobista powinna zniknąć z ekwipunku po jej użyciu? + El EPA será eliminado después de usarlo + Sollen Erstehilfekästen bei Verwendung entfernt werden? + Má se osobní lékárnička odstranit po použití? + Deve o KPS ser removido depois do uso? - + Locations PAK + Место использования аптечки Ogr. apteczek osobistych + Ubicacions del EPA + Orte für Erstehilfekasten + Lokace osobní lékárničky + Localizações do KPS - + Where can the personal aid kit be used? + Где может использоваться аптечка? Gdzie można korzystać z apteczek osobistych? + ¿Dónde se puede utilizar el equipo de primeros auxilios? + Wo kann der Erstehilfekasten verwendet werden? + Kde může být osobní lékárnička použita? + Onde o kit de primeiros socorros pode ser utilizado? - + Anywhere + Где угодно Wszędzie + Donde sea + Überall + Kdekoliv + Qualquer lugar - + Medical vehicles + В медицинском транспорте Pojazdy medyczne + Vehiculos médicos + Medizinische Fahrzeuge + Zdravotnická vozidla + Veículos médcos - + Medical facility + В госпитале Budynki medyczne + Centro médico + Medizinische Einrichtungen + Zdravotnické zařízení + Instalação médica - + Vehicles & facility + В транспорте и госпитале Pojazdy i budynki medyczne + Vehículos y centros + Fahrzeuge & Einrichtungen + Vozidla a zařízení + Veículos e instalações - + Disabled + Отключено Wyłączone + Desactivado + Deaktiviert + Zakázáno + Desativado - + Allow Surgical kit (Adv) + Разрешить хирургический набор (усл.) Ust. zestawu chirurg. + Permitir equipo quirúrgico (Avanzado) + Erlaube Operationskasten + Povolit chirurgickou soupravu (Pokr.) + Permite kit cirúrgico (avançado) - + Who can use the surgical kit? + Кто может использовать хирургический набор? Kto może skorzystać z zestawu chirurgicznego w celu zszycia ran? + ¿Quién puede utilizar el equipo quirúrgico? + Wer kann den Operationskasten verwenden? + Kdo může použít chirurgickou soupravu? + Quem pode usar o kit cirúrgico? - + Remove Surgical kit (Adv) + Удалять хирургический набор (усл.) Usuń zest. chir. po użyciu + Eliminar equipo quirúrgico (Avanzado) + Enrtferne Operationskasten (erweitert) + Odebrat chirurgickou soupravu (Pokr.) + Remover kit cirúrgico (avançado) - + Should Surgical kit be removed on usage? + Нужно ли удалять хирургический набор после использования? Czy zestaw chirurgiczny powinien zniknąć z ekwipunku po jego użyciu? + Eliminar el equipo quirúrgico después del uso + Entferne Operationskästen bei Verwendung? + Odebrat chirurgickou soupravu po použití? + Deve o kit cirúrgico ser removido após o uso? - + Locations Surgical kit (Adv) + Место использования хирургического набора (усл.) Ogr. zestawu chirurg. + Ubicaciones del equipo quirúrgico (Avanzado) + Orte für Operationskästen (erweitert) + Lokace chirurgické soupravy (Pokr.) + Localizações do kit cirúrgico (avançado) - + Where can the Surgical kit be used? + Где может использоваться хирургический набор? Gdzie można korzystać z zestawu chirurgicznego? + Dónde se puede utilizar el equipo quirúrgico + Wo kann der Operationskasten verwendet werden? + Kde může být použita chirurgická souprava? + Onde o kit cirúrgico pode ser utilizado? - + + Bloodstains + Blutflecken + Plamy krwi + Skvrny od krve + Manchas de sangre + Manchas de sangue + + + Bandaging removes bloodstains + Bandagieren entfernt Blutflecken + Bandażowanie usuwa ślady krwi + Obvázání odstraňuje skvrny od krve + El vendaje elimina las manchas de sangre + Bandagem remove manchas de sangue + + + Pain suppression + Schmerzunterdrückung + Zwalczanie bólu + Potlačení bolesti + Supresión del dolor + Supressão de dor + + + Pain is only temporarily suppressed, not removed + Schmerzen werden nur vorübergehend unterdrückt, nicht entfernt + Ból jest tylko tymczasowo zwalczany, nie jest usuwany trwale + Bolest je potlačena, ale jen dočastně + El dolor se suprime solo temporalmente, no se elimina. + Dor é somente temporáriamente suprimida, não removida + + Configure the treatment settings from ACE Medical + Настройка лечения в медицинской системе ACE Skonfiguruj zaawansowane ustawienia leczenia systemu medycznego ACE + Configure las opciones de tratamiento del ACE Médico + Behandlungseinstellungen vom ACE-Medical konfigurieren + Konfigurace nastavení léčby ze zdravotnické systému ACE + Configure as opções de tratamento do ACE Médico - + Revive Settings [ACE] + Настройки реанимации [ACE] Ustawienia wskrzeszania [ACE] + Sistema de resucitado [ACE] + Wiederbelebungseinstellungen [ACE] + Nastavení oživení [ACE] + Sistema de reavivamento [ACE] - + Enable Revive + Включить реанимацию Aktywuj wskrzeszanie + Habilitar resucitado + Erlaube Wiederbelebung + Povolit oživení + Habilitar reavivamento - + Enable a basic revive system + Включить базовую систему реанимации Aktywuj podstawowy system wskrzeszania + Habilitar un sistema básico de resucitado + Aktiviere Standard-Wiederbelebungssystem + Povolit základní systém oživení + Habilitar um sistema básico de reavivamento - + Max Revive time + Макс. время реанимации Maks. czas agonii + Tiempo máximo de resucitado + Maximale Wiederbelebungszeit + Maximální čas pro oživení + Tempo máximo de reavivamento - + Max amount of seconds a unit can spend in revive state + Максимальное время в секундах, в течение которого бойца можно реанимировать Maksymalna długość agonii w sekundach (czas na wskrzeszenie) + Cantidad máxima de segundos que una unidad puede gastar en estado de resucitación + Maximale Zeitspanne in Sekunden die eine Einheit im Wiederbelebungszustand verbringen kann + Maximální doba v agónii v sekundách + Quantidade máxima de segundos que uma unidade pode gastar em um estado de reavivamento - + Max Revive lives + Макс. кол-во жизней Maks. ilość wskrzeszeń + Vidas máximas de resucitado + Maximale Leben bei Wiederbelebung + Maximální počet oživení + Vidas máximas do reavivado - + Max amount of lives a unit. 0 or -1 is disabled. + Максимальное количество жизней у бойца. Чтобы отключить, укажите 0 или -1. Maksymalna ilość wskrzeszeń. Wpisz 0 lub -1 aby wyłączyć. + Cantidad máxima de vidas por unidad. 0 o -1 es desactivado. + Maximale Anzahl von Leben einer Einheit. 0 or -1 bedeutet deaktiviert. + Maximální počet životu pro jednotku. 0 nebo -1 je zakázáno. + Quantidade máxima de vidas por unidade. 0 ou -1 é desativado. - + Provides a medical system for both players and AI. + Включает медицинскую систему как для игроков, так и для ботов. Moduł ten aktywuje podstawowy system wskrzeszania. Jednostka po otrzymaniu śmiertelnych obrażeń przechodzi do stanu agonii, która trwa określoną długość czasu. W tym czasie aby wskrzesić i jednocześnie odratować jednostkę należy opatrzeć jej rany i wykonać RKO. + Proporciona un sistema médico para jugadores e IA. + Aktiviert das Medicsystem für Spieler und KI. + Poskytuje zdravotní systém pro hráče a AI. + Proporciona um sistema médico para jogadores e IA. - + Set Medic Class [ACE] + Сделать медиком [ACE] Ustaw klasę medyka [ACE] + Establecer case médica [ACE] + Setze Sanitäterklassen [ACE] + Určit třídu medika [ACE] + Definir classe médica [ACE] - + List + Список Lista + Lista + Liste + Seznam + Lista - + List of unit names that will be classified as medic, separated by commas. + Список имен юнитов, которые будут считаться медиками (через запятую). Lista nazw jednostek, które są sklasyfikowane jako medycy, oddzielone przecinkami. + Lista de los nombres de las unidades que se clasifican como médico, separados por comas. + Liste von Namen, die als Sanitäter verwendet werden. Wird durch Kommas getrennt. + Seznam osob které budou klasifikovány jako zdravotník, oddělené čárkami. + Lista dos nomes das unidades que se classificam como médicos, separados por vírgulas. - + Is Medic + Является медиком Klasa medyczna + Es médico + Ist Sanitäter + Je zdravotník + É médico - + + + Dieses Modul legt fest welche Einheit ein Sanitäter ist. + Tento modul určuje, která jednotka je zdravotník. + Este módulo determina qual unidade é um paramédico. - + None + Нет Żadna + Nada + Keine + Žádný + Nada - + Regular medic + Обычный медик Zwykły medyk + Médico regular + Normaler Sanitäter + Řadový zdravotník + Médico regular - + Doctor (Only Advanced Medics) + Врач (только усложн.) Doktor (tylko zaawansowani medycy) + Doctor (Solo medicina avanzada) + Arzt (nur erweiterte Sanitäter) + Doktor (Pouze pokročilý zdravotníci) + Doutor (Somente médicos avançados) - + Assigns the ACE medic class to a unit + Задает юниту класс медика Moduł ten przypisuje klasę medyka ACE do jednostek. + Asigna la clase médico ACE a una unidad + Weise die ACE-Sanitäterklasse einer Einheit zu + Přiřadí ACE třídu zdravotníka do jednotky + Atribui a classe médica do ACE a uma unidade - + Set Medical Vehicle [ACE] + Сделать мед. транспортом [ACE] Ustaw pojazd medyczny [ACE] + Establecer vehículos médicos [ACE] + Setze medizinisches Fahrzeug [ACE] + Určit zdravotnické vozidlo [ACE] + Definir veículo médico [ACE] - + List + Список Lista + Lista + Liste + Seznam + Lista - + List of vehicles that will be classified as medical vehicle, separated by commas. + Список транспортных средств, которые будут считаться медицинским транспортом (через запятую). Lista nazw pojazdów, które są sklasyfikowane jako pojazdy medyczne, oddzielone przecinkami. + Lista de los vehículos que se clasifican como vehículo médicos, separados por comas. + Liste ovn Fahrzeugen, die als medizinische Fahrzeuge verwendet werden. Wird durch Kommas getrennt. + Seznam vozidel které budou klasifikovány jako zdravotnická vozidla, oddělené čárkami. + Lista de veículos que serão classificados como veículos médicos, separados por vírgulas. - + Is Medical Vehicle + Является мед. транспортом Jest pojazdem med. + Es vehículo médico + Ist medizinisches Fahrzeug + Je zdravotnické vozidlo + É um veículo médico - + Whatever or not the objects in the list will be a medical vehicle. + Будут ли объекты в списке считаться медицинским транспортом. Czy pojazdy z tej listy są pojazdami medycznymi. + Cualquiera de la lista o fuera de ella será un vehículo médico. + Leg fest ob das Objekt in der Liste ein medizinisches Fahrzeug ist. + Ať už jsou nebo nejsou objekty v seznamu budou zdravotnická vozidla. + Se serão ou não os objetos dessa lista veículos médicos. - + Assigns the ACE medic class to a unit + Задает юниту класс медика Moduł ten pozwala na przypisanie danym pojazdom statusu pojazdów medycznych. Wewnątrz takiego pojazdu można wykonywać zaawansowane zabiegi medyczne. + Asigna la clase médico ACE a una unidad + Weist die ACE-Sanitäterklasse einer Einheit zu + Přiřadí ACE třídu zdravotníka do jednotky + Atribui a classe médica ACE a uma unidade - + Set Medical Facility [ACE] + Сделать госпиталем [ACE] Ustaw budynek medyczny [ACE] + Establece el centro médico [ACE] + Setze medizinische Einrichtung [ACE] + Určit zdravotnické zařízení [ACE] + Definir instalação médica [ACE] - + Is Medical Facility + Является госпиталем Jest budynkiem med. + Es centro médico + Ist eine medizinische Einrichtung + Je zdravotnické zařízení + É uma instalação médica - + Registers an object as a medical facility + Определяет объект в качестве госпиталя Przypisuje danemu obiektowi status budynku medycznego + Registra un objeto como un centro médico + Definiert ein Objekt als medizinische Einrichtung + Registruje objekt jako zdravotnické zařízení + Registra um objeto como instalacão médica - + Defines an object as a medical facility. This allows for more advanced treatments. Can be used on buildings and vehicles. + Определяет объект в качестве госпиталя. Позволяет оказывать более сложную помощь. Может применяться к зданиям и технике. Moduł ten pozwala przypisać status budynku medycznego danemu obiektowi. Budynek taki pozwala na wykonywanie zaawansowanych zabiegów medycznych. Może być użyte na pojazdach i budynkach. + Define un objeto como un centro médico. Esto permite tratamientos más avanzados. Se puede utilizar en edificios y vehículos. + Definiert ein Objekt als medizinische Einrichtung. Das ermöglicht weitere Behandlungen. Kann bei Gebäuden und Fahrzeugen verwendet werden. + Definuje objekt jako zdravotnické zařízení. To umožňuje více pokročilé léčení. Může být použito na budovy nebo na vozidla. + Define um objeto como instalação médica. Isso permite tratamentos mais avançados. Pode ser utilizado em edifícios e veículos. - + [ACE] Medical Supply Crate (Basic) + [ACE] Ящик с медикаментами (базовая медицина) [ACE] Skrzynka z zapasami medycznymi (podstawowa) + [ACE] Caja de suministros médicos (Básica) + [ACE] Medizinische Kiste (standard) + [ACE] Zdravotnické zásoby (základní) + [ACE] Caixa com suprimentos médicos - + [ACE] Medical Supply Crate (Advanced) + [ACE] Ящик с медикаментами (усложн. медицина) [ACE] Skrzynka z zapasami medycznymi (zaawansowana) + [ACE] Caja de suministros médicos (Avanzada) + [ACE] Medizinische Kiste (erweitert) + [ACE] Zdravotnické zásoby (pokročilé) + [ACE] Caixa com suprimentos médicos (Avançados) Yes @@ -3090,4 +3610,4 @@ No - + \ No newline at end of file diff --git a/addons/medical/ui/RscTitles.hpp b/addons/medical/ui/RscTitles.hpp index dece0e0a8d..06d1dda866 100644 --- a/addons/medical/ui/RscTitles.hpp +++ b/addons/medical/ui/RscTitles.hpp @@ -60,7 +60,7 @@ class Rsctitles { font = "PuristaMedium"; colorText[] = {0.95, 0.95, 0.95, 0.75}; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; - text = "$STR_ACE_Medical_Injuries"; + text = CSTRING(Injuries); }; class InjuryList: ACE_gui_listBoxBase { idc = 200; diff --git a/addons/medical/ui/triagecard.hpp b/addons/medical/ui/triagecard.hpp index c4d3145964..f8b0b21a71 100644 --- a/addons/medical/ui/triagecard.hpp +++ b/addons/medical/ui/triagecard.hpp @@ -49,7 +49,7 @@ class GVAR(triageCard) { font = "PuristaMedium"; colorText[] = {0,0,0,1}; colorBackground[] = {0,0,0,0}; - text = "$STR_ACE_Medical_Actions_TriageCard"; + text = CSTRING(Actions_TriageCard); }; class TriageList: ACE_gui_listBoxBase { idc = 200; @@ -103,7 +103,7 @@ class GVAR(triageCard) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Triage_Status_None; + text = CSTRING(Triage_Status_None); style = 0x02; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -121,7 +121,7 @@ class GVAR(triageCard) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Triage_Status_Minor; + text = CSTRING(Triage_Status_Minor); style = 0x02; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -139,7 +139,7 @@ class GVAR(triageCard) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Triage_Status_Delayed; + text = CSTRING(Triage_Status_Delayed); style = 0x02; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -157,7 +157,7 @@ class GVAR(triageCard) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Triage_Status_Immediate; + text = CSTRING(Triage_Status_Immediate); style = 0x02; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -175,7 +175,7 @@ class GVAR(triageCard) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Triage_Status_Deceased; + text = CSTRING(Triage_Status_Deceased); style = 0x02; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; diff --git a/addons/microdagr/CfgVehicles.hpp b/addons/microdagr/CfgVehicles.hpp index dc4ae7d237..49f7a0e65c 100644 --- a/addons/microdagr/CfgVehicles.hpp +++ b/addons/microdagr/CfgVehicles.hpp @@ -3,48 +3,38 @@ class CfgVehicles { class CAManBase: Man { class ACE_SelfActions { class ACE_Equipment { - class GVAR(show) { - //Opens the mini map - displayName = "$STR_ACE_microdagr_show"; - condition = QUOTE(([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) && {GVAR(currentShowMode) != DISPLAY_MODE_DISPLAY}); - statement = QUOTE([DISPLAY_MODE_DISPLAY] call FUNC(openDisplay)); - showDisabled = 0; - priority = 0.2; - icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; - }; class GVAR(configure) { //Opens the dialog - displayName = "$STR_ACE_microdagr_configure"; + displayName = CSTRING(configure); condition = QUOTE(([DISPLAY_MODE_DIALOG] call FUNC(canShow)) && {GVAR(currentShowMode) != DISPLAY_MODE_DIALOG}); statement = QUOTE([DISPLAY_MODE_DIALOG] call FUNC(openDisplay)); - showDisabled = 0; - priority = 0.1; icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; - }; - class GVAR(close) { - displayName = "$STR_ACE_microdagr_closeUnit"; - condition = QUOTE(GVAR(currentShowMode) != DISPLAY_MODE_CLOSED); - statement = QUOTE([DISPLAY_MODE_CLOSED] call FUNC(openDisplay)); - showDisabled = 0; - priority = 0.3; - icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; + class GVAR(show) { + //Opens the mini map + displayName = CSTRING(show); + condition = QUOTE(([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) && {GVAR(currentShowMode) != DISPLAY_MODE_DISPLAY}); + statement = QUOTE([DISPLAY_MODE_DISPLAY] call FUNC(openDisplay)); + icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; + }; + class GVAR(close) { + displayName = CSTRING(closeUnit); + condition = QUOTE(GVAR(currentShowMode) != DISPLAY_MODE_CLOSED); + statement = QUOTE([DISPLAY_MODE_CLOSED] call FUNC(openDisplay)); + icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; + }; }; }; }; }; - class Logic; - class Module_F: Logic { - class ArgumentsBaseUnits {}; - class ModuleDescription {}; - }; - class GVAR(dagrModule): Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class GVAR(dagrModule): ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Dagr_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QFUNC(moduleMapFill); scope = 2; isGlobal = 1; @@ -52,25 +42,38 @@ class CfgVehicles { functionPriority = 0; class Arguments { class MapDataAvailable { - displayName = "$STR_ACE_Dagr_MapDataAvailable_DisplayName"; - description = "$STR_ACE_Dagr_MapDataAvailable_Description"; + displayName = CSTRING(MapDataAvailable_DisplayName); + description = CSTRING(MapDataAvailable_Description); typeName = "NUMBER"; class values { - class None {name = "$STR_ACE_Dagr_None"; value = MAP_DETAIL_SAT; default = 1;}; - class Side {name = "$STR_ACE_Dagr_Side"; value = MAP_DETAIL_TOPOROADS;}; - class Unique {name = "$STR_ACE_Dagr_Unique"; value = MAP_DETAIL_NONE;}; + class None {name = CSTRING(None); value = MAP_DETAIL_SAT; default = 1;}; + class Side {name = CSTRING(Side); value = MAP_DETAIL_TOPOROADS;}; + class Unique {name = CSTRING(Unique); value = MAP_DETAIL_NONE;}; }; }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_Dagr_Module_Description"; + class ModuleDescription { + description = CSTRING(Module_Description); }; }; - + class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { class TransportItems { MACRO_ADDITEM(ACE_microDAGR,10); }; }; -}; \ No newline at end of file + + class Item_Base_F; + class ACE_microDAGR_Item: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(itemName); + author = ECSTRING(common,ACETeam); + vehicleClass = "Items"; + icon = QUOTE(PATHTOF(UI\icon_microDAGR.paa)); + class TransportItems { + MACRO_ADDITEM(ACE_microDAGR,1); + }; + }; +}; diff --git a/addons/microdagr/CfgWeapons.hpp b/addons/microdagr/CfgWeapons.hpp index 73615ea6b6..9776f1c615 100644 --- a/addons/microdagr/CfgWeapons.hpp +++ b/addons/microdagr/CfgWeapons.hpp @@ -3,10 +3,10 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_microDAGR: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; - displayName = "$STR_ACE_microdagr_itemName"; - descriptionShort = "$STR_ACE_microdagr_itemDescription"; + displayName = CSTRING(itemName); + descriptionShort = CSTRING(itemDescription); picture = QUOTE(PATHTOF(images\microDAGR_item.paa)); class ItemInfo: InventoryItem_Base_F { mass = 2; diff --git a/addons/microdagr/XEH_clientInit.sqf b/addons/microdagr/XEH_clientInit.sqf index 587bf85ef5..2d33969b56 100644 --- a/addons/microdagr/XEH_clientInit.sqf +++ b/addons/microdagr/XEH_clientInit.sqf @@ -3,33 +3,21 @@ if (!hasInterface) exitWith {}; -//Add Keybinds: -["ACE3 Equipment", QGVAR(openGPS), (localize "STR_ACE_microdagr_toggleUnit"), -{ - // canInteractWith (can use on map) - if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!("ACE_microDAGR" in (items ace_player))) exitWith {false}; - +//Add deviceKey entry: +private ["_conditonCode", "_toggleCode", "_closeCode"]; +_conditonCode = { + ("ACE_microDAGR" in (items ACE_player)) +}; +_toggleCode = { + if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {}; [] call FUNC(openDisplay); //toggle display mode - true; -}, -{false}, -[0xC7, [false, false, false]], false] call cba_fnc_addKeybind; //Home Key +}; +_closeCode = { + if (GVAR(currentShowMode) == DISPLAY_MODE_CLOSED) exitWith {}; + [DISPLAY_MODE_CLOSED] call FUNC(openDisplay); +}; +[(localize LSTRING(itemName)), QUOTE(PATHTOF(images\microDAGR_item.paa)), _conditonCode, _toggleCode, _closeCode] call EFUNC(common,deviceKeyRegisterNew); -["ACE3 Equipment", QGVAR(closeGPS), (localize "STR_ACE_microdagr_closeUnit"), -{ - // canInteractWith (can use on map) - if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!("ACE_microDAGR" in (items ace_player))) exitWith {false}; - if (GVAR(currentShowMode) == DISPLAY_MODE_CLOSED) exitWith {false}; - - [DISPLAY_MODE_CLOSED] call FUNC(openDisplay); //close unit - true; -}, -{false}, -[0xC7, [false, true, false]], false] call cba_fnc_addKeybind; //CTRL + Home Key //Add Eventhandler: ["RangerfinderData", {_this call FUNC(recieveRangefinderData)}] call EFUNC(common,addEventHandler); diff --git a/addons/microdagr/config.cpp b/addons/microdagr/config.cpp index 69032eafde..7a39df8980 100644 --- a/addons/microdagr/config.cpp +++ b/addons/microdagr/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {}; + units[] = {"ACE_microDAGR_Item"}; weapons[] = {"ACE_microDAGR"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; diff --git a/addons/microdagr/functions/fnc_canShow.sqf b/addons/microdagr/functions/fnc_canShow.sqf index b251a65c10..9e54f927e0 100644 --- a/addons/microdagr/functions/fnc_canShow.sqf +++ b/addons/microdagr/functions/fnc_canShow.sqf @@ -26,11 +26,11 @@ case (DISPLAY_MODE_CLOSED): {_returnValue = true}; //Can always close case (DISPLAY_MODE_HIDDEN): {_returnValue = true}; //Can always hide case (DISPLAY_MODE_DIALOG): { - _returnValue = ("ACE_microDAGR" in (items ACE_player)) && {[ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)}; + _returnValue = ("ACE_microDAGR" in (items ACE_player)) && {[ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)}; }; case (DISPLAY_MODE_DISPLAY): { //Can't have minimap up while zoomed in - _returnValue = (cameraview != "GUNNER") && {"ACE_microDAGR" in (items ACE_player)} && {[ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)}; + _returnValue = (cameraview != "GUNNER") && {"ACE_microDAGR" in (items ACE_player)} && {[ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)}; }; }; diff --git a/addons/microdagr/functions/fnc_showApplicationPage.sqf b/addons/microdagr/functions/fnc_showApplicationPage.sqf index a9e6d10db7..3c042fdff3 100644 --- a/addons/microdagr/functions/fnc_showApplicationPage.sqf +++ b/addons/microdagr/functions/fnc_showApplicationPage.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_display", "_daylight", "_theMap", "_mapSize"]; +private ["_display", "_theMap", "_mapSize"]; disableSerialization; @@ -27,10 +27,6 @@ if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { }; if (isNull _display) exitWith {ERROR("No Display");}; -//Fade "shell" at night -_daylight = 0.05 max (((1 - overcast)/2 + ((1 - cos (daytime * 360/24)) / 4)) * (linearConversion [0, 1, sunOrMoon, (0.25 * moonIntensity), 1])); -(_display displayCtrl IDC_MICRODAGRSHELL) ctrlSetTextColor [_daylight, _daylight, _daylight, 1]; - //TopBar (_display displayCtrl IDC_RANGEFINDERCONNECTEDICON) ctrlShow (GVAR(currentWaypoint) == -2); @@ -88,10 +84,10 @@ if (GVAR(currentApplicationPage) == APP_MODE_MARK) then { if ((count GVAR(newWaypointPosition)) == 0) then { - (_display displayCtrl IDC_MODEMARK_HEADER) ctrlSetText (localize "STR_ACE_microdagr_wpEnterCords"); + (_display displayCtrl IDC_MODEMARK_HEADER) ctrlSetText (localize LSTRING(wpEnterCords)); (_display displayCtrl IDC_MODEMARK_CORDSEDIT) ctrlSetText ""; } else { - (_display displayCtrl IDC_MODEMARK_HEADER) ctrlSetText format [(localize "STR_ACE_microdagr_wpEnterName"), mapGridPosition GVAR(newWaypointPosition)]; + (_display displayCtrl IDC_MODEMARK_HEADER) ctrlSetText format [(localize LSTRING(wpEnterName)), mapGridPosition GVAR(newWaypointPosition)]; (_display displayCtrl IDC_MODEMARK_CORDSEDIT) ctrlSetText format ["[%1]", mapGridPosition GVAR(newWaypointPosition)]; }; ctrlSetFocus (_display displayCtrl IDC_MODEMARK_CORDSEDIT); diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf index 26e5ef8638..7e2a1ad53e 100644 --- a/addons/microdagr/functions/fnc_updateDisplay.sqf +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_display", "_waypoints", "_posString", "_eastingText", "_northingText", "_numASL", "_aboveSeaLevelText", "_compassAngleText", "_targetPosName", "_targetPosLocationASL", "_bearingText", "_rangeText", "_targetName", "_bearing", "_2dDistanceKm", "_SpeedText", "_playerPos2d", "_wpListBox", "_currentIndex", "_wpName", "_wpPos", "_settingListBox", "_yearString", "_monthSring", "_dayString"]; +private ["_display", "_waypoints", "_posString", "_eastingText", "_northingText", "_numASL", "_aboveSeaLevelText", "_compassAngleText", "_targetPosName", "_targetPosLocationASL", "_bearingText", "_rangeText", "_targetName", "_bearing", "_2dDistanceKm", "_SpeedText", "_playerPos2d", "_wpListBox", "_currentIndex", "_wpName", "_wpPos", "_settingListBox", "_yearString", "_monthSring", "_dayString", "_daylight"]; disableSerialization; _display = displayNull; @@ -26,6 +26,10 @@ if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { }; if (isNull _display) exitWith {ERROR("No Display");}; +//Fade "shell" at night +_daylight = [] call EFUNC(common,ambientBrightness); +(_display displayCtrl IDC_MICRODAGRSHELL) ctrlSetTextColor [_daylight, _daylight, _daylight, 1]; + (_display displayCtrl IDC_CLOCKTEXT) ctrlSetText ([daytime, "HH:MM"] call bis_fnc_timeToString); _waypoints = [] call FUNC(deviceGetWaypoints); @@ -181,18 +185,18 @@ case (APP_MODE_SETUP): { _settingListBox = _display displayCtrl IDC_MODESETTINGS; lbClear _settingListBox; - _settingListBox lbAdd (localize "STR_ACE_microdagr_settingUseMils"); + _settingListBox lbAdd (localize LSTRING(settingUseMils)); if (GVAR(settingUseMils)) then { - _settingListBox lbSetTextRight [0, (localize "STR_ACE_microdagr_settingMils")]; + _settingListBox lbSetTextRight [0, (localize LSTRING(settingMils))]; } else { - _settingListBox lbSetTextRight [0, (localize "STR_ACE_microdagr_settingDegrees")]; + _settingListBox lbSetTextRight [0, (localize LSTRING(settingDegrees))]; }; - _settingListBox lbAdd (localize "STR_ACE_microdagr_settingShowWP"); + _settingListBox lbAdd (localize LSTRING(settingShowWP)); if (GVAR(settingShowAllWaypointsOnMap)) then { - _settingListBox lbSetTextRight [1, (localize "STR_ACE_microdagr_settingOn")]; + _settingListBox lbSetTextRight [1, (localize LSTRING(settingOn))]; } else { - _settingListBox lbSetTextRight [1, (localize "STR_ACE_microdagr_settingOff")]; + _settingListBox lbSetTextRight [1, (localize LSTRING(settingOff))]; }; }; }; diff --git a/addons/microdagr/gui_controls.hpp b/addons/microdagr/gui_controls.hpp index 9d73393e08..50e9083ed6 100644 --- a/addons/microdagr/gui_controls.hpp +++ b/addons/microdagr/gui_controls.hpp @@ -172,7 +172,7 @@ class controls { class Controls { class MGRSNew: GVAR(RscText) { idc = -1; - text = "$STR_ACE_microdagr_controlMGRS"; + text = CSTRING(controlMGRS); x = W_PART(0.5); y = H_PART(0); w = W_PART(10); @@ -182,7 +182,7 @@ class controls { class WGD: GVAR(RscText) { idc = -1; style = ST_RIGHT; - text = "$STR_ACE_microdagr_controlWGD"; + text = CSTRING(controlWGD); x = W_PART(14.5); y = H_PART(0); w = W_PART(10); @@ -345,7 +345,7 @@ class controls { }; class TargetRangeText: GVAR(RscText) { idc = -1; - text = "$STR_ACE_microdagr_controlRange"; + text = CSTRING(controlRange); x = W_PART(0.5); y = H_PART(2); w = W_PART(7.5); @@ -408,7 +408,7 @@ class controls { class CompassHeader: GVAR(RscText) { idc = -1; style = ST_CENTER; - text = "$STR_ACE_microdagr_compasDirection"; + text = CSTRING(compasDirection); x = W_PART(0); y = H_PART(0); w = W_PART(25); @@ -513,7 +513,7 @@ class controls { class TextTL: GVAR(RscText) { idc = -1; style = ST_CENTER; - text = "$STR_ACE_microdagr_menuMark"; + text = CSTRING(menuMark); x = W_PART(0); y = H_PART(7.5); w = W_PART(14); @@ -521,17 +521,17 @@ class controls { sizeEx = H_PART(1.2); }; class TextTR: TextTL { - text = "$STR_ACE_microdagr_menuWaypoints"; + text = CSTRING(menuWaypoints); x = W_PART(11); y = H_PART(7.5); }; class TextBL: TextTL { - text = "$STR_ACE_microdagr_menuConnectTo"; + text = CSTRING(menuConnectTo); x = W_PART(0); y = H_PART(16.5); }; class TextBR: TextTL { - text = "$STR_ACE_microdagr_menuSettings"; + text = CSTRING(menuSettings); x = W_PART(11); y = H_PART(16.5); }; @@ -678,7 +678,7 @@ class controls { class ButtonSetWP: RscButton { idc = -1; - text = "$STR_ACE_microdagr_waypointsSet"; + text = CSTRING(waypointsSet); x = W_PART(1); y = H_PART(17); w = W_PART(7); @@ -693,12 +693,12 @@ class controls { onbuttonclick = QUOTE(_this call FUNC(appWaypointsButtonSetWP)); }; class ButtonAdd: ButtonSetWP { - text = "$STR_ACE_microdagr_waypointsAdd"; + text = CSTRING(waypointsAdd); x = W_PART(9); onbuttonclick = QUOTE([APP_MODE_MARK] call FUNC(saveCurrentAndSetNewMode)); }; class ButtonDelete: ButtonSetWP { - text = "$STR_ACE_microdagr_waypointsDelete"; + text = CSTRING(waypointsDelete); x = W_PART(17); onbuttonclick = QUOTE(_this call FUNC(appWaypointsButtonDeleteWP)); }; diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index b1bac6976b..7d3ac64af5 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -1,7 +1,7 @@  - - + + MicroDAGR GPS MicroDAGR GPS GPS MicroDAGR @@ -13,7 +13,7 @@ GPS MicroDAGR GPS MicroDAGR - + MicroDAGR advanced GPS receiver MicroDAGR - Fortgeschrittener GPS-Empfänger Receptor avanzado GPS MicroDAGR @@ -25,7 +25,7 @@ Ricevitore GPS avanzato MicroDAGR Recepitor GPS avançado MicroDAGR - + Angular Unit: Unidad angular: Угловые единицы: @@ -37,7 +37,7 @@ Unità angolare: Unidade Angular: - + Mils Mil Mils @@ -49,7 +49,7 @@ Mils Mils: - + Show Waypoints On Map: Zeige Wegpunkte auf Karte Mostrar puntos de ruta en el mapa: @@ -61,7 +61,7 @@ Mostra waypoint sulla mappa: Mostrar Waypoints no mapa: - + Degrees Grad Grados @@ -73,7 +73,7 @@ Gradi Graus - + On Zapnuto Allumé @@ -85,7 +85,7 @@ Encendido Be - + Off Vypnuto Eteint @@ -97,7 +97,7 @@ Apagado Ki - + Enter Grid Cords: Introducir coordenadas de cuadrícula: Введите сеточные координаты: @@ -109,7 +109,7 @@ Introduci griglia coordinate: Digite as Ccords. do Grid - + Name of [%1] Name von [%1] Nombre de [%1] @@ -121,7 +121,7 @@ Nome di [%1] Nome do [%1] - + MGRS-New UTMREF-NEU Nuevo-MGRS @@ -133,7 +133,7 @@ Nuovo MGRS MGRS-Novo - + WGD WGD WGD @@ -145,7 +145,7 @@ WGD WGD - + Range: Distancia: Distanz: @@ -157,7 +157,7 @@ Distanza: Distância: - + Compass Direction Kompass Richtung Dirección de la brújula @@ -169,7 +169,7 @@ Azimut Direção na bússula - + Mark Markieren Marca @@ -181,7 +181,7 @@ Marca Marca - + Waypoints Puntos de ruta Wegpunkte @@ -193,7 +193,7 @@ waypoints Waypoints - + Connect To Conectar a Подключиться к @@ -205,7 +205,7 @@ Collega a Conectar à - + Settings Paramètres Einstellungen @@ -217,7 +217,7 @@ Impostaizoni Opções - + SetWP WP setzen Fijar PR @@ -229,7 +229,7 @@ Definisci WayPoints Definir WP - + Add Hinzufügen Añadir @@ -241,7 +241,7 @@ Aggiungi Adicionar - + Delete Smazat Supprimer @@ -253,7 +253,7 @@ Borrar Törlés - + Toggle MicroDAGR Display Mode MicoDAGR Anzeigemodus wechseln Cambiar modo de pantalla del MicroDAGR @@ -265,69 +265,95 @@ Alterna modalità display MicroDAGR Alternar Modo de Display do MicroDAGR - + Show MicoDAGR Zeige MicroDAGR Mostrar MicroDAGR Показать MicroDAGR - Ukázat MicroDAGR GPS + Ukázat MicroDAGR Pokaż MicroDAGR Afficher MicroDAGR MicroDAGR mutatása Mostra MicroDAGR Mostrar MicroDAGR - + Configure MicroDAGR Konfiguriere MicroDAGR Configurar MicroDAGR Настроить MicroDAGR - Konfigurovat MicroDAGR GPS + Konfigurovat MicroDAGR Konfiguruj MicroDAGR Configurer MicroDAGR MicroDAGR konfigurálása ConfiguraMicroDAGR Configurar MicroDAGR - + Close MicroDAGR Schließe MicroDAGR Cerrar MicroDAGR Закрыть MicroDAGR - Zavřít MicroDAGR GPS + Zavřít MicroDAGR Zamknij MicroDAGR Fermer MicroDAGR MicroDAGR elrejtése Chiudi MicroDAGR Fechar MicroDAGR - + MicroDAGR Map Fill Wypełnienie mapy MicroDAGR + Relleno del mapa MicroDAGR + MicroDAGR - Vyplnění mapy + Preenchimento de mapa do MicroDAGR - + MicroDAGR Map Fill Wypełnienie mapy MicroDAGR + Relleno del mapa MicroDAGR + MicroDAGR - Vyplnění mapy + Preenchimento de mapa do MicroDAGR - + How much map data is filled on MicroDAGR's Jak duża część informacji mapy jest załadowana do MicroDAGR? + Cuanta información está disponible en el mapa del MicroDAG + Wie viel Daten auf einem MicroDAGR zu sehen sind + Kolik informací je načteno do MicroDAGR? + Quanta informação é preenchida no mapa do MicroDAGR - + Full Satellite + Buildings Pełna satelitarna + budynki + Satelite completo + Edificios + Satellitenbild + Gebäude + Satelit + Budovy + Satélite completo + Edifícios - + Topographical + Roads Topograficzna + drogi + Topografico + Carreteras + Topografisch + Straßen + Topografické + Cesty + Topográfico + Estradas - + None (Cannot use map view) Żadna (wyłącza ekran mapy) + Nada (No se puede el mapa) + Keine (kann keine Kartenansicht verwenden) + Žádný (Nelze použít zobrazení mapy) + Nada (Não pode usar a tela de mapa) - + Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap.<br />Source: microDAGR.pbo Moduł ten pozwala kontrolować jak duża ilość informacji jest załadowana do przedmiotów MicroDAGR. Mniejsza ilość danych ogranicza widok mapy pokazując mniej rzeczy na minimapie.<br />Źródło: microDAGR.pbo + Controla la cantidad de información disponible en el microDAGR. Menos datos limitan la vista del mapa a mostrar menos en el minimapa.<br />Fuente: microDAGR.pbo + Steuert wie viel Daten auf dem microDAGR zu sehen ist. Weniger Daten schränken die Kartenansicht ein, um mehr auf der Minimap zu sehen.<br />Quelle: microDAGR.pbo + Tento modul umožňuje kontrolovat, kolik informací je obsaženo v MicroDAGR. Menší množství dat omezené zobrazením mapy ukazují méně věcí na minimapě.<br />Zdroj: microDAGR.pbo + Controla quantos dados são preenchidos nos itens microDAGR. Menos dados restringe a visualização de mapa para mostrar menos informações no minimapa<br/>Fonte: MicroDAGR.pbo - + \ No newline at end of file diff --git a/addons/missileguidance/ACE_Settings.hpp b/addons/missileguidance/ACE_Settings.hpp index c04e6c080c..2ec3326a98 100644 --- a/addons/missileguidance/ACE_Settings.hpp +++ b/addons/missileguidance/ACE_Settings.hpp @@ -3,8 +3,8 @@ class ACE_Settings { value = 2; typeName = "SCALAR"; isClientSettable = 1; - displayName = "$STR_ACE_MissileGuidance"; - description = "$STR_ACE_MissileGuidance_Desc"; - values[] = {"$STR_ACE_MissileGuidance_Off", "$STR_ACE_MissileGuidance_PlayerOnly", "$STR_ACE_MissileGuidance_PlayerAndAi"}; + displayName = CSTRING(Title); + description = CSTRING(Desc); + values[] = {CSTRING(Off), CSTRING(PlayerOnly), CSTRING(PlayerAndAi)}; }; }; \ No newline at end of file diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index 680a410506..779d2a82eb 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -69,19 +69,19 @@ class CfgAmmo { }; class ACE_Hydra70_DAGR : M_PG_AT { - displayName = "$STR_ACE_Hydra70_DAGR"; - displayNameShort = "$STR_ACE_Hydra70_DAGR_Short"; + displayName = CSTRING(Hydra70_DAGR); + displayNameShort = CSTRING(Hydra70_DAGR_Short); - description = "$STR_ACE_Hydra70_DAGR"; - descriptionShort = "$STR_ACE_Hydra70_DAGR_Desc"; + description = CSTRING(Hydra70_DAGR_Desc); + descriptionShort = CSTRING(Hydra70_DAGR_Desc); }; class ACE_Hellfire_AGM114K : ACE_Hydra70_DAGR { - displayName = "$STR_ACE_Hellfire_AGM114K"; - displayNameShort = "$STR_ACE_Hellfire_AGM114K_Short"; + displayName = CSTRING(Hellfire_AGM114K); + displayNameShort = CSTRING(Hellfire_AGM114K_Short); - description = "$STR_ACE_Hellfire_AGM114K_desc"; - descriptionShort = "$STR_ACE_Hellfire_AGM114K_desc"; + description = CSTRING(Hellfire_AGM114K_desc); + descriptionShort = CSTRING(Hellfire_AGM114K_desc); // @TODO: placeholder model to at least make it look different model = "\A3\Weapons_F\Ammo\Missile_AT_03_fly_F"; @@ -94,47 +94,59 @@ class CfgAmmo { }; // Titan - class M_Titan_AT : MissileBase { + class M_Titan_AT : MissileBase {}; + + class ACE_Javelin_FGM148: M_Titan_AT { irLock = 0; laserLock = 0; airLock = 0; // Turn off arma crosshair-guidance manualControl = 0; - + hit = 1400; // default: 800 indirectHit = 20; indirectHitRange = 2; // ACE uses these values //trackOversteer = 1; //trackLead = 0; - + + initTime = 2; + // Begin ACE guidance Configs class ADDON { enabled = 1; - + minDeflection = 0.00005; // Minium flap deflection for guidance maxDeflection = 0.025; // Maximum flap deflection for guidance incDeflection = 0.00005; // The incrmeent in which deflection adjusts. - + canVanillaLock = 0; - + // Guidance type for munitions defaultSeekerType = "Optic"; - seekerTypes[] = { "Optic" }; - + seekerTypes[] = { "Optic" }; + defaultSeekerLockMode = "LOBL"; seekerLockModes[] = { "LOBL" }; - + seekerAngle = 180; // Angle in front of the missile which can be searched seekerAccuracy = 1; // seeker accuracy multiplier - + seekerMinRange = 0; seekerMaxRange = 2500; // Range from the missile which the seeker can visually search - + // Attack profile type selection defaultAttackProfile = "JAV_TOP"; attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; }; }; -}; \ No newline at end of file + class ACE_Javelin_FGM148_static: ACE_Javelin_FGM148 { + //Take config changes from (M_Titan_AT_static: M_Titan_AT) + initTime = 0.25; //"How long (in seconds) the projectile waits before starting it's engine.", - but doesn't seem to do anything + effectsMissileInit = "RocketBackEffectsStaticRPG"; + class ADDON: ADDON { + enabled = 1; + }; + }; +}; diff --git a/addons/missileguidance/CfgVehicles.hpp b/addons/missileguidance/CfgVehicles.hpp index 0d9ef54d07..5069556078 100644 --- a/addons/missileguidance/CfgVehicles.hpp +++ b/addons/missileguidance/CfgVehicles.hpp @@ -20,6 +20,7 @@ class CfgVehicles { class ACE_Comanche_Test : B_Heli_Attack_01_F { scope = 1; + scopeCurator = 0; displayName = "ACE_Comanche_Test"; author = "ACE Team"; class Library { diff --git a/addons/missileguidance/config.cpp b/addons/missileguidance/config.cpp index 42b849b902..591a4f1c5e 100644 --- a/addons/missileguidance/config.cpp +++ b/addons/missileguidance/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {}; + units[] = {"ACE_Comanche_Test"}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_laser"}; diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index 614323d63f..78f48250dd 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -24,7 +24,7 @@ _seekerParams = _args select 3; _stateParams = _args select 4; _lastRunTime = _stateParams select 0; -_runtimeDelta = diag_tickTime - _lastRunTime; +_runtimeDelta = ACE_diagTime - _lastRunTime; _adjustTime = 1; if(accTime > 0) then { @@ -100,7 +100,7 @@ _PS setDropInterval 3.0; hintSilent format["d: %1", _distanceToTarget]; #endif -_stateParams set[0, diag_tickTime]; +_stateParams set[0, ACE_diagTime]; _args set[4, _stateParams]; _this set[0, _args]; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index a184ba1ef4..f044d8242c 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -88,7 +88,7 @@ _args = [_this, getNumber ( _config >> "seekerAccuracy" ), getNumber ( _config >> "seekerMaxRange" ) ], - [ diag_tickTime, [], [] ] + [ ACE_diagTime, [], [] ] ]; // Hand off to the guiding unit. We just use local player so local PFH fires for now diff --git a/addons/missileguidance/script_component.hpp b/addons/missileguidance/script_component.hpp index 377469cdee..e2ab97a51e 100644 --- a/addons/missileguidance/script_component.hpp +++ b/addons/missileguidance/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT missileguidance -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_MISSILEGUIDANCE #define DEBUG_MODE_FULL @@ -9,6 +9,6 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILEGUIDANCE #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" #define FIREMODE_DIRECT_LOAL 1 \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 798b2aafcd..2845767f15 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -1,7 +1,7 @@  - - + + Advanced Missile Guidance Guiado Avanzado de Misiles Guidage avancé de missile @@ -19,13 +19,13 @@ Guida dei missili avanzata, o AMG, offre diversi miglioramenti alla teleguida di missili. E' anche un sistema necessario per i tipi di armi missile. Продвинутое наведение ракет, или ПНР, обеспечивает множество усовершествований для наведения и стрельбы ракет. Также, это система, необходимая для всех ракетных типов оружия. El guiado avanzado de misiles, o AMG en sus siglas en inglés, ofrece múltiples mejoras en el fijado y disparo de misiles. Es también un sistema requerido para armas de tipo misil. - Das Erweiterte Raketenlenksystem, auch ERls genannt, bietet viele Verbesserungen zum Aufschalten und Feuern mittels gelenkten Raketen. + Das Erweiterte Raketenlenksystem, auch ERls genannt, bietet viele Verbesserungen zum Aufschalten und Feuern mittels gelenkter Raketen. Le guidage avancé de missile, ou AMG en anglais, apporte de multiple améliorations au verouillage et au tir de missiles. C'est aussi un framework requis pour tout arme de type missile. A fejlett rakétairányító (vagy AMG) többféle módosítást tartalmaz a rakéták célkövetéséhez és tüzeléséhez. Ez egy szükséges keresztrendszer a rakéta-alapú fegyverekhez. Orientação avançada de mísseis ou OAM, fornece vários aprimoramentos para travamento de mísseis e disparos. Também é um sistema requerido para disparar armas que utilizem mísseis. Pokočilé navádění raket (AMG) poskytuje několik vylepšení pro lepší zaměření a následnou střelbu. Je to prvek vyžadovaný u typu zbraní jako jsou rakety. - + Hydra-70 DAGR Missile Misil Hydra-70 DAGR Hydra-70 DAGR @@ -37,7 +37,7 @@ Hydra-70 DAGR rakéta Hydra-70 DAGR - + DAGR DAGR DAGR @@ -49,7 +49,7 @@ DAGR DAGR - + Hydra-70 DAGR Laser Guided Missile Misil guiado por láser Hydra-70 DAGR Missile à guidage laser Hydra-70 DAGR @@ -61,7 +61,7 @@ Hydra-70 DAGR lézer-irányított rakéta Управляемая ракета лазерного наведения Hydra-70 DAGR - + Hellfire II AGM-114K Missile Misil Hellfire II AGM-114K Hellfire II AGM-114K @@ -73,7 +73,7 @@ Hellfire II AGM-114K rakéta Hellfire II AGM-114K - + AGM-114K AGM-114K AGM-114K @@ -85,7 +85,7 @@ AGM-114K AGM-114K - + Hellfire II AGM-114K Laser Guided Missile Misil guiado por láser Hellfire II AGM-114K Missile à guidage laser Hellfire II AGM-114K @@ -100,14 +100,26 @@ Off Wyłącz + Desactivado + Aus + Vypnout + Desligado Player Only Tylko gracz + Solo jugador + Nur Spieler + Pouze hráči + Somente jogador Player and AI Gracz oraz AI + Jugador e IA + Spieler und KI + Hráči a AI + Jogador e IA - + \ No newline at end of file diff --git a/addons/missionmodules/CfgFactionClasses.hpp b/addons/missionmodules/CfgFactionClasses.hpp index 6f320805fb..fc4abc3606 100644 --- a/addons/missionmodules/CfgFactionClasses.hpp +++ b/addons/missionmodules/CfgFactionClasses.hpp @@ -1,6 +1,6 @@ class CfgFactionClasses { class NO_CATEGORY; class ACE_missionModules: NO_CATEGORY { - displayName = "$STR_ACE_MissionModules_Category_DisplayName"; + displayName = CSTRING(Category_DisplayName); }; }; \ No newline at end of file diff --git a/addons/missionmodules/CfgVehicles.hpp b/addons/missionmodules/CfgVehicles.hpp index a08e78f17b..ebf0b04f66 100644 --- a/addons/missionmodules/CfgVehicles.hpp +++ b/addons/missionmodules/CfgVehicles.hpp @@ -8,60 +8,60 @@ class CfgVehicles { // TODO make a curator variant for this class ACE_moduleAmbianceSound: Module_F { scope = 2; - displayName = "$STR_ACE_MissionModules_AmbianceSounds_DisplayName"; + displayName = CSTRING(AmbianceSounds_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Ambient_Sounds_ca.paa)); category = "ACE_missionModules"; function = QUOTE(FUNC(moduleAmbianceSound)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class soundFiles { - displayName = "$STR_ACE_MissionModules_AmbianceSounds_soundFiles_DisplayName"; - description = "$STR_ACE_MissionModules_AmbianceSounds_soundFiles_Description"; + displayName = CSTRING(AmbianceSounds_soundFiles_DisplayName); + description = CSTRING(AmbianceSounds_soundFiles_Description); typeName = "STRING"; defaultValue = ""; }; class minimalDistance { - displayName = "$STR_ACE_MissionModules_AmbianceSounds_minimalDistance_DisplayName"; - description = "$STR_ACE_MissionModules_AmbianceSounds_minimalDistance_Description"; + displayName = CSTRING(AmbianceSounds_minimalDistance_DisplayName); + description = CSTRING(AmbianceSounds_minimalDistance_Description); typeName = "NUMBER"; defaultValue = 400; }; class maximalDistance { - displayName = "$STR_ACE_MissionModules_AmbianceSounds_maximalDistance_DisplayName"; - description = "$STR_ACE_MissionModules_AmbianceSounds_maximalDistance_Description"; + displayName = CSTRING(AmbianceSounds_maximalDistance_DisplayName); + description = CSTRING(AmbianceSounds_maximalDistance_Description); typeName = "NUMBER"; defaultValue = 900; }; class minimalDelay { - displayName = "$STR_ACE_MissionModules_AmbianceSounds_minimalDelay_DisplayName"; - description = "$STR_ACE_MissionModules_AmbianceSounds_minimalDelay_Description"; + displayName = CSTRING(AmbianceSounds_minimalDelay_DisplayName); + description = CSTRING(AmbianceSounds_minimalDelay_Description); typeName = "NUMBER"; defaultValue = 10; }; class maximalDelay { - displayName = "$STR_ACE_MissionModules_AmbianceSounds_maximalDelay_DisplayName"; - description = "$STR_ACE_MissionModules_AmbianceSounds_maximalDelay_Description"; + displayName = CSTRING(AmbianceSounds_maximalDelay_DisplayName); + description = CSTRING(AmbianceSounds_maximalDelay_Description); typeName = "NUMBER"; defaultValue = 170; }; class followPlayers { - displayName = "$STR_ACE_MissionModules_AmbianceSounds_followPlayers_DisplayName"; - description = "$STR_ACE_MissionModules_AmbianceSounds_followPlayers_Description"; + displayName = CSTRING(AmbianceSounds_followPlayers_DisplayName); + description = CSTRING(AmbianceSounds_followPlayers_Description); typeName = "BOOL"; defaultValue = 0; }; class soundVolume { - displayName = "$STR_ACE_MissionModules_AmbianceSounds_soundVolume_DisplayName"; - description = "$STR_ACE_MissionModules_AmbianceSounds_soundVolume_Description"; + displayName = CSTRING(AmbianceSounds_soundVolume_DisplayName); + description = CSTRING(AmbianceSounds_soundVolume_Description); typeName = "NUMBER"; defaultValue = 1; }; }; class ModuleDescription { - description = "$STR_ACE_MissionModules_AmbianceSounds_Description"; + description = CSTRING(AmbianceSounds_Description); sync[] = {}; }; }; diff --git a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf index 6e5643754c..9b4c46ec10 100644 --- a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf +++ b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf @@ -72,7 +72,7 @@ if (_activated && local _logic) then { [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - if (time - _lastTimePlayed >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + if (ACE_time - _lastTimePlayed >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { _ambianceSounds = _args select 1; _minimalDistance = _args select 2; _maximalDistance = _args select 3; @@ -113,11 +113,11 @@ if (_activated && local _logic) then { // If no unit is to close to this position, we will play the sound. if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; - _args set [8, time]; + _args set [8, ACE_time]; }; }; }; - }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call cba_fnc_addPerFrameHandler; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, ACE_time] ] call cba_fnc_addPerFrameHandler; }; true; diff --git a/addons/missionmodules/stringtable.xml b/addons/missionmodules/stringtable.xml index 1532827378..b99285850d 100644 --- a/addons/missionmodules/stringtable.xml +++ b/addons/missionmodules/stringtable.xml @@ -1,73 +1,141 @@ - + - + ACE Mission Modules ACE Moduły misji + Módulo de misiones ACE + ACE-Missionsmodule + ACE Moduly mise + Módulo de missões ACE Ambiance Sounds [ACE] Dźwięki [ACE] + [ACE] Sonidos ambiente + Umgebungsgeräusche [ACE] + Zvuky prostředí [ACE] + [ACE] Sons ambientes Sounds Dźwięki + Sonidos + Sounds + Zvuky + Sons Class names of the ambiance sounds to be played. Seperated by ',' Class name-y dźwięków do odtwarzania. Oddzielone przy użyciu ',' + Class names de los sonidos ambiente que se reproducirán. Separados por ',' + Klassennamen der Umgebungsgeräusche, die abgespielt werden sollen. Getrennt durch "," + Class names zvuků prostředí, které budou přehrány. Oddělené ',' + Nomes de classe dos sons de ambiente para serem reproduzidos. Separados por "," Minimal Distance Minimalny dystans + Distancia mínima + Mindestabstand + Minimální vzdálenost + Distância mínima Used for calculating a random position and sets the minimal distance between the players and the played sound file(s) Używany do obliczania losowej pozycji a także ustawia minimalny dystans pomiędzy graczami a odtwarzanymi plikami dźwiękowymi + Usado para calcular una posición aleatoria y establecer la distancia mínima entre los jugadores y los ficheros de sonido reproducidos + Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Mindestabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest + Používá se pro výpočet náhodné pozice a určuje minimální vzdálenost mezi hráči a přehrávaným zvukem. + Usada para calcular uma posição aleatória e definir a distância mínima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. Maximum Distance Maksymalny dystans + Distancia máxima + Maximalabstand + Maximální vzdálenost + Distância máxima Used for calculating a random position and sets the maximum distance between the players and the played sound file(s) Używany do obliczania losowej pozycji a także ustawia maksymalny dystans pomiędzy graczami a odtwarzanymi plikami dźwiękowymi + Usado para calcular una posición aleatoria y establecer la distancia máxima entre los jugadores y los ficheros de sonido reproducidos + Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Maximalabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest + Používá se pro výpočet náhodné pozice a určuje maximální vzdálenost mezi hráči a přehrávaným zvukem. + Usado para calcular uma posição aleatória e definir uma distância máxima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. Minimal Delay Minimalne opóźnienie + Retraso mínimo + Minimale Verzögerung + Minimální prodleva + Atraso mínimo Minimal delay between sounds played Minimalne opóźnienie pomiędzy odtwarzanymi dźwiękami + Retraso mínimo entre los sonidos reproducidos + Minimale Verzögerung zwischen abzuspielenden Sounds + Minimální prodleva mezi přehrávanými zvuky + Atraso mínimo entre os sons reproduzidos Maximum Delay Maksymalne opóźnienie + Retraso máximo + Maximale Verzögerung + Maximální prodleva + Atraso máximo Maximum delay between sounds played Maksymalne opóźnienie pomiędzy odtwarzanymi dźwiękami + Retraso máximo entre los sonidos reproducidos + Maximale Verzögerung zwischen abzuspielenden Sounds + Maximální prodleva mezi přehrávanými zvuky + Atraso máximo entre os sons reproduzidos Follow Players Podążaj za graczami + Seguir jugadores + Spielern folgen + Následovat hráče + Seguir jogadores Follow players. If set to false, loop will play sounds only nearby logic position. Podążaj za graczami. Jeżeli ustawione na 'Nie', pętla będzie odtwarzana tylko w pobliżu pozycji logiki. + Seguir jugadores. Si esta desabilitado (false), se reproducirán sonidos en bucle solo cerca de la posición lógica. + Spielern folgen. Wenn auf falsch gesetzt, werden Sounds nur in der Nähe des Logikmoduls abgespielt. + Následuj hráče. Pokud je FALSE, smyčka zvuku bude přehrávána na nejbližší pozici logiki. + Segue os jogadores. Se esta desabilitado (falso), o loop reproduzirá os sons somente perto de sua posição lógica. Volume Głośność + Volumen + Lautstärke + Hlasitost + Volume The volume of the sounds played Głośność odtwarzanych dźwięków + Volumen de los sonidos reproducidos + Lautstärke der abzuspielenden Sounds + Hlasitost přehrávaného zvuku + O volume em que os sons serão reproduzidos Ambiance sounds loop (synced across MP) Pętla odtwarzania dzwięków (synchronizowana na MP) + Bucle de sonidos ambiente (sincronizados en MP) + Umgebungsgeräusch-Schleife (im MP synchronisiert) + Smyčka okkolního zvuku (synchronizováno v MP) + Loop de sons ambientes (sincronizados através do MP) \ No newline at end of file diff --git a/addons/mk6mortar/$PBOPREFIX$ b/addons/mk6mortar/$PBOPREFIX$ index a21eaf95f0..c5d6fd3fb2 100644 --- a/addons/mk6mortar/$PBOPREFIX$ +++ b/addons/mk6mortar/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\Addons\mk6mortar \ No newline at end of file +z\ace\addons\mk6mortar \ No newline at end of file diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index e4a9d0f2a5..2738a649a9 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -4,12 +4,12 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class GVAR(rangetable) { - displayName = "$STR_ACE_MK6MORTAR_rangetable_action"; + displayName = CSTRING(rangetable_action); condition = QUOTE(_this call FUNC(rangeTableCanUse)); statement = QUOTE(_this call FUNC(rangeTableOpen)); priority = 0; icon = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); - exceptions[] = {"notOnMap", "isNotInside"}; + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; }; }; }; @@ -43,14 +43,11 @@ class CfgVehicles { }; }; - class Logic; - class Module_F: Logic { - class ModuleDescription {}; - }; - class GVAR(module): Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class GVAR(module): ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_mk6mortar_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QFUNC(moduleInit); scope = 2; isGlobal = 0; @@ -58,26 +55,26 @@ class CfgVehicles { functionPriority = 0; class Arguments { class airResistanceEnabled { - displayName = "$STR_ACE_mk6mortar_airResistanceEnabled_DisplayName"; - description = "$STR_ACE_mk6mortar_airResistanceEnabled_Description"; + displayName = CSTRING(airResistanceEnabled_DisplayName); + description = CSTRING(airResistanceEnabled_Description); typeName = "BOOL"; defaultValue = 1; }; class allowComputerRangefinder { - displayName = "$STR_ACE_mk6mortar_allowComputerRangefinder_DisplayName"; - description = "$STR_ACE_mk6mortar_allowComputerRangefinder_Description"; + displayName = CSTRING(allowComputerRangefinder_DisplayName); + description = CSTRING(allowComputerRangefinder_Description); typeName = "BOOL"; defaultValue = 0; }; class allowCompass { - displayName = "$STR_ACE_mk6mortar_allowCompass_DisplayName"; - description = "$STR_ACE_mk6mortar_allowCompass_Description"; + displayName = CSTRING(allowCompass_DisplayName); + description = CSTRING(allowCompass_Description); typeName = "BOOL"; defaultValue = 1; }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_mk6mortar_Module_Description"; + class ModuleDescription { + description = CSTRING(Module_Description); }; }; -}; \ No newline at end of file +}; diff --git a/addons/mk6mortar/CfgWeapons.hpp b/addons/mk6mortar/CfgWeapons.hpp index 7d5153e9ad..97952af2d1 100644 --- a/addons/mk6mortar/CfgWeapons.hpp +++ b/addons/mk6mortar/CfgWeapons.hpp @@ -3,10 +3,10 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_RangeTable_82mm: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; - displayName = "$STR_ACE_MK6MORTAR_rangetable_name"; - descriptionShort = "$STR_ACE_MK6MORTAR_rangetable_description"; + displayName = CSTRING(rangetable_name); + descriptionShort = CSTRING(rangetable_description); picture = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); class ItemInfo: InventoryItem_Base_F { mass = 0.5; diff --git a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf index d1e0a8dd05..9d8b292070 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf @@ -21,7 +21,7 @@ Example: private ["_startTime", "_muzzleVelocity", "_rangeToHit", "_airFriction", "_vacElevation", "_radicand", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts", "_lineElevation", "_lineTimeOfFlight", "_lineHeightElevation", "_lineHeightTimeDelta", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_result"]; -_startTime = diag_tickTime; +_startTime = ACE_diagTime; _muzzleVelocity = _this select 0; _rangeToHit = _this select 1; @@ -74,6 +74,6 @@ _lineAirDensDec = (_rangeToHit - (_lastTestResult select 0)) / 10; _lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1.1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); _lineAirDensInc = (_rangeToHit - (_lastTestResult select 0)) / 10; -// systemChat format ["debug: Range %1 - in %2 sec", _rangeToHit, (diag_tickTime - _startTime)]; +// systemChat format ["debug: Range %1 - in %2 sec", _rangeToHit, (ACE_diagTime - _startTime)]; [_rangeToHit, _lineElevation, _lineHeightElevation, _lineHeightTimeDelta, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf index a45c415b40..cfba7c0e05 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf @@ -51,5 +51,5 @@ while {(_numberOfAttempts < MAX_ATTEMPTS) && {(abs _error) > 0.2}} do { }; if (_numberOfAttempts >= MAX_ATTEMPTS) exitWith {[]}; -//return the elevation and time required +//return the elevation and ACE_time required [_solutionElevation, (_lastTestResult select 1)] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf index 0e53807a6b..65f87256fe 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf @@ -45,7 +45,7 @@ _currentVelocity = [0, (_muzzleVelocity * cos _angleDeg), (_muzzleVelocity * sin _currentTime = 0; _lastPos = _currentPos; -_kCoefficent = -1 * _relDensity * _airFriction; //save time in the loop and compute once +_kCoefficent = -1 * _relDensity * _airFriction; //save ACE_time in the loop and compute once while {((_currentVelocity select 2) > 0) || ((_currentPos select 2) >= _heightOfTarget)} do { _lastPos = _currentPos; @@ -64,7 +64,7 @@ _linConversion = linearConversion [(_lastPos select 2), (_currentPos select 2), _middlePos = (_lastPos vectorMultiply (1 - _linConversion)) vectorAdd (_currentPos vectorMultiply (_linConversion)); // _middlePosOld = (_lastPos vectorAdd _currentPos) vectorMultiply 0.5; -//Same to find travel time +//Same to find travel ACE_time _middleTotalTravelTime = _currentTime - (_timeStep * (1-_linConversion)); //Find shot offset (from crosswind), in degrees diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 284560b775..3f739aee2f 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -21,7 +21,7 @@ */ #include "script_component.hpp" -private ["_shooterMan", "_bisAirFriction", "_temperature", "_newMuzzleVelocityCoefficent", "_bulletVelocity", "_bulletSpeed", "_muzzleVelocity", "_muzzleVelocityShift"]; +private ["_shooterMan", "_bisAirFriction", "_temperature", "_newMuzzleVelocityCoefficent", "_bulletVelocity", "_bulletSpeed"]; disableSerialization; @@ -57,7 +57,6 @@ if (_newMuzzleVelocityCoefficent != 1) then { _bulletSpeed = vectorMagnitude _bulletVelocity; _bulletVelocity = (vectorNormalized _bulletVelocity) vectorMultiply (_bulletSpeed * _newMuzzleVelocityCoefficent); _projectile setVelocity _bulletVelocity; - _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; @@ -70,8 +69,8 @@ if (_newMuzzleVelocityCoefficent != 1) then { [_pfID] call cba_fnc_removePerFrameHandler; }; - _deltaT = time - _time; - _args set[2, time]; + _deltaT = ACE_time - _time; + _args set[2, ACE_time]; _bulletVelocity = velocity _shell; _bulletSpeed = vectorMagnitude _bulletVelocity; @@ -85,4 +84,4 @@ if (_newMuzzleVelocityCoefficent != 1) then { _shell setVelocity _bulletVelocity; -}, 0, [_projectile, MK6_82mm_AIR_FRICTION, time, _relativeDensity]] call CBA_fnc_addPerFrameHandler; +}, 0, [_projectile, MK6_82mm_AIR_FRICTION, ACE_time, _relativeDensity]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 91657fdbe2..e74cb315f7 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -51,7 +51,7 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") _currentFireMode = (weaponState [_mortarVeh, [0]]) select 2; _currentChargeMode = _fireModes find _currentFireMode; - _text = format ["%1: %2 ", (localize "STR_ACE_MK6MORTAR_rangetable_charge"), _currentChargeMode, QUOTE(PATHTOF(UI\ui_charges.paa))]; + _text = format ["%1: %2 ", (localize LSTRING(rangetable_charge)), _currentChargeMode, QUOTE(PATHTOF(UI\ui_charges.paa))]; _chargeText ctrlSetStructuredText parseText _text; if (shownArtilleryComputer && {!GVAR(allowComputerRangefinder)}) then { //Don't like this solution, but it works diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf index dfb53842ab..07e0536d24 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -39,7 +39,7 @@ _muzzleVelocities = []; _showToPlayer = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "showToPlayer"); if (_showToPlayer == 1) then { _artilleryCharge = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "artilleryCharge"); - LIST_CHARGE lbAdd format ["%1: %2", (localize "STR_ACE_MK6MORTAR_rangetable_charge"), (count _muzzleVelocities)]; + LIST_CHARGE lbAdd format ["%1: %2", (localize LSTRING(rangetable_charge)), (count _muzzleVelocities)]; LIST_CHARGE lbSetData [(count _muzzleVelocities), str (_artilleryCharge * _initSpeed)]; _muzzleVelocities pushBack _artilleryCharge; }; diff --git a/addons/mk6mortar/script_component.hpp b/addons/mk6mortar/script_component.hpp index e1d56d087e..b140a920cc 100644 --- a/addons/mk6mortar/script_component.hpp +++ b/addons/mk6mortar/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT mk6mortar -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_MK6MORTAR #define DEBUG_MODE_FULL @@ -9,6 +9,6 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MK6MORTAR #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" #define MK6_82mm_AIR_FRICTION -0.0001 \ No newline at end of file diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index 37c7d322ad..26ab485db2 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -1,7 +1,7 @@  - - + + 82mm Rangetable 82mm Distanztabelle Tabela strzelnicza 82mm @@ -13,7 +13,7 @@ 82mm Rangetable Tavola di tiro 82mm - + Range Table for the MK6 82mm Mortar Distanztabelle für den Mk6 82mm Mortar Tabela strzelnicza dla moździerza 82mm MK6 @@ -25,7 +25,7 @@ Rangetable pro MK6 82mm minomet Tavola di tiro per il mortaio calibro 82mm MK6 - + Open 82mm Rangetable Öffne 82mm Distanztabelle Otwórz tabelę strzelniczą 82mm @@ -37,7 +37,7 @@ Otevřít 82mm Rangetable Apri la tavola di tiro 82mm - + Charge Ladung Charge @@ -49,37 +49,68 @@ Nabít Carica - + MK6 Settings Moździerz MK6 - Ustawienia + Ajustes MK6 + MK6-Einstellungen + MK6 - Nastavení + Ajustes do MK6 - + Air Resistance Opór powietrza + Resistencia al aire + Luftwiderstand + Odpor vzduchu + Resistência do Ar - + For Player Shots, Model Air Resistance and Wind Effects Modeluj opór powietrza oraz wpływ wiatru na tor lotu pocisku dla strzałów z moździerza MK6 przez graczy + Para disparos del jugador, modelo de resistencia al aire y efectos de viento + Für Spielerschüsse, Luftwiderstand und Windeffekte + Pro hráčovu střelbu, Model odporu vzduchu a povětrných podmínek + Para disparos do jogador, modelo de resistência de ar e efeitos de vento - + Allow MK6 Computer Komputer MK6 + Habilitar ordenador del MK6 + Erlaube MK6-Computer + MK6 - Povolit počítač + Permitir computador do MK6 - + Show the Computer and Rangefinder (these NEED to be removed if you enable air resistance) Zezwól na komputer i dalmierz (opcja ta MUSI zostać wyłączona jeżeli aktywowałeś opór powietrza) + Muestra el ordenador y el medidor de distancia (DEBEN ser quitados si se activa la resistecia al aire) + Zeige den Computer und den Entfernungsmesser an (diese MÜSSEN entfernt werden, wenn der Luftwiderstand aktiviert ist) + Zobrazit počítač a dálkoměr (toto MUSÍ být odstraněno pokud je zapnut odpor vzduchu) + Mostra o computador e o medidor de distância (estes DEVEM ser removidos se você habilitar resistência do ar) - + Allow MK6 Compass Kompas MK6 + Habilitar brujula del MK6 + Erlaube MK6-Kompass + MK6 - Povolit kompas + Permitir bússula do MK6 - + Show the MK6 Digital Compass Pokaż kompas MK6 + Muestra la brujula digital en el MK6 + Zeige MK6-Digitaler-Kompass + MK6 - Zobrazit digitální kompas + Mostra a bússula digital do MK6 - + Moduł ten pozwala dostosować ustawienia moździerza MK6. + Dieses Modul erlaubt das Einstellen des MK6-Mörsers. + Tento modul umožňuje nastavení minometu MK6. + Este módulo permite que você ajuste o morteiro MK6. - + \ No newline at end of file diff --git a/addons/modules/XEH_postInit.sqf b/addons/modules/XEH_postInit.sqf index b6aecf5f90..f7b652ab44 100644 --- a/addons/modules/XEH_postInit.sqf +++ b/addons/modules/XEH_postInit.sqf @@ -1,44 +1,51 @@ #include "script_component.hpp" -// TODO This is a basic and limited implementation that mimics some of the functionality from the A3 module framework, but not all of it. -// We have to execute this in the postInit XEH because on object init, the parameters of the modules are not yet available. They are if we execute it at the start of postInit execution. -{ - [_x] call { - private ["_logic", "_logicType", "_config", "_isGlobal", "_isDisposable", "_isPersistent","_function"]; - _logic = _this select 0; - _logicType = typeof _logic; - _logic hideobject true; +["InitSettingsFromModules", { + // TODO This is a basic and limited implementation that mimics some of the functionality from the A3 module framework, but not all of it. + // We have to execute this in the postInit XEH because on object init, the parameters of the modules are not yet available. They are if we execute it at the start of postInit execution. + { + [_x] call { + private ["_logic", "_logicType", "_config", "_isGlobal", "_isDisposable", "_isPersistent","_function"]; + _logic = _this select 0; + _logicType = typeof _logic; + _logic hideobject true; - if (_logic getvariable [QGVAR(initalized), false]) exitwith {}; - _config = (configFile >> "CfgVehicles" >> _logicType); - if !(isClass _config) exitwith {}; + if (_logic getvariable [QGVAR(initalized), false]) exitwith {}; + _config = (configFile >> "CfgVehicles" >> _logicType); + if !(isClass _config) exitwith {}; - // isGlobal = 1; - _isGlobal = getNumber (_config >> "isGlobal") > 0; - _isDisposable = getNumber (_config >> "isDisposable") > 0; - _isPersistent = getNumber (_config >> "isPersistent") > 0 || getnumber (_config >> "isGlobal") > 1; - _function = getText (_config >> "function"); - if (isnil _function) then { - _function = compile _function; - } else { - _function = missionNamespace getvariable _function; - }; + // isGlobal = 1; + _isGlobal = getNumber (_config >> "isGlobal") > 0; + _isDisposable = getNumber (_config >> "isDisposable") > 0; + _isPersistent = getNumber (_config >> "isPersistent") > 0 || getnumber (_config >> "isGlobal") > 1; + _function = getText (_config >> "function"); + if (isnil _function) then { + _function = compile _function; + } else { + _function = missionNamespace getvariable _function; + }; - if (_isGlobal) then { - [_logic, [], true] call _function; - } else { - if (isServer) then { + if (_isGlobal) then { [_logic, [], true] call _function; + } else { + if (isServer) then { + [_logic, [], true] call _function; + }; + }; + + if !(_isPersistent) then { + _logic setvariable [QGVAR(initalized), true]; + }; + + if (_isDisposable) then { + deleteVehicle _logic; }; }; - - if !(_isPersistent) then { - _logic setvariable [QGVAR(initalized), true]; - }; - - if (_isDisposable) then { - deleteVehicle _logic; - }; + }foreach GVAR(moduleInitCollection); + + if (isServer) then { + GVAR(serverModulesRead) = true; + publicVariable QGVAR(serverModulesRead); }; -}foreach GVAR(moduleInitCollection); +}] call EFUNC(common,addEventhandler); diff --git a/addons/modules/config.cpp b/addons/modules/config.cpp index c5880e7bb1..d25e193d32 100644 --- a/addons/modules/config.cpp +++ b/addons/modules/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; + requiredAddons[] = {"ace_main"}; author[] = {"Glowbal"}; authorUrl = ""; VERSION_CONFIG; diff --git a/addons/movement/ACE_Settings.hpp b/addons/movement/ACE_Settings.hpp index 05b38106f3..8424f9cba9 100644 --- a/addons/movement/ACE_Settings.hpp +++ b/addons/movement/ACE_Settings.hpp @@ -3,6 +3,6 @@ class ACE_Settings { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_Movement_UseImperial"; + displayName = CSTRING(UseImperial); }; }; \ No newline at end of file diff --git a/addons/movement/XEH_postInit.sqf b/addons/movement/XEH_postInit.sqf index 0e451832d9..ebe97e879d 100644 --- a/addons/movement/XEH_postInit.sqf +++ b/addons/movement/XEH_postInit.sqf @@ -14,13 +14,13 @@ if (!hasInterface) exitWith {}; [_this select 1] call CBA_fnc_removePerFrameHandler; }; - _dialog displayCtrl 111 ctrlSetText format ["%1 - %2 %3", [ACE_player] call EFUNC(common,getName), localize "STR_ACE_Movement_Weight", [ACE_player] call FUNC(getWeight)]; + _dialog displayCtrl 111 ctrlSetText format ["%1 - %2 %3", [ACE_player] call EFUNC(common,getName), localize LSTRING(Weight), [ACE_player] call FUNC(getWeight)]; }, 0, _this select 0] call CBA_fnc_addPerFrameHandler; }] call EFUNC(common,addEventHandler); -["ACE3 Movement", QGVAR(climb), localize "STR_ACE_Movement_Climb", +["ACE3 Movement", QGVAR(climb), localize LSTRING(Climb), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/movement/functions/fnc_climb.sqf b/addons/movement/functions/fnc_climb.sqf index f88884195e..a395e834b8 100644 --- a/addons/movement/functions/fnc_climb.sqf +++ b/addons/movement/functions/fnc_climb.sqf @@ -20,7 +20,7 @@ private "_unit"; _unit = _this select 0; if !([_unit] call FUNC(canClimb)) exitWith { - [localize "STR_ACE_Movement_CanNotClimb"] call EFUNC(common,displayTextStructured); + [localize LSTRING(CanNotClimb)] call EFUNC(common,displayTextStructured); }; if !(_unit getVariable [QGVAR(isClimbInit), false]) then { diff --git a/addons/mx2a/$PBOPREFIX$ b/addons/mx2a/$PBOPREFIX$ new file mode 100644 index 0000000000..1042853ad7 --- /dev/null +++ b/addons/mx2a/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\mx2a \ No newline at end of file diff --git a/addons/mx2a/CfgVehicles.hpp b/addons/mx2a/CfgVehicles.hpp new file mode 100644 index 0000000000..c450133ba7 --- /dev/null +++ b/addons/mx2a/CfgVehicles.hpp @@ -0,0 +1,20 @@ +class CfgVehicles { + class Item_Base_F; + class ACE_Item_MX2A: Item_Base_F { + author[] = {"Spooner", "tcp"}; + scope = 2; + scopeCurator = 2; + displayName = CSTRING(DisplayName); + vehicleClass = "Items"; + class TransportWeapons { + MACRO_ADDWEAPON(ACE_MX2A,1); + }; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportWeapons { + MACRO_ADDWEAPON(ACE_MX2A,6); + }; + }; +}; diff --git a/addons/mx2a/CfgWeapons.hpp b/addons/mx2a/CfgWeapons.hpp new file mode 100644 index 0000000000..6f590e2ed4 --- /dev/null +++ b/addons/mx2a/CfgWeapons.hpp @@ -0,0 +1,26 @@ + +class CfgWeapons { + class Binocular; + class ACE_MX2A: Binocular { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(DisplayName); + descriptionShort = CSTRING(Description); + model = PATHTOF(data\ace_mx2a.p3d); + modelOptics = QUOTE(PATHTOEF(apl,LWTS_optic.p3d)); + picture = PATHTOF(UI\w_mx2a_ca.paa); + opticsZoomMax = 0.1; + distanceZoomMax = 120; + opticsZoomMin = 0.05; + distanceZoomMin = 400; + opticsZoomInit = 0.1; + visionMode[] = {"Ti"}; + thermalMode[] = {0,1}; + discretefov[] = {0.33333/1, 0.33333/2}; // 1x/2x -- http://www.drs.com/Products/RSTA/PDF/MX2A.pdf + discreteInitIndex = 0; + discreteDistance[] = {120,400}; + discreteDistanceInitIndex = 1; + class WeaponSlotsInfo { + mass = 20; + }; + }; +}; diff --git a/addons/mx2a/README.md b/addons/mx2a/README.md new file mode 100644 index 0000000000..cbaf9add1b --- /dev/null +++ b/addons/mx2a/README.md @@ -0,0 +1,10 @@ +ace_mx2a +========== + +Adds the MX-2A thermal imaging device. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) diff --git a/addons/mx2a/UI/w_mx2a_ca.paa b/addons/mx2a/UI/w_mx2a_ca.paa new file mode 100644 index 0000000000..748a01d5f4 Binary files /dev/null and b/addons/mx2a/UI/w_mx2a_ca.paa differ diff --git a/addons/mx2a/config.cpp b/addons/mx2a/config.cpp new file mode 100644 index 0000000000..45b1643ed2 --- /dev/null +++ b/addons/mx2a/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_Item_MX2A"}; + weapons[] = {"ACE_MX2A"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_apl"}; + author[] = {"Spooner", "tcp"}; + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/mx2a/data/ace_mx2a.p3d b/addons/mx2a/data/ace_mx2a.p3d new file mode 100644 index 0000000000..f2664de20b Binary files /dev/null and b/addons/mx2a/data/ace_mx2a.p3d differ diff --git a/addons/mx2a/data/mx2A_ti_ca.paa b/addons/mx2a/data/mx2A_ti_ca.paa new file mode 100644 index 0000000000..1315a56aa8 Binary files /dev/null and b/addons/mx2a/data/mx2A_ti_ca.paa differ diff --git a/addons/mx2a/data/mx2a.rvmat b/addons/mx2a/data/mx2a.rvmat new file mode 100644 index 0000000000..d614433dce --- /dev/null +++ b/addons/mx2a/data/mx2a.rvmat @@ -0,0 +1,81 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.1,0.1,0.1,1}; +specularPower=30; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 { + texture="z\ace\addons\mx2a\data\mx2a_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="a3\weapons_f\data\detailmaps\metal_detail_dt.paa"; + uvSource="tex"; + class uvTransform { + aside[]={2,-1.568,0}; + up[]={1.568,4,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform { + aside[]={0.98480773,-0.17364819,0}; + up[]={0.17364819,0.98480773,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="z\ace\addons\mx2a\data\mx2a_as.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage5 { + texture="z\ace\addons\mx2a\data\mx2a_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,16,2,2)fresnel(1.5,1.22)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class StageTI { + texture="z\ace\addons\mx2a\data\mx2a_ti_ca.paa"; +}; \ No newline at end of file diff --git a/addons/mx2a/data/mx2a_as.paa b/addons/mx2a/data/mx2a_as.paa new file mode 100644 index 0000000000..4bf1b49b8a Binary files /dev/null and b/addons/mx2a/data/mx2a_as.paa differ diff --git a/addons/mx2a/data/mx2a_co.paa b/addons/mx2a/data/mx2a_co.paa new file mode 100644 index 0000000000..28db7f08b2 Binary files /dev/null and b/addons/mx2a/data/mx2a_co.paa differ diff --git a/addons/mx2a/data/mx2a_nohq.paa b/addons/mx2a/data/mx2a_nohq.paa new file mode 100644 index 0000000000..adff9a6fb0 Binary files /dev/null and b/addons/mx2a/data/mx2a_nohq.paa differ diff --git a/addons/mx2a/data/mx2a_smdi.paa b/addons/mx2a/data/mx2a_smdi.paa new file mode 100644 index 0000000000..9eab8a9cb4 Binary files /dev/null and b/addons/mx2a/data/mx2a_smdi.paa differ diff --git a/addons/mx2a/script_component.hpp b/addons/mx2a/script_component.hpp new file mode 100644 index 0000000000..aabb74660a --- /dev/null +++ b/addons/mx2a/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT mx2a +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MX2A + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MX2A + #define DEBUG_SETTINGS DEBUG_SETTINGS_MX2A +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/mx2a/stringtable.xml b/addons/mx2a/stringtable.xml new file mode 100644 index 0000000000..88d6bef6b5 --- /dev/null +++ b/addons/mx2a/stringtable.xml @@ -0,0 +1,20 @@ + + + + + MX-2A + MX-2A + MX-2A + MX-2A + MX-2A + + + Thermal imaging device + Wärmebildgerät + Monokular termowizyjny + Dispositivo de imagen térmica + Termální dalekohled + Dispositivo de imagem térmica + + + \ No newline at end of file diff --git a/addons/nametags/ACE_Settings.hpp b/addons/nametags/ACE_Settings.hpp index a2c81e61b4..e976c4adc8 100644 --- a/addons/nametags/ACE_Settings.hpp +++ b/addons/nametags/ACE_Settings.hpp @@ -3,33 +3,33 @@ class ACE_Settings { value[] = {0.77, 0.51, 0.08, 1}; typeName = "COLOR"; isClientSettable = 1; - displayName = "$STR_ACE_NameTags_DefaultNametagColor"; + displayName = CSTRING(DefaultNametagColor); }; class GVAR(showPlayerNames) { value = 1; typeName = "SCALAR"; isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowPlayerNames"; - description = "$STR_ACE_NameTags_ShowPlayerNames_Desc"; - values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_Enabled", "$STR_ACE_Common_OnlyCursor", "$STR_ACE_Common_OnlyOnKeypress", "$STR_ACE_Common_OnlyCursorAndKeyPress"}; + displayName = CSTRING(ShowPlayerNames); + description = CSTRING(ShowPlayerNames_Desc); + values[] = {CSTRING(Disabled), CSTRING(Enabled), CSTRING(OnlyCursor), CSTRING(OnlyKeypress), CSTRING(OnlyCursorAndKeypress)}; }; class GVAR(showPlayerRanks) { value = 1; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowPlayerRanks"; + displayName = CSTRING(ShowPlayerRanks); }; class GVAR(showVehicleCrewInfo) { value = 1; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowVehicleCrewInfo"; + displayName = CSTRING(ShowVehicleCrewInfo); }; class GVAR(showNamesForAI) { value = 0; typeName = "BOOL"; isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowNamesForAI"; + displayName = CSTRING(ShowNamesForAI); }; class GVAR(showCursorTagForVehicles) { value = 0; @@ -40,18 +40,26 @@ class ACE_Settings { value = 1; typeName = "SCALAR"; isClientSettable = 1; - displayName = "$STR_ACE_NameTags_ShowSoundWaves"; - description = "$STR_ACE_NameTags_ShowSoundWaves_Desc"; - values[] = {"$STR_ACE_Common_Disabled", "$STR_ACE_Common_NameTagSettings", "$STR_ACE_Common_AlwaysShowAll"}; + displayName = CSTRING(ShowSoundWaves); + description = CSTRING(ShowSoundWaves_Desc); + values[] = {CSTRING(Disabled), CSTRING(NameTagSettings), CSTRING(AlwaysShowAll)}; }; - class GVAR(PlayerNamesViewDistance) { + class GVAR(playerNamesViewDistance) { value = 5; typeName = "SCALAR"; isClientSettable = 0; }; - class GVAR(PlayerNamesMaxAlpha) { + class GVAR(playerNamesMaxAlpha) { value = 0.8; typeName = "SCALAR"; isClientSettable = 0; }; -}; \ No newline at end of file + class GVAR(tagSize) { + value = 2; + typeName = "SCALAR"; + isClientSettable = 1; + displayName = CSTRING(TagSize_Name); + description = CSTRING(TagSize_Description); + values[] = {"$str_very_small", "$str_small", "$str_medium", "$str_large", "$str_very_large"}; + }; +}; diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index fabd3b09cb..6c0c148e47 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -1,72 +1,101 @@ class CfgVehicles { - class Logic; - class Module_F: Logic { - class ModuleDescription {}; - }; - class ACE_ModuleNameTags : Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class ACE_ModuleNameTags: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_NameTags_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QFUNC(moduleNameTags); scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_NameTags_ca.paa)); class Arguments { - class PlayerNamesViewDistance { - displayName = "$STR_ACE_NameTags_PlayerNamesViewDistance_DisplayName"; - description = "$STR_ACE_NameTags_PlayerNamesViewDistance_Description"; - typeName = "NUMBER"; - defaultValue = 5; - }; - class showNamesForAI { - displayName = "$STR_ACE_NameTags_showNamesForAI_DisplayName"; - description = "$STR_ACE_NameTags_showNamesForAI_Description"; + class showPlayerNames { + displayName = CSTRING(ShowPlayerNames); + description = CSTRING(ShowPlayerNames_Desc); typeName = "NUMBER"; class values { class DoNotForce { default = 1; - name = "$STR_ACE_NameTags_DoNotForce"; + name = CSTRING(DoNotForce); value = -1; }; class ForceHide { - name = "$STR_ACE_NameTags_ForceHide"; + name = CSTRING(ForceHide); value = 0; }; class ForceShow { - name = "$STR_ACE_NameTags_ForceShow"; + name = CSTRING(ForceShow); + value = 1; + }; + class ForceShowOnlyCursor { + name = CSTRING(ForceShowOnlyCursor); + value = 2; + }; + class ForceShowOnlyKeypress { + name = CSTRING(ForceShowOnlyKeypress); + value = 3; + }; + class ForceShowOnlyCursorAndKeypress { + name = CSTRING(ForceShowOnlyCursorAndKeypress); + value = 4; + }; + }; + }; + class playerNamesViewDistance { + displayName = CSTRING(PlayerNamesViewDistance_DisplayName); + description = CSTRING(PlayerNamesViewDistance_Description); + typeName = "NUMBER"; + defaultValue = 5; + }; + class showNamesForAI { + displayName = CSTRING(showNamesForAI_DisplayName); + description = CSTRING(showNamesForAI_Description); + typeName = "NUMBER"; + class values { + class DoNotForce { + default = 1; + name = CSTRING(DoNotForce); + value = -1; + }; + class ForceHide { + name = CSTRING(ForceHide); + value = 0; + }; + class ForceShow { + name = CSTRING(ForceShow); value = 1; }; }; }; class showVehicleCrewInfo { - displayName = "$STR_ACE_NameTags_showVehicleCrewInfo_DisplayName"; - description = "$STR_ACE_NameTags_showVehicleCrewInfo_Description"; + displayName = CSTRING(showVehicleCrewInfo_DisplayName); + description = CSTRING(showVehicleCrewInfo_Description); typeName = "NUMBER"; class values { class DoNotForce { default = 1; - name = "$STR_ACE_NameTags_DoNotForce"; + name = CSTRING(DoNotForce); value = -1; }; class ForceHide { - name = "$STR_ACE_NameTags_ForceHide"; + name = CSTRING(ForceHide); value = 0; }; class ForceShow { - name = "$STR_ACE_NameTags_ForceShow"; + name = CSTRING(ForceShow); value = 1; }; }; }; class showCursorTagForVehicles { - displayName = "$STR_ACE_NameTags_showCursorTagForVehicles_DisplayName"; - description = "$STR_ACE_NameTags_showCursorTagForVehicles_Description"; + displayName = CSTRING(showCursorTagForVehicles_DisplayName); + description = CSTRING(showCursorTagForVehicles_Description); typeName = "BOOL"; defaultValue = 0; }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_NameTags_Module_Description"; + class ModuleDescription { + description = CSTRING(Module_Description); }; }; -}; \ No newline at end of file +}; diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index cea2025dcc..efc634be6c 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -5,16 +5,16 @@ if (!hasInterface) exitWith {}; -GVAR(ShowNamesTime) = -10; +GVAR(showNamesTime) = -10; // Add keybinds -["ACE3 Common", QGVAR(showNameTags), localize "STR_ACE_NameTags_ShowNames", +["ACE3 Common", QGVAR(showNameTags), localize LSTRING(ShowNames), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement - GVAR(ShowNamesTime) = time; + GVAR(showNamesTime) = ACE_time; if (call FUNC(canShow)) then{ call FUNC(doShow); }; // Return false so it doesn't block other actions false @@ -22,6 +22,52 @@ GVAR(ShowNamesTime) = -10; {false}, [29, [false, false, false]], false] call cba_fnc_addKeybind; //LeftControl Key +// Monitor the assigned teams, and propegate them appropriately for the player +// This allows for assigned team colors to match across the entire group +[{ + private["_leader", "_playerIsLeader", "_unitTeam"]; + if (!(isNull ACE_player) && { alive ACE_player } ) then { + _leader = leader (group ACE_player); + _playerIsLeader = false; + + if(alive _leader) then { + if(_leader == ACE_player) then { + _playerIsLeader = true; + }; + }; + + if (_playerIsLeader) then { + { + if(alive _x) then { + _unitTeam = _x getVariable [QGVAR(teamAssignment),"MAIN"]; + if (_unitTeam != assignedTeam _x) then { + _x setVariable [QGVAR(teamAssignment), assignedTeam _x,true]; + }; + }; + } forEach units (group ACE_player); + } else { + { + if(alive _x) then { + _unitTeam = _x getVariable [QGVAR(teamAssignment),"MAIN"]; + if (_unitTeam != assignedTeam _x) then { + _x assignTeam _unitTeam; + }; + }; + } forEach units (group ACE_player); + }; + }; +}, 5, []] call CBA_fnc_addPerFrameHandler; -// Draw handle -addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; +// Wait until the colors are defined before starting to draw the nametags +["SettingsInitialized", { + // Draw handle + call FUNC(updateSettings); +}] call EFUNC(common,addEventHandler); + +// Change settings accordingly when they are changed +["SettingChanged", { + PARAMS_1(_name); + if (_name == QGVAR(showPlayerNames)) then { + call FUNC(updateSettings); + }; +}] call EFUNC(common,addEventHandler); diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index f3c9a97cba..51b926cbb3 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -10,5 +10,6 @@ PREP(initIsSpeaking); PREP(moduleNameTags); PREP(onDraw3d); PREP(setText); +PREP(updateSettings); ADDON = true; diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index 77e90b3b6b..a2d38254f1 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -13,6 +13,7 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" -#include "CfgVehicles.hpp" #include "ACE_Settings.hpp" +#include "CfgVehicles.hpp" + #include diff --git a/addons/nametags/functions/common.hpp b/addons/nametags/functions/common.hpp index caa7a3e982..6aeb24fc5a 100644 --- a/addons/nametags/functions/common.hpp +++ b/addons/nametags/functions/common.hpp @@ -1,12 +1,8 @@ /* - Author: aeroson - - Description: - Images, index in images and order of roles. - Defined number also implies order, lower number shows more on top of the list. -*/ - -#include "script_component.hpp" + * Author: aeroson + * Images, index in images and order of roles. + * Defined number also implies order, lower number shows more on top of the list. + */ #define PILOT 0 #define DRIVER 1 diff --git a/addons/nametags/functions/fnc_canShow.sqf b/addons/nametags/functions/fnc_canShow.sqf index 0e187fee0f..b53f50c93e 100644 --- a/addons/nametags/functions/fnc_canShow.sqf +++ b/addons/nametags/functions/fnc_canShow.sqf @@ -1,19 +1,22 @@ /* - Author: aeroson - - Description: - Might be called several times a second - - Parameters: - None - - Returns: - true if CrewInfo can be shown, false otherwise -*/ - + * Author: aeroson + * Checks if crew info can be shown. + * Might be called several times a second. + * + * Arguments: + * None + * + * Return Value: + * Can show Crew Info + * + * Example: + * call ace_nametags_fnc_doShow + * + * Public: No + */ #include "script_component.hpp" -private["_player"]; +private ["_player"]; _player = ACE_player; diff --git a/addons/nametags/functions/fnc_doShow.sqf b/addons/nametags/functions/fnc_doShow.sqf index 16a6329347..1b7323921f 100644 --- a/addons/nametags/functions/fnc_doShow.sqf +++ b/addons/nametags/functions/fnc_doShow.sqf @@ -1,16 +1,18 @@ /* - Author: aeroson - - Description: - Shows the actual text and sets text the crew info - - Parameters: - None - - Returns: - Nothing -*/ - + * Author: aeroson + * Shows the actual text and sets text the crew info. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_doShow + * + * Public: No + */ #include "script_component.hpp" #include "common.hpp"; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index 6a7db7d5ac..7b6bbda138 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -1,39 +1,46 @@ /* * Author: commy2, esteldunedain - * * Draw the nametag and rank icon. * - * Argument: + * Arguments: * 0: Unit (Player) * 1: Target - * 2: alpha (Number) - * 4: Height offset (Number) + * 2: Alpha + * 4: Height offset * 5: Draw Type * * Return value: - * None. + * None + * + * Example: + * [ACE_player, _target, _alpha, _distance * 0.026, _icon] call ace_nametags_fnc_drawNameTagIcon + * + * Public: No */ #include "script_component.hpp" -#define TEXTURES_RANKS [ \ - "", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\corporal_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\sergeant_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\lieutenant_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ - ] - -private ["_height", "_position", "_color", "_name", "_rank", "_size", "_icon"]; - PARAMS_5(_player,_target,_alpha,_heightOffset,_iconType); -if (_alpha < 0) exitWith {}; //Don't waste time if not visable +private ["_position", "_color", "_name", "_rank", "_size", "_icon", "_scale"]; + if (_iconType == ICON_NONE) exitWith {}; //Don't waste time if not visable +//Set Icon: +_icon = ""; +_size = 0; +if ((_iconType == ICON_NAME_SPEAK) || (_iconType == ICON_SPEAK)) then { + _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa"; + _size = 1; + _alpha = _alpha max 0.6;//Boost alpha when speaking +} else { + if (_iconType == ICON_NAME_RANK) then { + _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); + _size = 1; + }; +}; + +if (_alpha < 0) exitWith {}; //Don't waste time if not visable //Set Text: _name = if (_iconType in [ICON_NAME, ICON_NAME_RANK, ICON_NAME_SPEAK]) then { @@ -42,41 +49,28 @@ _name = if (_iconType in [ICON_NAME, ICON_NAME_RANK, ICON_NAME_SPEAK]) then { "" }; -//Set Icon: -_icon = ""; -_size = 0; -if ((_iconType == ICON_NAME_SPEAK) || (_iconType == ICON_SPEAK)) then { - _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa"; - _size = 0.75; - _alpha = _alpha + 0.6;//Boost alpha when speaking -} else { - if (_iconType == ICON_NAME_RANK) then { - _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); - _size = 0.75; - }; -}; - //Set Color: if !(group _target == group _player) then { _color = +GVAR(defaultNametagColor); //Make a copy, then multiply both alpha values (allows client to decrease alpha in settings) _color set [3, (_color select 3) * _alpha]; } else { - _color = [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select (["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (if (_target == _player) then {0} else {assignedTeam _target})) max 0 + _color = [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select ((["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (assignedTeam _target)) max 0); }; -_height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find (stance _target)); // Convert position to ASLW (expected by drawIcon3D) and add height offsets -_position = _target modelToWorldVisual [0, 0, (_height + _heightOffset)]; +_position = _target modelToWorldVisual ((_target selectionPosition "pilot") vectorAdd [0,0,(_heightOffset + .35)]); + +_scale = [0.333, 0.5, 0.666, 0.83333, 1] select GVAR(tagSize); drawIcon3D [ _icon, _color, _position, -_size, -_size, +(_size * _scale), +(_size * _scale), 0, _name, 2, -0.033, +(0.05 * _scale), "PuristaMedium" ]; diff --git a/addons/nametags/functions/fnc_getVehicleData.sqf b/addons/nametags/functions/fnc_getVehicleData.sqf index 1538c345a1..6d83b0f573 100644 --- a/addons/nametags/functions/fnc_getVehicleData.sqf +++ b/addons/nametags/functions/fnc_getVehicleData.sqf @@ -1,46 +1,38 @@ /* - Author: aeroson - - Description: - Gathers and caches data needed by AGM_CrewInfo_fnc_doShow - What really does make difference for the engine is simulation of CfgAmmo - Priority of roles is: driver/pilot, gunner, copilot, commander, ffv, cargo - - Parameters: - None - - Returns: - [ - Is vehicle inherited from Air ? - Array categorizing each vehicle's turret - ] -*/ - + * Author: aeroson + * Gathers and caches data needed by AGM_CrewInfo_fnc_doShow. + * What really does make difference for the engine is simulation of CfgAmmo. + * Priority of roles is: driver/pilot, gunner, copilot, commander, FFV, cargo. + * + * Arguments: + * None + * + * Return Value: + * Data + * 0: Vehicle inherits from Air + * 1: Categorized vehicle's turrets + * + * Example: + * call ace_nametags_fnc_updateSettings + * + * Public: No + */ #include "script_component.hpp" #include "common.hpp"; +private ["_type", "_varName", "_data", "_isAir", "_config", "_fnc_addTurret", "_fnc_addTurretUnit"]; -private ["_type", "_varName", "_data"]; - -_type = _this select 0; +PARAMS_1(_type); _varName = format ["ACE_CrewInfo_Cache_%1", _type]; _data = + (uiNamespace getVariable _varName); -if (!isNil "_data") exitWith { - _data -}; +if (!isNil "_data") exitWith {_data}; _data = []; - - - -private ["_isAir", "_config", "_fnc_addTurret", "_fnc_addTurretUnit"]; - _isAir = _type isKindOf "Air"; _fnc_addTurretUnit = { - private ["_config", "_path", "_role", "_simulationEmpty", "_simulationLaserDesignate", "_simulationOther", "_magazine", "_ammo", "_simulation"]; _config = _this select 0; @@ -83,7 +75,6 @@ _fnc_addTurretUnit = { }; _data pushBack [_path, _role]; - }; @@ -108,9 +99,7 @@ _fnc_addTurret = { } else { _offset = _offset + 1; }; - }; - }; diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index c6087541a8..897d223930 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -4,13 +4,13 @@ * Compatiblity with TFR/ACRE and Arma's VON * * Arguments: - * NONE + * None * * Return Value: - * NONE + * None * * Example: - * [] call ACE_nametags_fnc_initIsSpeaking + * [] call ace_nametags_fnc_initIsSpeaking * * Public: No */ diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 1bbd4d8efb..7373d85de1 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -20,9 +20,14 @@ if !(_activated) exitWith {}; GVAR(Module) = true; -[_logic, QGVAR(PlayerNamesViewDistance), "PlayerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(ShowNamesForAI), "ShowNamesForAI" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(playerNamesViewDistance), "playerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showNamesForAI), "showNamesForAI" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showVehicleCrewInfo), "showVehicleCrewInfo" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); + +// Do Not Force - read module setting only non-default is set due to using SCALAR +if ((_logic getVariable "showPlayerNames") != -1) then { + [_logic, QGVAR(showPlayerNames), "showPlayerNames" ] call EFUNC(common,readSettingFromModule); +}; diag_log text "[ACE]: NameTags Module Initialized."; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 9efc70aeb9..43996e17b2 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -1,12 +1,30 @@ +/* + * Author: + * Draws names and icons. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_onDraw3d + * + * Public: No + */ #include "script_component.hpp" -private ["_onKeyPressAlphaMax", "_defaultIcon", "_distance", "_alpha", "_icon", "_targets", "_pos2", "_vecy", "_relPos", "_projDist", "_pos", "_target"]; +private ["_onKeyPressAlphaMax", "_defaultIcon", "_distance", "_alpha", "_icon", "_targets", "_pos2", "_vecy", "_relPos", "_projDist", "_pos", "_target", "_targetEyePosASL", "_ambientBrightness", "_maxDistance"]; //don't show nametags in spectator -if (!alive ACE_player) exitWith {}; +if ((isNull ACE_player) || {!alive ACE_player}) exitWith {}; + +_ambientBrightness = ((([] call EFUNC(common,ambientBrightness)) + ([0, 0.4] select ((currentVisionMode ace_player) != 0))) min 1) max 0; +_maxDistance = _ambientBrightness * GVAR(PlayerNamesViewDistance); _onKeyPressAlphaMax = if ((GVAR(showPlayerNames) in [3,4])) then { - 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 + 2 + (GVAR(showNamesTime) - ACE_time); //after release 1 second of full opacity, 1 second of fading to 0 } else { 1 }; @@ -26,11 +44,10 @@ if (GVAR(showCursorTagForVehicles) && {_onKeyPressAlphaMax > 0}) then { if ((!isNull _target) && {(side (group _target)) == (side (group ACE_player))} && {_target != ACE_player} && - {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {GVAR(showNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = ACE_player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - _alpha = _alpha min _onKeyPressAlphaMax; + _alpha = (((1 - 0.2 * (_distance - _maxDistance)) min 1) * GVAR(playerNamesMaxAlpha)) min _onKeyPressAlphaMax; [ACE_player, _target, _alpha, _distance * 0.026, _defaultIcon] call FUNC(drawNameTagIcon); }; }; @@ -43,11 +60,10 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group ACE_player))} && {_target != ACE_player} && - {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {GVAR(showNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = ACE_player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - _alpha = _alpha min _onKeyPressAlphaMax; + _alpha = (((1 - 0.2 * (_distance - _maxDistance)) min 1) * GVAR(playerNamesMaxAlpha)) min _onKeyPressAlphaMax; _icon = ICON_NONE; if (GVAR(showSoundWaves) == 2) then { //icon will be drawn below, so only show name here _icon = if (([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon}; @@ -61,7 +77,7 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(showSoundWaves) == 2}) then { _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; + _targets = _pos nearObjects ["CAManBase", _maxDistance + 5]; if (!surfaceIsWater _pos) then { _pos = ATLtoASL _pos; @@ -86,21 +102,17 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho if ((_icon != ICON_NONE) && {(side (group _target)) == (side (group ACE_player))} && {_target != ACE_player} && - {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {GVAR(showNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle ACE_player, _target]) exitWith {}; // Check if there is line of sight + _targetEyePosASL = eyePos _target; + if (lineIntersects [_pos, _targetEyePosASL, ACE_player, _target]) exitWith {}; // Check if there is line of sight + _relPos = (visiblePositionASL _target) vectorDiff _pos; _distance = vectorMagnitude _relPos; _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - - if ((GVAR(showSoundWaves) == 2) && {([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target}}) then { - _alpha = 1; - } else { - _alpha = _alpha min _onKeyPressAlphaMax; - }; + _alpha = (((1 - 0.2 * (_distance - _maxDistance)) min 1) * GVAR(playerNamesMaxAlpha)) min _onKeyPressAlphaMax; [ACE_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); }; diff --git a/addons/nametags/functions/fnc_setText.sqf b/addons/nametags/functions/fnc_setText.sqf index e7d1b748b1..33112c31d0 100644 --- a/addons/nametags/functions/fnc_setText.sqf +++ b/addons/nametags/functions/fnc_setText.sqf @@ -1,25 +1,28 @@ -/* - Author: aeroson - - Description: - Sets the text on the dialog - - Parameters: - None - - Returns: - Nothing -*/ - +/* + * Author: aeroson + * Sets the text on the dialog. + * + * Arguments: + * 0: Text + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_setText + * + * Public: No + */ #include "script_component.hpp" #define TextIDC 11123 -private["_text", "_ctrl"]; +PARAMS_1(_text); + +private["_ctrl"]; disableSerialization; -_text = _this select 0; _ctrl = (uiNamespace getVariable QGVAR(dialog)) displayCtrl TextIDC; _ctrl ctrlSetStructuredText parseText _text; _ctrl ctrlCommit 0; diff --git a/addons/nametags/functions/fnc_updateSettings.sqf b/addons/nametags/functions/fnc_updateSettings.sqf new file mode 100644 index 0000000000..76110b4f79 --- /dev/null +++ b/addons/nametags/functions/fnc_updateSettings.sqf @@ -0,0 +1,25 @@ +/* + * Author: Jonpas + * Dynamically adds and removes Draw3D based on settings on run-time. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_nametags_fnc_updateSettings + * + * Public: No + */ +#include "script_component.hpp" + +if (isNil QGVAR(drawHandler) && {GVAR(showPlayerNames) != 0}) then { + GVAR(drawHandler) = addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; +} else { + if (!isNil QGVAR(drawHandler) && {GVAR(showPlayerNames) == 0}) then { + removeMissionEventHandler ["Draw3D", GVAR(drawHandler)]; + GVAR(drawHandler) = nil; + }; +}; diff --git a/addons/nametags/script_component.hpp b/addons/nametags/script_component.hpp index e80768a723..da912b48c4 100644 --- a/addons/nametags/script_component.hpp +++ b/addons/nametags/script_component.hpp @@ -2,11 +2,11 @@ #include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_NAMETAGS - #define DEBUG_MODE_FULL +#define DEBUG_MODE_FULL #endif #ifdef DEBUG_SETTINGS_NAMETAGS - #define DEBUG_SETTINGS DEBUG_SETTINGS_NAMETAGS +#define DEBUG_SETTINGS DEBUG_SETTINGS_NAMETAGS #endif #include "\z\ace\addons\main\script_macros.hpp" @@ -16,3 +16,15 @@ #define ICON_NAME_RANK 2 #define ICON_NAME_SPEAK 3 #define ICON_SPEAK 4 + +//todo?: custom rank icons?? +#define TEXTURES_RANKS [ \ + "", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\corporal_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\sergeant_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\lieutenant_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ + ] \ No newline at end of file diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index ef94140510..8571b4c537 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -112,90 +112,211 @@ Name Tags Ustawienia imion + Etiquetas de nombre + Namensanzeigen + Jmenovky + Etiquetas de nome Player Names View Dist. Zasięg imion graczy + Distancia de vision para nombres de jugadores + Spielernamen-Distanz + Vzdálenost zobrazení jména hráčů + Distância de visão dos nomes dos jogadores Distance in meters at which player names are shown. Default: 5 Dystans w metrach, na którym wyświetlane są imiona graczy. Domyślnie: 5 + Distancia en metros a la que se muestran los nombres de los jugadores. Por defecto: 5 + Distanz in Metern bei der Spielernamen angezeigt werden. Standard: 5 + Vzdálenost v metrech pro zobrazení jména. Výchozí: 5 + Distância em metros que os nomes dos jogadores são mostrados. Padrão: 5 Show name tags for AI? Imiona AI + ¿Mostrar nombres para la IA? + Zeige Namensanzeigen für KI? + Zobrazit jmenovky pro AI? + Mostrar nomes para IA? Show the name and rank tags for friendly AI units? Default: Do not force Pokaż imiona i rangi przyjaznych jednostek AI? Domyślnie: Nie wymuszaj + Muestra etiquetas de nombre y rango para las unidades IA amigas? Por defecto: No forzar + Zeige den Namen und Rang für freundliche KI-Einheiten? Standard: nicht erwzingen + Zobrazit jména a hodnosti pro spřátelené AI jednotky? Výchozí: Nevynucovat + Mostra o nome e patente para unidades IA aliadas? Padrão: Não forçar Do Not Force Nie wymuszaj + No forzar + Nicht erzwingen + Nevynucovat + Não forçar Force Hide Wymuś ukrycie + Ocultar forzado + Verstecken erzwingen + Vynuceno skrýt + Ocultar forçado - Force show + Force Show Wymuś wyświetlanie + Mostrar forzado + Anzeigen erzwingen + Vynuceno zobrazit + Mostrar forçado Show crew info? Pokaż załogę + ¿Mostrar información de la tripulación? + Zeige Besatzungsinfo? + Zobrazit informace o posádce? + Mostrar informação de tripulação? Show vehicle crew info, or by default allows players to choose it on their own. Default: Do Not Force Pokaż informacje o obsadzie pojazdu, lub pozwól graczom ustawić tą opcje według własnego uznania. Domyślnie: Nie wymuszaj + Muestra información de la tripulación, o por defecto permite a los jugadores elegirlo. Por defecto: No forzar + Zeige Fahrzeugbesatzungsinfo oder erlaube Spielern es auszuwählen. Standard: nicht erzwingen. + Zobrazit informace o posádce, nebo nechat aby si hráč vybral sám. Výchozí: Nevynucovat + Mostrar informações de tripulação ou por padrão permitir a escolha dos jogadores. Padrão: Não forçar. Show for Vehicles Pokaż dla pojazdów + Mostrar para vehiculos + Zeige bei Fahrzeugen + Zobrazit pro vozidla + Mostrar para veículos Show cursor NameTag for vehicle commander (only if client has name tags enabled)Default: No Pokazuj imię dowódcy pojazdu nad pojazdem (tylko jeżeli klient ma włączone imiona graczy). Domyślnie: Nie + Muestra etiquetas de nombre en el cursor para el comandante del vehiculo (solo si el cliente tiene las etiquetas de nombre activadas) Por defecto: No + Zeige Maus-Namensanzeigen für Fahrzeugkommandanten (nur wenn der Client Namensanzeigen aktiviert hat). Standard: Nein + Zobrazit jmenovky pro velitele vozidla (pouze pokud má klient jmenovky povolené). Výchozí: Ne + Mostrar o nome no cursor para o comandante do veículo (somente se o cliente tiver etiquetas de nomes ativada). Padrão: Não - + This module allows you to customize settings and range of Name Tags. Moduł ten pozwala dostosować ustawienia i zasięg wyświetlania imion. + Dieses Modul erlaubt die Einstellungen der Anzeigenamen zu verändern. + Este módulo permite personalizar la configuración y la distancia de las Etiquetas de nombre. + Tento modul umožňuje si přizpůsobit nastavení a vzdálenost jmenovky. + Este módulo permite que você personalize as configurações e distâncias de etiquetas de nome. - + Disabled Wyłączone + Desactivado + Deaktiviert + Zakázáno + Desativado - + Enabled Włączone + Activado + Aktiviert + Povoleno + Ativado - - Only Cursor + + Only on Cursor Tylko pod kursorem + Solo cursor + Nur bei Maus + Pouze na kurzor + Somente no cursor - - Only On Keypress + + Only on Keypress Tylko po wciśnięciu klawisza + Solo al pulsar tecla + Nur bei Tastendruck + Pouze na klávesu + Somente em tecla ativada - - Only Cursor and KeyPress + + Only on Cursor and Keypress Tylko pod kursorem i po wciśnięciu klawisza + En cursor y al pulsar tecla + Nur Maus und Tastendruck + Pouze na kurzor a klávesu + Somente em cursor ou tecla ativada - + + Force Show Only on Cursor + Wymuś pod kursorem + Forzar mostrar solo en el cursor + Vynuceno zobrazit pouze na kurzor + Forçar mostrar somente no cursor + + + Force Show Only on Keypress + Wymuś po wciśnięciu klawisza + Forzar mostrar solo al pulsar tecla + Vynuceno zobrazit pouze na klávesu + Forçar somente mostrar em tecla ativada + + + Force Show Only on Cursor and Keypress + Wymuś pod kursorem i po wciśnięciu klawisza + Forzar mostrar en el cursor y al pulsar tecla + Vynuceno zobrazit pouze na kurzor a klávesu + Forçar mostrar somente em cursor e tecla ativada + + Use Nametag settings Użyj ustawień imion + Usar ajustes de etiquetas de nombre + Verwende Namenanzeigen + Použít nastavení jmenovky + Usar ajustes de etiquetas de nome - + Always Show All Zawsze pokazuj wszystkie + Mostrar siempre todo + Immer alle zeigen + Vždy zobrazit vše + Sempre mostrar tudo - - Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. + Show player names and set their activation. Default: Enabled + Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. + Mostrar nombres de los jugadores y establecer su activación. Predeterminado: Habilitado + Zobrazit jména hráčů a nastavit jejich aktivaci. Výchozí: Povoleno + Mostrar os nomes dos jogadores e definir sua ativação. Padrão: Ativado - + Effect of sound waves above the heads of speaking players after holding the PTT key. This option works with TFAR and ACRE2. Opcja ta pozwala dostosować sposób wyświetlania efektu fal dźwiękowych nad głowami mówiących graczy, wyświetlanych po przytrzymaniu klawisza PTT. Opcja ta współpracuje z TFAR oraz ACRE2. + Efecto de ondas sonoras encima de las cabezas de los jugadores que hablan después de mantener la tecla PTT. Esta opción funciona con TFAR y ACRE2. + Efekt zvukových vln nad hlavami hráčů když mluví skrz PTT klávesu. Tato volba funguje s TFAR a ACRE2. + Efeito de ondas sonoras acima das cabeças dos jogadores que falam depois mantendo pressionada a tecla PTT. Esta opção funciona com TFAR e ACRE2. + + + Nametags Size + Rozmiar imion + Tamaño de las Etiquetas de nombre + Velikost jmenovky + Tamanho das etiquetas de nome + + + Text and Icon Size Scaling + Skalowanie tekstu oraz ikon + Escala del texto y el icono + Velikost textu a ikon + Escala de tamanho dos ícones e textos - + \ No newline at end of file diff --git a/addons/nightvision/CfgWeapons.hpp b/addons/nightvision/CfgWeapons.hpp index c40885c2c4..8a053a3262 100644 --- a/addons/nightvision/CfgWeapons.hpp +++ b/addons/nightvision/CfgWeapons.hpp @@ -1,54 +1,54 @@ class CfgWeapons { class Binocular; class NVGoggles: Binocular { - displayName = "$STR_ACE_NightVision_NVG_Gen3_brown"; + displayName = CSTRING(NVG_Gen3_brown); ACE_NightVision_grain = 0.75; ACE_NightVision_blur = 0.055; ACE_NightVision_radBlur = 0.001; }; class NVGoggles_OPFOR: NVGoggles { - displayName = "$STR_ACE_NightVision_NVG_Gen3_black"; + displayName = CSTRING(NVG_Gen3_black); }; class NVGoggles_INDEP: NVGoggles { - displayName = "$STR_ACE_NightVision_NVG_Gen3_green"; + displayName = CSTRING(NVG_Gen3_green); }; class ACE_NVG_Gen1: NVGoggles_OPFOR { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen1"; + displayName = CSTRING(NVG_Gen1); ACE_NightVision_grain = 2.25; ACE_NightVision_blur = 0.22; ACE_NightVision_radBlur = 0.004; }; class ACE_NVG_Gen2: NVGoggles_INDEP { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen2"; + displayName = CSTRING(NVG_Gen2); ACE_NightVision_grain = 1.5; ACE_NightVision_blur = 0.11; ACE_NightVision_radBlur = 0.002; }; /*class ACE_NVG_Gen3: NVGoggles { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen3"; + displayName = CSTRING(NVG_Gen3); ACE_NightVision_grain = 0.75; ACE_NightVision_blur = 0.055; ACE_NightVision_radBlur = 0.001; };*/ class ACE_NVG_Gen4: NVGoggles { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen4"; + displayName = CSTRING(NVG_Gen4); ACE_NightVision_grain = 0.0; ACE_NightVision_blur = 0.0; ACE_NightVision_radBlur = 0.0; }; class ACE_NVG_Wide: NVGoggles { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); modelOptics = QUOTE(PATHTOF(models\ACE_nvg_wide_optics)); - displayName = "$STR_ACE_NightVision_NVG_FullScreen"; + displayName = CSTRING(NVG_FullScreen); ACE_NightVision_grain = 0.75; ACE_NightVision_blur = 0.055; ACE_NightVision_radBlur = 0.001; diff --git a/addons/nightvision/XEH_postInitClient.sqf b/addons/nightvision/XEH_postInitClient.sqf index 3edc3edad5..2839f6e5f9 100644 --- a/addons/nightvision/XEH_postInitClient.sqf +++ b/addons/nightvision/XEH_postInitClient.sqf @@ -37,10 +37,10 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; ["playerTurretChanged", {_this call FUNC(updatePPEffects)}] call EFUNC(common,addEventHandler); // Add keybinds -["ACE3 Equipment", QGVAR(IncreaseNVGBrightness), localize "STR_ACE_NightVision_IncreaseNVGBrightness", +["ACE3 Equipment", QGVAR(IncreaseNVGBrightness), localize LSTRING(IncreaseNVGBrightness), { // Conditions: canInteract - if !([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotEscorting", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if ((currentVisionMode ACE_player != 1)) exitWith {false}; @@ -51,10 +51,10 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; {false}, [201, [false, false, true]], false] call cba_fnc_addKeybind; //PageUp + ALT -["ACE3 Equipment", QGVAR(DecreaseNVGBrightness), localize "STR_ACE_NightVision_DecreaseNVGBrightness", +["ACE3 Equipment", QGVAR(DecreaseNVGBrightness), localize LSTRING(DecreaseNVGBrightness), { // Conditions: canInteract - if !([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotEscorting", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if ((currentVisionMode ACE_player != 1)) exitWith {false}; diff --git a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf index e1894aba00..22f96ce9b1 100644 --- a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf +++ b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf @@ -22,12 +22,12 @@ PARAMS_2(_player,_changeInBrightness); _brightness = _player getVariable [QGVAR(NVGBrightness), 0]; -_brightness = ((round (10 * _brightness + _changeInBrightness) / 10) min 1) max -1; +_brightness = ((round (10 * _brightness + _changeInBrightness) / 10) min 0.5) max -0.5; _player setVariable [QGVAR(NVGBrightness), _brightness, false]; -GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, _brightness / 4, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; +GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, (_brightness + 1), 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; GVAR(ppEffectNVGBrightness) ppEffectCommit 0; -[format [(localize "STR_ACE_NightVision_NVGBrightness"), (_brightness * 100)]] call EFUNC(common,displayTextStructured); +[format [(localize LSTRING(NVGBrightness)), (_brightness * 10)]] call EFUNC(common,displayTextStructured); playSound "ACE_Sound_Click"; diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 9fe8593e13..050945d5d8 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -5,7 +5,7 @@ NV Goggles (Gen1) Noktovizor (Gen1) JVN (Gen1) - NS-Brille (Gen1) + NS-Brille (1. Gen.) Occhiali notturni (Gen1) Gogle noktowizyjne (Gen1) Óculos de visão noturna (Gen1) @@ -17,7 +17,7 @@ NV Goggles (Gen2) Noktovizor (Gen2) JVN (Gen2) - NS-Brille (Gen2) + NS-Brille (2. Gen.) Occhiali notturni (Gen2) Gogle noktowizyjne (Gen2) Óculos de visão noturna (Gen2) @@ -29,7 +29,7 @@ NV Goggles (Gen3) Noktovizor (Gen3) JVN (Gen3) - NS-Brille (Gen3) + NS-Brille (3. Gen.) Occhiali notturni (Gen3) Gogle noktowizyjne (Gen3) Óculos de visão noturna (Gen3) @@ -41,7 +41,7 @@ NV Goggles (Gen3, Brown) Noktovizor (Gen3, hnědý) JVN (Gen3, marron) - NS-Brille (Gen3, Braun) + NS-Brille (3. Gen., braun) Occhiali notturni (Gen3, marroni) Gogle noktowizyjne (Gen3, brązowe) Óculos de visão noturna (Gen3, marrons) @@ -53,7 +53,7 @@ NV Goggles (Gen3, Green) Noktovizor (Gen3, zelený) JVN (Gen3, vertes) - NS-Brille (Gen3, Grün) + NS-Brille (3. Gen., grün) Occhiali notturni (Gen3, verdi) Gogle noktowizyjne (Gen3, zielone) Óculos de visão noturna (Gen3, verdes) @@ -65,7 +65,7 @@ NV Goggles (Gen3, Black) Noktovizor (Gen3, černý) JVN (Gen3, noires) - NS-Brille (Gen3, Schwarz) + NS-Brille (3. Gen., schwarz) Occhiali notturni (Gen3, neri) Gogle noktowizyjne (Gen3, czarne) Óculos de visão noturna (Gen3, pretos) @@ -77,7 +77,7 @@ NV Goggles (Gen4) Noktovizor (Gen4) JVN (Gen4) - NS-Brille (Gen4) + NS-Brille (4. Gen.) Occhiali notturni (Gen4) Gogle noktowizyjne (Gen4) Óculos de visão noturna (Gen4) @@ -134,4 +134,4 @@ Riduci la luminosità dell'NVG - + \ No newline at end of file diff --git a/addons/noradio/config.cpp b/addons/noradio/config.cpp index 5709806d8f..86697535f8 100644 --- a/addons/noradio/config.cpp +++ b/addons/noradio/config.cpp @@ -1,15 +1,15 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"commy2"}; - authorUrl = "https://github.com/commy2/"; - VERSION_CONFIG; - }; + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"commy2"}; + authorUrl = "https://github.com/commy2/"; + VERSION_CONFIG; + }; }; #include "CfgEventhandlers.hpp" diff --git a/addons/optics/CfgRscTitles.hpp b/addons/optics/CfgRscTitles.hpp index 068bb0aa20..b7d2005d77 100644 --- a/addons/optics/CfgRscTitles.hpp +++ b/addons/optics/CfgRscTitles.hpp @@ -41,7 +41,7 @@ class RscInGameUI { }; class ACE_RscWeapon_base: RscWeaponZeroing { - controls[] = {"CA_Zeroing","CA_FOVMode","ACE_DrawReticleHelper","ReticleDay","ReticleNight","BodyNight","BodyDay"}; // don't change this order + controls[] = {"CA_Zeroing","CA_FOVMode","ACE_DrawReticleHelper","ReticleDay","ReticleNight","BodyNight","BodyDay", "trippleHeadLeft", "trippleHeadRight"}; // don't change this order class CA_FOVMode: RscOpticsValue { // idea by Taosenai. Apparently this can be used via isNil check to determine wheter the scope or the kolimator is used idc = 154; @@ -70,9 +70,9 @@ class RscInGameUI { colorText[] = {1,1,1,0}; colorBackground[] = {0,0,0,0}; x = safezoneX+0.5*safezoneW-0.5*SIZEX; - y = safezoneY+0.5*safezoneH-0.5*SIZEX*safezoneW/safezoneH*(16/9)/(getResolution select 4); + y = safezoneY+0.5*safezoneH-0.5*SIZEX*(4/3); w = SIZEX; - h = SIZEX*safezoneW/safezoneH*(16/9)/(getResolution select 4); + h = SIZEX*(4/3); }; class ReticleNight: ReticleDay { @@ -86,15 +86,32 @@ class RscInGameUI { idc = 1713005; text = ""; x = safezoneX+0.5*safezoneW-0.5*SIZEX; - y = safezoneY+0.5*safezoneH-0.5*SIZEX*safezoneW/safezoneH*(16/9)/(getResolution select 4); + y = safezoneY+0.5*safezoneH-0.5*SIZEX*(4/3); w = SIZEX; - h = SIZEX*safezoneW/safezoneH*(16/9)/(getResolution select 4); + h = SIZEX*(4/3); }; class BodyNight: BodyDay { idc = 1713006; text = ""; }; + + //These are just black side panels to cover the areas that the optics p3d doesn't cover + //It will ONLY effect tripple head users as (safezoneX == safeZoneXAbs) for everyone else + //Reference PR #1156: + class trippleHeadLeft: RscText { + idc = 1713010; + x = "safeZoneXAbs"; + Y = "safezoneY"; + W = "(safezoneX - safeZoneXAbs) * ((getResolution select 4)/(16/3))"; + H = "safeZoneH"; + colorBackground[] = {0,0,0,1}; + }; + class trippleHeadRight: trippleHeadLeft { + idc = 1713011; + x = "safeZoneXAbs + safeZoneWAbs - (safezoneX - safeZoneXABS) * ((getResolution select 4)/(16/3))"; + colorBackground[] = {0,0,0,1}; + }; }; class ACE_RscWeapon_Hamr: ACE_RscWeapon_base { @@ -177,12 +194,12 @@ _ctrl = (D displayCtrl 1713006); _sizeX = 1.54/(getResolution select 5); _sizeY = _sizeX*safezoneW/safezoneH; -_ctrl ctrlSetPosition [ +_ctrl ctrlSetPosition [ safezoneX+0.5*safezoneW-0.5*_sizeX, safezoneY+0.5*safezoneH-0.5*_sizeY, - _sizeX, - _sizeY + _sizeX, + _sizeY ]; _ctrl ctrlCommit 0 -*/ + */ diff --git a/addons/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp index 5aa06f41a0..11fdb1f427 100644 --- a/addons/optics/CfgWeapons.hpp +++ b/addons/optics/CfgWeapons.hpp @@ -31,7 +31,7 @@ class CfgWeapons { }; /*class ACE_optic_DMS: optic_DMS { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_DMS"; scope = 1; displayName = "LOCALIZE ACE DMS"; @@ -71,9 +71,9 @@ class CfgWeapons { GVAR(ReticleDay) = QUOTE(PATHTOF(reticles\hamr-reticle65_ca.paa)); GVAR(ReticleNight) = QUOTE(PATHTOF(reticles\hamr-reticle65Illum_ca.paa)); - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_Hamr_2D"; - displayName = "$STR_ACE_optic_hamr"; + displayName = CSTRING(hamr); weaponInfoType = "ACE_RscWeapon_Hamr"; class ItemInfo: ItemInfo { @@ -96,10 +96,10 @@ class CfgWeapons { }; class ACE_optic_Hamr_PIP: ACE_optic_Hamr_2D { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_Hamr_PIP"; //scopeArsenal = 1; - displayName = "$STR_ACE_optic_hamr_pip"; + displayName = CSTRING(hamr_pip); class ItemInfo: ItemInfo { modelOptics = QUOTE(PATHTOF(models\ace_optics_pip.p3d)); @@ -121,9 +121,9 @@ class CfgWeapons { GVAR(ReticleDay) = QUOTE(PATHTOF(reticles\arco-reticle65_ca.paa)); GVAR(ReticleNight) = QUOTE(PATHTOF(reticles\arco-reticle65Illum_ca.paa)); - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_Arco_2D"; - displayName = "$STR_ACE_optic_arco"; + displayName = CSTRING(arco); weaponInfoType = "ACE_RscWeapon_Arco"; class ItemInfo: ItemInfo { @@ -145,10 +145,10 @@ class CfgWeapons { }; class ACE_optic_Arco_PIP: ACE_optic_Arco_2D { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_Arco_PIP"; //scopeArsenal = 1; - displayName = "$STR_ACE_optic_arco_pip"; + displayName = CSTRING(arco_pip); class ItemInfo: ItemInfo { modelOptics = QUOTE(PATHTOF(models\ace_optics_pip.p3d)); @@ -170,9 +170,9 @@ class CfgWeapons { GVAR(ReticleDay) = QUOTE(PATHTOF(reticles\mrco-reticle556_ca.paa)); GVAR(ReticleNight) = QUOTE(PATHTOF(reticles\mrco-reticle556Illum_ca.paa)); - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_MRCO_2D"; - displayName = "$STR_ACE_optic_valdada"; + displayName = CSTRING(valdada); weaponInfoType = "ACE_RscWeapon_MRCO"; class ItemInfo: ItemInfo { @@ -194,11 +194,11 @@ class CfgWeapons { }; class ACE_optic_MRCO_PIP: ACE_optic_MRCO_2D { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_MRCO_PIP"; scope = 1; //scopeArsenal = 1; - displayName = "$STR_ACE_optic_valdada_pip"; + displayName = CSTRING(valdada_pip); class ItemInfo: ItemInfo { modelOptics = QUOTE(PATHTOF(models\ace_optics_pip.p3d)); @@ -220,9 +220,9 @@ class CfgWeapons { GVAR(ReticleDay) = QUOTE(PATHTOF(reticles\sos-reticleMLR_ca.paa)); GVAR(ReticleNight) = QUOTE(PATHTOF(reticles\sos-reticleMLRIllum_ca.paa)); - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_SOS_2D"; - displayName = "$STR_ACE_optic_sos"; + displayName = CSTRING(sos); weaponInfoType = "ACE_RscWeapon_SOS"; class ItemInfo: ItemInfo { @@ -237,10 +237,10 @@ class CfgWeapons { }; class ACE_optic_SOS_PIP: ACE_optic_SOS_2D { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_SOS_PIP"; //scopeArsenal = 1; - displayName = "$STR_ACE_optic_sos_pip"; + displayName = CSTRING(sos_pip); class ItemInfo: ItemInfo { class OpticsModes: OpticsModes { @@ -266,9 +266,9 @@ class CfgWeapons { GVAR(ReticleDay) = QUOTE(PATHTOF(reticles\sos-reticleMLR_ca.paa)); GVAR(ReticleNight) = QUOTE(PATHTOF(reticles\sos-reticleMLRIllum_ca.paa)); - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_LRPS_2D"; - displayName = "$STR_ACE_optic_lrps"; + displayName = CSTRING(lrps); weaponInfoType = "ACE_RscWeapon_SOS"; class ItemInfo: ItemInfo { @@ -288,10 +288,10 @@ class CfgWeapons { }; class ACE_optic_LRPS_PIP: ACE_optic_LRPS_2D { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); _generalMacro = "ACE_optic_LRPS_PIP"; //scopeArsenal = 1; - displayName = "$STR_ACE_optic_lrps_pip"; + displayName = CSTRING(lrps_pip); class ItemInfo: ItemInfo { class OpticsModes: OpticsModes { diff --git a/addons/optics/XEH_postInit.sqf b/addons/optics/XEH_postInit.sqf index 7f68aece74..df6d0ae486 100644 --- a/addons/optics/XEH_postInit.sqf +++ b/addons/optics/XEH_postInit.sqf @@ -23,7 +23,7 @@ if (!hasInterface) exitWith {}; }; }] call EFUNC(common,addEventHandler); -// camera has to be re-created every time another camera is created. Otherwise r2t is either black or transparent. @todo Add popular custom cameras to the event in ACE_common. +// camera has to be re-created every ACE_time another camera is created. Otherwise r2t is either black or transparent. @todo Add popular custom cameras to the event in ACE_common. ["activeCameraChanged", { if !(_this select 1) then { deleteVehicle GVAR(camera); diff --git a/addons/optics/functions/fnc_handleFired.sqf b/addons/optics/functions/fnc_handleFired.sqf index 51da4c8ead..f0399c37fc 100644 --- a/addons/optics/functions/fnc_handleFired.sqf +++ b/addons/optics/functions/fnc_handleFired.sqf @@ -52,7 +52,7 @@ _scopeShiftY = _recoilCoef * linearConversion [0, 1, random 1, SCOPE_SHIFT_Y_MIN private ["_sizeX", "_sizeY"]; _sizeX = (0.75+_recoilScope)/(getResolution select 5); -_sizeY = _sizeX*safezoneW/safezoneH*(16/9)/(getResolution select 4); +_sizeY = _sizeX*(4/3); private "_positionReticle"; _positionReticle = [ @@ -83,7 +83,7 @@ _positionBody = [ // Bring them all back _sizeX = 0.75/(getResolution select 5); -_sizeY = _sizeX*safezoneW/safezoneH*(16/9)/(getResolution select 4); +_sizeY = _sizeX*(4/3); _positionReticle = [ safezoneX+0.5*safezoneW-0.5*_sizeX, diff --git a/addons/optics/functions/fnc_onDrawScope2D.sqf b/addons/optics/functions/fnc_onDrawScope2D.sqf index 30cdb927c7..7abee8f122 100644 --- a/addons/optics/functions/fnc_onDrawScope2D.sqf +++ b/addons/optics/functions/fnc_onDrawScope2D.sqf @@ -12,24 +12,29 @@ if (!ctrlShown (_display displayCtrl 154)) exitWith { (_display displayCtrl 1713002) ctrlShow false; (_display displayCtrl 1713005) ctrlShow false; (_display displayCtrl 1713006) ctrlShow false; -}; - -GVAR(camera) setposATL positioncameratoworld [0,0,0.4]; -GVAR(camera) camPrepareTarget positioncameratoworld [0,0,50]; -GVAR(camera) camCommitPrepared 0; - -// @todo, check if that needs to be done at all -if (cameraView == "GUNNER") then { - GVAR(camera) camsetFOV 0.7; - GVAR(camera) camcommit 0; -} else { - GVAR(camera) camsetFOV 0.01; - GVAR(camera) camcommit 0; + (_display displayCtrl 1713010) ctrlShow false; + (_display displayCtrl 1713011) ctrlShow false; }; // @todo, all weapon types -private "_optic"; +private ["_optic", "_isPIP"]; _optic = (primaryWeaponItems ACE_player) select 2; +_isPIP = (getText (configFile >> "CfgWeapons" >> _optic >> "ItemInfo" >> "modelOptics")) == QUOTE(PATHTOF(models\ace_optics_pip.p3d)); + +if (_isPIP) then { + GVAR(camera) setposATL positioncameratoworld [0,0,0.4]; + GVAR(camera) camPrepareTarget positioncameratoworld [0,0,50]; + GVAR(camera) camCommitPrepared 0; + + // @todo, check if that needs to be done at all + if (cameraView == "GUNNER") then { + GVAR(camera) camsetFOV 0.7; + GVAR(camera) camcommit 0; + } else { + GVAR(camera) camsetFOV 0.01; + GVAR(camera) camcommit 0; + }; +}; // calculate lighting private ["_dayOpacity", "_nightOpacity"]; @@ -48,9 +53,11 @@ _nightOpacity = [1,0] select (_dayOpacity == 1); (_display displayCtrl 1713002) ctrlCommit 0; (_display displayCtrl 1713005) ctrlCommit 0; (_display displayCtrl 1713006) ctrlCommit 0; -*/ + */ (_display displayCtrl 1713001) ctrlShow true; (_display displayCtrl 1713002) ctrlShow true; (_display displayCtrl 1713005) ctrlShow true; (_display displayCtrl 1713006) ctrlShow true; +(_display displayCtrl 1713010) ctrlShow _isPIP; +(_display displayCtrl 1713011) ctrlShow _isPIP; diff --git a/addons/optics/stringtable.xml b/addons/optics/stringtable.xml index f9964c4310..a6818a90d3 100644 --- a/addons/optics/stringtable.xml +++ b/addons/optics/stringtable.xml @@ -1,7 +1,7 @@  - + RCO (2D) RCO (2D) RCO (2D) @@ -13,7 +13,7 @@ RCO (2D) RCO (2D) - + RCO (PIP) RCO (PIP) RCO (PIP) @@ -25,7 +25,7 @@ RCO (PIP) RCO (PIP) - + ARCO (2D) ARCO (2D) ARCO (2D) @@ -37,7 +37,7 @@ ARCO (2D) ARCO (2D) - + ARCO (PIP) ARCO (PIP) ARCO (PIP) @@ -49,7 +49,7 @@ ARCO (PIP) ARCO (PIP) - + MRCO (2D) MRCO (2D) MRCO (2D) @@ -61,7 +61,7 @@ MRCO (2D) MRCO (2D) - + MRCO (PIP) MRCO (PIP) MRCO (PIP) @@ -73,7 +73,7 @@ MRCO (PIP) MRCO (PIP) - + MOS (2D) MOS (2D) MOS (2D) @@ -85,7 +85,7 @@ MOS (2D) MOS (2D) - + MOS (PIP) MOS (PIP) MOS (PIP) @@ -97,7 +97,7 @@ MOS (PIP) MOS (PIP) - + LRPS (2D) LRPS (2D) LRPS (2D) @@ -109,7 +109,7 @@ MPLD (2D) LRPS (2D) - + LRPS (PIP) LRPS (PIP) LRPS (PIP) diff --git a/addons/optionsmenu/ACE_Settings.hpp b/addons/optionsmenu/ACE_Settings.hpp index ad910e4661..0badbad660 100644 --- a/addons/optionsmenu/ACE_Settings.hpp +++ b/addons/optionsmenu/ACE_Settings.hpp @@ -3,7 +3,13 @@ class ACE_Settings { value = 0; typeName = "SCALAR"; isClientSettable = 1; - displayName = "$STR_ACE_optionsMenu_uiScaing"; + displayName = CSTRING(uiScaing); values[] = {"$str_medium", "$str_large", "$str_very_large"}; }; + class GVAR(showNewsOnMainMenu) { + value = 1; + typeName = "BOOL"; + isClientSettable = 1; + displayName = CSTRING(showNewsOnMainMenu_name); + }; }; diff --git a/addons/optionsmenu/CfgVehicles.hpp b/addons/optionsmenu/CfgVehicles.hpp index 52895acb66..1357417add 100644 --- a/addons/optionsmenu/CfgVehicles.hpp +++ b/addons/optionsmenu/CfgVehicles.hpp @@ -2,25 +2,25 @@ class CfgVehicles { class ACE_Module; class ACE_moduleAllowConfigExport: ACE_Module { scope = 2; - displayName = "$STR_AllowConfigExport_Module_DisplayName"; + displayName = CSTRING(AllowConfigExport_Module_DisplayName); //icon = ""; category = "ACE"; function = QUOTE(DFUNC(moduleAllowConfigExport)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class allowconfigurationExport { - displayName = "$STR_AllowConfigExport_allowconfigurationExport_DisplayName"; - description = "$STR_AllowConfigExport_allowconfigurationExport_Description"; + displayName = CSTRING(AllowConfigExport_allowconfigurationExport_DisplayName); + description = CSTRING(AllowConfigExport_allowconfigurationExport_Description); typeName = "BOOL"; defaultValue = 1; }; }; class ModuleDescription { - description = "$STR_AllowConfigExport_Module_Description"; + description = CSTRING(AllowConfigExport_Module_Description); sync[] = {}; }; }; -}; \ No newline at end of file +}; diff --git a/addons/optionsmenu/XEH_preInit.sqf b/addons/optionsmenu/XEH_preInit.sqf index 42f50287f2..e35784560a 100644 --- a/addons/optionsmenu/XEH_preInit.sqf +++ b/addons/optionsmenu/XEH_preInit.sqf @@ -2,6 +2,7 @@ ADDON = false; +PREP(debugDumpToClipboard); PREP(onListBoxSettingsChanged); PREP(onListBoxShowSelectionChanged); PREP(onSettingsMenuOpen); diff --git a/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf new file mode 100644 index 0000000000..755982e569 --- /dev/null +++ b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf @@ -0,0 +1,87 @@ +/* + * Author: PabstMirror + * Dumps debug info to clipboard. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ACE_optionsmenu_fnc_debugDumpToClipboard + * + * Public: No + */ +#include "script_component.hpp" + +private ["_var", "_unit", "_outputText", "_text"]; + +#define MIN_ARRAY_SIZE 10 + +_outputText = { + diag_log text (_this select 0); + "ace_clipboard" callExtension ((_this select 0) + " +"); +}; + +_text = format ["~~~~~~~~~ACE Debug~~~~~~~~~ +time = %1 + +------Performance------ +diag_fps = %2 +count ace_common_waitAndExecArray = %3 +count cba_common_perFrameHandlerArray = %4 (max %5) +count diag_activeSQFScripts = %6 +count diag_activeSQSScripts = %7 +count diag_activeMissionFSMs = %8", +time, diag_fps, count ace_common_waitAndExecArray, {!isNil "_x"} count cba_common_perFrameHandlerArray, count cba_common_perFrameHandlerArray, count diag_activeSQFScripts, count diag_activeSQSScripts,count diag_activeMissionFSMs]; +[_text] call _outputText; + + +_text = format [" +------Player------ +typeOf = %1 +animationState = %2", +if (isNull ace_player) then {"null"} else {typeOf ace_player}, +if (isNull ace_player) then {"null"} else {animationState ace_player}]; +[_text] call _outputText; + + +_text = format [" +------ACE Settings------"]; +[_text] call _outputText; + + +{ + _var = missionNamespace getVariable [(_x select 0), "ERROR: Not Defined"]; + _text = format ["%1 - %2", (_x select 0), _var]; + [_text] call _outputText; +} forEach EGVAR(common,settings); + + +_text = format [" +------Array Info (count >= %1)------", MIN_ARRAY_SIZE]; +[_text] call _outputText; + + +{ + _var = missionNamespace getVariable [_x, nil]; + if(!isnil "_var" && {(typeName _var) == "ARRAY"} && {(count _var) > MIN_ARRAY_SIZE}) then { + _text = format ["%1 - ARRAY SIZE: %2", _x, (count _var)]; + [_text] call _outputText; + }; +} forEach (allVariables missionNamespace); + +{ + _unit = _x; + { + _var = _unit getVariable [_x, nil]; + if(!isnil "_var" && {(typeName _var) == "ARRAY"} && {(count _var) > MIN_ARRAY_SIZE}) then { + _text = format ["%1 on [%2] - ARRAY SIZE: %3", _x, _unit, (count _var)]; + [_text] call _outputText; + }; + } forEach (allVariables _unit); +} forEach allUnits; + +"ace_clipboard" callExtension "--COMPLETE--"; diff --git a/addons/optionsmenu/functions/fnc_exportSettings.sqf b/addons/optionsmenu/functions/fnc_exportSettings.sqf index 68dc7fbecd..fa76b8752a 100644 --- a/addons/optionsmenu/functions/fnc_exportSettings.sqf +++ b/addons/optionsmenu/functions/fnc_exportSettings.sqf @@ -18,8 +18,6 @@ private ["_compiledConfig", "_name", "_typeName", "_isClientSetable", "_localizedName", "_localizedDescription", "_possibleValues", "_defaultValue", "_value", "_compiledConfigEntry"]; -_compiledConfig = " -"; { /*_settingData = [ _name, @@ -55,26 +53,12 @@ class %1 { force = 1; };", _name, _value, format['"%1"', _typeName]]; - _compiledConfig = _compiledConfig + _compiledConfigEntry; + "ace_clipboard" callExtension _compiledConfigEntry; }; } forEach EGVAR(common,settings); -FUNC(clipboardExport) = { - private["_chunks"]; - _chunks = []; - - _chunks = [_this select 0, ";"] call CBA_fnc_split; - - { - private["_chunk"]; - _chunk = _x + ";"; - "ace_clipboard" callExtension format["%1", _chunk]; - } forEach _chunks; - - "ace_clipboard" callExtension "--COMPLETE--"; -}; -[_compiledConfig] call FUNC(clipboardExport); + "ace_clipboard" callExtension "--COMPLETE--"; -["STR_ACE_OptionsMenu_settingsExported"] call EFUNC(common,displayTextStructured); +[LSTRING(settingsExported)] call EFUNC(common,displayTextStructured); diff --git a/addons/optionsmenu/functions/fnc_onListBoxShowSelectionChanged.sqf b/addons/optionsmenu/functions/fnc_onListBoxShowSelectionChanged.sqf index 25fd99b5d8..0ddcc8d2a9 100644 --- a/addons/optionsmenu/functions/fnc_onListBoxShowSelectionChanged.sqf +++ b/addons/optionsmenu/functions/fnc_onListBoxShowSelectionChanged.sqf @@ -26,7 +26,7 @@ _settingsMenu = uiNamespace getVariable 'ACE_settingsMenu'; switch (GVAR(optionMenu_openTab)) do { case (MENU_TAB_OPTIONS): { - _localizedHeader = format ["%1: %2", (localize "STR_ACE_OptionsMenu_OpenConfigMenu"), (localize "STR_ACE_OptionsMenu_TabOptions")]; + _localizedHeader = format ["%1: %2", (localize LSTRING(OpenConfigMenu)), (localize LSTRING(TabOptions))]; ctrlSetText [13, _localizedHeader]; lbClear 400; @@ -39,7 +39,7 @@ case (MENU_TAB_OPTIONS): { (_settingsMenu displayCtrl 413) ctrlShow false; }; case (MENU_TAB_COLORS): { - _localizedHeader = format ["%1: %2", (localize "STR_ACE_OptionsMenu_OpenConfigMenu"), (localize "STR_ACE_OptionsMenu_TabColors")]; + _localizedHeader = format ["%1: %2", (localize LSTRING(OpenConfigMenu)), (localize LSTRING(TabColors))]; ctrlSetText [13, _localizedHeader]; lbClear 400; diff --git a/addons/optionsmenu/functions/fnc_onServerListBoxShowSelectionChanged.sqf b/addons/optionsmenu/functions/fnc_onServerListBoxShowSelectionChanged.sqf index aaeec2d9ac..669faf74ed 100644 --- a/addons/optionsmenu/functions/fnc_onServerListBoxShowSelectionChanged.sqf +++ b/addons/optionsmenu/functions/fnc_onServerListBoxShowSelectionChanged.sqf @@ -26,7 +26,7 @@ _settingsMenu = uiNamespace getVariable 'ACE_serverSettingsMenu'; switch (GVAR(optionMenu_openTab)) do { case (MENU_TAB_SERVER_OPTIONS): { - _localizedHeader = format ["%1: %2", (localize "STR_ACE_OptionsMenu_OpenConfigMenu"), (localize "STR_ACE_OptionsMenu_TabOptions")]; + _localizedHeader = format ["%1: %2", (localize LSTRING(OpenConfigMenu)), (localize LSTRING(TabOptions))]; ctrlSetText [13, _localizedHeader]; lbClear 400; @@ -43,7 +43,7 @@ case (MENU_TAB_SERVER_OPTIONS): { (_settingsMenu displayCtrl 416) ctrlEnable false; }; case (MENU_TAB_SERVER_COLORS): { - _localizedHeader = format ["%1: %2", (localize "STR_ACE_OptionsMenu_OpenConfigMenu"), (localize "STR_ACE_OptionsMenu_TabColors")]; + _localizedHeader = format ["%1: %2", (localize LSTRING(OpenConfigMenu)), (localize LSTRING(TabColors))]; ctrlSetText [13, _localizedHeader]; lbClear 400; @@ -67,7 +67,7 @@ case (MENU_TAB_SERVER_COLORS): { (_settingsMenu displayCtrl 416) ctrlEnable false; }; case (MENU_TAB_SERVER_VALUES): { - _localizedHeader = format ["%1: %2", (localize "STR_ACE_OptionsMenu_OpenConfigMenu"), (localize "STR_ACE_OptionsMenu_TabValues")]; + _localizedHeader = format ["%1: %2", (localize LSTRING(OpenConfigMenu)), (localize LSTRING(TabValues))]; ctrlSetText [13, _localizedHeader]; lbClear 400; diff --git a/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf b/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf index f5501d0860..4f96438042 100644 --- a/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf +++ b/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf @@ -61,7 +61,7 @@ _menu = uiNamespace getvariable "ACE_serverSettingsMenu"; (_menu displayCtrl 1003) ctrlEnable false; if (GVAR(ClientSettingsExportIncluded)) then { - (_settingsMenu displayCtrl 1102) ctrlSetText localize ("STR_ACE_OptionsMenu_exClientSettings"); + (_settingsMenu displayCtrl 1102) ctrlSetText localize (LSTRING(exClientSettings)); } else { - (_settingsMenu displayCtrl 1102) ctrlSetText localize ("STR_ACE_OptionsMenu_inClientSettings"); + (_settingsMenu displayCtrl 1102) ctrlSetText localize (LSTRING(inClientSettings)); }; diff --git a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf index 52984b78f3..9daee053bb 100644 --- a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf +++ b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf @@ -56,8 +56,8 @@ if (count _collection > 0) then { // Created disable/enable options for bools if ((_setting select 1) == "BOOL") then { lbClear 400; - lbAdd [400, (localize "STR_ACE_OptionsMenu_Disabled")]; - lbAdd [400, (localize "STR_ACE_OptionsMenu_Enabled")]; + lbAdd [400, (localize LSTRING(Disabled))]; + lbAdd [400, (localize LSTRING(Enabled))]; _settingsValue = [0, 1] select _settingsValue; } else { lbClear 400; @@ -77,10 +77,10 @@ if (count _collection > 0) then { // Created disable/enable options for bools _expectedType = switch (_setting select 1) do { - case "STRING": {"STR_ACE_OptionsMenu_stringType"}; - case "ARRAY": {"STR_ACE_OptionsMenu_arrayType"}; - case "SCALAR": {"STR_ACE_OptionsMenu_scalarType"}; - default {"STR_ACE_optionsMenu_unknownType"}; + case "STRING": {LSTRING(stringType)}; + case "ARRAY": {LSTRING(arrayType)}; + case "SCALAR": {LSTRING(scalarType)}; + default {LSTRING(unknownType)}; }; (_settingsMenu displayCtrl 414) ctrlSetText format["%1", _settingsValue]; (_settingsMenu displayCtrl 415) ctrlSetText format[localize _expectedType]; diff --git a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf index dad3012e1b..f3e393bbfd 100644 --- a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf +++ b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf @@ -37,7 +37,7 @@ switch (GVAR(optionMenu_openTab)) do { // Created disable/enable options for bools _settingsText = if ((_x select 1) == "BOOL") then { - [(localize "STR_ACE_OptionsMenu_Disabled"), (localize "STR_ACE_OptionsMenu_Enabled")] select _settingsValue; + [(localize LSTRING(Disabled)), (localize LSTRING(Enabled))] select _settingsValue; } else { (_x select 5) select _settingsValue; }; diff --git a/addons/optionsmenu/functions/fnc_settingsMenuUpdateKeyView.sqf b/addons/optionsmenu/functions/fnc_settingsMenuUpdateKeyView.sqf index 39bbdb8c94..3777093ccd 100644 --- a/addons/optionsmenu/functions/fnc_settingsMenuUpdateKeyView.sqf +++ b/addons/optionsmenu/functions/fnc_settingsMenuUpdateKeyView.sqf @@ -56,8 +56,8 @@ if (count _collection > 0) then { // Created disable/enable options for bools if ((_setting select 1) == "BOOL") then { lbClear 400; - lbAdd [400, (localize "STR_ACE_OptionsMenu_Disabled")]; - lbAdd [400, (localize "STR_ACE_OptionsMenu_Enabled")]; + lbAdd [400, (localize LSTRING(Disabled))]; + lbAdd [400, (localize LSTRING(Enabled))]; _settingsValue = [0, 1] select _settingsValue; } else { lbClear 400; diff --git a/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf b/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf index 513b187d7d..fdd9128ca3 100644 --- a/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf +++ b/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf @@ -34,7 +34,7 @@ switch (GVAR(optionMenu_openTab)) do { // Created disable/enable options for bools _settingsText = if ((_x select 1) == "BOOL") then { - [(localize "STR_ACE_OptionsMenu_Disabled"), (localize "STR_ACE_OptionsMenu_Enabled")] select _settingsValue; + [(localize LSTRING(Disabled)), (localize LSTRING(Enabled))] select _settingsValue; } else { (_x select 5) select _settingsValue; }; diff --git a/addons/optionsmenu/gui/define.hpp b/addons/optionsmenu/gui/define.hpp index cb4fe1b509..2a3fffc736 100644 --- a/addons/optionsmenu/gui/define.hpp +++ b/addons/optionsmenu/gui/define.hpp @@ -7,6 +7,9 @@ class ACE_gui_staticBase; class ACE_gui_listNBox; class ACE_gui_comboBoxBase; class RscXSliderH; +class RscControlsGroupNoScrollbars; +class RscHTML; +class RscText; #ifndef ACE_DEFINE_H diff --git a/addons/optionsmenu/gui/pauseMenu.hpp b/addons/optionsmenu/gui/pauseMenu.hpp index c4cbae9916..d80547f2b6 100644 --- a/addons/optionsmenu/gui/pauseMenu.hpp +++ b/addons/optionsmenu/gui/pauseMenu.hpp @@ -60,7 +60,7 @@ class ACE_Open_SettingsMenu_BtnBase : ACE_gui_buttonBase { soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1}; soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1}; style = "0x02 + 0xC0"; - text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; + text = CSTRING(OpenConfigMenu); textureNoShortcut = "#(argb,8,8,3)color(0,0,0,0)"; tooltip = ""; tooltipColorBox[] = {1,1,1,1}; @@ -98,12 +98,73 @@ class RscDisplayInterruptEditor3D: RscStandardDisplay { class RscDisplayMain: RscStandardDisplay { //Hide the button if there is no world (-world=empty) //Seems odd to use onMouseMoving, but I don't want to overload onLoad - onMouseMoving = "((_this select 0) displayCtrl 80085) ctrlShow (missionName != '');"; + onMouseMoving = QUOTE(((_this select 0) displayCtrl 80085) ctrlShow (missionName != ''); _this execVM QUOTE(QUOTE(PATHTOF(script_loadMainMenuBox.sqf)));); + class controls { class ACE_Open_settingsMenu_Btn : ACE_Open_SettingsMenu_BtnBase { action = "if (missionName != '') then {createDialog 'ACE_settingsMenu';};"; y = "4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + safezoneY"; idc = 80085; }; + + class ACE_news: RscControlsGroupNoScrollbars { + idc = 80086; + x = "safezoneX + safezoneW - (16 *(((safezoneW / safezoneH) min 1.2) / 40))"; + y = "safezoneY + (18.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))"; + w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "4.95 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + class controls { + class ACE_NewsTitle: RscText { + text = CSTRING(aceNews); + colorBackground[] = {(162/255),(28/255),(28/255),0.8}; + idc = -1; + x = "0 * (((safezoneW / safezoneH) min 1.2) / 40)"; + y = "0 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "15 *(((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; + class ACE_VersionInfo: RscText { + idc = 68; + x = "0 * (((safezoneW / safezoneH) min 1.2) / 40)"; + y = "1.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.5}; + }; + class ACE_NewsBackground: RscText { + idc = -1; + x = "0 * (((safezoneW / safezoneH) min 1.2) / 40)"; + y = "2.2 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "15 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "5.75 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.5}; + }; + class ACE_NewsText: RscHTML { + idc = 69; + x = "0.5 * (((safezoneW / safezoneH) min 1.2) / 40)"; + y = "2.2 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w = "14 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "2.75 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + + shadow = 0; + class H1 { + font = "PuristaMedium"; + fontBold = "PuristaLight"; + sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.4)"; + }; + class H2: H1 { + sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; + font = "PuristaLight"; + }; + class P: H1 { + sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + fontBold = "PuristaLight"; + }; + colorBold[] = {0.6,0.6,0.6,1}; + colorLink[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorLinkActive[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + }; + }; + }; }; }; diff --git a/addons/optionsmenu/gui/settingsMenu.hpp b/addons/optionsmenu/gui/settingsMenu.hpp index 04e7ee5aaa..fc3a90c66e 100644 --- a/addons/optionsmenu/gui/settingsMenu.hpp +++ b/addons/optionsmenu/gui/settingsMenu.hpp @@ -71,7 +71,7 @@ class ACE_settingsMenu { SizeEx = H_PART(1); colorText[] = {0.95, 0.95, 0.95, 0.75}; colorBackground[] = {0,0,0,0}; - text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; + text = CSTRING(OpenConfigMenu); }; class labelSubHeader: ACE_gui_staticBase { idc = 13; @@ -83,7 +83,7 @@ class ACE_settingsMenu { }; class selectionAction_1: ACE_gui_buttonBase { idc = 1000; - text = "$STR_ACE_OptionsMenu_TabOptions"; + text = CSTRING(TabOptions); x = X_PART(1); y = Y_PART(2.1); w = W_PART(9.5); @@ -109,7 +109,7 @@ class ACE_settingsMenu { }; class selectionAction_2: selectionAction_1 { idc = 1001; - text = "$STR_ACE_OptionsMenu_TabColors"; + text = CSTRING(TabColors); x = X_PART(10.5); action = QUOTE([MENU_TAB_COLORS] call FUNC(onListBoxShowSelectionChanged);); }; @@ -158,7 +158,7 @@ class ACE_settingsMenu { class Label2: labelKey { idc = 301; y = Y_PART(7.3); - text = "$STR_ACE_OptionsMenu_Setting"; + text = CSTRING(Setting); SizeEx = H_PART(1); }; class comboBox1: ACE_gui_comboBoxBase { @@ -238,15 +238,22 @@ class ACE_settingsMenu { }; class action_reset: actionClose { idc = 1100; - text = "$STR_ACE_OptionsMenu_ResetAll"; + text = CSTRING(ResetAll); x = X_PART(9.5); action = QUOTE([] call FUNC(resetSettings)); }; class action_exportServerConfig: actionClose { idc = 1102; - text = "$STR_ACE_OptionsMenu_OpenExport"; + text = CSTRING(OpenExport); x = X_PART(18); action = QUOTE(if (GVAR(serverConfigGeneration) > 0) then {createDialog 'ACE_serverSettingsMenu'; }); + }; + class action_debug: actionClose { + idc = 1102; + text = CSTRING(DumpDebug); + x = X_PART(26.5); + action = QUOTE([] call FUNC(debugDumpToClipboard)); + tooltip = CSTRING(DumpDebugTooltip); }; }; }; @@ -266,7 +273,7 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { SizeEx = H_PART(1); colorText[] = {0.95, 0.95, 0.95, 0.75}; colorBackground[] = {0,0,0,0}; - text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; + text = CSTRING(OpenConfigMenu); }; class labelSubHeader: ACE_gui_staticBase { idc = 13; @@ -278,7 +285,7 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { }; class selectionAction_1: ACE_gui_buttonBase { idc = 1000; - text = "$STR_ACE_OptionsMenu_TabOptions"; + text = CSTRING(TabOptions); x = X_PART(1); y = Y_PART(2.1); w = W_PART(9.5); @@ -302,13 +309,13 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { }; class selectionAction_2: selectionAction_1 { idc = 1001; - text = "$STR_ACE_OptionsMenu_TabColors"; + text = CSTRING(TabColors); x = X_PART(10.5); action = QUOTE([MENU_TAB_SERVER_COLORS] call FUNC(onServerListBoxShowSelectionChanged);); }; class selectionAction_3: selectionAction_1 { idc = 1002; - text = "$STR_ACE_OptionsMenu_TabValues"; + text = CSTRING(TabValues); x = X_PART(20); action = QUOTE([MENU_TAB_SERVER_VALUES] call FUNC(onServerListBoxShowSelectionChanged);); }; @@ -351,7 +358,7 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { class Label2: labelKey { idc = 301; y = Y_PART(7.3); - text = "$STR_ACE_OptionsMenu_Setting"; + text = CSTRING(Setting); SizeEx = H_PART(1); }; class comboBox1: ACE_gui_comboBoxBase { @@ -411,7 +418,7 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { }; class saveInputButton: selectionAction_1 { idc = 416; - text = "$STR_ACE_OptionsMenu_SaveInput"; + text = CSTRING(SaveInput); x = X_PART(27.1); y = Y_PART(9.1); w = W_PART(11); @@ -432,19 +439,19 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { class actionClose; class action_reset: actionClose { idc = 1100; - text = "$STR_ACE_OptionsMenu_ResetAll"; + text = CSTRING(ResetAll); x = X_PART(26.1); action = QUOTE([] call FUNC(serverResetSettings)); }; class action_exportServerConfig: actionClose { idc = 1101; - text = "$STR_ACE_OptionsMenu_Export"; + text = CSTRING(Export); x = X_PART(1); action = QUOTE([] call FUNC(exportSettings)); }; class action_toggleIncludeClientSettings: actionClose { idc = 1102; - text = "$STR_ACE_OptionsMenu_inClientSettings"; + text = CSTRING(inClientSettings); x = X_PART(9); action = QUOTE([] call FUNC(toggleIncludeClientSettings)); }; diff --git a/addons/optionsmenu/script_component.hpp b/addons/optionsmenu/script_component.hpp index 7b86dbe0dd..d25caa2c42 100644 --- a/addons/optionsmenu/script_component.hpp +++ b/addons/optionsmenu/script_component.hpp @@ -1,6 +1,6 @@ #define COMPONENT optionsmenu -#define DEBUG_MODE_FULL +// #define DEBUG_MODE_FULL #include "\z\ace\addons\main\script_mod.hpp" diff --git a/addons/optionsmenu/script_loadMainMenuBox.sqf b/addons/optionsmenu/script_loadMainMenuBox.sqf new file mode 100644 index 0000000000..9c556e5128 --- /dev/null +++ b/addons/optionsmenu/script_loadMainMenuBox.sqf @@ -0,0 +1,31 @@ +/* + * Author: PabstMirror + * Loads the version info HTML box from main menu + * + * Arguments: + * 0: Display (from onMouseMoving) + * + * Return Value: + * None + * + * Example: + * onMouseMovingEvent execVM "script_loadMainMenuBox.sqf"; + * + * Public: No + */ +#include "script_component.hpp" + +if (missionNamespace getVariable [QGVAR(newsLoaded), false]) exitWith {}; +GVAR(newsLoaded) = true; + +//Need to load from profileNamespace because ace_settings might not be init if world = empty +if (profileNamespace getVariable [QGVAR(showNewsOnMainMenu), true]) then { + ((_this select 0) displayCtrl 80086) ctrlShow true; + + private ["_version"]; + _version = getText (configFile >> "CfgPatches" >> "ace_main" >> "versionStr"); + ((_this select 0) displayCtrl 68) ctrlSetText format ["Installed Version: %1", _version]; + ((_this select 0) displayCtrl 69) htmlLoad "http://ace3mod.com/version.html"; +} else { + ((_this select 0) displayCtrl 80086) ctrlShow false; +}; diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 22a1a88cfa..7b4d88f61f 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -3,7 +3,7 @@ ACE Options - ACE Optionen + ACE-Optionen Opciones ACE Ustawienia ACE ACE Nastavení @@ -169,7 +169,7 @@ Numero Número - + Uknown input type Unbekannter Eingabetyp Tipo de entrada desconocida @@ -229,7 +229,7 @@ Parametri esportati alla clipboard Opções exportadas para o clipboard. - + Option Menu UI Scaling Menu option: taille de l'UI Skalowanie UI menu ustawień @@ -241,49 +241,117 @@ Escalar o menu de opções Proporzioni della interfaccia utente - + Allow Config Export [ACE] Pozwól na eksport ustawień [ACE] + [ACE] Permitir exportar configuración + Erlaube Config-Export [ACE] + Povolit export natavení [ACE] + [ACE] Permitir exportação de configurações - + Allow Zezwól + Permitir + Erlaube + Povolit + Permitir - + Allow export of all settings to a server config formatted. Zezwól na eksport wszystkich ustawień do formatu konfiguracji serwera. + Permitir la exportación de todos los ajustes de configuración a un servidor con formato. + Erlaube alle Einstellungen in einer Server-Config zu exportieren. + Povolit exportovat všechna nastavení do formátu server configu. + Permitir exportação de todas as configurações para uma configuração formatada de servidor. - + When allowed, you have access to the settings modification and export in SP. Clicking export will place the formated config on your clipboard. Jeżeli ustawione na zezwól, wtedy będziesz mieć dostęp do ekranu modyfikacji wszystich ustawień i zmiennych ACE, a także będziesz mieć możliwość eksportu tychże ustawień do formatu rozpoznawalnego przez userconfig serwera. Kliknięcie opcji Eksportuj skopiuje wszystkie ustawienia do schowka. Działa tylko w trybie SP. + Cuando esta permitido, se tiene acceso a los ajustes de modificación y exportación en SP. Pulsar en exportar copiara la configuración al portapapeles. + Wenn erlaubt, können die Einstellungsmodifikationen angezeigt und im SP exportiert werden. Wenn auf "Exportieren" geklickt wird, wird eine formatierte Config-Datei in der Zwischenablage abgespeichert. + Pokud je povoleno, budete mít přístup k modifikaci nastavení a exportování v SP. Kliknutím na export umístníte formátovaný config do vaší schránky. + Quando permitido, você tem acesso à modificação de definições e exportação em SP. Clicando em exportação colocará a configuração formatada em sua área de transferência. - + Hide Ukryj + Ocultar + Verstecken + Skrýt + Ocultar - + Top right, downwards Po prawej u góry, w dół + Arriba a la derecha, hacia abajo + Open rechts, nach unten + Vpravo nahoře, dolů + Superior direito, para baixo - + Top right, to the left Po prawej u góry, do lewej + Arriba a la derecha, hacia la izquierda + Von rechts nach links + Vpravo nahoře, do leva + Superior direito, à esquerda - + Top left, downwards Po lewej u góry, w dół + Arriba a la izquierda, hacia abajo + Von links, nach unten + Vlevo nahoře, dolů + Superior esquerdo, para baixo - + Top left, to the right Po lewej u góry, do prawej + Arriba a la izquierda, hacia la derecha + Oben links nach rechts + Vlevo nahoře, do prava + Superior esquerdo, para a direita - + Top Góra + Arriba + Oben + Nahoře + Acima - + Bottom Dół + Abajo + Unten + Dole + Abaixo + + + Debug To Clipboard + Debuguj do schowka + Depurar al portapapeles + Debug do schránky + Depuração para área de transferência + + + Sends debug information to RPT and clipboard. + Wysyła informacje o debugowaniu do RPT oraz schowka. + Envía información de depuración al RPT y el portapapeles. + Pošle debug informace do RPT a schránky. + Envia informação de depuração para RPT e área de transferência. + + + ACE News + Noticias ACE + Notícias do ACE + + + Show News on Main Menu + Mostrar noticias en el menú principal + Mostrar notícias no menu principal - + \ No newline at end of file diff --git a/addons/overheating/ACE_Settings.hpp b/addons/overheating/ACE_Settings.hpp index f68898c434..2d63614a40 100644 --- a/addons/overheating/ACE_Settings.hpp +++ b/addons/overheating/ACE_Settings.hpp @@ -3,7 +3,7 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; value = 1; - displayName = "$STR_ACE_overheating_SettingDisplayTextName"; - description = "$STR_ACE_overheating_SettingDisplayTextDesc"; + displayName = CSTRING(SettingDisplayTextName); + description = CSTRING(SettingDisplayTextDesc); }; }; diff --git a/addons/overheating/CfgVehicles.hpp b/addons/overheating/CfgVehicles.hpp index 5c7f7b9eb6..a198ef71b6 100644 --- a/addons/overheating/CfgVehicles.hpp +++ b/addons/overheating/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class ACE_SwapBarrel { - displayName = "$STR_ACE_Overheating_SwapBarrel"; + displayName = CSTRING(SwapBarrel); condition = QUOTE( 'ACE_SpareBarrel' in items _player && {getNumber (configFile >> 'CfgWeapons' >> currentWeapon _player >> 'ACE_Overheating_allowSwapBarrel') == 1} ); statement = QUOTE( [ARR_2(_player, currentWeapon _player)] call FUNC(swapBarrel); ); showDisabled = 0; @@ -14,9 +14,9 @@ class CfgVehicles { hotkey = "B"; }; class ACE_CheckTemperature { - displayName = "$STR_ACE_Overheating_CheckTemperatureShort"; + displayName = CSTRING(CheckTemperatureShort); condition = "switch (currentWeapon _player) do {case (''): {false}; case (primaryWeapon _player); case (secondaryWeapon _player); case (handgunWeapon _player): {true}; default {false}}"; - exceptions[] = {"isNotInside"}; + exceptions[] = {"isNotInside", "isNotSitting"}; statement = QUOTE( [ARR_2(_player, currentWeapon _player)] call FUNC(CheckTemperature); ); showDisabled = 0; priority = 2.9; diff --git a/addons/overheating/CfgWeapons.hpp b/addons/overheating/CfgWeapons.hpp index 12ec43024f..025fa5e280 100644 --- a/addons/overheating/CfgWeapons.hpp +++ b/addons/overheating/CfgWeapons.hpp @@ -3,8 +3,8 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_SpareBarrel: ACE_ItemCore { - displayname = "$STR_ACE_Overheating_SpareBarrelName"; - descriptionshort = "$STR_ACE_Overheating_SpareBarrelDescription"; + displayname = CSTRING(SpareBarrelName); + descriptionshort = CSTRING(SpareBarrelDescription); //model = ""; picture = QUOTE(PATHTOF(UI\spare_barrel_ca.paa)); scope = 2; @@ -40,7 +40,21 @@ class CfgWeapons { ACE_Overheating_SlowdownFactor[] = {1, 1, 1, 0.9}; ACE_Overheating_JamChance[] = {0, 0.0003, 0.0015, 0.0075}; }; + + class MMG_02_base_F: Rifle_Long_Base_F { + ACE_Overheating_allowSwapBarrel = 1; + ACE_Overheating_Dispersion[] = {0, -0.001, 0.001, 0.004}; + ACE_Overheating_SlowdownFactor[] = {1, 1, 1, 0.9}; + ACE_Overheating_JamChance[] = {0, 0.0003, 0.0015, 0.0075}; + }; + class MMG_01_base_F: Rifle_Long_Base_F { + ACE_Overheating_allowSwapBarrel = 1; + ACE_Overheating_Dispersion[] = {0, -0.001, 0.001, 0.004}; + ACE_Overheating_SlowdownFactor[] = {1, 1, 1, 0.9}; + ACE_Overheating_JamChance[] = {0, 0.0003, 0.0015, 0.0075}; + }; + class arifle_MX_SW_F : arifle_MX_Base_F { ACE_clearJamAction = ""; // Custom jam clearing action. Use empty string to undefine. ACE_Overheating_allowSwapBarrel = 1; // 1 to enable barrel swap. 0 to disable. Meant for machine guns where you can easily swap the barrel without dismantling the whole weapon. diff --git a/addons/overheating/XEH_postInit.sqf b/addons/overheating/XEH_postInit.sqf index 5e7089ab75..0dad0dd32c 100644 --- a/addons/overheating/XEH_postInit.sqf +++ b/addons/overheating/XEH_postInit.sqf @@ -4,7 +4,7 @@ if !(hasInterface) exitWith {}; // Add keybinds -["ACE3 Weapons", QGVAR(unjamWeapon), localize "STR_ACE_Overheating_UnjamWeapon", +["ACE3 Weapons", QGVAR(unjamWeapon), localize LSTRING(UnjamWeapon), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/overheating/functions/fnc_clearJam.sqf b/addons/overheating/functions/fnc_clearJam.sqf index 4bba92eb3f..1c7e959a98 100644 --- a/addons/overheating/functions/fnc_clearJam.sqf +++ b/addons/overheating/functions/fnc_clearJam.sqf @@ -52,6 +52,6 @@ if (_weapon in _jammedWeapons) then { }; if (GVAR(DisplayTextOnJam)) then { - [localize "STR_ACE_Overheating_WeaponUnjammed"] call EFUNC(common,displayTextStructured); + [localize LSTRING(WeaponUnjammed)] call EFUNC(common,displayTextStructured); }; }; diff --git a/addons/overheating/functions/fnc_cooldown.sqf b/addons/overheating/functions/fnc_cooldown.sqf index f5a7f68c36..8fb0e0127b 100644 --- a/addons/overheating/functions/fnc_cooldown.sqf +++ b/addons/overheating/functions/fnc_cooldown.sqf @@ -16,7 +16,7 @@ EXPLODE_3_PVT(_this,_temperature,_barrelMass,_totalTime); -// If a long time passed since the last shot, there's no need to calculate anything; the weapon should be cool +// If a long ACE_time passed since the last shot, there's no need to calculate anything; the weapon should be cool if (_totalTime > 1800) exitWith {0}; private ["_barrelSurface", "_time", "_deltaTime"]; diff --git a/addons/overheating/functions/fnc_displayTemperature.sqf b/addons/overheating/functions/fnc_displayTemperature.sqf index 3012e480e3..521b998fa7 100644 --- a/addons/overheating/functions/fnc_displayTemperature.sqf +++ b/addons/overheating/functions/fnc_displayTemperature.sqf @@ -26,12 +26,12 @@ _time = _overheat select 1; _barrelMass = 0.50 * (getNumber (configFile >> "CfgWeapons" >> _weapon >> "WeaponSlotsInfo" >> "mass") / 22.0) max 1.0; // Calculate cooling -_temperature = [_temperature, _barrelMass, time - _time] call FUNC(cooldown); +_temperature = [_temperature, _barrelMass, ACE_time - _time] call FUNC(cooldown); //["Overheating", _temperature, {format ["Temperature: %1 °C", _this]}] call EFUNC(common,log); // Store new temperature -_time = time; +_time = ACE_time; _player setVariable [_string, [_temperature, _time], false]; diff --git a/addons/overheating/functions/fnc_jamWeapon.sqf b/addons/overheating/functions/fnc_jamWeapon.sqf index 7810fb0ce2..1249cac690 100644 --- a/addons/overheating/functions/fnc_jamWeapon.sqf +++ b/addons/overheating/functions/fnc_jamWeapon.sqf @@ -62,7 +62,7 @@ if (_unit getVariable [QGVAR(JammingActionID), -1] == -1) then { playSound3D ["a3\sounds_f\weapons\Other\dry9.wss", _this select 0]; if (!(missionNamespace getVariable [QGVAR(knowAboutJam), false]) && {(_this select 1) ammo currentWeapon (_this select 1) > 0} && {GVAR(DisplayTextOnJam)}) then { - [localize "STR_ACE_Overheating_WeaponJammed"] call EFUNC(common,displayTextStructured); + [localize LSTRING(WeaponJammed)] call EFUNC(common,displayTextStructured); GVAR(knowAboutJam) = true; }; }; @@ -75,7 +75,7 @@ if (_unit getVariable [QGVAR(JammingActionID), -1] == -1) then { [_this select 1, currentWeapon (_this select 1), false] call FUNC(clearJam); }; - //_id = [_unit, format ["%1", localize "STR_ACE_Overheating_UnjamWeapon"], "DefaultAction", _condition, _statement, _condition2, _statement2, 10] call EFUNC(common,addActionMenuEventHandler); + //_id = [_unit, format ["%1", localize LSTRING(UnjamWeapon)], "DefaultAction", _condition, _statement, _condition2, _statement2, 10] call EFUNC(common,addActionMenuEventHandler); _id = [_unit, "DefaultAction", _condition, _statement] call EFUNC(common,addActionEventHandler); _unit setVariable [QGVAR(JammingActionID), _id]; diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index 75ba1e1306..ee1c8f9ff5 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -44,12 +44,12 @@ _energyIncrement = 0.75 * 0.0005 * _bulletMass * (vectorMagnitudeSqr _velocity); _barrelMass = 0.50 * (getNumber (configFile >> "CfgWeapons" >> _weapon >> "WeaponSlotsInfo" >> "mass") / 22.0) max 1.0; // Calculate cooling -_temperature = [_temperature, _barrelMass, time - _time] call FUNC(cooldown); +_temperature = [_temperature, _barrelMass, ACE_time - _time] call FUNC(cooldown); // Calculate heating _temperature = _temperature + _energyIncrement / (_barrelMass * 466); // Steel Heat Capacity = 466 J/(Kg.K) // set updated values -_time = time; +_time = ACE_time; _unit setVariable [_variableName, [_temperature, _time], false]; _scaledTemperature = (_temperature / 1000) min 1 max 0; diff --git a/addons/overheating/functions/fnc_swapBarrel.sqf b/addons/overheating/functions/fnc_swapBarrel.sqf index 2384fb470e..4bd0f734b9 100644 --- a/addons/overheating/functions/fnc_swapBarrel.sqf +++ b/addons/overheating/functions/fnc_swapBarrel.sqf @@ -22,4 +22,4 @@ _player playActionNow "GestureDismountMuzzle"; _player playAction "GestureMountMuzzle"; playSound "ACE_BarrelSwap"; -[10, [_player, _weapon], {(_this select 0) call FUNC(swapBarrelCallback)}, {}, (localize "STR_ACE_Overheating_SwappingBarrel")] call EFUNC(common,progressBar); +[10, [_player, _weapon], {(_this select 0) call FUNC(swapBarrelCallback)}, {}, (localize LSTRING(SwappingBarrel))] call EFUNC(common,progressBar); diff --git a/addons/overheating/functions/fnc_swapBarrelCallback.sqf b/addons/overheating/functions/fnc_swapBarrelCallback.sqf index e626bf2aea..5947e381c7 100644 --- a/addons/overheating/functions/fnc_swapBarrelCallback.sqf +++ b/addons/overheating/functions/fnc_swapBarrelCallback.sqf @@ -16,6 +16,6 @@ EXPLODE_2_PVT(_this,_player,_weapon); // don't consume the barrel, but rotate through them. -[localize "STR_ACE_Overheating_SwappedBarrel", QUOTE(PATHTOF(UI\spare_barrel_ca.paa))] call EFUNC(common,displayTextPicture); +[localize LSTRING(SwappedBarrel), QUOTE(PATHTOF(UI\spare_barrel_ca.paa))] call EFUNC(common,displayTextPicture); _player setVariable [format [QGVAR(%1), _weapon], [0, 0], false]; diff --git a/addons/overheating/script_component.hpp b/addons/overheating/script_component.hpp index 46a31e6ea3..ff124851ad 100644 --- a/addons/overheating/script_component.hpp +++ b/addons/overheating/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT overheating -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_OVERHEATING #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_OVERHEATING #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 491b587fc2..28dc8b95c7 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -1,7 +1,7 @@  - + Display text on jam Zeige Text bei Ladehemmung Mostrar texto al encasquillarse @@ -13,7 +13,7 @@ Mostrar texto quando trava acontecer Visualizza testo in caso di inceppamento - + Display a notification whenever your weapon gets jammed Zeige einen Hinweis, wenn die Waffe eine Ladehemmung hat. Mostrar notificación cada vez que el arma se encasquille diff --git a/addons/overpressure/script_component.hpp b/addons/overpressure/script_component.hpp index 21f4cea704..3a44df1f9b 100644 --- a/addons/overpressure/script_component.hpp +++ b/addons/overpressure/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT overpressure -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_OVERPRESSURE #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_ENABLED_OVERPRESSURE #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/parachute/CfgVehicles.hpp b/addons/parachute/CfgVehicles.hpp index 7d0f88d68f..bc5ecbd60f 100644 --- a/addons/parachute/CfgVehicles.hpp +++ b/addons/parachute/CfgVehicles.hpp @@ -12,43 +12,14 @@ class CfgVehicles { backpack = "ACE_NonSteerableParachute"; count = 4; }; - class _xx_ACE_ReserveParachute { - backpack = "ACE_ReserveParachute"; - count = 4; - }; }; }; - class Man; - class CAManBase: Man { - class ACE_SelfActions { - class ACE_CutParachute { - displayName = "$STR_ACE_Parachute_CutParachute"; - exceptions[] = {"isNotInside"}; - condition = QUOTE([_player] call FUNC(checkCutParachute)); - statement = QUOTE([_player] call FUNC(cutParachute)); - showDisabled = 0; - priority = 2.9; - icon = QUOTE(PATHTOF(UI\cut_ca.paa)); - hotkey = "C"; // Did this realy Work? - }; - }; - }; - class Helicopter; - class ParachuteBase: Helicopter { - ace_hasReserveParachute = 1; - ace_reserveParachute = "ACE_ReserveParachute"; - }; - class B_Parachute: ParachuteBase { - ace_hasReserveParachute = 1; - ace_reserveParachute = "ACE_ReserveParachute"; - }; + class B_Parachute; class ACE_NonSteerableParachute: B_Parachute { - ace_hasReserveParachute = 0; - ace_reserveParachute = ""; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; - displayName = "$STR_ACE_Parachute_NonSteerableParachute"; + displayName = CSTRING(NonSteerableParachute); //picture = "\A3\Characters_F\data\ui\icon_b_parachute_ca.paa"; // @todo //model = "\A3\Weapons_F\Ammoboxes\Bags\Backpack_Parachute"; // @todo // backpackSimulation = "ParachuteNonSteerable"; //ParachuteSteerable //Bis broke this in 1.40 @@ -56,17 +27,7 @@ class CfgVehicles { maximumLoad = 0; mass = 100; }; - class ACE_ReserveParachute: ACE_NonSteerableParachute { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Parachute_ReserveParachute"; - //picture = "\z\ace\addons\parachute\ui\reserveParachute_icon.paa"; //@todo - //model = "\z\ace\addons\parachute\data\test.p3d"; // @todo - ace_hasReserveParachute = 0; - ace_reserveParachute = ""; - ParachuteClass = "NonSteerable_Parachute_F"; - mass = 70; - scope = 2; - }; + class B_Soldier_05_f; class B_Pilot_F: B_Soldier_05_f {backpack = "ACE_NonSteerableParachute";}; class I_Soldier_04_F; class I_pilot_F: I_Soldier_04_F {backpack = "ACE_NonSteerableParachute";}; class O_helipilot_F; class O_Pilot_F: O_helipilot_F {backpack = "ACE_NonSteerableParachute";}; diff --git a/addons/parachute/CfgWeapons.hpp b/addons/parachute/CfgWeapons.hpp index 067d065bf0..4ca785a1ea 100644 --- a/addons/parachute/CfgWeapons.hpp +++ b/addons/parachute/CfgWeapons.hpp @@ -3,9 +3,9 @@ class CfgWeapons { class ACE_Altimeter: ItemWatch { ACE_hideItemType = "Watch"; - author = "$STR_ACE_Common_ACETeam"; - descriptionShort = "$STR_ACE_Parachute_AltimeterDescription"; - displayName = "$STR_ACE_Parachute_AltimeterDisplayName"; + author = ECSTRING(common,ACETeam); + descriptionShort = CSTRING(AltimeterDescription); + displayName = CSTRING(AltimeterDisplayName); picture = PATHTOF(UI\watch_altimeter.paa); }; }; diff --git a/addons/parachute/XEH_postInit.sqf b/addons/parachute/XEH_postInit.sqf index 093328a1ea..86626882e0 100644 --- a/addons/parachute/XEH_postInit.sqf +++ b/addons/parachute/XEH_postInit.sqf @@ -17,7 +17,7 @@ if (!hasInterface) exitWith {}; -["ACE3 Equipment", QGVAR(showAltimeter), localize "STR_ACE_Parachute_showAltimeter", +["ACE3 Equipment", QGVAR(showAltimeter), localize LSTRING(showAltimeter), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -43,4 +43,4 @@ GVAR(PFH) = false; // don't show speed and height when in expert mode ["infoDisplayChanged", {_this call FUNC(handleInfoDisplayChanged)}] call EFUNC(common,addEventHandler); //[ACE_Player,([ACE_player] call EFUNC(common,getAllGear))] call FUNC(storeParachute); -["playerInventoryChanged", FUNC(storeParachute) ] call EFUNC(common,addEventHandler); \ No newline at end of file +["playerInventoryChanged", FUNC(storeParachute) ] call EFUNC(common,addEventHandler); diff --git a/addons/parachute/functions/fnc_doLanding.sqf b/addons/parachute/functions/fnc_doLanding.sqf index 33ba2ccfca..3582dc797f 100644 --- a/addons/parachute/functions/fnc_doLanding.sqf +++ b/addons/parachute/functions/fnc_doLanding.sqf @@ -20,8 +20,8 @@ GVAR(PFH) = false; [_unit, "AmovPercMevaSrasWrflDf_AmovPknlMstpSrasWrflDnon", 2] call EFUNC(common,doAnimation); _unit setVariable [QGVAR(chuteIsCut), false]; [{ - if (time >= ((_this select 0) select 0) + 1) then { + if (ACE_time >= ((_this select 0) select 0) + 1) then { ((_this select 0) select 1) playActionNow "Crouch"; [(_this select 1)] call CALLSTACK(cba_fnc_removePerFrameHandler); }; -}, 1, [time,_unit]] call CALLSTACK(cba_fnc_addPerFrameHandler); +}, 1, [ACE_time,_unit]] call CALLSTACK(cba_fnc_addPerFrameHandler); diff --git a/addons/parachute/functions/fnc_showAltimeter.sqf b/addons/parachute/functions/fnc_showAltimeter.sqf index 45816cc883..9960e3f727 100644 --- a/addons/parachute/functions/fnc_showAltimeter.sqf +++ b/addons/parachute/functions/fnc_showAltimeter.sqf @@ -39,7 +39,7 @@ GVAR(AltimeterActive) = true; _minute = floor ((daytime - _hour) * 60); _height = (getPosASL _unit) select 2; - _curTime = time; + _curTime = ACE_time; _timeDiff = _curTime - _prevTime; _descentRate = if(_timeDiff > 0) then {floor((_oldHeight - _height) / _timeDiff)} else {0}; @@ -49,4 +49,4 @@ GVAR(AltimeterActive) = true; (_this select 0) set [2, _height]; (_this select 0) set [3, _curTime]; -}, 0.2, [uiNamespace getVariable ["ACE_Altimeter", displayNull], _unit,floor ((getPosASL _unit) select 2), time]] call CALLSTACK(cba_fnc_addPerFrameHandler); +}, 0.2, [uiNamespace getVariable ["ACE_Altimeter", displayNull], _unit,floor ((getPosASL _unit) select 2), ACE_time]] call CALLSTACK(cba_fnc_addPerFrameHandler); diff --git a/addons/ragdolls/script_component.hpp b/addons/ragdolls/script_component.hpp index 3382ff70ce..a0de706e10 100644 --- a/addons/ragdolls/script_component.hpp +++ b/addons/ragdolls/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT ragdolls -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_RAGDOLLS #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_RAGDOLLS #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/rangecard/$PBOPREFIX$ b/addons/rangecard/$PBOPREFIX$ new file mode 100644 index 0000000000..b319ce4b0d --- /dev/null +++ b/addons/rangecard/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\rangecard \ No newline at end of file diff --git a/addons/rangecard/CfgEventHandlers.hpp b/addons/rangecard/CfgEventHandlers.hpp new file mode 100644 index 0000000000..3996e3371d --- /dev/null +++ b/addons/rangecard/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; \ No newline at end of file diff --git a/addons/rangecard/CfgVehicles.hpp b/addons/rangecard/CfgVehicles.hpp new file mode 100644 index 0000000000..a5832756ff --- /dev/null +++ b/addons/rangecard/CfgVehicles.hpp @@ -0,0 +1,69 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_Actions { + class ACE_Weapon { + class GVAR(copyRangeCard) { + displayName = CSTRING(CopyRangeCard); + distance = 2.0; + condition = QUOTE(_target call FUNC(canCopy)); + statement = QUOTE(_target call FUNC(updateClassNames)); + icon = QUOTE(PATHTOF(UI\RangeCard_Icon.paa)); + }; + }; + }; + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(open) { + displayName = CSTRING(OpenRangeCard); + condition = QUOTE(call FUNC(canShow) && !GVAR(RangeCardOpened)); + statement = QUOTE(false call FUNC(openRangeCard)); + showDisabled = 0; + priority = 0.1; + icon = QUOTE(PATHTOF(UI\RangeCard_Icon.paa)); + exceptions[] = {"notOnMap"}; + class GVAR(openCopy) { + displayName = CSTRING(OpenRangeCardCopy); + condition = QUOTE(call FUNC(canShowCopy) && !GVAR(RangeCardOpened)); + statement = QUOTE(true call FUNC(openRangeCard)); + showDisabled = 0; + priority = 0.1; + icon = QUOTE(PATHTOF(UI\RangeCard_Icon.paa)); + exceptions[] = {"notOnMap"}; + }; + class GVAR(makeCopy) { + displayName = CSTRING(CopyRangeCard); + condition = QUOTE(call FUNC(canShow) && !GVAR(RangeCardOpened)); + statement = QUOTE(GVAR(ammoClassCopy) = GVAR(ammoClass); GVAR(magazineClassCopy) = GVAR(magazineClass); GVAR(weaponClassCopy) = GVAR(ammoClass);); + showDisabled = 0; + priority = 0.1; + icon = QUOTE(PATHTOF(UI\RangeCard_Icon.paa)); + exceptions[] = {"notOnMap"}; + }; + }; + }; + }; + }; + + class Item_Base_F; + class ACE_Item_RangeCard: Item_Base_F { + author = "Ruthberg"; + scope = 2; + scopeCurator = 2; + displayName = "Range Card"; + vehicleClass = "Items"; + class TransportItems { + class ACE_RangeCard { + name = "ACE_RangeCard"; + count = 1; + }; + }; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_RangeCard,6); + }; + }; +}; diff --git a/addons/rangecard/CfgWeapons.hpp b/addons/rangecard/CfgWeapons.hpp new file mode 100644 index 0000000000..7195c0a008 --- /dev/null +++ b/addons/rangecard/CfgWeapons.hpp @@ -0,0 +1,19 @@ + +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_RangeCard: ACE_ItemCore { + author[] = {"Ruthberg"}; + scope = 2; + displayName = CSTRING(Name); + descriptionShort = CSTRING(Description); + picture = PATHTOF(UI\RangeCard_Icon.paa); + icon = "iconObject_circle"; + mapSize = 0.034; + + class ItemInfo: InventoryItem_Base_F { + mass = 1; + }; + }; +}; diff --git a/addons/rangecard/README.md b/addons/rangecard/README.md new file mode 100644 index 0000000000..c96e151869 --- /dev/null +++ b/addons/rangecard/README.md @@ -0,0 +1,10 @@ +ace_rangecards +=============== + +Adds range cards + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/rangecard/RscTitles.hpp b/addons/rangecard/RscTitles.hpp new file mode 100644 index 0000000000..c4da1862ca --- /dev/null +++ b/addons/rangecard/RscTitles.hpp @@ -0,0 +1,198 @@ +#define ST_LEFT 0 +#define ST_RIGHT 1 +#define ST_CENTER 2 + +class RscListNBox; +class ScrollBar; + +class RangeCard_RscText { + idc=-1; + type=0; + style=ST_CENTER; + colorDisabled[]={0,0,0,0.0}; + colorBackground[]={0,0,0,0}; + colorText[]={0,0,0,1}; + text=""; + x=0; + y=0; + h=0.028; + w=0.06; + font="TahomaB"; + SizeEx=0.025; + shadow=0; +}; + +class RangeCard_RscListNBox: RscListNBox { + idc=-1; + type=102; + style=0; + font="TahomaB"; + sizeEx=0.026; + rowHeight=0.027; + colorDisabled[]={0,0,0,0.0}; + colorBackground[]={1,1,1,1}; + colorText[]={0,0,0,1}; + colorScrollbar[]={0.95,0.95,0.95,1}; + colorSelect[]={0,0,0,1}; + colorSelect2[]={0,0,0,1}; + colorSelectBackground[]={1,1,1,0}; + colorSelectBackground2[]={1,1,1,0}; + period=0; + LineSpacing=0; + maxHistoryDelay=1.0; + autoScrollSpeed=-1; + autoScrollDelay=5; + autoScrollRewind=0; + soundSelect[]={"",0.09,1}; + drawSideArrows=0; + idcLeft=-1; + idcRight=-1; + + class ScrollBar { + color[]={1,1,1,0.6}; + colorActive[]={1,1,1,1}; + colorDisabled[]={1,1,1,0.3}; + }; + + class ListScrollBar : ScrollBar { + }; +}; + +class ACE_RangeCard_Dialog { + idd = -1; + movingEnable = 1; + onLoad = "uiNamespace setVariable ['RangleCard_Display', (_this select 0)]"; + onUnload = QUOTE(_this call FUNC(onCloseDialog)); + objects[] = {}; + + class controls { + class BACKGROUND { + moving=1; + type=0; + font="TahomaB"; + SizeEX=0.025; + idc=-1; + style=48; + x="safezoneX"; + y="safezoneY+0.181889"; + w="1.62727*3/4"; + h="1.62727"; + colorBackground[]={1,1,1,1}; + colorText[]={1,1,1,1}; + text=QUOTE(PATHTOF(UI\RangeCard.paa)); + }; + class CAPTION_TEXT_1: RangeCard_RscText { + idc=770000; + style=ST_LEFT; + x="safezoneX+0.18"; + y="safezoneY+0.181889+0.0"; + w="0.56*1.62727*3/4"; + text=".408 CheyTac - 410 gr Predator Projectiles"; + }; + class CAPTION_TEXT_2: CAPTION_TEXT_1 { + idc=770001; + SizeEx=0.022; + y="safezoneY+0.181889+0.03"; + text="Drop Tables for B.P.: 1013.25mb; Corrected for MVV at Air/Ammo Temperatures -15-35 °C"; + }; + class CAPTION_TEXT_3: CAPTION_TEXT_2 { + idc=770002; + y="safezoneY+0.181889+0.06"; + text="CheyTac Intervention - 29'' 1:13'' twist (M-200)"; + }; + class ZERO_RANGE_TEXT: RangeCard_RscText { + idc=77003; + style=ST_LEFT; + SizeEx=0.028; + x="safezoneX+0.885"; + y="safezoneY+0.181889+0.01"; + w="0.125*1.62727*3/4"; + text="100m ZERO"; + }; + class BAROMETRIC_PRESSURE_TEXT: ZERO_RANGE_TEXT { + idc=77004; + colorText[]={1,0,0,0.8}; + y="safezoneY+0.181889+0.05"; + text="B.P.: 1013.25mb"; + }; + class TARGET_RANGE_TEXT_1: RangeCard_RscText { + idc=770010; + colorText[]={1,1,1,1}; + x="safezoneX+0.185"; + y="safezoneY+0.181889+0.098"; + text="Target"; + }; + class TARGET_RANGE_TEXT_2: TARGET_RANGE_TEXT_1 { + idc=770011; + SizeEx=0.03; + y="safezoneY+0.181889+0.125"; + text="Range"; + }; + class TARGET_RANGE_TEXT_3: TARGET_RANGE_TEXT_1 { + idc=770012; + y="safezoneY+0.181889+0.152"; + text="(m)"; + }; + class BULLET_DROP_TEXT_1: RangeCard_RscText { + idc=770013; + x="safezoneX+0.25"; + y="safezoneY+0.181889+0.095"; + w="0.405*1.62727*3/4"; + text="Bullet Drop (MRADs)"; + }; + class WIND_LEAD_CAPTION_LIST: RangeCard_RscListNBox { + idc=770100; + sizeEx=0.021; + x="safezoneX+0.728"; + y="safezoneY+0.181889+0.091"; + w="0.25*1.62727*3/4"; + h="0.0909445"; + columns[]={(0.03/2), (0.985/2)}; + idcLeft=770101; + idcRight=770102; + }; + class TEMPERATURE_CAPTION_LIST_1: RangeCard_RscListNBox { + idc=770200; + x="safezoneX+0.24"; + y="safezoneY+0.181889+0.125"; + w="0.405*1.62727*3/4"; + h="0.0909445"; + columns[]={(0/9), (1/9), (2/9), (3/9), (4/9), (5/9), (5.9/9), (6.9/9), (7.8/9)}; + idcLeft=770201; + idcRight=770202; + }; + class TEMPERATURE_CAPTION_LIST_2: RangeCard_RscListNBox { + idc=770300; + x="safezoneX+0.728"; + y="safezoneY+0.181889+0.15"; + w="0.25*1.62727*3/4"; + h="0.0909445"; + columns[]={(0/6), (0.9/6), (1.8/6), (2.9/6), (3.8/6), (4.8/6)}; + idcLeft=770301; + idcRight=770302; + }; + class RANGE_CARD_DATA: RangeCard_RscListNBox { + idc=770400; + x="safezoneX+0.182"; + y="safezoneY+0.181889+0.194"; + w="0.72*1.62727*3/4"; + h="1.62727"; + columns[]={(0/16), (1.2/16), (2.2/16), (3.2/16), (4.2/16), (5.1/16), (6.1/16), (7.1/16), (8.1/16), + (9/16), (10.2/16), (11/16), (11.9/16), (12.8/16), (13.7/16), (14.6/16)}; + idcLeft=770401; + idcRight=770402; + }; + class FOOTNOTE_TEXT_1: CAPTION_TEXT_1 { + idc=770020; + SizeEx=0.022; + y="safezoneY+1.72431"; + w="0.705*1.62727*3/4"; + text="For best results keep ammunition at ambient air temperature. Tables calculated for the above listed barrel"; + }; + class FOOTNOTE_TEXT_2: FOOTNOTE_TEXT_1 { + idc=770021; + y="safezoneY+1.72431+0.024"; + text="and load with optic mounted 1.5'' above line of bore."; + }; + }; +}; diff --git a/addons/rangecard/UI/RangeCard.paa b/addons/rangecard/UI/RangeCard.paa new file mode 100644 index 0000000000..56f0bfd30c Binary files /dev/null and b/addons/rangecard/UI/RangeCard.paa differ diff --git a/addons/rangecard/UI/RangeCard_Icon.paa b/addons/rangecard/UI/RangeCard_Icon.paa new file mode 100644 index 0000000000..62cf0156de Binary files /dev/null and b/addons/rangecard/UI/RangeCard_Icon.paa differ diff --git a/addons/rangecard/XEH_postInit.sqf b/addons/rangecard/XEH_postInit.sqf new file mode 100644 index 0000000000..8396d76b39 --- /dev/null +++ b/addons/rangecard/XEH_postInit.sqf @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +#include "initKeybinds.sqf" + +GVAR(RangeCardOpened) = false; + +GVAR(controls) = []; + +GVAR(ammoClass) = "B_65x39_Caseless"; +GVAR(magazineClass) = "30Rnd_65x39_caseless_mag"; +GVAR(weaponClass) = "arifle_MXM_F"; + +GVAR(ammoClassCopy) = "";//"ACE_762x51_Ball_M118LR"; +GVAR(magazineClassCopy) = "";//"ACE_20Rnd_762x51_M118LR_Mag"; +GVAR(weaponClassCopy) = "";//srifle_DMR_06_olive_F"; diff --git a/addons/rangecard/XEH_preInit.sqf b/addons/rangecard/XEH_preInit.sqf new file mode 100644 index 0000000000..5e5685d30f --- /dev/null +++ b/addons/rangecard/XEH_preInit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(calculateSolution); +PREP(canCopy); +PREP(canShow); +PREP(canShowCopy); +PREP(onCloseDialog); +PREP(openRangeCard); +PREP(updateClassNames); +PREP(updateRangeCard); + +ADDON = true; diff --git a/addons/rangecard/config.cpp b/addons/rangecard/config.cpp new file mode 100644 index 0000000000..abe4e859f2 --- /dev/null +++ b/addons/rangecard/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_Item_RangeCard"}; + weapons[] = {"ACE_RangeCard"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ACE_Advanced_Ballistics"}; + author = "Ruthberg"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "RscTitles.hpp" \ No newline at end of file diff --git a/addons/rangecard/functions/fnc_calculateSolution.sqf b/addons/rangecard/functions/fnc_calculateSolution.sqf new file mode 100644 index 0000000000..ea86d9986e --- /dev/null +++ b/addons/rangecard/functions/fnc_calculateSolution.sqf @@ -0,0 +1,218 @@ +/* + * Author: Ruthberg + * Calculates the range card data + * + * Arguments: + * 0: Scope base angle + * 1: Bullet mass + * 2: Bore height + * 3: air friction + * 4: muzzle velocity + * 5: temperature + * 6: barometric pressure + * 7: relative humidity + * 8: simulation steps + * 9: wind speed + * 10: wind direction + * 11: inclination angle + * 12: target speed + * 13: target range + * 14: ballistic coefficient + * 15: drag model + * 16: atmosphere model + * 17: Store range card data? + * 18: Stability factor + * 19: Twist Direction + * 20: Latitude + * 21: Direction of Fire + * 22: Range Card Slot + * 23: Use advanced ballistics config? + * + * Return Value: + * 0: Elevation (MOA) + * 1: Windage (MOA) + * 2: Lead (MOA) + * 3: Time of fligth (SECONDS) + * 4: Remaining velocity (m/s) + * 5: Remaining kinetic energy (ft·lb) + * 6: Vertical coriolis drift (MOA) + * 7: Horizontal coriolis drift (MOA) + * 8: Spin drift (MOA) + * + * Example: + * call ace_rangecard_calculate_range_card_data + * + * Public: No + */ +#include "script_component.hpp" + +private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_drag", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude", "_directionOfFire", "_rangeCardSlot", "_useABConfig"]; +_scopeBaseAngle = _this select 0; +_bulletMass = _this select 1; +_boreHeight = _this select 2; +_airFriction = _this select 3; +_muzzleVelocity = _this select 4; +_temperature = _this select 5; +_barometricPressure = _this select 6; +_relativeHumidity = _this select 7; +_simSteps = _this select 8; +_windSpeed1 = (_this select 9) select 0; +_windSpeed2 = (_this select 9) select 1; +_windDirection = _this select 10; +_inclinationAngle = _this select 11; +_targetSpeed = _this select 12; +_targetRange = _this select 13; +_bc = _this select 14; +_dragModel = _this select 15; +_atmosphereModel = _this select 16; +_storeRangeCardData = _this select 17; +_stabilityFactor = _this select 18; +_twistDirection = _this select 19; +_latitude = _this select 20; +_directionOfFire = _this select 21; +_rangeCardSlot = _this select 22; +_useABConfig = _this select 23; + +if (_storeRangeCardData) then { + GVAR(rangeCardDataMVs) set [_rangeCardSlot, format[" %1", round(_muzzleVelocity)]]; +}; + +private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT", "_speedOfSound"]; +_bulletPos = [0, 0, 0]; +_bulletVelocity = [0, 0, 0]; +_bulletAccel = [0, 0, 0]; +_bulletSpeed = 0; +_gravity = [0, sin(_scopeBaseAngle + _inclinationAngle) * -9.80665, cos(_scopeBaseAngle + _inclinationAngle) * -9.80665]; +_deltaT = 1 / _simSteps; +_speedOfSound = 0; +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + _speedOfSound = _temperature call EFUNC(weather,calculateSpeedOfSound); +}; + +private ["_elevation", "_windage1", "_windage2", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"]; +_elevation = 0; +_windage1 = 0; +_windage2 = 0; +_lead = 0; +_TOF = 0; +_trueVelocity = [0, 0, 0]; +_trueSpeed = 0; +_verticalCoriolis = 0; +_verticalDeflection = 0; +_horizontalCoriolis = 0; +_horizontalDeflection = 0; +_spinDrift = 0; +_spinDeflection = 0; + +private ["_n", "_range"]; +_n = 0; +_range = 0; + +private ["_wind1", "_wind2", "_windDrift"]; +_wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection * 30) * _windSpeed1, 0]; +_wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0]; +_windDrift = 0; +if (_useABConfig) then { + _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); +}; + +private ["_airFrictionCoef", "_airDensity"]; +_airFrictionCoef = 1; +if (!_useABConfig && (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])) then { + _airDensity = [_temperature, _barometricPressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); + _airFrictionCoef = _airDensity / 1.22498; +}; + +private ["_speedTotal", "_stepsTotal", "_speedAverage"]; +_speedTotal = 0; +_stepsTotal = 0; +_speedAverage = 0; + +_bulletPos set [0, 0]; +_bulletPos set [1, 0]; +_bulletPos set [2, -(_boreHeight / 100)]; + +_bulletVelocity set [0, 0]; +_bulletVelocity set [1, Cos(_scopeBaseAngle) * _muzzleVelocity]; +_bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity]; + +while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do { + _bulletSpeed = vectorMagnitude _bulletVelocity; + + _speedTotal = _speedTotal + _bulletSpeed; + _stepsTotal = _stepsTotal + 1; + _speedAverage = (_speedTotal / _stepsTotal); + + if (_speedAverage > 450 && _bulletSpeed < _speedOfSound) exitWith {}; + if (atan((_bulletPos select 2) / (abs(_bulletPos select 1) + 1)) < -2.254) exitWith {}; + + _trueVelocity = _bulletVelocity vectorDiff _wind1; + _trueSpeed = vectorMagnitude _trueVelocity; + + if (_useABConfig) then { + _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { + parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])) + } else { + ([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) + }; + _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); + } else { + _bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction * _airFrictionCoef); + }; + + _bulletAccel = _bulletAccel vectorAdd _gravity; + + _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply _deltaT); + + _TOF = _TOF + _deltaT; + + if (_storeRangeCardData) then { + _range = GVAR(rangeCardStartRange) + _n * GVAR(rangeCardIncrement); + if ((_bulletPos select 1) >= _range && _range <= GVAR(rangeCardEndRange)) then { + if ((_bulletPos select 1) > 0) then { + _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); + _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); + }; + if (_range != 0) then { + _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range); + }; + private ["_elevationString", "_windageString", "_leadString"]; + _elevationString = Str(round(-_elevation * 60 / 3.38 * 10) / 10); + if (_elevationString == "0") then { + _elevationString = "-0.0"; + }; + if (_elevationString find "." == -1) then { + _elevationString = _elevationString + ".0"; + }; + _windageString = Str(round(_windage1 * 60 / 3.38 * 10) / 10); + if (_windageString find "." == -1) then { + _windageString = _windageString + ".0"; + }; + _leadString = Str(round(_lead * 10) / 10); + if (_leadString find "." == -1) then { + _leadString = _leadString + ".0"; + }; + (GVAR(rangeCardDataElevation) select _rangeCardSlot) set [_n, _elevationString]; + (GVAR(rangeCardDataWindage) select _rangeCardSlot) set [_n, _windageString]; + (GVAR(rangeCardDataLead) select _rangeCardSlot) set [_n, _leadString]; + _n = _n + 1; + }; + }; +}; + +if ((_bulletPos select 1) > 0) then { + _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); + _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity); + _windage2 = - atan(_windDrift / (_bulletPos select 1)); +}; + +if (_targetRange != 0) then { + _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _targetRange); +}; + +_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); +_kineticEnergy = _kineticEnergy * 0.737562149; + +[_elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis * 60, _horizontalCoriolis * 60, _spinDrift * 60] \ No newline at end of file diff --git a/addons/rangecard/functions/fnc_canCopy.sqf b/addons/rangecard/functions/fnc_canCopy.sqf new file mode 100644 index 0000000000..c9e0a05d0e --- /dev/null +++ b/addons/rangecard/functions/fnc_canCopy.sqf @@ -0,0 +1,18 @@ +/* + * Authors: Ruthberg + * Checks if the target has a copyable range card + * + * Arguments: + * unit + * + * Return Value: + * canShow (bool) + * + * Example: + * [] call ace_rangecard_fnc_canCopy + * + * Public: No + */ +#include "script_component.hpp" + +((primaryWeapon _this) != "" && [_this] call EFUNC(common,isPlayer) && [_this, "ACE_RangeCard"] call EFUNC(common,hasItem)) diff --git a/addons/rangecard/functions/fnc_canShow.sqf b/addons/rangecard/functions/fnc_canShow.sqf new file mode 100644 index 0000000000..330788ee7c --- /dev/null +++ b/addons/rangecard/functions/fnc_canShow.sqf @@ -0,0 +1,18 @@ +/* + * Authors: Ruthberg + * Tests if the Range Card can be shown + * + * Arguments: + * Nothing + * + * Return Value: + * canShow (bool) + * + * Example: + * [] call ace_rangecard_fnc_canShow + * + * Public: No + */ +#include "script_component.hpp" + +(GVAR(ammoClass) != "" && GVAR(magazineClass) != "" && GVAR(weaponClass) != "" && !GVAR(RangeCardOpened) && ("ACE_RangeCard" in (uniformItems ACE_player)) || ("ACE_RangeCard" in (vestItems ACE_player))) diff --git a/addons/rangecard/functions/fnc_canShowCopy.sqf b/addons/rangecard/functions/fnc_canShowCopy.sqf new file mode 100644 index 0000000000..e78c64cc89 --- /dev/null +++ b/addons/rangecard/functions/fnc_canShowCopy.sqf @@ -0,0 +1,18 @@ +/* + * Authors: Ruthberg + * Tests if the Range Card copy can be shown + * + * Arguments: + * Nothing + * + * Return Value: + * canShow (bool) + * + * Example: + * [] call ace_rangecard_fnc_canShowCopy + * + * Public: No + */ +#include "script_component.hpp" + +(GVAR(ammoClassCopy) != "" && GVAR(magazineClassCopy) != "" && GVAR(weaponClassCopy) != "" && !GVAR(RangeCardOpened) && ("ACE_RangeCard" in (uniformItems ACE_player)) || ("ACE_RangeCard" in (vestItems ACE_player))) diff --git a/addons/rangecard/functions/fnc_onCloseDialog.sqf b/addons/rangecard/functions/fnc_onCloseDialog.sqf new file mode 100644 index 0000000000..f5d971f22f --- /dev/null +++ b/addons/rangecard/functions/fnc_onCloseDialog.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" + +uiNamespace setVariable ['RangleCard_Display', nil]; +GVAR(RangeCardOpened) = false; diff --git a/addons/rangecard/functions/fnc_openRangeCard.sqf b/addons/rangecard/functions/fnc_openRangeCard.sqf new file mode 100644 index 0000000000..3e886eb97a --- /dev/null +++ b/addons/rangecard/functions/fnc_openRangeCard.sqf @@ -0,0 +1,36 @@ +/* + * Authors: Ruthberg + * Opens the range card dialog + * + * Arguments: + * Open copy? + * + * Return Value: + * Nothing + * + * Example: + * call ace_rangecard_fnc_openRangeCard + * + * Public: No + */ +#include "script_component.hpp" + +if (GVAR(RangeCardOpened)) exitWith {}; + +if (_this) then { + if (GVAR(ammoClassCopy) != "" && GVAR(magazineClassCopy) != "" && GVAR(weaponClassCopy) != "") then { + GVAR(RangeCardOpened) = true; + + createDialog "ACE_RangeCard_Dialog"; + + [GVAR(ammoClassCopy), GVAR(magazineClassCopy), GVAR(weaponClassCopy)] call FUNC(updateRangeCard); + }; +} else { + if (ACE_player call FUNC(updateClassNames)) then { + GVAR(RangeCardOpened) = true; + + createDialog "ACE_RangeCard_Dialog"; + + [GVAR(ammoClass), GVAR(magazineClass), GVAR(weaponClass)] call FUNC(updateRangeCard); + }; +}; diff --git a/addons/rangecard/functions/fnc_updateClassNames.sqf b/addons/rangecard/functions/fnc_updateClassNames.sqf new file mode 100644 index 0000000000..70cf25825e --- /dev/null +++ b/addons/rangecard/functions/fnc_updateClassNames.sqf @@ -0,0 +1,49 @@ +/* + * Authors: Ruthberg + * Updates the ammo and weapon class names + * + * Arguments: + * unit + * + * Return Value: + * Update successful? + * + * Example: + * unit call ace_rangecard_fnc_updateClassNames + * + * Public: No + */ +#include "script_component.hpp" + +private ["_unit", "_ammoClass", "_magazineClass", "_weaponClass", "_ammo", "_ammoConfig", "_parentClasses"]; +_unit = _this; + +_ammoClass = ""; +_magazineClass = ""; +_weaponClass = primaryWeapon _unit; + +if (_weaponClass == "") exitWith { (GVAR(ammoClass) != "" && GVAR(magazineClass) != "" && GVAR(weaponClass) != "") }; + +{ + _ammo = getText (configFile >> "CfgMagazines" >> _x >> "ammo"); + _ammoConfig = (configFile >> "CfgAmmo" >> _ammo); + _parentClasses = [_ammoConfig, true] call BIS_fnc_returnParents; + if ("BulletBase" in _parentClasses) exitWith { + _ammoClass = _ammo; + _magazineClass = _x; + }; +} forEach (primaryWeaponMagazine _unit); + +if (_ammoClass == "") exitWith { (GVAR(ammoClass) != "" && GVAR(magazineClass) != "" && GVAR(weaponClass) != "") }; + +if (_unit == ACE_player) then { + GVAR(ammoClass) = _ammoClass; + GVAR(magazineClass) = _magazineClass; + GVAR(weaponClass) = _weaponClass; +} else { + GVAR(ammoClassCopy) = _ammoClass; + GVAR(magazineClassCopy) = _magazineClass; + GVAR(weaponClassCopy) = _weaponClass; +}; + +true diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf new file mode 100644 index 0000000000..b5ec9683f4 --- /dev/null +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -0,0 +1,249 @@ +/* + * Authors: Ruthberg + * Updates the range card data + * + * Arguments: + * 0: ammo class + * 1: magazine class + * 2: weapon class + * + * Return Value: + * Nothing + * + * Example: + * [mode] call ace_rangecard_fnc_openRangeCard + * + * Public: No + */ +#include "script_component.hpp" + +disableSerialization; +#define __dsp (uiNamespace getVariable "RangleCard_Display") + +private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_barometricPressure", "_barrelLength", "_barrelTwist", "_bc", "_bulletMass", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_mv", "_mvShift", "_offset", "_relativeHumidity", "_result", "_row", "_scopeBaseAngle", "_weaponConfig", "_zeroRange", "_initSpeed", "_initSpeedCoef", "_useABConfig"]; +_useABConfig = (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]); + +PARAMS_3(_ammoClass,_magazineClass,_weaponClass); + +if (_ammoClass == "" || _magazineClass == "" || _weaponClass == "") exitWith {}; + +{ + ctrlDelete _x; +} forEach GVAR(controls); +GVAR(controls) = []; + +for "_row" from 0 to 49 do { + _offset = if (_row < 5) then {0} else {0.003}; + _control = (__dsp ctrlCreate ["RangeCard_RscText", 790000 + _row]); + _control ctrlSetPosition [safeZoneX + 0.183, safeZoneY + 0.374 + 0.027 * _row + _offset, 0.062, 0.025]; + if (_row in [0, 8, 18, 28, 38, 48]) then { + _control ctrlSetTextColor [1, 1, 1, 1]; + } else { + _control ctrlSetTextColor [0, 0, 0, 1]; + }; + _control ctrlCommit 0; + _control ctrlSetText Str(100 + _row * 50); + GVAR(controls) pushBack _control; +}; +for "_column" from 0 to 8 do { + for "_row" from 0 to 49 do { + _offset = if (_row < 5) then {0} else {0.003}; + _control = (__dsp ctrlCreate ["RangeCard_RscText", 90000 + _column * 100 + _row]); + _control ctrlSetPosition [safeZoneX + 0.249 + _column * 0.055, safeZoneY + 0.374 + 0.027 * _row + _offset, 0.052, 0.025]; + _control ctrlCommit 0; + _control ctrlSetText "-0.0"; + GVAR(controls) pushBack _control; + }; +}; +for "_column" from 0 to 2 do { + for "_row" from 0 to 49 do { + _offset = if (_row < 5) then {0} else {0.003}; + _control = (__dsp ctrlCreate ["RangeCard_RscText", 90000 + (9 +_column) * 100 + _row]); + _control ctrlSetPosition [safeZoneX + 0.743 + _column * 0.049, safeZoneY + 0.374 + 0.027 * _row + _offset, 0.047, 0.025]; + _control ctrlCommit 0; + _control ctrlSetText "-0.0"; + GVAR(controls) pushBack _control; + }; +}; +for "_column" from 0 to 2 do { + for "_row" from 0 to 49 do { + _offset = if (_row < 5) then {0} else {0.003}; + _control = (__dsp ctrlCreate ["RangeCard_RscText", 90000 + (12 +_column) * 100 + _row]); + _control ctrlSetPosition [safeZoneX + 0.892 + _column * 0.049, safeZoneY + 0.374 + 0.027 * _row + _offset, 0.047, 0.025]; + _control ctrlCommit 0; + _control ctrlSetText "-0.0"; + GVAR(controls) pushBack _control; + }; +}; + +lnbClear 770100; +lnbClear 770200; +lnbClear 770300; +lnbClear 770400; + +GVAR(rangeCardDataElevation) = [[], [], [], [], [], [], [], [], []]; +GVAR(rangeCardDataWindage) = [[], [], [], [], [], [], [], [], []]; +GVAR(rangeCardDataLead) = [[], [], [], [], [], [], [], [], []]; +GVAR(rangeCardDataMVs) = ["", "", "", "", "", "", "", "", ""]; +GVAR(lastValidRow) = []; + +GVAR(currentUnit) = 2; +GVAR(rangeCardStartRange) = 100; +GVAR(rangeCardIncrement) = 50; +GVAR(rangeCardEndRange) = GVAR(rangeCardStartRange) + 49 * GVAR(rangeCardIncrement); + +_ammoConfig = _ammoClass call EFUNC(advanced_ballistics,readAmmoDataFromConfig); +_weaponConfig = _weaponClass call EFUNC(advanced_ballistics,readWeaponDataFromConfig); +_airFriction = _ammoConfig select 0; +_barrelTwist = _weaponConfig select 0; +_barrelLength = _weaponConfig select 2; +_muzzleVelocity = 0; + +_bc = 0; +if (count (_ammoConfig select 6) > 0) then { + _bc = (_ammoConfig select 6) select 0; +}; +_dragModel = _ammoConfig select 5; +_atmosphereModel = _ammoConfig select 8; +_bulletMass = 5; +_boreHeight = 3.81; +_zeroRange = 100; + +if (_bc == 0) then { + _useABConfig = false; +}; + +if (_barrelLength > 0 && _useABConfig) then { + _muzzleVelocity = [_barrelLength, _ammoConfig select 10, _ammoConfig select 11, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift); +} else { + _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "initSpeed"); + _initSpeedCoef = getNumber (configFile >> "CfgWeapons" >> _weaponClass >> "initSpeed"); + if (_initSpeedCoef < 0) then { + _initSpeed = _initSpeed * -_initSpeedCoef; + }; + if (_initSpeedCoef > 0) then { + _initSpeed = _initSpeedCoef; + }; + _muzzleVelocity = _initSpeed; +}; + +if (_useABConfig) then { + ctrlSetText [770000, format["%1'' - %2 gr (%3)", round((_ammoConfig select 1) * 39.3700787) / 1000, round((_ammoConfig select 3) * 15.4323584), _ammoClass]]; + if (_barrelLength > 0 && _barrelTwist > 0) then { + ctrlSetText [770002, format["Barrel: %1'' 1:%2'' twist", round(2 * _barrelLength * 0.0393700787) / 2, round(_barrelTwist * 0.0393700787)]]; + } else { + ctrlSetText [770002, ""]; + }; +} else { + ctrlSetText [770000, getText (configFile >> "CfgMagazines" >> _magazineClass >> "displayNameShort")]; + ctrlSetText [770002, getText (configFile >> "CfgWeapons" >> _weaponClass >> "displayName")]; +}; + +lnbAddRow [770100, ["4mps Wind(MRADs)", "1mps LEAD(MRADs)"]]; +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + lnbAddRow [770100, ["Air/Ammo Temp", "Air/Ammo Temp"]]; + + lnbAddRow [770200, ["-15°C", " -5°C", " 5°C", " 10°C", " 15°C", " 20°C", " 25°C", " 30°C", " 35°C"]]; + lnbAddRow [770300, ["-15°C", " 10°C", " 35°C", "-15°C", " 10°C", " 35°C"]]; +}; + +_barometricPressure = 1013.25; +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + _barometricPressure = 1013.25 * (1 - (0.0065 * EGVAR(weather,altitude)) / 288.15) ^ 5.255754495; +}; +_relativeHumidity = 0.5; + +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + ctrlSetText [770001, format["Drop Tables for B.P.: %1mb; Corrected for MVV at Air/Ammo Temperatures -15-35 °C", round(_barometricPressure * 100) / 100]]; + ctrlSetText [77004 , format["B.P.: %1mb", round(_barometricPressure * 100) / 100]]; +} else { + ctrlSetText [770001, ""]; + ctrlSetText [77004 , ""]; +}; + +_cacheEntry = missionNamespace getVariable format[QGVAR(%1_%2_%3), _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]]; +if (isNil {_cacheEntry}) then { + _result = [0, 0, _boreHeight, _airFriction, _muzzleVelocity, 15, 1013.25, 0.5, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0, 0, _useABConfig] call FUNC(calculateSolution); + _scopeBaseAngle = (_result select 0) / 60; + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + { + _mvShift = [_ammoConfig select 9, _x] call EFUNC(advanced_ballistics,calculateAmmoTemperatureVelocityShift); + _mv = _muzzleVelocity + _mvShift; + + [_scopeBaseAngle,_bulletMass,_boreHeight,_airFriction,_mv,_x,_barometricPressure,_relativeHumidity,1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,_forEachIndex,_useABConfig] call FUNC(calculateSolution); + } forEach [-15, -5, 5, 10, 15, 20, 25, 30, 35]; + } else { + [_scopeBaseAngle,_bulletMass,_boreHeight,_airFriction,_muzzleVelocity,15,_barometricPressure,_relativeHumidity,1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,3,_useABConfig] call FUNC(calculateSolution); + }; + + for "_i" from 0 to 9 do { + GVAR(lastValidRow) pushBack count (GVAR(rangeCardDataElevation) select _i); + while {count (GVAR(rangeCardDataElevation) select _i) < 50} do { + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + (GVAR(rangeCardDataElevation) select _i) pushBack "###"; + (GVAR(rangeCardDataWindage) select _i) pushBack "##"; + (GVAR(rangeCardDataLead) select _i) pushBack "##"; + } else { + (GVAR(rangeCardDataElevation) select _i) pushBack ""; + (GVAR(rangeCardDataWindage) select _i) pushBack ""; + (GVAR(rangeCardDataLead) select _i) pushBack ""; + }; + }; + }; + + missionNamespace setVariable [format[QGVAR(%1_%2_%3), _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]], [GVAR(rangeCardDataElevation), GVAR(rangeCardDataWindage), GVAR(rangeCardDataLead), GVAR(rangeCardDataMVs), GVAR(lastValidRow)]]; +} else { + GVAR(rangeCardDataElevation) = _cacheEntry select 0; + GVAR(rangeCardDataWindage) = _cacheEntry select 1; + GVAR(rangeCardDataLead) = _cacheEntry select 2; + GVAR(rangeCardDataMVs) = _cacheEntry select 3; + GVAR(lastValidRow) = _cacheEntry select 4; +}; + +lnbAddRow [770200, GVAR(rangeCardDataMVs)]; + +for "_column" from 0 to 8 do { + for "_row" from 0 to 49 do { + _control = (__dsp displayCtrl (90000 + _column * 100 + _row)); + _control ctrlSetText ((GVAR(rangeCardDataElevation) select _column) select _row); + if (_row >= (GVAR(lastValidRow) select _column)) then { + _control ctrlSetTextColor [0, 0, 0, 0.6]; + } else { + _control ctrlSetTextColor [0, 0, 0, 1.0]; + }; + _control ctrlCommit 0; + }; +}; +{ + for "_row" from 0 to 49 do { + _control = (__dsp displayCtrl (90000 + (9 + _forEachIndex) * 100 + _row)); + _control ctrlSetText ((GVAR(rangeCardDataWindage) select _x) select _row); + if (_row >= (GVAR(lastValidRow) select _x)) then { + _control ctrlSetTextColor [0, 0, 0, 0.6]; + } else { + _control ctrlSetTextColor [0, 0, 0, 1.0]; + }; + _control ctrlCommit 0; + }; +} forEach [0, 3, 8]; + +{ + for "_row" from 0 to 49 do { + _control = (__dsp displayCtrl (90000 + (12 + _forEachIndex) * 100 + _row)); + _control ctrlSetText ((GVAR(rangeCardDataLead) select _x) select _row); + if (_row >= (GVAR(lastValidRow) select _x)) then { + _control ctrlSetTextColor [0, 0, 0, 0.6]; + } else { + _control ctrlSetTextColor [0, 0, 0, 1.0]; + }; + _control ctrlCommit 0; + }; +} forEach [0, 3, 8]; + +if (_useABConfig) then { + ctrlSetText [770020, "For best results keep ammunition at ambient air temperature. Tables calculated for the above listed barrel"]; + ctrlSetText [770021, "and load with optic mounted 1.5'' above line of bore."]; +} else { + ctrlSetText [770020, ""]; + ctrlSetText [770021, ""]; +}; \ No newline at end of file diff --git a/addons/rangecard/functions/script_component.hpp b/addons/rangecard/functions/script_component.hpp new file mode 100644 index 0000000000..fdc4a3d486 --- /dev/null +++ b/addons/rangecard/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\rangecard\script_component.hpp" \ No newline at end of file diff --git a/addons/rangecard/initKeybinds.sqf b/addons/rangecard/initKeybinds.sqf new file mode 100644 index 0000000000..cb6ff49206 --- /dev/null +++ b/addons/rangecard/initKeybinds.sqf @@ -0,0 +1,31 @@ +["ACE3 Equipment", QGVAR(RangeCardDialogKey), localize "STR_ACE_RangeCard_RangeCardDialogKey", +{ + // Conditions: canInteract, canShow + if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if (GVAR(RangeCardOpened)) exitWith { + closeDialog 0; + false + }; + if !(call FUNC(canShow)) exitWith {false}; + // Statement + false call FUNC(openRangeCard); + true +}, +{false}, +[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) + +["ACE3 Equipment", QGVAR(RangeCardCopyDialogKey), localize "STR_ACE_RangeCard_RangeCardCopyDialogKey", +{ + // Conditions: canInteract, canShowCopy + if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if (GVAR(RangeCardOpened)) exitWith { + closeDialog 0; + false + }; + if !(call FUNC(canShowCopy)) exitWith {false}; + // Statement + true call FUNC(openRangeCard); + true +}, +{false}, +[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) \ No newline at end of file diff --git a/addons/rangecard/script_component.hpp b/addons/rangecard/script_component.hpp new file mode 100644 index 0000000000..8281f77eb3 --- /dev/null +++ b/addons/rangecard/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT rangecard +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_RANGECARD + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_RANGECARD + #define DEBUG_SETTINGS DEBUG_SETTINGS_RANGECARD +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/rangecard/stringtable.xml b/addons/rangecard/stringtable.xml new file mode 100644 index 0000000000..cf013f2ae3 --- /dev/null +++ b/addons/rangecard/stringtable.xml @@ -0,0 +1,54 @@ + + + + + Range Card + Tabela balistyczna + Tarjeta de distancias + Vzdálenostní tabulka + Tabela de distâncias + + + 50 METER increments -- MRAD/MRAD (reticle/turrets) + Co 50 metrów - MRAD/MRAD (siatka/pokrętło) + Incrementos de 50 METROS -- MRAD/MRAD (retícula/torretas) + Přidat 50 METRŮ -- MRAD/MRAD (síťka/věže) + Incrementos de 50 METROS - MRAD/MRAD (retícula/torres) + + + Open Range Card + Otwórz tabelę balistyczną + Abrir tarjeta de distancias + Otevřít vzdálenostní tabulku + Abrir tabela de distâncias + + + Open Range Card Copy + Otwórz kopię tabeli balistycznej + Abrir copia de tarjeta de distancias + Otevřít kopii vzdálenostní tabulky + Abrir cópia da tabela de distâncias + + + Open Range Card + Otwórz tabelę balistyczną + Abrir tarjeta de distancias + Otevřít vzdálenostní tabulku + Abrir tabela de distäncias + + + Open Range Card Copy + Otwórz kopię tabeli balistycznej + Abrir copia de tarjeta de distancias + Otevřít kopii vzdálenostní tabulky + Abrir cópia da tabela de distâncias + + + Copy Range Card + Skopiuj tabelę balistyczną + Copiar tarjeta de distancias + Kopírovat vzdálenostní tabulku + Copiar tabela de distäncias + + + \ No newline at end of file diff --git a/addons/realisticnames/CfgMagazines.hpp b/addons/realisticnames/CfgMagazines.hpp index cf555c9603..69d6cfa579 100644 --- a/addons/realisticnames/CfgMagazines.hpp +++ b/addons/realisticnames/CfgMagazines.hpp @@ -359,61 +359,61 @@ class CfgMagazines { class CA_Magazine; // http://en.wikipedia.org/wiki/M15_mine class ATMine_Range_Mag: CA_Magazine { - displayName = "$STR_ACE_RealisticNames_ATMine_Name"; + displayName = CSTRING(ATMine_Name); }; // http://en.wikipedia.org/wiki/VS-50_mine class APERSMine_Range_Mag: ATMine_Range_Mag { - displayName = "$STR_ACE_RealisticNames_APERSMine_Name"; + displayName = CSTRING(APERSMine_Name); }; // https://www.buymilsurp.com/us-m26-antipersonnel-bounding-mine-p-5419.html class APERSBoundingMine_Range_Mag: ATMine_Range_Mag { - displayName = "$STR_ACE_RealisticNames_APERSBoundingMine_Name"; + displayName = CSTRING(APERSBoundingMine_Name); }; // http://en.wikipedia.org/wiki/PMR-3_mine class APERSTripMine_Wire_Mag: ATMine_Range_Mag { - displayName = "$STR_ACE_RealisticNames_APERSTripwireMine_Name"; + displayName = CSTRING(APERSTripwireMine_Name); }; // the following ones can be found here: http://www.dtic.mil/dtic/tr/fulltext/u2/a567897.pdf class SLAMDirectionalMine_Wire_Mag: ATMine_Range_Mag { - displayName = "$STR_ACE_RealisticNames_SLAM_Name"; + displayName = CSTRING(SLAM_Name); }; // claymore class ClaymoreDirectionalMine_Remote_Mag: CA_Magazine { - displayName = "$STR_ACE_RealisticNames_Claymore_Name"; + displayName = CSTRING(Claymore_Name); }; // satchels class SatchelCharge_Remote_Mag: CA_Magazine { - displayName = "$STR_ACE_RealisticNames_SatchelCharge_Name"; + displayName = CSTRING(SatchelCharge_Name); }; class DemoCharge_Remote_Mag: SatchelCharge_Remote_Mag { - displayName = "$STR_ACE_RealisticNames_DemoCharge_Name"; + displayName = CSTRING(DemoCharge_Name); }; // hand grenades class HandGrenade: CA_Magazine { - displayName = "$STR_ACE_RealisticNames_HandGrenade_Name"; + displayName = CSTRING(HandGrenade_Name); }; class SmokeShell: HandGrenade { - displayName = "$STR_ACE_RealisticNames_SmokeShell_Name"; + displayName = CSTRING(SmokeShell_Name); }; class SmokeShellBlue: SmokeShell { - displayName = "$STR_ACE_RealisticNames_SmokeShellBlue_Name"; + displayName = CSTRING(SmokeShellBlue_Name); }; class SmokeShellGreen: SmokeShell { - displayName = "$STR_ACE_RealisticNames_SmokeShellGreen_Name"; + displayName = CSTRING(SmokeShellGreen_Name); }; class SmokeShellOrange: SmokeShell { - displayName = "$STR_ACE_RealisticNames_SmokeShellOrange_Name"; + displayName = CSTRING(SmokeShellOrange_Name); }; class SmokeShellPurple: SmokeShell { - displayName = "$STR_ACE_RealisticNames_SmokeShellPurple_Name"; + displayName = CSTRING(SmokeShellPurple_Name); }; class SmokeShellRed: SmokeShell { - displayName = "$STR_ACE_RealisticNames_SmokeShellRed_Name"; + displayName = CSTRING(SmokeShellRed_Name); }; class SmokeShellYellow: SmokeShell { - displayName = "$STR_ACE_RealisticNames_SmokeShellYellow_Name"; + displayName = CSTRING(SmokeShellYellow_Name); }; }; diff --git a/addons/realisticnames/CfgVehicles.hpp b/addons/realisticnames/CfgVehicles.hpp index cf1ce87b80..aef52578e2 100644 --- a/addons/realisticnames/CfgVehicles.hpp +++ b/addons/realisticnames/CfgVehicles.hpp @@ -3,94 +3,94 @@ class CfgVehicles { // static weapons class StaticMGWeapon; class HMG_01_base_F: StaticMGWeapon { - displayName = "$STR_ACE_RealisticNames_HMG_01_Name"; + displayName = CSTRING(HMG_01_Name); }; class HMG_01_A_base_F: HMG_01_base_F { - displayName = "$STR_ACE_RealisticNames_HMG_01_A_Name"; + displayName = CSTRING(HMG_01_A_Name); }; class HMG_01_high_base_F: HMG_01_base_F { - displayName = "$STR_ACE_RealisticNames_HMG_01_high_Name"; + displayName = CSTRING(HMG_01_high_Name); }; class AT_01_base_F; class B_static_AT_F: AT_01_base_F { - displayName = "$STR_ACE_RealisticNames_static_AT_Name"; + displayName = CSTRING(static_AT_Name); }; class O_static_AT_F: AT_01_base_F { - displayName = "$STR_ACE_RealisticNames_static_AT_Name"; + displayName = CSTRING(static_AT_Name); }; class I_static_AT_F: AT_01_base_F { - displayName = "$STR_ACE_RealisticNames_static_AT_Name"; + displayName = CSTRING(static_AT_Name); }; class AA_01_base_F; class B_static_AA_F: AA_01_base_F { - displayName = "$STR_ACE_RealisticNames_static_AA_Name"; + displayName = CSTRING(static_AA_Name); }; class O_static_AA_F: AA_01_base_F { - displayName = "$STR_ACE_RealisticNames_static_AA_Name"; + displayName = CSTRING(static_AA_Name); }; class I_static_AA_F: AA_01_base_F { - displayName = "$STR_ACE_RealisticNames_static_AA_Name"; + displayName = CSTRING(static_AA_Name); }; class GMG_TriPod; class GMG_01_base_F: GMG_TriPod { - displayName = "$STR_ACE_RealisticNames_GMG_01_Name"; + displayName = CSTRING(GMG_01_Name); }; class GMG_01_A_base_F: GMG_01_base_F { - displayName = "$STR_ACE_RealisticNames_GMG_01_A_Name"; + displayName = CSTRING(GMG_01_A_Name); }; class GMG_01_high_base_F: GMG_01_base_F { - displayName = "$STR_ACE_RealisticNames_GMG_01_high_Name"; + displayName = CSTRING(GMG_01_high_Name); }; // M-ATV class MRAP_01_base_F; class B_MRAP_01_F: MRAP_01_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_01_Name"; + displayName = CSTRING(MRAP_01_Name); }; class MRAP_01_gmg_base_F: MRAP_01_base_F {}; class B_MRAP_01_gmg_F: MRAP_01_gmg_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_01_gmg_Name"; + displayName = CSTRING(MRAP_01_gmg_Name); }; class MRAP_01_hmg_base_F: MRAP_01_gmg_base_F {}; class B_MRAP_01_hmg_F: MRAP_01_hmg_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_01_hmg_Name"; + displayName = CSTRING(MRAP_01_hmg_Name); }; // punisher class MRAP_02_base_F; class O_MRAP_02_F: MRAP_02_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_02_Name"; + displayName = CSTRING(MRAP_02_Name); }; class MRAP_02_hmg_base_F: MRAP_02_base_F {}; class O_MRAP_02_hmg_F: MRAP_02_hmg_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_02_hmg_Name"; + displayName = CSTRING(MRAP_02_hmg_Name); }; class MRAP_02_gmg_base_F: MRAP_02_hmg_base_F {}; class O_MRAP_02_gmg_F: MRAP_02_gmg_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_02_gmg_Name"; + displayName = CSTRING(MRAP_02_gmg_Name); }; // strider class MRAP_03_base_F; class I_MRAP_03_F: MRAP_03_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_03_Name"; + displayName = CSTRING(MRAP_03_Name); }; class MRAP_03_hmg_base_F: MRAP_03_base_F {}; class I_MRAP_03_hmg_F: MRAP_03_hmg_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_03_hmg_Name"; + displayName = CSTRING(MRAP_03_hmg_Name); }; class MRAP_03_gmg_base_F: MRAP_03_hmg_base_F {}; class I_MRAP_03_gmg_F: MRAP_03_gmg_base_F { - displayName = "$STR_ACE_RealisticNames_MRAP_03_gmg_Name"; + displayName = CSTRING(MRAP_03_gmg_Name); }; // merkava derivates @@ -98,24 +98,24 @@ class CfgVehicles { class B_MBT_01_base_F: MBT_01_base_F {}; class B_MBT_01_cannon_F: B_MBT_01_base_F { - displayName = "$STR_ACE_RealisticNames_MBT_01_cannon_Name"; + displayName = CSTRING(MBT_01_cannon_Name); }; class B_MBT_01_TUSK_F: B_MBT_01_cannon_F { - displayName = "$STR_ACE_RealisticNames_MBT_01_TUSK_Name"; + displayName = CSTRING(MBT_01_TUSK_Name); }; class MBT_01_arty_base_F: MBT_01_base_F {}; class B_MBT_01_arty_base_F: MBT_01_arty_base_F {}; class B_MBT_01_arty_F: B_MBT_01_arty_base_F { - displayName = "$STR_ACE_RealisticNames_MBT_01_arty_Name"; + displayName = CSTRING(MBT_01_arty_Name); }; class MBT_01_mlrs_base_F: MBT_01_base_F {}; class B_MBT_01_mlrs_base_F: MBT_01_mlrs_base_F {}; class B_MBT_01_mlrs_F: B_MBT_01_mlrs_base_F { - displayName = "$STR_ACE_RealisticNames_MBT_01_mlrs_Name"; // Fictional name, (probably wrong) hebrew translation of storm. + displayName = CSTRING(MBT_01_mlrs_Name); // Fictional name, (probably wrong) hebrew translation of storm. }; // T100 derivates @@ -123,306 +123,306 @@ class CfgVehicles { class O_MBT_02_base_F: MBT_02_base_F {}; class O_MBT_02_cannon_F: O_MBT_02_base_F { - displayName = "$STR_ACE_RealisticNames_MBT_02_cannon_Name"; + displayName = CSTRING(MBT_02_cannon_Name); }; class MBT_02_arty_base_F: MBT_02_base_F {}; class O_MBT_02_arty_base_F: MBT_02_arty_base_F {}; class O_MBT_02_arty_F: O_MBT_02_arty_base_F { - displayName = "$STR_ACE_RealisticNames_MBT_02_arty_Name"; + displayName = CSTRING(MBT_02_arty_Name); }; // leopard sg class I_MBT_03_base_F; class I_MBT_03_cannon_F: I_MBT_03_base_F { - displayName = "$STR_ACE_RealisticNames_MBT_03_cannon_Name"; + displayName = CSTRING(MBT_03_cannon_Name); }; // tracked apcs class B_APC_Tracked_01_base_F; class B_APC_Tracked_01_rcws_F: B_APC_Tracked_01_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Tracked_01_rcws_Name"; + displayName = CSTRING(APC_Tracked_01_rcws_Name); }; class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Tracked_01_AA_Name"; // Fictional name, (probably wrong) hebrew translation of cheetah. + displayName = CSTRING(APC_Tracked_01_AA_Name); // Fictional name, (probably wrong) hebrew translation of cheetah. }; class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Tracked_01_CRV_Name"; + displayName = CSTRING(APC_Tracked_01_CRV_Name); }; class O_APC_Tracked_02_base_F; class O_APC_Tracked_02_cannon_F: O_APC_Tracked_02_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Tracked_02_cannon_Name"; + displayName = CSTRING(APC_Tracked_02_cannon_Name); }; class O_APC_Tracked_02_AA_F: O_APC_Tracked_02_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Tracked_02_AA_Name"; + displayName = CSTRING(APC_Tracked_02_AA_Name); }; class I_APC_tracked_03_base_F; class I_APC_tracked_03_cannon_F: I_APC_tracked_03_base_F { - displayName = "$STR_ACE_RealisticNames_APC_tracked_03_cannon_Name"; + displayName = CSTRING(APC_tracked_03_cannon_Name); }; // wheeled apcs class B_APC_Wheeled_01_base_F; class B_APC_Wheeled_01_cannon_F: B_APC_Wheeled_01_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Wheeled_cannon_Name"; + displayName = CSTRING(APC_Wheeled_cannon_Name); }; class O_APC_Wheeled_02_base_F; class O_APC_Wheeled_02_rcws_F: O_APC_Wheeled_02_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Wheeled_02_rcws_Name"; + displayName = CSTRING(APC_Wheeled_02_rcws_Name); }; class I_APC_Wheeled_03_base_F; class I_APC_Wheeled_03_cannon_F: I_APC_Wheeled_03_base_F { - displayName = "$STR_ACE_RealisticNames_APC_Wheeled_03_cannon_Name"; + displayName = CSTRING(APC_Wheeled_03_cannon_Name); }; // trucks class Truck_01_base_F; class B_Truck_01_transport_F: Truck_01_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_transport_Name"; + displayName = CSTRING(Truck_01_transport_Name); }; class B_Truck_01_covered_F: B_Truck_01_transport_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_covered_Name"; + displayName = CSTRING(Truck_01_covered_Name); }; class B_Truck_01_mover_F: B_Truck_01_transport_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_mover_Name"; + displayName = CSTRING(Truck_01_mover_Name); }; class B_Truck_01_box_F: B_Truck_01_mover_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_box_Name"; + displayName = CSTRING(Truck_01_box_Name); }; class B_Truck_01_medical_F: B_Truck_01_transport_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_medical_Name"; + displayName = CSTRING(Truck_01_medical_Name); }; class B_Truck_01_ammo_F: B_Truck_01_mover_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_ammo_Name"; + displayName = CSTRING(Truck_01_ammo_Name); }; class B_Truck_01_fuel_F: B_Truck_01_mover_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_fuel_Name"; + displayName = CSTRING(Truck_01_fuel_Name); }; class B_Truck_01_Repair_F: B_Truck_01_mover_F { - displayName = "$STR_ACE_RealisticNames_Truck_01_Repair_Name"; + displayName = CSTRING(Truck_01_Repair_Name); }; class Truck_02_transport_base_F; class O_Truck_02_transport_F: Truck_02_transport_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_transport_Name"; + displayName = CSTRING(Truck_02_transport_Name); }; class Truck_02_base_F; class O_Truck_02_covered_F: Truck_02_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_covered_Name"; + displayName = CSTRING(Truck_02_covered_Name); }; class Truck_02_Ammo_base_F; class O_Truck_02_ammo_F: Truck_02_Ammo_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_ammo_Name"; + displayName = CSTRING(Truck_02_ammo_Name); }; class Truck_02_fuel_base_F; class O_Truck_02_fuel_F: Truck_02_fuel_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_fuel_Name"; + displayName = CSTRING(Truck_02_fuel_Name); }; class Truck_02_box_base_F; class O_Truck_02_box_F: Truck_02_box_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_box_Name"; + displayName = CSTRING(Truck_02_box_Name); }; class Truck_02_medical_base_F; class O_Truck_02_medical_F: Truck_02_medical_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_medical_Name"; + displayName = CSTRING(Truck_02_medical_Name); }; class I_Truck_02_transport_F: Truck_02_transport_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_transport_Name"; + displayName = CSTRING(Truck_02_transport_Name); }; class I_Truck_02_covered_F: Truck_02_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_covered_Name"; + displayName = CSTRING(Truck_02_covered_Name); }; class I_Truck_02_ammo_F: Truck_02_Ammo_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_ammo_Name"; + displayName = CSTRING(Truck_02_ammo_Name); }; class I_Truck_02_fuel_F: Truck_02_fuel_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_fuel_Name"; + displayName = CSTRING(Truck_02_fuel_Name); }; class I_Truck_02_box_F: Truck_02_box_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_box_Name"; + displayName = CSTRING(Truck_02_box_Name); }; class I_Truck_02_medical_F: Truck_02_medical_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_02_medical_Name"; + displayName = CSTRING(Truck_02_medical_Name); }; class Truck_03_base_F; class O_Truck_03_transport_F: Truck_03_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_03_transport_Name"; + displayName = CSTRING(Truck_03_transport_Name); }; class O_Truck_03_covered_F: Truck_03_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_03_covered_Name"; + displayName = CSTRING(Truck_03_covered_Name); }; class O_Truck_03_device_F: Truck_03_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_03_device_Name"; + displayName = CSTRING(Truck_03_device_Name); }; class O_Truck_03_ammo_F: Truck_03_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_03_ammo_Name"; + displayName = CSTRING(Truck_03_ammo_Name); }; class O_Truck_03_fuel_F: Truck_03_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_03_fuel_Name"; + displayName = CSTRING(Truck_03_fuel_Name); }; class O_Truck_03_repair_F: Truck_03_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_03_repair_Name"; + displayName = CSTRING(Truck_03_repair_Name); }; class O_Truck_03_medical_F: Truck_03_base_F { - displayName = "$STR_ACE_RealisticNames_Truck_03_medical_Name"; + displayName = CSTRING(Truck_03_medical_Name); }; // helicopters class Heli_Attack_01_base_F; class B_Heli_Attack_01_F: Heli_Attack_01_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Attack_01_Name"; + displayName = CSTRING(Heli_Attack_01_Name); }; class Heli_Light_01_unarmed_base_F; class B_Heli_Light_01_F: Heli_Light_01_unarmed_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Light_01_Name"; + displayName = CSTRING(Heli_Light_01_Name); }; class Heli_Light_01_armed_base_F; class B_Heli_Light_01_armed_F: Heli_Light_01_armed_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Light_01_armed_Name"; + displayName = CSTRING(Heli_Light_01_armed_Name); }; class Heli_Light_01_civil_base_F: Heli_Light_01_unarmed_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Light_01_civil_Name"; + displayName = CSTRING(Heli_Light_01_civil_Name); }; class Heli_Transport_03_base_F; class B_Heli_Transport_03_F: Heli_Transport_03_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Transport_03_Name"; + displayName = CSTRING(Heli_Transport_03_Name); }; class Heli_Transport_03_unarmed_base_F; class B_Heli_Transport_03_unarmed_F: Heli_Transport_03_unarmed_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Transport_03_unarmed_Name"; + displayName = CSTRING(Heli_Transport_03_unarmed_Name); }; class Heli_Light_02_base_F; class O_Heli_Light_02_F: Heli_Light_02_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Light_02_Name"; + displayName = CSTRING(Heli_Light_02_Name); }; class Heli_Light_02_unarmed_base_F; class O_Heli_Light_02_unarmed_F: Heli_Light_02_unarmed_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Light_02_unarmed_Name"; + displayName = CSTRING(Heli_Light_02_unarmed_Name); }; class Heli_light_03_base_F; class I_Heli_light_03_F: Heli_light_03_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_light_03_Name"; + displayName = CSTRING(Heli_light_03_Name); }; class Heli_light_03_unarmed_base_F; class I_Heli_light_03_unarmed_F: Heli_light_03_unarmed_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_light_03_unarmed_Name"; + displayName = CSTRING(Heli_light_03_unarmed_Name); }; class Heli_Transport_02_base_F; class I_Heli_Transport_02_F: Heli_Transport_02_base_F { - displayName = "$STR_ACE_RealisticNames_Heli_Transport_02_Name"; + displayName = CSTRING(Heli_Transport_02_Name); }; // planes class Plane_CAS_01_base_F; class B_Plane_CAS_01_F: Plane_CAS_01_base_F { - displayName = "$STR_ACE_RealisticNames_Plane_CAS_01_Name"; + displayName = CSTRING(Plane_CAS_01_Name); }; class Plane_CAS_02_base_F; class O_Plane_CAS_02_F: Plane_CAS_02_base_F { - displayName = "$STR_ACE_RealisticNames_Plane_CAS_02_Name"; + displayName = CSTRING(Plane_CAS_02_Name); }; class Plane_Fighter_03_base_F; class I_Plane_Fighter_03_CAS_F: Plane_Fighter_03_base_F { - displayName = "$STR_ACE_RealisticNames_Plane_Fighter_03_CAS_Name"; + displayName = CSTRING(Plane_Fighter_03_CAS_Name); }; class I_Plane_Fighter_03_AA_F: I_Plane_Fighter_03_CAS_F { - displayName = "$STR_ACE_RealisticNames_Plane_Fighter_03_AA_Name"; + displayName = CSTRING(Plane_Fighter_03_AA_Name); }; // uavs class UAV_02_base_F; class B_UAV_02_F: UAV_02_base_F { - displayName = "$STR_ACE_RealisticNames_UAV_02_Name"; + displayName = CSTRING(UAV_02_Name); }; class O_UAV_02_F: UAV_02_base_F { - displayName = "$STR_ACE_RealisticNames_UAV_02_Name"; + displayName = CSTRING(UAV_02_Name); }; class I_UAV_02_F: UAV_02_base_F { - displayName = "$STR_ACE_RealisticNames_UAV_02_Name"; + displayName = CSTRING(UAV_02_Name); }; class UAV_02_CAS_base_F: UAV_02_base_F {}; class B_UAV_02_CAS_F: UAV_02_CAS_base_F { - displayName = "$STR_ACE_RealisticNames_UAV_02_CAS_Name"; + displayName = CSTRING(UAV_02_CAS_Name); }; class O_UAV_02_CAS_F: UAV_02_CAS_base_F { - displayName = "$STR_ACE_RealisticNames_UAV_02_CAS_Name"; + displayName = CSTRING(UAV_02_CAS_Name); }; class I_UAV_02_CAS_F: UAV_02_CAS_base_F { - displayName = "$STR_ACE_RealisticNames_UAV_02_CAS_Name"; + displayName = CSTRING(UAV_02_CAS_Name); }; // pistols class Pistol_Base_F; class Weapon_hgun_P07_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_P07_Name"; + displayName = CSTRING(hgun_P07_Name); }; class Weapon_hgun_Rook40_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Rook40_Name"; + displayName = CSTRING(hgun_Rook40_Name); }; class Weapon_hgun_ACPC2_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_ACPC2_Name"; + displayName = CSTRING(hgun_ACPC2_Name); }; class Weapon_hgun_Pistol_heavy_01_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Pistol_heavy_01_Name"; + displayName = CSTRING(hgun_Pistol_heavy_01_Name); }; class Weapon_hgun_Pistol_heavy_02_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Pistol_heavy_02_Name"; + displayName = CSTRING(hgun_Pistol_heavy_02_Name); }; class Weapon_hgun_Pistol_Signal_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Pistol_Signal_Name"; + displayName = CSTRING(hgun_Pistol_Signal_Name); }; // rocket launchers class Launcher_Base_F; class Weapon_launch_NLAW_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_NLAW_Name"; + displayName = CSTRING(launch_NLAW_Name); }; class Weapon_launch_RPG32_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_RPG32_Name"; + displayName = CSTRING(launch_RPG32_Name); }; /*class Weapon_launch_Titan_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_Titan_Name"; + displayName = CSTRING(launch_Titan_Name); }; class Weapon_launch_Titan_short_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_Titan_short_Name"; + displayName = CSTRING(launch_Titan_short_Name); }; class Weapon_launch_B_Titan_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_Titan_Name"; + displayName = CSTRING(launch_Titan_Name); };*/ //class Weapon_launch_I_Titan_F: Weapon_launch_B_Titan_F {}; //class Weapon_launch_O_Titan_F: Weapon_launch_B_Titan_F {}; /*class Weapon_launch_launch_B_Titan_short_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_Titan_short_Name"; + displayName = CSTRING(launch_Titan_short_Name); };*/ //class Weapon_launch_I_Titan_short_F: Weapon_launch_launch_B_Titan_short_F {}; //class Weapon_launch_O_Titan_short_F: Weapon_launch_launch_B_Titan_short_F {}; @@ -432,205 +432,205 @@ class CfgVehicles { // MX class Weapon_Base_F; class Weapon_arifle_MX_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_Name"; + displayName = CSTRING(arifle_MX_Name); }; class Weapon_arifle_MXC_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MXC_Name"; + displayName = CSTRING(arifle_MXC_Name); }; class Weapon_arifle_MX_GL_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_GL_Name"; + displayName = CSTRING(arifle_MX_GL_Name); }; class Weapon_arifle_MX_SW_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_SW_Name"; + displayName = CSTRING(arifle_MX_SW_Name); }; class Weapon_arifle_MXM_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MXM_Name"; + displayName = CSTRING(arifle_MXM_Name); }; // Katiba class Weapon_arifle_Katiba_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Katiba_Name"; + displayName = CSTRING(arifle_Katiba_Name); }; class Weapon_arifle_Katiba_C_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Katiba_C_Name"; + displayName = CSTRING(arifle_Katiba_C_Name); }; class Weapon_arifle_Katiba_GL_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Katiba_GL_Name"; + displayName = CSTRING(arifle_Katiba_GL_Name); }; // F2000 class Weapon_arifle_Mk20_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_Name"; + displayName = CSTRING(arifle_Mk20_Name); }; class Weapon_arifle_Mk20_plain_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_plain_Name"; + displayName = CSTRING(arifle_Mk20_plain_Name); }; class Weapon_arifle_Mk20C_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20C_Name"; + displayName = CSTRING(arifle_Mk20C_Name); }; class Weapon_arifle_Mk20C_plain_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20C_plain_Name"; + displayName = CSTRING(arifle_Mk20C_plain_Name); }; class Weapon_arifle_Mk20_GL_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_GL_Name"; + displayName = CSTRING(arifle_Mk20_GL_Name); }; class Weapon_arifle_Mk20_GL_plain_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_GL_plain_Name"; + displayName = CSTRING(arifle_Mk20_GL_plain_Name); }; // TAR-21 class Weapon_arifle_TRG21_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_TRG21_Name"; + displayName = CSTRING(arifle_TRG21_Name); }; class Weapon_arifle_TRG20_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_TRG20_Name"; + displayName = CSTRING(arifle_TRG20_Name); }; class Weapon_arifle_TRG21_GL_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_TRG21_GL_Name"; + displayName = CSTRING(arifle_TRG21_GL_Name); }; // sub machine guns class Weapon_SMG_01_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_SMG_01_Name"; + displayName = CSTRING(SMG_01_Name); }; class Weapon_SMG_02_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_SMG_02_Name"; + displayName = CSTRING(SMG_02_Name); }; class Weapon_hgun_PDW2000_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_PDW2000_Name"; + displayName = CSTRING(hgun_PDW2000_Name); }; class Weapon_arifle_SDAR_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_SDAR_Name"; + displayName = CSTRING(arifle_SDAR_Name); }; // machine guns class Weapon_LMG_Mk200_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_LMG_Mk200_Name"; + displayName = CSTRING(LMG_Mk200_Name); }; class Weapon_LMG_Zafir_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_LMG_Zafir_Name"; + displayName = CSTRING(LMG_Zafir_Name); }; // sniper rifles class Weapon_srifle_EBR_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_EBR_Name"; + displayName = CSTRING(srifle_EBR_Name); }; class Weapon_srifle_GM6_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_GM6_Name"; + displayName = CSTRING(srifle_GM6_Name); }; class Weapon_srifle_GM6_camo_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_GM6_camo_Name"; + displayName = CSTRING(srifle_GM6_camo_Name); }; class Weapon_srifle_LRR_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_LRR_Name"; + displayName = CSTRING(srifle_LRR_Name); }; class Weapon_srifle_LRR_camo_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_LRR_camo_Name"; + displayName = CSTRING(srifle_LRR_camo_Name); }; class Weapon_srifle_DMR_01_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_01_Name"; + displayName = CSTRING(srifle_DMR_01_Name); }; // marksmen /*class Weapon_srifle_DMR_02_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_02"; + displayName = CSTRING(srifle_DMR_02); }; class Weapon_srifle_DMR_02_camo_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_02_camo"; + displayName = CSTRING(srifle_DMR_02_camo); }; class Weapon_srifle_DMR_02_sniper_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_02_sniper"; + displayName = CSTRING(srifle_DMR_02_sniper); }; class Weapon_srifle_DMR_03_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03"; + displayName = CSTRING(srifle_DMR_03); }; class Weapon_srifle_DMR_03_khaki_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_khaki"; + displayName = CSTRING(srifle_DMR_03_khaki); }; class Weapon_srifle_DMR_03_tan_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_tan"; + displayName = CSTRING(srifle_DMR_03_tan); }; class Weapon_srifle_DMR_03_multicam_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_multicam"; + displayName = CSTRING(srifle_DMR_03_multicam); }; class Weapon_srifle_DMR_03_woodland_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_woodland"; + displayName = CSTRING(srifle_DMR_03_woodland); }; class Weapon_srifle_DMR_04_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_04"; + displayName = CSTRING(srifle_DMR_04); }; class Weapon_srifle_DMR_04_Tan_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_04_Tan"; + displayName = CSTRING(srifle_DMR_04_Tan); }; class Weapon_srifle_DMR_05_blk_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_blk"; + displayName = CSTRING(srifle_DMR_05_blk); }; class Weapon_srifle_DMR_05_hex_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_hex"; + displayName = CSTRING(srifle_DMR_05_hex); }; class Weapon_srifle_DMR_05_tan_f: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_tan"; + displayName = CSTRING(srifle_DMR_05_tan); }; class Weapon_srifle_DMR_06_camo_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_06_camo"; + displayName = CSTRING(srifle_DMR_06_camo); }; class Weapon_srifle_DMR_06_olive_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_06_olive"; + displayName = CSTRING(srifle_DMR_06_olive); }; class Weapon_MMG_01_hex_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_MMG_01_hex"; + displayName = CSTRING(MMG_01_hex); }; class Weapon_MMG_01_tan_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_MMG_01_tan"; + displayName = CSTRING(MMG_01_tan); }; class Weapon_MMG_02_camo_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_MMG_02_camo"; + displayName = CSTRING(MMG_02_camo); }; class Weapon_MMG_02_black_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_MMG_02_black"; + displayName = CSTRING(MMG_02_black); }; class Weapon_MMG_02_sand_F: Weapon_Base_F { - displayName = "$STR_ACE_RealisticNames_MMG_02_sand"; + displayName = CSTRING(MMG_02_sand); };*/ }; diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index e61457df5d..0a83239047 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -7,299 +7,299 @@ class CfgWeapons { // MX class arifle_MX_Base_F; class arifle_MX_F: arifle_MX_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_Name"; + displayName = CSTRING(arifle_MX_Name); }; class arifle_MX_Black_F: arifle_MX_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_Black_Name"; + displayName = CSTRING(arifle_MX_Black_Name); }; class arifle_MXC_F: arifle_MX_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MXC_Name"; + displayName = CSTRING(arifle_MXC_Name); }; class arifle_MXC_Black_F: arifle_MXC_F { - displayName = "$STR_ACE_RealisticNames_arifle_MXC_Black_Name"; + displayName = CSTRING(arifle_MXC_Black_Name); }; class arifle_MX_GL_F: arifle_MX_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_GL_Name"; + displayName = CSTRING(arifle_MX_GL_Name); }; class arifle_MX_GL_Black_F: arifle_MX_GL_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_GL_Black_Name"; + displayName = CSTRING(arifle_MX_GL_Black_Name); }; class arifle_MX_SW_F: arifle_MX_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_SW_Name"; + displayName = CSTRING(arifle_MX_SW_Name); }; class arifle_MX_SW_Black_F: arifle_MX_SW_F { - displayName = "$STR_ACE_RealisticNames_arifle_MX_SW_Black_Name"; + displayName = CSTRING(arifle_MX_SW_Black_Name); }; class arifle_MXM_F: arifle_MX_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_MXM_Name"; + displayName = CSTRING(arifle_MXM_Name); }; class arifle_MXM_Black_F: arifle_MXM_F { - displayName = "$STR_ACE_RealisticNames_arifle_MXM_Black_Name"; + displayName = CSTRING(arifle_MXM_Black_Name); }; // Katiba class arifle_katiba_Base_F; class arifle_Katiba_F: arifle_katiba_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Katiba_Name"; + displayName = CSTRING(arifle_Katiba_Name); }; class arifle_Katiba_GL_F: arifle_katiba_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Katiba_GL_Name"; + displayName = CSTRING(arifle_Katiba_GL_Name); }; class arifle_Katiba_C_F: arifle_katiba_Base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Katiba_C_Name"; + displayName = CSTRING(arifle_Katiba_C_Name); }; // SDAR class SDAR_base_F; class arifle_SDAR_F: SDAR_base_F { - displayName = "$STR_ACE_RealisticNames_arifle_SDAR_Name"; + displayName = CSTRING(arifle_SDAR_Name); }; // TAR-21 class Tavor_base_F; class arifle_TRG21_F: Tavor_base_F { - displayName = "$STR_ACE_RealisticNames_arifle_TRG21_Name"; + displayName = CSTRING(arifle_TRG21_Name); }; class arifle_TRG21_GL_F: arifle_TRG21_F { - displayName = "$STR_ACE_RealisticNames_arifle_TRG21_GL_Name"; + displayName = CSTRING(arifle_TRG21_GL_Name); }; class arifle_TRG20_F: Tavor_base_F { - displayName = "$STR_ACE_RealisticNames_arifle_TRG20_Name"; + displayName = CSTRING(arifle_TRG20_Name); }; // F2000 class mk20_base_F; class arifle_Mk20_F: mk20_base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_Name"; + displayName = CSTRING(arifle_Mk20_Name); }; class arifle_Mk20_plain_F: arifle_Mk20_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_plain_Name"; + displayName = CSTRING(arifle_Mk20_plain_Name); }; class arifle_Mk20C_F: mk20_base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20C_Name"; + displayName = CSTRING(arifle_Mk20C_Name); }; class arifle_Mk20C_plain_F: arifle_Mk20C_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20C_plain_Name"; + displayName = CSTRING(arifle_Mk20C_plain_Name); }; class arifle_Mk20_GL_F: mk20_base_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_GL_Name"; + displayName = CSTRING(arifle_Mk20_GL_Name); }; class arifle_Mk20_GL_plain_F: arifle_Mk20_GL_F { - displayName = "$STR_ACE_RealisticNames_arifle_Mk20_GL_plain_Name"; + displayName = CSTRING(arifle_Mk20_GL_plain_Name); }; // Vector class SMG_01_Base; class SMG_01_F: SMG_01_Base { - displayName = "$STR_ACE_RealisticNames_SMG_01_Name"; + displayName = CSTRING(SMG_01_Name); }; // Scorpion class SMG_02_base_F; class SMG_02_F: SMG_02_base_F { - displayName = "$STR_ACE_RealisticNames_SMG_02_Name"; + displayName = CSTRING(SMG_02_Name); }; // PDW 2000 class pdw2000_base_F; class hgun_pdw2000_F: pdw2000_base_F { - displayName = "$STR_ACE_RealisticNames_hgun_PDW2000_Name"; + displayName = CSTRING(hgun_PDW2000_Name); }; // pistols class Pistol_Base_F; class hgun_P07_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_P07_Name"; + displayName = CSTRING(hgun_P07_Name); }; class hgun_Rook40_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Rook40_Name"; + displayName = CSTRING(hgun_Rook40_Name); }; class hgun_ACPC2_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_ACPC2_Name"; + displayName = CSTRING(hgun_ACPC2_Name); }; class hgun_Pistol_heavy_01_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Pistol_heavy_01_Name"; + displayName = CSTRING(hgun_Pistol_heavy_01_Name); }; class hgun_Pistol_heavy_02_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Pistol_heavy_02_Name"; + displayName = CSTRING(hgun_Pistol_heavy_02_Name); }; class hgun_Pistol_Signal_F: Pistol_Base_F { - displayName = "$STR_ACE_RealisticNames_hgun_Pistol_Signal_Name"; + displayName = CSTRING(hgun_Pistol_Signal_Name); }; // machine guns class Rifle_Long_Base_F; class LMG_Mk200_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_LMG_Mk200_Name"; + displayName = CSTRING(LMG_Mk200_Name); }; class LMG_Zafir_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_LMG_Zafir_Name"; + displayName = CSTRING(LMG_Zafir_Name); }; // sniper rifles class EBR_base_F; class srifle_EBR_F: EBR_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_EBR_Name"; + displayName = CSTRING(srifle_EBR_Name); }; class LRR_base_F; class srifle_LRR_F: LRR_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_LRR_Name"; + displayName = CSTRING(srifle_LRR_Name); }; class srifle_LRR_camo_F: srifle_LRR_F { - displayName = "$STR_ACE_RealisticNames_srifle_LRR_camo_Name"; + displayName = CSTRING(srifle_LRR_camo_Name); }; class GM6_base_F; class srifle_GM6_F: GM6_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_GM6_Name"; + displayName = CSTRING(srifle_GM6_Name); }; class srifle_GM6_camo_F: srifle_GM6_F { - displayName = "$STR_ACE_RealisticNames_srifle_GM6_camo_Name"; + displayName = CSTRING(srifle_GM6_camo_Name); }; class DMR_01_base_F; class srifle_DMR_01_F: DMR_01_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_01_Name"; + displayName = CSTRING(srifle_DMR_01_Name); }; // launchers class Launcher_Base_F; class launch_RPG32_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_RPG32_Name"; + displayName = CSTRING(launch_RPG32_Name); }; /*class launch_Titan_base: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_Titan_Name"; + displayName = CSTRING(launch_Titan_Name); }; class launch_Titan_short_base: launch_Titan_base { - displayName = "$STR_ACE_RealisticNames_launch_Titan_short_Name"; + displayName = CSTRING(launch_Titan_short_Name); };*/ class launch_NLAW_F: Launcher_Base_F { - displayName = "$STR_ACE_RealisticNames_launch_NLAW_Name"; + displayName = CSTRING(launch_NLAW_Name); }; // marksmen marksman class DMR_02_base_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_DMR_02"; //MAR-10 .338"; + displayName = CSTRING(DMR_02); //MAR-10 .338; }; class srifle_DMR_02_F: DMR_02_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_02"; //MAR-10 .338 (Black)"; + displayName = CSTRING(srifle_DMR_02); //MAR-10 .338 (Black); }; class srifle_DMR_02_camo_F: srifle_DMR_02_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_02_camo"; //MAR-10 .338 (Camo)"; + displayName = CSTRING(srifle_DMR_02_camo); //MAR-10 .338 (Camo); }; class srifle_DMR_02_sniper_F: srifle_DMR_02_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_02_sniper"; //MAR-10 .338 (Sand)"; + displayName = CSTRING(srifle_DMR_02_sniper); //MAR-10 .338 (Sand); }; class DMR_03_base_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_DMR_03"; //Mk-I EMR 7.62 mm"; + displayName = CSTRING(DMR_03); //Mk-I EMR 7.62 mm; }; class srifle_DMR_03_F: DMR_03_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03"; //Mk-I EMR 7.62 mm (Black)"; + displayName = CSTRING(srifle_DMR_03); //Mk-I EMR 7.62 mm (Black); }; class srifle_DMR_03_khaki_F: srifle_DMR_03_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_khaki"; //Mk-I EMR 7.62 mm (Khaki)"; + displayName = CSTRING(srifle_DMR_03_khaki); //Mk-I EMR 7.62 mm (Khaki); }; class srifle_DMR_03_tan_F: srifle_DMR_03_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_tan"; //Mk-I EMR 7.62 mm (Sand)"; + displayName = CSTRING(srifle_DMR_03_tan); //Mk-I EMR 7.62 mm (Sand); }; class srifle_DMR_03_multicam_F: srifle_DMR_03_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_multicam"; //Mk-I EMR 7.62 mm (Camo)"; + displayName = CSTRING(srifle_DMR_03_multicam); //Mk-I EMR 7.62 mm (Camo); }; class srifle_DMR_03_woodland_F: srifle_DMR_03_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_woodland"; //Mk-I EMR 7.62 mm (Woodland)"; + displayName = CSTRING(srifle_DMR_03_woodland); //Mk-I EMR 7.62 mm (Woodland); }; class srifle_DMR_03_spotter_F: srifle_DMR_03_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_spotter"; //NATO DMR (provisional) spotter"; + displayName = CSTRING(srifle_DMR_03_spotter); //NATO DMR (provisional) spotter; }; class DMR_04_base_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_DMR_04"; //ASP-1 Kir 12.7 mm"; + displayName = CSTRING(DMR_04); //ASP-1 Kir 12.7 mm; }; class srifle_DMR_04_F: DMR_04_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_04"; //ASP-1 Kir 12.7 mm (Black)"; + displayName = CSTRING(srifle_DMR_04); //ASP-1 Kir 12.7 mm (Black); }; class srifle_DMR_04_Tan_F: srifle_DMR_04_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_04_Tan"; //ASP-1 Kir 12.7 mm (Tan)"; + displayName = CSTRING(srifle_DMR_04_Tan); //ASP-1 Kir 12.7 mm (Tan); }; class DMR_05_base_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_DMR_05"; //Cyrus 9.3 mm"; + displayName = CSTRING(DMR_05); //Cyrus 9.3 mm; }; class srifle_DMR_05_blk_F: DMR_05_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_blk"; //Cyrus 9.3 mm (Black) + displayName = CSTRING(srifle_DMR_05_blk); //Cyrus 9.3 mm (Black) }; class srifle_DMR_05_hex_F: srifle_DMR_05_blk_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_hex"; //Cyrus 9.3 mm (Hex)"; + displayName = CSTRING(srifle_DMR_05_hex); //Cyrus 9.3 mm (Hex); }; class srifle_DMR_05_tan_f: srifle_DMR_05_blk_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_tan"; //Cyrus 9.3 mm (Tan)"; + displayName = CSTRING(srifle_DMR_05_tan); //Cyrus 9.3 mm (Tan); }; class DMR_06_base_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_DMR_06"; //Mk14 7.62 mm"; + displayName = CSTRING(DMR_06); //Mk14 7.62 mm; }; class srifle_DMR_06_camo_F: DMR_06_base_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_06_camo"; //Mk14 7.62 mm (Camo) + displayName = CSTRING(srifle_DMR_06_camo); //Mk14 7.62 mm (Camo) }; class srifle_DMR_06_olive_F: srifle_DMR_06_camo_F { - displayName = "$STR_ACE_RealisticNames_srifle_DMR_06_olive"; //Mk14 7.62 mm (Olive)"; + displayName = CSTRING(srifle_DMR_06_olive); //Mk14 7.62 mm (Olive); }; // marksmen mgs class MMG_01_base_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_MMG_01"; //Navid 9.3 mm"; + displayName = CSTRING(MMG_01); //Navid 9.3 mm; }; class MMG_01_hex_F: MMG_01_base_F { - displayName = "$STR_ACE_RealisticNames_MMG_01_hex"; //Navid 9.3 mm (Hex)"; + displayName = CSTRING(MMG_01_hex); //Navid 9.3 mm (Hex); }; class MMG_01_tan_F: MMG_01_hex_F { - displayName = "$STR_ACE_RealisticNames_MMG_01_tan"; //Navid 9.3 mm (Tan)"; + displayName = CSTRING(MMG_01_tan); //Navid 9.3 mm (Tan); }; class MMG_02_base_F: Rifle_Long_Base_F { - displayName = "$STR_ACE_RealisticNames_MMG_02"; //SPMG .338"; + displayName = CSTRING(MMG_02); //SPMG .338; }; class MMG_02_camo_F: MMG_02_base_F { - displayName = "$STR_ACE_RealisticNames_MMG_02_camo"; //SPMG .338 (MTP)"; + displayName = CSTRING(MMG_02_camo); //SPMG .338 (MTP); }; class MMG_02_black_F: MMG_02_camo_F { - displayName = "$STR_ACE_RealisticNames_MMG_02_black"; //SPMG .338 (Black)"; + displayName = CSTRING(MMG_02_black); //SPMG .338 (Black); }; class MMG_02_sand_F: MMG_02_camo_F { - displayName = "$STR_ACE_RealisticNames_MMG_02_sand"; //SPMG .338 (Sand)"; + displayName = CSTRING(MMG_02_sand); //SPMG .338 (Sand); }; // vehicle weapons diff --git a/addons/realisticnames/script_component.hpp b/addons/realisticnames/script_component.hpp index 1d519dfdef..0dd8e679a7 100644 --- a/addons/realisticnames/script_component.hpp +++ b/addons/realisticnames/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT realisticnames -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_REALISTICNAMES #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_REALISTICNAMES #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 54a6c1e869..483242835f 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -426,7 +426,7 @@ KamAZ Transport KamAZ de transporte KamAZ transportowy - KAMAZ Valník + KamAZ Valník KamAZ Transport КамАЗ Траспортный KamAZ Transporte @@ -438,7 +438,7 @@ KamAZ Transport (bedeckt) KamAZ de transporte (cubierto) KamAZ Transportowy (zakryty) - KAMAZ Valník (krytý) + KamAZ Valník (krytý) KamAZ Transport (bâché) КамАЗ Траспортный (крытый) KamAZ Transporte (coberto) @@ -450,7 +450,7 @@ KamAZ Munition KamAZ de munición KamAZ Amunicyjny - KAMAZ Muniční + KamAZ Muniční KamAZ Munitions КамАЗ Боеприпасы KamAZ Munições @@ -462,7 +462,7 @@ KamAZ Treibstoff KamAZ de combustible KamAZ cysterna - KAMAZ Cisterna + KamAZ Cisterna KamAZ Citerne КамАЗ Заправщик KamAZ Combustível @@ -474,7 +474,7 @@ KamAZ Instandsetzung KamAZ de reparación KamAZ Naprawczy - KAMAZ Opravárenský + KamAZ Opravárenský KamAZ Réparation КамАЗ Ремонтный KamAZ Reparador diff --git a/addons/reload/ACE_Settings.hpp b/addons/reload/ACE_Settings.hpp index ce122a28f8..7b60527449 100644 --- a/addons/reload/ACE_Settings.hpp +++ b/addons/reload/ACE_Settings.hpp @@ -3,7 +3,7 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; value = 1; - displayName = "$STR_ACE_reload_SettingDisplayTextName"; - description = "$STR_ACE_reload_SettingDisplayTextDesc"; + displayName = CSTRING(SettingDisplayTextName); + description = CSTRING(SettingDisplayTextDesc); }; }; diff --git a/addons/reload/CfgVehicles.hpp b/addons/reload/CfgVehicles.hpp index b6bd212015..a9fa4deadd 100644 --- a/addons/reload/CfgVehicles.hpp +++ b/addons/reload/CfgVehicles.hpp @@ -4,13 +4,13 @@ class CfgVehicles { class ACE_Actions { class ACE_Weapon { class GVAR(LinkBelt) { - displayName = "$STR_ACE_Reload_LinkBelt"; + displayName = CSTRING(LinkBelt); distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canLinkBelt)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(startLinkingBelt)); }; class GVAR(CheckAmmo) { - displayName = "$STR_ACE_Reload_checkAmmo"; + displayName = CSTRING(checkAmmo); distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(checkAmmo)); @@ -24,7 +24,7 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { class GVAR(CheckAmmo) { - displayName = "$STR_ACE_Reload_checkAmmo"; + displayName = CSTRING(checkAmmo); distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(checkAmmo)); diff --git a/addons/reload/XEH_postInit.sqf b/addons/reload/XEH_postInit.sqf index 4444fe1e34..9d5110d330 100644 --- a/addons/reload/XEH_postInit.sqf +++ b/addons/reload/XEH_postInit.sqf @@ -4,10 +4,10 @@ if !(hasInterface) exitWith {}; // Add keybinds -["ACE3 Weapons", QGVAR(checkAmmo), localize "STR_ACE_Reload_checkAmmo", +["ACE3 Weapons", QGVAR(checkAmmo), localize LSTRING(checkAmmo), { // Conditions: canInteract - if !([ACE_player, (vehicle ACE_player), ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, (vehicle ACE_player), ["isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon) || {(vehicle ACE_player) isKindOf "StaticWeapon"}) exitWith {false}; diff --git a/addons/reload/functions/fnc_startLinkingBelt.sqf b/addons/reload/functions/fnc_startLinkingBelt.sqf index 8b9145c237..4bed7f700a 100644 --- a/addons/reload/functions/fnc_startLinkingBelt.sqf +++ b/addons/reload/functions/fnc_startLinkingBelt.sqf @@ -66,4 +66,4 @@ _player playActionNow "PutDown"; [_player, _magazineType, _maxAmmo] call EFUNC(common,removeSpecificMagazine); // Call progress bar -[4, [_player, _target, [_magazineType, _maxAmmo]], _onFinish, _onFailure, (localize "STR_ACE_Reload_LinkingBelt"), _condition] call EFUNC(common,progressBar); +[4, [_player, _target, [_magazineType, _maxAmmo]], _onFinish, _onFailure, (localize LSTRING(LinkingBelt)), _condition] call EFUNC(common,progressBar); diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 9e3cf6c1b0..fc0c534e93 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -1,7 +1,7 @@  - + Check ammo on weapon reload Prüfe Munition beim Nachladen Comprobar munición al recargar el arma @@ -13,7 +13,7 @@ Controlla le munizioni ricaricando Conferir munição ao recarregar a arma - + Check the ammo in your new magazine on magazine reload. Prüfe nachgeladenes Magazin Comprueba la munición del nuevo cargador al recargar. diff --git a/addons/reloadlaunchers/CfgVehicles.hpp b/addons/reloadlaunchers/CfgVehicles.hpp index 617aa26b5c..3d7a5c9353 100644 --- a/addons/reloadlaunchers/CfgVehicles.hpp +++ b/addons/reloadlaunchers/CfgVehicles.hpp @@ -4,7 +4,7 @@ class CfgVehicles { class CAManBase: Man { class ACE_Actions { class GVAR(ReloadLauncher) { - displayName = "$STR_ACE_ReloadLaunchers_LoadLauncher"; + displayName = CSTRING(LoadLauncher); selection = "launcher"; distance = 4; condition = ""; diff --git a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf index 58cd53699e..a07afe8e22 100644 --- a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf +++ b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf @@ -30,7 +30,7 @@ _loadableMissiles = [_unit, _weapon] call FUNC(getLoadableMissiles); private ["_name", "_displayName", "_statement", "_condition", "_action"]; _name = format [QGVAR(Missile_%1), _x]; - _displayName = format [localize "STR_ACE_ReloadLaunchers_LoadMagazine", getText (configFile >> "CfgMagazines" >> _x >> "displayName")]; + _displayName = format [localize LSTRING(LoadMagazine), getText (configFile >> "CfgMagazines" >> _x >> "displayName")]; _statement = { (_this select 2) call DFUNC(load); diff --git a/addons/reloadlaunchers/functions/fnc_load.sqf b/addons/reloadlaunchers/functions/fnc_load.sqf index bf14b9b691..745bb2a5cb 100644 --- a/addons/reloadlaunchers/functions/fnc_load.sqf +++ b/addons/reloadlaunchers/functions/fnc_load.sqf @@ -34,15 +34,15 @@ _onSuccess = { (_this select 0 select 0) removeMagazine (_this select 0 select 3); ["reloadLauncher", _this select 0 select 1, _this select 0] call DEFUNC(common,targetEvent); - [localize "STR_ACE_ReloadLaunchers_LauncherLoaded"] call DEFUNC(common,displayTextStructured); + [localize LSTRING(LauncherLoaded)] call DEFUNC(common,displayTextStructured); }; _onFailure = { - [localize "STR_ACE_Common_ActionAborted"] call DEFUNC(common,displayTextStructured); + [localize LESTRING(common,ActionAborted)] call DEFUNC(common,displayTextStructured); }; _condition = { (_this select 0) call DFUNC(canLoad) && {(_this select 0 select 0) distance (_this select 0 select 1) < 4} }; -[_reloadTime, [_unit, _target, _weapon, _magazine], _onSuccess, _onFailure, localize "STR_ACE_ReloadLaunchers_LoadingLauncher", _condition] call EFUNC(common,progressBar); +[_reloadTime, [_unit, _target, _weapon, _magazine], _onSuccess, _onFailure, localize LSTRING(LoadingLauncher), _condition] call EFUNC(common,progressBar); diff --git a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf index fc802a025c..a14e0dfc1f 100644 --- a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf +++ b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf @@ -21,5 +21,5 @@ _target selectWeapon _weapon; if (currentWeapon _target != _weapon) exitWith {}; if (currentMagazine _target != "") exitWith {}; -// command is wip, reload time for launchers is not intended. +// command is wip, reload ACE_time for launchers is not intended. _target addWeaponItem [_weapon, _magazine]; diff --git a/addons/respawn/CfgVehicleClasses.hpp b/addons/respawn/CfgVehicleClasses.hpp index 19ed9fede8..ab9c9b6c7e 100644 --- a/addons/respawn/CfgVehicleClasses.hpp +++ b/addons/respawn/CfgVehicleClasses.hpp @@ -1,5 +1,5 @@ class CfgVehicleClasses { class GVAR(Rallypoints) { - displayName = "$STR_ACE_Respawn_EditorCategory"; + displayName = CSTRING(EditorCategory); }; }; diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index e90f4ba08e..aa99b4e942 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -1,12 +1,9 @@ class CfgVehicles { - class Logic; - class Module_F: Logic { - class ModuleDescription {}; - }; - class ACE_ModuleRespawn: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class ACE_ModuleRespawn: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Respawn_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QFUNC(module); scope = 2; isGlobal = 1; @@ -14,51 +11,51 @@ class CfgVehicles { class Arguments { class SavePreDeathGear { - displayName = "$STR_ACE_Respawn_SavePreDeathGear_DisplayName"; - description = "$STR_ACE_Respawn_SavePreDeathGear_Description"; + displayName = CSTRING(SavePreDeathGear_DisplayName); + description = CSTRING(SavePreDeathGear_Description); typeName = "BOOL"; defaultValue = 0; }; class RemoveDeadBodiesDisconnected { - displayName = "$STR_ACE_Respawn_RemoveDeadBodiesDisconnected_DisplayName"; - description = "$STR_ACE_Respawn_RemoveDeadBodiesDisconnected_Description"; + displayName = CSTRING(RemoveDeadBodiesDisconnected_DisplayName); + description = CSTRING(RemoveDeadBodiesDisconnected_Description); typeName = "BOOL"; defaultValue = 1; }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_Respawn_Module_Description"; + class ModuleDescription { + description = CSTRING(Module_Description); }; }; - class ACE_ModuleFriendlyFire: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_ModuleFriendlyFire: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_FriendlyFire_Module_DisplayName"; + displayName = CSTRING(FriendlyFire_Module_DisplayName); function = QFUNC(moduleFriendlyFire); scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_FriendlyFire_ca.paa)); class Arguments {}; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_FriendlyFire_Module_Description"; + class ModuleDescription { + description = CSTRING(FriendlyFire_Module_Description); }; }; - class ACE_ModuleRallypoint: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_ModuleRallypoint: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_Rallypoint_Module_DisplayName"; + displayName = CSTRING(Rallypoint_Module_DisplayName); function = QFUNC(moduleRallypoint); scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_Rallypoint_ca.paa)); class Arguments {}; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_Rallypoint_Module_Description"; + class ModuleDescription { + description = CSTRING(Rallypoint_Module_Description); }; }; @@ -67,7 +64,7 @@ class CfgVehicles { class CAManBase : Man { class ACE_SelfActions { class ACE_MoveRallypoint { - displayName = "$STR_ACE_Rallypoint_MoveRallypoint"; + displayName = CSTRING(Rallypoint_MoveRallypoint); condition = QUOTE([ARR_2(_player, side group _player)] call FUNC(canMoveRallypoint)); statement = QUOTE([ARR_2(_player, side group _player)] call FUNC(moveRallypoint)); showDisabled = 0; @@ -94,13 +91,13 @@ class CfgVehicles { class ACE_Rallypoint_West_Base: Flag_NATO_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Respawn_RallypointWestBase"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(RallypointWestBase); vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { class ACE_Teleport { - displayName = "$STR_ACE_Respawn_TeleportToRallypoint"; + displayName = CSTRING(TeleportToRallypoint); distance = 4; condition = QUOTE(side group _player == west); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_West')] call FUNC(teleportToRallypoint)); @@ -114,13 +111,13 @@ class CfgVehicles { class ACE_Rallypoint_East_Base: Flag_CSAT_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Respawn_RallypointEastBase"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(RallypointEastBase); vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { class ACE_Teleport { - displayName = "$STR_ACE_Respawn_TeleportToRallypoint"; + displayName = CSTRING(TeleportToRallypoint); distance = 4; condition = QUOTE(side group _player == east); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_East')] call FUNC(teleportToRallypoint)); @@ -134,13 +131,13 @@ class CfgVehicles { class ACE_Rallypoint_Independent_Base: Flag_AAF_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Respawn_RallypointIndependentBase"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(RallypointIndependentBase); vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { class ACE_Teleport { - displayName = "$STR_ACE_Respawn_TeleportToRallypoint"; + displayName = CSTRING(TeleportToRallypoint); distance = 4; condition = QUOTE(side group _player == independent); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_Independent')] call FUNC(teleportToRallypoint)); @@ -155,13 +152,13 @@ class CfgVehicles { class ACE_Rallypoint_West: Flag_NATO_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Respawn_RallypointWest"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(RallypointWest); vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { class ACE_Teleport { - displayName = "$STR_ACE_Respawn_TeleportToBase"; + displayName = CSTRING(TeleportToBase); distance = 4; condition = QUOTE(side group _player == west); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_West_Base')] call FUNC(teleportToRallypoint)); @@ -175,13 +172,13 @@ class CfgVehicles { class ACE_Rallypoint_East: Flag_CSAT_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Respawn_RallypointEast"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(RallypointEast); vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { class ACE_Teleport { - displayName = "$STR_ACE_Respawn_TeleportToBase"; + displayName = CSTRING(TeleportToBase); distance = 4; condition = QUOTE(side group _player == east); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_East_Base')] call FUNC(teleportToRallypoint)); @@ -195,13 +192,13 @@ class CfgVehicles { class ACE_Rallypoint_Independent: Flag_AAF_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Respawn_RallypointIndependent"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(RallypointIndependent); vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { class ACE_Teleport { - displayName = "$STR_ACE_Respawn_TeleportToBase"; + displayName = CSTRING(TeleportToBase); distance = 4; condition = QUOTE(side group _player == independent); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_Independent_Base')] call FUNC(teleportToRallypoint)); diff --git a/addons/respawn/functions/fnc_handleKilled.sqf b/addons/respawn/functions/fnc_handleKilled.sqf index 199495d75d..1fea488421 100644 --- a/addons/respawn/functions/fnc_handleKilled.sqf +++ b/addons/respawn/functions/fnc_handleKilled.sqf @@ -17,15 +17,15 @@ #include "script_component.hpp" -private ["_killedUnit"]; +PARAMS_1(_killedUnit); -_killedUnit = _this select 0; +// Saves the gear when the player! (and only him) is killed +if (ACE_player == _killedUnit) then { + GVAR(unitGear) = []; -// Saves the gear when the player is killed -GVAR(unitGear) = []; - -if (GVAR(SavePreDeathGear)) then { - GVAR(unitGear) = [_killedUnit] call EFUNC(common,getAllGear); + if (GVAR(SavePreDeathGear)) then { + GVAR(unitGear) = [_killedUnit] call EFUNC(common,getAllGear); + }; }; if (missionNamespace getVariable [QGVAR(showFriendlyFireMessage), false]) then { diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index da9054e6aa..5a0472cf5b 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -38,7 +38,7 @@ if (count _position == 0) then {_position = getPosATL _unit}; _position set [2, 0]; -[localize "STR_ACE_Respawn_Deploy"] call EFUNC(common,displayTextStructured); +[localize LSTRING(Deploy)] call EFUNC(common,displayTextStructured); [{ _rallypoint = _this select 0; @@ -53,6 +53,6 @@ _position set [2, 0]; ["rallypointMoved", [_rallypoint, _side, _position]] call EFUNC(common,globalEvent); - [localize "STR_ACE_Respawn_Deployed"] call EFUNC(common,displayTextStructured); + [localize LSTRING(Deployed)] call EFUNC(common,displayTextStructured); }, [_rallypoint, _unit, _position, _rallypoint], 5, 1] call EFUNC(common,waitAndExecute); diff --git a/addons/respawn/functions/fnc_restoreGear.sqf b/addons/respawn/functions/fnc_restoreGear.sqf index 85863bb6c2..285c560a6c 100644 --- a/addons/respawn/functions/fnc_restoreGear.sqf +++ b/addons/respawn/functions/fnc_restoreGear.sqf @@ -98,7 +98,7 @@ if(format["%1", _backpack] != "") then { // primaryWeapon -if (_primaryweapon != "") then { +if ((_primaryweapon != "") && {_primaryweapon != "ACE_FakePrimaryWeapon"}) then { { _unit addMagazine _x; } forEach _primaryweaponmagazine; diff --git a/addons/respawn/functions/fnc_teleportToRallypoint.sqf b/addons/respawn/functions/fnc_teleportToRallypoint.sqf index dc3cc16b92..59a9766114 100644 --- a/addons/respawn/functions/fnc_teleportToRallypoint.sqf +++ b/addons/respawn/functions/fnc_teleportToRallypoint.sqf @@ -31,4 +31,4 @@ _rallypoint = missionNamespace getVariable [_rallypoint, objNull], if (isNull _rallypoint) exitWith {}; _unit setPosASL getPosASL _rallypoint; -[[localize "STR_ACE_Respawn_TeleportedToRallypoint", localize "STR_ACE_Respawn_TeleportedToBase"] select _toBase] call EFUNC(common,displayTextStructured); +[[localize LSTRING(TeleportedToRallypoint), localize LSTRING(TeleportedToBase)] select _toBase] call EFUNC(common,displayTextStructured); diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index d7d5b7ac98..4b649173f0 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -1,6 +1,6 @@  - + Deploy in 5 seconds ... Déploiement dans 5 secondes ... @@ -148,50 +148,93 @@ Respawn System System odrodzenia + Sistema de reaparición + Respawn-System + Systém znovuzrození + Sistema de Renascimento Save Gear? Zapisać ekwipunek? + ¿Guardar equipo? + Ausrüstung speichern? + Uložit výbavu? + Salvar equipamento? Respawn with the gear a soldier had just before his death? Odradzaj z ekwipunkiem jaki żołnierz miał tuż przed swoją śmiercią? + Reaparece con el equipo que el soldado tenía justo antes de morir + Mit der Ausrüstung, die ein Soldat vor seinem Tod hatte, respawnen? + Znovuubjevit s výbavou kterou měl voják před smrtí? + Renascer com o equipamento que um soldado tinha antes de sua morte? Remove bodies? Usuwać ciała? + ¿Eliminar cuerpos? + Körper entfernen? + Odstranit těla? + Remover corpos? Remove player bodies after disconnect? Usuwaj ciała graczy po rozłączeniu z serwera? + Elimina los cuerpos de los jugadores cuando se desconecten + Entferne Spielerkörper nach dem Trennen einer Verbindung? + Odstranit hráčova těla po odpojení? + Remover corpos dos jogadores depois de desconectar? Moduł ten pozwala dostosować ustawienia odrodzenia (respawnu). + Dieses Modul erlaubt es die Respawn-Einstellungen anzupassen. + Tento modul umožňuje nastavení znovuzrození (spawn). + Este módulo permite que você personalize as configurações do renascimento (Spawn). - + Friendly Fire Messages Wiadomości Friendly Fire + Mensajes de fuego amigo + Freundbeschuss-Nachrichten + Upozornění na přátelskou střelbu + Mensagens de fogo amigo - + Użycie tego modułu na misji spowoduje wyświetlenie wiadomości na czacie w przypadku, kiedy zostanie popełniony friendly fire - wyświetlona zostanie wtedy wiadomość kto kogo zabił. + Zobrazí zprávu v chatu v případě, když budete střílet na vlastní jednotky. Ve zprávě se zobrazí kdo na koho střílel, popř. kdo koho zabil. + Usando este módulo em uma missão para exibir mensagens chat, no caso de quando você faz um fogo amigo - então a mensagem será exibida mostrando quem matou quem. - + Rallypoint System System punktu zbiórki + Sistema de punto de reunión + Rallypoint-System + Systém shromáždění + Sistema de ponto de encontro - + - Moduł ten pozwala zastosować na misji "punkt zbiórki", do którego można szybko przeteleportować się z "bazy". Wymaga postawienia odpowiednich obiektów na mapie - bazy oraz flagi. Obydwa dostępne są w kategorii Puste -> ACE Odrodzenie. + Moduł ten pozwala zastosować na misji "punkt zbiórki", do którego można szybko przeteleportować się z "bazy". Wymaga postawienia odpowiednich obiektów na mapie - bazy oraz flagi. Obydwa dostępne są w kategorii Puste -> ACE Odrodzenie. + Tento modul umožňuje určit místo shromaždiště, kam se mohou jednokty rychle teleportovat ze "základny". Toto vyžaduje vhodné objekty v mapě - základna a vlajka. Oba dva můžete najít v kategorii Prázdné -> ACE Oživení. + Este módulo permite que você aplique em uma missão "pontos de encontro", que pode rapidamente se teletransportar para a "base". Ele requer colocar objetos apropriados no mapa - base e bandeiras. Ambos estão disponíveis na categoria em branco -> ACE Revival. - + Move Rallypoint Przenieś punkt zbiórki + Mover punto de reunión + Bewege Rallypoint + Přesun na shromaždiště + Mover para ponto de encontro ACE Respawn ACE Odrodzenie + Reaparición ACE + ACE-Respawn + ACE Znovuzrození + ACE Respawn - + \ No newline at end of file diff --git a/addons/safemode/XEH_postInit.sqf b/addons/safemode/XEH_postInit.sqf index 9c3d989425..7ab283f6b6 100644 --- a/addons/safemode/XEH_postInit.sqf +++ b/addons/safemode/XEH_postInit.sqf @@ -9,7 +9,7 @@ if (!hasInterface) exitWith {}; // Add keybinds -["ACE3 Weapons", QGVAR(safeMode), localize "STR_ACE_SafeMode_SafeMode", +["ACE3 Weapons", QGVAR(safeMode), localize LSTRING(SafeMode), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/safemode/functions/fnc_lockSafety.sqf b/addons/safemode/functions/fnc_lockSafety.sqf index 5f8b4b9fbd..42a8ef89fb 100644 --- a/addons/safemode/functions/fnc_lockSafety.sqf +++ b/addons/safemode/functions/fnc_lockSafety.sqf @@ -47,17 +47,19 @@ if (_unit getVariable [QGVAR(actionID), -1] == -1) then { [_this select 1, currentWeapon (_this select 1), currentMuzzle (_this select 1)] call FUNC(unlockSafety); }; - //_id = [_unit, format ["%1", localize "STR_ACE_SafeMode_TakeOffSafety"], "DefaultAction", _condition, {}, {true}, _statement, 10] call EFUNC(common,addActionMenuEventHandler); + //_id = [_unit, format ["%1", localize LSTRING(TakeOffSafety)], "DefaultAction", _condition, {}, {true}, _statement, 10] call EFUNC(common,addActionMenuEventHandler); _id = [_unit, "DefaultAction", _condition, {}] call EFUNC(common,addActionEventHandler); _unit setVariable [QGVAR(actionID), _id]; }; -_unit selectWeapon _muzzle;//_weapon +if ((typeName _muzzle) == (typeName "")) then { + _unit selectWeapon _muzzle;//_weapon +}; // play fire mode selector sound [_unit, _weapon, _muzzle] call FUNC(playChangeFiremodeSound); private "_picture"; _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); -[localize "STR_ACE_SafeMode_PutOnSafety", _picture] call EFUNC(common,displayTextPicture); +[localize LSTRING(PutOnSafety), _picture] call EFUNC(common,displayTextPicture); diff --git a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf index 524605ed5a..754a02005c 100644 --- a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf +++ b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf @@ -11,12 +11,7 @@ if (count _sound == 0) exitWith { }; // add file extension -if call { - { - if (toLower (_sound select 0) find _x == count toArray (_sound select 0) - count toArray _x - 1) exitWith {false}; - true - } forEach [".wav", ".ogg", ".wss"]; -} then { +if ({(toLower (_sound select 0) find _x == (count toArray (_sound select 0) - count toArray _x) - 1)} count [".wav", ".ogg", ".wss"] == 0) then { _sound set [0, (_sound select 0) + ".wss"]; }; diff --git a/addons/safemode/functions/fnc_unlockSafety.sqf b/addons/safemode/functions/fnc_unlockSafety.sqf index 6e67e33126..2b4f00a4a9 100644 --- a/addons/safemode/functions/fnc_unlockSafety.sqf +++ b/addons/safemode/functions/fnc_unlockSafety.sqf @@ -59,4 +59,4 @@ if (inputAction "nextWeapon" > 0) then { private "_picture"; _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); -[localize "STR_ACE_SafeMode_TookOffSafety", _picture] call EFUNC(common,displayTextPicture); +[localize LSTRING(TookOffSafety), _picture] call EFUNC(common,displayTextPicture); diff --git a/addons/safemode/script_component.hpp b/addons/safemode/script_component.hpp index c68b265489..04f10ed105 100644 --- a/addons/safemode/script_component.hpp +++ b/addons/safemode/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT safemode -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_SAFEMODE #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_SAFEMODE #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/sandbag/$PBOPREFIX$ b/addons/sandbag/$PBOPREFIX$ new file mode 100644 index 0000000000..1061a20968 --- /dev/null +++ b/addons/sandbag/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\sandbag \ No newline at end of file diff --git a/addons/sandbag/CfgEventHandlers.hpp b/addons/sandbag/CfgEventHandlers.hpp new file mode 100644 index 0000000000..17911f6b1f --- /dev/null +++ b/addons/sandbag/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; + +class Extended_Init_EventHandlers { + class ACE_SandbagObject { + class ADDON { + init = QUOTE(_this call DEFUNC(dragging,initObject)); + }; + }; +}; \ No newline at end of file diff --git a/addons/sandbag/CfgVehicles.hpp b/addons/sandbag/CfgVehicles.hpp new file mode 100644 index 0000000000..b16d2f978d --- /dev/null +++ b/addons/sandbag/CfgVehicles.hpp @@ -0,0 +1,113 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Sandbags { + displayName = CSTRING(DeploySandbag); + condition = QUOTE(call FUNC(canDeploy)); + statement = QUOTE(call FUNC(deploy)); + exceptions[] = {"isNotSwimming"}; + showDisabled = 1; + priority = 4; + icon = PATHTOF(UI\icon_sandbag_ca.paa); + }; + }; + }; + + class Item_Base_F; + class ACE_Item_Sandbag_empty: Item_Base_F { + author = ECSTRING(common,ACETeam); + scope = 2; + scopeCurator = 2; + displayName = CSTRING(sandbagEmpty_displayName); + vehicleClass = "Items"; + class TransportItems { + class ACE_Sandbag_empty { + name = "ACE_Sandbag_empty"; + count = 1; + }; + }; + }; + /* + class ACE_Item_Sandbag: Item_Base_F { + author = ECSTRING(common,ACETeam); + scope = 2; + scopeCurator = 2; + displayName = CSTRING(sandbag_displayName); + vehicleClass = "Items"; + class TransportItems { + class ACE_Sandbag { + name = "ACE_Sandbag"; + count = 1; + }; + }; + }; + */ + class thingX; + class ACE_SandbagObject: thingX { + author = ECSTRING(common,ACETeam); + XEH_ENABLED; + scope = 1; + side = -1; + model = PATHTOF(data\ace_sandbag_build.p3d); + displayName = CSTRING(sandbag_displayName); + typicalCargo[] = {}; + armor = 12000; // Withstand 200 5.56 bullets before sandbag hull is cheese + mapSize = 0.4; + nameSound = "Bunker"; + icon = PATHTOF(UI\icon_sandbag_ca.paa); + accuracy = 1000; + + destrType = "DestructDefault"; + + class DestructionEffects {}; + class Damage { + tex[] = {}; + mat[] = { + "z\ace\addons\sandbag\data\bag_destruct.rvmat", + "z\ace\addons\sandbag\data\bag_destruct.rvmat", + "z\ace\addons\sandbag\data\bag_destruct.rvmat" + }; + }; + class ACE_Actions { + class ACE_MainActions { + selection = ""; + distance = 5; + condition = "true"; + class ACE_PickUp { + selection = ""; + displayName = CSTRING(PICKUPSB); + distance = 4; + condition = QUOTE(!(_player getVariable [ARR_2('ace_sandbag_usingSandbag',false)])); + statement = QUOTE([ARR_2(_target,_player)] call FUNC(pickup)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + icon = PATHTOF(UI\icon_sandbag_ca.paa); + }; + class ACE_Carry { + selection = ""; + displayName = CSTRING(CARRYSB); + distance = 4; + condition = QUOTE(!(_player getVariable [ARR_2('ace_sandbag_usingSandbag',false)])); + statement = QUOTE([ARR_2(_target,_player)] call FUNC(carry)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + icon = PATHTOF(UI\icon_sandbag_ca.paa); + }; + }; + }; + }; + class ACE_SandbagObject_NoGeo: ACE_SandbagObject { + scope = 1; + model = PATHTOF(data\ace_sandbag_nogeo.p3d); + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_Sandbag_empty,50); + }; + }; +}; diff --git a/addons/sandbag/CfgWeapons.hpp b/addons/sandbag/CfgWeapons.hpp new file mode 100644 index 0000000000..1a26fc78d4 --- /dev/null +++ b/addons/sandbag/CfgWeapons.hpp @@ -0,0 +1,30 @@ + +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_Sandbag_empty: ACE_ItemCore { + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(sandbagEmpty_displayName); + model = PATHTOF(data\ace_sandbag_m.p3d); + picture = PATHTOF(data\m_sandbag_ca.paa); + + class ItemInfo: InventoryItem_Base_F { + mass = 8; + }; + }; + /* + class ACE_Sandbag: ACE_ItemCore { + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(sandbag_displayName); + model = PATHTOF(data\ace_sandbag_build.p3d); + picture = PATHTOF(data\m_sandbag_ca.paa); + + class ItemInfo: InventoryItem_Base_F { + mass = 160; + }; + }; + */ +}; diff --git a/addons/sandbag/README.md b/addons/sandbag/README.md new file mode 100644 index 0000000000..8c67ed9a6d --- /dev/null +++ b/addons/sandbag/README.md @@ -0,0 +1,10 @@ +ace_sandbag +=============== + +Stackable sandbags. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/sandbag/UI/icon_sandbag_ca.paa b/addons/sandbag/UI/icon_sandbag_ca.paa new file mode 100644 index 0000000000..5d6ea6d4d9 Binary files /dev/null and b/addons/sandbag/UI/icon_sandbag_ca.paa differ diff --git a/addons/sandbag/XEH_postInit.sqf b/addons/sandbag/XEH_postInit.sqf new file mode 100644 index 0000000000..d1c0ad0766 --- /dev/null +++ b/addons/sandbag/XEH_postInit.sqf @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +GVAR(placer) = objNull; +GVAR(sandBag) = objNull; +GVAR(deployPFH) = -1; +GVAR(deployDirection) = 0; + +// Cancel deploy sandbag if interact menu opened +["interactMenuOpened", { + if (GVAR(deployPFH) != -1 && {!isNull (GVAR(sandBag))}) then { + call FUNC(deployCancel); + }; +}] call EFUNC(common,addEventHandler); + +[{_this call DFUNC(handleScrollWheel)}] call EFUNC(common,addScrollWheelEventHandler); diff --git a/addons/sandbag/XEH_preInit.sqf b/addons/sandbag/XEH_preInit.sqf new file mode 100644 index 0000000000..1978913723 --- /dev/null +++ b/addons/sandbag/XEH_preInit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(canDeploy); +PREP(carry); +PREP(deploy); +PREP(deployCancel); +PREP(deployConfirm); +PREP(drop); +PREP(handleScrollWheel); +PREP(pickup); + +ADDON = true; diff --git a/addons/sandbag/config.cpp b/addons/sandbag/config.cpp new file mode 100644 index 0000000000..6b7ce1a456 --- /dev/null +++ b/addons/sandbag/config.cpp @@ -0,0 +1,16 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_Item_Sandbag", "ACE_Item_Sandbag_empty"}; + weapons[] = {"ACE_Sandbag", "ACE_Sandbag_empty"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author[] = {"Rocko", "Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" \ No newline at end of file diff --git a/addons/sandbag/data/ace_sandbag_build.p3d b/addons/sandbag/data/ace_sandbag_build.p3d new file mode 100644 index 0000000000..eb24832c31 Binary files /dev/null and b/addons/sandbag/data/ace_sandbag_build.p3d differ diff --git a/addons/sandbag/data/ace_sandbag_m.p3d b/addons/sandbag/data/ace_sandbag_m.p3d new file mode 100644 index 0000000000..3f651a7530 Binary files /dev/null and b/addons/sandbag/data/ace_sandbag_m.p3d differ diff --git a/addons/sandbag/data/ace_sandbag_nogeo.p3d b/addons/sandbag/data/ace_sandbag_nogeo.p3d new file mode 100644 index 0000000000..5a7680ffd8 Binary files /dev/null and b/addons/sandbag/data/ace_sandbag_nogeo.p3d differ diff --git a/addons/sandbag/data/bag.rvmat b/addons/sandbag/data/bag.rvmat new file mode 100644 index 0000000000..d764320caa --- /dev/null +++ b/addons/sandbag/data/bag.rvmat @@ -0,0 +1,132 @@ +/* +ambient[]={0.992157,0.992157,0.992157,1.000000}; +diffuse[]={0.992157,0.992157,0.992157,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={0.000000,0.000000,0.000000,1.000000}; +specularPower=40.000000; +*/ + +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={0.250000,0.250000,0.250000,0.250000}; +specularPower=30.000000; +PixelShaderID="NormalMapSpecularDIMap"; +VertexShaderID="NormalMap"; +class Stage1 { + texture="z\ace\addons\sandbag\data\bag_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 { + texture="z\ace\addons\sandbag\data\bag_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; + +/* +ambient[]={1.0, 1.0, 1.0, 1.0}; +diffuse[]={1.0, 1.0, 1.0, 1.0}; +forcedDiffuse[]={0.0, 0.0, 0.0, 0.0}; +emmisive[]={0.0, 0.0, 0.0, 0.0}; +specular[]={0.93, 0.93, 0.93, 0.0}; +specularPower=400.0; +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="z\ace\addons\sandbag\data\bag_nohq.paa"; + uvSource="tex"; + + class uvTransform { + aside[]={1.0, 0.0, 0.0}; + up[]={0.0, 1.0, 0.0}; + dir[]={0.0, 0.0, 0.0}; + pos[]={0.0, 0.0, 0.0}; + }; +}; + +class Stage2 { + texture="a3\weapons_f\data\detailmaps\metal_detail_dt.paa"; + uvSource="tex"; + + class uvTransform { + aside[]={6.0, 0.0, 0.0}; + up[]={0.0, 3.0, 0.0}; + dir[]={0.0, 0.0, 0.0}; + pos[]={0.0, 0.0, 0.0}; + }; +}; + +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + + class uvTransform { + aside[]={1.0, 0.0, 0.0}; + up[]={0.0, 1.0, 0.0}; + dir[]={0.0, 0.0, 0.0}; + pos[]={0.0, 0.0, 0.0}; + }; +}; + +class Stage4 { + texture="#(argb,8,8,3)color(0.8,0,0,1,AS)"; + uvSource="tex"; + + class uvTransform { + aside[]={1.0, 0.0, 0.0}; + up[]={0.0, 1.0, 0.0}; + dir[]={0.0, 0.0, 0.0}; + pos[]={0.0, 0.0, 0.0}; + }; +}; + +class Stage5 { + texture="z\ace\addons\sandbag\data\bag_smdi.paa"; + uvSource="tex"; + + class uvTransform { + aside[]={1.0, 0.0, 0.0}; + up[]={0.0, 1.0, 0.0}; + dir[]={0.0, 0.0, 0.0}; + pos[]={0.0, 0.0, 0.0}; + }; +}; + +class Stage6 { + texture="#(ai,64,64,1)fresnel(1.29,0.5)"; + uvSource="tex"; + + class uvTransform { + aside[]={1.0, 0.0, 0.0}; + up[]={0.0, 1.0, 0.0}; + dir[]={0.0, 0.0, 0.0}; + pos[]={0.0, 0.0, 0.0}; + }; +}; + +class Stage7 { + texture="a3\data_f\env_land_co.paa"; + uvSource="tex"; + + class uvTransform { + aside[]={1.0, 0.0, 0.0}; + up[]={0.0, 1.0, 0.0}; + dir[]={0.0, 0.0, 0.0}; + pos[]={0.0, 0.0, 0.0}; + }; +}; +*/ diff --git a/addons/sandbag/data/bag_co.paa b/addons/sandbag/data/bag_co.paa new file mode 100644 index 0000000000..436b8af955 Binary files /dev/null and b/addons/sandbag/data/bag_co.paa differ diff --git a/addons/sandbag/data/bag_destruct.rvmat b/addons/sandbag/data/bag_destruct.rvmat new file mode 100644 index 0000000000..1a592c973e --- /dev/null +++ b/addons/sandbag/data/bag_destruct.rvmat @@ -0,0 +1,48 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={0.250000,0.250000,0.250000,0.250000}; +specularPower=30.000000; +PixelShaderID="NormalMapSpecularDIMap"; +VertexShaderID="NormalMap"; +class Stage1 { + texture="z\ace\addons\sandbag\data\bag_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 { + texture="z\ace\addons\apl\data\vehicle_destr1024_1024_mc.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.200000,0.000000,0.000000}; + pos[]={0.200000,0.000000,0.000000}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(1,1,1,0.3)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 { + texture="z\ace\addons\apl\data\vehicle_destr1024_1024_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; diff --git a/addons/sandbag/data/bag_nohq.paa b/addons/sandbag/data/bag_nohq.paa new file mode 100644 index 0000000000..009b9c5525 Binary files /dev/null and b/addons/sandbag/data/bag_nohq.paa differ diff --git a/addons/sandbag/data/bag_smdi.paa b/addons/sandbag/data/bag_smdi.paa new file mode 100644 index 0000000000..8c277264db Binary files /dev/null and b/addons/sandbag/data/bag_smdi.paa differ diff --git a/addons/sandbag/data/m_sandbag_ca.paa b/addons/sandbag/data/m_sandbag_ca.paa new file mode 100644 index 0000000000..b0c2d9e3be Binary files /dev/null and b/addons/sandbag/data/m_sandbag_ca.paa differ diff --git a/addons/sandbag/data/model.cfg b/addons/sandbag/data/model.cfg new file mode 100644 index 0000000000..064073b314 --- /dev/null +++ b/addons/sandbag/data/model.cfg @@ -0,0 +1,21 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + class ACE_SB_Skeleton: Default {}; +}; + +class CfgModels { + class Default { + sectionsInherit=""; + sections[] = {""}; + skeletonName = ""; + }; + class ace_sandbag_build { + sectionsInherit = "Default"; + sections[] = {"zbytek"}; + skeletonName = "ACE_SB_Skeleton"; + }; +}; diff --git a/addons/sandbag/functions/fnc_canDeploy.sqf b/addons/sandbag/functions/fnc_canDeploy.sqf new file mode 100644 index 0000000000..a55b9f9875 --- /dev/null +++ b/addons/sandbag/functions/fnc_canDeploy.sqf @@ -0,0 +1,28 @@ +/* + * Author: Ruthberg + * Checks if the player can deploy a sandbag + * + * Arguments: + * None + * + * Return Value: + * can deploy? + * + * Example: + * call ace_sandbag_fnc_canDeploy; + * + * Public: No + */ +#include "script_component.hpp" + +#define SURFACE_BLACKLIST ["water", "concrete", "tarmac", "wood", "metal", "roof_tin", "roof_tiles", "wood_int", "concrete_int", "tiles_int", "metal_int", "stony", "rock", "int_concrete", "int_tiles", "int_wood", "tiling", "wavymetal", "int_metal"] + +if !([ACE_player, "ACE_Sandbag_empty"] call EFUNC(common,hasItem)) exitWith { false }; +if (ACE_player getVariable [QGVAR(usingSandbag), false]) exitWith { false }; +if ((getPosATL ACE_player select 2) - (getPos ACE_player select 2) > 1E-5) exitWith { false }; + +private ["_surfaceClass", "_surfaceType"]; +_surfaceClass = ([surfaceType (position ACE_player), "#"] call CBA_fnc_split) select 1; +_surfaceType = getText (configfile >> "CfgSurfaces" >> _surfaceClass >> "soundEnviron"); + +!(_surfaceType in SURFACE_BLACKLIST) diff --git a/addons/sandbag/functions/fnc_carry.sqf b/addons/sandbag/functions/fnc_carry.sqf new file mode 100644 index 0000000000..f2ba3dff8a --- /dev/null +++ b/addons/sandbag/functions/fnc_carry.sqf @@ -0,0 +1,56 @@ +/* + * Author: Ruthberg + * Carry sandbag + * + * Arguments: + * 0: sandbag + * 1: unit + * + * Return Value: + * None + * + * Example: + * [_sandbag, _unit] call ace_sandbag_fnc_carry; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_sandbag,_unit); + +_unit playActionNow "PutDown"; + +_unit setVariable [QGVAR(usingSandbag), true]; +[{ + PARAMS_2(_sandbag,_unit); + + GVAR(carrier) = ACE_player; + + [GVAR(carrier), "ACE_Sandbag", true] call EFUNC(common,setForceWalkStatus); + + deleteVehicle _sandbag; + + GVAR(sandBag) = createVehicle ["ACE_SandbagObject_NoGeo", [0,0,0], [], 0, "NONE"]; + GVAR(sandBag) enableSimulationGlobal false; + + // Force physx update + { + _x setPosASL (getPosASL _x); + } forEach (GVAR(carrier) nearObjects ["ACE_SandbagObject", 5]); + + GVAR(carryPFH) = [{ + if (GVAR(carrier) != ACE_player) exitWith { + call FUNC(drop); + }; + GVAR(sandBag) setPosASL ((eyePos ACE_player) vectorAdd (positionCameraToWorld [0,0,1] vectorDiff positionCameraToWorld [0,0,0])); + GVAR(sandBag) setDir (GVAR(deployDirection) + getDir ACE_player); + }, 0, []] call CBA_fnc_addPerFrameHandler; + + [localize LSTRING(DropSandbag), "", ""] call EFUNC(interaction,showMouseHint); + + GVAR(carrier) setVariable [QGVAR(drop), + [GVAR(carrier), "DefaultAction", + {GVAR(carryPFH) != -1 && !isNull (GVAR(sandBag))}, + {call FUNC(drop);} + ] call EFUNC(common,AddActionEventHandler)]; +}, [_sandbag, _unit], 1, 0.5] call EFUNC(common,waitAndExecute); diff --git a/addons/sandbag/functions/fnc_deploy.sqf b/addons/sandbag/functions/fnc_deploy.sqf new file mode 100644 index 0000000000..1e1121409b --- /dev/null +++ b/addons/sandbag/functions/fnc_deploy.sqf @@ -0,0 +1,47 @@ +/* + * Author: Garth 'L-H' de Wet, Ruthberg + * Starts the deploy process for sandbags. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_sandbag_fnc_deploy; + * + * Public: No + */ +#include "script_component.hpp" + +closeDialog 0; + +GVAR(placer) = ACE_player; + +[GVAR(placer), "ACE_Sandbag", true] call EFUNC(common,setForceWalkStatus); + +GVAR(sandBag) = createVehicle ["ACE_SandbagObject_NoGeo", [0,0,0], [], 0, "NONE"]; +GVAR(sandBag) enableSimulationGlobal false; + +GVAR(deployPFH) = [{ + if (GVAR(placer) != ACE_player) exitWith { + call FUNC(deployCancel); + }; + GVAR(sandBag) setPosASL ((eyePos ACE_player) vectorAdd (positionCameraToWorld [0,0,1] vectorDiff positionCameraToWorld [0,0,0])); + GVAR(sandBag) setDir (GVAR(deployDirection) + getDir ACE_player); +}, 0, []] call CBA_fnc_addPerFrameHandler; + +[localize LSTRING(ConfirmDeployment), localize LSTRING(CancelDeployment), localize LSTRING(ScrollAction)] call EFUNC(interaction,showMouseHint); + +GVAR(placer) setVariable [QGVAR(Deploy), + [GVAR(placer), "DefaultAction", + {GVAR(deployPFH) != -1 && !isNull (GVAR(sandBag))}, + {call FUNC(deployConfirm);} +] call EFUNC(common,AddActionEventHandler)]; + +GVAR(placer) setVariable [QGVAR(Cancel), + [GVAR(placer), "zoomtemp", + {GVAR(deployPFH) != -1 && !isNull (GVAR(sandBag))}, + {call FUNC(deployCancel);} +] call EFUNC(common,AddActionEventHandler)]; diff --git a/addons/sandbag/functions/fnc_deployCancel.sqf b/addons/sandbag/functions/fnc_deployCancel.sqf new file mode 100644 index 0000000000..65677ea887 --- /dev/null +++ b/addons/sandbag/functions/fnc_deployCancel.sqf @@ -0,0 +1,35 @@ +/* + * Author: Garth 'L-H' de Wet, Ruthberg + * Cancels sandbag deployment + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_sandbag_fnc_deployCancel; + * + * Public: No + */ +#include "script_component.hpp" + +if (isNull GVAR(placer)) exitWith {}; + +[GVAR(deployPFH)] call cba_fnc_removePerFrameHandler; + +if (!isNull (GVAR(sandBag))) then { + deleteVehicle GVAR(sandBag); +}; + +[GVAR(placer), "ACE_Sandbag", false] call EFUNC(Common,setForceWalkStatus); + +call EFUNC(interaction,hideMouseHint); +[GVAR(placer), "DefaultAction", GVAR(placer) getVariable [QGVAR(Deploy), -1]] call EFUNC(Common,removeActionEventHandler); +[GVAR(placer), "zoomtemp", GVAR(placer) getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); + +GVAR(placer) addItem "ACE_Sandbag_empty"; + +GVAR(sandBag) = objNull; +GVAR(placer) = objNull; diff --git a/addons/sandbag/functions/fnc_deployConfirm.sqf b/addons/sandbag/functions/fnc_deployConfirm.sqf new file mode 100644 index 0000000000..2cb297c51e --- /dev/null +++ b/addons/sandbag/functions/fnc_deployConfirm.sqf @@ -0,0 +1,51 @@ +/* + * Author: Garth 'L-H' de Wet, Ruthberg + * Confirms sandbag deployment + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_sandbag_fnc_deployConfirm; + * + * Public: No + */ +#include "script_component.hpp" + +if (isNull GVAR(sandBag) || isNull GVAR(placer)) exitWith {}; + +[GVAR(deployPFH)] call cba_fnc_removePerFrameHandler; + +[GVAR(placer), "ACE_Sandbag", false] call EFUNC(Common,setForceWalkStatus); +[GVAR(placer), "DefaultAction", GVAR(placer) getVariable [QGVAR(Deploy), -1]] call EFUNC(Common,removeActionEventHandler); +[GVAR(placer), "zoomtemp", GVAR(placer) getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); + +call EFUNC(interaction,hideMouseHint); + +GVAR(placer) playActionNow "PutDown"; + +GVAR(placer) setVariable [QGVAR(usingSandbag), true]; +[{ + _this setVariable [QGVAR(usingSandbag), false]; +}, GVAR(placer), 1.5, 0.5] call EFUNC(common,waitAndExecute); + +[{ + private ["_sandBag", "_position", "_direction"]; + _position = getPosASL GVAR(sandBag); + _direction = getDir GVAR(sandBag); + + deleteVehicle GVAR(sandBag); + + _sandBag = createVehicle ["ACE_SandbagObject", [0,0,0], [], 0, "NONE"]; + _sandBag enableSimulationGlobal true; + _sandBag setPosASL _position; + _sandBag setDir _direction; + + GVAR(placer) removeItem "ACE_Sandbag_empty"; + + GVAR(sandBag) = objNull; + GVAR(placer) = objNull; +}, [], 1.0, 0.5] call EFUNC(common,waitAndExecute); diff --git a/addons/sandbag/functions/fnc_drop.sqf b/addons/sandbag/functions/fnc_drop.sqf new file mode 100644 index 0000000000..1ef61289bf --- /dev/null +++ b/addons/sandbag/functions/fnc_drop.sqf @@ -0,0 +1,47 @@ +/* + * Author: Garth 'L-H' de Wet, Ruthberg + * Drop sandbag + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_sandbag_fnc_deployCancel; + * + * Public: No + */ +#include "script_component.hpp" + +if (isNull GVAR(sandBag) || isNull GVAR(carrier)) exitWith {}; + +[GVAR(carryPFH)] call cba_fnc_removePerFrameHandler; + +[GVAR(carrier), "ACE_Sandbag", false] call EFUNC(Common,setForceWalkStatus); +[GVAR(carrier), "DefaultAction", GVAR(carrier) getVariable [QGVAR(drop), -1]] call EFUNC(Common,removeActionEventHandler); + +call EFUNC(interaction,hideMouseHint); + +GVAR(carrier) playActionNow "PutDown"; + +[{ + _this setVariable [QGVAR(usingSandbag), false]; +}, GVAR(carrier), 1.5, 0.5] call EFUNC(common,waitAndExecute); + +[{ + private ["_sandBag", "_position", "_direction"]; + _position = getPosASL GVAR(sandBag); + _direction = getDir GVAR(sandBag); + + deleteVehicle GVAR(sandBag); + + _sandBag = createVehicle ["ACE_SandbagObject", [0,0,0], [], 0, "NONE"]; + _sandBag enableSimulationGlobal true; + _sandBag setPosASL _position; + _sandBag setDir _direction; + + GVAR(sandBag) = objNull; + GVAR(carrier) = objNull; +}, [], 1.0, 0.5] call EFUNC(common,waitAndExecute); diff --git a/addons/sandbag/functions/fnc_handleScrollWheel.sqf b/addons/sandbag/functions/fnc_handleScrollWheel.sqf new file mode 100644 index 0000000000..2b831f5cdc --- /dev/null +++ b/addons/sandbag/functions/fnc_handleScrollWheel.sqf @@ -0,0 +1,24 @@ +/* + * Author: Garth 'L-H' de Wet, Ruthberg + * Handles sandbag rotation + * + * Arguments: + * 0: scroll amount + * + * Return Value: + * handled + * + * Example: + * 1.2 call ace_sandbag_fnc_handleScrollWheel; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_scroll); + +if (GETMVAR(ACE_Modifier,0) == 0 || GVAR(deployPFH) == -1) exitWith { false }; + +GVAR(deployDirection) = GVAR(deployDirection) + (_scroll * 5); + +true diff --git a/addons/sandbag/functions/fnc_pickup.sqf b/addons/sandbag/functions/fnc_pickup.sqf new file mode 100644 index 0000000000..360a18983a --- /dev/null +++ b/addons/sandbag/functions/fnc_pickup.sqf @@ -0,0 +1,35 @@ +/* + * Author: Ruthberg + * Pick up sandbag + * + * Arguments: + * 0: sandbag + * 1: unit + * + * Return Value: + * None + * + * Example: + * [_sandbag, _unit] call ace_sandbag_fnc_pickup; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_sandbag,_unit); + +_unit playActionNow "PutDown"; + +_unit setVariable [QGVAR(usingSandbag), true]; +[{ + PARAMS_2(_sandbag,_unit); + _unit setVariable [QGVAR(usingSandbag), false]; + deletevehicle _sandbag; + + // Force physx update + { + _x setPosASL (getPosASL _x); + } forEach (_unit nearObjects ["ACE_SandbagObject", 5]); + + [_unit, "ACE_Sandbag_empty"] call EFUNC(common,addToInventory); +}, [_sandbag, _unit], 1.5, 0.5] call EFUNC(common,waitAndExecute); diff --git a/addons/sandbag/functions/script_component.hpp b/addons/sandbag/functions/script_component.hpp new file mode 100644 index 0000000000..1d6f10c806 --- /dev/null +++ b/addons/sandbag/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\sandbag\script_component.hpp" \ No newline at end of file diff --git a/addons/sandbag/script_component.hpp b/addons/sandbag/script_component.hpp new file mode 100644 index 0000000000..8737beef07 --- /dev/null +++ b/addons/sandbag/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT sandbag +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_SANDBAG + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_SANDBAG + #define DEBUG_SETTINGS DEBUG_SETTINGS_SANDBAG +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/sandbag/stringtable.xml b/addons/sandbag/stringtable.xml new file mode 100644 index 0000000000..70dde0da56 --- /dev/null +++ b/addons/sandbag/stringtable.xml @@ -0,0 +1,161 @@ + + + + + Sandbag + Sandsack + Мешок с песком + Worek z piaskiem + Sandbag + Sac de sable + Pytel s pískem + Sacco di Sabbia + Homokzsák + Saco de Areia + + + Sandbag (empty) + Sandsack (leer) + Мешок с песком (пустой) + Worek na piasek + Sandbag (empty) + Sac de sable (vide) + Pytel na písek (prázdný) + Sacco di Sabbia (Vuoto) + Homokzsák (üres) + Saco de Areia (vazio) + + + Cannot build here + Nicht möglich + Установка на этом месте невозможна + Nie można tu budować + Cannot build here + Impossible de construire ici + Zde nelze postavit + Impossibile costruire qui + Nem teheted ide + Não pode contruir aqui + + + Pick up Sandbag + Sandsack abbauen + Взять мешок с песком + Zabierz worek + Pick up sandbag + Prendre sac de sable + Zvednout pytel + Prendi Sacco di Sabbia + Homokzsák felvétele + Pegar saco de areia + + + Carry Sandbag + Sandsack tragen + Нести мешок с песком + Przenieś worek + Carry sandbag + Porter sac de sable + Nést pytel + Trasporta Sacco di Sabbia + Homokzsák cipelése + Carregar saco de areia + + + End Carrying + Tragen beenden + Завершить переноску + Zostaw worek + End carrying + Arreter de porter + Položit + Fine Trasporto + Cipelés abbahagyása + Parar de carregar + + + Drop Sandbag + Sandsack ablegen + Положить мешок + Upuść worek + Drop sandbag + Lacher sac de sable + Odložit pytel + Lascia Sacco di Sabbia + Homokzsák eldobása + Derrubar saco de areia + + + Confirm Deployment + Aufbauen + Подтвердить установку + Potwierdź rozłożenie + Confirm Deployment + Confirmer Déploiement + Potvrdit Položení + Conferma Posizionamento + Lerak + Confirmar implantação + + + Cancel Deployment + Abbrechen + Отменить установку + Anuluj rozłożenie + Cancel Deployment + Annuler Déploiement + Zrušit Položení + Cancella Posizionamento + Visszavonás + Cancelar implantação + + + Deploy Sandbag + Sandsack aufbauen + Установить мешок с песком + Rozłóż worek z piaskiem + Deploy sandbag + Deployer sac de sable + Umístit pytel + Posiziona Sacco di Sabbia + Homokzsák lerakása + Implantar saco de areia + + + Sandbag Box + Sandsack Kiste + Ящик мешков с песком + Skrzynia worków na piasek + Sandbag box + Caisse de sacs de sable + Bedna na pytle s pískem + Contenitore Sacchi di Sabbia + Homokzsákos láda + Caixa de saco de areia + + + Here is no sand + Hier gibt es keinen Sand + Здесь нет песка + Tu nie ma piasku + Here is no sand + Pas de sable ici + Tady není písek + Qui non cè Sabbia + Itt nincs homok + Aqui não tem areia + + + + Modifier, rotates + + Modifikator, drehen + + Modificador, girar + + Modificateur, tourner + + Modificatore, rotazione + + Modifikátor, otočit + + Változtatás, forgatás + + Modyfikator, obrót + + Modificador, rotaciona + + Bращать + + + \ No newline at end of file diff --git a/addons/scopes/CfgVehicles.hpp b/addons/scopes/CfgVehicles.hpp index 7653fe0443..81756249e1 100644 --- a/addons/scopes/CfgVehicles.hpp +++ b/addons/scopes/CfgVehicles.hpp @@ -5,13 +5,13 @@ class CfgVehicles { class ACE_Equipment { class GVAR(adjustZero) { // Updates the zero reference - displayName = "$STR_ACE_Scopes_AdjustZero"; + displayName = CSTRING(AdjustZero); condition = QUOTE([ACE_player] call FUNC(canAdjustZero)); statement = QUOTE([ACE_player] call FUNC(adjustZero)); showDisabled = 0; priority = 0.2; //icon = QUOTE(PATHTOF(UI\...)); // TODO - exceptions[] = {"notOnMap", "isNotInside"}; + exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"}; }; }; }; diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index 526282a1b6..442d4c39d0 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -5,7 +5,8 @@ class CfgWeapons { class optic_LRPS : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class Snip { @@ -19,7 +20,8 @@ class CfgWeapons { class optic_SOS : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class Snip { @@ -33,7 +35,8 @@ class CfgWeapons { class optic_DMS : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 20 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class Snip { @@ -47,7 +50,8 @@ class CfgWeapons { class optic_AMS_base : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class AMS { @@ -61,7 +65,8 @@ class CfgWeapons { class optic_KHS_base : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class KHS { @@ -75,7 +80,8 @@ class CfgWeapons { class optic_KHS_old : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class KHS { diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index d7affc0534..e96ac43960 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -33,7 +33,7 @@ if !(hasInterface) exitWith {}; // Add keybinds -["ACE3 Scope Adjustment", QGVAR(AdjustUpMinor), localize "STR_ACE_Scopes_AdjustUpMinor", +["ACE3 Scope Adjustment", QGVAR(AdjustUpMinor), localize LSTRING(AdjustUpMinor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -46,7 +46,7 @@ if !(hasInterface) exitWith {}; {false}, [201, [false, false, false]], true] call cba_fnc_addKeybind; -["ACE3 Scope Adjustment", QGVAR(AdjustDownMinor), localize "STR_ACE_Scopes_AdjustDownMinor", +["ACE3 Scope Adjustment", QGVAR(AdjustDownMinor), localize LSTRING(AdjustDownMinor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -59,7 +59,7 @@ if !(hasInterface) exitWith {}; {false}, [209, [false, false, false]], true] call cba_fnc_addKeybind; -["ACE3 Scope Adjustment", QGVAR(AdjustLeftMinor), localize "STR_ACE_Scopes_AdjustLeftMinor", +["ACE3 Scope Adjustment", QGVAR(AdjustLeftMinor), localize LSTRING(AdjustLeftMinor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -72,7 +72,7 @@ if !(hasInterface) exitWith {}; {false}, [209, [false, true, false]], true] call cba_fnc_addKeybind; -["ACE3 Scope Adjustment", QGVAR(AdjustRightMinor), localize "STR_ACE_Scopes_AdjustRightMinor", +["ACE3 Scope Adjustment", QGVAR(AdjustRightMinor), localize LSTRING(AdjustRightMinor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -85,7 +85,7 @@ if !(hasInterface) exitWith {}; {false}, [201, [false, true, false]], true] call cba_fnc_addKeybind; -["ACE3 Scope Adjustment", QGVAR(AdjustUpMajor), localize "STR_ACE_Scopes_AdjustUpMajor", +["ACE3 Scope Adjustment", QGVAR(AdjustUpMajor), localize LSTRING(AdjustUpMajor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -98,7 +98,7 @@ if !(hasInterface) exitWith {}; {false}, [201, [true, false, false]], true] call cba_fnc_addKeybind; -["ACE3 Scope Adjustment", QGVAR(AdjustDownMajor), localize "STR_ACE_Scopes_AdjustDownMajor", +["ACE3 Scope Adjustment", QGVAR(AdjustDownMajor), localize LSTRING(AdjustDownMajor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -111,7 +111,7 @@ if !(hasInterface) exitWith {}; {false}, [209, [true, false, false]], true] call cba_fnc_addKeybind; -["ACE3 Scope Adjustment", QGVAR(AdjustLeftMajor), localize "STR_ACE_Scopes_AdjustLeftMajor", +["ACE3 Scope Adjustment", QGVAR(AdjustLeftMajor), localize LSTRING(AdjustLeftMajor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -124,7 +124,7 @@ if !(hasInterface) exitWith {}; {false}, [209, [true, true, false]], true] call cba_fnc_addKeybind; -["ACE3 Scope Adjustment", QGVAR(AdjustRightMajor), localize "STR_ACE_Scopes_AdjustRightMajor", +["ACE3 Scope Adjustment", QGVAR(AdjustRightMajor), localize LSTRING(AdjustRightMajor), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 31b85f309e..ac03046803 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -19,7 +19,7 @@ PARAMS_3(_unit,_turretAndDirection,_majorStep); if (!(_unit isKindOf "Man")) exitWith {false}; if (currentMuzzle _unit != currentWeapon _unit) exitWith {false}; -private ["_weaponIndex", "_zeroing", "_optic", "_increment", "_maxVertical", "_maxHorizontal", "_elevation", "_windage", "_zero", "_adjustment"]; +private ["_weaponIndex", "_zeroing", "_optic", "_verticalIncrement", "_horizontalIncrement", "_maxVertical", "_maxHorizontal", "_elevation", "_windage", "_zero", "_adjustment"]; _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; @@ -34,28 +34,28 @@ if (isNil QGVAR(Optics)) then { }; _optic = GVAR(Optics) select _weaponIndex; -_increment = getNumber (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_Increment"); +_verticalIncrement = getNumber (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_VerticalIncrement"); +_horizontalIncrement = getNumber (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_HorizontalIncrement"); _maxVertical = getArray (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_Vertical"); _maxHorizontal = getArray (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_Horizontal"); -if ((_increment == 0) or (count _maxHorizontal < 2) or (count _maxVertical < 2)) exitWith {false}; +if ((count _maxHorizontal < 2) || (count _maxVertical < 2)) exitWith {false}; +if ((_verticalIncrement == 0) && (_horizontalIncrement == 0)) exitWith {false}; _zeroing = _adjustment select _weaponIndex; _elevation = _zeroing select 0; _windage = _zeroing select 1; _zero = _zeroing select 2; -switch (_turretAndDirection) do -{ - case ELEVATION_UP: { _elevation = _elevation + _increment }; - case ELEVATION_DOWN: { _elevation = _elevation - _increment }; - case WINDAGE_LEFT: { _windage = _windage - _increment }; - case WINDAGE_RIGHT: { _windage = _windage + _increment }; +switch (_turretAndDirection) do { + case ELEVATION_UP: { _elevation = _elevation + _verticalIncrement }; + case ELEVATION_DOWN: { _elevation = _elevation - _verticalIncrement }; + case WINDAGE_LEFT: { _windage = _windage - _horizontalIncrement }; + case WINDAGE_RIGHT: { _windage = _windage + _horizontalIncrement }; }; if (_majorStep) then { - switch (_turretAndDirection) do - { + switch (_turretAndDirection) do { case ELEVATION_UP: { _elevation = ceil(_elevation) }; case ELEVATION_DOWN: { _elevation = floor(_elevation) }; case WINDAGE_LEFT: { _windage = floor(_windage) }; diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf index a8df650374..7cefc68563 100644 --- a/addons/scopes/functions/fnc_showZeroing.sqf +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -40,15 +40,15 @@ _horizontal = _display displayCtrl 13; _vertical ctrlSetText (str (_zeroing select 0)); _horizontal ctrlSetText (str (_zeroing select 1)); -// Set the time when to hide the knobs -GVAR(timeToHide) = diag_tickTime + 3.0; +// Set the ACE_time when to hide the knobs +GVAR(timeToHide) = ACE_diagTime + 3.0; if !(isNil QGVAR(fadePFH)) exitWith {}; // Launch a PFH to wait and fade out the knobs GVAR(fadePFH) = [{ - if (diag_tickTime >= GVAR(timeToHide)) exitWith { + if (ACE_diagTime >= GVAR(timeToHide)) exitWith { private "_layer"; _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; _layer cutFadeOut 2; diff --git a/addons/sitting/$PBOPREFIX$ b/addons/sitting/$PBOPREFIX$ new file mode 100644 index 0000000000..419bf892be --- /dev/null +++ b/addons/sitting/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\sitting \ No newline at end of file diff --git a/addons/sitting/ACE_Settings.hpp b/addons/sitting/ACE_Settings.hpp new file mode 100644 index 0000000000..d4ebb61e83 --- /dev/null +++ b/addons/sitting/ACE_Settings.hpp @@ -0,0 +1,7 @@ +class ACE_Settings { + class GVAR(enable) { + value = 1; + typeName = "BOOL"; + displayName = CSTRING(Enable); + }; +}; diff --git a/addons/sitting/CfgEventHandlers.hpp b/addons/sitting/CfgEventHandlers.hpp new file mode 100644 index 0000000000..1e804e8cc9 --- /dev/null +++ b/addons/sitting/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); + }; +}; + +class Extended_Killed_EventHandlers { + class CAManBase { + class ADDON { + killed = QUOTE(_this call DFUNC(handleInterrupt)); + }; + }; +}; diff --git a/addons/sitting/CfgVehicles.hpp b/addons/sitting/CfgVehicles.hpp new file mode 100644 index 0000000000..c915750d02 --- /dev/null +++ b/addons/sitting/CfgVehicles.hpp @@ -0,0 +1,128 @@ +class CfgVehicles { + class ACE_Module; + class ACE_ModuleSitting: ACE_Module { + author = ECSTRING(common,ACETeam); + category = "ACE"; + displayName = CSTRING(ModuleDisplayName); + function = QFUNC(moduleInit); + scope = 2; + isGlobal = 1; + icon = QUOTE(PATHTOF(UI\Icon_Module_Sitting_ca.paa)); + class Arguments { + class enable { + displayName = CSTRING(Enable); + typeName = "BOOL"; + defaultValue = 1; + }; + }; + class ModuleDescription { + description = CSTRING(ModuleDescription); + }; + }; + + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class GVAR(Stand) { + displayName = CSTRING(Stand); + condition = QUOTE(_player call FUNC(canStand)); + exceptions[] = {"isNotSitting"}; + statement = QUOTE(_player call FUNC(stand)); + priority = 0; + icon = PATHTOF(UI\stand_ca.paa); + }; + }; + }; + + #define MACRO_SEAT_ACTION \ + class ACE_Actions { \ + class ACE_MainActions { \ + displayName = ECSTRING(interaction,MainAction); \ + selection = ""; \ + distance = 1.25; \ + condition = "true"; \ + class GVAR(Sit) { \ + displayName = CSTRING(Sit); \ + condition = QUOTE(_this call FUNC(canSit)); \ + statement = QUOTE(_this call FUNC(sit)); \ + showDisabled = 0; \ + priority = 0; \ + icon = PATHTOF(UI\sit_ca.paa); \ + }; \ + }; \ + }; + + class ThingX; + // Folding Chair + class Land_CampingChair_V1_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, -0.1, -0.45}; + GVAR(sitRotation) = 10; + }; + // Camping Chair + class Land_CampingChair_V2_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, -0.1, -0.45}; + GVAR(sitRotation) = 45; + }; + // Chair (Plastic) + class Land_ChairPlastic_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 90; + GVAR(sitPosition[]) = {0, 0, -0.5}; + GVAR(sitRotation) = 5; + }; + // Chair (Wooden) + class Land_ChairWood_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, -0.05, 0}; + GVAR(sitRotation) = 75; + }; + // Office Chair + class Land_OfficeChair_01_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, 0, -0.6}; + GVAR(sitRotation) = 15; + }; + // Rattan Chair + class Land_RattanChair_01_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, -0.1, -1}; // Z must be -1 due to chair's geometry (magic floating seat point) + GVAR(sitRotation) = 2; + }; + // Field Toilet + class Land_FieldToilet_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, 0.75, -1.1}; + GVAR(sitRotation) = 10; + }; + // Toiletbox + class Land_ToiletBox_F: ThingX { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, 0.75, -1.1}; + GVAR(sitRotation) = 10; + }; +}; diff --git a/addons/sitting/README.md b/addons/sitting/README.md new file mode 100644 index 0000000000..41db2ce8ee --- /dev/null +++ b/addons/sitting/README.md @@ -0,0 +1,10 @@ +ace_sitting +=============== + +The Sitting module introduces ability to sit on different chairs and toilets. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Jonpas] (https://github.com/jonpas) diff --git a/addons/sitting/UI/Icon_Module_Sitting_ca.paa b/addons/sitting/UI/Icon_Module_Sitting_ca.paa new file mode 100644 index 0000000000..1d4bbccb70 Binary files /dev/null and b/addons/sitting/UI/Icon_Module_Sitting_ca.paa differ diff --git a/addons/sitting/UI/sit_ca.paa b/addons/sitting/UI/sit_ca.paa new file mode 100644 index 0000000000..1191c3b1e0 Binary files /dev/null and b/addons/sitting/UI/sit_ca.paa differ diff --git a/addons/sitting/UI/stand_ca.paa b/addons/sitting/UI/stand_ca.paa new file mode 100644 index 0000000000..08c136f668 Binary files /dev/null and b/addons/sitting/UI/stand_ca.paa differ diff --git a/addons/sitting/XEH_clientInit.sqf b/addons/sitting/XEH_clientInit.sqf new file mode 100644 index 0000000000..e2bf1b23c1 --- /dev/null +++ b/addons/sitting/XEH_clientInit.sqf @@ -0,0 +1,12 @@ +#include "script_component.hpp" + +// Exit on Headless +if !(hasInterface) exitWith {}; + +// Add interaction menu exception +["isNotSitting", {!((_this select 0) getVariable [QGVAR(isSitting), false])}] call EFUNC(common,addCanInteractWithCondition); + +// Handle interruptions +["medical_onUnconscious", {_this call DFUNC(handleInterrupt)}] call EFUNC(common,addEventhandler); +["SetHandcuffed", {_this call DFUNC(handleInterrupt)}] call EFUNC(common,addEventhandler); +["SetSurrendered", {_this call DFUNC(handleInterrupt)}] call EFUNC(common,addEventhandler); diff --git a/addons/sitting/XEH_preInit.sqf b/addons/sitting/XEH_preInit.sqf new file mode 100644 index 0000000000..86912ada6b --- /dev/null +++ b/addons/sitting/XEH_preInit.sqf @@ -0,0 +1,13 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(canSit); +PREP(canStand); +PREP(getRandomAnimation); +PREP(handleInterrupt); +PREP(moduleInit); +PREP(sit); +PREP(stand); + +ADDON = true; diff --git a/addons/sitting/config.cpp b/addons/sitting/config.cpp new file mode 100644 index 0000000000..f12fa530fa --- /dev/null +++ b/addons/sitting/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author[] = {"Jonpas"}; + authorUrl = "https://github.com/jonpas"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "ACE_Settings.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/sitting/functions/fnc_canSit.sqf b/addons/sitting/functions/fnc_canSit.sqf new file mode 100644 index 0000000000..c9762e265c --- /dev/null +++ b/addons/sitting/functions/fnc_canSit.sqf @@ -0,0 +1,22 @@ +/* + * Author: Jonpas + * Check if the player can sit down. + * + * Arguments: + * 0: Seat + * 1: Player + * + * Return Value: + * Can Sit Down + * + * Example: + * [seat, player] call ace_sitting_fnc_canSit; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_seat,_player); + +// Sitting enabled, is seat object and not occupied +(GVAR(enable) && {getNumber (configFile >> "CfgVehicles" >> typeOf _seat >> QGVAR(canSit)) == 1} && {isNil{_seat getVariable QGVAR(seatOccupied)}}) diff --git a/addons/sitting/functions/fnc_canStand.sqf b/addons/sitting/functions/fnc_canStand.sqf new file mode 100644 index 0000000000..4549b9891b --- /dev/null +++ b/addons/sitting/functions/fnc_canStand.sqf @@ -0,0 +1,21 @@ +/* + * Author: Jonpas + * Check if the player can stand up (is in sitting position). + * + * Arguments: + * Player + * + * Return Value: + * Can Stand Up + * + * Example: + * player call ace_sitting_fnc_canStand; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_player); + +// Sitting +(_player getVariable [QGVAR(isSitting),false]) diff --git a/addons/sitting/functions/fnc_getRandomAnimation.sqf b/addons/sitting/functions/fnc_getRandomAnimation.sqf new file mode 100644 index 0000000000..c83d230a90 --- /dev/null +++ b/addons/sitting/functions/fnc_getRandomAnimation.sqf @@ -0,0 +1,49 @@ +/* + * Author: Jonpas + * Gets a random animations from the list. + * + * Arguments: + * None + * + * Return Value: + * Random Animation + * + * Example: + * _animation = call ace_sitting_fnc_getRandomAnimation; + * + * Public: No + */ +#include "script_component.hpp" + +private ["_animations"]; + +// Animations Pool +_animations = [ + "HubSittingChairUA_idle1", + "HubSittingChairUA_idle2", + "HubSittingChairUA_idle3", + "HubSittingChairUA_move1", + "HubSittingChairUB_idle1", + "HubSittingChairUB_idle2", + "HubSittingChairUB_idle3", + "HubSittingChairUB_move1", + "HubSittingChairUC_idle1", + "HubSittingChairUC_idle2", + "HubSittingChairUC_idle3", + "HubSittingChairUC_move1", + "HubSittingChairA_idle1", + "HubSittingChairA_idle2", + "HubSittingChairA_idle3", + "HubSittingChairA_move1", + "HubSittingChairB_idle1", + "HubSittingChairB_idle2", + "HubSittingChairB_idle3", + "HubSittingChairB_move1", + "HubSittingChairC_idle1", + "HubSittingChairC_idle2", + "HubSittingChairC_idle3", + "HubSittingChairC_move1" +]; + +// Select random animation +(_animations select (floor (random (count _animations)))) diff --git a/addons/sitting/functions/fnc_handleInterrupt.sqf b/addons/sitting/functions/fnc_handleInterrupt.sqf new file mode 100644 index 0000000000..8127e924ef --- /dev/null +++ b/addons/sitting/functions/fnc_handleInterrupt.sqf @@ -0,0 +1,22 @@ +/* + * Author: Jonpas + * Handles interruptions of sitting, like killed or unconsciousness. + * + * Arguments: + * 0: Player + * + * Return Value: + * None + * + * Example: + * [player] call ace_sitting_fnc_handleInterrupt; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_player); + +if (_player getVariable [QGVAR(isSitting), false]) then { + [_player] call FUNC(stand); +}; diff --git a/addons/sitting/functions/fnc_moduleInit.sqf b/addons/sitting/functions/fnc_moduleInit.sqf new file mode 100644 index 0000000000..25da5be347 --- /dev/null +++ b/addons/sitting/functions/fnc_moduleInit.sqf @@ -0,0 +1,21 @@ +/* + * Author: Jonpas + * Initializes the Sitting module. + * + * Arguments: + * Whatever the module provides. + * + * Return Value: + * None + */ +#include "script_component.hpp" + +if !(isServer) exitWith {}; + +PARAMS_3(_logic,_units,_activated); + +if !(_activated) exitWith {}; + +[_logic, QGVAR(enable), "enable"] call EFUNC(common,readSettingFromModule); + +diag_log text "[ACE]: Sitting Module Initialized."; diff --git a/addons/sitting/functions/fnc_sit.sqf b/addons/sitting/functions/fnc_sit.sqf new file mode 100644 index 0000000000..1944cb2190 --- /dev/null +++ b/addons/sitting/functions/fnc_sit.sqf @@ -0,0 +1,63 @@ +/* + * Author: Jonpas + * Sits down the player. + * + * Arguments: + * 0: Seat + * 1: Player + * + * Return Value: + * None + * + * Example: + * [seat, player] call ace_sitting_fnc_sit; + * + * Public: No + */ +#include "script_component.hpp" + +private ["_configFile", "_sitDirection", "_sitPosition", "_sitRotation", "_sitDirectionVisual"]; + +PARAMS_2(_seat,_player); + +// Set global variable for standing up +GVAR(seat) = _seat; + +// Overwrite weird position, because Arma decides to set it differently based on current animation/stance... +_player switchMove "amovpknlmstpsraswrfldnon"; + +// Read config +_configFile = configFile >> "CfgVehicles" >> typeOf _seat; +_sitDirection = (getDir _seat) + getNumber (_configFile >> QGVAR(sitDirection)); +_sitPosition = getArray (_configFile >> QGVAR(sitPosition)); +_sitRotation = if (isNumber (_configFile >> QGVAR(sitRotation))) then {getNumber (_configFile >> QGVAR(sitRotation))} else {45}; // Apply default if config entry not present + +// Get random animation and perform it (before moving player to ensure correct placement) +[_player, call FUNC(getRandomAnimation), 2] call EFUNC(common,doAnimation); + +// Set direction and position +_player setDir _sitDirection; +_player setPosASL (_seat modelToWorld _sitPosition) call EFUNC(common,positionToASL); + +// Set variables +_player setVariable [QGVAR(isSitting), true]; +_seat setVariable [QGVAR(seatOccupied), true, true]; // To prevent multiple people sitting on one seat + +// Add rotation control PFH +_sitDirectionVisual = getDirVisual _player; // Needed for precision and issues with using above directly +[{ + EXPLODE_3_PVT(_this select 0,_player,_sitDirectionVisual,_sitRotation); + + // Remove PFH if not sitting any more + if !(_player getVariable [QGVAR(isSitting), false]) exitWith { + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + // Set direction to boundary when passing it + if (getDir _player > _sitDirectionVisual + _sitRotation) exitWith { + _player setDir (_sitDirectionVisual + _sitRotation); + }; + if (getDir _player < _sitDirectionVisual - _sitRotation) exitWith { + _player setDir (_sitDirectionVisual - _sitRotation); + }; +}, 0, [_player, _sitDirectionVisual, _sitRotation]] call cba_fnc_addPerFrameHandler; diff --git a/addons/sitting/functions/fnc_stand.sqf b/addons/sitting/functions/fnc_stand.sqf new file mode 100644 index 0000000000..df1ee6f169 --- /dev/null +++ b/addons/sitting/functions/fnc_stand.sqf @@ -0,0 +1,26 @@ +/* + * Author: Jonpas + * Stands up the player. + * + * Arguments: + * Player + * + * Return Value: + * None + * + * Example: + * player call ace_sitting_fnc_stand; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_player); + +// Restore animation +[_player, "", 2] call EFUNC(common,doAnimation); + +// Set variables to nil +_player setVariable [QGVAR(isSitting), nil]; +GVAR(seat) setVariable [QGVAR(seatOccupied), nil, true]; +GVAR(seat) = nil; diff --git a/addons/sitting/functions/script_component.hpp b/addons/sitting/functions/script_component.hpp new file mode 100644 index 0000000000..1360c56284 --- /dev/null +++ b/addons/sitting/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\sitting\script_component.hpp" \ No newline at end of file diff --git a/addons/sitting/script_component.hpp b/addons/sitting/script_component.hpp new file mode 100644 index 0000000000..cbc8800cd2 --- /dev/null +++ b/addons/sitting/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT sitting +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_SITTING + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_SITTING + #define DEBUG_SETTINGS DEBUG_SETTINGS_SITTING +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml new file mode 100644 index 0000000000..5565da1e11 --- /dev/null +++ b/addons/sitting/stringtable.xml @@ -0,0 +1,27 @@ + + + + + Sit Down + Usiądź + Sentar + + + Stand Up + Wstań + Levantar + + + Enable Sitting + Habilitar opção para sentar + + + Sitting + Sentado + + + This module allows you to disable the ability to sit on chairs and toilets. + Este módulo permite que você desabilite a capacidade de sentar-se em cadeiras e banheiros. + + + \ No newline at end of file diff --git a/addons/spottingscope/$PBOPREFIX$ b/addons/spottingscope/$PBOPREFIX$ new file mode 100644 index 0000000000..abab69909d --- /dev/null +++ b/addons/spottingscope/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\spottingscope \ No newline at end of file diff --git a/addons/spottingscope/CfgEventHandlers.hpp b/addons/spottingscope/CfgEventHandlers.hpp new file mode 100644 index 0000000000..81b3aef30e --- /dev/null +++ b/addons/spottingscope/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; + +class Extended_Init_EventHandlers { + class ACE_SpottingScopeObject { + class ADDON { + init = QUOTE(_this call DEFUNC(dragging,initObject)); + }; + }; +}; diff --git a/addons/spottingscope/CfgVehicles.hpp b/addons/spottingscope/CfgVehicles.hpp new file mode 100644 index 0000000000..d42946214b --- /dev/null +++ b/addons/spottingscope/CfgVehicles.hpp @@ -0,0 +1,132 @@ + +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(place) { + displayName = CSTRING(Placedown); + condition = QUOTE([ARR_2(_player,'ACE_SpottingScope')] call EFUNC(common,hasItem)); + statement = QUOTE([ARR_2(_player,'ACE_SpottingScope')] call FUNC(place)); + showDisabled = 0; + priority = 2; + icon = PATHTOF(UI\w_spottingscope_ca.paa); + }; + }; + }; + }; + + class Item_Base_F; + class ACE_Item_SpottingScope: Item_Base_F { + author[] = {"Rocko", "Scubaman3D"}; + scope = 2; + scopeCurator = 2; + displayName = CSTRING(DisplayName); + vehicleClass = "Items"; + class TransportItems { + class ACE_SpottingScope { + name = "ACE_SpottingScope"; + count = 1; + }; + }; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_Item_SpottingScope,2); + }; + }; + + class LandVehicle; + class StaticWeapon: LandVehicle { + class Turrets; + class ACE_Actions { + class ACE_MainActions {}; + }; + }; + class StaticATWeapon: StaticWeapon { + class Turrets: Turrets { + class MainTurret; + }; + class ACE_Actions: ACE_Actions{ + class ACE_MainActions: ACE_MainActions {}; + }; + }; + class ACE_SpottingScopeObject: StaticATWeapon { + XEH_ENABLED; + scope = 1; + side = 1; + typicalCargo[] = {"Soldier"}; + displayName = CSTRING(DisplayName); + model = PATHTOF(data\spottingscope.p3d); + mapSize = 0.5; + transportSoldier = 0; + getInAction = "GetInLow"; + getOutAction = "GetOutLow"; + class Turrets: Turrets { + class MainTurret: MainTurret { + minTurn = -45; + maxTurn = 45; + initTurn = 0; + minElev = -10; + maxElev = 40; + initElev = 0; + + weapons[] = {}; + magazines[] = {}; + gunnerOpticsColor[] = {1,1,1,1}; + gunnerOpticsmodel = PATHTOF(data\m144_optic.p3d); + gunnerOpticsEffect[] = {"OpticsCHAbera1","OpticsBlur2"}; + gunnerOutOpticsShowCursor = 0; + gunnerOpticsShowCursor = 0; + gunnerAction = "gunner_static_low01"; + gunnerGetInAction = "GetInLow"; + gunnerGetOutAction = "GetOutLow"; + gunnerForceOptics = 0; + ejectDeadGunner = 0; + class ViewGunner { + initAngleX = 5; + minAngleX = -30; + maxAngleX = 30; + initAngleY = 0; + minAngleY = -100; + maxAngleY = 100; + initFov = 0.7; + minFov = 0.7; + maxFov = 0.7; + }; + class ViewOptics { + initAngleX = 0; + minAngleX = -30; + maxAngleX = 30; + initAngleY = 0; + minAngleY = -100; + maxAngleY = 100; + initFov = 0.014812; + minFov = 0.014812; + maxFov = 0.014812; + }; + }; + }; + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition[]) = {0,1,0}; + EGVAR(dragging,dragDirection) = 0; + class ACE_Actions: ACE_Actions{ + class ACE_MainActions: ACE_MainActions { + selection = "osaveze"; + class ACE_Pickup { + selection = ""; + displayName = CSTRING(PickUp); + distance = 5; + condition = QUOTE((alive _target) && (count (crew _target) == 0)); + statement = QUOTE([ARR_2(_target,_player)] call FUNC(pickup)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + icon = PATHTOF(UI\w_spottingscope_ca.paa); + }; + }; + }; + }; +}; diff --git a/addons/spottingscope/CfgWeapons.hpp b/addons/spottingscope/CfgWeapons.hpp new file mode 100644 index 0000000000..4ba078c057 --- /dev/null +++ b/addons/spottingscope/CfgWeapons.hpp @@ -0,0 +1,17 @@ + +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_SpottingScope: ACE_ItemCore { + scope = 2; + displayName = CSTRING(DisplayName); + descriptionShort = ""; + picture = PATHTOF(UI\w_spottingscope_ca.paa); + model = PATHTOF(data\w_spottingscope.p3d); + + class ItemInfo: InventoryItem_Base_F { + mass = 40; + }; + }; +}; diff --git a/addons/spottingscope/README.md b/addons/spottingscope/README.md new file mode 100644 index 0000000000..ea9f2b819d --- /dev/null +++ b/addons/spottingscope/README.md @@ -0,0 +1,10 @@ +ace_spottingscope +=============== + +Adds a spotting scope. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/spottingscope/UI/w_spottingscope_ca.paa b/addons/spottingscope/UI/w_spottingscope_ca.paa new file mode 100644 index 0000000000..b6edc66697 Binary files /dev/null and b/addons/spottingscope/UI/w_spottingscope_ca.paa differ diff --git a/addons/spottingscope/XEH_postInit.sqf b/addons/spottingscope/XEH_postInit.sqf new file mode 100644 index 0000000000..421c54b49f --- /dev/null +++ b/addons/spottingscope/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/addons/spottingscope/XEH_preInit.sqf b/addons/spottingscope/XEH_preInit.sqf new file mode 100644 index 0000000000..306884e595 --- /dev/null +++ b/addons/spottingscope/XEH_preInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(pickup); +PREP(place); + +ADDON = true; diff --git a/addons/spottingscope/config.cpp b/addons/spottingscope/config.cpp new file mode 100644 index 0000000000..a615e5da79 --- /dev/null +++ b/addons/spottingscope/config.cpp @@ -0,0 +1,16 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_Item_SpottingScope"}; + weapons[] = {"ACE_SpottingScope"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_apl", "ace_interaction"}; + author[] = {"Rocko", "Scubaman3D", "Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" \ No newline at end of file diff --git a/addons/spottingscope/data/PSO_ring.paa b/addons/spottingscope/data/PSO_ring.paa new file mode 100644 index 0000000000..e1502aa5e2 Binary files /dev/null and b/addons/spottingscope/data/PSO_ring.paa differ diff --git a/addons/spottingscope/data/ace_reticle.rvmat b/addons/spottingscope/data/ace_reticle.rvmat new file mode 100644 index 0000000000..0d1df7e696 --- /dev/null +++ b/addons/spottingscope/data/ace_reticle.rvmat @@ -0,0 +1,9 @@ +ambient[] = {0, 0, 0, 1}; +diffuse[] = {0, 0, 0, 1}; +forcedDiffuse[] = {0, 0, 0, 0}; +emmisive[] = {1, 1, 1, 1}; +specular[] = {0, 0, 0, 1}; +specularPower = 0; +renderFlags[] = {"NoZWrite"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; diff --git a/addons/spottingscope/data/ace_ssvzs.p3d b/addons/spottingscope/data/ace_ssvzs.p3d new file mode 100644 index 0000000000..a4d58c13f4 Binary files /dev/null and b/addons/spottingscope/data/ace_ssvzs.p3d differ diff --git a/addons/spottingscope/data/m144_ca.paa b/addons/spottingscope/data/m144_ca.paa new file mode 100644 index 0000000000..4d7a63ba0a Binary files /dev/null and b/addons/spottingscope/data/m144_ca.paa differ diff --git a/addons/spottingscope/data/m144_optic.p3d b/addons/spottingscope/data/m144_optic.p3d new file mode 100644 index 0000000000..15ad16fe92 Binary files /dev/null and b/addons/spottingscope/data/m144_optic.p3d differ diff --git a/addons/spottingscope/data/model.cfg b/addons/spottingscope/data/model.cfg new file mode 100644 index 0000000000..e7beb2f2c1 --- /dev/null +++ b/addons/spottingscope/data/model.cfg @@ -0,0 +1,49 @@ +class CfgSkeletons +{ + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + class ace_spottingscope_skeleton: Default { + isDiscrete = 1; + skeletonInherit = "Default"; + skeletonBones[] = { + "otocvez","", + "otochlaven","otocvez" + }; + }; +}; +class CfgModels { + class Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = ""; + }; + class spottingscope: Default { + skeletonName = "ace_spottingscope_skeleton"; + sectionsInherit = "Default"; + class animations { + class mainTurret { + type = "rotationY"; + source = "mainTurret"; + selection = "otocvez"; + axis = "osaveze"; + minValue = "rad -360"; + maxValue = "rad +360"; + angle0 = "rad -360"; + angle1 = "rad +360"; + }; + class mainGun { + type = "rotationX"; + source = "mainGun"; + selection = "otochlaven"; + axis = "osahlavne"; + minValue = "rad -360"; + maxValue = "rad +360"; + angle0 = "rad -360"; + angle1 = "rad +360"; + }; + }; + }; +}; diff --git a/addons/spottingscope/data/optic_ssvzs.p3d b/addons/spottingscope/data/optic_ssvzs.p3d new file mode 100644 index 0000000000..ffb5834768 Binary files /dev/null and b/addons/spottingscope/data/optic_ssvzs.p3d differ diff --git a/addons/spottingscope/data/scopering.paa b/addons/spottingscope/data/scopering.paa new file mode 100644 index 0000000000..ecf236b025 Binary files /dev/null and b/addons/spottingscope/data/scopering.paa differ diff --git a/addons/spottingscope/data/sniper_peri.rvmat b/addons/spottingscope/data/sniper_peri.rvmat new file mode 100644 index 0000000000..35069be267 --- /dev/null +++ b/addons/spottingscope/data/sniper_peri.rvmat @@ -0,0 +1,78 @@ +ambient[] = {1.0, 1.0, 1.0, 1.0}; +diffuse[] = {1.0, 1.0, 1.0, 1.0}; +forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0}; +emmisive[] = {0.0, 0.0, 0.0, 1.0}; +specular[] = {0.0, 0.0, 0.0, 0.0}; +specularPower = 0.0; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 { + texture = "z\ace\addons\spottingscope\data\sniper_peri_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture = "z\ace\addons\apl\data\metal4_weapons_vehicles_int_512_dt.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {6.0, 0.0, 0.0}; + up[] = {0.0, 6.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage3 { + texture = "#(argb,8,8,3)color(0,0,0,0)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,0}; + pos[] = {0,0,0}; + }; +}; +class Stage4 { + texture = "#(argb,8,8,3)color(0,1,1,1)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage5 { + texture = "z\ace\addons\spottingscope\data\sniper_peri_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture = "#(ai,32,128,1)fresnel(1.58,0.01)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage7 { + texture = "a3\data_f\env_land_co.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; diff --git a/addons/spottingscope/data/sniper_peri_co.paa b/addons/spottingscope/data/sniper_peri_co.paa new file mode 100644 index 0000000000..6466dc6d82 Binary files /dev/null and b/addons/spottingscope/data/sniper_peri_co.paa differ diff --git a/addons/spottingscope/data/sniper_peri_nohq.paa b/addons/spottingscope/data/sniper_peri_nohq.paa new file mode 100644 index 0000000000..cc84eab64d Binary files /dev/null and b/addons/spottingscope/data/sniper_peri_nohq.paa differ diff --git a/addons/spottingscope/data/sniper_peri_smdi.paa b/addons/spottingscope/data/sniper_peri_smdi.paa new file mode 100644 index 0000000000..4cb94ce7d1 Binary files /dev/null and b/addons/spottingscope/data/sniper_peri_smdi.paa differ diff --git a/addons/spottingscope/data/spot_scope.rvmat b/addons/spottingscope/data/spot_scope.rvmat new file mode 100644 index 0000000000..294d3a75b2 --- /dev/null +++ b/addons/spottingscope/data/spot_scope.rvmat @@ -0,0 +1,78 @@ +ambient[] = {1.0, 1.0, 1.0, 1.0}; +diffuse[] = {1.0, 1.0, 1.0, 1.0}; +forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0}; +emmisive[] = {0.0, 0.0, 0.0, 1.0}; +specular[] = {0.0, 0.0, 0.0, 0.0}; +specularPower = 0.0; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 { + texture = "z\ace\addons\spottingscope\data\spot_scope_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture = "z\ace\addons\apl\data\plastic_512_dt.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {6.0, 0.0, 0.0}; + up[] = {0.0, 6.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage3 { + texture = "#(argb,8,8,3)color(0,0,0,0)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,0}; + pos[] = {0,0,0}; + }; +}; +class Stage4 { + texture = "#(argb,8,8,3)color(0,1,1,1)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage5 { + texture = "z\ace\addons\spottingscope\data\spot_scope_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture = "#(ai,32,128,1)fresnel(1.58,0.01)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage7 { + texture = "a3\data_f\env_land_co.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; diff --git a/addons/spottingscope/data/spot_scope_co.paa b/addons/spottingscope/data/spot_scope_co.paa new file mode 100644 index 0000000000..c0168053a3 Binary files /dev/null and b/addons/spottingscope/data/spot_scope_co.paa differ diff --git a/addons/spottingscope/data/spot_scope_nohq.paa b/addons/spottingscope/data/spot_scope_nohq.paa new file mode 100644 index 0000000000..674ad1d0ec Binary files /dev/null and b/addons/spottingscope/data/spot_scope_nohq.paa differ diff --git a/addons/spottingscope/data/spot_scope_smdi.paa b/addons/spottingscope/data/spot_scope_smdi.paa new file mode 100644 index 0000000000..b6e2d763fe Binary files /dev/null and b/addons/spottingscope/data/spot_scope_smdi.paa differ diff --git a/addons/spottingscope/data/spot_scope_tripod.rvmat b/addons/spottingscope/data/spot_scope_tripod.rvmat new file mode 100644 index 0000000000..0403471e5a --- /dev/null +++ b/addons/spottingscope/data/spot_scope_tripod.rvmat @@ -0,0 +1,79 @@ +ambient[] = {1.0, 1.0, 1.0, 1.0}; +diffuse[] = {1.0, 1.0, 1.0, 1.0}; +forcedDiffuse[] = {0.0, 0.0, 0.0, 0.0}; +emmisive[] = {0.0, 0.0, 0.0, 1.0}; +specular[] = {0.0, 0.0, 0.0, 0.0}; +specularPower = 0.0; +PixelShaderID = "Super"; +VertexShaderID = "Super"; +class Stage1 { + texture = "z\ace\addons\spottingscope\data\spot_scope_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture = "z\ace\addons\apl\data\metal4_weapons_vehicles_int_512_dt.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {6.0, 0.0, 0.0}; + up[] = {0.0, 6.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage3 { + texture = "#(argb,8,8,3)color(0,0,0,0)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1,0,0}; + up[] = {0,1,0}; + dir[] = {0,0,0}; + pos[] = {0,0,0}; + }; +}; +class Stage4 { + texture = "#(argb,8,8,3)color(0,1,1,1)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; +class Stage5 { + texture = "z\ace\addons\spottingscope\data\spot_scope_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture = "#(ai,32,128,1)fresnel(1.58,0.01)"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; + +class Stage7 { + texture = "a3\data_f\env_land_co.paa"; + uvSource = "tex"; + class uvTransform { + aside[] = {1.0, 0.0, 0.0}; + up[] = {0.0, 1.0, 0.0}; + dir[] = {0.0, 0.0, 0.0}; + pos[] = {0.0, 0.0, 0.0}; + }; +}; diff --git a/addons/spottingscope/data/spottingscope.p3d b/addons/spottingscope/data/spottingscope.p3d new file mode 100644 index 0000000000..c4e0363dcf Binary files /dev/null and b/addons/spottingscope/data/spottingscope.p3d differ diff --git a/addons/spottingscope/data/w_spottingscope.p3d b/addons/spottingscope/data/w_spottingscope.p3d new file mode 100644 index 0000000000..040ef5158e Binary files /dev/null and b/addons/spottingscope/data/w_spottingscope.p3d differ diff --git a/addons/spottingscope/functions/fnc_pickup.sqf b/addons/spottingscope/functions/fnc_pickup.sqf new file mode 100644 index 0000000000..3730068092 --- /dev/null +++ b/addons/spottingscope/functions/fnc_pickup.sqf @@ -0,0 +1,30 @@ +/* + * Author: Rocko, Ruthberg + * + * Pick up spotting scope + * + * Arguments: + * 0: spotting scope + * 1: unit + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_2(_spottingScope,_unit); + +if ((_unit call CBA_fnc_getUnitAnim) select 0 == "stand") then { + _unit playMove "AmovPercMstpSrasWrflDnon_diary"; +}; + +[{ + PARAMS_2(_spottingScope,_unit); + + [_unit, "ACE_SpottingScope"] call EFUNC(common,addToInventory); + deleteVehicle _spottingScope; + +}, [_spottingScope, _unit], 1, 0]call EFUNC(common,waitAndExecute); diff --git a/addons/spottingscope/functions/fnc_place.sqf b/addons/spottingscope/functions/fnc_place.sqf new file mode 100644 index 0000000000..4967151748 --- /dev/null +++ b/addons/spottingscope/functions/fnc_place.sqf @@ -0,0 +1,41 @@ +/* + * Author: Rocko, Ruthberg + * + * Place down spotting scope + * + * Arguments: + * 0: unit + * 1: scope class + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_scopeClass); + +_unit removeItem _scopeClass; + +if ((_unit call CBA_fnc_getUnitAnim) select 0 == "stand") then { + _unit playMove "AmovPercMstpSrasWrflDnon_diary"; +}; + +[{ + PARAMS_1(_unit); + + private ["_direction", "_position", "_spottingScope"]; + _direction = getDir _unit; + _position = (getPosASL _unit) vectorAdd [0.8 * sin(_direction), 0.8 * cos(_direction), 0.02]; + + _spottingScope = "ACE_SpottingScopeObject" createVehicle [0, 0, 0]; + _spottingScope setDir _direction; + _spottingScope setPosASL _position; + if ((getPosATL _spottingScope select 2) - (getPos _spottingScope select 2) < 1E-5) then { + _spottingScope setVectorUp (surfaceNormal (position _spottingScope)); + }; + _unit reveal _spottingScope; + +}, [_unit], 1, 0] call EFUNC(common,waitAndExecute); diff --git a/addons/spottingscope/functions/script_component.hpp b/addons/spottingscope/functions/script_component.hpp new file mode 100644 index 0000000000..504cde2ca6 --- /dev/null +++ b/addons/spottingscope/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\spottingscope\script_component.hpp" \ No newline at end of file diff --git a/addons/spottingscope/script_component.hpp b/addons/spottingscope/script_component.hpp new file mode 100644 index 0000000000..11bd94a6e5 --- /dev/null +++ b/addons/spottingscope/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT spottingscope +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_SPOTTINGSCOPE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_SPOTTINGSCOPE + #define DEBUG_SETTINGS DEBUG_SETTINGS_SPOTTINGSCOPE +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/spottingscope/stringtable.xml b/addons/spottingscope/stringtable.xml new file mode 100644 index 0000000000..8c5425dc2b --- /dev/null +++ b/addons/spottingscope/stringtable.xml @@ -0,0 +1,41 @@ + + + + + Spotting Scope + Teleskop + Зрительная труба + Teleskop + Spotting Scope + Téléscope de visée + Zaměřovací Dalekohled + Spotting Scope + Megfigyelő távcső + Luneta de observador + + + Pick up Spotting Scope + Teleskop aufnehmen + Поднять зрительная трубу + Zabierz teleskop + Pick up Spotting Scope + Prendre téléscope de visée + Zvednout Zaměřovací dalekohled + Raccogli spottingscope + Mefgigy. távcső felvétele + Pegar luneta de observador + + + Place Spotting Scope + Teleskop aufstellen + Установить зрительная трубу + Ustaw teleskop + Place Spotting Scope + Placer téléscope de visée + Položit Zaměřovací dalekohled + Posiziona spottingscope + Megfigy. távcső elhelyezése + Colocar luneta de observador + + + \ No newline at end of file diff --git a/addons/switchunits/CfgEventHandlers.hpp b/addons/switchunits/CfgEventHandlers.hpp index 689e06c529..44b6e8e6ff 100644 --- a/addons/switchunits/CfgEventHandlers.hpp +++ b/addons/switchunits/CfgEventHandlers.hpp @@ -1,12 +1,11 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); - }; + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; }; class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); }; }; - diff --git a/addons/switchunits/CfgVehicles.hpp b/addons/switchunits/CfgVehicles.hpp index 0f76c78568..7951a6cd59 100644 --- a/addons/switchunits/CfgVehicles.hpp +++ b/addons/switchunits/CfgVehicles.hpp @@ -1,53 +1,53 @@ class CfgVehicles { - class Module_F; - class ACE_ModuleSwitchUnits: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module; + class ACE_ModuleSwitchUnits: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_SwitchUnits_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = FUNC(module); scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_SwitchUnits_ca.paa)); class Arguments { class SwitchToWest { - displayName = "$STR_ACE_SwitchUnits_SwitchToWest_DisplayName"; - description = "$STR_ACE_SwitchUnits_SwitchToWest_Description"; + displayName = CSTRING(SwitchToWest_DisplayName); + description = CSTRING(SwitchToWest_Description); typeName = "BOOL"; defaultValue = 0; }; class SwitchToEast { - displayName = "$STR_ACE_SwitchUnits_SwitchToEast_DisplayName"; - description = "$STR_ACE_SwitchUnits_SwitchToEast_Description"; + displayName = CSTRING(SwitchToEast_DisplayName); + description = CSTRING(SwitchToEast_Description); typeName = "BOOL"; defaultValue = 0; }; class SwitchToIndependent { - displayName = "$STR_ACE_SwitchUnits_SwitchToIndependent_DisplayName"; - description = "$STR_ACE_SwitchUnits_SwitchToIndependent_Description"; + displayName = CSTRING(SwitchToIndependent_DisplayName); + description = CSTRING(SwitchToIndependent_Description); typeName = "BOOL"; defaultValue = 0; }; class SwitchToCivilian { - displayName = "$STR_ACE_SwitchUnits_SwitchToCivilian_DisplayName"; - description = "$STR_ACE_SwitchUnits_SwitchToCivilian_Description"; + displayName = CSTRING(SwitchToCivilian_DisplayName); + description = CSTRING(SwitchToCivilian_Description); typeName = "BOOL"; defaultValue = 0; }; class EnableSafeZone { - displayName = "$STR_ACE_SwitchUnits_EnableSafeZone_DisplayName"; - description = "$STR_ACE_SwitchUnits_EnableSafeZone_Description"; + displayName = CSTRING(EnableSafeZone_DisplayName); + description = CSTRING(EnableSafeZone_Description); typeName = "BOOL"; defaultValue = 1; }; class SafeZoneRadius { - displayName = "$STR_ACE_SwitchUnits_SafeZoneRadius_DisplayName"; - description = "$STR_ACE_SwitchUnits_SafeZoneRadius_Description"; + displayName = CSTRING(SafeZoneRadius_DisplayName); + description = CSTRING(SafeZoneRadius_Description); typeName = "NUMBER"; defaultValue = 100; }; }; class ModuleDescription { - description = "$STR_ACE_SwitchUnits_Module_Description"; + description = CSTRING(Module_Description); }; }; -}; \ No newline at end of file +}; diff --git a/addons/switchunits/XEH_clientInit.sqf b/addons/switchunits/XEH_postInit.sqf similarity index 91% rename from addons/switchunits/XEH_clientInit.sqf rename to addons/switchunits/XEH_postInit.sqf index 6a908071c9..5928804d7b 100644 --- a/addons/switchunits/XEH_clientInit.sqf +++ b/addons/switchunits/XEH_postInit.sqf @@ -16,6 +16,7 @@ #include "script_component.hpp" + if (missionNamespace getVariable [QGVAR(EnableSwitchUnits), false]) then { [player] call FUNC(startSwitchUnits); } else { @@ -24,5 +25,5 @@ if (missionNamespace getVariable [QGVAR(EnableSwitchUnits), false]) then { if ((_name == QGVAR(EnableSwitchUnits)) && {_value}) then { [player] call FUNC(startSwitchUnits); }; - }] call EFUNC(common,addEventhandler); + }] call EFUNC(common,addEventhandler); }; diff --git a/addons/switchunits/config.cpp b/addons/switchunits/config.cpp index 8e792381c3..3b1d11f460 100644 --- a/addons/switchunits/config.cpp +++ b/addons/switchunits/config.cpp @@ -14,4 +14,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" -#include "ACE_Settings.hpp" \ No newline at end of file +#include "ACE_Settings.hpp" diff --git a/addons/switchunits/functions/fnc_switchUnit.sqf b/addons/switchunits/functions/fnc_switchUnit.sqf index c263bdd721..1fbe8b9b28 100644 --- a/addons/switchunits/functions/fnc_switchUnit.sqf +++ b/addons/switchunits/functions/fnc_switchUnit.sqf @@ -41,7 +41,7 @@ if (GVAR(EnableSafeZone)) then { // exitWith doesn't exit past the "if(EnableSafeZone)" block if (_leave) exitWith { - [localize "STR_ACE_SwitchUnits_TooCloseToEnemy"] call EFUNC(common,displayTextStructured); + [localize LSTRING(TooCloseToEnemy)] call EFUNC(common,displayTextStructured); }; // should switch locality @@ -88,7 +88,7 @@ DFUNC(pfhSwitchUnit) = { [[_oldUnit, _oldOwner], QUOTE({(_this select 0) setOwner (_this select 1)}), 1] call EFUNC(common,execRemoteFnc); }; - [localize "STR_ACE_SwitchUnits_SwitchedUnit"] call EFUNC(common,displayTextStructured); + [localize LSTRING(SwitchedUnit)] call EFUNC(common,displayTextStructured); [(_this select 1)] call cba_fnc_removePerFrameHandler; diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index cdde0f8ff1..b392b09ca7 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -23,63 +23,117 @@ Cette unité est trop proche des ennemis Ez az egység túl közel van az ellenséghez. Questa unità è troppo vicina al nemico. - Essa unidade está muito perta do inimigo. + Essa unidade está muito perto do inimigo. SwitchUnits System System zmiany stron + Sistema de cambio de unidad + Einheiten-Switch-System? + Systém výměny stran + Sistema de troca de unidades Switch to West? Zmiana na Zachód? + ¿Cambiar a Oeste? + Nach BLUFOR wechseln? + Přesunout k BLUFOR? + Trocar para Oeste? Allow switching to west units? Pozwolić zmieniać graczom stronę na Zachód? + ¿Permitir cambios a unidades del Oeste? + Erlaube das Wechseln zu BLUFOR-Einheiten? + Povolit přesun k BLUFOR? + Permitir troca de unidades para o Oeste? Switch to East? Zmiana na Wschód? + ¿Cambiar a Este? + Nach OPFOR wechseln? + Přesunout k OPFOR? + Trocar para Leste? Allow switching to east units? Pozwolić zmieniać graczom stronę na Wschód? + ¿Permitir cambios a unidades del Este? + Erlaube das Wechseln zu OPFOR-Einheiten? + Povolit přesun k OPFOR? + Permitir troca de unidades para o Leste? Switch to Independent? Zmiana na Ruch Oporu? + ¿Cambiar a Independiente? + Nach INDFOR wechseln? + Přesunout k INDFOR? + Trocar para Indenpendente Allow switching to independent units? Pozwolić zmieniać stronę na Ruch Oporu? + ¿Permitir cambios a unidades Independientes? + Erlaube das Wechseln zu INDFOR-Einheiten? + Povolit přesun k INDFOR? + Permitir troca de unidades para o Indenpendente? Switch to Civilian? Zmiana na Cywili? + ¿Cambiar a Civil? + Nach CIVILIAN wechseln? + Přesunout k CIVILISTŮM? + Trocar para Civis? Allow switching to civilian units? Pozwolić zmieniać stronę na Cywili? + ¿Permitir cambios a unidades Civiles + Erlaube das Wechseln zu CIVILIAN-Einheiten? + Povolit přesun k CIVILISTŮM? + Permitir troca de unidades para o Civil? Enable Safe Zone? Aktywuj bezp. strefę? + ¿Habilitar zona segura? + Aktiviere Sicherheitszone? + Povolit bezpečné oblasti? + Habilitar zona segura? Enable a safe zone around enemy units? Players can't switch to units inside of the safe zone. Aktywuje bezpieczną strefę wokół jednostek przeciwnika. Gracze nie mogą zmieniać strony wewnątrz tej strefy. + Habilita una zona segura alrededor de las unidades enemigas. Los jugadores no pueden cambiar de unidad dentro de la zona segura. + Aktiviere eine Sicherheitszone um feindliche Einheiten? Spieler können nicht zu Einheiten in der Sicherheitszone wechseln. + Povolit bezpečnou zónu kolem nepřátelských jednotek? Hráči se nemohou změnit strany/jednotky uvnitř bezpečné zóny. + Habilitar uma zona segur ao redor das unidades inimigas? Jogadores não conseguirão trocar para unidades dentro dessa zona segura. Safe Zone Radius Promień bezp. strefy + Radio de la zona segura + Sicherheitszonenradius + Oblast bezpečné zóny + Raio da zona segura The safe zone around players from a different team. Default: 200 Promień bezpiecznej strefy wokół graczy z innych drużyn. Domyślnie: 200 + La zona segura alrededor de los jugadores de distintos equipos. Por defecto: 200 + Die Sicherheitszone um Spieler von einem anderen Team. Standard: 200 + Bezpečná zóna kolem hráče z jiných týmu. Výchozí: 200 + A zona segura ao redor dos jogadores de diferentes equipes. Padrão: 200 + Tento modul umožňuje přepínání mazi dostupnými stranami. + Este módulo permite mudar o lado à disposição dos jogadores. - + \ No newline at end of file diff --git a/addons/tacticalladder/$PBOPREFIX$ b/addons/tacticalladder/$PBOPREFIX$ new file mode 100644 index 0000000000..7d7735bb9e --- /dev/null +++ b/addons/tacticalladder/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\tacticalladder \ No newline at end of file diff --git a/addons/tacticalladder/CfgEventHandlers.hpp b/addons/tacticalladder/CfgEventHandlers.hpp new file mode 100644 index 0000000000..737cae5e43 --- /dev/null +++ b/addons/tacticalladder/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; diff --git a/addons/tacticalladder/CfgVehicles.hpp b/addons/tacticalladder/CfgVehicles.hpp new file mode 100644 index 0000000000..d180ccae40 --- /dev/null +++ b/addons/tacticalladder/CfgVehicles.hpp @@ -0,0 +1,96 @@ + +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_TacticalLadders { + displayName = CSTRING(Deploy); + condition = QUOTE((backpack ACE_player) == QUOTE(QUOTE(ACE_TacticalLadder_Pack))); + statement = QUOTE(call FUNC(deployTL)); + exceptions[] = {}; + showDisabled = 1; + priority = 4; + }; + }; + }; + + class Bag_Base; + class ACE_TacticalLadder_Pack: Bag_Base { + scope = 2; + displayName = CSTRING(DisplayName); + descriptionShort = ""; + model = PATHTOF(data\ace_tacticalladder_pack.p3d); + picture = PATHTOF(UI\ace_tactical_ladder_pack_ca.paa); + maximumLoad = 0; + mass = 50; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportBackpacks { + class _xx_ACE_TacticalLadder_Pack { + backpack = "ACE_TacticalLadder_Pack"; + count = 3; + }; + }; + }; + + class House; + class ACE_Tactical_Ladder: House { + XEH_ENABLED; + displayName = CSTRING(DisplayName); + class DestructionEffects {}; + model = PATHTOF(data\ace_tacticalladder.p3d); + animated = 1; + autocenter = 0; + featureSize = 12; + ladders[] = {{"start","end"}}; + class AnimationSources { + class rotate { + source = "user"; + animPeriod = 1e-007; + }; + class extract_1 { + source = "user"; + animPeriod = 1e-007; + }; + class extract_2: extract_1 {}; + class extract_3: extract_1 {}; + class extract_4: extract_1 {}; + class extract_5: extract_1 {}; + class extract_6: extract_1 {}; + class extract_7: extract_1 {}; + class extract_8: extract_1 {}; + class extract_9: extract_1 {}; + class extract_10: extract_1 {}; + class extract_11: extract_1 {}; + }; + class ACE_Actions { + class ACE_MainActions { + selection = "roadway"; + distance = 5; + condition = "true"; + class ACE_PickUp { + selection = ""; + displayName = CSTRING(Pickup); + distance = 4; + condition = QUOTE((backpack ACE_player) == ''); + statement = QUOTE([ARR_2(_target,_player)] call FUNC(pickupTL)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + }; + class ACE_Position { + selection = ""; + displayName = CSTRING(Position); + distance = 4; + condition = "true"; + statement = QUOTE([ARR_2(_target,_player)] call FUNC(positionTL)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + }; + }; + }; + }; +}; diff --git a/addons/tacticalladder/README.md b/addons/tacticalladder/README.md new file mode 100644 index 0000000000..ff6b8ecad3 --- /dev/null +++ b/addons/tacticalladder/README.md @@ -0,0 +1,10 @@ +ace_tacticalladder +=============== + +Adds a packable tactical ladder. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/tacticalladder/UI/ace_tactical_ladder_pack_ca.paa b/addons/tacticalladder/UI/ace_tactical_ladder_pack_ca.paa new file mode 100644 index 0000000000..8388a8e605 Binary files /dev/null and b/addons/tacticalladder/UI/ace_tactical_ladder_pack_ca.paa differ diff --git a/addons/tacticalladder/XEH_postInit.sqf b/addons/tacticalladder/XEH_postInit.sqf new file mode 100644 index 0000000000..f0091ec7fa --- /dev/null +++ b/addons/tacticalladder/XEH_postInit.sqf @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +GVAR(ladder) = objNull; +GVAR(cancelTime) = 0; +GVAR(currentStep) = 3; +GVAR(currentAngle) = 0; + +// Cancel tactical ladder deployment if the interact menu is opened +["interactMenuOpened", { + if ((ACE_time > GVAR(cancelTime)) && !isNull GVAR(ladder)) then { + GVAR(ladder) call FUNC(cancelTLdeploy); + }; +}] call EFUNC(common,addEventHandler); + +[{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(Common,addScrollWheelEventHandler); diff --git a/addons/tacticalladder/XEH_preInit.sqf b/addons/tacticalladder/XEH_preInit.sqf new file mode 100644 index 0000000000..e434974c9a --- /dev/null +++ b/addons/tacticalladder/XEH_preInit.sqf @@ -0,0 +1,12 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(cancelTLdeploy); +PREP(confirmTLdeploy); +PREP(deployTL); +PREP(handleScrollWheel); +PREP(pickupTL); +PREP(positionTL); + +ADDON = true; diff --git a/optionals/compat_hlc_wp_mp5/config.cpp b/addons/tacticalladder/config.cpp similarity index 54% rename from optionals/compat_hlc_wp_mp5/config.cpp rename to addons/tacticalladder/config.cpp index 1f4fe78db4..02740639fe 100644 --- a/optionals/compat_hlc_wp_mp5/config.cpp +++ b/addons/tacticalladder/config.cpp @@ -5,10 +5,11 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_mp5"}; - author[]={"Ruthberg"}; + requiredAddons[] = {"ace_apl", "ace_interaction"}; + author[] = {"Rocko", "Ruthberg"}; VERSION_CONFIG; }; }; -#include "CfgWeapons.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/tacticalladder/data/ace_ladder_co.paa b/addons/tacticalladder/data/ace_ladder_co.paa new file mode 100644 index 0000000000..d550108068 Binary files /dev/null and b/addons/tacticalladder/data/ace_ladder_co.paa differ diff --git a/addons/tacticalladder/data/ace_tacticalladder.p3d b/addons/tacticalladder/data/ace_tacticalladder.p3d new file mode 100644 index 0000000000..3126601117 Binary files /dev/null and b/addons/tacticalladder/data/ace_tacticalladder.p3d differ diff --git a/addons/tacticalladder/data/ace_tacticalladder_pack.p3d b/addons/tacticalladder/data/ace_tacticalladder_pack.p3d new file mode 100644 index 0000000000..e7b565ff11 Binary files /dev/null and b/addons/tacticalladder/data/ace_tacticalladder_pack.p3d differ diff --git a/addons/tacticalladder/data/model.cfg b/addons/tacticalladder/data/model.cfg new file mode 100644 index 0000000000..1fc8840d4f --- /dev/null +++ b/addons/tacticalladder/data/model.cfg @@ -0,0 +1,283 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + class ace_tacticalladder_skeleton: Default { + isDiscrete = 0; + skeletonInherit = ""; + skeletonBones[] = { + "base","", + "1","base", + "2","1", + "3","2", + "4","3", + "5","4", + "6","5", + "7","6", + "8","7", + "9","8", + "10","9", + "11","10", + "step","11" + }; + }; + class OFP2_ManSkeleton { + isDiscrete = 0; + skeletonInherit = ""; + skeletonBones[] = { + "Pelvis","", + "Spine","Pelvis", + "Spine1","Spine", + "Spine2","Spine1", + "Spine3","Spine2", + "Camera","Pelvis", + "weapon","Spine1", + "launcher","Spine1", + //Head skeleton in hierarchy + "neck","Spine3", + "neck1","neck", + "head","neck1", + "HeadCutScene","head", + "jaw","head", + "chin","head", + "jaw_rf","head", + "jaw_rm","head", + "jaw_rs","head", + "jaw_lf","head", + "jaw_lm","head", + "jaw_ls","head", + "ear_r","head", + "ear_l","head", + "lip_lc","head", + "lip_lwlb","head", + "lip_lwlf","head", + "lip_lwm","head", + "lip_lwrf","head", + "lip_lwrb","head", + "lip_rc","head", + "lip_uprb","head", + "lip_uprf","head", + "lip_upm","head", + "lip_uplf","head", + "lip_uplb","head", + "nose_tip","head", + "nose_r","head", + "nose_l","head", + "zig_lt","head", + "zig_lm","head", + "zig_lb","head", + "zig_rt","head", + "zig_rm","head", + "zig_rb","head", + "cheek_r","head", + "cheek_l","head", + "eyebrow_lb","head", + "eyebrow_lm","head", + "eyebrow_lf","head", + "corr","head", + "eyebrow_rf","head", + "eyebrow_rm","head", + "eyebrow_rb","head", + "eye_upr","head", + "eye_lwr","head", + "eye_upl","head", + "eye_lwl","head", + "cheek_rf","head", + "cheek_rm","head", + "cheek_rb","head", + "cheek_lf","head", + "cheek_lm","head", + "cheek_lb","head", + "forehead_l","head", + "forehead_m","head", + "forehead_r","head", + "l_eye","head", + "r_eye","head", + "l_pupila","head", + "r_pupila","head", + "neck_t","head", + "neck_b","head", + "neck_r","head", + "neck_l","head", + "tongue_b","head", + "tongue_m","head", + "tongue_f","head", + //Left upper side + "LeftShoulder","Spine3", + "LeftArm","LeftShoulder", + "LeftArmRoll","LeftArm", + "LeftForeArm","LeftArmRoll", + "LeftForeArmRoll","LeftForeArm", + "LeftHand","LeftForeArmRoll", + "LeftHandRing","LeftHand", + "LeftHandRing1","LeftHandRing", + "LeftHandRing2","LeftHandRing1", + "LeftHandRing3","LeftHandRing2", + "LeftHandPinky1","LeftHandRing", + "LeftHandPinky2","LeftHandPinky1", + "LeftHandPinky3","LeftHandPinky2", + "LeftHandMiddle1","LeftHand", + "LeftHandMiddle2","LeftHandMiddle1", + "LeftHandMiddle3","LeftHandMiddle2", + "LeftHandIndex1","LeftHand", + "LeftHandIndex2","LeftHandIndex1", + "LeftHandIndex3","LeftHandIndex2", + "LeftHandThumb1","LeftHand", + "LeftHandThumb2","LeftHandThumb1", + "LeftHandThumb3","LeftHandThumb2", + //Right upper side + "RightShoulder","Spine3", + "RightArm","RightShoulder", + "RightArmRoll","RightArm", + "RightForeArm","RightArmRoll", + "RightForeArmRoll","RightForeArm", + "RightHand","RightForeArmRoll", + "RightHandRing","RightHand", + "RightHandRing1","RightHandRing", + "RightHandRing2","RightHandRing1", + "RightHandRing3","RightHandRing2", + "RightHandPinky1","RightHandRing", + "RightHandPinky2","RightHandPinky1", + "RightHandPinky3","RightHandPinky2", + "RightHandMiddle1","RightHand", + "RightHandMiddle2","RightHandMiddle1", + "RightHandMiddle3","RightHandMiddle2", + "RightHandIndex1","RightHand", + "RightHandIndex2","RightHandIndex1", + "RightHandIndex3","RightHandIndex2", + "RightHandThumb1","RightHand", + "RightHandThumb2","RightHandThumb1", + "RightHandThumb3","RightHandThumb2", + //Left lower side + "LeftUpLeg","Pelvis", + "LeftUpLegRoll","LeftUpLeg", + "LeftLeg","LeftUpLegRoll", + "LeftLegRoll","LeftLeg", + "LeftFoot","LeftLegRoll", + "LeftToeBase","LeftFoot", + //Right lower side + "RightUpLeg","Pelvis", + "RightUpLegRoll","RightUpLeg", + "RightLeg","RightUpLegRoll", + "RightLegRoll","RightLeg", + "RightFoot","RightLegRoll", + "RightToeBase","RightFoot" + }; + // location of pivot points (local axes) for hierarchical animation + //pivotsModel="ca\Anims\Characters\Data\Skeleton\SkeletonPivots.p3d"; + pivotsModel=""; + }; +}; + +class CfgModels { + class Default { + sectionsInherit=""; + sections[] = {""}; + skeletonName = ""; + }; + class ace_tacticalladder { + skeletonName = "ace_tacticalladder_skeleton"; + sections[] = { "roadway" }; + sectionsInherit = ""; + class Animations { + class rotate { + type = "rotation"; + source = ""; + sourceAddress = "clamp"; + selection = "base"; + axis = "axis_rotate"; + minValue = 0; + maxValue = 90; + angle0="rad 0"; + angle1="rad +90"; + }; + class extract_1 { + type = "translation"; + source = ""; + selection = "1"; + axis = "axis_1"; + animPeriod = 0; + minValue = 0; + maxValue = 1; + minPhase = 0; + maxPhase = 1; + offset0 = 0; + offset1 = 0.82; + }; + class extract_2: extract_1 { + selection = "2"; + axis = "axis_2"; + }; + class extract_3: extract_1 { + selection = "3"; + axis = "axis_3"; + }; + class extract_4: extract_1 { + selection = "4"; + axis = "axis_4"; + }; + class extract_5: extract_1 { + selection = "5"; + axis = "axis_5"; + }; + class extract_6: extract_1 { + selection = "6"; + axis = "axis_6"; + }; + class extract_7: extract_1 { + selection = "7"; + axis = "axis_7"; + }; + class extract_8: extract_1 { + selection = "8"; + axis = "axis_8"; + }; + class extract_9: extract_1 { + selection = "9"; + axis = "axis_9"; + }; + class extract_10: extract_1 { + selection = "10"; + axis = "axis_10"; + }; + class extract_11: extract_1 { + selection = "11"; + axis = "axis_11"; + }; + }; + }; + class ArmaMan: Default { + htMin=60; + htMax=1800; + afMax=30; + mfMax=0; + mFact=1; + tBody=37; + sections[]= { + "osobnost", + "Head_Injury", + "Body_Injury", + "l_leg_injury", + "l_arm_injury", + "r_arm_injury", + "r_leg_injury", + "injury_body", + "injury_legs", + "injury_hands", + "clan", + "clan_sign", + "Camo", + "CamoB", + "Camo1", + "Camo2", + "personality", + "hl", + "injury_head" + }; + skeletonName="OFP2_ManSkeleton"; + }; + class ace_tacticalladder_pack: ArmaMan { + }; +}; \ No newline at end of file diff --git a/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf b/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf new file mode 100644 index 0000000000..63a97d97e9 --- /dev/null +++ b/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf @@ -0,0 +1,32 @@ +/* + * Author: Rocko, Ruthberg + * Cancel tactical ladder deployment + * + * Arguments: + * 0: ladder + * + * Return Value: + * None + * + * Example: + * [_ladder] call ace_tacticalladder_fnc_cancelTLdeploy; + * + * Public: No + */ +#include "script_component.hpp" + +#define __ANIMS ["extract_1","extract_2","extract_3","extract_4","extract_5","extract_6","extract_7","extract_8","extract_9","extract_10","extract_11"] + +PARAMS_1(_ladder); + +detach _ladder; +_ladder animate ["rotate", 0]; +{ + _ladder animate [_x, 0]; +} forEach __ANIMS; + +call EFUNC(interaction,hideMouseHint); +[ACE_player, "DefaultAction", ACE_player getVariable [QGVAR(Deploy), -1]] call EFUNC(Common,removeActionEventHandler); +[ACE_player, "zoomtemp", ACE_player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); + +GVAR(ladder) = objNull; diff --git a/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf b/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf new file mode 100644 index 0000000000..93263c6aa0 --- /dev/null +++ b/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf @@ -0,0 +1,32 @@ +/* + * Author: Rocko, Ruthberg + * Confirm tactical ladder deployment + * + * Arguments: + * 0: ladder + * + * Return Value: + * Success? + * + * Example: + * [_ladder] call ace_tacticalladder_fnc_confirmTLdeploy; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_ladder); + +private ["_pos1", "_pos2"]; +_pos1 = getPosASL GVAR(ladder); +_pos2 = (GVAR(ladder) modelToWorld (GVAR(ladder) selectionPosition "check2")) call EFUNC(common,positionToASL); +if (lineIntersects [_pos1, _pos2, GVAR(ladder)]) exitWith { false }; + +call EFUNC(interaction,hideMouseHint); +[ACE_player, "DefaultAction", ACE_player getVariable [QGVAR(Deploy), -1]] call EFUNC(Common,removeActionEventHandler); +[ACE_player, "zoomtemp", ACE_player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); + +detach _ladder; +GVAR(ladder) = objNull; + +true diff --git a/addons/tacticalladder/functions/fnc_deployTL.sqf b/addons/tacticalladder/functions/fnc_deployTL.sqf new file mode 100644 index 0000000000..7ad135ca90 --- /dev/null +++ b/addons/tacticalladder/functions/fnc_deployTL.sqf @@ -0,0 +1,34 @@ +/* + * Author: Rocko, Ruthberg + * Deploy tactical ladder + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_tacticalladder_fnc_deployTL; + * + * Public: No + */ +#include "script_component.hpp" + +if ((backpack ACE_player) != "ACE_TacticalLadder_Pack") exitWith {}; + +private ["_pos", "_offset", "_ladder"]; + +removeBackpack ACE_player; + +_pos = ACE_player modelToWorld [0,0,0]; +_offset = if ((ACE_player call CBA_fnc_getUnitAnim select 0) == "prone") then { 1 } else {0.8}; +_pos set [0, (_pos select 0) + (sin (direction ACE_player) * _offset)]; +_pos set [1, (_pos select 1) + (cos (direction ACE_player) * _offset)]; +_pos set [2, [ACE_player] call CBA_fnc_realHeight]; + +_ladder = "ACE_Tactical_Ladder" createVehicle _pos; +_ladder setPos _pos; +_ladder setDir (direction ACE_player); + +ACE_player reveal _ladder; diff --git a/addons/tacticalladder/functions/fnc_handleScrollWheel.sqf b/addons/tacticalladder/functions/fnc_handleScrollWheel.sqf new file mode 100644 index 0000000000..d08cb6e208 --- /dev/null +++ b/addons/tacticalladder/functions/fnc_handleScrollWheel.sqf @@ -0,0 +1,48 @@ +/* + * Author: Rocko, Ruthberg + * Handles lengthening and tilting of the ladder + * + * Arguments: + * Amount scrolled + * + * Return Value: + * Handled + * + * Example: + * 1 call ace_tacticalladder_fnc_handleScrollWheel; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_scroll); + +if (isNull GVAR(ladder)) exitWith { false }; + +if (GETMVAR(ACE_Modifier,0) == 0) then { + private ["_currentStep"]; + // Lengthening + if (_scroll > 0) then { + _currentStep = GVAR(currentStep); + if (_currentStep == 11) exitWith {}; + _currentStep = _currentStep + 1; + if (GVAR(ladder) animationPhase (format["extract_%1", _currentStep]) == 0) then { + GVAR(ladder) animate [format["extract_%1", _currentStep], 1]; + GVAR(currentStep) = _currentStep; + }; + }; + if (_scroll < 0) then { + _currentStep = GVAR(currentStep); + if (_currentStep == 3) exitWith {}; + if (GVAR(ladder) animationPhase (format["extract_%1", _currentStep]) == 1) then { + GVAR(ladder) animate [format["extract_%1", _currentStep], 0]; + GVAR(currentStep) = _currentStep - 1; + }; + }; +} else { + // Tilting + GVAR(currentAngle) = 0 max (GVAR(currentAngle) + _scroll) min 90; + GVAR(ladder) animate ["rotate", GVAR(currentAngle)]; +}; + +true \ No newline at end of file diff --git a/addons/tacticalladder/functions/fnc_pickupTL.sqf b/addons/tacticalladder/functions/fnc_pickupTL.sqf new file mode 100644 index 0000000000..c603f1feca --- /dev/null +++ b/addons/tacticalladder/functions/fnc_pickupTL.sqf @@ -0,0 +1,26 @@ +/* + * Author: Rocko, Ruthberg + * Pick up tactical ladder + * + * Arguments: + * 0: ladder + * 1: unit + * + * Return Value: + * Success? + * + * Example: + * [_ladder, _unit] call ace_tacticalladder_fnc_pickupTL; + * + * Public: No + */ +#include "script_component.hpp" + +if ((backpack ACE_player) != "") exitWith { false }; + +PARAMS_2(_ladder,_unit); + +deleteVehicle _ladder; +_unit addBackpack "ACE_TacticalLadder_Pack"; + +true diff --git a/addons/tacticalladder/functions/fnc_positionTL.sqf b/addons/tacticalladder/functions/fnc_positionTL.sqf new file mode 100644 index 0000000000..103792c851 --- /dev/null +++ b/addons/tacticalladder/functions/fnc_positionTL.sqf @@ -0,0 +1,52 @@ +/* + * Author: Rocko, Ruthberg + * Position tactical ladder + * + * Arguments: + * 0: sandbag + * 1: unit + * + * Return Value: + * None + * + * Example: + * [_ladder, _unit] call ace_tacticalladder_fnc_positionTL; + * + * Public: No + */ +#include "script_component.hpp" + +#define __ANIMS ["extract_1","extract_2","extract_3","extract_4","extract_5","extract_6","extract_7","extract_8","extract_9","extract_10","extract_11"] + +PARAMS_2(_ladder,_unit); + +{ + _ladder animate [_x, 0]; +} forEach __ANIMS; + +_unit switchMove "amovpercmstpslowwrfldnon_player_idlesteady03"; +_ladder attachTo [_unit, [0, 0.75, 0], ""]; // Position ladder in front of player + +_ladder animate ["rotate", 0]; +{ + _ladder animate [_x, 1]; +} forEach ["extract_1", "extract_2", "extract_3"]; // Extract ladder at head height (extract_3) + +GVAR(ladder) = _ladder; +GVAR(cancelTime) = ACE_time + 1; // Workaround to prevent accidental canceling +GVAR(currentStep) = 3; +GVAR(currentAngle) = 0; + +[localize LSTRING(Deploy), localize LSTRING(Drop), localize LSTRING(Adjust)] call EFUNC(interaction,showMouseHint); + +ACE_player setVariable [QGVAR(Deploy), + [ACE_player, "DefaultAction", + {!isNull GVAR(ladder)}, + {GVAR(ladder) call FUNC(confirmTLdeploy);} +] call EFUNC(common,AddActionEventHandler)]; + +ACE_player setVariable [QGVAR(Cancel), + [ACE_player, "zoomtemp", + {!isNull GVAR(ladder)}, + {GVAR(ladder) call FUNC(cancelTLdeploy);} +] call EFUNC(common,AddActionEventHandler)]; diff --git a/addons/tacticalladder/functions/script_component.hpp b/addons/tacticalladder/functions/script_component.hpp new file mode 100644 index 0000000000..53bdb8be62 --- /dev/null +++ b/addons/tacticalladder/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\tacticalladder\script_component.hpp" \ No newline at end of file diff --git a/addons/tacticalladder/script_component.hpp b/addons/tacticalladder/script_component.hpp new file mode 100644 index 0000000000..9905216ae7 --- /dev/null +++ b/addons/tacticalladder/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT tacticalladder +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_TACTICALLADDER + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_TACTICALLADDER + #define DEBUG_SETTINGS DEBUG_SETTINGS_TACTICALLADDER +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/tacticalladder/stringtable.xml b/addons/tacticalladder/stringtable.xml new file mode 100644 index 0000000000..4342ac5408 --- /dev/null +++ b/addons/tacticalladder/stringtable.xml @@ -0,0 +1,73 @@ + + + + + Telescopic Ladder + Teleskopleiter + Телескопическая лестница + Drabina teleskopowa + Escalera telescópica + Telescopic Ladder + Teleskopický žebřík + Telescopic Ladder + Telescopic Ladder + Escada telescópica + + + Deploy ladder + Leiter aufbauen + Установить лестницу + Rozłóż drabinę + Despelgar escalera + Deploy ladder + Rozložit žebřík + Deploy ladder + Deploy ladder + Implantar escada + + + Drop ladder + Leiter ablegen + Положить лестницу + Zostaw drabinę + Soltar escalera + Drop ladder + Položit žebřík + Drop ladder + Drop ladder + Derrubar escada + + + Adjust ladder + Leiter einstellen + Reguluj drabinę + Upravit žebřík + Ajustar escalera + Ajustar escada + + + Position ladder + Leiter positionieren + Перенести лестницу + Postaw drabinę + Colocar escalera + Position ladder + Umístit žebřík + Position ladder + Position ladder + Posicionar escada + + + Pickup ladder + Leiter aufnehmen + Взять лестницу + Zabierz drabinę + Recoger escalera + Pickup ladder + Vzít žebřík + Pickup ladder + Pickup ladder + Pegar escada + + + \ No newline at end of file diff --git a/addons/testmissions/$PBOPREFIX$ b/addons/testmissions/$PBOPREFIX$ index 30f861b8ff..c899a56127 100644 --- a/addons/testmissions/$PBOPREFIX$ +++ b/addons/testmissions/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\Addons\testmissions \ No newline at end of file +z\ace\addons\testmissions \ No newline at end of file diff --git a/addons/testmissions/script_component.hpp b/addons/testmissions/script_component.hpp index da17bfb7e2..d1674fb35c 100644 --- a/addons/testmissions/script_component.hpp +++ b/addons/testmissions/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT testmissions -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_TESTMISSIONS #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_ENABLED_TESTMISSIONS #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/thermals/script_component.hpp b/addons/thermals/script_component.hpp index acaf685557..97d7630b50 100644 --- a/addons/thermals/script_component.hpp +++ b/addons/thermals/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT thermals -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_THERMALS #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_THERMALS #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/tripod/$PBOPREFIX$ b/addons/tripod/$PBOPREFIX$ new file mode 100644 index 0000000000..a374eb7994 --- /dev/null +++ b/addons/tripod/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\tripod diff --git a/addons/tripod/CfgEventHandlers.hpp b/addons/tripod/CfgEventHandlers.hpp new file mode 100644 index 0000000000..ed5027f094 --- /dev/null +++ b/addons/tripod/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; + +class Extended_Init_EventHandlers { + class ACE_TripodObject { + class ADDON { + init = QUOTE(_this call DEFUNC(dragging,initObject)); + }; + }; +}; diff --git a/addons/tripod/CfgVehicles.hpp b/addons/tripod/CfgVehicles.hpp new file mode 100644 index 0000000000..714d2cafb1 --- /dev/null +++ b/addons/tripod/CfgVehicles.hpp @@ -0,0 +1,92 @@ + +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(place) { + displayName = CSTRING(Placedown); + condition = QUOTE([ARR_2(_player,'ACE_Tripod')] call EFUNC(common,hasItem)); + statement = QUOTE([ARR_2(_player,'ACE_Tripod')] call FUNC(place)); + showDisabled = 0; + priority = 2; + icon = PATHTOF(UI\w_sniper_tripod_ca.paa); + }; + }; + }; + }; + + class Item_Base_F; + class ACE_Item_Tripod: Item_Base_F { + author[] = {"Rocko", "Scubaman3D"}; + scope = 2; + scopeCurator = 2; + displayName = CSTRING(DisplayName); + vehicleClass = "Items"; + class TransportItems { + class ACE_Tripod { + name = "ACE_Tripod"; + count = 1; + }; + }; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_Tripod,2); + }; + }; + + class thingX; + class ACE_TripodObject: thingX { + XEH_ENABLED; + scope = 2; + displayName = CSTRING(DisplayName); + model = PATHTOF(data\sniper_tripod.p3d); + class AnimationSources { + class slide_down_tripod { + source = "user"; + animPeriod = 0.02; + initPhase = 0; + minValue = 0; + maxValue = 1; + }; + class retract_leg_1: slide_down_tripod {}; + class retract_leg_2: retract_leg_1 {}; + class retract_leg_3: retract_leg_2 {}; + }; + EGVAR(dragging,canDrag) = 1; + EGVAR(dragging,dragPosition[]) = {0,1,0}; + EGVAR(dragging,dragDirection) = 0; + class ACE_Actions { + class ACE_MainActions { + selection = ""; + distance = 5; + condition = "true"; + class ACE_Pickup { + selection = ""; + displayName = CSTRING(PickUp); + distance = 5; + condition = "true"; + statement = QUOTE([ARR_2(_target,_player)] call FUNC(pickup)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + icon = PATHTOF(UI\w_sniper_tripod_ca.paa); + }; + class ACE_Adjust { + selection = ""; + displayName = CSTRING(Adjust); + distance = 5; + condition = "true"; + statement = QUOTE(_target call FUNC(adjust)); + showDisabled = 0; + exceptions[] = {}; + priority = 5; + icon = PATHTOF(UI\w_sniper_tripod_ca.paa); + }; + }; + }; + }; +}; diff --git a/addons/tripod/CfgWeapons.hpp b/addons/tripod/CfgWeapons.hpp new file mode 100644 index 0000000000..cc7521f0f2 --- /dev/null +++ b/addons/tripod/CfgWeapons.hpp @@ -0,0 +1,18 @@ + +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_Tripod: ACE_ItemCore { + author[] = {"Rocko", "Scubaman3D"}; + scope = 2; + displayName = CSTRING(DisplayName); + descriptionShort = ""; + model = PATHTOF(data\w_sniper_tripod.p3d); + picture = PATHTOF(UI\w_sniper_tripod_ca.paa); + + class ItemInfo: InventoryItem_Base_F { + mass = 40; + }; + }; +}; diff --git a/addons/tripod/README.md b/addons/tripod/README.md new file mode 100644 index 0000000000..1f4282f1ab --- /dev/null +++ b/addons/tripod/README.md @@ -0,0 +1,10 @@ +ace_tripod +=============== + +Adds a packable tripod. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/tripod/UI/w_sniper_tripod_ca.paa b/addons/tripod/UI/w_sniper_tripod_ca.paa new file mode 100644 index 0000000000..a7ea6b0c31 Binary files /dev/null and b/addons/tripod/UI/w_sniper_tripod_ca.paa differ diff --git a/addons/tripod/XEH_postInit.sqf b/addons/tripod/XEH_postInit.sqf new file mode 100644 index 0000000000..706aaecae9 --- /dev/null +++ b/addons/tripod/XEH_postInit.sqf @@ -0,0 +1,16 @@ +#include "script_component.hpp" + +GVAR(adjuster) = objNull; +GVAR(adjusting) = false; +GVAR(adjustPFH) = -1; + +GVAR(height) = 0; + +// Cancel adjustment if interact menu opens +["interactMenuOpened", { + if (GVAR(adjustPFH) != -1 && GVAR(adjusting)) then { + GVAR(adjusting) = false; + }; +}] call EFUNC(common,addEventHandler); + +[{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(Common,addScrollWheelEventHandler); diff --git a/addons/tripod/XEH_preInit.sqf b/addons/tripod/XEH_preInit.sqf new file mode 100644 index 0000000000..f27b707936 --- /dev/null +++ b/addons/tripod/XEH_preInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(adjust); +PREP(handleScrollWheel); +PREP(pickup); +PREP(place); + +ADDON = true; diff --git a/addons/tripod/config.cpp b/addons/tripod/config.cpp new file mode 100644 index 0000000000..80379019c3 --- /dev/null +++ b/addons/tripod/config.cpp @@ -0,0 +1,16 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_Item_Tripod"}; + weapons[] = {"ACE_Tripod"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author[] = {"Rocko", "Scubaman3D", "Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" \ No newline at end of file diff --git a/addons/tripod/data/model.cfg b/addons/tripod/data/model.cfg new file mode 100644 index 0000000000..ee81d26c8e --- /dev/null +++ b/addons/tripod/data/model.cfg @@ -0,0 +1,64 @@ +class CfgSkeletons +{ + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + class ace_snipertripod_skeleton: Default { + isDiscrete = 1; + skeletonInherit = "Default"; + skeletonBones[] = { + "tripod","", + "leg_1","tripod", + "leg_2","tripod", + "leg_3","tripod", + "leg_slide_1","leg_1", + "leg_slide_2","leg_2", + "leg_slide_3","leg_3" + }; + }; +}; +class CfgModels { + class Default { + sectionsInherit = ""; + sections[] = {}; + skeletonName = ""; + }; + class sniper_tripod: Default { + skeletonName = "ace_snipertripod_skeleton"; + sectionsInherit = "Default"; + class animations { + class slide_down_tripod { + type = "translation"; + selection = "tripod"; + source = "user"; + begin = "slide_end"; + end = "slide_start"; + memory = 1; + minValue = 0; + maxValue = 1; + sourceAddress = "clamp"; + offset0 = 0; + offset1 = 0.855; + }; + class retract_leg_1: slide_down_tripod { + selection = "leg_slide_1"; + begin = "slide_end_1"; + end = "slide_start_1"; + offset0 = 0; + offset1 = -0.95; + }; + class retract_leg_2: retract_leg_1 { + selection = "leg_slide_2"; + begin = "slide_end_2"; + end = "slide_start_2"; + }; + class retract_leg_3: retract_leg_2 { + selection = "leg_slide_3"; + begin = "slide_end_3"; + end = "slide_start_3"; + }; + }; + }; +}; diff --git a/addons/tripod/data/nipertripod_co.paa b/addons/tripod/data/nipertripod_co.paa new file mode 100644 index 0000000000..6f0cbaacf0 Binary files /dev/null and b/addons/tripod/data/nipertripod_co.paa differ diff --git a/addons/tripod/data/sniper_tripod.p3d b/addons/tripod/data/sniper_tripod.p3d new file mode 100644 index 0000000000..5deab7067a Binary files /dev/null and b/addons/tripod/data/sniper_tripod.p3d differ diff --git a/addons/tripod/data/w_sniper_tripod.p3d b/addons/tripod/data/w_sniper_tripod.p3d new file mode 100644 index 0000000000..65758ea807 Binary files /dev/null and b/addons/tripod/data/w_sniper_tripod.p3d differ diff --git a/addons/tripod/functions/fnc_adjust.sqf b/addons/tripod/functions/fnc_adjust.sqf new file mode 100644 index 0000000000..ce50d38cf0 --- /dev/null +++ b/addons/tripod/functions/fnc_adjust.sqf @@ -0,0 +1,43 @@ +/* + * Author: Ruthberg + * + * Adjust tripod height + * + * Arguments: + * 0: tripod + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_1(_tripod); + +GVAR(adjuster) = ACE_player; +GVAR(adjusting) = true; + +GVAR(adjustPFH) = [{ + EXPLODE_1_PVT(_this select 0,_tripod); + + if (GVAR(adjuster) != ACE_player || !GVAR(adjusting)) exitWith { + call EFUNC(interaction,hideMouseHint); + [ACE_player, "DefaultAction", ACE_player getVariable [QGVAR(Adjust), -1]] call EFUNC(Common,removeActionEventHandler); + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + { + _tripod animate [_x, 1 - GVAR(height)]; + } foreach ["slide_down_tripod", "retract_leg_1", "retract_leg_2", "retract_leg_3"]; + +}, 0, [_tripod]] call CBA_fnc_addPerFrameHandler; + +[localize "STR_ACE_Tripod_Done", "", localize "STR_ACE_Tripod_ScrollAction"] call EFUNC(interaction,showMouseHint); + +ACE_player setVariable [QGVAR(Adjust), + [ACE_player, "DefaultAction", + {GVAR(adjustPFH) != -1 && GVAR(adjusting)}, + {GVAR(adjusting) = false;} +] call EFUNC(common,AddActionEventHandler)]; diff --git a/addons/tripod/functions/fnc_handleScrollWheel.sqf b/addons/tripod/functions/fnc_handleScrollWheel.sqf new file mode 100644 index 0000000000..7399bf0c2c --- /dev/null +++ b/addons/tripod/functions/fnc_handleScrollWheel.sqf @@ -0,0 +1,24 @@ +/* + * Author: Garth 'L-H' de Wet, Ruthberg + * Handles sandbag rotation + * + * Arguments: + * 0: scroll amount + * + * Return Value: + * handled + * + * Example: + * 1.2 call ace_tripod_fnc_handleScrollWheel; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_scroll); + +if (GETMVAR(ACE_Modifier,0) == 0 || GVAR(adjustPFH) == -1) exitWith { false }; + +GVAR(height) = 0 max (GVAR(height) + (_scroll / 20)) min 1; + +true diff --git a/addons/tripod/functions/fnc_pickup.sqf b/addons/tripod/functions/fnc_pickup.sqf new file mode 100644 index 0000000000..f264eb1e2e --- /dev/null +++ b/addons/tripod/functions/fnc_pickup.sqf @@ -0,0 +1,30 @@ +/* + * Author: Rocko, Ruthberg + * + * Pick up tripod + * + * Arguments: + * 0: tripod + * 1: unit + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_2(_tripod,_unit); + +if ((_unit call CBA_fnc_getUnitAnim) select 0 == "stand") then { + _unit playMove "AmovPercMstpSrasWrflDnon_diary"; +}; + +[{ + PARAMS_2(_tripod,_unit); + + [_unit, "ACE_Tripod"] call EFUNC(common,addToInventory); + deleteVehicle _tripod; + +}, [_tripod, _unit], 1, 0]call EFUNC(common,waitAndExecute); diff --git a/addons/tripod/functions/fnc_place.sqf b/addons/tripod/functions/fnc_place.sqf new file mode 100644 index 0000000000..5e9c783589 --- /dev/null +++ b/addons/tripod/functions/fnc_place.sqf @@ -0,0 +1,50 @@ +/* + * Author: Rocko, Ruthberg + * + * Place down tripod + * + * Arguments: + * 0: unit + * 1: tripod class + * + * Return Value: + * Nothing + * + * Return value: + * None + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_tripodClass); + +_unit removeItem _tripodClass; + +if ((_unit call CBA_fnc_getUnitAnim) select 0 == "stand") then { + _unit playMove "AmovPercMstpSrasWrflDnon_diary"; +}; + +[{ + PARAMS_1(_unit); + + private ["_direction", "_position", "_tripod"]; + _direction = getDir _unit; + _position = (getPosASL _unit) vectorAdd [0.8 * sin(_direction), 0.8 * cos(_direction), 0.02]; + + _tripod = "ACE_TripodObject" createVehicle [0, 0, 0]; + { + _tripod animate [_x, 1]; + } foreach ["slide_down_tripod", "retract_leg_1", "retract_leg_2", "retract_leg_3"]; + + [{ + EXPLODE_3_PVT(_this select 0,_tripod,_direction,_position); + if (_tripod animationPhase "slide_down_tripod" == 1) then { + _tripod setDir _direction; + _tripod setPosASL _position; + if ((getPosATL _tripod select 2) - (getPos _tripod select 2) < 1E-5) then { + _tripod setVectorUp (surfaceNormal (position _tripod)); + }; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + }, 0, [_tripod, _direction, _position]] call CBA_fnc_addPerFrameHandler; + +}, [_unit], 1, 0] call EFUNC(common,waitAndExecute); diff --git a/addons/tripod/functions/script_component.hpp b/addons/tripod/functions/script_component.hpp new file mode 100644 index 0000000000..4fa165afc7 --- /dev/null +++ b/addons/tripod/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\tripod\script_component.hpp" \ No newline at end of file diff --git a/addons/tripod/script_component.hpp b/addons/tripod/script_component.hpp new file mode 100644 index 0000000000..b160a14742 --- /dev/null +++ b/addons/tripod/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT tripod +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_TRIPOD + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_TRIPOD + #define DEBUG_SETTINGS DEBUG_SETTINGS_TRIPOD +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/tripod/stringtable.xml b/addons/tripod/stringtable.xml new file mode 100644 index 0000000000..254af3295f --- /dev/null +++ b/addons/tripod/stringtable.xml @@ -0,0 +1,57 @@ + + + + + SSWT Kit + Scharfschützenzweibein + Снайперский штатив + Trójnóg snajperski + SSWT Kit + SSWT Kit + SSWT souprava + SSWT Kit + SSWT Kit + Kit SSWT + + + Place SSWT Kit + Scharfschützenzweibein aufstellen + Установить снайперский штатив + Postaw trójnóg snajperski + Place SSWT Kit + Place SSWT Kit + Rozlož souprava SSWT + Place SSWT Kit + Place SSWT Kit + Colocar kit SSWT + + + Pick up SSWT Kit + Podnieś trójnóg snajperski + Coger equipo SSWT + Zvednout SSWT soupravu + Pegar kit SSWT + + + Adjust SSWT Kit + Reguluj trójnóg snajperski + Ajustar equipo SSWT + Regulovat SSWT soupravu + Ajustar kit SSWT + + + Done + Gotowe + Hecho + Hotovo + Feito + + + + Modifier, adjust + + Modyfikator, regulacja + + Modificador, ajuste + + Modifikátor, regulace + + Modificador, ajuste + + + \ No newline at end of file diff --git a/addons/ui/$PBOPREFIX$ b/addons/ui/$PBOPREFIX$ new file mode 100644 index 0000000000..601bbd5f60 --- /dev/null +++ b/addons/ui/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\Addons\ui \ No newline at end of file diff --git a/addons/ui/README.md b/addons/ui/README.md new file mode 100644 index 0000000000..f11027038f --- /dev/null +++ b/addons/ui/README.md @@ -0,0 +1,9 @@ +ace_ui +======= + +Changes the chat contrast on the map to allow easier reading + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + diff --git a/addons/ui/config.cpp b/addons/ui/config.cpp new file mode 100644 index 0000000000..e7ea4b32eb --- /dev/null +++ b/addons/ui/config.cpp @@ -0,0 +1,30 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"VKing"}; + authorUrl = "https://github.com/ACEMod/"; + VERSION_CONFIG; + }; +}; + +class RscText; + +class RscDisplayChat { + class controls { + delete Line; + delete Background; + class CA_Background: RscText { + colorBackground[] = {0.5,0.5,0.5,0.33}; // Make the chat entry field slightly darker + }; + }; +}; + +class RscChatListDefault { + colorBackground[] = {0,0,0,0.5}; // Make the chat background darker + colorMessageProtocol[] = {0.85,0.85,0.85,1}; // And the chat text brighter +}; diff --git a/addons/ui/functions/script_component.hpp b/addons/ui/functions/script_component.hpp new file mode 100644 index 0000000000..656228f742 --- /dev/null +++ b/addons/ui/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\ui\script_component.hpp" diff --git a/addons/ui/script_component.hpp b/addons/ui/script_component.hpp new file mode 100644 index 0000000000..a1a210701c --- /dev/null +++ b/addons/ui/script_component.hpp @@ -0,0 +1,13 @@ +#define COMPONENT ui +#include "\z\ace\Addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_UI + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_UI + #define DEBUG_SETTINGS DEBUG_SETTINGS_UI +#endif + +#include "\z\ace\Addons\main\script_macros.hpp" + diff --git a/addons/vector/CfgVehicles.hpp b/addons/vector/CfgVehicles.hpp index e9fd8945de..cf0d50d18f 100644 --- a/addons/vector/CfgVehicles.hpp +++ b/addons/vector/CfgVehicles.hpp @@ -7,10 +7,10 @@ class CfgVehicles { class Item_Base_F; class ACE_Item_Vector: Item_Base_F { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); scope = 2; scopeCurator = 2; - displayName = "$STR_ACE_Vector_VectorName"; + displayName = CSTRING(VectorName); vehicleClass = "Items"; class TransportWeapons { MACRO_ADDWEAPON(ACE_Vector,1); diff --git a/addons/vector/CfgWeapons.hpp b/addons/vector/CfgWeapons.hpp index 6b8757d143..019d774da8 100644 --- a/addons/vector/CfgWeapons.hpp +++ b/addons/vector/CfgWeapons.hpp @@ -2,9 +2,9 @@ class CfgWeapons { class Binocular; class ACE_Vector: Binocular { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_Vector_VectorName"; - descriptionShort = "$STR_ACE_Vector_VectorDescription"; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(VectorName); + descriptionShort = CSTRING(VectorDescription); model = PATHTOF(ace_vector.p3d); modelOptics = PATHTOF(ace_vector_optics.p3d); picture = PATHTOF(UI\ace_vector_x_ca.paa); diff --git a/addons/vector/functions/fnc_onKeyDown.sqf b/addons/vector/functions/fnc_onKeyDown.sqf index feb706bc02..9fa51e9068 100644 --- a/addons/vector/functions/fnc_onKeyDown.sqf +++ b/addons/vector/functions/fnc_onKeyDown.sqf @@ -40,19 +40,19 @@ switch (_this select 0) do { // handle input in option menu if (GVAR(currentMode) == "settings") exitWith { - if (diag_tickTime < GVAR(keyDownTimeMenu) + 1) exitWith {}; + if (ACE_diagTime < GVAR(keyDownTimeMenu) + 1) exitWith {}; - if (diag_tickTime < GVAR(keyDownTimeAzimuth) + 0.5) then { + if (ACE_diagTime < GVAR(keyDownTimeAzimuth) + 0.5) then { GVAR(keyDownTabCountAzimuth) = (GETGVAR(keyDownTabCountAzimuth,0)) + 1; } else { GVAR(keyDownTabCountAzimuth) = 1; }; - GVAR(keyDownTimeAzimuth) = diag_tickTime; + GVAR(keyDownTimeAzimuth) = ACE_diagTime; }; if (GVAR(currentMode) == "config") exitWith { - if (diag_tickTime < GVAR(keyDownTimeMenu) + 0.5) exitWith {}; + if (ACE_diagTime < GVAR(keyDownTimeMenu) + 0.5) exitWith {}; ["config"] call FUNC(nextMode); }; @@ -66,30 +66,30 @@ switch (_this select 0) do { [false] call FUNC(showP1); // handle 5 times clicking - if (diag_tickTime < GVAR(keyDownTimeAzimuth) + 0.5) then { + if (ACE_diagTime < GVAR(keyDownTimeAzimuth) + 0.5) then { GVAR(keyDownTabCountAzimuth) = (GETGVAR(keyDownTabCountAzimuth,0)) + 1; - GVAR(keyDownTimeAzimuth) = diag_tickTime; + GVAR(keyDownTimeAzimuth) = ACE_diagTime; } else { GVAR(keyDownTabCountAzimuth) = 1; }; // open settings menu if (GVAR(keyDownTabCountAzimuth) == 5) exitWith { - GVAR(keyDownTimeMenu) = diag_tickTime; - GVAR(keyDownTimeAzimuth) = diag_tickTime; + GVAR(keyDownTimeMenu) = ACE_diagTime; + GVAR(keyDownTimeAzimuth) = ACE_diagTime; GVAR(keyDownTabCountAzimuth) = 0; GVAR(configTemp) = [GVAR(useFeet), GVAR(useMil)]; ["settings"] call FUNC(showText); "settings" call _fnc_setPFH; }; - if (diag_tickTime < GVAR(keyDownTimeAzimuth) + 0.5) exitWith { + if (ACE_diagTime < GVAR(keyDownTimeAzimuth) + 0.5) exitWith { "azimuth+inclination" call _fnc_setPFH; }; - GVAR(keyDownTimeAzimuth) = diag_tickTime; + GVAR(keyDownTimeAzimuth) = ACE_diagTime; - if (diag_tickTime > GVAR(keyDownTimeDistance) + 0.5) then { + if (ACE_diagTime > GVAR(keyDownTimeDistance) + 0.5) then { if !(GETGVAR(isKeyDownDistance,false)) then { ["distance"] call FUNC(clearDisplay); "azimuth" call _fnc_setPFH; @@ -110,19 +110,19 @@ switch (_this select 0) do { // handle input in option menu if (GVAR(currentMode) == "config") exitWith { - if (diag_tickTime < GVAR(keyDownTimeMenu) + 0.5) exitWith {}; + if (ACE_diagTime < GVAR(keyDownTimeMenu) + 0.5) exitWith {}; - if (diag_tickTime < GVAR(keyDownTimeDistance) + 0.5) then { + if (ACE_diagTime < GVAR(keyDownTimeDistance) + 0.5) then { GVAR(keyDownTabCountDistance) = (GETGVAR(keyDownTabCountDistance,0)) + 1; } else { GVAR(keyDownTabCountDistance) = 1; }; - GVAR(keyDownTimeDistance) = diag_tickTime; + GVAR(keyDownTimeDistance) = ACE_diagTime; }; if (GVAR(currentMode) == "settings") exitWith { - if (diag_tickTime < GVAR(keyDownTimeMenu) + 0.5) exitWith {}; + if (ACE_diagTime < GVAR(keyDownTimeMenu) + 0.5) exitWith {}; ["settings"] call FUNC(nextMode); }; @@ -141,30 +141,30 @@ switch (_this select 0) do { [false] call FUNC(showP1); // handle 5 times clicking - if (diag_tickTime < GVAR(keyDownTimeDistance) + 0.5) then { + if (ACE_diagTime < GVAR(keyDownTimeDistance) + 0.5) then { GVAR(keyDownTabCountDistance) = (GETGVAR(keyDownTabCountDistance,0)) + 1; - GVAR(keyDownTimeDistance) = diag_tickTime; + GVAR(keyDownTimeDistance) = ACE_diagTime; } else { GVAR(keyDownTabCountDistance) = 1; }; // open config menu if (GVAR(keyDownTabCountDistance) == 5) exitWith { - GVAR(keyDownTimeMenu) = diag_tickTime; - GVAR(keyDownTimeDistance) = diag_tickTime; + GVAR(keyDownTimeMenu) = ACE_diagTime; + GVAR(keyDownTimeDistance) = ACE_diagTime; GVAR(keyDownTabCountDistance) = 0; GVAR(configTemp) = GVAR(modeReticle); ["config"] call FUNC(showText); "config" call _fnc_setPFH; }; - if (diag_tickTime < GVAR(keyDownTimeDistance) + 0.5) exitWith { + if (ACE_diagTime < GVAR(keyDownTimeDistance) + 0.5) exitWith { "height+distance" call _fnc_setPFH; }; - GVAR(keyDownTimeDistance) = diag_tickTime; + GVAR(keyDownTimeDistance) = ACE_diagTime; - if (diag_tickTime > GVAR(keyDownTimeAzimuth) + 0.5) then { + if (ACE_diagTime > GVAR(keyDownTimeAzimuth) + 0.5) then { if !(GETGVAR(isKeyDownAzimuth,false)) then { ["azimuth"] call FUNC(clearDisplay); "distance" call _fnc_setPFH; diff --git a/addons/vector/functions/fnc_onKeyHold.sqf b/addons/vector/functions/fnc_onKeyHold.sqf index 568ef2050c..ff4e5fc6ad 100644 --- a/addons/vector/functions/fnc_onKeyHold.sqf +++ b/addons/vector/functions/fnc_onKeyHold.sqf @@ -21,7 +21,7 @@ switch (_this select 0) do { case ("azimuth"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeAzimuth) + 0.2; + _isReady = ACE_diagTime > GVAR(keyDownTimeAzimuth) + 0.2; [false] call FUNC(showCenter); @@ -42,7 +42,7 @@ switch (_this select 0) do { case ("distance"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeDistance) + 0.5; + _isReady = ACE_diagTime > GVAR(keyDownTimeDistance) + 0.5; [_isReady] call FUNC(showCenter); @@ -66,7 +66,7 @@ switch (_this select 0) do { call FUNC(showAzimuth); private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeDistance) + 0.5; + _isReady = ACE_diagTime > GVAR(keyDownTimeDistance) + 0.5; [_isReady] call FUNC(showCenter); @@ -89,7 +89,7 @@ switch (_this select 0) do { case ("azimuth+inclination"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeAzimuth) + 0.2; + _isReady = ACE_diagTime > GVAR(keyDownTimeAzimuth) + 0.2; [false] call FUNC(showCenter); @@ -110,7 +110,7 @@ switch (_this select 0) do { case ("height+distance"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeDistance) + 0.5; + _isReady = ACE_diagTime > GVAR(keyDownTimeDistance) + 0.5; [_isReady] call FUNC(showCenter); @@ -132,7 +132,7 @@ switch (_this select 0) do { case ("relative_distance"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeAzimuth) + 0.5; + _isReady = ACE_diagTime > GVAR(keyDownTimeAzimuth) + 0.5; [_isReady] call FUNC(showCenter); @@ -155,7 +155,7 @@ switch (_this select 0) do { case ("relative_height+length"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeAzimuth) + 0.5; + _isReady = ACE_diagTime > GVAR(keyDownTimeAzimuth) + 0.5; [_isReady] call FUNC(showCenter); @@ -178,7 +178,7 @@ switch (_this select 0) do { case ("relative_azimuth+distance"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeDistance) + 0.5; + _isReady = ACE_diagTime > GVAR(keyDownTimeDistance) + 0.5; [_isReady] call FUNC(showCenter); @@ -201,7 +201,7 @@ switch (_this select 0) do { case ("fall_of_shot"): { private "_isReady"; - _isReady = diag_tickTime > GVAR(keyDownTimeDistance) + 0.5; + _isReady = ACE_diagTime > GVAR(keyDownTimeDistance) + 0.5; [_isReady] call FUNC(showCenter); @@ -223,8 +223,8 @@ switch (_this select 0) do { }; case ("settings"): { - if (diag_tickTime < GVAR(keyDownTimeMenu) + 1) exitWith { - GVAR(keyDownTimeAzimuth) = diag_tickTime; + if (ACE_diagTime < GVAR(keyDownTimeMenu) + 1) exitWith { + GVAR(keyDownTimeAzimuth) = ACE_diagTime; }; [["meter", "feet"] select (GVAR(configTemp) select 0)] call FUNC(showText); @@ -247,7 +247,7 @@ switch (_this select 0) do { }; }; - if (GVAR(keyDownTabCountAzimuth) > 0 && {diag_tickTime > GVAR(keyDownTimeAzimuth) + 0.5}) exitWith { + if (GVAR(keyDownTabCountAzimuth) > 0 && {ACE_diagTime > GVAR(keyDownTimeAzimuth) + 0.5}) exitWith { ["clear_left"] call FUNC(showText); ["clear_right"] call FUNC(showText); @@ -264,8 +264,8 @@ switch (_this select 0) do { }; case ("config"): { - if (diag_tickTime < GVAR(keyDownTimeMenu) + 1) exitWith { - GVAR(keyDownTimeDistance) = diag_tickTime; + if (ACE_diagTime < GVAR(keyDownTimeMenu) + 1) exitWith { + GVAR(keyDownTimeDistance) = ACE_diagTime; }; switch (GVAR(configTemp)) do { @@ -315,7 +315,7 @@ switch (_this select 0) do { }; }; - if (GVAR(keyDownTabCountDistance) > 0 && {diag_tickTime > GVAR(keyDownTimeDistance) + 0.5}) exitWith { + if (GVAR(keyDownTabCountDistance) > 0 && {ACE_diagTime > GVAR(keyDownTimeDistance) + 0.5}) exitWith { ["clear_left"] call FUNC(showText); ["clear_right"] call FUNC(showText); diff --git a/addons/vector/initKeybinds.sqf b/addons/vector/initKeybinds.sqf index 79df40b0a2..babef0819c 100644 --- a/addons/vector/initKeybinds.sqf +++ b/addons/vector/initKeybinds.sqf @@ -1,6 +1,6 @@ // by commy2 -["ACE3 Equipment", QGVAR(AzimuthKey), localize "STR_ACE_Vector_AzimuthKey", +["ACE3 Equipment", QGVAR(AzimuthKey), localize LSTRING(AzimuthKey), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -29,7 +29,7 @@ [15, [false, false, false]], false, 0] call CBA_fnc_addKeybind; //Tab Key -["ACE3 Equipment", QGVAR(DistanceKey), localize "STR_ACE_Vector_DistanceKey", +["ACE3 Equipment", QGVAR(DistanceKey), localize LSTRING(DistanceKey), { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/vehiclelock/CfgMagazines.hpp b/addons/vehiclelock/CfgMagazines.hpp index d57e8fff6f..62c6fdcec2 100644 --- a/addons/vehiclelock/CfgMagazines.hpp +++ b/addons/vehiclelock/CfgMagazines.hpp @@ -3,7 +3,7 @@ class CfgMagazines { class ACE_key_customKeyMagazine: CA_Magazine { picture = QUOTE(PATHTOF(ui\keyBlack.paa)); displayName = "ACE Vehicle Key"; //!!!CANNOT be localized!!!: because it is used as part of the magazineDetail string - descriptionShort = "$STR_ACE_Vehicle_Item_Custom_Description"; + descriptionShort = CSTRING(Item_Custom_Description); count = 1; mass = 0; ACE_isUnique = 1; diff --git a/addons/vehiclelock/CfgVehicles.hpp b/addons/vehiclelock/CfgVehicles.hpp index 60cb67d4c4..9e6f155616 100644 --- a/addons/vehiclelock/CfgVehicles.hpp +++ b/addons/vehiclelock/CfgVehicles.hpp @@ -1,21 +1,21 @@ #define MACRO_LOCK_ACTIONS \ class ACE_SelfActions { \ class ACE_unlockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ + displayName = CSTRING(Action_UnLock); \ condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ priority = 0.3; \ icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ }; \ class ACE_lockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lock"; \ + displayName = CSTRING(Action_Lock); \ condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ priority = 0.2; \ icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ }; \ class ACE_lockpickVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ + displayName = CSTRING(Action_Lockpick); \ condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ priority = 0.1; \ @@ -24,7 +24,7 @@ class ACE_Actions { \ class ACE_MainActions { \ class ACE_unlockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ + displayName = CSTRING(Action_UnLock); \ distance = 4; \ condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ @@ -32,7 +32,7 @@ icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ }; \ class ACE_lockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lock"; \ + displayName = CSTRING(Action_Lock); \ distance = 4; \ condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ @@ -40,7 +40,7 @@ icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ }; \ class ACE_lockpickVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ + displayName = CSTRING(Action_Lockpick); \ distance = 4; \ condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ @@ -64,12 +64,13 @@ class CfgVehicles { class Logic; class Module_F: Logic { - class ModuleDescription {}; + class ModuleDescription; }; - class ACE_VehicleLock_ModuleSetup: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_Module: Module_F {}; + class ACE_VehicleLock_ModuleSetup: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_VehicleLock_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); function = QFUNC(moduleInit); scope = 2; isGlobal = 0; @@ -77,37 +78,37 @@ class CfgVehicles { functionPriority = 0; class Arguments { class LockVehicleInventory { - displayName = "$STR_ACE_VehicleLock_LockVehicleInventory_DisplayName"; - description = "$STR_ACE_VehicleLock_LockVehicleInventory_Description"; + displayName = CSTRING(LockVehicleInventory_DisplayName); + description = CSTRING(LockVehicleInventory_Description); typeName = "BOOL"; defaultValue = 0; }; class VehicleStartingLockState { - displayName = "$STR_ACE_VehicleLock_VehicleStartingLockState_DisplayName"; - description = "$STR_ACE_VehicleLock_VehicleStartingLockState_Description"; + displayName = CSTRING(VehicleStartingLockState_DisplayName); + description = CSTRING(VehicleStartingLockState_Description); typeName = "NUMBER"; class values { - class None {name = "$STR_ACE_VehicleLock_VehicleStartingLockState_AsIs"; value = 0; default = 1;}; - class Side {name = "$STR_ACE_VehicleLock_VehicleStartingLockState_Locked"; value = 1;}; - class Unique {name = "$STR_ACE_VehicleLock_VehicleStartingLockState_Unlocked"; value = 2;}; + class None {name = CSTRING(VehicleStartingLockState_AsIs); value = 0; default = 1;}; + class Side {name = CSTRING(VehicleStartingLockState_Locked); value = 1;}; + class Unique {name = CSTRING(VehicleStartingLockState_Unlocked); value = 2;}; }; }; class DefaultLockpickStrength { - displayName = "$STR_ACE_VehicleLock_DefaultLockpickStrength_DisplayName"; - description = "$STR_ACE_VehicleLock_DefaultLockpickStrength_Description"; + displayName = CSTRING(DefaultLockpickStrength_DisplayName); + description = CSTRING(DefaultLockpickStrength_Description); typeName = "NUMBER"; defaultValue = "10"; }; }; - class ModuleDescription: ModuleDescription { - description = "$STR_ACE_VehicleLock_Module_Description"; + class ModuleDescription { + description = CSTRING(Module_Description); }; }; - class ACE_VehicleLock_ModuleSyncedAssign: Module_F { - author = "$STR_ACE_Common_ACETeam"; + class ACE_VehicleLock_ModuleSyncedAssign: ACE_Module { + author = ECSTRING(common,ACETeam); category = "ACE"; - displayName = "$STR_ACE_VehicleLock_VehicleKeyAssign_Module_DisplayName"; + displayName = CSTRING(VehicleKeyAssign_Module_DisplayName); function = QFUNC(moduleSync); scope = 2; isGlobal = 0; @@ -115,8 +116,8 @@ class CfgVehicles { functionPriority = 0; class Arguments {}; class ModuleDescription: ModuleDescription { - description = "$STR_ACE_VehicleLock_VehicleKeyAssign_Module_Description"; + description = CSTRING(VehicleKeyAssign_Module_Description); sync[] = {"AnyPlayer", "AnyVehicle"}; }; }; -}; \ No newline at end of file +}; diff --git a/addons/vehiclelock/CfgWeapons.hpp b/addons/vehiclelock/CfgWeapons.hpp index 4b20de15d7..ee000e218e 100644 --- a/addons/vehiclelock/CfgWeapons.hpp +++ b/addons/vehiclelock/CfgWeapons.hpp @@ -3,9 +3,9 @@ class CfgWeapons { class ACE_ItemCore; class ACE_key_master: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); displayName = "Vehicle Key: Master"; - descriptionShort = "$STR_ACE_Vehicle_Item_Master_Description"; + descriptionShort = CSTRING(Item_Master_Description); model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = QUOTE(PATHTOF(ui\keyBlack.paa)); scope = 2; @@ -15,27 +15,27 @@ class CfgWeapons { }; class ACE_key_lockpick: ACE_key_master { displayName = "Lockpick"; - descriptionShort = "$STR_ACE_Vehicle_Item_Lockpick_Description"; + descriptionShort = CSTRING(Item_Lockpick_Description); picture = QUOTE(PATHTOF(ui\lockpick.paa)); }; class ACE_key_west: ACE_key_master { displayName = "Vehicle Key: West"; - descriptionShort = "$STR_ACE_Vehicle_Item_West_Description"; + descriptionShort = CSTRING(Item_West_Description); picture = QUOTE(PATHTOF(ui\keyBlue.paa)); }; class ACE_key_east: ACE_key_master { displayName = "Vehicle Key: East"; - descriptionShort = "$STR_ACE_Vehicle_Item_East_Description"; + descriptionShort = CSTRING(Item_East_Description); picture = QUOTE(PATHTOF(ui\keyRed.paa)); }; class ACE_key_indp: ACE_key_master { displayName = "Vehicle Key: Independent"; - descriptionShort = "$STR_ACE_Vehicle_Item_Indp_Description"; + descriptionShort = CSTRING(Item_Indp_Description); picture = QUOTE(PATHTOF(ui\keyPurple.paa)); }; class ACE_key_civ: ACE_key_master { displayName = "Vehicle Key: Civilian"; - descriptionShort = "$STR_ACE_Vehicle_Item_Civ_Description"; + descriptionShort = CSTRING(Item_Civ_Description); picture = QUOTE(PATHTOF(ui\keyGreen.paa)); }; }; diff --git a/addons/vehiclelock/functions/fnc_lockpick.sqf b/addons/vehiclelock/functions/fnc_lockpick.sqf index fc7fecc693..613a7b35dc 100644 --- a/addons/vehiclelock/functions/fnc_lockpick.sqf +++ b/addons/vehiclelock/functions/fnc_lockpick.sqf @@ -54,7 +54,7 @@ case (_funcType == "canLockpick"): { _returnValue = true; }; case (_funcType == "startLockpick"): { - [_vehLockpickStrenth, [_unit, _veh, "finishLockpick"], {(_this select 0) call FUNC(lockpick)}, {}, (localize "STR_ACE_Vehicle_Action_LockpickInUse"), _condition] call EFUNC(common,progressBar); + [_vehLockpickStrenth, [_unit, _veh, "finishLockpick"], {(_this select 0) call FUNC(lockpick)}, {}, (localize LSTRING(Action_LockpickInUse)), _condition] call EFUNC(common,progressBar); _returnValue = true; }; case (_funcType == "finishLockpick"): { diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 4738d045df..89a64faf8a 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -1,7 +1,7 @@  - + Unlock Vehicle Fahrzeug aufschließen Abrir vehículo @@ -13,7 +13,7 @@ Sblocca il veicolo Destravar veículo - + Lock Vehicle Fahrzeug abschließen Cerrar vehículo @@ -25,7 +25,7 @@ Chiudi il veicolo a chiave Travar Veículo - + Lockpick Vehicle Fahrzeug knacken Forzar vehículo @@ -37,7 +37,7 @@ Scassina veicolo Usar mixa no Veículo - + Picking Lock.... Schloss knacken... Forzando cerradura... @@ -49,7 +49,7 @@ Scassino il veicolo.... Usando Mixa... - + A custom key that will open a specific vehicle. Ein Schlüssel der ein bestimmtes Fahrzeug aufschließt. Una llave concreta abrirá un vehículo concreto. @@ -61,7 +61,7 @@ Una chiave personalizzata che apre determinati veicoli. Uma chave específica que abre um veículo específico. - + A Master Key will open any lock, no matter what! Ein Generalschlüssel der jedes Schloss öffnet... Una llave maestra abrirá cualquier cierre, no importa cual! @@ -73,7 +73,7 @@ Un passe-partout che apre qualsiasi serratura! Uma chave mestre irá abrir qualquer fechadura, não importa qual! - + A lockpick set that can pick the locks of most vehicles. Ein Dietrich der die meisten Fahrzeugschlösser knacken kann... Un set de ganzúas que puede abrir las cerraduras de la mayoría vehículos. @@ -85,7 +85,7 @@ Un grimardello per forzare la maggior parte dei veicoli Um set de chave mixas que pode abrir a maioria dos veículos. - + A key that should open most WEST vehicles. Ein Schlüssel der die meisten westlichen Fahrzeuge öffnen sollte... Una llave que abrirá la mayoría de vehículos occidentales. @@ -97,7 +97,7 @@ Una chiave che apre la maggior parte dei veicoli occidentali Uma chave que abre a maioria dos veículos ocidentais - + A key that should open most EAST vehicle. Ein Schlüssel der die meisten östlichen Fahrzeuge öffnen sollte... Una llave que abrirá la mayoría de vehículos orientales. @@ -109,7 +109,7 @@ Una chaive che apre la maggior parte dei veicoli orientali Uma chave que abre a maioria dos veículos orientais - + A key that should open most INDEP vehicle. Ein Schlüssel der die meisten Fahrzeuge der Aufständischen öffnen sollte... Una llave que abrirá la mayoría de vehículos independientes. @@ -121,7 +121,7 @@ Una chaive che apre la maggior parte dei veicoli degli indipendenti Uma chave que abre a maioria dos veículos independentes - + A key that should open most CIV vehicle. Ein Schlüssel der die meisten zivilen Fahrzeuge öffnen sollte... Una llave que abrirá la mayoría de vehículos civiles. @@ -136,54 +136,106 @@ Vehicle Lock Setup Ustawienie blokady pojazdów + Configuración del cierre del vehiculo + Fahrzeugsperreinstellungen + Nastavení zámku vozidla + Configuração de fechadura do veículo Lock Vehicle Inventory Zablokuj ekwipunek pojazdu + Bloquear inventario del vehículo + Sperre Fahrzeuginventar + Inventář zamčeného vozidla + Bloquear inventário do veículo Locks the inventory of locked vehicles Blokuje dostęp do ekwipunku pojazdu + Bloquea el inventario de los vehículos cerrados + Sperrt das Inventar von gesperrten Fahrzeugen + Zamknout inventář u zamčených vozidel + Bloqueia o inventário de veículos fechados Vehicle Starting Lock State Początkowy stan blok. poj. + Estado inicial del cierre en vehículos + Fahrzeuge spawnen gesperrt + Počáteční stav zámku vozidla + Estado inicial da fechadura dos veículos Set lock state for all vehicles (removes ambiguous lock states) Ustawia początkowy stan blokady dla wszystkich pojazdów (usuwa dwuznaczne stany blokady) + Establece el estado de cierre para todos los vehículos (elimina estados de cierre ambiguos) + Setze Sperrstatus für alle Fahrzeuge (entfernt unklare Sperrzustände) + Nastavit stav zámku u všech vozidel (odstraňuje nejednoznačné stavy zámků) + Definir estados de fechadura para todos os veículos (remove estados de fechadura ambíguos) As Is Jak jest + Está + Unverändert + Jak je + Como está Locked Zablokowany + Cerrado + Gesperrt + Zamčeno + Fechado Unlocked Odblokowany + Abierto + Offen + Odemčeno + Aberto Default Lockpick Strength Czas włamywania + Durabilidad de la ganzua por defecto + Standard-Pick-Stärke + Výchozí síla páčidla + Durabilidade padrão da chave micha Default Time to lockpick (in seconds). Default: 10 Domyślny czas potrzebny na otwarcie pojazdu (w sekundach). Domyślnie: 10 + Tiempo por defecto para forzar cerradura (en segundos). Por defecto: 10 + Standardzeit um ein Schloss zu knacken (in Sekunden). Standard: 10 + Čas k vypáčení zámku (v sekundách). Výchozí: 10 + Tempo padrão para forçar a fechadura (em segundos). Padrão: 10 Settings for lockpick strength and initial vehicle lock state. Removes ambiguous lock states.<br />Source: vehiclelock.pbo Ustawienia czasu włamywania oraz domyślnego stanu blokady pojazdów. Wyłącza dwuznaczne ustawienia blokady. Moduł ten umożliwia więc np. zamknięcie pojazdów przeciwnika na klucz tak, że gracze bez odpowiedniego sprzętu (wytrycha) nie będą mogli ich używać.<br />Źródło: vehiclelock.pbo + Ajustes de la durabilidad de la ganzua y el estado inicial del cierre de los vehículos. Elimina estados de cierre ambiguos.<br />Fuente: vehiclelock.pbo + Einstellungen für Pick-Stärke und anfänglichen Fahrzeugsperrzustand. Entfernt unklare Sperrzustände.<br />Quelle: vehiclelock.pbo + Nastavení síly vypáčení a počáteční stav zámku vozidla. Odstraňuje nejednoznačné stavy zámků.<br />Zdroj: vehiclelock.pbo + Definições para a durabilidade da chave micha e estado inicial da fechadura do veículo. Remove estados de fechadura ambíguas <br /> Fonte: Vehiclelock.pbo Vehicle Key Assign Przydział kluczyka do pojazdu + Asignacion de la llave del vehículo + Fahrzeugschlüsselzuweisung + Přidělení klíče k vozidlu + Atribuição de chave de veículo Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Only valid for objects present at mission start.<br />Source: vehiclelock.pbo Zsynchronizuj z pojazdami i graczami. Rozda klucze dla graczy dla każdego zsynchronizowanego pojazdu. Działa tylko na pojazdy obecne na misji od samego początku (postawione w edytorze).<br />Źródło: vehiclelock.pbo + Sincronizar con vehiculos y jugadores. Distribuirá llaves personalizadas a los jugadores para todos los vehículos sincronizados. Solo valido para objetos presentes al inicio de la mision.<br />Fuente: vehiclelock.pbo + Synchronisiere mit Fahrzeugen und Spielern. Wird eigene Schlüssel an Spieler für jedes synchronisierte Fahrzeuge aushändigen. Nur gültig für am Missionsstart existierende Fahrzeuge.<br />Quelle: vehiclelock.pbo + Synchronizuj s vozidly a hráči. Hráč dostane klíč ke každému synchonizovanému vozidlu. Platné pouze pro objekty přítomné na začátku mise.<br />Zdroj: vehiclelock.pbo + Sincronizar com veículos e jogadores. Irá distribuir chaves personalizadas para os jogadores para cada veículo sincronizado. Só é válido para objetos presentes no início da missão <br /> Fonte: vehiclelock.pbo - + \ No newline at end of file diff --git a/addons/vehicles/XEH_postInit.sqf b/addons/vehicles/XEH_postInit.sqf index 6ff723338b..253f5eab39 100644 --- a/addons/vehicles/XEH_postInit.sqf +++ b/addons/vehicles/XEH_postInit.sqf @@ -4,7 +4,7 @@ if !(hasInterface) exitWith {}; // Add keybinds -["ACE3 Vehicles", QGVAR(speedLimiter), localize "STR_ACE_SpeedLimiter", +["ACE3 Vehicles", QGVAR(speedLimiter), localize LSTRING(SpeedLimiter), { // Conditions: canInteract if !([ACE_player, objNull, ["isnotinside"]] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/vehicles/functions/fnc_speedLimiter.sqf b/addons/vehicles/functions/fnc_speedLimiter.sqf index 053d96d470..7ddb07433a 100644 --- a/addons/vehicles/functions/fnc_speedLimiter.sqf +++ b/addons/vehicles/functions/fnc_speedLimiter.sqf @@ -7,12 +7,12 @@ _driver = _this select 0; _vehicle = _this select 1; if (GETGVAR(isSpeedLimiter,false)) exitWith { - [localize "STR_ACE_SpeedLimiter_Off"] call EFUNC(common,displayTextStructured); + [localize LSTRING(Off)] call EFUNC(common,displayTextStructured); playSound "ACE_Sound_Click"; GVAR(isSpeedLimiter) = false; }; -[localize "STR_ACE_SpeedLimiter_On"] call EFUNC(common,displayTextStructured); +[localize LSTRING(On)] call EFUNC(common,displayTextStructured); playSound "ACE_Sound_Click"; GVAR(isSpeedLimiter) = true; diff --git a/addons/vehicles/functions/fnc_startEngine.sqf b/addons/vehicles/functions/fnc_startEngine.sqf index 44adb9ed06..63afd78e2e 100644 --- a/addons/vehicles/functions/fnc_startEngine.sqf +++ b/addons/vehicles/functions/fnc_startEngine.sqf @@ -15,11 +15,11 @@ if (!_isEngineOn || {floor abs speed _vehicle > 0}) exitWith {}; _time = _this select 0 select 1; _direction = _this select 0 select 2; - if (time > _time) exitWith { + if (ACE_time > _time) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; _vehicle setVelocity [0, 0, 0]; _vehicle setVectorDirAndUp _direction; -} , 0, [_vehicle, time + STARTUP_DELAY, [vectorDir _vehicle, vectorUp _vehicle]]] call CBA_fnc_addPerFrameHandler; +} , 0, [_vehicle, ACE_time + STARTUP_DELAY, [vectorDir _vehicle, vectorUp _vehicle]]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index 603f2563dc..e1002bc154 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -1,7 +1,7 @@  - + Speed Limiter on Begrenzer an Limitador de velocidad activado @@ -13,7 +13,7 @@ Limitador de Velocidade Ativo Limitatore Attivo - + Speed Limiter off Begrenzer aus Limitador de velocidad desactivado @@ -25,7 +25,7 @@ Limitador de Velocidade Desativado Limitatore Non Attivo - + Speed Limiter Begrenzer Limitador de velocidad diff --git a/addons/viewdistance/ACE_Settings.hpp b/addons/viewdistance/ACE_Settings.hpp index a3460cddf3..28ed7471ca 100644 --- a/addons/viewdistance/ACE_Settings.hpp +++ b/addons/viewdistance/ACE_Settings.hpp @@ -2,47 +2,45 @@ class ACE_Settings { class GVAR(enabled) { typeName = "BOOL"; value = 1; - displayName = "Enable ACE viewdistance"; - description = "Enables ACE viewdistance module."; + displayName = CSTRING(enabled_DisplayName); + description = CSTRING(enabled_Description); }; class GVAR(viewDistanceOnFoot) { typeName = "SCALAR"; isClientSettable = 1; - value = 11; // index, NOT value // Can set it to client's actual viewdistance in the init function once ACE_Settings supports numbers (if ever). - values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf - displayName = "Client View Distance (On Foot)"; - description = "Changes in game view distance when the player is on foot."; + value = 0; // index, NOT value // Can set it to client's actual viewdistance in the init function once ACE_Settings supports numbers (if ever). + values[] = {CSTRING(videosettings),"500","1000","1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf + displayName = CSTRING(onFoot_DisplayName); + description = CSTRING(onFoot_Description); }; class GVAR(viewDistanceLandVehicle) { typeName = "SCALAR"; isClientSettable = 1; - value = 11; // index, NOT value - values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf - displayName = "Client View Distance (Land Vehicle)"; - description = "Changes in game view distance when the player is in a land vehicle."; + value = 0; // index, NOT value + values[] = {CSTRING(videosettings),"500","1000","1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf + displayName = CSTRING(landVehicle_DisplayName); + description = CSTRING(landVehicle_Description); }; class GVAR(viewDistanceAirVehicle) { typeName = "SCALAR"; isClientSettable = 1; - value = 11; // index, NOT value - values[] = {"1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf - displayName = "Client View Distance (Air Vehicle)"; - description = "Changes in game view distance when the player is in an air vehicle."; + value = 0; // index, NOT value + values[] = {CSTRING(videosettings),"500","1000","1500","2000","2500","3000","3500","4000","5000","6000","7000","8000","9000","10000"}; // Values also need to be changed in functions/fnc_returnValue.sqf + displayName = CSTRING(airVehicle_DisplayName); + description = CSTRING(airVehicle_Description); }; class GVAR(limitViewDistance) { typeName = "SCALAR"; value = 10000; // Value, NOT index. 10000 is the maximum in A3 - displayName = "View Distance Limit"; - description = "Limit for client's view distance set here and can overridden by module"; + displayName = CSTRING(limit_DisplayName); + description = CSTRING(limit_setting); }; class GVAR(objectViewDistanceCoeff) { typeName = "SCALAR"; isClientSettable = 1; value = 0; // index. Actual coefficient is given by functions/fnc_returnObjectCoeff.sqf - values[] = {"Off","Very Low","Low","Medium","High","Very High"}; - displayName = "Dynamic Object View Distance"; - description = "Sets the object view distance as a coefficient of the view distance."; + values[] = {CSTRING(object_off),CSTRING(object_verylow),CSTRING(object_low),CSTRING(object_medium),CSTRING(object_high),CSTRING(object_veryhigh)}; + displayName = CSTRING(object_DisplayName); + description = CSTRING(object_Description); }; }; - -// To do: include string table style displayName & description. \ No newline at end of file diff --git a/addons/viewdistance/CfgVehicles.hpp b/addons/viewdistance/CfgVehicles.hpp index 63a50cf099..8e4e30d266 100644 --- a/addons/viewdistance/CfgVehicles.hpp +++ b/addons/viewdistance/CfgVehicles.hpp @@ -1,26 +1,30 @@ class CfgVehicles { class ACE_Module; class GVAR(ModuleSettings) : ACE_Module { - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); category = "ACE"; function = QUOTE(DFUNC(initModule)); - displayName = "View Distance Limiter"; + displayName = CSTRING(Module_DisplayName); scope = 2; isGlobal = 1; //icon = ""; // needs an icon class Arguments { class moduleViewDistanceEnabled { - displayName = "Enable ACE viewdistance"; - description = "Enables ACE viewdistance"; + displayName = CSTRING(enabled_DisplayName); + description = CSTRING(enabled_Description); typeName = "BOOL"; defaultValue = 1; }; class moduleViewDistanceLimit { - displayName = "View Distance Limit"; - description = "Sets the limit for how high clients can raise their view distance (<= 10000)"; + displayName = CSTRING(limit_DisplayName); + description = CSTRING(limit_Description); typeName = "NUMBER"; defaultValue = 10000; }; }; + class ModuleDescription { + description = CSTRING(Module_Description); + sync[] = {}; + }; }; }; \ No newline at end of file diff --git a/addons/viewdistance/functions/fnc_changeViewDistance.sqf b/addons/viewdistance/functions/fnc_changeViewDistance.sqf index 7c70a612eb..9060254c60 100644 --- a/addons/viewdistance/functions/fnc_changeViewDistance.sqf +++ b/addons/viewdistance/functions/fnc_changeViewDistance.sqf @@ -26,21 +26,21 @@ _new_view_distance = [_index_requested] call FUNC(returnValue); // changes the s _object_view_distance_coeff = [GVAR(objectViewDistanceCoeff)] call FUNC(returnObjectCoeff); // changes the setting index into a coefficient. _view_distance_limit = GVAR(limitViewDistance); // Grab the limit -if (_show_prompt) then { - _text = if (_new_view_distance <= _view_distance_limit) then { - format ["View Distance: %1m",str(_new_view_distance)]; - } else { - format ["That option is invalid! The limit is %1m",str(_view_distance_limit)]; - }; - - if (GVAR(objectViewDistanceCoeff) > 0) then { - _text = _text + format ["
Object View Distance is %1%2",str(_object_view_distance_coeff * 100),"%"]; - }; - [parseText _text,2] call EFUNC(common,displayTextStructured); -}; - setViewDistance (_new_view_distance min _view_distance_limit); if (_object_view_distance_coeff > 0) then { - setObjectViewDistance (_object_view_distance_coeff * _new_view_distance); + setObjectViewDistance (_object_view_distance_coeff * viewDistance); +}; + +if (_show_prompt) then { + _text = if (_new_view_distance <= _view_distance_limit) then { + format ["%1 %2m", (localize "STR_ACE_ViewDistance_infotext"), str(viewDistance)]; + } else { + format ["%1 %2m", (localize "STR_ACE_ViewDistance_invalid"), str(viewDistance)]; + }; + + if (GVAR(objectViewDistanceCoeff) > 0) then { + _text = _text + format ["
%1 %2%3", (localize "STR_ACE_ViewDistance_objectinfotext"), str(_object_view_distance_coeff * 100),"%"]; + }; + [parseText _text,2] call EFUNC(common,displayTextStructured); }; diff --git a/addons/viewdistance/functions/fnc_returnValue.sqf b/addons/viewdistance/functions/fnc_returnValue.sqf index 9d4725c72e..fb449cf702 100644 --- a/addons/viewdistance/functions/fnc_returnValue.sqf +++ b/addons/viewdistance/functions/fnc_returnValue.sqf @@ -1,7 +1,7 @@ /* * Author: Winter * Returns the view distance value according to the given index - * + * * * Arguments: * 0: View Distance Index @@ -22,18 +22,21 @@ PARAMS_1(_index); private ["_return"]; _return = switch (_index) do { - case 0: {1500}; - case 1: {2000}; - case 2: {2500}; - case 3: {3000}; - case 4: {3500}; - case 5: {4000}; - case 6: {5000}; - case 7: {6000}; - case 8: {7000}; - case 9: {8000}; - case 10: {9000}; - case 11: {10000}; + case 0: {-1}; + case 1: {500}; + case 2: {1000}; + case 3: {1500}; + case 4: {2000}; + case 5: {2500}; + case 6: {3000}; + case 7: {3500}; + case 8: {4000}; + case 9: {5000}; + case 10: {6000}; + case 11: {7000}; + case 12: {8000}; + case 13: {9000}; + case 14: {10000}; default {1000}; }; diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml new file mode 100644 index 0000000000..b8de5321c2 --- /dev/null +++ b/addons/viewdistance/stringtable.xml @@ -0,0 +1,180 @@ + + + + + View Distance Limiter + Ogranicznik zasięgu widzenia + Limitador de distancia de visión + Omezovač dohlednosti + Limitador de distância de visão + + + Allows limiting maximum view distance that can be set by players. + Pozwala ustawić maksymalny limit zasięgu widzenia. + Permite limitar la distancia máxima de visión que se puede establecer por los jugadores. + Umožňuje určit maximální dohlednost, kterou si může hráč nastavit + Permite limitar a distância máxima de visão que pode ser definida pelos jogadores. + + + Enable ACE viewdistance + Wł. zasięg widzenia ACE + Habilitar distancia de visión ACE + Povolit ACE dohlednost + Habilitar distância de visão ACE + + + Enables ACE viewdistance + Aktywuje możliwość zmiany zasięgu widzenia w menu ustawień ACE + Habilita la distancia de visión ACE + Povolit ACE dohlednost + Habilita a distância de visão ACE + + + View Distance Limit + Limit zas. widzenia + Limite de distancia de visión + Limit dohlednosti + Limite da distância de visão + + + Sets the limit for how high clients can raise their view distance (up to 10000) + Ustawia maksymalny limit zasięgu widzenia jaki mogą ustawić gracze (do 10000) + Establece el límite de cuan alta pueden aumentar los clientes la distancia de visión (hasta 10.000) + Stanoví limit jak daleko si může client zvýšit dohlednost (do 10000) + Estabelecer um limite de quão alto os clientes podem aumentar sua distância de visão (até 10000) + + + Limit for client's view distance set here and can overridden by module + Limit zasięgu widzenia jest ustawiany tutaj i może zostać nadpisany poprzez moduł + Establecer aqui el límite para la distancia de visión de los clientes. Puede ser anulado por módulo + Limit dohlednoti pro klienty se nastavuje zde a může být potlačeno pomocí modulu. + Permite limitar a distância de visão máxima que pode ser definida por jogadores. Pode ser substituído por módulo. + + + Client View Distance (On Foot) + Zasięg widzenia (piechota) + Distancia de visión del cliente (A pie) + Dohlednost (Pěšák) + Distância de visão do cliente (A pé) + + + Changes in game view distance when the player is on foot. + Zmienia zasięg widzenia kiedy gracz porusza się na piechotę. + Cambia en juego la distancia de visión cuando el jugador va a pie. + Změna dohlednosti pro hráče pokud jde po svých. + Muda a distância de visão do jogador dentro do jogo quando ele está a pé. + + + Client View Distance (Land Vehicle) + Zasięg widzenia (pojazdy naziemne) + Distancia de visión del cliente (Vehículo terrestre) + Dohlednost (Pozemní technika) + Distância de visão do cliente (Veículo terrestre) + + + Changes in game view distance when the player is in a land vehicle. + Zmienia zasięg widzenia kiedy gracz porusza się pojazdami naziemnymi. + Cambia en juego la distancia de visión cuando el jugador va en un vehículo terrestre. + Změna dohlednosti pro hráče pokud je v pozemní technice. + Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo terrestre. + + + Client View Distance (Air Vehicle) + Zasięg widzenia (pojazdy lotnicze) + Distancia de visión del cliente (Vehículo aéreo) + Dohlednost (Vzdušná technika) + Distância de visão do cliente (Veículo aéreo) + + + Changes in game view distance when the player is in an air vehicle. + Zmienia zasięg widzenia kiedy gracz porusza się pojazdami lotniczymi. + Cambia en juego la distancia de visión cuando el jugador va en un vehículo aéreo. + Změna dohlednosti pro hráče pokud je ve vzdušné technice. + Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo aéreo. + + + Dynamic Object View Distance + Dynamiczny zasięg rysowania obiektów + Distancia de visión dinámica de objetos + Dynamická dohlednost objektů + Distância de visão dinâmica dos objetos + + + Sets the object view distance as a coefficient of the view distance. + Zmienia zasięg rysowania obiektów jako mnożnik zasięgu widzenia. + Establece la distancia de visión de objetos como un coeficiente de la distancia de visión. + Nastaví objekt dohlednosti jako koeficient dohlednosti. + Estabelece a distância de visão dos objetos com um coeficiente da distância de visão. + + + Off + Wyłącz + Apagada + Vypnout + Desligado + + + Very Low + Bardzo niski + Muy baja + Velmi málo + Muito baixo + + + Low + Niski + Baja + Málo + Baixo + + + Medium + Średni + Media + Středně + Médio + + + High + Wysoki + Alta + Hodně + Alto + + + Very High + Bardzo wysoki + Muy alta + Velmi hodně + Muito alto + + + View Distance: + Zasięg widzenia: + Distancia de visión: + Dohlednost: + Distância de visão: + + + Object View Distance is + Zasięg widzenia obiektów wynosi + La distancia de visión de objetos es: + Dohlednost objektů je + Distância de visão do objeto é + + + That option is invalid! The limit is + Ta opcja jest nieprawidłowa! Limit wynosi + Esta opción no es valida! El limite es + Tato volba je neplatná! Limit je + Essa opção é inválida. O limte é + + + Video Settings + Ustawienia wideo + Ajustes de vídeo + Nastavení videa + Ajustes de vídeo + + + \ No newline at end of file diff --git a/addons/weaponselect/ACE_Settings.hpp b/addons/weaponselect/ACE_Settings.hpp index 34fdc809ea..7b60527449 100644 --- a/addons/weaponselect/ACE_Settings.hpp +++ b/addons/weaponselect/ACE_Settings.hpp @@ -3,7 +3,7 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; value = 1; - displayName = "$STR_ACE_Weaponselect_SettingDisplayTextName"; - description = "$STR_ACE_Weaponselect_SettingDisplayTextDesc"; + displayName = CSTRING(SettingDisplayTextName); + description = CSTRING(SettingDisplayTextDesc); }; }; diff --git a/addons/weaponselect/XEH_postInit.sqf b/addons/weaponselect/XEH_postInit.sqf index d4fd02122f..dfb70f4f71 100644 --- a/addons/weaponselect/XEH_postInit.sqf +++ b/addons/weaponselect/XEH_postInit.sqf @@ -4,7 +4,7 @@ if !(hasInterface) exitWith {}; // Add keybinds -["ACE3 Weapons", QGVAR(SelectPistolNew), localize "STR_ACE_WeaponSelect_SelectPistol", +["ACE3 Weapons", QGVAR(SelectPistolNew), localize LSTRING(SelectPistol), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -18,7 +18,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 1 Key) -["ACE3 Weapons", QGVAR(SelectRifleNew), localize "STR_ACE_WeaponSelect_SelectRifle", +["ACE3 Weapons", QGVAR(SelectRifleNew), localize LSTRING(SelectRifle), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -32,7 +32,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 2 Key) -["ACE3 Weapons", QGVAR(SelectRifleMuzzleNew), localize "STR_ACE_WeaponSelect_SelectRifleMuzzle", +["ACE3 Weapons", QGVAR(SelectRifleMuzzleNew), localize LSTRING(SelectRifleMuzzle), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -46,7 +46,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 3 Key) -["ACE3 Weapons", QGVAR(SelectLauncherNew), localize "STR_ACE_WeaponSelect_SelectLauncher", +["ACE3 Weapons", QGVAR(SelectLauncherNew), localize LSTRING(SelectLauncher), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -60,7 +60,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 4 Key) -["ACE3 Weapons", QGVAR(SelectBinocularNew), localize "STR_ACE_WeaponSelect_SelectBinocular", +["ACE3 Weapons", QGVAR(SelectBinocularNew), localize LSTRING(SelectBinocular), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -74,7 +74,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 5 Key) -["ACE3 Weapons", QGVAR(SelectGrenadeFrag), localize "STR_ACE_WeaponSelect_SelectGrenadeFrag", +["ACE3 Weapons", QGVAR(SelectGrenadeFrag), localize LSTRING(SelectGrenadeFrag), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -88,7 +88,7 @@ if !(hasInterface) exitWith {}; {false}, [7, [false, false, false]], false] call cba_fnc_addKeybind; //6 Key -["ACE3 Weapons", QGVAR(SelectGrenadeOther), localize "STR_ACE_WeaponSelect_SelectGrenadeOther", +["ACE3 Weapons", QGVAR(SelectGrenadeOther), localize LSTRING(SelectGrenadeOther), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -102,7 +102,7 @@ if !(hasInterface) exitWith {}; {false}, [8, [false, false, false]], false] call cba_fnc_addKeybind; //7 Key -["ACE3 Weapons", QGVAR(HolsterWeapon), localize "STR_ACE_WeaponSelect_HolsterWeapon", +["ACE3 Weapons", QGVAR(HolsterWeapon), localize LSTRING(HolsterWeapon), { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -110,13 +110,24 @@ if !(hasInterface) exitWith {}; if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; // Statement - [ACE_player] call FUNC(putWeaponAway); + if ((currentWeapon ACE_player) != "") then { + [ACE_player] call FUNC(putWeaponAway); + } else { + private ["_weapon"]; + _weapon = switch (true) do { + case ((primaryWeapon ACE_player) != ""): {primaryWeapon ACE_player}; + case ((handgunWeapon ACE_player) != ""): {handgunWeapon ACE_player}; + case ((secondaryWeapon ACE_player) != ""): {secondaryWeapon ACE_player}; + default {""}; + }; + if (_weapon != "") then {ACE_player selectWeapon _weapon}; + }; true }, {false}, [11, [false, false, false]], false] call cba_fnc_addKeybind; //0 Key -["ACE3 Vehicles", QGVAR(EngineOn), localize "STR_ACE_WeaponSelect_EngineOn", +["ACE3 Vehicles", QGVAR(EngineOn), localize LSTRING(EngineOn), { // Conditions: canInteract if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -130,7 +141,7 @@ if !(hasInterface) exitWith {}; {false}, [3, [false, false, false]], false] call cba_fnc_addKeybind; //2 Key -["ACE3 Vehicles", QGVAR(EngineOff), localize "STR_ACE_WeaponSelect_EngineOff", +["ACE3 Vehicles", QGVAR(EngineOff), localize LSTRING(EngineOff), { // Conditions: canInteract if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -144,7 +155,7 @@ if !(hasInterface) exitWith {}; {false}, [2, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key -["ACE3 Vehicles", QGVAR(SelectMainGunNew), localize "STR_ACE_WeaponSelect_SelectMainGun", +["ACE3 Vehicles", QGVAR(SelectMainGunNew), localize LSTRING(SelectMainGun), { // Conditions: canInteract if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -158,7 +169,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 3 Key) -["ACE3 Vehicles", QGVAR(SelectMachineGunNew), localize "STR_ACE_WeaponSelect_SelectMachineGun", +["ACE3 Vehicles", QGVAR(SelectMachineGunNew), localize LSTRING(SelectMachineGun), { // Conditions: canInteract if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -172,7 +183,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 4 Key) -["ACE3 Vehicles", QGVAR(SelectMissilesNew), localize "STR_ACE_WeaponSelect_SelectMissiles", +["ACE3 Vehicles", QGVAR(SelectMissilesNew), localize LSTRING(SelectMissiles), { // Conditions: canInteract if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -186,7 +197,7 @@ if !(hasInterface) exitWith {}; {false}, [0, [false, false, false]], false] call cba_fnc_addKeybind; //Unbound (was 5 Key) -["ACE3 Vehicles", QGVAR(FireSmokeLauncher), localize "STR_ACE_WeaponSelect_FireSmokeLauncher", +["ACE3 Vehicles", QGVAR(FireSmokeLauncher), localize LSTRING(FireSmokeLauncher), { // Conditions: canInteract if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf b/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf index a75a11c202..69ea5cdf99 100644 --- a/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf +++ b/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf @@ -37,7 +37,7 @@ if (_nextMuzzle != "") then { GVAR(CurrentGrenadeMuzzleFrag) = ""; GVAR(CurrentGrenadeMuzzleOther) = ""; if (GVAR(DisplayText)) then { - _text = [localize "STR_ACE_WeaponSelect_NoGrenadesLeft", [1,0,0]] call EFUNC(common,stringToColoredText); + _text = [localize LSTRING(NoGrenadesLeft), [1,0,0]] call EFUNC(common,stringToColoredText); [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); }; }; diff --git a/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf b/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf index 0dee3e5c57..91d0023e47 100644 --- a/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf +++ b/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf @@ -36,7 +36,7 @@ if (_nextMuzzle != "") then { // There is a no muzzle with magazines --> select nothing GVAR(CurrentGrenadeMuzzleFrag) = ""; if (GVAR(DisplayText)) then { - _text = [localize "STR_ACE_WeaponSelect_NoFragsLeft", [1,0,0]] call EFUNC(common,stringToColoredText); + _text = [localize LSTRING(NoFragsLeft), [1,0,0]] call EFUNC(common,stringToColoredText); [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); }; }; diff --git a/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf b/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf index 4ab65e5bf3..28cc0e74d8 100644 --- a/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf +++ b/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf @@ -36,7 +36,7 @@ if (_nextMuzzle != "") then { // There is a no muzzle with magazines --> select nothing GVAR(CurrentGrenadeMuzzleOther) = ""; if (GVAR(DisplayText)) then { - _text = [localize "STR_ACE_WeaponSelect_NoMiscGrenadeLeft", [1,0,0]] call EFUNC(common,stringToColoredText); + _text = [localize LSTRING(NoMiscGrenadeLeft), [1,0,0]] call EFUNC(common,stringToColoredText); [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); }; }; diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 810fda21c9..ea76984097 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -1,7 +1,7 @@  - + Display text on grenade throw Zeige Text beim Granatwurf Mostrar texto al lanzar una granada @@ -13,7 +13,7 @@ Mostra indicazioni nel lancio granate Mostrat texto ao lançar granada - + Display a hint or text on grenade throw. Zeige Hinweis oder Text beim Granatwurf Muestra una notificación o texto al lanzar una granada diff --git a/addons/weather/CfgVehicles.hpp b/addons/weather/CfgVehicles.hpp index d2b5bddcba..ebdd65c30d 100644 --- a/addons/weather/CfgVehicles.hpp +++ b/addons/weather/CfgVehicles.hpp @@ -2,54 +2,54 @@ class CfgVehicles { class ACE_Module; class GVAR(ModuleSettings): ACE_Module { scope = 2; - displayName = "$STR_ACE_Weather_Module_DisplayName"; + displayName = CSTRING(Module_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Wind_ca.paa)); category = "ACE"; function = QUOTE(DFUNC(initModuleSettings)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class enableServerController { - displayName = "$STR_ACE_Weather_enableServerController_DisplayName"; - description = "$STR_ACE_Weather_enableServerController_Description"; + displayName = CSTRING(enableServerController_DisplayName); + description = CSTRING(enableServerController_Description); typeName = "BOOL"; defaultValue = 1; }; class useACEWeather { - displayName = "$STR_ACE_Weather_useACEWeather_DisplayName"; - description = "$STR_ACE_Weather_useACEWeather_Description"; + displayName = CSTRING(useACEWeather_DisplayName); + description = CSTRING(useACEWeather_Description); typeName = "BOOL"; defaultValue = 1; }; class syncRain { - displayName = "$STR_ACE_Weather_syncRain_DisplayName"; - description = "$STR_ACE_Weather_syncRain_Description"; + displayName = CSTRING(syncRain_DisplayName); + description = CSTRING(syncRain_Description); typeName = "BOOL"; defaultValue = 1; }; class syncWind { - displayName = "$STR_ACE_Weather_syncWind_DisplayName"; - description = "$STR_ACE_Weather_syncWind_Description"; + displayName = CSTRING(syncWind_DisplayName); + description = CSTRING(syncWind_Description); typeName = "BOOL"; defaultValue = 1; }; class syncMisc { - displayName = "$STR_ACE_Weather_syncMisc_DisplayName"; - description = "$STR_ACE_Weather_syncMisc_Description"; + displayName = CSTRING(syncMisc_DisplayName); + description = CSTRING(syncMisc_Description); typeName = "BOOL"; defaultValue = 1; }; class serverUpdateInterval { - displayName = "$STR_ACE_Weather_serverUpdateInterval_DisplayName"; - description = "$STR_ACE_Weather_serverUpdateInterval_Description"; + displayName = CSTRING(serverUpdateInterval_DisplayName); + description = CSTRING(serverUpdateInterval_Description); typeName = "NUMBER"; defaultValue = 60; }; }; class ModuleDescription { - description = "$STR_ACE_Weather_Module_Description"; + description = CSTRING(Module_Description); }; }; }; \ No newline at end of file diff --git a/addons/weather/README.md b/addons/weather/README.md index c5b210c70d..a2b719fc11 100644 --- a/addons/weather/README.md +++ b/addons/weather/README.md @@ -1,8 +1,8 @@ ace_weather =========== -Fixes weather synchronisation across clients. - +This module simulates realistic weather effects, according to the geographical location of the map, the date and time. +It also ensures that all players experience the same weather effects. ## Maintainers diff --git a/addons/weather/XEH_postInit.sqf b/addons/weather/XEH_postInit.sqf index 455c336d96..c6f779358f 100644 --- a/addons/weather/XEH_postInit.sqf +++ b/addons/weather/XEH_postInit.sqf @@ -5,11 +5,13 @@ GVAR(temperatureShift) = 3 - random 6; GVAR(badWeatherShift) = (random 1) ^ 2 * 10; GVAR(humidityShift) = (5 - random 10) / 100; -GVAR(wind_period_start_time) = time; -GVAR(rain_period_start_time) = time; +GVAR(wind_period_start_time) = ACE_time; +GVAR(rain_period_start_time) = ACE_time; -"ACE_WIND_PARAMS" addPublicVariableEventHandler { GVAR(wind_period_start_time) = time; }; -"ACE_RAIN_PARAMS" addPublicVariableEventHandler { GVAR(rain_period_start_time) = time; }; +GVAR(ACE_rain) = rain; + +"ACE_WIND_PARAMS" addPublicVariableEventHandler { GVAR(wind_period_start_time) = ACE_time; }; +"ACE_RAIN_PARAMS" addPublicVariableEventHandler { GVAR(rain_period_start_time) = ACE_time; }; "ACE_MISC_PARAMS" addPublicVariableEventHandler { if (!isServer) then { if (GVAR(syncMisc)) then { @@ -25,7 +27,7 @@ GVAR(rain_period_start_time) = time; }; }; -["ACE3 Common", QGVAR(WindInfoKey), localize "STR_ACE_Weather_WindInfoKey", +["ACE3 Common", QGVAR(WindInfoKey), localize LSTRING(WindInfoKey), { // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -41,4 +43,9 @@ simulWeatherSync; [FUNC(updateTemperature), 20, []] call CBA_fnc_addPerFrameHandler; [FUNC(updateHumidity), 20, []] call CBA_fnc_addPerFrameHandler; [FUNC(updateWind), 1, []] call CBA_fnc_addPerFrameHandler; -[FUNC(updateRain), 2, []] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +[FUNC(updateRain), 2, []] call CBA_fnc_addPerFrameHandler; +[{ + if (GVAR(syncRain)) then { + 0 setRain GVAR(ACE_rain); + }; +}, 0, []] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/weather/XEH_preInit.sqf b/addons/weather/XEH_preInit.sqf index 2a6487f51c..eb5291334a 100644 --- a/addons/weather/XEH_preInit.sqf +++ b/addons/weather/XEH_preInit.sqf @@ -5,9 +5,11 @@ ADDON = false; PREP(calculateAirDensity); PREP(calculateBarometricPressure); +PREP(calculateDensityAltitude); PREP(calculateDewPoint); PREP(calculateHeatIndex); PREP(calculateRoughnessLength); +PREP(calculateSpeedOfSound); PREP(calculateTemperatureAtHeight); PREP(calculateWetBulb); PREP(calculateWindChill); diff --git a/addons/weather/config.cpp b/addons/weather/config.cpp index 18059fe9e8..50e2f8ace0 100644 --- a/addons/weather/config.cpp +++ b/addons/weather/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common", "ace_modules"}; + requiredAddons[] = {"ace_common"}; author[] = {"q1184", "Rocko", "esteldunedain", "Ruthberg"}; VERSION_CONFIG; }; diff --git a/addons/weather/functions/fnc_calculateBarometricPressure.sqf b/addons/weather/functions/fnc_calculateBarometricPressure.sqf index 1e1d47098c..e0d8e8f878 100644 --- a/addons/weather/functions/fnc_calculateBarometricPressure.sqf +++ b/addons/weather/functions/fnc_calculateBarometricPressure.sqf @@ -14,4 +14,4 @@ */ #include "script_component.hpp" -(1013.25 * exp(-(GVAR(Altitude) + _this) / 7990) - 10 * overcast) +((1013.25 - 10 * overcast) * (1 - (0.0065 * (GVAR(Altitude) + _this)) / (KELVIN(GVAR(currentTemperature)) + 0.0065 * GVAR(Altitude))) ^ 5.255754495); \ No newline at end of file diff --git a/addons/weather/functions/fnc_calculateDensityAltitude.sqf b/addons/weather/functions/fnc_calculateDensityAltitude.sqf new file mode 100644 index 0000000000..97889e2499 --- /dev/null +++ b/addons/weather/functions/fnc_calculateDensityAltitude.sqf @@ -0,0 +1,19 @@ +/* + * Author: Ruthberg + * + * Calculates density altitude for a given air density + * + * Arguments: + * density of air - kg * m^(-3) + * + * Return Value: + * density altitude - m + * + * Return value: + * None + */ +#include "script_component.hpp" + +// Source: http://wahiduddin.net/calc/density_altitude.htm + +((44.3308 - 42.2665 * _this ^ 0.2349692456) * 1000) diff --git a/addons/weather/functions/fnc_calculateSpeedOfSound.sqf b/addons/weather/functions/fnc_calculateSpeedOfSound.sqf new file mode 100644 index 0000000000..322ba75ac5 --- /dev/null +++ b/addons/weather/functions/fnc_calculateSpeedOfSound.sqf @@ -0,0 +1,17 @@ +/* + * Author: Ruthberg + * + * Calculates the speed of sound for a given temperature + * + * Arguments: + * temperature - degrees celcius + * + * Return Value: + * speed of sound - m/s + * + * Return value: + * None + */ +#include "script_component.hpp" + +(331.3 + (0.6 * _this)) diff --git a/addons/weather/functions/fnc_getWind.sqf b/addons/weather/functions/fnc_getWind.sqf index a23394e992..5b123afaa0 100644 --- a/addons/weather/functions/fnc_getWind.sqf +++ b/addons/weather/functions/fnc_getWind.sqf @@ -16,7 +16,7 @@ if (isNil "ACE_WIND_PARAMS") exitWith { [0, 0, 0] }; EXPLODE_5_PVT(ACE_WIND_PARAMS,_dir,_dirChange,_spd,_spdChange,_period); private ["_periodPercent", "_periodPosition"]; -_periodPosition = (time - GVAR(wind_period_start_time)) min _period; +_periodPosition = (ACE_time - GVAR(wind_period_start_time)) min _period; _periodPercent = _periodPosition / _period; _spd = _spd + _spdChange * _periodPercent; diff --git a/addons/weather/functions/fnc_updateAceWeather.sqf b/addons/weather/functions/fnc_updateAceWeather.sqf index 8ed0bb0d10..029e1eb89b 100644 --- a/addons/weather/functions/fnc_updateAceWeather.sqf +++ b/addons/weather/functions/fnc_updateAceWeather.sqf @@ -27,11 +27,11 @@ if (GVAR(syncRain) && GVAR(rain_period_count) > GVAR(rain_next_period)) then { _rainOverCast = (overcast - 0.7) / 0.3; if (GVAR(current_rain) == 0) then { // Initialize rain with a random strength depending on the current overcast value - GVAR(current_rain) = 0.25 + (random 0.25) + (random 0.5) * _rainOverCast; + GVAR(current_rain) = -0.25 + (random 0.75) + (random 0.5) * _rainOverCast; }; GVAR(current_rain) = GVAR(current_rain) + GVAR(current_rain) * ((_rainOverCast * _overcastMultiplier) / 8) * GVAR(rain_current_range); - GVAR(current_rain) = 0.01 max GVAR(current_rain) min 1; + GVAR(current_rain) = 0 max GVAR(current_rain) min 1; GVAR(rain_current_range) = -1 + (random 2); } else { @@ -45,7 +45,7 @@ if (GVAR(syncRain) && GVAR(rain_period_count) > GVAR(rain_next_period)) then { ACE_RAIN_PARAMS = [_lastRain, GVAR(current_rain), _transitionTime]; TRACE_4("",_lastRain,_rainOverCast,_transitionTime,overcast); - GVAR(rain_period_start_time) = time; + GVAR(rain_period_start_time) = ACE_time; publicVariable "ACE_RAIN_PARAMS"; }; @@ -91,7 +91,7 @@ if (GVAR(syncWind) && GVAR(wind_period_count) > GVAR(wind_next_period)) then { GVAR(current_wind_direction) = _windDirection; GVAR(current_wind_speed) = _windSpeed; - GVAR(wind_period_start_time) = time; + GVAR(wind_period_start_time) = ACE_time; publicVariable "ACE_WIND_PARAMS"; }; diff --git a/addons/weather/functions/fnc_updateRain.sqf b/addons/weather/functions/fnc_updateRain.sqf index d240093443..ced8641f61 100644 --- a/addons/weather/functions/fnc_updateRain.sqf +++ b/addons/weather/functions/fnc_updateRain.sqf @@ -14,12 +14,11 @@ if (!GVAR(syncRain)) exitWith {}; if (!isNil "ACE_RAIN_PARAMS") then { - EXPLODE_3_PVT(ACE_RAIN_PARAMS,_oldRain,_newRain,_period); private ["_periodPosition", "_periodPercent"]; - _periodPosition = (time - GVAR(rain_period_start_time)) min _period; + _periodPosition = (ACE_time - GVAR(rain_period_start_time)) min _period; _periodPercent = (_periodPosition / _period) min 1; - 0 setRain (_oldRain + (_newRain - _oldRain) * _periodPercent); + GVAR(ACE_Rain) = (_oldRain + (_newRain - _oldRain) * _periodPercent); }; diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 02c0964e03..69e2d4a792 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -16,58 +16,114 @@ Weather Pogoda + Clima + Wetter + Počasí + Clima Multiplayer synchronized ACE weather module Synchronizowana pogoda ACE + Modulo climático del ACE sincronizado en multijugador + ACE-Wettermodul (synchron im Multiplayer) + Synchronizovat ACE počasí v multiplayeru + Módulo climático ACE para sincronismo multiplayer Weather propagation Zmiany pogody + Propagación del clima + Wetterübertragung + Změny počasí + Propagação do clima Enables server side weather propagation Aktywuje zmiany pogody po stronie serwera + Permite al servidor controlar la propagación del clima + Aktiviere serverseitige Wetterübertragung + Aktivuje změny počasí na straně serveru + Ativa propagação de clima via server ACE Weather Pogoda ACE + Clima ACE + ACE-Wetter + ACE počasí + Clima ACE Overrides the default weather (editor, mission settings) with ACE weather (map based) Nadpisuje domyślne ustawienia pogody (edytor, wywiad) przy użyciu pogody ACE (zależna od mapy) + Sobreescribe el sistema climático por defecto (editor, ajustes de mision) con clima del ACE (basado en el mapa) + Überschreibt das Standardwetter (Editor, Missionseinstellungen) mit dem ACE-Wetter (kartenbasiert) + Přepíše výchozí počasí (editor, nastavení mise) s ACE počasím (podle mapy) + Sobreescreve o clima padrão (editor, ajustes de missão) pelo sistema de clima ACE (baseado por mapa) Sync Rain Synchronizuj deszcz + Sincronizar lluvia + Regen synchronisieren + Synchronizuj déšť + Sincronizar chuva Synchronizes rain Synchronizuje deszcz + Sincroniza la lluvia + Synchronisiert den Regen + Synchronizace deště + Sincroniza a chuva Sync Wind Synchronizuj wiatr + Sincronizar viento + Wind synchronisieren + Synchronizuj vítr + Sincronizar vento Synchronizes wind Synchronizuje wiatr + Sincroniza el viento + Synchronisiert den Wind + Synchronizace větru + Sincroniza o vento Sync Misc Synchronizuj różne + Sincronizar otros + Sonstiges synchronisieren + Synchronizuj různé + Sincronizar outros Synchronizes lightnings, rainbow, fog, ... Synchronizuje pioruny, tęcze, mgłę, ... + Sincroniza relampagos, arcoiris, niebla ... + Synchronisiert Blitze, Regenbögen, Nebel, ... + Synchronizace blesků, duhy, mlhy, ... + Sincroniza relâmpagos, arco-íris, neblina... Update Interval Interwał aktualizacji + Intervalo de actualización + Aktualisierungsintervall + Interval aktualizace + Intervalo de atualização Defines the interval (seconds) between weather updates Określa interwał (sekundy) pomiędzy aktualizacjami pogody + Defina el intervalo (en segundos) entre actualizacions de clima + Definiert das Intervall (in Sekunden) zwischen Wetteraktualisierungen + Určit interval (v sekundách) mezi aktualizacemi počasí + Defina o intervalo (em segundos) entre as atualizações de clima \ No newline at end of file diff --git a/addons/winddeflection/CfgVehicles.hpp b/addons/winddeflection/CfgVehicles.hpp index f7e2a33980..2694bb1b34 100644 --- a/addons/winddeflection/CfgVehicles.hpp +++ b/addons/winddeflection/CfgVehicles.hpp @@ -2,42 +2,42 @@ class CfgVehicles { class ACE_Module; class GVAR(ModuleSettings): ACE_Module { scope = 2; - displayName = "$STR_ACE_Weather_windDeflection_DisplayName"; + displayName = CSTRING(windDeflection_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Wind_ca.paa)); category = "ACE"; function = QUOTE(DFUNC(initModuleSettings)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; - author = "$STR_ACE_Common_ACETeam"; + author = ECSTRING(common,ACETeam); class Arguments { class enabled { - displayName = "$STR_ACE_Weather_deflectionModule_DisplayName"; - description = "$STR_ACE_Weather_deflectionModule_Description"; + displayName = CSTRING(deflectionModule_DisplayName); + description = CSTRING(deflectionModule_Description); typeName = "BOOL"; defaultValue = 1; }; class vehicleEnabled { - displayName = "$STR_ACE_Weather_vehicleEnabled_DisplayName"; - description = "$STR_ACE_Weather_vehicleEnabled_Description"; + displayName = CSTRING(vehicleEnabled_DisplayName); + description = CSTRING(vehicleEnabled_Description); typeName = "BOOL"; defaultValue = 1; }; class simulationInterval { - displayName = "$STR_ACE_Weather_simulationInterval_DisplayName"; - description = "$STR_ACE_Weather_simulationInterval_Description"; + displayName = CSTRING(simulationInterval_DisplayName); + description = CSTRING(simulationInterval_Description); typeName = "NUMBER"; defaultValue = 0.05; }; class simulationRadius { - displayName = "$STR_ACE_Weather_simulationRadius_DisplayName"; - description = "$STR_ACE_Weather_simulationRadius_Description"; + displayName = CSTRING(simulationRadius_DisplayName); + description = CSTRING(simulationRadius_Description); typeName = "NUMBER"; defaultValue = 3000; }; }; class ModuleDescription { - description = "$STR_ACE_Weather_windDeflection_Description"; + description = CSTRING(windDeflection_Description); }; }; }; \ No newline at end of file diff --git a/addons/winddeflection/config.cpp b/addons/winddeflection/config.cpp index e420debb66..82a51a4b73 100644 --- a/addons/winddeflection/config.cpp +++ b/addons/winddeflection/config.cpp @@ -7,7 +7,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_weather"}; versionDesc = "ACE Wind Deflection"; - author[] = {$STR_ACE_Common_ACETeam, "Glowbal", "Ruthberg"}; + author[] = {ECSTRING(common,ACETeam), "Glowbal", "Ruthberg"}; authorUrl = "http://csemod.com"; VERSION_CONFIG; }; diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index 4c2859f9b6..40e349095e 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -30,8 +30,8 @@ [_this select 1] call cba_fnc_removePerFrameHandler; }; - _deltaT = time - _time; - _args set[2, time]; + _deltaT = ACE_time - _time; + _args set[2, ACE_time]; if (vectorMagnitude ACE_wind > 0) then { _trueVelocity = _bulletVelocity vectorDiff ACE_wind; @@ -47,4 +47,4 @@ }; _bullet setVelocity _bulletVelocity; -}, GVAR(simulationInterval), [_this select 0, _this select 1, time]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +}, GVAR(simulationInterval), [_this select 0, _this select 1, ACE_time]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index 806bf4c449..036456e35e 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -1,107 +1,144 @@  - - - Wind Information - Informacje o wietrze - Información del viento - Информация о ветре - Informace o větru - Vent - Windinformationen - Szélinformáció - Informazioni sul vento - Informação do vento - - - Direction: %1 - Kierunek: %1 - Dirección: %1 - Направление: %1° - Směr: %1 - Direction %1 - Windrichtung: %1 - Irány: %1 - Direzione: %1° - Direção: %1 - - - Speed: %1 m/s - Prędkość: %1 - Velocidad: %1 m/s - Скорость: %1 м/с - Rychlost: %1 m/s - Vitesse %1 m/s - Geschwindigkeit: %1 m/s - Sebesség: %1 m/s - Velocità: %1 m/s - Velocidade: %1 m/s - - - Weather Information - Informacje o pogodzie - Información Meteorológica - Информация о погоде - Informace o počasí - Météo - Wetterinformationen - Időjárás-Információ - Meteo - Informação Meteorológica - - - Humidity: %1% - Wilgotność: %1 - Humedad: %1% - Влажность: %1% - Vlhkost: %1% - Humidité: %1% - Luftfeuchtigkeit: %1 - Páratartalom: %1% - Umidità: %1% - Humidade: %1% - - - Wind Deflection - Wpływ wiatru - - - Wind Deflection - Wpływ wiatru - - - Enables wind deflection - Aktywuje wpływ wiatru na trajektorię lotu pocisków - - - Vehicle Enabled - Włączone dla pojazdów - - - Enables wind deflection for static/vehicle gunners - Aktywuje wpływ wiatru na trajektorię lotu pocisków dla broni statycznej i na pojazdach - - - Simulation Interval - Interwał symulacji - - - Defines the interval between every calculation step - Określa interwał pomiędzy każdym krokiem kalkulacji - - - Simulation Radius - Zasięg symulacji - - - Defines the radius around the player (in meters) at which projectiles are wind deflected - Określa obszar naokoło gracza (w metrach), na którym pociski są znoszone przez wiatr - - - Wind influence on projectiles trajectory - Wpływ wiatru na trajektorię lotu pocisków - - + + Wind Information + Informacje o wietrze + Información del viento + Информация о ветре + Informace o větru + Vent + Windinformationen + Szélinformáció + Informazioni sul vento + Informação do vento + + + Direction: %1 + Kierunek: %1 + Dirección: %1 + Направление: %1° + Směr: %1 + Direction %1 + Windrichtung: %1 + Irány: %1 + Direzione: %1° + Direção: %1 + + + Speed: %1 m/s + Prędkość: %1 + Velocidad: %1 m/s + Скорость: %1 м/с + Rychlost: %1 m/s + Vitesse %1 m/s + Geschwindigkeit: %1 m/s + Sebesség: %1 m/s + Velocità: %1 m/s + Velocidade: %1 m/s + + + Weather Information + Informacje o pogodzie + Información Meteorológica + Информация о погоде + Informace o počasí + Météo + Wetterinformationen + Időjárás-Információ + Meteo + Informação Meteorológica + + + Humidity: %1% + Wilgotność: %1 + Humedad: %1% + Влажность: %1% + Vlhkost: %1% + Humidité: %1% + Luftfeuchtigkeit: %1 + Páratartalom: %1% + Umidità: %1% + Humidade: %1% + + + Wind Deflection + Wpływ wiatru + Desviación por viento + Účinky větru + Desvio de vento + + + Wind Deflection + Wpływ wiatru + Desviación por viento + Windablenkung + Účinky větru + Desvio de vento + + + Enables wind deflection + Aktywuje wpływ wiatru na trajektorię lotu pocisków + Activa la desviación por viento + Aktiviert Windablenkung + Umožňit vliv větru + Ativa o desvio de vento + + + Vehicle Enabled + Włączone dla pojazdów + Habilitada en vehículos + Fahrzeuge aktiviert + Vozidla povolena + Ativado em veículos + + + Enables wind deflection for static/vehicle gunners + Aktywuje wpływ wiatru na trajektorię lotu pocisków dla broni statycznej i na pojazdach + Habilita la desviación por viento para artilleros estaticos/de vehículos + Aktiviere Windablenkung für statische oder Fahrzeugschützen + Umožnit vliv větru pro střelce z vozidla/statiky + Ativa o desvio de vento para atiradores de estáticas e veículos + + + Simulation Interval + Interwał symulacji + Intervalo de simulación + Simulationsintervall + Interval simulace + Intervalo de simulação + + + Defines the interval between every calculation step + Określa interwał pomiędzy każdym krokiem kalkulacji + Define el intervalo entre cada calculo + Definiert das Intervall zwischen jedem Berechnungsschritt + Určuje interval mezi každým výpočtem + Define o intervalo entre cada cálculo + + + Simulation Radius + Zasięg symulacji + Radio de simulación + Simulationsradius + Oblast simulace + Radio da Simulação + + + Defines the radius around the player (in meters) at which projectiles are wind deflected + Określa obszar naokoło gracza (w metrach), na którym pociski są znoszone przez wiatr + Define el radio alrededor del jugador (en metros) en el cual los proyectiles son desviados por el viento + Gibt den Radius (in Metern) um den Spieler an, in dem Projektile vom Wind beeinflusst werden + Definuje oblast kolem hráče (v metrech) v které je projektil ovlivněn větrem + Define o raio ao redor do jogador (em metros) em qual os projéteis são desviados pelo vento + + + Wind influence on projectiles trajectory + Wpływ wiatru na trajektorię lotu pocisków + Influencia del viento en la trayectoria de proyectiles + Windeinfluss auf die Geschossbahnen + Vítr ovlivňuje trajektorii projektilu + Influência do vento na trajetória dos projéteis + - +
\ No newline at end of file diff --git a/addons/yardage450/$PBOPREFIX$ b/addons/yardage450/$PBOPREFIX$ new file mode 100644 index 0000000000..7efb31f23f --- /dev/null +++ b/addons/yardage450/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\yardage450 \ No newline at end of file diff --git a/addons/yardage450/CfgEventHandlers.hpp b/addons/yardage450/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a05b72298 --- /dev/null +++ b/addons/yardage450/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; \ No newline at end of file diff --git a/addons/yardage450/CfgVehicles.hpp b/addons/yardage450/CfgVehicles.hpp new file mode 100644 index 0000000000..d8f2ccabe3 --- /dev/null +++ b/addons/yardage450/CfgVehicles.hpp @@ -0,0 +1,20 @@ +class CfgVehicles { + class Item_Base_F; + class ACE_Item_Yardage450: Item_Base_F { + author[] = {"Spooner", "tcp"}; + scope = 2; + scopeCurator = 2; + displayName = CSTRING(DisplayName); + vehicleClass = "Items"; + class TransportWeapons { + MACRO_ADDWEAPON(ACE_Yardage450,1); + }; + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportWeapons { + MACRO_ADDWEAPON(ACE_Yardage450,4); + }; + }; +}; diff --git a/addons/yardage450/CfgWeapons.hpp b/addons/yardage450/CfgWeapons.hpp new file mode 100644 index 0000000000..54e15401a6 --- /dev/null +++ b/addons/yardage450/CfgWeapons.hpp @@ -0,0 +1,23 @@ + +class CfgWeapons { + class Binocular; + class ACE_Yardage450: Binocular { + author = ECSTRING(common,ACETeam); + displayName = CSTRING(DisplayName); + descriptionShort = CSTRING(Description); + model = PATHTOF(data\ace_yardage_pro_450.p3d); + modelOptics = PATHTOF(data\bushnell_optic.p3d); + picture = PATHTOF(UI\w_bushnell_ca.paa); + opticsZoomMin = 0.33333/4; + opticsZoomMax = 0.33333/4; + opticsZoomInit = 0.33333/4; + distanceZoomMin = 400; + distanceZoomMax = 400; + discretefov[] = {0.33333/4}; + discreteInitIndex = 0; + visionMode[] = {"Normal"}; + class WeaponSlotsInfo { + mass = 12; + }; + }; +}; diff --git a/addons/yardage450/README.md b/addons/yardage450/README.md new file mode 100644 index 0000000000..6301233fe4 --- /dev/null +++ b/addons/yardage450/README.md @@ -0,0 +1,10 @@ +ace_yardage450 +========== + +Adds the Bushnell Yardage Pro Sport 450 Laser Rangefinder. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg] (http://github.com/Ulteq) diff --git a/addons/yardage450/RscTitles.hpp b/addons/yardage450/RscTitles.hpp new file mode 100644 index 0000000000..28fd7735e9 --- /dev/null +++ b/addons/yardage450/RscTitles.hpp @@ -0,0 +1,75 @@ +#define ST_LEFT 0 +#define ST_RIGHT 1 +#define ST_CENTER 2 + +class ACE_Yardage450_RscText { + type = 0; + idc = -1; + style = ST_CENTER; + font = "EtelkaMonospacePro"; + sizeEx = "0.027 * SafeZoneH"; + colorText[] = {0, 0, 0, 1}; + colorBackground[] = {0, 0, 0, 0}; +}; + +class RscTitles { + class ACE_RscYardage450 { + idd = -1; + movingEnable = 0; + duration = 100000; + fadein = 0; + fadeout = 0; + name = "ACE_RscYardage450"; + onLoad = "with uiNameSpace do { ACE_RscYardage450 = _this select 0; };"; + onUnload = "with uiNameSpace do { ACE_RscYardage450 = displayNull; };"; + + class Controls { + class ACE_Yardage450_RscTarget : ACE_Yardage450_RscText { + idc = 720041; + style = ST_CENTER; + x = "0.5 - (0.18 * SafeZoneH)"; + y = "0.5 - (0.25 * SafeZoneH)"; + w = "0.4 * SafeZoneH"; + h = "0.05 * SafeZoneH"; + sizeEx = "0.05 * SafeZoneH"; + text = "TARGET ACQUIRED"; + }; + class ACE_Yardage450_RscLaser : ACE_Yardage450_RscTarget { + idc = 720042; + x = "0.5 - (0.14 * SafeZoneH)"; + y = "0.5 - (0.18 * SafeZoneH)"; + w = "0.045 * SafeZoneH"; + h = "0.02 * SafeZoneH"; + sizeEx = "0.02 * SafeZoneH"; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0, 0, 0, 1}; + text = "LASER"; + }; + class ACE_Yardage450_RscRange : ACE_Yardage450_RscTarget { + idc = 720043; + style = ST_RIGHT; + x = "0.5 - (0.02 * SafeZoneH)"; + y = "0.5 + (0.18 * SafeZoneH)"; + w = "0.08 * SafeZoneH"; + h = "0.06 * SafeZoneH"; + sizeEx = "0.06 * SafeZoneH"; + text = "---"; + }; + class ACE_Yardage450_RscMeters : ACE_Yardage450_RscLaser { + idc = 720044; + x = "0.5 + (0.06 * SafeZoneH)"; + y = "0.5 + (0.19 * SafeZoneH)"; + w = "0.05 * SafeZoneH"; + h = "0.018 * SafeZoneH"; + sizeEx = "0.018 * SafeZoneH"; + text = "METERS"; + }; + class ACE_Yardage450_RscYards : ACE_Yardage450_RscMeters { + idc = 720045; + y = "0.5 + (0.21 * SafeZoneH)"; + w = "0.0417 * SafeZoneH"; + text = "YARDS"; + }; + }; + }; +}; diff --git a/addons/yardage450/UI/w_bushnell_ca.paa b/addons/yardage450/UI/w_bushnell_ca.paa new file mode 100644 index 0000000000..85a6aca23f Binary files /dev/null and b/addons/yardage450/UI/w_bushnell_ca.paa differ diff --git a/addons/yardage450/XEH_postInit.sqf b/addons/yardage450/XEH_postInit.sqf new file mode 100644 index 0000000000..2d4ef89968 --- /dev/null +++ b/addons/yardage450/XEH_postInit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +#include "initKeybinds.sqf" + +GVAR(active) = false; + +GVAR(useYards) = false; + +GVAR(powerButtonPressed) = false; +GVAR(powerOnTime) = 0; + +GVAR(lasing) = false; +GVAR(targetAcquired) = false; +GVAR(targetRangeText) = "---"; diff --git a/addons/yardage450/XEH_preInit.sqf b/addons/yardage450/XEH_preInit.sqf new file mode 100644 index 0000000000..ad84432e0d --- /dev/null +++ b/addons/yardage450/XEH_preInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(acquireTarget); +PREP(turnOn); + +ADDON = true; diff --git a/addons/yardage450/config.cpp b/addons/yardage450/config.cpp new file mode 100644 index 0000000000..4d0f820aed --- /dev/null +++ b/addons/yardage450/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"ACE_Item_Yardage450"}; + weapons[] = {"ACE_Yardage450"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_apl", "ace_laser"}; + author[] = {"Spooner", "tcp", "Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "RscTitles.hpp" diff --git a/addons/yardage450/data/Bushnell.rvmat b/addons/yardage450/data/Bushnell.rvmat new file mode 100644 index 0000000000..9f8cf9835d --- /dev/null +++ b/addons/yardage450/data/Bushnell.rvmat @@ -0,0 +1,66 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={0.7000000,0.700000,0.700000,1.000000}; +specularPower=20.000000; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 { + texture="z\ace\addons\yardage450\data\bushnell_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 { + texture="a3\weapons_f\data\detailmaps\plast_dt.paa"; + uvSource="tex"; + class uvTransform { + aside[]={3.0000,0.000000,0.000000}; + up[]={0.000000,3.0000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0)"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 { + texture="z\ace\addons\yardage450\data\bushnell_as.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage5 { + texture="z\ace\addons\yardage450\data\bushnell_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage6 { + texture="#(ai,64,64,1)fresnel(2,2)"; + uvSource="none"; +}; +class Stage7 { + texture="a3\data_f\env_land_co.paa"; + uvSource="none"; +}; diff --git a/addons/yardage450/data/ace_yardage_pro_450.p3d b/addons/yardage450/data/ace_yardage_pro_450.p3d new file mode 100644 index 0000000000..e63b5021da Binary files /dev/null and b/addons/yardage450/data/ace_yardage_pro_450.p3d differ diff --git a/addons/yardage450/data/bushnell_as.paa b/addons/yardage450/data/bushnell_as.paa new file mode 100644 index 0000000000..44d605d59c Binary files /dev/null and b/addons/yardage450/data/bushnell_as.paa differ diff --git a/addons/yardage450/data/bushnell_co.paa b/addons/yardage450/data/bushnell_co.paa new file mode 100644 index 0000000000..9d2738ca6f Binary files /dev/null and b/addons/yardage450/data/bushnell_co.paa differ diff --git a/addons/yardage450/data/bushnell_nohq.paa b/addons/yardage450/data/bushnell_nohq.paa new file mode 100644 index 0000000000..4500e4b6cf Binary files /dev/null and b/addons/yardage450/data/bushnell_nohq.paa differ diff --git a/addons/yardage450/data/bushnell_optic.p3d b/addons/yardage450/data/bushnell_optic.p3d new file mode 100644 index 0000000000..653a25ec3c Binary files /dev/null and b/addons/yardage450/data/bushnell_optic.p3d differ diff --git a/addons/yardage450/data/bushnell_optic_ca.paa b/addons/yardage450/data/bushnell_optic_ca.paa new file mode 100644 index 0000000000..b9cfa9d1b4 Binary files /dev/null and b/addons/yardage450/data/bushnell_optic_ca.paa differ diff --git a/addons/yardage450/data/bushnell_smdi.paa b/addons/yardage450/data/bushnell_smdi.paa new file mode 100644 index 0000000000..285c120dbe Binary files /dev/null and b/addons/yardage450/data/bushnell_smdi.paa differ diff --git a/addons/yardage450/data/scope_view.paa b/addons/yardage450/data/scope_view.paa new file mode 100644 index 0000000000..626b1caaa0 Binary files /dev/null and b/addons/yardage450/data/scope_view.paa differ diff --git a/addons/yardage450/functions/fnc_acquireTarget.sqf b/addons/yardage450/functions/fnc_acquireTarget.sqf new file mode 100644 index 0000000000..1d89bf5971 --- /dev/null +++ b/addons/yardage450/functions/fnc_acquireTarget.sqf @@ -0,0 +1,60 @@ +/* + * Author: Ruthberg + * Fires the laser to acquire the target + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +// Reference: http://www.optcorp.com/pdf/Bushnell/YardageProSport.pdf +#define MIN_DISTANCE ([9, 10] select GVAR(useYards)) +#define MAX_DISTANCE ([732, 800] select GVAR(useYards)) +#define METERING_POINT_NUMBER 8 + +private ["_result", "_distance", "_min", "_max", "_range"]; + +GVAR(lasing) = true; +GVAR(targetAcquired) = false; + +GVAR(distances) = []; +GVAR(distanceIndex) = -1; + +[{ + if (GVAR(targetAcquired) || !GVAR(powerButtonPressed)) exitWith { + GVAR(lasing) = false; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + + _result = [eyePos ACE_player, ACE_player weaponDirection (currentWeapon ACE_player)] call EFUNC(laser,shootRay); + _distance = _result select 1; + + _distance = _distance - 1 + (random 2); + + GVAR(distanceIndex) = (GVAR(distanceIndex) + 1) % METERING_POINT_NUMBER; + GVAR(distances) set [GVAR(distanceIndex), _distance]; + + if (count GVAR(distances) == METERING_POINT_NUMBER) then { + _min = MAX_DISTANCE; + _max = MIN_DISTANCE; + { + _min = _x min _min; + _max = _max max _x; + } forEach GVAR(distances); + + if (abs(_max - _min) < 5) then { + _range = (_min + _max) / 2; + if (_range >= MIN_DISTANCE && _range <= MAX_DISTANCE) then { + GVAR(targetAcquired) = true; + GVAR(targetRangeText) = Str(round(_range)); + }; + }; + }; +}, 0.1, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/yardage450/functions/fnc_turnOn.sqf b/addons/yardage450/functions/fnc_turnOn.sqf new file mode 100644 index 0000000000..5f123b8cb2 --- /dev/null +++ b/addons/yardage450/functions/fnc_turnOn.sqf @@ -0,0 +1,56 @@ +/* + * Author: Ruthberg + * Shows the Yardage 450 screen elements + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +#define __dsp (uiNamespace getVariable "ACE_RscYardage450") +#define __ctrlTarget (__dsp displayCtrl 720041) +#define __ctrlLaser (__dsp displayCtrl 720042) +#define __ctrlRange (__dsp displayCtrl 720043) +#define __ctrlMeters (__dsp displayCtrl 720044) +#define __ctrlYards (__dsp displayCtrl 720045) + +if (currentWeapon ACE_player != "ACE_Yardage450" || cameraView != "GUNNER") exitWith {}; + +GVAR(powerOnTime) = ACE_time; + +if (GVAR(active)) exitWith {}; + +GVAR(active) = true; + +[{ + if (ACE_time - GVAR(powerOnTime) > 30) exitWith { + GVAR(active) = false; + 74210 cutText ["", "PLAIN"]; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + + if (currentWeapon ACE_player == "ACE_Yardage450" && cameraView == "GUNNER") then { + 74210 cutRsc ["ACE_RscYardage450", "PLAIN", 1, false]; + + __ctrlLaser ctrlShow GVAR(lasing); + if (GVAR(targetAcquired)) then { + __ctrlTarget ctrlSetText "Target Acquired"; + __ctrlRange ctrlSetText GVAR(targetRangeText); + } else { + __ctrlTarget ctrlSetText ""; + __ctrlRange ctrlSetText "---"; + }; + __ctrlMeters ctrlShow !GVAR(useYards); + __ctrlYards ctrlShow GVAR(useYards); + } else { + 74210 cutText ["", "PLAIN"]; + }; + +}, 0, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/yardage450/functions/script_component.hpp b/addons/yardage450/functions/script_component.hpp new file mode 100644 index 0000000000..ed5cf1b7c7 --- /dev/null +++ b/addons/yardage450/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\yardage450\script_component.hpp" \ No newline at end of file diff --git a/addons/yardage450/initKeybinds.sqf b/addons/yardage450/initKeybinds.sqf new file mode 100644 index 0000000000..578f55ee40 --- /dev/null +++ b/addons/yardage450/initKeybinds.sqf @@ -0,0 +1,28 @@ + +["ACE3 Equipment", QGVAR(DistanceKey), localize "STR_ACE_Yardage450_PowerButtonKey", +{ + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if !(GVAR(active)) exitWith {false}; + if (currentWeapon ACE_player != "ACE_Yardage450" || cameraView != "GUNNER") exitWith {false}; + + // Statement + if !(GVAR(powerButtonPressed)) then { + GVAR(powerButtonPressed) = true; + call FUNC(acquireTarget); + }; + true +}, +{ + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (currentWeapon ACE_player != "ACE_Yardage450" || cameraView != "GUNNER") exitWith {false}; + + // Statement + GVAR(powerButtonPressed) = false; + call FUNC(turnOn); + true +}, +[19, [false, false, false]], false] call CBA_fnc_addKeybind; //R Key diff --git a/addons/yardage450/script_component.hpp b/addons/yardage450/script_component.hpp new file mode 100644 index 0000000000..abff262efc --- /dev/null +++ b/addons/yardage450/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT yardage450 +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_YARDAGE450 + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_YARDAGE450 + #define DEBUG_SETTINGS DEBUG_SETTINGS_YARDAGE450 +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/yardage450/stringtable.xml b/addons/yardage450/stringtable.xml new file mode 100644 index 0000000000..971b3a4889 --- /dev/null +++ b/addons/yardage450/stringtable.xml @@ -0,0 +1,28 @@ + + + + + Yardage 450 + Yardage 450 + Yardage 450 + Yardage 450 + Yardage 450 + + + Laser Rangefinder + Laserentfernungsmesser + Dalmierz laserowy + Telémetro láser + Laserový dálkoměr + Medidor de Distância a laser + + + Yardage 450 - Power Button + Yardage 450 - Einschalt-Taste + Yardage 450 - Przycisk zasilania + Yardage 450 - Botón de encendido + Yardage 450 - Tlačítko napájení + Yardage 450 - Botão de energia + + + \ No newline at end of file diff --git a/addons/zeus/ACE_Settings.hpp b/addons/zeus/ACE_Settings.hpp index 536790ba26..388e3c42cb 100644 --- a/addons/zeus/ACE_Settings.hpp +++ b/addons/zeus/ACE_Settings.hpp @@ -18,6 +18,6 @@ class ACE_Settings { class GVAR(revealMines) { typeName = "SCALAR"; value = 0; - values[] = {"Disabled", "Partially", "Fully"}; + values[] = {"$STR_A3_OPTIONS_DISABLED", CSTRING(revealMines_partial), CSTRING(revealMines_full)}; }; }; diff --git a/addons/zeus/CfgFactionClasses.hpp b/addons/zeus/CfgFactionClasses.hpp deleted file mode 100644 index bf34546727..0000000000 --- a/addons/zeus/CfgFactionClasses.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgFactionClasses { - class NO_CATEGORY; - class ADDON: NO_CATEGORY { - displayName = "ACE Zeus"; - }; -}; diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 7d145c8421..79d4ff6f1f 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -3,78 +3,112 @@ class CfgVehicles { class ModuleEmpty_F; class ACE_Module; - class GVAR(moduleZeusSettings): ACE_Module { + class ModuleCurator_F: Module_F { + function = QFUNC(bi_moduleCurator); + }; + class ModuleMine_F: ModuleEmpty_F { + function = QFUNC(bi_moduleMine); + }; + class ModuleOrdnance_F: Module_F { + function = QFUNC(bi_moduleProjectile); + }; + class ModuleRemoteControl_F: Module_F { + function = QFUNC(bi_moduleRemoteControl); + }; + class GVAR(moduleSettings): ACE_Module { scope = 2; - displayName = "Zeus Settings [ACE]"; - //icon = QUOTE(PATHTOF(iconGoesHere)); - category = "ACE_zeus"; - function = QUOTE(DFUNC(moduleZeusSettings)); + displayName = CSTRING(Settings_DisplayName); + icon = QUOTE(PATHTOF(UI\Icon_Module_Zeus_Settings_ca.paa)); + category = "ACE"; + function = QFUNC(moduleZeusSettings); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; author = "SilentSpike"; class Arguments { class zeusAscension { - displayName = "Ascension Messages"; - description = "Display global popup messages when a player is assigned as Zeus."; + displayName = CSTRING(ascension_DisplayName); + description = CSTRING(ascension_Description); typeName = "BOOL"; defaultValue = 0; }; class zeusBird { - displayName = "Zeus Eagle"; - description = "Spawn an eagle that follows the Zeus camera."; + displayName = CSTRING(bird_DisplayName); + description = CSTRING(bird_Description); typeName = "BOOL"; defaultValue = 0; }; class remoteWind { - displayName = "Wind Sounds"; - description = "Play wind sounds when Zeus remote controls a unit."; + displayName = CSTRING(remoteWind_DisplayName); + description = CSTRING(remoteWind_Description); typeName = "BOOL"; defaultValue = 0; }; class radioOrdnance { - displayName = "Ordnance Warning"; - description = "Play a radio warning when Zeus uses ordnance."; + displayName = CSTRING(radioOrdnance_DisplayName); + description = CSTRING(radioOrdnance_Description); typeName = "BOOL"; defaultValue = 0; }; class revealMines { - displayName = "Reveal Mines"; - description = "Reveal mines to allies and/or place map markers."; + displayName = CSTRING(revealMines_DisplayName); + description = CSTRING(revealMines_Description); typeName = "NUMBER"; class values { class disable { - name = "Disabled"; + name = "$STR_A3_OPTIONS_DISABLED"; value = 0; default = 1; }; class partial { - name = "Reveal to Allies"; + name = CSTRING(revealMines_partial); value = 1; }; class full { - name = "Allies + Map Markers"; + name = CSTRING(revealMines_full); value = 2; }; }; }; }; class ModuleDescription { - description = "Provides control over various aspects of Zeus."; + description = CSTRING(Settings_Description); sync[] = {}; }; }; - - class ModuleCurator_F: Module_F { - function = QUOTE(DFUNC(bi_moduleCurator)); + class GVAR(moduleBase): Module_F { + author = "SilentSpike"; + category = "ACE"; + scopeCurator = 2; }; - class ModuleMine_F: ModuleEmpty_F { - function = QUOTE(DFUNC(bi_moduleMine)); + class GVAR(moduleCaptive): GVAR(moduleBase) { + curatorCanAttach = 1; + displayName = CSTRING(ModuleCaptive_DisplayName); + function = QFUNC(moduleCaptive); + icon = QUOTE(PATHTOF(UI\Icon_Module_Zeus_Captive_ca.paa)); + class ModuleDescription { + description = "Flips the capture state of the specified unit."; + sync[] = {}; + }; }; - class ModuleOrdnance_F: Module_F { - function = QUOTE(DFUNC(bi_moduleProjectile)); + class GVAR(moduleSurrender): GVAR(moduleBase) { + curatorCanAttach = 1; + displayName = CSTRING(ModuleSurrender_DisplayName); + function = QFUNC(moduleSurrender); + icon = QUOTE(PATHTOF(UI\Icon_Module_Zeus_Surrender_ca.paa)); + class ModuleDescription { + description = "Flips the surrender state of the specified unit."; + sync[] = {}; + }; }; - class ModuleRemoteControl_F: Module_F { - function = QUOTE(DFUNC(bi_moduleRemoteControl)); + class GVAR(moduleUnconscious): GVAR(moduleBase) { + curatorCanAttach = 1; + displayName = CSTRING(ModuleUnconscious_DisplayName); + function = QFUNC(moduleUnconscious); + icon = QUOTE(PATHTOF(UI\Icon_Module_Zeus_Unconscious_ca.paa)); + class ModuleDescription { + description = "Flips the unconscious state of the specified unit."; + sync[] = {}; + }; }; }; diff --git a/addons/zeus/README.md b/addons/zeus/README.md new file mode 100644 index 0000000000..b99edb66bb --- /dev/null +++ b/addons/zeus/README.md @@ -0,0 +1,15 @@ +ace_zeus +========== + +Provides control over various aspects of zeus: +- Ascension messages +- Eagle +- Wind sounds +- Ordnance radio messages +- Mine markers + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [SilentSpike] (http://github.com/SilentSpike) diff --git a/addons/zeus/XEH_preInit.sqf b/addons/zeus/XEH_preInit.sqf index e7bb1b96a5..1b2ac19263 100644 --- a/addons/zeus/XEH_preInit.sqf +++ b/addons/zeus/XEH_preInit.sqf @@ -6,6 +6,14 @@ PREP(bi_moduleCurator); PREP(bi_moduleMine); PREP(bi_moduleProjectile); PREP(bi_moduleRemoteControl); +PREP(handleZeusUnitAssigned); +PREP(moduleCaptive); +PREP(moduleSurrender); +PREP(moduleUnconscious); PREP(moduleZeusSettings); +if (isServer) then { + ["zeusUnitAssigned", FUNC(handleZeusUnitAssigned)] call EFUNC(common,addEventHandler); +}; + ADDON = true; diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 4bdc1cd5e1..7505f2770e 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -5,14 +5,30 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common","ace_modules"}; + requiredAddons[] = {"ace_common"}; author[] = {"SilentSpike"}; authorUrl = "https://github.com/SilentSpike"; VERSION_CONFIG; }; + // Use additional cfgPatches to contextually remove modules from zeus + class GVAR(captives): ADDON { + units[] = { + QGVAR(moduleCaptive), + QGVAR(moduleSurrender) + }; + }; + class GVAR(medical): ADDON { + units[] = { + QGVAR(moduleUnconscious) + }; + }; +}; + +class ACE_Curator { + GVAR(captives) = "ace_captives"; + GVAR(medical) = "ace_medical"; }; #include "CfgEventHandlers.hpp" -#include "CfgFactionClasses.hpp" #include "CfgVehicles.hpp" #include "ACE_Settings.hpp" diff --git a/addons/zeus/functions/fnc_bi_moduleCurator.sqf b/addons/zeus/functions/fnc_bi_moduleCurator.sqf index c254358f4b..a36d8dd458 100644 --- a/addons/zeus/functions/fnc_bi_moduleCurator.sqf +++ b/addons/zeus/functions/fnc_bi_moduleCurator.sqf @@ -2,9 +2,12 @@ * Author: Bohemia Interactive * Module function for initalizing zeus * Edited to remove eagle and global ascension message + * Added "zeusUnitAssigned" event call * * Arguments: - * 0: The logic object + * 0: The module logic + * 1: units + * 2: activated * * Return Value: * nil @@ -110,7 +113,7 @@ if (_activated) then { if (_name == "") then {_name = localize "STR_A3_curator";}; //--- Wait until mission starts - waituntil {time > 0}; + waituntil {time > 0}; // NOTE: DO NOT CHANGE TO ACE_TIME, IT BREAKS THE MODULE //--- Refresh addon list, so it's broadcasted to clients _addons = curatoraddons _logic; @@ -123,13 +126,14 @@ if (_activated) then { case (_ownerUID > 0): { waituntil { sleep 0.01; - {getplayeruid _x == _ownerVar} count playableunits > 0 + {getplayeruid _x == _ownerVar} count playableunits > 0 || isnull _logic }; }; default { - waituntil {isplayer (missionnamespace getvariable [_ownerVar,objnull])}; + waituntil {isplayer (missionnamespace getvariable [_ownerVar,objnull]) || isnull _logic}; }; }; + if (isnull _logic) exitwith {}; //--- Assign _player = objnull; @@ -144,21 +148,22 @@ if (_activated) then { }; }; - waituntil {unassigncurator _logic; isnull (getassignedcuratorunit _logic)}; - waituntil {_player assignCurator _logic; getassignedcuratorunit _logic == _player}; + waituntil {unassigncurator _logic; isnull (getassignedcuratorunit _logic) || isnull _logic}; + waituntil {_player assignCurator _logic; getassignedcuratorunit _logic == _player || isnull _logic}; + if (isnull _logic) exitwith {}; //--- Add radio channels { _x radiochanneladd [_player]; } foreach (_logic getvariable ["channels",[]]); - // Added by ACE_zeus to delay ascension message at mission start + // Added by ace_zeus to delay ascension message at mission start [{ _logic = _this select 0; _player = _this select 1; - if (GVAR(zeusAscension)) then { - //--- Sent notification to all assigned players + //--- Sent notification to all assigned players + if ((_logic getvariable ["showNotification",true]) && GVAR(zeusAscension)) then { { if (isplayer _x) then { [["CuratorAssign",[_name,name _player]],"bis_fnc_showNotification",_x] call bis_fnc_mp; @@ -169,6 +174,9 @@ if (_activated) then { [_logic,"curatorUnitAssigned",[_logic,_player]] call bis_fnc_callscriptedeventhandler; + // Added by ace_zeus + ["zeusUnitAssigned", [_logic,_player]] call EFUNC(common,globalEvent); + //--- Forced interface //if (_forced) then { // [[true,true],"bis_fnc_forceCuratorInterface",_player] call bis_fnc_mp; @@ -179,13 +187,14 @@ if (_activated) then { case (_ownerUID > 0): { waituntil { sleep 0.01; - {getplayeruid _x == _ownerVar} count playableunits == 0 + {getplayeruid _x == _ownerVar} count playableunits == 0 || isnull _logic }; }; default { - waituntil {_player != missionnamespace getvariable [_ownerVar,objnull]}; + waituntil {_player != missionnamespace getvariable [_ownerVar,objnull] || isnull _logic}; }; }; + if (isnull _logic) exitwith {}; //--- Add radio channels { @@ -193,7 +202,8 @@ if (_activated) then { } foreach (_logic getvariable ["channels",[]]); //--- Unassign - waituntil {unassigncurator _logic; isnull (getassignedcuratorunit _logic)}; + waituntil {unassigncurator _logic; isnull (getassignedcuratorunit _logic) || isnull _logic}; + if (isnull _logic) exitwith {}; }; }; @@ -212,7 +222,7 @@ if (_activated) then { } foreach (synchronizedobjects _logic); _addons call bis_fnc_activateaddons; - // Added by ACE_zeus to delay bird code + // Added by ace_zeus to delay bird code [{ _logic = _this select 0; diff --git a/addons/zeus/functions/fnc_bi_moduleMine.sqf b/addons/zeus/functions/fnc_bi_moduleMine.sqf index b5063c7fed..8f60531b34 100644 --- a/addons/zeus/functions/fnc_bi_moduleMine.sqf +++ b/addons/zeus/functions/fnc_bi_moduleMine.sqf @@ -4,7 +4,9 @@ * Edited to remove forced map markers and mines being revealed to players * * Arguments: - * 0: The logic object + * 0: The module logic + * 1: units + * 2: activated * * Return Value: * nil @@ -24,7 +26,7 @@ if (_activated) then { _explosive = createvehicle [_explosive,position _logic,[],0,"none"]; _explosive attachto [_logic]; - // Added by ACE_zeus to control if mines are revealed + // Added by ace_zeus to control if mines are revealed if (GVAR(revealMines) > 0) then { //--- Reveal the mine to curator's side { diff --git a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf index 6e2ee35387..5980e56b3d 100644 --- a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf +++ b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf @@ -5,7 +5,9 @@ * Edited to remove radio warning and add ballistics support * * Arguments: - * 0: The logic object + * 0: The module logic + * 1: units + * 2: activated * * Return Value: * nil @@ -102,9 +104,9 @@ if (_activated) then { _side = side group _x; if (_side in [east,west,resistance,civilian]) then { //--- Play radio (only if it wasn't played recently) - if (time > _x getvariable ["BIS_fnc_moduleProjectile_radio",-_delay]) then { + if (ACE_time > _x getvariable ["BIS_fnc_moduleProjectile_radio",-_delay]) then { [[_side,_radio,"side"],"bis_fnc_sayMessage",_x] call bis_fnc_mp; - _x setvariable ["BIS_fnc_moduleProjectile_radio",time + _delay]; + _x setvariable ["BIS_fnc_moduleProjectile_radio",ACE_time + _delay]; }; }; }; @@ -125,7 +127,7 @@ if (_activated) then { _projectile setvelocity _velocity; if (_attach) then {_projectile attachto [_logic,[0,0,_altitude]];}; - // This is our addition to this function + // Added by ace_zeus for ace_frag compatibility if (!isnil "ace_frag_fnc_addManualTrack") then { [_projectile] call ace_frag_fnc_addManualTrack }; @@ -136,7 +138,7 @@ if (_activated) then { //--- Create sound source _soundSource = if (_soundSourceClass != "") then {createSoundSource [_soundSourceClass,_pos,[],0]} else {objnull}; - // Added by ACE_zeus to toggle ordnance radio message + // Added by ace_zeus to toggle ordnance radio message if (GVAR(radioOrdnance)) then { //--- Play radio warning [] call _fnc_playRadio; diff --git a/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf b/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf index 57b325b585..a9e1f35080 100644 --- a/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf +++ b/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf @@ -4,7 +4,9 @@ * Edited to remove global wind sound * * Arguments: - * 0: The logic object + * 0: The module logic + * 1: units + * 2: activated * * Return Value: * nil @@ -47,7 +49,7 @@ if (_activated && local _logic && !isnull curatorcamera) then { bis_fnc_moduleRemoteControl_unit = _unit; _unit setvariable ["bis_fnc_moduleRemoteControl_owner",player,true]; - // Added by ACE_zeus to toggle remote control wind sound + // Added by ace_zeus to toggle remote control wind sound if (GVAR(remoteWind)) then { //--- Play wind cue to all players [format ["wind%1",ceil random 5],"bis_fnc_playsound"] call bis_fnc_mp; diff --git a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf new file mode 100644 index 0000000000..e5433bad27 --- /dev/null +++ b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf @@ -0,0 +1,50 @@ +/* + * Author: SilentSpike + * Contextually removes addons (given in ACE_Curator) from zeus based on their required addon(s) + * + * ACE_Curator format: + * ModuleAddon = "RequiredAddon"; + * OR + * ModuleAddon[] = {"RequiredAddon1","RequiredAddon2",...} + * + * Arguments: + * 0: The zeus logic + * 1: The zeus player + * + * Return Value: + * nil + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic","_removeAddons","_numCfgs","_cfg","_requiredAddon"]; + +if !(isClass (configFile >> "ACE_Curator")) exitWith { ERROR("The ACE_Curator class does not exist") }; + +_logic = _this select 0; +_removeAddons = []; + +_numCfgs = count (configFile >> "ACE_Curator"); +for "_n" from 0 to (_numCfgs - 1) do { + _cfg = (configFile >> "ACE_Curator") select _n; + + if (isArray _cfg) then { + _requiredAddon = getArray _cfg; + { + if !(isClass (configFile >> "CfgPatches" >> _x)) exitWith { + _removeAddons pushBack (configName _cfg); + }; + } forEach _requiredAddon; + }; + + if (isText _cfg) then { + _requiredAddon = getText _cfg; + if !(isClass (configFile >> "CfgPatches" >> _requiredAddon)) then { + _removeAddons pushBack (configName _cfg); + }; + }; +}; + +_logic removeCuratorAddons _removeAddons; diff --git a/addons/zeus/functions/fnc_moduleCaptive.sqf b/addons/zeus/functions/fnc_moduleCaptive.sqf new file mode 100644 index 0000000000..f77f9846a4 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleCaptive.sqf @@ -0,0 +1,45 @@ +/* + * Author: SilentSpike + * Flips the capture state of the unit the module is attached to. + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * ReturnValue: + * nil + * + * Public: no + */ + +#include "script_component.hpp" + +PARAMS_3(_logic,_units,_activated); +private ["_unit","_captive"]; + +if (!_activated) exitWith {}; + +if (isNil QEFUNC(captives,setHandcuffed)) then { + [LSTRING(RequiresAddon)] call EFUNC(common,displayTextStructured); +} else { + _unit = attachedTo _logic; + + if (isNull _unit) then { + [LSTRING(NothingSelected)] call EFUNC(common,displayTextStructured); + } else { + if !(_unit isKindOf "CAManBase") then { + [LSTRING(OnlyInfantry)] call EFUNC(common,displayTextStructured); + } else { + if !(alive _unit) then { + [LSTRING(OnlyAlive)] call EFUNC(common,displayTextStructured); + } else { + _captive = GETVAR(_unit,EGVAR(captives,isHandcuffed),false); + // Event initalized by ACE_Captives + ["SetHandcuffed", _unit, [_unit, !_captive]] call EFUNC(common,targetEvent); + }; + }; + }; +}; + +deleteVehicle _logic; diff --git a/addons/zeus/functions/fnc_moduleSurrender.sqf b/addons/zeus/functions/fnc_moduleSurrender.sqf new file mode 100644 index 0000000000..591b216ad7 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleSurrender.sqf @@ -0,0 +1,49 @@ +/* + * Author: SilentSpike + * Flips the surrender state of the unit the module is attached to. + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * ReturnValue: + * nil + * + * Public: no + */ + +#include "script_component.hpp" + +PARAMS_3(_logic,_units,_activated); +private ["_unit","_surrendering"]; + +if (!_activated) exitWith {}; + +if (isNil QEFUNC(captives,setSurrendered)) then { + [LSTRING(RequiresAddon)] call EFUNC(common,displayTextStructured); +} else { + _unit = attachedTo _logic; + + if (isNull _unit) then { + [LSTRING(NothingSelected)] call EFUNC(common,displayTextStructured); + } else { + if !(_unit isKindOf "CAManBase") then { + [LSTRING(OnlyInfantry)] call EFUNC(common,displayTextStructured); + } else { + if !(alive _unit) then { + [LSTRING(OnlyAlive)] call EFUNC(common,displayTextStructured); + } else { + if (GETVAR(_unit,EGVAR(captives,isHandcuffed),false)) then { + [LSTRING(OnlyNonCaptive)] call EFUNC(common,displayTextStructured); + } else { + _surrendering = GETVAR(_unit,EGVAR(captives,isSurrendering),false); + // Event initalized by ACE_Captives + ["SetSurrendered", _unit, [_unit, !_surrendering]] call EFUNC(common,targetEvent); + }; + }; + }; + }; +}; + +deleteVehicle _logic; diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf new file mode 100644 index 0000000000..2d8bae85e8 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -0,0 +1,45 @@ +/* + * Author: SilentSpike + * Flips the unconscious state of the unit the module is attached to. + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * ReturnValue: + * nil + * + * Public: no + */ + +#include "script_component.hpp" + +PARAMS_3(_logic,_units,_activated); +private ["_unit","_conscious"]; + +if (!_activated) exitWith {}; + +if (isNil QEFUNC(medical,setUnconscious)) then { + [LSTRING(RequiresAddon)] call EFUNC(common,displayTextStructured); +} else { + _unit = attachedTo _logic; + + if (isNull _unit) then { + [LSTRING(NothingSelected)] call EFUNC(common,displayTextStructured); + } else { + if !(_unit isKindOf "CAManBase") then { + [LSTRING(OnlyInfantry)] call EFUNC(common,displayTextStructured); + } else { + if !(alive _unit) then { + [LSTRING(OnlyAlive)] call EFUNC(common,displayTextStructured); + } else { + _conscious = GETVAR(_unit,ACE_isUnconscious,false); + // Function handles locality for me + [_unit, !_conscious, round(random(10)+5), true] call EFUNC(medical,setUnconscious); + }; + }; + }; +}; + +deleteVehicle _logic; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml new file mode 100644 index 0000000000..80d08a3275 --- /dev/null +++ b/addons/zeus/stringtable.xml @@ -0,0 +1,174 @@ + + + + + Zeus Settings + Ustawienia Zeusa + Ajustes Zeus + Nastavení Zeuse + Ajustes do Zeus + + + Provides control over various aspects of Zeus. + Pozwala kontrolować różne aspekty Zeusa. + Proporciona control sobre diversos aspectos de Zeus. + Poskytuje kontrolu na různými aspekty Zeuse. + Proporciona controle sobre diversos aspectos do Zeus. + + + Ascension Messages + Wiad. o nowym Zeusie + Mensajes de ascensión + Zpráva o novém Zeusovi + Mensagens de ascensão + + + Display global popup messages when a player is assigned as Zeus. + Wyświetlaj globalną wiadomość kiedy gracz zostanie przydzielony jako Zeus + Mostrar mensajes emergentes globales cuando a un jugador se le asigna como Zeus. + Zobrazit globální zprávu když je hráč přiřazen jako Zeus. + Mostra uma mensagem popup quando um jogador é atribuido ao Zeus. + + + Zeus Eagle + Orzeł Zeusa + Águila Zeus + Orel Zeuse + Águia do Zeus + + + Spawn an eagle that follows the Zeus camera. + Spawnuj orła, który podąrza za kamerą Zeusa. + Generar un águila que sigue la cámara Zeus. + Vytvoří orla, který následuje kameru Zeuse. + Cria uma águia que segue a câmera do Zeus + + + Wind Sounds + Dźwięki wiatru + Sonidos de viento + Zvuky větru + Sons de vento + + + Play wind sounds when Zeus remote controls a unit. + Odtwarzaj dźwięki wiatru kiedy Zeus zdalnie kontroluje jednostkę. + Reproduce sonidos de viento cuando Zeus controle remotamente una unidad. + Přehrát varování (vítr) když Zeus převezmě kontrolu nad jednotkou. + Reproduz sons de vento quando uma unidade é remotamente controlada pelo Zeus. + + + Ordnance Warning + Ostrz. o ostrzale arty. + Advertencia de artefactos explosivos + Varování před dělostřelectvem + Aviso de explosivos + + + Play a radio warning when Zeus uses ordnance. + Odtwarzaj wiadomość radiową kiedy Zeus używa artylerii. + Reproduce un aviso de radio cuando Zeus utiliza artefactos explosivos. + Přehrát varování (rádio) když Zeus použije dělostřelectvo. + Reproduz uma aviso via rádio quando o Zeus usa um explosivo. + + + Reveal Mines + Pokazuj miny + Revelar minas + Odhalit miny + Revelar minas + + + Reveal mines to allies and place map markers. + Pokazuj znaczniki min dla sojuszników i twórz markery na mapie w miejscu min. + Revelar minas a aliados y establecer marcadores de mapa. + Odhalí miny pro spojence a umístnit jejich značku na mapu. + Revelar minas para aliados e colocar marcadores no mapa. + + + Reveal to Allies + Pokaż dla sojuszników + Revelar a aliados + Odhalit pro spojence + Revelar para aliados + + + Allies + Map Markers + Sojusznicy + markery na mapie + Aliados + Marcas de mapa + Spojenci + Značky na mapě + Aliados + Marcadores no mapa + + + Toggle Captive + Przełącz więźnia + Alternar cautivo + Přepnout - Vězeň + Alternar prisioneiro + + + Toggle Surrender + Przełącz kapitulację + Alternar rendición + Přepnout - Vzdávání + Alternar rendição + + + Toggle Unconscious + Przełącz nieprzytomność + Alternar inconsciencia + Přepnout - Bezvědomí + Alternar inconsciência + + + Unit must be alive + Utiliser uniquement sur une unité vivante + Nur bei lebenden Einheiten verwendbar + Utilizar solo en unidades vivas + Použitelné jen na živé jednotky + Używaj tylko na żywych jednostkach + Применимо только к живым юнитам + Csak élő egységeken használni + Si può fare solo su persone vive + Usar somente em unidades vivas + + + Unit must be infantry + Utiliser uniquement sur du personnel à pied + Nur bei abgesessener Infanterie verwendbar + Utilizar solo en infanteria desmontada + Použitelné jen na pěsích jednotkách + Używaj tylko na piechocie poza wszelkimi pojazdami + Применимо только к пехоте вне техники + Csak járműben kívül lévő egységeken használni + Si può usare solo su fanteria a piedi + Usar somente em infantaria desmontada + + + Unit must not be captive + Jednostka nie może być więźniem + La unidad no debe estar cautiva + Jednotka nemí být vězeň + Unidade não pode ser prisioneira + + + Place on a unit + Rien sous le curseur + Es wurde nichts ausgewählt + Nada bajo el ratón + Coloque em uma unidade + Umístni na jednotku + Nie ma nic pod kursorem + Ничего не выделено + Semmi sincs az egér alatt + Nessuna selezione + + + Requires an addon that is not present + Wymaga addonu, który nie jest obecny + Requiere un addon que no está presente + Vyžaduje addon, který není přítomen + Requer um addon que não está presente + + + \ No newline at end of file diff --git a/addons/zeus/ui/Icon_Module_Zeus_Captive_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_Captive_ca.paa new file mode 100644 index 0000000000..aa7eb0faf8 Binary files /dev/null and b/addons/zeus/ui/Icon_Module_Zeus_Captive_ca.paa differ diff --git a/addons/zeus/ui/Icon_Module_Zeus_Settings_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_Settings_ca.paa new file mode 100644 index 0000000000..58bbe312ce Binary files /dev/null and b/addons/zeus/ui/Icon_Module_Zeus_Settings_ca.paa differ diff --git a/addons/zeus/ui/Icon_Module_Zeus_Surrender_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_Surrender_ca.paa new file mode 100644 index 0000000000..6ddabf4d56 Binary files /dev/null and b/addons/zeus/ui/Icon_Module_Zeus_Surrender_ca.paa differ diff --git a/addons/zeus/ui/Icon_Module_Zeus_Unconscious_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_Unconscious_ca.paa new file mode 100644 index 0000000000..fb179e40fc Binary files /dev/null and b/addons/zeus/ui/Icon_Module_Zeus_Unconscious_ca.paa differ diff --git a/documentation/README_PL.md b/documentation/README_PL.md index d156185908..4d4c36a619 100644 --- a/documentation/README_PL.md +++ b/documentation/README_PL.md @@ -4,29 +4,28 @@

- ACE version + ACE wersja - - ACE download + + ACE pobierz - ACE issues + ACE zagadnienia - - BIF thread + + Temat BIF - ACE license + ACE licencja

Wymaga najnowszej wersji CBA A3. Odwiedź nas na Facebook | YouTube | Twitter | Reddit

- **ACE3** to efekt wspólnego wysiłku grup moderów odpowiedzialnych za **ACE2**, **AGM** oraz **CSE** w celu zwiększenia realizmu i autentyczności Arma 3. Projekt ten jest całkowicie **otwarty źródłowo** i wszelki wkład w rozwój jest mile widziany. Możesz bez przeszkód prowadzić swoją własną dostosowaną wersję, o ile zmiany jakie wprowadzisz będą otwarte dla publiki zgodnie z GNU General Public License ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). @@ -81,4 +80,4 @@ Używaj naszego [Issue Tracker-a](https://github.com/acemod/ACE3/issues) aby zg #### Testowanie i budowanie Aby pomóc nam w testowaniu najnowszych zmian rozwojowych, pobierz nasz master branch ([bezpośrednio](https://github.com/acemod/ACE3/archive/master.zip), lub [korzystając z git](https://help.github.com/articles/fetching-a-remote/)), a następnie złóż testowego build-a: -* [Konfiguracja środowiska do testów](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE do celów testowych. \ No newline at end of file +* [Konfiguracja środowiska do testów](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE do celów testowych. diff --git a/documentation/development/ace3-config-entries.md b/documentation/development/ace3-config-entries.md index c6d9009358..d87ca4145e 100644 --- a/documentation/development/ace3-config-entries.md +++ b/documentation/development/ace3-config-entries.md @@ -51,7 +51,8 @@ ace_gforcecoef ace_protection ace_scopeadjust_horizontal ace_scopeadjust_vertical -ace_scopeadjust_increment +ace_scopeadjust_verticalincrement +ace_scopeadjust_horizontalincrement ace_isusedlauncher ace_attachable ace_range diff --git a/documentation/development/modularity-and-pbo-structure.md b/documentation/development/modularity-and-pbo-structure.md index 4b76f2b357..7e4a926de8 100644 --- a/documentation/development/modularity-and-pbo-structure.md +++ b/documentation/development/modularity-and-pbo-structure.md @@ -7,13 +7,13 @@ parent: wiki order: 4 --- -### Modularity +## 1. Modularity Main principles: - As much stuff as possible should be modular - Strive to make as much stuff as possible run-time togglable. Adding/removing PBOS would still be requiring to toggle any feature relying on config changes. -### PBO Structure +## 2. PBO Structure Main principles: @@ -29,3 +29,14 @@ Main -> Common -> Config things Main -> Common -> 3D Models | Interaction | -> Feature ``` + +## 3. Optional .PBOs for 3rd Party Mods + +- ACE3 policy is to NOT take care of compatibility with third party addons single handely. The current compatible .PBOs were kickstarted by the ACE3 team as an example to mod creators so it's clear which entries are needed for compatibility. The authors of those addons have been contacted and many of those pbos are due to be included in their respective mods eventually. + +
+
Notice for 3rd party mod creators:
+

Most of the config entries are inert if ACE3 is not present, so addons can be made ACE3 compatible without explicitly requiring ACE3. However, for addons that are not inert (for example, scope configs), it is best to create and distribute compatibility .PBOs along with the original mod content; feel free to consult with ACE3 devs about how to correctly implement this. All existing compatibility .PBOs are examples and thus no further compatibility .PBOs will be provided by the ACE3 team.

+
+ + diff --git a/documentation/development/setting-up-the-development-environment.md b/documentation/development/setting-up-the-development-environment.md index 9a2880b319..5264760785 100644 --- a/documentation/development/setting-up-the-development-environment.md +++ b/documentation/development/setting-up-the-development-environment.md @@ -17,8 +17,8 @@ This page describes how you can setup your development environment for ACE3, all - A properly setup P-drive - Run ArmA 3 and Arma 3 Tools directly from steam once to install registry entries (and again after every update) - Python 3.x, available [here](http://www.python.org) -- The following Mikero Tools (available [here](https://dev.withsix.com/projects/mikero-pbodll/files)): DePBO, Rapify, MakePBO, PBOProject -- A properly setup PATH variable (containing Python and the Mikero tools) +- The following Mikero Tools (available [here](https://dev.withsix.com/projects/mikero-pbodll/files)): DePBO, DeOgg, Rapify, MakePBO, PBOProject +- A properly setup PATH variable (containing Python ,the Mikero tools and git) ## 2. Why so complicated? diff --git a/documentation/feature/advanced_ballistics.md b/documentation/feature/advanced_ballistics.md index d84f2b69b2..70123a0320 100644 --- a/documentation/feature/advanced_ballistics.md +++ b/documentation/feature/advanced_ballistics.md @@ -9,8 +9,8 @@ parent: wiki ## 1. Overview The Advanced Ballistics module improves internal and external ballistics. -## 2. Features -- Drag modeling based on real-world ballistic coefficients. +## 1.1 Features +- Drag modelling based on real-world ballistic coefficients. - Ambient air density (air pressure, temperature, humidity) affects drag. - Wind affects drag and deflects the trajectory. - Wind speed varies with altitude. @@ -22,10 +22,10 @@ The Advanced Ballistics module improves internal and external ballistics. - Bullet trace effect for supersonic bullets (light refraction due to air pressure waves). - A protractor for quickly measuring the inclination angle. -## 3. Usage +## 2. Usage + +### 2.1 Protractor Press Ctrl+Shift+K while using a compatible weapon to toggle the protractor. The red line indicates the current inclination angle in degrees. The protractor will disappear if you lower or holster your weapon. -This module uses relatively complex scripting. Several options are provided in the ACE menu to reduce the performance impact of this module. - -## Dependencies +## 3. Dependencies `ace_ballistics`, `ace_weather`, `ace_modules` diff --git a/documentation/feature/ai.md b/documentation/feature/ai.md index 00ef799531..afc6194644 100644 --- a/documentation/feature/ai.md +++ b/documentation/feature/ai.md @@ -1,6 +1,6 @@ --- layout: wiki -title: AI (Artifical Intelligence) +title: AI (Artificial Intelligence) description: Config based changes to AI to ensure compatibility with advanced AI modifications group: feature order: 5 @@ -10,21 +10,21 @@ parent: wiki ## 1. Overview ### 1.1 Adjusted AI skill values -The idea here is to reduce the AI's godlike aiming capabilties while retaining it's high intelligence. The AI should be smart enough to move through a town, but also be 'human' in their reaction time and aim. -Note: All these values can still be adjusted via scripts, these arrays just change what 0 & 1 are for setSkill. +The idea here is to reduce the AI's godlike aiming capabilities while retaining its high intelligence. The AI should be smart enough to move through a town, but also be 'human' in their reaction time and aim. + +*Note: All these values can still be adjusted via scripts, these arrays just change what 0 & 1 are for `setSkill`.* ### 1.2 Firing in burst mode AI will now use the automatic mode of their weapons at short distances, instead of always relying on firing single shots in quick succession. ### 1.3 Longer engagement ranges -The maximum engagement ranges are increased: AI will fire in bursts with variable length on high ranges of 500 - 700 meters, depending on their weapon and optic. +The maximum engagement ranges are increased: AI will fire in bursts with variable lengths on high ranges of 500 - 700 meters, depending on their weapon and optic. -### 1.4 No deadzones in CQB +### 1.4 No dead zones in CQB Some weapons had minimum engagement ranges. If you were as close as 2 meters to an AAF soldier, he wouldn't open fire, because the AI couldn't find any valid fire mode for their weapon. ACE3 removes this behaviour mostly notable in CQB by adding a valid firing mode. ### 1.5 No scripting -All changes of ACE3 AI are config based to ensure full compatibility with advanced AI modifications like ASR AI. - +All changes of ACE3 AI are config based to ensure full compatibility with advanced AI modifications like e.g. "ASR AI 3". ## 2. Dependencies diff --git a/documentation/feature/aircraft.md b/documentation/feature/aircraft.md index 7519c5c130..25f4e52cad 100644 --- a/documentation/feature/aircraft.md +++ b/documentation/feature/aircraft.md @@ -1,7 +1,7 @@ --- layout: wiki title: Aircraft -description: Changes the flight behaviour of various aircraft +description: Aircraft overhaul group: feature order: 5 parent: wiki @@ -32,12 +32,10 @@ Adds a laser marker to the copilot seat of the Wildcat. ### 1.7 HUD for AH-9 Adds a HUD to the AH-9 based on the Comanche's HUD. - ## 2. Usage ### 2.1 Switching flare modes -- ctrl+c (by default) - +Press CTRL+C to switch between flare firing modes (Arma 3 default key bind `countermeasure mode`) ## 3. Dependencies diff --git a/documentation/feature/apl.md b/documentation/feature/apl.md index c0705a2abe..c526935143 100644 --- a/documentation/feature/apl.md +++ b/documentation/feature/apl.md @@ -1,25 +1,15 @@ --- layout: wiki title: APL -description: +description: assets under APL license group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. -### Sub-feature 2 -Short description of sub-feature 2. +This folder regroups all assets released under the APL license. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_main` diff --git a/documentation/feature/attach.md b/documentation/feature/attach.md index 22820f1e7a..a248f8657f 100644 --- a/documentation/feature/attach.md +++ b/documentation/feature/attach.md @@ -1,7 +1,7 @@ --- layout: wiki title: Attach -description: Allows players to attach items to objects +description: Allow players to attach items to vehicles or themselves group: feature parent: wiki --- @@ -11,26 +11,23 @@ parent: wiki ### 1.1 Attach items to uniform Allows players to attach IR grenades and chemlights to themselves. - ### 1.2 IR Strobe Adds an attachable IR strobe, which is only visible using night vision devices and offers better visibility than IR grenades. - ## 2. Usage ### 2.1 Attaching to yourself -- Self interact left windows . -- Choose `equipment`. -- Choose `attach item`. +- Use Self Interact CTRL+⊞ Win (ACE3 default). +- Select `Equipment`. +- Select `Attach item`. - Select which item you want to attach. -- Repeat to detach. +- Repeat the process to detach. -### 2.2 attaching to a vehicle -- Interact with the vehicle ctrl+left windows . -- Choose `attach item`. +### 2.2 Attaching to a vehicle +- Interact with the vehicle ⊞ Win (ACE3 default). +- Select `Attach item`. - Select your item and follow the instructions on the screen. -- Repeat to detach. - +- Repeat the process to detach. ## 3. Dependencies diff --git a/documentation/feature/backpacks.md b/documentation/feature/backpacks.md index 9fcfce6b3b..426f39d18a 100644 --- a/documentation/feature/backpacks.md +++ b/documentation/feature/backpacks.md @@ -9,7 +9,7 @@ parent: wiki ## 1. Overview ### 1.1 Zipping sounds -A zipper sound rings out when someone tries to open your backpack. This helps to prevent banana theft. +A zipper sound is played when someone opens your backpack. ## 2. Dependencies diff --git a/documentation/feature/ballistics.md b/documentation/feature/ballistics.md index 6df71050ff..1e453271fb 100644 --- a/documentation/feature/ballistics.md +++ b/documentation/feature/ballistics.md @@ -12,27 +12,20 @@ parent: wiki ### 1.1 Realistic ballistics Changes include adjusted muzzle velocity, air friction and dispersion based on real life values. -### 1.2 Weaker body armor -Decreases protection values of vests, CSAT uniforms and various campaign only gear to better represent realism. - -### 1.3 Realistic silencers and subsonic ammunition +### 1.2 Realistic silencers and subsonic ammunition Silencers no longer decrease the muzzle velocity and are generally less effective when used with normal ammunition. They now only remove the muzzle blast and flash. To prevent the crack caused by supersonic projectiles, ACE3 introduces subsonic ammunition for the 7.62mm caliber. This is also fully compatible with AI. -### 1.4 Flash suppressors -Flash suppressors are similar to sound suppressors and prevent the muzzle flash from reducing visibility without decreasing combat effectiveness. Flash suppressors are available for the calibers 5.56mm, 6.5mm, 7.62mm, .45 ACP and 9mm. +### 1.3 Armor piercing ammunition +Armor piercing rounds have higher penetration values against light armored targets and other obstacles on the battlefield. Their drawback is a slightly decreased man-stopping power. AP rounds are available in multiple calibers including 5.56mm and 7.62mm. -### 1.5 Armour piercing ammunition -Armour piercing rounds have higher penetration values against light armoured targets and other obstacles on the battlefield. Their drawback is a slightly decreased man-stopping power. AP rounds are available in multiple calibers incudling 5.56mm and 7.62mm. +### 1.4 IR-Dim tracer ammunition +IR-Dim ammunition is similar to tracer rounds, but these tracers are only visible using night vision devices. -### 1.6 IR-Dim tracer ammunition -IR-Dim ammunition is similar to tracer rounds, but their tracers are only visible using night vision devices. - -### 1.7 M118 long range ammunition +### 1.5 M118 long range ammunition The M14 EBR now uses ammunition with decreased muzzle velocity and air friction to improve precision and energy retention at long ranges. -### 1.8 Fully config-based -This module uses configuration changes only and does not decrease game performance. - +### 1.6 Fully config-based +This module applies configuration changes only and does not decrease game performance. ## 2. Dependencies diff --git a/documentation/feature/captives.md b/documentation/feature/captives.md index af68e2af1e..33b7ec3739 100644 --- a/documentation/feature/captives.md +++ b/documentation/feature/captives.md @@ -9,7 +9,7 @@ parent: wiki ## 1. Overview ### 1.1 Take captives -Introduces a captivity system for taking and moving prisoners. +Introduces a captivity system. ### 1.2 Load and unload captives into / from vehicles You can load and unload captives from vehicles using ACE3 interactions. @@ -18,27 +18,29 @@ You can load and unload captives from vehicles using ACE3 interactions. You can frisk a restrained captive. ### 1.4 Surrendering -You can surrender. While surrendering AI will cease fire. - +Allows players to surrender. It renders the unit unable to move and with the hands behind its head. When surrendered AI won't fire. ## 2. Usage -### 2.1 Capturing someone -- You need `cable ties`. -- Approach the victim / convict and use the interaction button left windows (by default). -- The interaction is around the hands in the form of a handcuffs icon. -- To free someone simply use that icon again. +### 2.1 Taking a unit into captivity +- You need `Cable Tie`. +- Approach the unit and Interact ⊞ win (ACE3 default). +- The interaction is located around the hands in the form of a handcuffs icon. +- Repeat to release. ### 2.2 Escorting a captive -- Interact with the captive left windows (by default). -- Select the escort prisoner option. -- To stop escorting just scroll down and select `release` or use self interaction ctrl+left windows (by default) and select `release`. +- Interact with the captive ⊞ win. +- Select the `Escort prisoner` option. +- To stop escorting, use the mousewheel and select `Release` or use Self Interaction CTRL+⊞ win and select `Release`. ### 2.3 Loading and unloading a captive into/from a vehicle -- Escort the person. -- Approach the vehicle you desire to load the captive in. -- Interact with the vehicle left windows (by default) and load him. -- Same for unloading, interact with the vehicle then unload. +- Escort the captive. +- Approach the vehicle you wish to load the captive unit into. +- Interact with the vehicle ⊞ win and select `Load captive`. +- To unload the captive interact with the vehicle ⊞ win +- Select `Passengers`. +- Select the captive. +- Select `Unload captive`. ## 3. Dependencies diff --git a/documentation/feature/common.md b/documentation/feature/common.md index 6a1dba0aa1..2929f6b335 100644 --- a/documentation/feature/common.md +++ b/documentation/feature/common.md @@ -1,18 +1,17 @@ --- layout: wiki title: Common -description: +description: Common functions and systems used by most other components. group: feature parent: wiki --- -## Overview +## 1. Overview -Module that provides common features required by many other modules. +Common functions and systems used by most other components. - -## Dependencies +## 2. Dependencies `ace_main` -Note: The Common module is required by many other modules. Disabling it is not recommended. +*Note: The Common module is required by nearly all other modules. Do NOT remove it!* diff --git a/documentation/feature/concertina_wire.md b/documentation/feature/concertina_wire.md new file mode 100644 index 0000000000..0c0cdb3ab6 --- /dev/null +++ b/documentation/feature/concertina_wire.md @@ -0,0 +1,22 @@ +--- +layout: wiki +title: concertina wire +description: +group: feature +parent: wiki +--- + +## 1. Overview + +A concertina wire is a type of barbed wire formed in large coils that can be expanded to form obstacles, in ACE3 any vehicle making contact with it get it's tires destroyed. + +## 2. Usage + +### 2.1 Deploying the concertina wire +- Approach the concertina coil and select ⊞ Win (ACE3 default) +- Select `Deploy concertina wire`. +- Follow the instructions on screen. + +## 3. Dependencies + +`ace_apl` , `ace_interaction` diff --git a/documentation/feature/dagr.md b/documentation/feature/dagr.md new file mode 100644 index 0000000000..e4b350295c --- /dev/null +++ b/documentation/feature/dagr.md @@ -0,0 +1,14 @@ +--- +layout: wiki +title: Dagr +group: feature +parent: wiki +--- + +## 1. Overview + +Adds the Defense Advanced GPS Receiver. + +## 3. Dependencies + +`ace_weather` \ No newline at end of file diff --git a/documentation/feature/difficulties.md b/documentation/feature/difficulties.md index 97bf5de4b4..bc48994e81 100644 --- a/documentation/feature/difficulties.md +++ b/documentation/feature/difficulties.md @@ -1,7 +1,7 @@ --- layout: wiki title: Difficulties -description: +description: Tweak to Vanilla hardest difficulty group: feature parent: wiki --- @@ -9,7 +9,7 @@ parent: wiki ## 1. Overview ### 1.1 Elite mode adjustments -Adjusts the default settings for the hardest difficulty to more closely resemble A2 settings. (No crosshair, stat screen, death messages...) +Adjusts the default settings of the hardest difficulty to better resemble Arma 2 settings (no crosshair, stat screen, death messages). ## 2. Dependencies diff --git a/documentation/feature/disarming.md b/documentation/feature/disarming.md index ef9bb74c42..02b8dc2163 100644 --- a/documentation/feature/disarming.md +++ b/documentation/feature/disarming.md @@ -8,15 +8,15 @@ parent: wiki ## 1. Overview -### 1.1 Searching someone -You can search the inventory and disarm someone that is unconscious or captive. - +### 1.1 Searching through a unit's inventory +You can search the inventory and disarm captured or unconscious units. ## 2. Usage -### 2.1 Disarming someone -- Interact with the person that is unconscious or captive ctrl+left windows . -- Select `open inventory`. +### 2.1 Searching and disarming +- Interact with the captured or unconscious unit ⊞ Win (ACE3 default key bind `Interaction Key`). +- Select `Open inventory`. +- Drag & Drop the items you wish to remove from the unit. ## 3. Dependencies diff --git a/documentation/feature/disposable.md b/documentation/feature/disposable.md index 5b79ae3481..c60ae729cf 100644 --- a/documentation/feature/disposable.md +++ b/documentation/feature/disposable.md @@ -1,15 +1,14 @@ --- layout: wiki title: Disposable -description: +description: Makes NLAW disposable and allows addons to do the same group: feature parent: wiki --- ## 1. Overview -### 1.1 NLAW disposable anti tank weapon -Makes the NLAW disposable and provides the tools for other addons to do the same. +The NLAW is shoulder fired and disposable, firing just once before being needed to be disposed of. This feature makes the NLAW disposable and provides the tools for other addons to do the same. ## 2. Dependencies diff --git a/documentation/feature/dragging.md b/documentation/feature/dragging.md index df699bbe8f..e3fdf0b6fe 100644 --- a/documentation/feature/dragging.md +++ b/documentation/feature/dragging.md @@ -1,28 +1,22 @@ --- layout: wiki title: Dragging -description: +description: Adds the option to drag and carry units and objects group: feature parent: wiki --- ## 1. Overview -### 1.1 Dragging and carrying -This adds the option to drag or carry people or objects. +This adds the option to drag or carry units or objects. ## 2. Usage -### 2.1 Dragging / carrying a person -- You can only drag or carry an unconscious / injured person -- Interact with the person left windows (by default) -- Choose `drag`or `carry` -- To release someone scroll down and use `release` or self interact ctrl+left windows (by default) and `release` - -### 2.2 dragging / carrying an object -- Interact with the Object left windows (by default) -- Chose `drag`or `carry` -- To release an object scroll down and use `release` or self interact ctrl+left windows (by default) and `release` +### 2.1 Dragging / Carrying units and objects +- You can only drag or carry an unconscious unit. +- Interact with the unit or object ⊞ Win (ACE3 default key bind `Interact Key`). +- Select `Drag` or `Carry`. +- To release, use the mouse wheel and select `Release` or use Self Interaction CTRL+⊞ Win and select `Release`. ## 3. Dependencies diff --git a/documentation/feature/explosives.md b/documentation/feature/explosives.md index de3500a9d3..a88b9ae1b4 100644 --- a/documentation/feature/explosives.md +++ b/documentation/feature/explosives.md @@ -1,7 +1,7 @@ --- layout: wiki title: Explosives -description: +description: Adds numerous improvements to using and handling explosives group: feature parent: wiki --- @@ -11,29 +11,29 @@ parent: wiki ### 1.1 Advanced explosives placement Enables more precise placement of explosives. -### 1.2 More trigger types +### 1.2 Numerous trigger types Offers different trigger types, like clackers and dead man switches. -### 1.3 Attack explosives to vehicles +### 1.3 Attach explosives to vehicles Enables attaching explosives to vehicles. ## 2. Usage ### 2.1 Placing explosives -- Use self interaction ctrl + left windows (by default) -- Navigate to `explosives` -- Choose your explosive type and follow the instructions on the screen +- Use self interaction CTRL+⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Select `Explosives`. +- Choose your explosive type and follow the instructions on the screen. ### 2.2 Arming and detonating explosives -- Interact with the explosive left windows (by default) -- Choose the arming method -- For clackers `self interact` -> `explosives` -> `detonate` +- Interact with the explosive ⊞ Win (ACE3 default key bind `Interact Key`). +- Choose the arming method. +- For clackers use Self Interaction `Explosives` → `Detonate` and choose the corresponding Firing Device. ### 2.3 Defusing explosives -- A `defusal kit`is needed -- Interact with the explosive left windows (by default) -- Then choose `disarm` -- You are now free to pick it up. +- A `Defusal Kit` is required. +- Interact with the explosive ⊞ Win. +- Select `Disarm`. +- You are safe to pick it up after the action has completed. ## 3. Dependencies diff --git a/documentation/feature/fcs.md b/documentation/feature/fcs.md index 6ac4353599..b66cad8522 100644 --- a/documentation/feature/fcs.md +++ b/documentation/feature/fcs.md @@ -17,20 +17,20 @@ Changes the default rangefinders, including those in vehicles, to require manual ### 1.3 Air burst ammunition Anti air cannons can now use airburst ammunition. It will explode on the FCS' zeroed in range. - ## 2. Usage ### 2.1 Engaging moving targets - - Place the crosshair on the enemy vehicle. -- Press and hold tab (by default) and follow the target for about 2 seconds. -- Release tab -- The optic is now adjusted sideways to ensue a hit. +- Press and hold TAB (ACE 3 default key bind `Lock Target [Hold]`) and follow the target for about 2 seconds. +- Release TAB. +- The optic is now adjusted sideways to ensure a hit. ### 2.2 Ranging stationary targets - - Place the crosshair on the object to range. -- Tap tab (by default) the optic is now adjusted. +- Tap TAB +- The optic is now adjusted. + +*NOTE: GBU guidance is **DISABLED** as of ACE3 3.0.1* ## 3. Dependencies diff --git a/documentation/feature/flashsuppressors.md b/documentation/feature/flashsuppressors.md index eebf908369..82696fcc91 100644 --- a/documentation/feature/flashsuppressors.md +++ b/documentation/feature/flashsuppressors.md @@ -8,7 +8,9 @@ parent: wiki ## 1. Overview -Adds flash suppressors, they reduce the muzzle flash of your weapon. +This adds the ability to use the flash suppressors that are already in game but not accessible. + +Flash suppressors are devices that reduce the muzzle flash while firing by cooling or dispersing the burning gases that exit the muzzle. Its intent is to reduce the chances that the shooter will be blinded in low-light shooting conditions as well as reducing the intensity of the flash visible to the enemy. ## 2. Dependencies diff --git a/documentation/feature/fonts.md b/documentation/feature/fonts.md new file mode 100644 index 0000000000..bf40e5ed2d --- /dev/null +++ b/documentation/feature/fonts.md @@ -0,0 +1,15 @@ +--- +layout: wiki +title: Fonts +group: feature +parent: wiki +--- + +## 1. Overview + +This module adds a font that will be used in the future, characters with equal widths to make it easy to structure correctly. This is **NOT** present in 3.1.1 because of a bug even if it's present in the sources. + + +## 3. Dependencies + +`ace_main` \ No newline at end of file diff --git a/documentation/feature/goggles.md b/documentation/feature/goggles.md index 17e9670d1b..2e4dfce54d 100644 --- a/documentation/feature/goggles.md +++ b/documentation/feature/goggles.md @@ -9,15 +9,13 @@ parent: wiki ## 1. Overview ### 1.1 Visual Effects for eyewear -Adds color tint to sunglasses and other eyewear. Causes raindrops to appear on -the screen in rain. Causes dirt to appear on the screen when dirt is kicked up -nearby (e.g. explosions, rotor wash, bullet impacts, muzzle blast). +Adds color tint to sunglasses and other eyewear. Causes raindrops to appear on the screen in rain. Causes dirt to appear on the screen when dirt is kicked up nearby (e.g. explosions, rotor wash, bullet impacts, muzzle blast). ## 2. Usage ### 2.1 Cleaning your goggles --To clean your goggles press shift+alt+T(default keybind) +- To clean your goggles press SHIFT + ALT + T(ACE3 deault key bind `Wipe goggles`) ## 3. Dependencies diff --git a/documentation/feature/grenades.md b/documentation/feature/grenades.md index 4cfe023e1f..fc6a8641f3 100644 --- a/documentation/feature/grenades.md +++ b/documentation/feature/grenades.md @@ -15,18 +15,16 @@ Provides different modes for throwing grenades (high throw, precision throw and Adds throwable hand flares in the colors white, red, green and yellow. Additionally buffs existing flares by making them brighter and last longer. ### 1.3 M84 stun grenade -Adds stun grenade. This will also affect AI. - +Adds the M84 stun grenade. The stun effect will also affect AI. ## 2. Usage ### 2.1 Switching between throw modes -- Press 8 (by default) +- Press 8 (ACE3 default key bind `Switch Grenade Mode`) ### 2.2 Switching between grenades -- Press 6 (by default) to switch between `LETHAL` grenades -- Press 7 (by default) to switch between `NON LETHAL` grenades - +- Press 6 (ACE3 default key bind `Select frag`) to switch between `LETHAL` grenades +- Press 7 (ACE3 default key bind `Select non-frag`) to switch between `NON LETHAL` grenades ## 3. Dependencies diff --git a/documentation/feature/hearing.md b/documentation/feature/hearing.md index 01b8100bb1..5389f0c3d5 100644 --- a/documentation/feature/hearing.md +++ b/documentation/feature/hearing.md @@ -12,19 +12,18 @@ parent: wiki Introduces hearing damage caused by nearby explosions and large-caliber weapons. ### 1.2 Earplugs -Adds ear plugs to mitigate that effect. Soldiers with high caliber weapons or +Adds earplugs to mitigate that effect. Soldiers with high caliber weapons or missile launchers will be equipped with those, but remember to put them in. - ## 2. Usage ### 2.1 Equipping earplugs -- For this you obviously need `Ear plugs`. -- Press the self interaction key ctrl+left windows (by default). -- Select `equipment`. +- For this you need the `Earplugs` item. +- Press the self interaction key CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Select `Equipment`. - Select `Earplugs in`. - Same method to remove them but the option is `Earplugs out`. -- Note that you CAN re-use ear plugs. +- Note: you're able to re-use earplugs. ## 3. Dependencies diff --git a/documentation/feature/hitreactions.md b/documentation/feature/hitreactions.md index fae394fa73..919c09e9f6 100644 --- a/documentation/feature/hitreactions.md +++ b/documentation/feature/hitreactions.md @@ -10,7 +10,7 @@ parent: wiki ### 1.1 Falling under fire If a unit is shot while running it falls to the ground in a prone position, the area where the shot lands does not matters. -Note that the shot needs to inflict a certain amout of damage to make the unit fall, a small cut won't make the unit stumble. +Note that the shot needs to inflict a certain amount of damage to make the unit fall, a small cut won't make the unit stumble. ## 2. Dependencies diff --git a/documentation/feature/huntIR.md b/documentation/feature/huntIR.md new file mode 100644 index 0000000000..e4e690dac3 --- /dev/null +++ b/documentation/feature/huntIR.md @@ -0,0 +1,42 @@ +--- +layout: wiki +title: HuntIR +group: feature +parent: wiki +--- + +## 1. Overview + +### 1.1 The HuntIR +The **H**igh altitude **U**nit **N**avigated **T**actical **I**maging **R**ound (HuntIR) is designed to be fired from a grenade launcher. After being fired in the air the in built parachute will be deployed and the IR CMOS camera will activate, providing a video stream until it touches the ground or get shot down. + +## 2. Usage +NOTE: the HuntIR round doesn't work with modded weapons without a compatibility fix made either by the ACE3 team or the mod team. + +### 2.1 Using the HuntIR +- To be able to connect to the IR CMOS camera you'll need a `HuntIR monitor`. +- Fire the HuntIR round as high as possible over the area you want to observe. +- Open the `HuntIR monitor`. + - To open the `HuntIR monitor` self interact CTRL + ⊞ Win (ACE3 default) + - Select `Equipment`. + - Select `Activate HuntIR monitor`. +- You now have control of the IR CMOS camera to close the monitor press ESC or ⊞ Win + +### 2.2 IR CMOS camera controls + +Shortcut | Action +------------ | ------------- +A | Lower zoom level +D | Increase zoom level +N | Toggle NV and TI modes +S | Next camera +W | Previous camera + | Rotate camera anticlockwise +| Rotate camera clockwise + | Raise camera + | Lower camera +R | Reset camera + +## 3. Dependencies + +`ace_common` \ No newline at end of file diff --git a/documentation/feature/interact_menu.md b/documentation/feature/interact_menu.md index e66ea95406..d0635ae7ef 100644 --- a/documentation/feature/interact_menu.md +++ b/documentation/feature/interact_menu.md @@ -14,4 +14,4 @@ This handles the interaction layer of ACE3. `ace_common` -Note: The Interact Menu module is required by many other modules. Disabling it is not recommended. +*Note: The Interact Menu module is required by most of the other modules. Do NOT remove it!* diff --git a/documentation/feature/interaction.md b/documentation/feature/interaction.md index bd96771788..e4e28f23c9 100644 --- a/documentation/feature/interaction.md +++ b/documentation/feature/interaction.md @@ -14,4 +14,4 @@ This provides interaction options between units. `ace_interact_menu` -Note: The Interaction module is required by many other modules. Disabling it is not recommended. +*Note: The Interaction module is required by most of the other modules. Do NOT remove it!* diff --git a/documentation/feature/inventory.md b/documentation/feature/inventory.md index 20aa5204a2..53f126dc2a 100644 --- a/documentation/feature/inventory.md +++ b/documentation/feature/inventory.md @@ -1,7 +1,7 @@ --- layout: wiki title: Inventory -description: +description: group: feature parent: wiki --- @@ -11,17 +11,15 @@ parent: wiki ### 1.1 Resized inventory UI Makes the inventory dialog bigger and increases the number of items that can be seen in the list at once. - ## 2. Usage ### 2.1 Changing the size of the UI -- Press escape . +- Press Escape. - Click on `ACE OPTIONS` on the top left corner of the screen. - Click on `Make Inventory Display Bigger`. - Choose the size desired on the right drop down menu. - Press the `Close` button, your changes are automatically saved. - ## 3. Dependencies `ace_common` diff --git a/documentation/feature/javelin.md b/documentation/feature/javelin.md index be31f65e91..8cf59c0a08 100644 --- a/documentation/feature/javelin.md +++ b/documentation/feature/javelin.md @@ -14,21 +14,19 @@ The locking capabilities of the Titan and Javelin got improved, you can now lock ### 1.2 Fire mode switching The Titan / Javelin now posses the ability to be used in top down attack or direct. - ## 2. Usage ### 2.1 Locking with the Titan / Javelin - For this feature you need to have a compatible launcher. -- Fully zoom with the launcher. -- Switch to thermals n (by default). -- While keeping your aim steadily on target press and hold tab . -- When the sound changes and a cross appears on the screen it's time to fire. +- Fully zoom in with the launcher. +- Switch to thermals N (Arma 3 default key bind `Night vision`). +- While keeping your aim steadily on target press and hold TAB (ACE3 default key bind `Lock Target [Hold]`). +- When the sound changes and a cross appears on the screen the target is locked and you're able to fire. ### 2.2 Switching fire mode - For this feature you need to have a compatible launcher. -- When aiming with your launcher press ctrl+tab (by default). -- On the right side of the screen (for most launchers) you should see that `TOP`is now in green that means that your missile will be fired in top down mode. - +- When aiming with your launcher press CTRL + TAB. +- On the right side of the screen (for most launchers) you should see that `TOP`is now illumiated in green which means that your missile will be fired in top down mode. ## 3. Dependencies diff --git a/documentation/feature/laser_selfdesignate.md b/documentation/feature/laser_selfdesignate.md index 9130cc797e..dd3b25bc36 100644 --- a/documentation/feature/laser_selfdesignate.md +++ b/documentation/feature/laser_selfdesignate.md @@ -8,7 +8,7 @@ parent: wiki ## 1. Overview -Allows gunners to lase their own targets. See [FCS] (http://ace3mod.com/wiki/feature/fcs.html) for more information. +Allows gunners to lase their own targets. See [Feature: "FCS"]({{ site.productionUrl }}/wiki/feature/fcs.html) for more information. ## 2. Dependencies diff --git a/documentation/feature/laserpointer.md b/documentation/feature/laserpointer.md index ee6d566733..d6f38df99f 100644 --- a/documentation/feature/laserpointer.md +++ b/documentation/feature/laserpointer.md @@ -1,7 +1,7 @@ --- layout: wiki title: Laser Pointer -description: +description: Switching laser modes, daylight lasers group: feature parent: wiki --- @@ -9,13 +9,13 @@ parent: wiki ## 1. Overview ### 1.1 Visible light laser -ACE3 adds visible light laser. This feature is compatible with BI's lasers as well as supported modded ones. +ACE3 adds a visible laser attachment for weapons. This feature is compatible with BI's lasers as well as supported modded ones. ## 2. Usage ### 2.1 Switching laser mode - For this feature you need to have a compatible side attachment. -- Press ctrl+L (by default). +- Press Ctrl + L (ACE3 default key bind `Switch Laser / IR Laser`). - A hint indicating the mode switch will appear in the top right corner. ## 3. Dependencies diff --git a/documentation/feature/logistics_uavbattery.md b/documentation/feature/logistics_uavbattery.md index a63a13cf4e..2920d4b7a4 100644 --- a/documentation/feature/logistics_uavbattery.md +++ b/documentation/feature/logistics_uavbattery.md @@ -1,7 +1,7 @@ --- layout: wiki title: Logistics - UAV Battery -description: +description: UAV recharging group: feature parent: wiki --- @@ -9,13 +9,14 @@ parent: wiki ## 1. Overview ### 1.1 Rechargeable darters. -Adds an item `ACE_UAVBattery` that allows refuelling/recharging of the "Darter" quadcopter UAVs. +Adds an item `ACE_UAVBattery` that allows refuelling / recharging of the "Darter" quad-copter UAVs. ## 2. Usage ### 2.1 Recharging the darter -- For this you need a `UAV battery` and the UAV needs to be a quadcopter. -- INTERACTION LAYER NOT IMPLEMENTED YET TO BE COMPLETED. +- For this you need a `UAV battery` and the UAV needs to be a quad-copter. +- Interact with the UAV ⊞ Win (ACE3 default key bind `Interact Key`) +- Select `Recharge` ## 3. Dependencies diff --git a/documentation/feature/logistics_wirecutter.md b/documentation/feature/logistics_wirecutter.md index db93c85836..077e3b48cb 100644 --- a/documentation/feature/logistics_wirecutter.md +++ b/documentation/feature/logistics_wirecutter.md @@ -9,15 +9,15 @@ parent: wiki ## 1. Overview ### 1.1 Wirecutter -Adds an item `ACE_wirecutter` that allows cutting of fences in A3 and AiA maps. +Adds an item `ACE_wirecutter` that allows cutting of fences in Arma 3 and AllInArma maps. ## 2. Usage ### 2.1 Using the wirecutter - For this you need a `Wirecutter`. - Approach the fence you want to cut. -- Press the interaction key left windows (by default). -- Find the interaction point and select `cut fence` (the only option). +- Press the interaction key ⊞ Win (ACE3 default key bind `Interaction Key`). +- Find the interaction point and select `Cut Fence` (the only option). ## 3. Dependencies diff --git a/documentation/feature/magazinerepack.md b/documentation/feature/magazinerepack.md index cc78dd1a00..191f12d2b7 100644 --- a/documentation/feature/magazinerepack.md +++ b/documentation/feature/magazinerepack.md @@ -1,7 +1,7 @@ --- layout: wiki title: Magazine Repack -description: +description: Repacking magazines, and maybe your bananas. group: feature parent: wiki --- @@ -11,12 +11,11 @@ parent: wiki ### 1.1 Repacking magazines Adds the ability to repack magazines of the same type. - ## 2. Usage ### 2.1 Repacking - For this you need multiple half empty mags of the same type. -- Press the self interaction button ctrl+left windows (by default). +- Press the self interaction button CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Repack magazines`. - Select the type of magazines you want to repack. diff --git a/documentation/feature/main.md b/documentation/feature/main.md index 3bfecf852a..a745f01e3b 100644 --- a/documentation/feature/main.md +++ b/documentation/feature/main.md @@ -1,18 +1,17 @@ --- layout: wiki title: Main -description: +description: main module group: feature parent: wiki --- ## 1. Overview -Main module which acts as the ACE core module. - +Main module which acts as the ACE3 core module. ## 2. Dependencies -`Arma 3` and `CBA (RC6 minimum)` +`Arma 3` and `CBA_A3` -Note: The Main module is required by all other modules. Do not disable it! +*Note: The Main module is required by all other modules. Do not remove it!* diff --git a/documentation/feature/map.md b/documentation/feature/map.md index b9dbb53c3b..2feafa9350 100644 --- a/documentation/feature/map.md +++ b/documentation/feature/map.md @@ -1,7 +1,7 @@ --- layout: wiki title: Map -description: +description: Map improvements group: feature parent: wiki --- @@ -15,13 +15,13 @@ Better map styling (contours, legend, hiding bushes and trees, etc). The mission maker / server owner can restrict the maximum zoom level of the map. ### 1.3 Map shake (optional) -While walking your map will move all around the place. +While walking your map will move slightly. ### 1.4 Map illumination (optional) -The map illumination will be the same as your surroundings meaning that in a dark night you'll either need a lightsource or NVGs to see your map. +The map illumination will be the same as your surroundings meaning that in a dark night you'll either need a light source or NVGs to see your map. ### 1.5 Blufor tracker (optional) -With blufor tracker you'll never loose your leader anymore, it marks the position of your faction group leader on the map. +The Blufor tracker marks the position of your faction's group leaders on the map. ## 2. Usage diff --git a/documentation/feature/maptools.md b/documentation/feature/maptools.md index 81b3507db2..a67412343f 100644 --- a/documentation/feature/maptools.md +++ b/documentation/feature/maptools.md @@ -1,7 +1,7 @@ --- layout: wiki title: Map Tools -description: +description: Map tools, a roamer and pens group: feature parent: wiki --- @@ -9,10 +9,10 @@ parent: wiki ## 1. Overview ### 1.1 Line drawing -This adds the possibility to draw accurate lines. +This adds the possibility to draw accurate lines on the map screen. ### 1.2 Map tools -This adds map tools that can be used to measure distances between two points on the map or bearings. +This adds map tools that can be used to measure distances between two points or bearings on the map. ### 1.3 GPS on map If you are equipped with a vanilla GPS it will be shown on the map. (You don't need the map tools in your inventory for this.) @@ -21,17 +21,17 @@ If you are equipped with a vanilla GPS it will be shown on the map. (You don't n ### 2.1 Using map tools - For this you need to have `Map Tools`. -- Open the map M (by default). -- Press the self interaction key ctrl+left windows (by default). +- Open the map M (Arma 3 default key bind `Map`). +- Press the self interaction key CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Map tools`. - Select the type of tools you want to use. -- Note that you can drag the Roamer (map tool) around with LMB and rotate it with ctrl+LMB . +- Note that you can drag the Roamer (map tool) around with LMB and rotate it with CTRL + LMB. ### 2.2 Drawing lines - To draw lines `Map Tools` are not required. -- Press alt+left click (by default) to start the line, left click again to end it. -- To delete a line simply press delete around the center of the line. - +- Press ALT + LMB to start the line, left click again to end it. +- To delete a line press Del around the center of the line. +- Note that you can change the color of the lines by clicking on one of the coloured column on top of the screen (While the map is opened) ## 3. Dependencies diff --git a/documentation/feature/markers.md b/documentation/feature/markers.md index c9e27b6a6d..84f133760c 100644 --- a/documentation/feature/markers.md +++ b/documentation/feature/markers.md @@ -1,7 +1,7 @@ --- layout: wiki title: Markers -description: +description: improved markers group: feature parent: wiki --- diff --git a/documentation/feature/medical-system.md b/documentation/feature/medical-system.md index 4175f95e41..b77c1c8bba 100644 --- a/documentation/feature/medical-system.md +++ b/documentation/feature/medical-system.md @@ -67,7 +67,7 @@ In order to stop the bleeding, all injuries on every bodypart requires treatment While a unit is bleeding however, the blood volume decreases which will result in a change of vitals. Depending on the factors such as current blood volume, the blood loss rate, medication used, the blood pressure will start to drop. To counter this drop, also based upon the previously mentioned factors and others, the heart rate will adjust accordingly to attempt to keep blood pressure at safe levels. This means that for any patient it is required to keep an eye on the vitals. This is done through the interaction system by selecting check pulse or blood pressure on either the arms or head. #### 3.1.3 Medication -To stabalize the vitals and to counter for example pain, a player/medic can use medication. Advanced medical has 3 different medications available: +To stabilize the vitals and to counter for example pain, a player/medic can use medication. Advanced medical has 3 different medications available: * Atropine * Morphine @@ -75,7 +75,7 @@ To stabalize the vitals and to counter for example pain, a player/medic can use Atropine is a vagolytic and anticholinergic drug which in low dosages reduces heart rate but in high dosages increases it, countering effects of organophosphate poisoning (in NBC scenarios; anticholinesterase poisoning) and symptomatic bradycardia (in post-ROSC care and resuscitative medicine). -Morphine is used to alleviate large amounts of pain. Has an effect similar to Heroin due to its opiate properties. Must only ever be given once, and only when bleeding has been reduced to a minimum. Morphine must never be given to a casualty with a low heart rate, as it can stop the heart. +Morphine is used to alleviate large amounts of pain. Has an effect similar to Heroin due to its opiate properties. Must only ever be given once, and only when bleeding has been reduced to a minimum. Morphine must never be given to a casualty with a low heart rate, as it can stop the heart. It's effect lasts up to 15 minutes. Epinephrine is used to increase heart rate and blood pressure and alleviate unconsciousness. Epinephrine is a synthetic form of Adrenaline, which is naturally produced in the body. It can also be applied to counter-act the effects of Atropine. Be careful though, as it may only be given once. @@ -107,7 +107,7 @@ Advanced medical system brings more different types of wounds, each with its own * Cut wounds * Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. * Sources: vehicle crashes, grenades, explosions, artillery shells, backblast, stabs - * Effects: pain - light, w zależności od głębokości i szerokości rany dosyć szybkie wykrwawianie się. + * Effects: pain - light, bleeding - speed depends on lenght and size of the woundę. * Lacerations * Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. @@ -178,7 +178,7 @@ All bandage types weights about 50 grams each. * Can only be applied on limbs * Stops bleeding from wounds * Should be taken off as fast as possible and applied only to give medic time to bandage all the wounds - * If not taken off for a while it will cause pain to patient, can yield to death that way + * If not taken off for a while it will cause pain to patient, can cause death that way #### 3.1.6 Transfuzions In case of blood loss, blood could be replenished by three different types of IV: blood, plasma and saline. We distinguish 3 different sizes of IV bags: 250ml, 500ml and 1000ml. diff --git a/documentation/feature/missileguidance.md b/documentation/feature/missileguidance.md index 939381a426..7dd4d6a304 100644 --- a/documentation/feature/missileguidance.md +++ b/documentation/feature/missileguidance.md @@ -6,21 +6,23 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +Adds the AMG framework, for more information about it refer to the [AMG framework documentation] ({{site.productionUrl}}/wiki/framework/advanced-missile-guidance.html) -### Sub-feature 2 -Short description of sub-feature 2. +## 2. Usage +### 2.1 Switching fire mode +- Press CTRL + TAB the LED's on the right of the UI will change. +- `TOP` for top down mode. +- `DIR` for direct mode. -## Usage +### 2.2 Locking +- Fully zoom in by using NUMPAD + +- Switch to thermals by pressing N the `FLTR` LED should light up. +- Aim at the target and hold TAB a crosshair will appear and the `SEEK` LED will light up. +- Fire! -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 3. Dependencies `ace_laser` diff --git a/documentation/feature/missionmodules.md b/documentation/feature/missionmodules.md index 5ef66a7b31..c434016fc2 100644 --- a/documentation/feature/missionmodules.md +++ b/documentation/feature/missionmodules.md @@ -1,26 +1,19 @@ --- layout: wiki title: Mission Modules -description: +description: modules that can be used by mission makers. group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +Add modules that can be used by mission makers. -### Sub-feature 2 -Short description of sub-feature 2. +### 1.1 Ambient sounds +That module can be used to add ambient sounds around players, it let you choose the sounds and some parameters (distance, volume interval). -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/mk6mortar.md b/documentation/feature/mk6mortar.md index 1693a9e23d..eb4b22caaf 100644 --- a/documentation/feature/mk6mortar.md +++ b/documentation/feature/mk6mortar.md @@ -1,26 +1,65 @@ --- layout: wiki title: Mk6 Mortar -description: +description: Improve the existing mk6 mortar. group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +### 1.1 mk6 mortar overhaul +ACE3 adds wind deflection for shells as well as a rangetable to accurately take out your target without the artillery computer. -### Sub-feature 2 -Short description of sub-feature 2. +## 2. Usage +### 2.1 Switching charge +- Press F (Arma 3 default key bind `Fire Mode Switch`) to switch between charges -## Usage +### 2.2 Working with the rangetable +- To open the table: + - Self interact CTRL + ⊞ Win + - Select `equipment`. + - Select `Open 82mm Rangetable`. -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +- Using the table: + - Get the distance and elevation difference between you and the target for this you can use map tools. For this example we'll say we're 2 000m away and 50m below (we're at 20m they are at 70m, 70-20=50). + + - Select the charge you want to use (0 = close / 1 = medium / 2 = far). For this case we're using charge 2. + + - Check the range column on the table, we're at 2 000 then look at the corresponding entry in the column on the right (ELEV = elevation) For this example it's 1339. + + - After that's done move by one column on the right that's the elevation for 100m heigh so in our case we're subtracting 2 (4:2 = 2) if our target was 300m above us we would have to subtract 12 from our elevation (3x4 = 12). + + - Once you finished your maths, it's time to aim, get the cross of the mortar on target, if you don't see it use a waypoint if possible. In our case ELEV is 1339-2 = 1337. + + - On the right side of the screen, while looking through the mk6 scope you should see ELV, we need to match this number with the one we found. + - To adjust the ELV use pageUP and pageDOWN. + - Once the number you found and ELV are the same FIRE ! + - On top of that you can calculate the time the shell will take to land by using the third row from the left, in our case the shell need to travel 2000m that's 20xthe number indicated. so 20x0,5 = 10s. +### 2.3 Working with the rangetable (Crosswinds enabled) +- Same as above there's just an extra step, I'll provide an other example in case you forgot. + + - Get the distance and elevation difference between you and the target for this you can use map tools. For this example we'll say we're 2 400m away and 223m below (we're at 2m they are at 225, 225-2=223) + - Select the charge you want to use (0 = close / 1 = medium / 2 = far). For this case we're using charge 2. + + - Check the range column on the table, we're 2 400m a then look at the corresponding entry in the column on the right (ELEV = elevation) For this example it's 1145. + - After that's done move by one column on the right that's the elevation for 100m heigh so in our case we're subtracting 22 (2,2 x 10 (2,2 because we're around 220m below)). + - Extra step needed here, a kestrel 4500 IS NEEDED. + - Pick the crosswind on your kestrel (for this refer to the kestrel documentation). + + - For this example the crosswind is of 2 MPS on my table I can see under Azimuth correction that for each 1MPS I need to correct by 2.5 mill. + - So in this case i'm subtracting 5 mill from the ELV. + + - It's MATH TIME the ELV given by the table is 1 145, we subtract 22 because of the heigh, we also subtract 5 for the crosswind ( 1 145-22-5 = 1 118 ). + - After you finished your maths, it's time to aim, get the cross of the mortar on target, if you don't see it use a waypoint if possible. In our case ELEV is 1 118. + + - On the right side of the screen, while looking through the mk6 scope you should see ELV, we need to match this number with the one we found. -## Dependencies + - FIREEEE !!!! + - Little advantage of having crosswind enabled is that you don't have to calculate the flight time, it's marked on the table in this case it's 33,8s. -`ace_interaction` +## 3. Dependencies + +`ace_interaction` \ No newline at end of file diff --git a/documentation/feature/movement.md b/documentation/feature/movement.md index a9a55b4f1b..bb857644b0 100644 --- a/documentation/feature/movement.md +++ b/documentation/feature/movement.md @@ -1,34 +1,39 @@ --- layout: wiki title: Movement -description: +description: Movement improvements group: feature parent: wiki --- -## Overview +## 1. Overview -### Jumping -Adds the ability to jump when pressing the vault key while moving. (V - key) +### 1.1 Jumping +Adds the ability to jump when pressing the vault key while moving. (V) -### Minor animation tweaks +### 1.2 Minor animation tweaks Walking slowly with the weapon lowered now has a less silly looking animation. -### Fatigue adjustments +### 1.3 Fatigue adjustments Soldiers get fatigued slower, but regain their stamina slower aswell. Fatigued soldiers have a faster walking speed and no longer turn into snails. -### Weight display +### 1.4 Weight display Adds a weight of the current loadout display in the inventory to estimate the fatigue gain while moving in combat. Can be adjusted to display lb. instead of kg in the ACE Options Menu. -### Optics view in all stances +### 1.5 Optics view in all stances The player can now use the sights of rifles and pistols in all prone stances. -## Usage +## 2. Usage -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +### 2.1 Jumping +- For this you need your weapon up +- While jogging or running press V +### 2.2 Climbing +- Approach what you want to climb. +- Press ctrl + V (ACE3 default key bind `Climb`). +- Note that when climbing your character will put his weapon on his back. ## Dependencies diff --git a/documentation/feature/mx2a.md b/documentation/feature/mx2a.md new file mode 100644 index 0000000000..892991d3b7 --- /dev/null +++ b/documentation/feature/mx2a.md @@ -0,0 +1,14 @@ +--- +layout: wiki +title: MX-2A +group: feature +parent: wiki +--- + +## 1. Overview + +Adds the MX-2A thermal imaging device. + +## 3. Dependencies + +`ace_apl` \ No newline at end of file diff --git a/documentation/feature/nametags.md b/documentation/feature/nametags.md index 840c8b6a12..6130be167f 100644 --- a/documentation/feature/nametags.md +++ b/documentation/feature/nametags.md @@ -6,18 +6,14 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Nametag and rank display +### 1.1 Nametag and rank display Adds nametags and soldier ranks to friendly players in multiplayer. This can be adjusted in the ACE Options Menu to not display the rank, display all nametags of nearby soldiers instead of those who are looked directly at, to require a button press to show the nametags or to disable them altogether. +### 1.2 Arma 3 VON, ACRE and TFAR soundwaves +A soundwave effect is shown when someone is speaking using either the vanilla VON, ACRE 1 or 2 and TFAR. -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_interaction` diff --git a/documentation/feature/nightvision.md b/documentation/feature/nightvision.md index 91a26cbe12..46bae6a905 100644 --- a/documentation/feature/nightvision.md +++ b/documentation/feature/nightvision.md @@ -6,27 +6,22 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Multiple Generation NVGs -Adds different night vision devices with varying image quality and field of -view. New Classnames for Generations 1, 2, and 4 NVGs (default ArmA3 NVGs -represents Generation 3) and a wide view NVG. +### 1.1 Multiple Generation NVGs +Adds different night vision devices with varying image quality and field of view. New Classnames for Generations 1, 2, and 4 NVG's (default Arma 3 NVG's represents Generation 3) and a wide view NVG. -### Blending effects -Adds a blending effect depending on ammunition type when firing while using a -night vision device. Especially tracer rounds are bright, but you can use the - IR-dim tracers from the Ballistics module to reduce tis effect. +### 1.2 Blending effects +Adds a blending effect depending on ammunition type when firing while using a night vision device. Especially tracer rounds are bright, but you can use the IR-dim tracers from the Ballistics module to reduce tis effect. -### Brightness adjustment +### 1.3 Brightness adjustment Enables the user to manually adjust NVG brightness. +## 2. Usage +### 2.1 Adjusting brightness +- Use ALT + PageUP and ALT + PageDOWN to adjust NVG brightness (ACE3 default key bind `Increase/Decrease NVG Brightness`). -## Usage -Use Alt+PageUp and Alt+PageDown to adjust NVG brightness. - - -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/noidle.md b/documentation/feature/noidle.md index 11f35c87f0..f63daa4eb8 100644 --- a/documentation/feature/noidle.md +++ b/documentation/feature/noidle.md @@ -1,26 +1,17 @@ --- layout: wiki title: No Idle -description: +description: Disable idle animations group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +### 1.1 Idle animations removed -### Sub-feature 2 -Short description of sub-feature 2. +This removes idle animations. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/noradio.md b/documentation/feature/noradio.md index 562c8ab7be..e7452ed840 100644 --- a/documentation/feature/noradio.md +++ b/documentation/feature/noradio.md @@ -1,24 +1,17 @@ --- layout: wiki title: No Radio -description: +description: Disable callouts group: feature parent: wiki --- -## Overview +## 1. Overview -### Silent avatar +### 1.1 Silent avatar Mutes the player's automatic callouts ("Enemy man, 100 meters, front!"). Does not mute AI callouts. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/norearm.md b/documentation/feature/norearm.md index e57e052c01..73ed1c35cc 100644 --- a/documentation/feature/norearm.md +++ b/documentation/feature/norearm.md @@ -1,26 +1,15 @@ --- layout: wiki title: No Rearm -description: +description: Remove rearm from group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +Hides the rearm action for players (on cars / boxes / corpses / ground) -### Sub-feature 2 -Short description of sub-feature 2. - - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/optics.md b/documentation/feature/optics.md index ed945c6f51..fe1d04ee76 100644 --- a/documentation/feature/optics.md +++ b/documentation/feature/optics.md @@ -1,26 +1,15 @@ --- layout: wiki title: Optics -description: +description: 2D and PIP optics group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +Adds animated 2D and PIP variants of some optics (RCO / MRCO / ARCO / LRPS / MOS) -### Sub-feature 2 -Short description of sub-feature 2. - - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/optionsmenu.md b/documentation/feature/optionsmenu.md index be53472353..e4da9f033a 100644 --- a/documentation/feature/optionsmenu.md +++ b/documentation/feature/optionsmenu.md @@ -1,28 +1,27 @@ --- layout: wiki title: Options Menu -description: +description: ACE3 options menu group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +Adds the options menu used by other components. -### Sub-feature 2 -Short description of sub-feature 2. +## 2. Usage +### 2.1 Opening the user menu +- Press Escape +- In the top left corner of the screen you should see `ACE Options`. +- Click it. -## Usage +### 2.2 Options menu informations +- You don't have to press a save button. When a setting is changed it's saved automatically. -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 3. Dependencies `ace_common` -Note: The Options Menu module is utilized by many other modules. Disabling it is not recommended. +*Note: The Options Menu module is utilized by many other modules. Disabling it is not recommended.* diff --git a/documentation/feature/overheating.md b/documentation/feature/overheating.md index b6538e49b4..dcbc4c1939 100644 --- a/documentation/feature/overheating.md +++ b/documentation/feature/overheating.md @@ -1,37 +1,42 @@ --- layout: wiki title: Overheating -description: -description: +description: Weapon temperature and jamming, barrel swapping. group: feature parent: wiki --- -## Overview +## 1. Overview -### Weapon Jamming -Adds a propability to jam a weapon when firing. Jams can be cleared by -reloading or by using the clear jam-key. +### 1.1 Weapon Jamming +Adds a probability to jam a weapon when firing. Jams can be cleared by reloading or by using the clear jam-key. -### Temperature simulation -Introduces weapon temperature simulation depending on weapon and bullet -mass. Hot weapons are more prone to jamming. Depending on weapon type -the accuracy and in extreme cases the muzzle velocity might be reduced -on high temperatues. Adds smoke puff and heat refraction effects to -indicate this. +### 1.2 Temperature simulation +Introduces weapon temperature simulation depending on weapon and bullet mass. Hot weapons are more prone to jamming. Depending on weapon type the accuracy and in extreme cases the muzzle velocity might be reduced on high temperatures. Adds smoke puff and heat refraction effects to indicate this. -### Spare barrels -Adds the ability to changes barrels on machine guns to compensate for those -effects. +### 1.3 Spare barrels +Adds the ability to changes barrels on machine guns to compensate for those effects. -## Usage -To clear a jammed weapon, press Shift+R. +## 2. Usage +### 2.1 Clearing a jammed weapon +- To clear a jammed weapon, press SHIFT + R (ACE3 default key bind `Clear jam`). -*needs documentation on swapping barrels* +### 2.2 Swapping barrels +- For this you need a `Spare barrel` and a compatible weapon. +- Press self interaction CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Select `Equipment`. +- Select `Swap barrel`. +### 2.3 Checking your barrel temperature +- Press self interaction CTRL + ⊞ Win. +- Select `Equipment`. +- Select `Check weapon temperature`. -## Dependencies +**NOTE** When the bar is half full (yellow) it means the barrel is around 500°c. +Your weapon will be even more prone to jams, and it'll get worse if you don't let the barrel cool down or swap it. + +## 3. Dependencies `ace_interaction` diff --git a/documentation/feature/overpressure.md b/documentation/feature/overpressure.md index f9646722ac..85ed13e8ca 100644 --- a/documentation/feature/overpressure.md +++ b/documentation/feature/overpressure.md @@ -1,26 +1,16 @@ --- layout: wiki title: Overpressure -description: +description: backblast and overpressure group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +### 1.1 Overpressure +Adds backblast to AT launchers and overpressure zones to tank cannons, don't stay behind a firing RPG or it'll hurt. -### Sub-feature 2 -Short description of sub-feature 2. +## 2. Dependencies - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies - -List of modules that must be present for this module to work. +`ace_common` diff --git a/documentation/feature/parachute.md b/documentation/feature/parachute.md index fa37e52656..a3f9791fb7 100644 --- a/documentation/feature/parachute.md +++ b/documentation/feature/parachute.md @@ -1,31 +1,28 @@ --- layout: wiki title: Parachute -description: +description: Add an altimeter and a non-steerable parachute group: feature parent: wiki --- -## Overview +## 1. Overview -### Altimeter -Removes the altitude and descend speed UI elements when free-falling and -parachuting on higher difficulties and instead adds an altimeter watch type -item. +### 1.1 Altimeter +Removes the altitude and descend speed UI elements when free-falling and parachuting on higher difficulties. Adds an altimeter watch type item. -### Non-steerable parachute +### 1.2 Non-steerable parachute Adds a non-steerable parachute variant for jet pilots. -### Landing animation -Smoothens parachute landing animation. +### 1.3 Landing animation +Smoothens the parachute landing animation. +## 2. Usage -## Usage +### 2.1 bringing up the altimeter +- For this you need to have an `Altimeter Watch` in the watch slot. +- Press O (Arma 3 default key bind `Watch`) to bring up the altimeter. -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/protection.md b/documentation/feature/protection.md index 4a35d1e0ba..628d05d972 100644 --- a/documentation/feature/protection.md +++ b/documentation/feature/protection.md @@ -1,26 +1,16 @@ --- layout: wiki title: Protection -description: +description: Tweaks armor values group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +### 1.1 Tweaked protection values +Fixes and tweaks the protection values of body armour, helmets and uniforms. -### Sub-feature 2 -Short description of sub-feature 2. - - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/ragdolls.md b/documentation/feature/ragdolls.md index 3a29c73eb6..235e8e97be 100644 --- a/documentation/feature/ragdolls.md +++ b/documentation/feature/ragdolls.md @@ -1,23 +1,16 @@ --- layout: wiki title: Ragdolls -description: +description: group: feature parent: wiki --- -## Overview +## 1. Overview -### Adjusted Ragdolls +### 1.1 Adjusted Ragdolls Changes the ragdolls to react more to the force of shots and explosions. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/rangecard.md b/documentation/feature/rangecard.md new file mode 100644 index 0000000000..b40e76cd49 --- /dev/null +++ b/documentation/feature/rangecard.md @@ -0,0 +1,31 @@ +--- +layout: wiki +title: Rangecard +description: Add a range card for your weapons +group: feature +parent: wiki +--- + +## 1. Overview + +Add a range card that updates itself for your weapon and the type of ammo you're using. + +## 2. Usage + +### 2.1 Opening the range card +- Open the self interaction menu CTRL + ⊞ Win +- Select `Equipment` +- Select `Open Range Card` + +### 2.2 Using the range card +- To use this to it's full potential the use of a `Vector 21` is strongly recommended, a `Kestrel 4500` will also help. + +- Pull out your rangefinder (`Vector 21` preferred) and get the distance between you and your target. + +- Open your rangetable and look under the `Target range` column. + +- Move to the `Bullet Drop` column, the drop is in MRADs, you need to compensate for it by adjusting your sight. Example, you want to adjust for a bullet drop of -7.9 MRADs simply adjust your scope 7.9 MRADs vertically. (check [feature scopes](http://ace3mod.com/wiki/feature/scopes.html) ) for this. + +## 3. Dependencies + +`ACE_Advanced_Ballistics` \ No newline at end of file diff --git a/documentation/feature/realisticnames.md b/documentation/feature/realisticnames.md index a60190025a..72f5766664 100644 --- a/documentation/feature/realisticnames.md +++ b/documentation/feature/realisticnames.md @@ -1,24 +1,16 @@ --- layout: wiki title: Realistic Names -description: +description: More realistic weapon names group: feature parent: wiki --- -## Overview +## 1. Overview -### Real names -Changes the names of vehicles, magazines, weapons, grenades, explosive charges -and mines to their respective real-world counterparts whenever possible. +### 1.1 Real names +Changes the names of vehicles, magazines, weapons, grenades, explosive charges and mines to their respective real-world counterparts whenever possible. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/recoil.md b/documentation/feature/recoil.md index 6393a1cd78..b684a1c8ce 100644 --- a/documentation/feature/recoil.md +++ b/documentation/feature/recoil.md @@ -1,29 +1,22 @@ --- layout: wiki title: Recoil -description: +description: Recoil overhaul group: feature parent: wiki --- -## Overview +## 1. Overview -### Recoil adjustment +### 1.1 Recoil adjustment Overhauls the recoil system reducing upwards recoil. -### Advanced cam shake +### 1.2 Advanced cam shake Introducing camshake when firing on foot or as vehicle gunner depending on stance and weapon type. -### Burst dispersion +### 1.3 Burst dispersion Firing in longer burst (> 3 rounds per burst) slightly reduces the accuracy. Firing machine guns in bursts is now useful. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/reload.md b/documentation/feature/reload.md index 4b4b4dc19a..3cd4db1c8d 100644 --- a/documentation/feature/reload.md +++ b/documentation/feature/reload.md @@ -6,18 +6,16 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Ammo count +### 1.1 Ammo count Hides the actual round count of magazines and removes the icon when the current magazine is emptied. The player can instead check the magazine weight, but that gives only estimated values for magazines with more than 10 rounds. +## 2. Usage -## Usage +### 2.1 Checking your ammo +- Press CTRL + R (ACE3 default key bind `Check Ammo`). -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 3. Dependencies `ace_interaction` diff --git a/documentation/feature/reloadlaunchers.md b/documentation/feature/reloadlaunchers.md index 5dc5003beb..773814a73e 100644 --- a/documentation/feature/reloadlaunchers.md +++ b/documentation/feature/reloadlaunchers.md @@ -1,25 +1,22 @@ --- layout: wiki title: Reload Launchers -description: +description: group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +Add the ability to reload someone else's launcher. -### Sub-feature 2 -Short description of sub-feature 2. +### 2. Usage +### 2.1 Reloading someone else's launcher +- Press the interaction key ⊞ Win and aim at your buddy's launcher. +- Select `reload launcher`. +- Select the type of ammo. -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, instructions. May not apply to all modules. - - -## Dependencies +## 3. Dependencies `ace_interaction` diff --git a/documentation/feature/respawn.md b/documentation/feature/respawn.md index 1a58597ebd..753784b52b 100644 --- a/documentation/feature/respawn.md +++ b/documentation/feature/respawn.md @@ -1,29 +1,32 @@ --- layout: wiki title: Respawn -description: +description: Same gear on respawn, FF message, rallypoints group: feature parent: wiki --- -## Overview +## 1. Overview -### Respawn with same gear +### 1.1 Respawn with same gear Requires the Respawn Gear module to be placed. Respawned soldiers now have their loadout when killed. -### Friendly Fire messages +### 1.2 Friendly Fire messages Shows friendly fire warnings in system chat if the module is placed. Works even in higher difficulties where kill messages are normally disabled. -### Rallypoints -Adds rallypoints to all 3 sides to enable teleportation from base spawn to FOBs. Requires some setup from the mission maker. +### 1.3 Rallypoints +Adds rallypoints to all 3 sides to enable teleportation from base spawn to FOB's. Requires some setup from the mission maker. -## Usage +## 2. Usage -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +### 2.1 Using rallypoints +- For this to work pre-emptive preparations need to be made by the mission maker. +- Approach the rallypoint flagpole +- Use the interaction key ⊞ Win (ACE3 default key bind `Interaction key`). +- Select teleport to (base / rallypoint). -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/safemode.md b/documentation/feature/safemode.md index f6b06ba016..9024ac973b 100644 --- a/documentation/feature/safemode.md +++ b/documentation/feature/safemode.md @@ -1,23 +1,22 @@ --- layout: wiki title: Safe Mode -description: +description: Introduce safe mode group: feature parent: wiki --- -## Overview +## 1. Overview -### Safety +### 1.1 Safety You can now use the safety mode of any weapon. Switching weapon modes takes the safety off. +## 2. Usage -## Usage +### 2.1 Switching safety on / off +- To turn it on press CTRL + ` (QWERTY layout) (ACE3 default key bind `Safe Mode`). +- To turn it off press CTRL + ` (QWERTY layout) again or switch firing mode. -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/sandbags.md b/documentation/feature/sandbags.md new file mode 100644 index 0000000000..5e0011b755 --- /dev/null +++ b/documentation/feature/sandbags.md @@ -0,0 +1,24 @@ +--- +layout: wiki +title: Sandbags +group: feature +parent: wiki +--- + +## 1. Overview + +Adds stackable sandbags able to block bullets, shrapnel and small explosions. +Note that those sandbags are affected by physics, a rocket will send them flying. + +## 2. Usage + +### 2.1 Placing the sandbags +- You'll need at least one `sandbag (empty)`. +- You need to be over a grass area / sand area to be able to fill the sandbag. +- Self interact CTRL+⊞ Win (ACE3 default). +- Select `Deploy sandbag`. +- Follow the instruction on screen. + +## 3. Dependencies + +`ace_interaction` \ No newline at end of file diff --git a/documentation/feature/scopes.md b/documentation/feature/scopes.md index af95bfede4..9e70641f71 100644 --- a/documentation/feature/scopes.md +++ b/documentation/feature/scopes.md @@ -1,23 +1,31 @@ --- layout: wiki title: Scopes -description: +description: Scope adjustment group: feature parent: wiki --- -## Overview +## 1. Overview ### Sniper Scope Adjustment -Enables snipers to adjust their scopes horizontally and vertically in mils. +Allows snipers to adjust their scopes horizontally and vertically in mils. +## 2. Usage -## Usage +### 2.1 Adjusting your scope vertically +Please not that the following key combinations are ACE3 default key binds. +- Minor adjustment up pageUP. +- Minor adjustment down pageDOWN. +- Major adjustment up Shift + pageUP. +- Major adjustment down Shift + pageDOWN. -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +### 2.2 Adjusting your scope horizontally +- Minor adjustment right CTRL + pageUP. +- Minor adjustment left CTRL + pageDOWN. +- Major adjustment right CTRL + Shift + pageUP. +- Major adjustment left CTRL + Shift + pageDOWN. - -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/smallarms.md b/documentation/feature/smallarms.md index bc346b9cb9..51fc7c0440 100644 --- a/documentation/feature/smallarms.md +++ b/documentation/feature/smallarms.md @@ -1,29 +1,22 @@ --- layout: wiki title: Small Arms -description: +description: Various improvements to small arms group: feature parent: wiki --- -## Overview +## 1. Overview -### Magazine Names +### 1.1 Magazine Names Unifies the name formatting of magazines similar to Arma 2 standards. -### No tracers in non-tracer mags +### 1.2 No tracers in non-tracer mags Assault rifles no longer have tracer rounds in their non-tracer magazines. This doesn't effect the additional tracers in the last rounds of machine gun magazines. -### Real magazine round counts -All pistol and sub machine gun magazines now have adjusted capacaties to match their real life counterparts. +### 1.3 Real magazine round counts +All pistol and sub machine gun magazines now have adjusted capacities to match their real life counterparts. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/spotting_scope.md b/documentation/feature/spotting_scope.md new file mode 100644 index 0000000000..ead45d540f --- /dev/null +++ b/documentation/feature/spotting_scope.md @@ -0,0 +1,21 @@ +--- +layout: wiki +title: Spotting scope +group: feature +parent: wiki +--- + +## 1. Overview + +Adds a deployable spotting scope. + +## 2. Usage + +### 2.1 Deploying the spotting scope +- Self interact CTRL+⊞ Win (ACE3 default). +- Select `Equipment`. +- Select `Place spotting scope` (note that the scope will be at your feet). + +## 3. Dependencies + +`ace_apl` , `ace_interaction` \ No newline at end of file diff --git a/documentation/feature/switchunits.md b/documentation/feature/switchunits.md index 03fd98b3fd..cc1a0ba381 100644 --- a/documentation/feature/switchunits.md +++ b/documentation/feature/switchunits.md @@ -6,21 +6,24 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +### 1.1 Switch units -### Sub-feature 2 -Short description of sub-feature 2. +"ACE SwitchUnits" is a tool for mission makers to quickly add PvP (Player vs. Player) elements to a mission. In short it enables a player to control AI units. Allowing players to perform as enemies even during a COOP mission increases the authenticity of the enemy and thus the immersion for everyone. +The most prominent feature of ACE SwitchUnits is that you can add it to nearly every existing mission and get AI control out of the box. Dynamic mission like "Enemy Assault", "Patrol Ops", "Invade & Annex", etc. don't need to be touched to make all random spawned AI's controllable. -## Usage +In its current form you're able to switch to infantry (vehicles, etc. are planned) from all four sides (West, East, Independent, Civilian). -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +## 2. Usage +### 2.1 Switching to a unit +- Open your map +- Find a unit you can access (they are showed with special icons and names on the map). +- Press LMB on the desired unit. +- You'll control that unit until it dies or until you switch to an other one. If the unit dies you'll be brought back to your original unit.. -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/tacticallader.md b/documentation/feature/tacticallader.md new file mode 100644 index 0000000000..f992236db6 --- /dev/null +++ b/documentation/feature/tacticallader.md @@ -0,0 +1,21 @@ +--- +layout: wiki +title: Tactical ladder +group: feature +parent: wiki +--- + +## 1. Overview + +Adds a deployable ladder with adjustable height that you can transport on your back. + +## 2. Usage + +### 2.1 Deploying the ladder +- Self interact CTRL+⊞ Win (ACE3 default). +- Select `Deploy ladder`. +- You can adjust it's position and height by interacting with it ⊞ Win (ACE3 default) and following the instructions on screen. + +## 3. Dependencies + +`ace_apl` , `ace_interaction` \ No newline at end of file diff --git a/documentation/feature/testmissions.md b/documentation/feature/testmissions.md index 418e5d06f9..8b61c47327 100644 --- a/documentation/feature/testmissions.md +++ b/documentation/feature/testmissions.md @@ -6,21 +6,10 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Sub-feature 1 -Short description of sub-feature 1. +adds ACE3 test missions -### Sub-feature 2 -Short description of sub-feature 2. - - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/thermals.md b/documentation/feature/thermals.md index 98cc5ca24e..495ba30eaf 100644 --- a/documentation/feature/thermals.md +++ b/documentation/feature/thermals.md @@ -6,18 +6,11 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Body Warmth +### 1.1 Body Warmth Adjusts the thermal properties of humans making them less like torches. - -## Usage - -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 2. Dependencies `ace_common` diff --git a/documentation/feature/tripod.md b/documentation/feature/tripod.md new file mode 100644 index 0000000000..4f57dc05a7 --- /dev/null +++ b/documentation/feature/tripod.md @@ -0,0 +1,24 @@ +--- +layout: wiki +title: Tripod +group: feature +parent: wiki +--- + +## 1. Overview + +Adds a packable tripod deployable on the field. It features a flat part to deploy your weapon on and adjustable legs. + +## 2. Usage + +### 2.1 deploying the tripod +- Note that you need a `SSWT kit` in your inventory. +- Self interact CTRL+⊞ Win. +- Select `Equipment` +- Select `Place SSWT kit`. + +To adjust or pick up the tripod just interact with it ⊞ Win and select the desired action. + +## 3. Dependencies + +`ace_interaction` \ No newline at end of file diff --git a/documentation/feature/ui.md b/documentation/feature/ui.md new file mode 100644 index 0000000000..eb7cf3ff58 --- /dev/null +++ b/documentation/feature/ui.md @@ -0,0 +1,15 @@ +--- +layout: wiki +title: UI +group: feature +parent: wiki +--- + +## 1. Overview + +Changes the chat contrast on the map to allow easier reading. + + +## 3. Dependencies + +`ace_common` \ No newline at end of file diff --git a/documentation/feature/vector.md b/documentation/feature/vector.md index f5dc85dfca..025012959a 100644 --- a/documentation/feature/vector.md +++ b/documentation/feature/vector.md @@ -6,18 +6,79 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Vector IV Rangefinder -Adds the Vector IV rangefinder, including all real-life usage modes (distance between two points, angle between two points etc.) +### 1.1 Vector 21 Rangefinder +ACE3 adds a realistic depiction of the Vector 21 rangefinder to the game. Unlike other rangefinders, it doesn't just magically show you the range to your target, but in exchange allows you to do alot of things with it that the other choices in Arma do not offer. The Vector's functions include, but are not limited to: +- Distance to a target +- Azimuth to a target +- Horizontal and vertical distance to a target +- Distance between 2 targets +- Angle between 2 targets +- Switching between feet and meters +- Switching between degrees and mils +... -## Usage +## 2. Usage -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +The Vector is controlled with 2 keys: the azimuth key and the range key; Tab and R and is brought up like any other binoculars. +#### 2.1 Slope distance +Measuring Slope distance -## Dependencies +- Press and hold R until the red pointing circle appears. Sight the circle on the object and release the key. + +#### 2.2 Azimuth +Measuring Azimuth + +- Press and hold the TAB until the azimuth is displayed. + +#### 2.3 Slope distance and Azimuth +Measuring Slope distance and Azimuth + +- Press and hold both R and TAB until the red pointing circle appears. +- Sight the circle on the object and release both keys. + +#### 2.4 Horizontal distance and height difference +Measuring Horizontal distance and height difference + +- Tap R once then press and hold it until the red pointing circle appears. +- Sight the circle on the object and release the key. + +#### 2.5 Azimuth and Inclination +Measuring Azimuth and Inclination + +- Tap TAB once then press and hold it until the azimuth and inclination is displayed. + +#### 2.6 Distance between two points +Measuring Distance between two points + +- Press and hold R until the red pointing circle appears. +- Sight the circle on the first object and tap TAB while further holding R. The first measurement is confirmed ("1-P" = first point). +- Sight the second object and release R. + +#### 2.7 Horizontal and vertical distance between two points +Measuring Horizontal and vertical distance between two points + +- Tap R once then press and hold it until the red pointing circle appears. +- Sight the circle on the object and tap TAB once. The first measurement is confirmed ("1-P" = first point). +- Sight the second object and release R. + +#### 2.8 Horizontal distance and azimuth between two points +Measuring Horizontal distance and azimuth between two points + +- Press and hold TAB until the azimuth appears. +- Sight the circle on the first object and tap R while further holding TAB. The first measurement is confirmed ("1-P" = first point). +- Sight the second object and release TAB. + +### 2.9 Fall of shot +Measuring Fall of shot + +- Tap TAB once then press and hold it until the azimuth appears. +- Sight the circle on the object and tap R while further holding TAB. The first measurement is confirmed ("1-P" = first point). +- Sight the Fall of shot and release TAB. The left digits display the left (`L`)/right (`r`) correction value in meter and the right digits display the longer (`A` = add)/shorter (`d` = drop) correction value in meter. If R is tapped the height correction values will be displayed (`UP` and `dn`). + +## 3. Dependencies `ace_common` diff --git a/documentation/feature/vehiclelock.md b/documentation/feature/vehiclelock.md index 2dc8b7e92d..a97ec96149 100644 --- a/documentation/feature/vehiclelock.md +++ b/documentation/feature/vehiclelock.md @@ -7,12 +7,9 @@ parent: wiki --- ## 1. Overview - -ACE3 Vehicle Lock is disabled by default. This feature adds the ability to lock and unlock vehicles and their inventory using a key, as well as picking locks of locked vehicles. - +This feature adds the ability to lock and unlock vehicles and their inventory using a key, as well as picking locks of locked vehicles. It's disabled by default. ## 2. Usage - Locking, unlocking and picking vehicle locks is possible via the ACE Interact menu.
@@ -20,7 +17,5 @@ Locking, unlocking and picking vehicle locks is possible via the ACE Interact me

Different locking modes can be set, consult with your mission maker for more information.

- ## 3. Dependencies - `ace_interaction` diff --git a/documentation/feature/vehicles.md b/documentation/feature/vehicles.md index 5c3a07af08..3f78b654b2 100644 --- a/documentation/feature/vehicles.md +++ b/documentation/feature/vehicles.md @@ -6,42 +6,41 @@ group: feature parent: wiki --- -## Overview +## 1. Overview -### Speedlimiter +### 1.1 Speed limiter Adds ability to limit the max. speed of any vehicle. -### Engine start delay +### 1.2 Engine start delay The engine has to be started before the vehicle can move. Starting the engine takes aprox. 1 to 2 seconds. -### Fuel capacity -The range of all vehicle gets signifigantly reduced to reflect ranges of their real life counterparts. Scaled down to match the relative short distances in Arma. A full vehicle on mission start should still most likely never need a refueling during a mission. +### 1.3 Fuel capacity +The range of all vehicle gets significantly reduced to reflect ranges of their real life counterparts. Scaled down to match the relative short distances in Arma 3. A full vehicle on mission start should still most likely never need a refueling during a mission. -### Main gun muzzles -APCs and Tanks now share a muzzle for all ammunition types of their main guns. This prevents an exploit that skips the reloading time of a round or clip while changing the ammunition type. Also makes it possible to switch between ammunition types using the scroll wheel like in Arma 2. +### 1.4 Main gun muzzles +APC's and tanks now share a muzzle for all ammunition types of their main guns. This prevents an exploit that skips the reloading time of a round or clip while changing the ammunition type. Also makes it possible to switch between ammunition types using the scroll wheel like in Arma 2. -### Boat machine gun tracers -NATO and AAF armed boats now use their respective tracer colours like any vehicle when they fire their rear gun. (Red for BluFor, yellow for Indep) +### 1.5 Boat machine gun tracers +NATO and AAF armed boats now use their respective tracer colours like any vehicle when they fire their rear gun. (Red for Blufor, yellow for Indep) -### Improved smoke launcher of Fennek (Strider) +### 1.6 Improved smoke launcher of Fennek (Strider) Reduced smoke shell count and launch angle of the AAF Fennek to match the models smoke launcher. -### Stabilized optic of Fennek (Strider) +### 1.7 Stabilized optic of Fennek (Strider) Stabilizes the commander's view in the Fennek (Strider). -### Vehicle mounted machine guns ROF +### 1.8 Vehicle mounted machine guns ROF The rate of fire of vehicle mounted miniguns and machine guns is adjusted to match real life values. -### 120mm gun and mortar behavior +### 1.9 120mm gun and mortar behaviour MBT main guns and mortars can no longer lock on enemies. The AT rounds of both now have raised cost values to encourage the AI to not use those rounds against foot soldiers over their machine guns or HE rounds. +## 2. Usage -## Usage +### 2.1 Turning the engine on / off +- To turn the engine on press 2. +- To turn the engine off press 1. -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. - - -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/viewdistance.md b/documentation/feature/viewdistance.md new file mode 100644 index 0000000000..38e4fc4c53 --- /dev/null +++ b/documentation/feature/viewdistance.md @@ -0,0 +1,18 @@ +--- +layout: wiki +title: View Distance +description: The view distance module adds extra view distance settings +group: feature +parent: wiki +--- + +## 1. Overview +ACE3 View Distance adds the ability to have different view distance settings when on foot, in a vehicle or in the air. It is enabled by default. + +## 2. Usage +- When in-game, press ESC. +- Click `ACE Options` in the top-left corner. +- Scroll down to the `Client View Distance` settings. + +## 3. Dependencies +`ace_common` diff --git a/documentation/feature/weaponselect.md b/documentation/feature/weaponselect.md index 8f737d1d1e..232e643416 100644 --- a/documentation/feature/weaponselect.md +++ b/documentation/feature/weaponselect.md @@ -1,35 +1,35 @@ --- layout: wiki title: Weapon Select -description: group: feature parent: wiki --- -## Overview +## 1. Overview -### Weapon select -The number key can be used to quickly switch between weapons. (1 key - pistol, 2 key - rifle, 3 key - grenade launcher, 4 key - rocket launcher, 5 key - binocular) +### 1.1 Holster weapon +Adds the ability to holster a weapon on the back. -### Holster weapon -Adds the ability to holster a weapon on the back. (0 key) +### 1.2 Quick weapon select +Adds key bindings to quickly switch weapons while on foot or in a vehicle. (Unbound by default). -### Engine select -Quickly turn engine on and off (1 key - turn off, 2 key - turn on) +### 1.3 Quick vehicle engine on/off +Adds key bindings to quickly turn a vehicle engine on or off. -### Weapon select -Quickly switch between vehicle weapons (1-3 key) +### 1.4 Grenade select +Changes the grenade selection key bindings to help prevent accidents. -### Grenade select -To prevent accidents a grenade has to be selected before it can be thrown. Toggles between explosive and non-explosive grenades. When spamming the throw key, the player won't automatically switch to frag grenades when all smokes are used up. Also shows an indicator to quickly see how many grenades are left when selecting and after throwing (6 key - switch between frag grenades, 7 key - switch between other grenades) +## 2. Usage +### 2.1 Weapons -## Usage +- Press 0 to holster and unholster a weapon. +- When a weapon is holstered, the weapon fire button will not pull the weapon out. This can be used as an additional level of safety or as a role-playing feature. -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +Quick weapon selection is not bound by default, but can be bound in the controls menu under `ACE3 Weapons`. +Quick vehicle weapon selection is not bound by default, but can be bound in the controls menu under `ACE3 Vehicles`. -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/weather.md b/documentation/feature/weather.md index 284b5627fd..4dee0da86f 100644 --- a/documentation/feature/weather.md +++ b/documentation/feature/weather.md @@ -7,17 +7,13 @@ parent: wiki --- ## 1. Overview - -ACE3 Weather is enabled by default. This feature simulates realistic weather according to map location, time of day, date, etc and makes sure every player experiences the same weather effects. - +ACE3 Weather simulates realistic weather effects, according to the geographical location of the map, the date and time. It also ensures that all players experience the same weather effects. ## 2. Usage ### 2.1 Wind info -- Wind info is toggled on/off using Shift+K +- Wind info is toggled on/off using SHIFT + K. - The arrow representing wind info is based on [Beaufort scale](http://en.wikipedia.org/wiki/Beaufort_scale#Modern_scale) - ## 3. Dependencies - `ace_common`, `ace_modules` diff --git a/documentation/feature/windeflection.md b/documentation/feature/windeflection.md index 8a0a29ad1d..82019eca7c 100644 --- a/documentation/feature/windeflection.md +++ b/documentation/feature/windeflection.md @@ -7,7 +7,6 @@ parent: wiki --- ## 1. Overview - ACE3 Wind Deflection is enabled by default. This feature simulates the wind deflection of projectiles fired by players and is designed to work independently or in conjunction with the Advanced Ballistic feature.
@@ -15,12 +14,9 @@ ACE3 Wind Deflection is enabled by default. This feature simulates the wind defl

The only affected projectiles are bullets and grenades. Mortar shells, tank shells, missiles and rockets are not affected.

- ## 2. Usage - -Wind Deflection can be disabled or modified via a Module in the 2D editor. +ACE3 Wind Deflection can be disabled or modified via a module in the 2D editor. ## 3. Dependencies - `ace_weather` diff --git a/documentation/feature/yardage450.md b/documentation/feature/yardage450.md new file mode 100644 index 0000000000..66c4a2d4e3 --- /dev/null +++ b/documentation/feature/yardage450.md @@ -0,0 +1,22 @@ +--- +layout: wiki +title: Yardage 450 +group: feature +parent: wiki +--- + +## 1. Overview + +Adds the Bushnell Yardage Pro Sport 450 Laser Rangefinder. + +## 2. Usage + +### 2.1 How to use the Yardage 450 +- Bring it up like any other binocular +- Tap R once to activate the device. +- Sight the target and Hold R until `TARGET AQCUIRED` appears on top of the screen. +- The range in meters should now appear at the bottom of the screen. + +## 3. Dependencies + +`ace_apl` , `ace_laser` \ No newline at end of file diff --git a/documentation/feature/zeus.md b/documentation/feature/zeus.md new file mode 100644 index 0000000000..12a016d584 --- /dev/null +++ b/documentation/feature/zeus.md @@ -0,0 +1,16 @@ +--- +layout: wiki +title: Zeus +description: The Zeus module improves the Vanilla functionality +group: feature +parent: wiki +--- + +## 1. Overview +ACE3 Zeus is enabled by default. This feature provides control over vanilla aspects of Zeus. + +## 2. Usage +ACE3 Zeus can be disabled or modified via a module in the 2D editor. + +## 3. Dependencies +`ace_common`, `ace_modules` diff --git a/documentation/missionmaker/classnames.md b/documentation/missionmaker/classnames.md index 62d80afe98..9ea0d5b556 100644 --- a/documentation/missionmaker/classnames.md +++ b/documentation/missionmaker/classnames.md @@ -1,11 +1,16 @@ --- layout: wiki title: Classnames +description: A list of all the classnames in ACE3, your wet dream came true. group: missionmaker order: 11 parent: wiki --- +Everything is ordered alphabetically. + +You know an in-game name but want the classname? CTRL + F + ### Atragmx `added in 3.0.0.3` @@ -72,6 +77,21 @@ classname | in game name | type | --------- | --------- | --------- ACE_Banana | banana | ACE_ItemCore | +### Concertina_wire +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_ConcertinaWireCoil | Concertina Wire Coil | ThingX | +ACE_ConcertinaWire | Concertina Wire | deployed concertina wire | + +### Dagr +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_DAGR | DAGR | ACE_ItemCore | + ### Disposable `added in 3.0.0.3` @@ -99,14 +119,23 @@ ACE_HandFlare_White | M127A1 Hand Held Signal (White) | Grenade | ACE_HandFlare_Red | M127A1 Hand Held Signal (Red | Grenade | ACE_HandFlare_Green | M127A1 Hand Held Signal (Green) | Grenade | ACE_HandFlare_Yellow | M127A1 Hand Held Signal (Yellow) | Grenade | -ACE_M84 | M84 Stun Grenade | +ACE_M84 | M84 Stun Grenade | Grenade | -### hearing +### Hearing `added in 3.0.0.3` classname | in game name | type | --------- | --------- | --------- -ACE_EarPlugs | Ear Plugs | ACE_ItemCore | +ACE_EarPlugs | Earplugs | ACE_ItemCore | + +### HuntIR +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_HuntIR_monitor | HuntIR monitor | ACE_ItemCore | +ACE_HuntIR_M203 | HuntIR Round | Grenade shell | +ACE_HuntIR_Box | HuntIR Transport Box | ammo box | ### Kestrel `added in 3.0.0.3` @@ -154,6 +183,7 @@ ACE_bloodIV | Blood IV (1000ml) | ACE_ItemCore | ACE_bloodIV_500 | Blood IV (500ml) | ACE_ItemCore | ACE_bloodIV_250 | Blood IV (250ml) | ACE_ItemCore | ACE_bodyBag | Bodybag | ACE_ItemCore | +ACE_bodyBagObject | Bodybag (packed) | | ACE_epinephrine | Epinephrine autoinjector | ACE_ItemCore | ACE_morphine | Morphine autoinjector | ACE_ItemCore | ACE_packingBandage | Packing Bandage | ACE_ItemCore | @@ -174,10 +204,21 @@ classname | in game name | type | --------- | --------- | --------- ACE_microDAGR | MicroDAGR GPS | ACE_ItemCore | +### mk6 mortar +`added in 3.0.0.3` + classname | in game name | type | --------- | --------- | --------- ACE_RangeTable_82mm | 82mm Rangetable | ACE_ItemCore | +### M2XA +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_MX2A | MX-2A | Binocular | + + ### Nightvision `added in 3.0.0.3` @@ -221,6 +262,12 @@ classname | in game name | type | ACE_Altimeter | Altimeter Watch | ACE_ItemCore | ACE_NonSteerableParachute | Non-Steerable Parachute | Backpack | +### Rangecard + +classname | in game name | type | +--------- | --------- | --------- +ACE_RangeCard | rangecard | ACE_ItemCore | + ### Vector `added in 3.0.0.3` @@ -239,3 +286,42 @@ ACE_key_west | Vehicle Key: West | ACE_ItemCore | ACE_key_east | Vehicle Key: East | ACE_ItemCore | ACE_key_indp | Vehicle Key: Independent | ACE_ItemCore | ACE_key_civ | Vehicle Key: Civilian | ACE_ItemCore | + +### Sandbag +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_Sandbag_empty | Sandbag (empty) | ACE_ItemCore | +ACE_SandbagObject | Sandbag | ThingX | + +### Spotting scope +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_SpottingScope | Spotting Scope | ACE_ItemCore | +ACE_SpottingScopeObject | Spotting Scope (placed) | StaticATWeapon | + +### Tactical ladder +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_TacticalLadder_Pack | Telescopic Ladder | Backpack | +ACE_Tactical_Ladder | Telescopic Ladder (placed) | house | + +### Tripod +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_Tripod | SSWT Kit | ACE_ItemCore | +ACE_TripodObject | SSWT Kit (placed) | ThingX | + +### Yardage 450 +`added in 3.1.1` + +classname | in game name | type | +--------- | --------- | --------- +ACE_Yardage450 | Yardage 450 | Binocular | \ No newline at end of file diff --git a/documentation/missionmaker/modules.md b/documentation/missionmaker/modules.md index 9712977cd0..5708a16379 100644 --- a/documentation/missionmaker/modules.md +++ b/documentation/missionmaker/modules.md @@ -11,34 +11,47 @@ parent: wiki ### 1.1 Advanced Ballistics *Part of: ace_advanced_ballistics* -This module allows to enable advanced external- and internal ballistics. +This module allows enabling and configuring advanced ballistic simulations. **Settings:** 1. **Advanced Ballistics (Boolean)**
Enables advanced ballistics.
`Default value: No` -2. **Always Enabled For Snipers (Boolean)**
-Always enables advanced ballistics when high power optics are used.
+ +2. **Enabled For Snipers (Boolean)**
+Enables advanced ballistics for non local snipers (when using high power optics).
`Default value: Yes` -3. **Disabled In FullAuto Mode (Boolean)**
+ +3. **Enabled For Group Members (Boolean)**
+Enables advanced ballistics for non local group members.
+`Default value: No` + +4. **Enabled For Everyone (Boolean)**
+Enables advanced ballistics for all non local players (enabling this feature may degrade performance during heavy firefights in multiplayer).
+`Default value: No` + +5. **Disabled In FullAuto Mode (Boolean)**
Disables the advanced ballistics during full auto fire.
`Default value: No` -4. **Disabled For Non Local Players (Boolean)**
-Disables the advanced ballistics for bullets coming from other players (enable this if you encounter frame drops during heavy firefights in multiplayer).
-`Default value: Yes` -5. **Enable Ammo Temperature Simulation (Boolean)**
+ +6. **Enable Ammo Temperature Simulation (Boolean)**
Muzzle velocity varies with ammo temperature.
`Default value: Yes` -6. **Enable Barrel Length Simulation (Boolean)**
+ +7. **Enable Barrel Length Simulation (Boolean)**
Muzzle velocity varies with barrel length.
`Default value: Yes` -7. **Enable Bullet Trace Effect (Boolean)**
+ +8. **Enable Bullet Trace Effect (Boolean)**
Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics).
-8. **Simulation Interval (Number)**
+`default value: Yes ` + +9. **Simulation Interval (Number)**
Defines the interval between every calculation step.
-`Default value: 0.05` -9. **Simulation Radius (Number)**
+`Default value: 0.00` + +10. **Simulation Radius (Number)**
Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles.
`Default value: 3000` @@ -65,7 +78,23 @@ How often the markers should be refreshed (in seconds).
Hide markers for "AI only" groups.
`Default value: No` -### 1.4 Check PBOs +### 1.4 Captives settings +*Part of: ace_captives* + +Controls the settings for cable ties and surrendering. +Very useful if you don't want your players to be able to restrict each others. + +**Settings:** + +1. **Can handcuff own side (Boolean)**
+Determine if you are able to handcuff your own side or not.
+`Default value: Yes` + +2. **Allow surrendering (Boolean)**
+Determine if you are able to surrender or not when your weapon is holstered.
+`Default value: Yes` + +### 1.5 Check PBOs *Part of: ace_common* If you are worried that players haven't updated ACE3 or other mods to the version you're using on the server, you can place the "Check PBOs" module on your map. You can choose one of three posible actions that are being executed when a player joins that has a wrong version of ACE3 or an other mod: @@ -104,7 +133,7 @@ Example 3: @JSRS + @Blastcore-A3:
``` -### 1.5 Explosive System +### 1.6 Explosive System *Part of: ace_explosive* The "Explosive System" module lets you tweak the settings for the new explosive system that ACE3 introduces. @@ -114,18 +143,19 @@ The "Explosive System" module lets you tweak the settings for the new explosive 1. **Require specialists? (Boolean)**
Require explosive specialists to disable explosives.
`Default value: No` + 2. **Punish non-specialists? (Boolean)**
Increase the time it takes to complete actions for non-specialists.
`Default value: Yes` -### 1.6 Friendly Fire Messages +### 1.7 Friendly Fire Messages *Part of: ace_respawn* The "Friendly Fire Messages" module triggers a message when a player kills a friendly or civilian unit. This module isn't needed on servers with a low difficulty setting. -### 1.7 Hearing +### 1.8 Hearing *Part of: ace_hearing* Placing this modules allows you to disable combat deafness usually triggerd by loud explosions or heavy weapons in a players proximity. @@ -137,7 +167,7 @@ Enable combat deafness?
`Default value: Yes` -### 1.8 Interaction System +### 1.9 Interaction System *Part of: ace_interaction* This module allows you to tweak if players should be able to use team management functions (e.g. "switch group", "become leader"). @@ -148,13 +178,13 @@ This module allows you to tweak if players should be able to use team management Should players be allowed to use the Team Management Menu?.
`Default value: Yes` -### 1.9 Make Unit Surrender +### 1.10 Make Unit Surrender *Part of: ace_captives* Syncing units to that module sets them in the captive state with their arms behind their back. Usefull for e.g. hostage rescue missions. -### 1.10 Map +### 1.11 Map *Part of: ace_map* ACE3 introdcues a bit more realism for the vanilla Arma 3 map and how it behaves. Some of these settings can be toggled by this module. @@ -164,18 +194,21 @@ ACE3 introdcues a bit more realism for the vanilla Arma 3 map and how it behaves 1. **Map illumination? (Boolean)**
Calculate dynamic map illumination based on light conditions?.
`Default value: Yes` + 2. **Map shake? (Boolean)**
Make map shake when walking?.
`Default value: Yes` + 3. **Limit map zoom? (Boolean)**
Limit the amount of zoom available for the map?.
`Default value: No` + 4. **Show cursor coordinates? (Boolean)**
Show the grid coordinates on the mouse pointer?.
`Default value: No` -### 1.11 MicroDAGR Map Fill +### 1.12 MicroDAGR Map Fill *Part of: ace_microdagr* Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap. @@ -187,7 +220,7 @@ How much map data is filled on MicroDAGR's.
`Default value: "Full Satellite + Buildings"` -### 1.12 MK6 Settings +### 1.13 MK6 Settings *Part of: ace_mk6mortar* ACE3 now includes the first iteration of getting a less arcady point and click mortar experience. @@ -198,35 +231,44 @@ Placing this modules allows you to enable the increased realism in game. 1. **Air Resistance (Boolean)**
For Player Shots, Model Air Resistance and Wind Effects.
`Default value: Yes` + 2. **Allow MK6 Computer (Boolean)**
Show the Computer and Rangefinder (these **NEED** to be removed if you enable air resistance).
`Default value: No` + 3. **Allow MK6 Compass (Boolean)**
Show the MK6 Digital Compass.
`Default value: Yes` -### 1.13 Name Tags +### 1.14 Name Tags *Part of: ace_nametags* This module allows you to tweak the settings for player names tags. **Settings:** -1. **Player Names View Distance (Number)**
+1. **Show player names (Option)**
+Let you choose when nametags appears.
+`Default value: "Do Not Force"` + +2. **Player Names View Distance (Number)**
Distance (in meters) at which player names are shown.
`Default value: 5` -2. **Show name tags for AI? (Option)**
+ +3. **Show name tags for AI? (Option)**
Show the name and rank tags for friendly AI units, or by default allows players to choose it on their own.
`Default value: "Do Not Force"` -3. **Show crew info? (Option)**
+ +4. **Show crew info? (Option)**
Show vehicle crew info, or by default allows players to choose it on their own.
`Default value: "Do Not Force"` -4. **Show for Vehicles? (Boolean)**
+ +5. **Show for Vehicles? (Boolean)**
Show cursor NameTag for vehicle commander (only if client has name tags enabled).
`Default value: No` -### 1.14 Rallypoint System +### 1.15 Rallypoint System *Part of: ace_respawn* This module enables Mission Makers to specificly enable units to move a rallypoint. Every unit that is synced with that module is able to move a rallypoint. @@ -239,7 +281,7 @@ This module enables Mission Makers to specificly enable units to move a rallypoi To enable JIP players to move rally points have a look at [ACE3 Rallypoints](./mission-tools.html#1.-ace-rallypoints). -### 1.15 Respawn System +### 1.16 Respawn System *Part of: ace_respawn* The "Respawn System" module enables players to respawn with the gear they had before dying and to remove bodies of players after a configurable interval (in seconds). @@ -250,7 +292,8 @@ The "Respawn System" module enables players to respawn with the gear they had be Respawn with the gear a player had just before his death.
`Default value: No` -### 1.16 SwitchUnits System + +### 1.17 SwitchUnits System *Part of: ace_switchunits* The [SwitchUnits System](./mission-tools.html#2.-ace-switchunits) enables players to control certain AI units on the map. @@ -260,33 +303,38 @@ The [SwitchUnits System](./mission-tools.html#2.-ace-switchunits) enables player 1. **Switch To West? (Boolean)**
Allow switching to west units?
`Default value: No` + 2. **Switch To East? (Boolean)**
Allow switching to east units?
`Default value: No` + 3. **Switch To Independent? (Boolean)**
Allow switching to independent units?
`Default value: No` + 4. **Switch To Civilian? (Boolean)**
Allow switching to civilian units?
`Default value: No` + 5. **Enable Safe Zone? (Boolean)**
Enable a safe zone around enemy units? Players can't switch to units inside of the safe zone.
`Default value: Yes` + 6. **Safe Zone Radius (Number)**
The safe zone around players from a different team (in meters)
`Default value: 200` -### 1.17 Vehicle Lock +### 1.18 Vehicle Lock *Part of: ace_vehiclelock* These modules allow you to lock and unlock vehicles and their inventory using a key. Players don't receive a key automatically; for key names, see [Classnames Wiki](http://ace3mod.com/wiki/missionmaker/classnames.html#vehicle-lock). -#### 1.17.1 Vehicle Key Assign +#### 1.18.1 Vehicle Key Assign Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Only valid for objects present at mission start. Example: `[bob, car1, true] call ACE_VehicleLock_fnc_addKeyForVehicle;` - will add a key to bob and program it to work only on car1 -#### 1.17.2.1 Vehicle Lock Setup +#### 1.18.2.1 Vehicle Lock Setup Settings for lockpick strength and initial vehicle lock state. Removes ambiguous lock states. **Settings:** @@ -294,19 +342,37 @@ Settings for lockpick strength and initial vehicle lock state. Removes ambiguous 1. **Lock Vehicle Inventory? (Boolean)**
Locks the inventory of locked vehicles
`Default value: No` + 2. **Vehicle Starting Lock State (Option)**
Set lock state for all vehicles (removes ambiguous lock states)
`Default value: "As Is"` + 3. **Default Lockpick Strength (Number)**
Default Time to lockpick (in seconds)
`Default value: 10` -#### 1.17.2.2 Vehicle setVariables +#### 1.18.2.2 Vehicle setVariables * `ACE_VehicleLock_lockSide` - SIDE: overrides a vehicle's side, allowing locking and unlocking using a different side's key. For example: Unlocking INDEP vehicles with a BLUFOR key. * `ACE_vehicleLock_lockpickStrength` - NUMBER: seconds, determines how long lockpicking with take, overrides the value set in the module for a specific vehicle of the mission maker's choice. -### 1.18 Weather +### 1.19 View Distance Limiter +*Part of: ace_viewdistance* + +This module allows disabling the ACE3 View Distance feature as well as setting a view distance limit. + +**Settings:** + +1. **Enable ACE viewdistance (Boolean)**
+Enables ACE viewdistance
+`Default value: Yes` + +2. **View Distance Limit (Number)**
+Sets the limit for how high clients can raise their view distance (<= 10000) +`Default value: 10000` + + +### 1.20 Weather *Part of: ace_weather* This module allows you to customize the weather settings. @@ -316,7 +382,6 @@ This module allows you to customize the weather settings.

ACE3 Weather overrides weather settings (editor, mission settings) and automatically calculates wind, temperature and pressure according to map location, date, time of day and cloud coverage and allows the weather to evolve realistically as the simulation progresses. Weather synchronization occurs between all clients.
Adjustment of the weather is possible by modifying the overcast value (for example: 0.7 may result in intermittent rain).

- **Settings:** 1. **Weather propagation (Boolean)**
@@ -326,6 +391,7 @@ Enables sever side weather propagation.
Note:

This is responsible for synchronizing weather between all clients. Disabling it is not recommended.

+ 2. **ACE3 Weather (Boolean)**
Overrides the default weather with ACE3 weather (map based).
`Default value: Yes` @@ -333,20 +399,25 @@ Overrides the default weather with ACE3 weather (map based).
Note:

This can be disabled without affecting the weather propagation above. Useful if you prefer changing weather settings manually.

+ 3. **Sync Rain (Boolean)**
Synchronizes rain.
`Default value: Yes` -3. **Sync Wind (Boolean)**
+ +4. **Sync Wind (Boolean)**
Synchronizes wind.
`Default value: Yes` -3. **Sync Misc (Boolean)**
+ +5. **Sync Misc (Boolean)**
Synchronizes lightnings, rainbow, fog, ...
`Default value: Yes` -4. **Update Interval (Number)**
+ +6. **Update Interval (Number)**
Defines the interval (seconds) between weather updates.
`Default value: 60` -### 1.19 Wind Deflection + +### 1.21 Wind Deflection *Part of: ace_winddeflection* This module allows you to define when wind deflection is active. @@ -366,18 +437,47 @@ This module allows you to define when wind deflection is active. 1. **Wind Deflection (Boolean)**
Enables wind deflection.
`Default value: Yes` + 2. **Vehicle Enabled (Boolean)**
Enables wind deflection for static/vehicle gunners.
`Default value: Yes` + 3. **Simulation Interval (Number)**
Defines the interval between every calculation step.
`Default value: 0.05` + 4. **Simulation Radius (Number)**
Defines the radius around the player (in meters) at which projectiles are wind deflected.
`Default value: 3000` +### 1.22 Zeus Settings +*part of: ace_zeus* -### 1.20 LSD Vehicles +This module provides control over vanilla aspects of Zeus. + +**Settings:** + +1. **Ascension Messages (Option)**
+Display global popup messages when a player is assigned as Zeus
+`Default value: No` + +2. **Zeus Eagle (Boolean)**
+Spawn an eagle that follows the Zeus camera
+`Default value: No` + +3. **Wind Sounds (Boolean)**
+Play wind sounds when Zeus remote controls a unit
+`Default value: No` + +4. **Ordnance Warning (Boolean)**
+Play a radio warning when Zeus uses ordnance
+`Default value: No` + +5. **Reveal Mines (Scalar)**
+Reveal mines to allies and/or place map markers
+`Default value: Disabled` + +### 1.23 LSD Vehicles *Part of: ace_core* And then there's the "LSD Vehicles" module … it does 'something' to all vehicles synced to that module. @@ -397,37 +497,52 @@ This module allows to tweak all the medical settings used in ACE3 1. **Medical Level (Option)**
What is the medical simulation level?
`Default value: "Basic"` + 2. **Medics setting (Option)**
What is the level of detail preferred for medics?
`Default value: "Normal"` + 3. **Enable Litter (Boolean)**
Enable litter being created upon treatment.
-`Default value: "Normal"` +`Default value: "Yes"` + 4. **Life time of litter objects (Number)**
How long should litter objects stay? In seconds. -1 is forever.
`Default value: 1800` + 5. **Enable Screams (Boolean)**
Enable screaming by injured units.
`Default value: Yes` + 6. **Player Damage (Number)**
What is the damage a player can take before being killed?
`Default value: 1` + 7. **AI Damage (Number)**
What is the damage an AI can take before being killed?
`Default value: 1` + 8. **AI Unconsciousness (Option)**
Allow AI to go unconscious.
`Default value: "50/50"` -9. **Prevent instant death (Boolean)**
+ +9. **Remote controlled AI (Boolean)**
+Treats remote controlled units as AI not players ? +`Default value: Yes` + +10. **Prevent instant death (Boolean)**
Have a unit move to unconscious instead of death.
`Default value: No` -10. **Bleeding coefficient (Number)**
+ +11. **Bleeding coefficient (Number)**
Coefficient to modify the bleeding speed.
`Default value: 1` -11. **Pain coefficient (Number)**
+ +12. **Pain coefficient (Number)**
Coefficient to modify the pain intensity.
`Default value: 1` -12. **Pain coefficient (Boolean)**
+ +13. **Sync status (Boolean)**
Keep unit status synced. Recommended on.
`Default value: Yes` @@ -441,31 +556,46 @@ This module allows you to change the default Advanced Medical Settings, when [2. 1. **Enabled for (Option)**
Select what units the advanced medical system will be enabled for.
`Default value: "Players only"` + 2. **Enable Advanced wounds (Boolean)**
Allow reopening of bandaged wounds?
`Default value: No` + 3. **Vehicle Crashes (Boolean)**
Do units take damage from a vehicle crash?
`Default value: Yes` + 4. **Allow PAK (Option)**
Who can use the PAK for full heal?
`Default value: "Medics only"` + 5. **Remove PAK on use (Boolean)**
Should PAK be removed on usage?
`Default value: Yes` + 6. **Locations PAK (Option)**
Where can the personal aid kit be used?
`Default value: "Vehicles & facility"` + 7. **Allow Surgical kit (Option)**
Who can use the surgical kit?
`Default value: "Medics only"` + 8. **Remove Surgical kit (Boolean)**
Should Surgical kit be removed on usage?
`Default value: Yes` + 9. **Locations Surgical kit (Option)**
Where can the Surgical kit be used?
`Default value: "Vehicles & facility"` +10. **Bloodstains (Boolean)**
+Bandaging removes bloodstains. +`Default value: No` + +11. **Pain supression (Boolean)**
+Pain is only temporarly supressed not removed. +`Default value: Yes` ### 2.3 Revive Settings @@ -476,9 +606,11 @@ This modules allows a mission maker to limit the amount of revives for units in 1. **Enable Revive (Option)**
Enable a basic revive system
`Default value: "disable"` + 2. **Max Revive time (Number)**
Max amount of seconds a unit can spend in revive state
`Default value: 120` + 3. **Max Revive lives (Number)**
Max amount of lives a unit. 0 or -1 is disabled.
`Default value: -1` @@ -493,6 +625,7 @@ Using this module you can define which unit class is defined as a medic / doctor 1. **List (String)**
List of unit names that will be classified as medic, separated by commas.
`Default value: ""` + 2. **Is Medic (Boolean)**
Medics allow for more advanced treatment in case of Advanced Medic roles enabled
`Default value: "Regular medic"` @@ -518,6 +651,7 @@ Defines an object as a medical facility. This allows for more advanced treatment 1. **List (String)**
List of vehicles that will be classified as medical vehicle, separated by commas.
`Default value: ""` + 2. **Is Medical Vehicle (Boolean)**
Whether or not the objects in the list will be a medical vehicle.
`Default value: Yes` @@ -539,21 +673,27 @@ This module randomizes the time when the sound file is played and the position w 1. **Sounds (String)**
Class names of the ambiance sounds played. Separated by ','. (Example: `radio_track_01, electricity_loop`).
`Default value: ""` + 2. **Minimal Distance (Number)**
Used for calculating a random position and sets the minimal distance between the players and the played sound file(s) (in meters)
`Default value: 400` + 3. **Maximum Distance (Number)**
Used for calculating a random position and sets the maximum distance between the players and the played sound file(s) (in meters)
`Default value: 900` + 4. **Minimal Delay (Number)**
Minimal delay (in seconds) between sounds played
`Default value: 10` + 5. **Maximum Delay (Number)**
Maximum delay (in seconds) between sounds played
`Default value: 10` + 6. **Follow Players (Boolean)**
Follow players. If set to false, loop will play sounds only nearby logic position.
`Default value: No` + 7. **Volume (Number)**
The volume of the sounds played
-`Default value: 1` +`Default value: 1` \ No newline at end of file diff --git a/documentation/user/getting-started.md b/documentation/user/getting-started.md index f241be8585..6e18cdb278 100644 --- a/documentation/user/getting-started.md +++ b/documentation/user/getting-started.md @@ -7,83 +7,10 @@ order: 0 parent: wiki --- -
-
Note:
-

This page is currently under construction.

-
+Downloaded ACE3 and have no idea where to start? This page serves as a document to help new players and mission makers understand what's available to them. -Downloaded ACE3 and have no idea where to start? This page serves as a document to help new players get started with things like the medical system, or how to adjust your scope. +- You don't know where to begin your ACE3 journey? [**Check out ACE3 features**](http://ace3mod.com/wiki/feature/) +- You are a mission maker but you don't know what ACE3 have to offer? [**We have some documentation for you**](http://ace3mod.com/wiki/missionmaker/) -### 1. Vector 21 -*Part of: ace_vector* - -ACE3 adds a realistic depiction of the Vector 21 rangefinder to the game. Unlike other rangefinders, it doesn't just magically show you the range to your target, but in exchange allows you to do alot of things with it that the other choices in Arma do not offer. The Vector's functions include, but are not limited to: - -- Distance to a target -- Azimuth to a target -- Horizontal and vertical distance to a target -- Distance between 2 targets -- Angle between 2 targets -- Switching between feet and meters -- Switching between degrees and mils -... - -The Vector is controlled with 2 keys: the azimuth key and the range key; Tab and R by default. First you bring it up like every other binocular in the game and then, while looking through it you can access all the different functions. - -The Vector 21 rangefinder has the following usage modes: - -1. Slope distance -2. Azimuth -3. Slope distance & Azimuth -4. Horizontal distance and height difference -5. Azimuth & Inclination -6. Distance between two points -7. Horizontal & vertical distance between two points -8. Horizontal distance & azimuth between two points -9. Fall of shot - -#### 1. Slope distance -Measuring Slope distance - -Press and hold the "Distance" key until the red pointing circle appears. Sight the circle on the object and release the key. - -#### 2. Azimuth -Measuring Azimuth - -Press and hold the "Azimuth" key until the azimuth is displayed. - -#### 3. Slope distance and Azimuth -Measuring Slope distance and Azimuth - -Press and hold both the "Distance" and "Azimuth" key until the red pointing circle appears. Sight the circle on the object and release both keys. - -#### 4. Horizontal distance and height difference -Measuring Horizontal distance and height difference - -Tap the "Distance" key once then press and hold it until the red pointing circle appears. Sight the circle on the object and release the key. - -#### 5. Azimuth and Inclination -Measuring Azimuth and Inclination - -Tap the "Azimuth" key once then press and hold it until the azimuth and inclination is displayed. - -#### 6. Distance between two points -Measuring Distance between two points - -Press and hold the "Distance" key until the red pointing circle appears. Sight the circle on the first object and tap the "Azimuth" key while further holding the "Distance" key. The first measurement is confirmed ("1-P" = first point). Sight the second object and release the "Distance" key. - -#### 7. Horizontal and vertical distance between two points -Measuring Horizontal and vertical distance between two points - -Tap the "Distance" key once then press and hold it until the red pointing circle appears. Sight the circle on the object and tap the "Azimuth" key once. The first measurement is confirmed ("1-P" = first point). Sight the second object and release the "Distance" key. - -#### 8. Horizontal distance and azimuth between two points -Measuring Horizontal distance and azimuth between two points - -Press and hold the "Azimuth" key until the azimuth appears. Sight the circle on the first object and tap the "Distance" key while further holding the "Azimuth" key. The first measurement is confirmed ("1-P" = first point). Sight the second object and release the "Azimuth" key. - -#### 9. Fall of shot -Measuring Fall of shot - -Tap the "Azimuth" key once then press and hold it until the azimuth appears. Sight the circle on the object and tap the "Distance" key while further holding the "Azimuth" key. The first measurement is confirmed ("1-P" = first point). Sight the Fall of shot and release the "Azimuth" key. The left digits display the left (`L`)/right (`r`) correction value in meter and the right digits display the longer (`A` = add)/shorter (`d` = drop) correction value in meter. If the "Distance" key is tapped the height correction values will be displayed (`UP` and `dn`). +- Are you searching for ACE3 classnames ? [**Here they are**](http://ace3mod.com/wiki/missionmaker/classnames.html) \ No newline at end of file diff --git a/documentation/user/how-to-report-an-issue.md b/documentation/user/how-to-report-an-issue.md index 589e171c63..96f2dd76c3 100644 --- a/documentation/user/how-to-report-an-issue.md +++ b/documentation/user/how-to-report-an-issue.md @@ -11,6 +11,8 @@ parent: wiki If you've found an issue with ACE3 please make sure that ACE3 is really the cause of the problem. To do this try to reproduce the issue with using only `@cba_a3` and `@ACE3` on a newly created mission. +Indicate if the issue appears on stable or development version. In case it is the development version, please also include the commit SHA-1 hash. +
Please note:

It's not a valid to simply remove @ACE3 from the mod list to confirm that ACE3 is the culprit.

@@ -23,6 +25,7 @@ Head over to the ACE3 GitH ``` ACE3 Version: 3.x.x +(indicate if stable or dev, if dev indicate the commit the version is based on) **Mods:** * @cba_a3 diff --git a/documentation/user/installation-guide.md b/documentation/user/installation-guide.md new file mode 100644 index 0000000000..751b698cce --- /dev/null +++ b/documentation/user/installation-guide.md @@ -0,0 +1,63 @@ +--- +layout: wiki +title: Installation Guide +description: Step-by-step guide for installing ACE3 +group: user +order: 0 +parent: wiki +--- + +## 1. Overview +This guide will explain how to get ACE3 up and running faster than you can say banana. + +## 2. Prerequisites +- Download [CBA](http://www.armaholic.com/page.php?id=18767). +- Download [ACE3](https://github.com/acemod/ACE3/releases/latest). +- Know how to extract .zip files. Use [Google](https://www.google.com) if not sure. + +## 3. Install ACE3 +- Extract both CBA and ACE3 .zip files into your Arma 3 folder. By default this is located in:
+32-Bit - `C:/Program Files/Steam/Steamapps/Common/Arma 3/`
+64-Bit - `C:/Program Files (x86)/Steam/Steamapps/Common/Arma 3/` +- After extraction you should have the `@ace` and `@CBA_A3` folders inside your Arma 3 folder. + +## 4. Install ACE3 Optional components +
+
Note:
+

Skip this step if you're not using additional mods. If you are, consult with your mission maker before installing any of these components. If you are a Mod creator, please visit the [Modularity and PBO Structure](http://ace3mod.com/wiki/development/modularity-and-pbo-structure.html) page for more information.

+
+ +### 4.1 What do they do? +Optional components supplement 3rd party mods with ACE3 features, for example: +- Optional weapon components make Advanced Ballistics possible, as well as the ability to use ACE3 weapon attachments with 3rd party weapons like RHS, HLC, etc. +- Optional tracers component brings back ACE2 ball tracers. +- Optional server component is used to load the userconfig files. + +### 4.2 Which optionals should I use? +Only use the optional components that correspond with your mod-pack. + +### 4.3 How to install these components? +- Inside your `Arma 3/@ace/` folder, you'll find the `optionals` and `addons` folders. +- Copy and paste the relevant `.pbo` and `.bisign` files from the `optionals` folder into the `addons` folder. +- Copy and paste the `userconfig` folder from the `optionals` folder into root `Arma 3` folder. + +## 5. Launch Arma 3 with ACE3 +- Launch Arma 3 to start the official game Launcher. +- Click `Mods` and make sure the checkboxes next to `ace` and `CBA_A3` are ticked. +Arma 3 Vanilla Launcher +- Click `Play` + +## 6. Alternative launch methods + +### 6.1 Steam Launch Parameters +- Not supported with the new Arma 3 Launcher + +### 6.2 Arma 3Sync +- Inspect `Addon Options` and verify the `Addon Search Directories` are leading to your Arma 3 folder. +- Return to the `Addons` tab and click `Refresh`. +- Right-click inside `Addon Groups`, click `Create Group` and give it a name. +- Drag and drop `@ace` and `@CBA_A3` from `Available Addons` into the new Group you created inside `Addon Groups` and make sure the checkboxes are ticked. +Arma 3Sync Launcher +- Click `Start Game` + +### 5.3 Play withSIX diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 54db16213d..2382e64558 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -125,6 +125,7 @@ add_subdirectory(fcs) add_subdirectory(break_line) add_subdirectory(clipboard) add_subdirectory(advanced_ballistics) +add_subdirectory(medical) # Test Extension for dynamically loading/unloading built extensions; does not build in release if (DEVEL) diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index 06a398f342..c5c0a6c7a3 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -236,9 +236,9 @@ extern "C" void __stdcall RVExtension(char *output, int outputSize, const char *function) { ZERO_OUTPUT(); - + std::stringstream outputStr; if (!strcmp(function, "version")) { - int n = sprintf(output, "%s", ACE_FULL_VERSION_STR); + strncpy(output, ACE_FULL_VERSION_STR, outputSize); EXTENSION_RETURN(); } @@ -258,7 +258,11 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) velocity = strtod(strtok_s(NULL, ":", &next_token), NULL); retard = calculateRetard(dragModel, ballisticCoefficient, velocity); - int n = sprintf(output, "%f", retard); + // int n = sprintf(output, "%f", retard); + + outputStr << retard; + strncpy(output, outputStr.str().c_str(), outputSize); + EXTENSION_RETURN(); } else if (!strcmp(mode, "atmosphericCorrection")) { double ballisticCoefficient = 1.0; @@ -274,7 +278,9 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) atmosphereModel = strtok_s(NULL, ":", &next_token); ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, humidity, atmosphereModel); - int n = sprintf(output, "%f", ballisticCoefficient); + //int n = sprintf(output, "%f", ballisticCoefficient); + outputStr << ballisticCoefficient; + strncpy(output, outputStr.str().c_str(), outputSize); EXTENSION_RETURN(); } else if (!strcmp(mode, "new")) { unsigned int index = 0; @@ -369,7 +375,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].frames = 0.0; bulletDatabase[index].randSeed = 0; - int n = sprintf(output, "%s", ""); + strncpy(output, "", outputSize); EXTENSION_RETURN(); } else if (!strcmp(mode, "simulate")) { // simulate:0:[-0.109985,542.529,-3.98301]:[3751.57,5332.23,214.252]:[0.598153,2.38829,0]:28.6:0:0.481542:0:215.16 @@ -501,7 +507,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) trueSpeed = sqrt(pow(trueVelocity[0], 2) + pow(trueVelocity[1], 2) + pow(trueVelocity[2], 2)); temperature = bulletDatabase[index].temperature - 0.0065 * position[2]; - pressure = 1013.25 * exp(-(bulletDatabase[index].altitude + position[2]) / 7990) - 10 * bulletDatabase[index].overcast; + pressure = (1013.25 - 10 * bulletDatabase[index].overcast) * pow(1 - (0.0065 * (bulletDatabase[index].altitude + position[2])) / (273.15 + temperature + 0.0065 * bulletDatabase[index].altitude), 5.255754495); if (bulletDatabase[index].ballisticCoefficients.size() == bulletDatabase[index].velocityBoundaries.size() + 1) { dragRef = deltaT * bulletDatabase[index].airFriction * bulletSpeed * bulletSpeed; @@ -577,7 +583,8 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) positionOffset[0] += sin(bulletDir + M_PI / 2) * spinDriftPartial; positionOffset[1] += cos(bulletDir + M_PI / 2) * spinDriftPartial; - if (bulletSpeed < 345 && bulletSpeedAvg > 340 && bulletSpeed > 335) { + double speedOfSound = 331.3 + (0.6 * temperature); + if (bulletSpeed < (speedOfSound + 5) && bulletSpeedAvg > speedOfSound && bulletSpeed > (speedOfSound - 5)) { std::uniform_real_distribution distribution(0.0, 1.0); double coef = 1.0f - bulletDatabase[index].transonicStabilityCoef; @@ -585,8 +592,9 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) velocityOffset[1] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; velocityOffset[2] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; }; - - int n = sprintf(output, "_bullet setVelocity (_bulletVelocity vectorAdd [%f, %f, %f]); _bullet setPosASL (_bulletPosition vectorAdd [%f, %f, %f]);", velocityOffset[0], velocityOffset[1], velocityOffset[2], positionOffset[0], positionOffset[1], positionOffset[2]); + + outputStr << "_bullet setVelocity (_bulletVelocity vectorAdd [" << velocityOffset[0] << "," << velocityOffset[1] << "," << velocityOffset[2] << "]); _bullet setPosASL (_bulletPosition vectorAdd [" << positionOffset[0] << "," << positionOffset[1] << "," << positionOffset[2] << "]);"; + strncpy(output, outputStr.str().c_str(), outputSize); EXTENSION_RETURN(); } else if (!strcmp(mode, "set")) { int height = 0; @@ -601,7 +609,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map->gridBuildingNums.push_back(numObjects); map->gridSurfaceIsWater.push_back(surfaceIsWater); - int n = sprintf(output, "%s", ""); + strncpy(output, outputStr.str().c_str(), outputSize); EXTENSION_RETURN(); } else if (!strcmp(mode, "init")) { int mapSize = 0; @@ -616,7 +624,8 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map = &mapDatabase[worldName]; if (map->gridHeights.size() == gridCells) { - int n = sprintf(output, "%s", "Terrain already initialized"); + outputStr << "Terrain already initialized"; + strncpy(output, outputStr.str().c_str(), outputSize); EXTENSION_RETURN(); } @@ -629,10 +638,9 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map->gridBuildingNums.reserve(gridCells); map->gridSurfaceIsWater.reserve(gridCells); - int n = sprintf(output, "%s", ""); + strncpy(output, outputStr.str().c_str(), outputSize); EXTENSION_RETURN(); } - - int n = sprintf(output, "%s", ""); + strncpy(output, outputStr.str().c_str(), outputSize); EXTENSION_RETURN(); } diff --git a/extensions/common/targetver.h b/extensions/common/targetver.h index 10d2cf1c18..14dae4e96f 100644 --- a/extensions/common/targetver.h +++ b/extensions/common/targetver.h @@ -6,4 +6,4 @@ #include #else -#endif \ No newline at end of file +#endif diff --git a/extensions/medical/CMakeLists.txt b/extensions/medical/CMakeLists.txt new file mode 100644 index 0000000000..63d7105810 --- /dev/null +++ b/extensions/medical/CMakeLists.txt @@ -0,0 +1,13 @@ +set(ACE_EXTENSION_NAME "ace_medical") + +file(GLOB SOURCES *.h *.hpp *.c *.cpp) + +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES} ${GLOBAL_SOURCES}) +target_link_libraries(${ACE_EXTENSION_NAME} ace_common) +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES FOLDER Extensions) + +if(CMAKE_COMPILER_IS_GNUCXX) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_END_STATIC 1) +endif() \ No newline at end of file diff --git a/extensions/medical/DamageType.cpp b/extensions/medical/DamageType.cpp new file mode 100644 index 0000000000..3e6b08e507 --- /dev/null +++ b/extensions/medical/DamageType.cpp @@ -0,0 +1,11 @@ +#include "DamageType.h" + +ace::medical::injuries::DamageType::DamageType(std::string aTypeName, double minimalLethalDamage, std::vector minDamage, std::vector amountOfInjuresOnDamage, bool specificOnly) + : typeName(aTypeName), minLethalDamage(minimalLethalDamage), minDamageThreshold(minDamage), amountOfInjuresOnDamage(amountOfInjuresOnDamage), selectionSpecific(specificOnly) +{ +} + + +ace::medical::injuries::DamageType::~DamageType() +{ +} diff --git a/extensions/medical/DamageType.h b/extensions/medical/DamageType.h new file mode 100644 index 0000000000..3cd9fb41d0 --- /dev/null +++ b/extensions/medical/DamageType.h @@ -0,0 +1,28 @@ +#include +#include +#include + + +namespace ace { + namespace medical { + namespace injuries { + class InjuryType; + + class DamageType + { + public: + DamageType(std::string aTypeName, double minimalLethalDamage, std::vector minDamageThreshold, std::vector amountOfInjuresOnDamage, bool specificOnly); + ~DamageType(); + + std::string typeName; + double minLethalDamage; + std::vector minDamageThreshold; + std::vector amountOfInjuresOnDamage; + + bool selectionSpecific; + + std::vector> possibleInjuries; + }; + } + } +} diff --git a/extensions/medical/InjuryType.cpp b/extensions/medical/InjuryType.cpp new file mode 100644 index 0000000000..a959e5dd70 --- /dev/null +++ b/extensions/medical/InjuryType.cpp @@ -0,0 +1,13 @@ +#include "InjuryType.h" +#include "DamageType.h" + + +ace::medical::injuries::InjuryType::InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname) + : ID(anId), className(aClassname), selections(allowedSelections), bloodLoss(theBloodLoss), pain(thePain), minDamage(minimumDamage), maxDamage(maximumDamage), causes(possibleCauses), displayName(aDisplayname) +{ +} + + +ace::medical::injuries::InjuryType::~InjuryType() +{ +} diff --git a/extensions/medical/InjuryType.h b/extensions/medical/InjuryType.h new file mode 100644 index 0000000000..2790917468 --- /dev/null +++ b/extensions/medical/InjuryType.h @@ -0,0 +1,27 @@ +#include +#include + +namespace ace { + namespace medical { + namespace injuries { + class DamageType; + + class InjuryType + { + public: + InjuryType(signed int anId, const std::string& aClassname, std::vector& allowedSelections, double theBloodLoss, double thePain, double minimumDamage, double maximumDamage, std::vector& possibleCauses, std::string& aDisplayname); + ~InjuryType(); + + signed int ID; + std::string className; + std::vector selections; + double bloodLoss; + double pain; + double minDamage; + double maxDamage; + std::vector causes; + std::string displayName; + }; + } + } +} \ No newline at end of file diff --git a/extensions/medical/OpenWound.cpp b/extensions/medical/OpenWound.cpp new file mode 100644 index 0000000000..340955aac6 --- /dev/null +++ b/extensions/medical/OpenWound.cpp @@ -0,0 +1,18 @@ +#include "OpenWound.h" +#include + +ace::medical::injuries::OpenWound::OpenWound(int anID, int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount) : + woundID(anID), classID(aClassID), bodyPart(aBodyPartId), percentage(aPercentage), bloodlossRate(aBl), pain(painAmount) +{ +} + +ace::medical::injuries::OpenWound::~OpenWound() +{ +} + +std::string ace::medical::injuries::OpenWound::AsString() +{ + std::stringstream stream; + stream << "[" << woundID << "," << classID << "," << bodyPart << "," << 1 << "," << bloodlossRate << "]"; + return stream.str(); +} diff --git a/extensions/medical/OpenWound.h b/extensions/medical/OpenWound.h new file mode 100644 index 0000000000..4de796d5f9 --- /dev/null +++ b/extensions/medical/OpenWound.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace ace { + namespace medical { + namespace injuries { + class OpenWound + { + public: + OpenWound(int anID, int aClassID, int aBodyPartId, double aPercentage, double aBl, double painAmount); + ~OpenWound(); + + std::string AsString(); + + int woundID; + int classID; + int percentage; + double bodyPart; + double bloodlossRate; + double pain; + }; + + } + } +} diff --git a/extensions/medical/handleDamage.cpp b/extensions/medical/handleDamage.cpp new file mode 100644 index 0000000000..e36d8994b0 --- /dev/null +++ b/extensions/medical/handleDamage.cpp @@ -0,0 +1,243 @@ +#include "handleDamage.h" +#include "OpenWound.h" +#include "DamageType.h" +#include "InjuryType.h" +#include +#include + +namespace ace { + namespace medical { + + handleDamage::handleDamage() + { + } + + + handleDamage& handleDamage::GetInstance() + { + static handleDamage instance; + return instance; + } + + handleDamage::~handleDamage() + { + } + + std::string handleDamage::HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage, int woundID) + { + std::vector wounds; + int selectionN = SelectionToNumber(selectionName); + std::stringstream stream; + + if (selectionN >= 0) + { + double painToAdd = 0; + wounds = GetInjuryInfoFor(typeOfDamage, amountOfDamage, selectionN, woundID); + + stream << "_woundsCreated = ["; + for (int i = 0; i < wounds.size(); ++i) + { + stream << wounds.at(i).AsString(); + if (i != wounds.size() - 1) + { + stream << ","; + } + + painToAdd += wounds.at(i).pain; + } + stream << "];"; + + stream << "_painToAdd = " << painToAdd << ";"; + + return stream.str(); + } + return stream.str(); + } + + std::vector handleDamage::GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection, int woundID) + { + std::vector injuriesToAdd; + std::vector> information; + std::shared_ptr highestSpot = nullptr; + + for (auto & damageType : damageTypes) + { + if (damageType->typeName == typeOfDamage) + { + for (auto & possibleInjury : damageType->possibleInjuries) + { + if (amountOfDamage >= possibleInjury->minDamage && (amountOfDamage <= possibleInjury->maxDamage || possibleInjury->maxDamage <= 0)) + { + if (highestSpot == NULL) + highestSpot = possibleInjury; + + if (possibleInjury->minDamage > highestSpot->minDamage) + highestSpot = possibleInjury; + + information.push_back(possibleInjury); + } + } + if (highestSpot == NULL) { + break; + } + + int c = 0; + for (double & threshold : damageType->minDamageThreshold) + { + if (amountOfDamage >= threshold) + { + double amountOfInjuriesOnDamage = damageType->amountOfInjuresOnDamage.at(c); + for (double injuryAmount = 0; injuryAmount < amountOfInjuriesOnDamage; ++injuryAmount) + { + std::shared_ptr injuryToAdd; + if (rand() % 100 >= 85) + { + injuryToAdd = highestSpot; + } + else + { + int indexNewInjuryToAdd = rand() % information.size(); + injuryToAdd = information.at(indexNewInjuryToAdd); + } + + int bodyPartID = selection; + if (!damageType->selectionSpecific) + { + bodyPartID = rand() % 6; + } + + injuries::OpenWound newWound(woundID++, injuryToAdd->ID, bodyPartID, 1, injuryToAdd->bloodLoss, injuryToAdd->pain); + injuriesToAdd.push_back(newWound); + } + } + ++c; + } + return injuriesToAdd; + } + } + return injuriesToAdd; + } + + std::string handleDamage::AddDamageType(const std::vector& input) + { + if (input.size() == 5) + { + std::string typeName = input[0]; + double minimalLethalDamage = std::stod(input[1]); + std::vector minDamageThreshold = inputToVectorDouble(input[2]); + std::vector amountOfInjuresOnDamage = inputToVectorDouble(input[3]); + bool selectionSpecific = std::stod(input[4]) > 0; + + std::shared_ptr type(new ace::medical::injuries::DamageType(typeName, minimalLethalDamage, minDamageThreshold, amountOfInjuresOnDamage, selectionSpecific)); + damageTypes.push_back(type); + + std::stringstream stream; + + stream << "ADDED: " << typeName << " - " << minimalLethalDamage << " - ["; + for (double & sel : minDamageThreshold) + { + stream << sel << " -"; + } + stream << "] - ["; + for (double & sel : amountOfInjuresOnDamage) + { + stream << sel << " -"; + } + stream << "] - " << selectionSpecific; + return stream.str(); + } + return "failed"; + } + + std::string handleDamage::AddInjuryType(const std::vector& input) + { + if (input.size() == 9) + { + int ID = std::stod(input[0]); + std::string className = input[1]; + std::vector allowedSelections = inputToVector(input[2]); + double bloodLoss = std::stod(input[3]); + double pain = std::stod(input[4]); + + double minDamage = std::stod(input[5]); + double maxDamage = std::stod(input[6]); + std::vector possibleCauses = inputToVector(input[7]); + std::string displayName = input[8]; + + std::shared_ptr type(new ace::medical::injuries::InjuryType(ID, className, allowedSelections, bloodLoss, pain, minDamage, maxDamage, possibleCauses, displayName)); + injuryTypes.push_back(type); + std::stringstream stream; + + stream << "ADDED: " << ID << " - " << className << " - ["; + for (std::string & sel : allowedSelections) + { + stream << sel << " -"; + } + stream << "] - "; + stream << bloodLoss << " - " << pain << " - " << minDamage << " - " << maxDamage; + for (std::string & sel : possibleCauses) + { + stream << sel << " -"; + } + stream << displayName; + return stream.str(); + } + return "failed"; + } + + void handleDamage::FinalizeDefinitions() + { + // We are finding all possible injuries for a specific damage type here, so we don't have to figure that out at a later stage. + for (auto & damageType : damageTypes) + { + for (auto & injuryType : injuryTypes) + { + std::vector::iterator it = std::find(injuryType->causes.begin(), injuryType->causes.end(), damageType->typeName); + // outputstream << " Evaluating causes: " << (it != injuryType->causes.end()) << " "; + if (it != injuryType->causes.end()) + { + damageType->possibleInjuries.push_back(injuryType); + } + } + } + } + + int handleDamage::SelectionToNumber(const std::string& selectionName) + { + // TODO use dynamic selections instead + std::vector selections = { "head", "body", "hand_l", "hand_r", "leg_l", "leg_r" }; + std::vector::iterator it = find(selections.begin(), selections.end(), selectionName); + if (it != selections.end()) + { + return it - selections.begin(); + } + else + { + return -1; // TODO throw exception + } + } + + std::vector handleDamage::inputToVector(const std::string& input) + { + std::istringstream ss(input); + std::string token; + + std::vector output; + while (std::getline(ss, token, ':')) { + output.push_back(token); + } + return output; + } + std::vector handleDamage::inputToVectorDouble(const std::string& input) + { + std::istringstream ss(input); + std::string token; + + std::vector output; + while (std::getline(ss, token, ':')) { + output.push_back(std::stod(token)); + } + return output; + } + } +} diff --git a/extensions/medical/handleDamage.h b/extensions/medical/handleDamage.h new file mode 100644 index 0000000000..3b2cd739c8 --- /dev/null +++ b/extensions/medical/handleDamage.h @@ -0,0 +1,92 @@ +#pragma once + +#include +#include +#include + +namespace ace { + namespace medical { + + namespace injuries { + class DamageType; + class InjuryType; + class OpenWound; + } + + class handleDamage + { + public: + /** + * + */ + static handleDamage& GetInstance(); + + ~handleDamage(); + + /** + * Find new open wounds from advanced medical based upon the received damage. + * + * @param selectionName A string representation of the bodypart (for example: leg_r) + * @param amountOfDamage The damage received + * @param typeOfDamage The type of the damage received + * @param woundID latest wound ID + * @return SQF string containing _woundsCreated and _painAdded. + */ + std::string HandleDamageWounds(const std::string& selectionName, double amountOfDamage, const std::string& typeOfDamage, int woundID); + + /** + * Find new open wounds from advanced medical based upon the received damage. + * + * @param typeOfDamage The type of the damage received + * @param amountOfDamage The damage received + * @param selection A number representation of the bodypart. Number from 0 to 6. + * @param woundID latest wound ID + * @return New open wounds. + */ + std::vector GetInjuryInfoFor(const std::string& typeOfDamage, double amountOfDamage, int selection, int woundID); + + /** + * Add a new damage type from extension input parameters + * + * @param sqfDamageTypeDefinition + * @return String with result of addition: ADDED [parameters] or FAILED + */ + std::string AddDamageType(const std::vector& sqfDamageTypeDefinition); + + /** + * Add a new injury type from extension input parameters + * + * @param sqfDamageTypeDefinition + * @return String with result of addition: ADDED [parameters] or FAILED + */ + std::string AddInjuryType(const std::vector& sqfInjuryDefinition); + + /** + * Convert a selectionName to a number + * + * @param selectionName + * @return number of selection + */ + int SelectionToNumber(const std::string& selectionName); + + /** + * Lets the system know that all data has been added + */ + void FinalizeDefinitions(); + + private: + handleDamage(); + + handleDamage(handleDamage const&) = delete; + void operator=(handleDamage const&) = delete; + + std::vector inputToVector(const std::string& input); + std::vector inputToVectorDouble(const std::string& input); + + std::vector> damageTypes; + std::vector> injuryTypes; + std::vector selections; + std::vector hitPoints; + }; + } +} diff --git a/extensions/medical/medical.cpp b/extensions/medical/medical.cpp new file mode 100644 index 0000000000..3dcf3196ab --- /dev/null +++ b/extensions/medical/medical.cpp @@ -0,0 +1,68 @@ +/* +* ace_medical.cpp +* +* Author: +* Glowbal +*/ + +#include "shared.hpp" +#include +#include +#include +#include "handleDamage.h" +#include "OpenWound.h" + +extern "C" { + EXPORT void __stdcall RVExtension(char *output, int outputSize, const char *function); +}; + +std::vector parseExtensionInput(const std::string& input) +{ + std::istringstream ss(input); + std::string token; + + std::vector output; + while (std::getline(ss, token, ',')) { + output.push_back(token); + } + return output; +} + + +void __stdcall RVExtension(char *output, int outputSize, const char *function) { + if (!strcmp(function, "version")) { + strncpy(output, ACE_FULL_VERSION_STR, outputSize); + } + else + { + std::string returnValue = ""; + std::vector arguments = parseExtensionInput(function); + if (arguments.size() > 0) + { + std::string command = arguments.at(0); + arguments.erase(arguments.begin()); + + if (command == "addInjuryType") { + returnValue = ace::medical::handleDamage::GetInstance().AddInjuryType(arguments); + } + else if (command == "addDamageType") { + returnValue = ace::medical::handleDamage::GetInstance().AddDamageType(arguments); + } + else if (command == "HandleDamageWounds") { + if (arguments.size() >= 4) { + std::string selectionName = arguments.at(0); + double amountOfDamage = std::stod(arguments.at(1)); + std::string typeOfDamage = arguments.at(2); + int woundID = std::stoi(arguments.at(3)); + returnValue = ace::medical::handleDamage::GetInstance().HandleDamageWounds(selectionName, amountOfDamage, typeOfDamage, woundID); + } + } + else if (command == "ConfigComplete") { + ace::medical::handleDamage::GetInstance().FinalizeDefinitions(); + } + } + strncpy(output, returnValue.c_str(), outputSize); + output[outputSize - 1] = '\0'; + } +} + diff --git a/extras/YardageProSport.pdf b/extras/YardageProSport.pdf new file mode 100644 index 0000000000..60f527aacb Binary files /dev/null and b/extras/YardageProSport.pdf differ diff --git a/extras/airFrictionAnalysis.txt b/extras/airFrictionAnalysis.txt new file mode 100644 index 0000000000..722077578b --- /dev/null +++ b/extras/airFrictionAnalysis.txt @@ -0,0 +1,336 @@ +########################################## +Ammo Class: B_556x45_Ball +MaxRanges (m): [300, 500, 500] +MuzzleVelocities (m/s): [750, 870, 910] +Max. velocity difference (m/s): 25.51 +Max. drop difference (cm): 2.05 +Max. tof difference (ms): 10.0 +Optimal airFriction: 0.00126466 +########################################## +Ammo Class: ACE_556x45_Ball_Mk262 +MaxRanges (m): [600, 600] +MuzzleVelocities (m/s): [810, 840] +Max. velocity difference (m/s): 14.9 +Max. drop difference (cm): 2.67 +Max. tof difference (ms): 10.0 +Optimal airFriction: 0.00109563 +########################################## +Ammo Class: ACE_556x45_Ball_Mk318 +MaxRanges (m): [300, 500, 500] +MuzzleVelocities (m/s): [780, 880, 950] +Max. velocity difference (m/s): 20.86 +Max. drop difference (cm): 2.29 +Max. tof difference (ms): 9.0 +Optimal airFriction: 0.00123318 +########################################## +Ammo Class: ACE_556x45_Ball_M995_AP +MaxRanges (m): [400, 500] +MuzzleVelocities (m/s): [820, 880] +Max. velocity difference (m/s): 17.92 +Max. drop difference (cm): 1.25 +Max. tof difference (ms): 7.0 +Optimal airFriction: 0.00123272 +########################################## +Ammo Class: ACE_545x39_Ball_7N6M +MaxRanges (m): [400, 500] +MuzzleVelocities (m/s): [780, 880, 920] +Max. velocity difference (m/s): 19.71 +Max. drop difference (cm): 2.04 +Max. tof difference (ms): 8.0 +Optimal airFriction: 0.00114744 +########################################## +Ammo Class: B_65x39_Caseless +MaxRanges (m): [400, 800, 800] +MuzzleVelocities (m/s): [730, 800, 830] +Max. velocity difference (m/s): 22.17 +Max. drop difference (cm): 4.83 +Max. tof difference (ms): 16.0 +Optimal airFriction: 0.00075308 +########################################## +Ammo Class: ACE_65x47_Ball_Scenar +MaxRanges (m): [500, 800] +MuzzleVelocities (m/s): [730, 830] +Max. velocity difference (m/s): 16.94 +Max. drop difference (cm): 2.67 +Max. tof difference (ms): 9.0 +Optimal airFriction: 0.00067037 +########################################## +Ammo Class: ACE_65_Creedmor_Ball +MaxRanges (m): [600, 1000] +MuzzleVelocities (m/s): [750, 860] +Max. velocity difference (m/s): 21.08 +Max. drop difference (cm): 4.29 +Max. tof difference (ms): 14.0 +Optimal airFriction: 0.00060887 +########################################## +Ammo Class: B_762x51_Ball +MaxRanges (m): [500, 800] +MuzzleVelocities (m/s): [700, 833] +Max. velocity difference (m/s): 27.7 +Max. drop difference (cm): 6.71 +Max. tof difference (ms): 23.0 +Optimal airFriction: 0.00100957 +########################################## +Ammo Class: ACE_762x51_Ball_M118LR +MaxRanges (m): [600, 800] +MuzzleVelocities (m/s): [750, 795] +Max. velocity difference (m/s): 23.28 +Max. drop difference (cm): 3.65 +Max. tof difference (ms): 17.0 +Optimal airFriction: 0.00082828 +########################################## +Ammo Class: ACE_762x51_Ball_Mk316_Mod_0 +MaxRanges (m): [600, 800] +MuzzleVelocities (m/s): [780, 810] +Max. velocity difference (m/s): 23.39 +Max. drop difference (cm): 3.25 +Max. tof difference (ms): 16.0 +Optimal airFriction: 0.00082029 +########################################## +Ammo Class: ACE_762x51_Ball_Mk319_Mod_0 +MaxRanges (m): [600, 800] +MuzzleVelocities (m/s): [840, 910] +Max. velocity difference (m/s): 19.18 +Max. drop difference (cm): 3.9 +Max. tof difference (ms): 17.0 +Optimal airFriction: 0.00102338 +########################################## +Ammo Class: ACE_762x51_Ball_M993_AP +MaxRanges (m): [600, 800] +MuzzleVelocities (m/s): [875, 930] +Max. velocity difference (m/s): 19.39 +Max. drop difference (cm): 4.08 +Max. tof difference (ms): 18.0 +Optimal airFriction: 0.00107148 +########################################## +Ammo Class: ACE_30_06_M1_Ball +MaxRanges (m): [600, 800, 900] +MuzzleVelocities (m/s): [700, 800, 840] +Max. velocity difference (m/s): 14.56 +Max. drop difference (cm): 7.89 +Max. tof difference (ms): 15.0 +Optimal airFriction: 0.000809 +########################################## +Ammo Class: ACE_7_Remington_Magnum_Ball +MaxRanges (m): [600, 800, 1000] +MuzzleVelocities (m/s): [720, 812, 830] +Max. velocity difference (m/s): 17.47 +Max. drop difference (cm): 4.54 +Max. tof difference (ms): 11.0 +Optimal airFriction: 0.00056738 +########################################## +Ammo Class: ACE_243_Winchester_Ball +MaxRanges (m): [700, 900, 900] +MuzzleVelocities (m/s): [830, 900, 920] +Max. velocity difference (m/s): 22.55 +Max. drop difference (cm): 4.78 +Max. tof difference (ms): 13.0 +Optimal airFriction: 0.00067875 +########################################## +Ammo Class: ACE_762x67_Ball_Mk248_Mod_0 +MaxRanges (m): [800, 900, 900] +MuzzleVelocities (m/s): [865, 900, 924] +Max. velocity difference (m/s): 24.43 +Max. drop difference (cm): 5.17 +Max. tof difference (ms): 15.0 +Optimal airFriction: 0.0007053 +########################################## +Ammo Class: ACE_762x67_Ball_Mk248_Mod_1 +MaxRanges (m): [800, 900, 900] +MuzzleVelocities (m/s): [847, 867, 877] +Max. velocity difference (m/s): 20.16 +Max. drop difference (cm): 2.99 +Max. tof difference (ms): 12.0 +Optimal airFriction: 0.00061188 +########################################## +Ammo Class: ACE_762x67_Ball_Berger_Hybrid_OTM +MaxRanges (m): [900, 1000, 1000] +MuzzleVelocities (m/s): [800, 853, 884] +Max. velocity difference (m/s): 19.65 +Max. drop difference (cm): 8.25 +Max. tof difference (ms): 16.0 +Optimal airFriction: 0.00053733 +########################################## +Ammo Class: B_762x54_Ball +MaxRanges (m): [500, 800, 800] +MuzzleVelocities (m/s): [700, 820, 833] +Max. velocity difference (m/s): 14.61 +Max. drop difference (cm): 5.74 +Max. tof difference (ms): 15.0 +Optimal airFriction: 0.00100023 +########################################## +Ammo Class: ACE_762x35_Ball +MaxRanges (m): [400, 500] +MuzzleVelocities (m/s): [620, 675] +Max. velocity difference (m/s): 4.17 +Max. drop difference (cm): 1.71 +Max. tof difference (ms): 4.0 +Optimal airFriction: 0.00128942 +########################################## +Ammo Class: ACE_762x39_Ball +MaxRanges (m): [400, 600] +MuzzleVelocities (m/s): [650, 750] +Max. velocity difference (m/s): 13.0 +Max. drop difference (cm): 3.78 +Max. tof difference (ms): 8.0 +Optimal airFriction: 0.00151621 +########################################## +Ammo Class: ACE_762x54_Ball_7T2 +MaxRanges (m): [500, 800, 800] +MuzzleVelocities (m/s): [680, 750, 800] +Max. velocity difference (m/s): 9.79 +Max. drop difference (cm): 7.89 +Max. tof difference (ms): 11.0 +Optimal airFriction: 0.00103989 +########################################## +Ammo Class: ACE_303_Ball +MaxRanges (m): [900, 1000] +MuzzleVelocities (m/s): [748, 765] +Max. velocity difference (m/s): 7.24 +Max. drop difference (cm): 5.65 +Max. tof difference (ms): 11.0 +Optimal airFriction: 0.0008349 +########################################## +Ammo Class: B_93x64_Ball +MaxRanges (m): [900, 1000] +MuzzleVelocities (m/s): [850, 880] +Max. velocity difference (m/s): 11.18 +Max. drop difference (cm): 9.08 +Max. tof difference (ms): 15.0 +Optimal airFriction: 0.00108571 +########################################## +Ammo Class: B_408_Ball +MaxRanges (m): [1600, 1600] +MuzzleVelocities (m/s): [905, 915] +Max. velocity difference (m/s): 19.47 +Max. drop difference (cm): 9.17 +Max. tof difference (ms): 22.0 +Optimal airFriction: 0.00038944 +########################################## +Ammo Class: ACE_106x83mm_Ball +MaxRanges (m): [1400, 1400] +MuzzleVelocities (m/s): [955, 965] +Max. velocity difference (m/s): 23.44 +Max. drop difference (cm): 8.93 +Max. tof difference (ms): 25.0 +Optimal airFriction: 0.00052047 +########################################## +Ammo Class: B_338_Ball +MaxRanges (m): [1100, 1300] +MuzzleVelocities (m/s): [880, 925] +Max. velocity difference (m/s): 31.95 +Max. drop difference (cm): 9.97 +Max. tof difference (ms): 33.0 +Optimal airFriction: 0.00059133 +########################################## +Ammo Class: B_338_NM_Ball +MaxRanges (m): [1100, 1300] +MuzzleVelocities (m/s): [790, 820] +Max. velocity difference (m/s): 24.5 +Max. drop difference (cm): 8.87 +Max. tof difference (ms): 27.0 +Optimal airFriction: 0.00052201 +########################################## +Ammo Class: ACE_338_Ball +MaxRanges (m): [1200, 1300] +MuzzleVelocities (m/s): [800, 830] +Max. velocity difference (m/s): 23.06 +Max. drop difference (cm): 11.27 +Max. tof difference (ms): 25.0 +Optimal airFriction: 0.0005219 +########################################## +Ammo Class: ACE_338_Ball_API526 +MaxRanges (m): [1200, 1300] +MuzzleVelocities (m/s): [880, 920] +Max. velocity difference (m/s): 17.05 +Max. drop difference (cm): 14.52 +Max. tof difference (ms): 29.0 +Optimal airFriction: 0.00069611 +########################################## +Ammo Class: B_127x99_Ball +MaxRanges (m): [1300, 1300] +MuzzleVelocities (m/s): [895, 905] +Max. velocity difference (m/s): 19.44 +Max. drop difference (cm): 9.36 +Max. tof difference (ms): 24.0 +Optimal airFriction: 0.00057503 +########################################## +Ammo Class: ACE_127x99_Ball_AMAX +MaxRanges (m): [1600, 1600] +MuzzleVelocities (m/s): [855, 865] +Max. velocity difference (m/s): 16.61 +Max. drop difference (cm): 9.1 +Max. tof difference (ms): 20.0 +Optimal airFriction: 0.00036645 +########################################## +Ammo Class: B_127x108_Ball +MaxRanges (m): [1300, 1300] +MuzzleVelocities (m/s): [815, 825] +Max. velocity difference (m/s): 10.66 +Max. drop difference (cm): 11.74 +Max. tof difference (ms): 22.0 +Optimal airFriction: 0.000638 +########################################## +Ammo Class: ACE_762x51_Ball_Subsonic +MaxRanges (m): [200, 300] +MuzzleVelocities (m/s): [305, 340] +Max. velocity difference (m/s): 7.92 +Max. drop difference (cm): 3.77 +Max. tof difference (ms): 9.0 +Optimal airFriction: 0.00049899 +########################################## +Ammo Class: B_9x21_Ball +MaxRanges (m): [200, 300, 300] +MuzzleVelocities (m/s): [440, 460, 480] +Max. velocity difference (m/s): 37.94 +Max. drop difference (cm): 5.27 +Max. tof difference (ms): 31.0 +Optimal airFriction: 0.00226847 +########################################## +Ammo Class: ACE_9x18_Ball_57N181S +MaxRanges (m): [100, 200, 200] +MuzzleVelocities (m/s): [298, 330, 350] +Max. velocity difference (m/s): 18.03 +Max. drop difference (cm): 4.41 +Max. tof difference (ms): 17.0 +Optimal airFriction: 0.00190333 +########################################## +Ammo Class: ACE_9x19_Ball +MaxRanges (m): [100, 200, 200] +MuzzleVelocities (m/s): [340, 370, 400] +Max. velocity difference (m/s): 17.59 +Max. drop difference (cm): 6.56 +Max. tof difference (ms): 10.0 +Optimal airFriction: 0.0018577 +########################################## +Ammo Class: ACE_10x25_Ball +MaxRanges (m): [200, 300, 300] +MuzzleVelocities (m/s): [360, 400, 430] +Max. velocity difference (m/s): 32.8 +Max. drop difference (cm): 8.8 +Max. tof difference (ms): 34.0 +Optimal airFriction: 0.00181928 +########################################## +Ammo Class: ACE_765x17_Ball +MaxRanges (m): [100, 200, 200] +MuzzleVelocities (m/s): [282, 300, 320] +Max. velocity difference (m/s): 11.18 +Max. drop difference (cm): 4.3 +Max. tof difference (ms): 13.0 +Optimal airFriction: 0.00163356 +########################################## +Ammo Class: B_127x54_Ball +MaxRanges (m): [500, 500] +MuzzleVelocities (m/s): [295, 305] +Max. velocity difference (m/s): 2.28 +Max. drop difference (cm): 4.52 +Max. tof difference (ms): 5.0 +Optimal airFriction: 0.00019268 +########################################## +Ammo Class: B_45ACP_Ball +MaxRanges (m): [100, 200, 200] +MuzzleVelocities (m/s): [230, 250, 285] +Max. velocity difference (m/s): 3.5 +Max. drop difference (cm): 2.99 +Max. tof difference (ms): 6.0 +Optimal airFriction: 0.00081221 \ No newline at end of file diff --git a/extras/assets/icons/Icons_Modules.psd b/extras/assets/icons/Icons_Modules.psd index 9686644521..927c497ecd 100644 Binary files a/extras/assets/icons/Icons_Modules.psd and b/extras/assets/icons/Icons_Modules.psd differ diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Captive_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Captive_ca.png new file mode 100644 index 0000000000..f40078473c Binary files /dev/null and b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Captive_ca.png differ diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Settings_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Settings_ca.png new file mode 100644 index 0000000000..517c060180 Binary files /dev/null and b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Settings_ca.png differ diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Surrender_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Surrender_ca.png new file mode 100644 index 0000000000..5d7d08b50a Binary files /dev/null and b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Surrender_ca.png differ diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Unconscious_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Unconscious_ca.png new file mode 100644 index 0000000000..abbb79bb9b Binary files /dev/null and b/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Unconscious_ca.png differ diff --git a/extras/assets/icons/png/Icon_Module/Icons_Module_Sitting_ca.png b/extras/assets/icons/png/Icon_Module/Icons_Module_Sitting_ca.png new file mode 100644 index 0000000000..c19c3ca276 Binary files /dev/null and b/extras/assets/icons/png/Icon_Module/Icons_Module_Sitting_ca.png differ diff --git a/mod.cpp b/mod.cpp index b878c76a6d..c078328e53 100644 --- a/mod.cpp +++ b/mod.cpp @@ -1,8 +1,8 @@ -name = "Advanced Combat Environment 3.0.0"; +name = "Advanced Combat Environment 3.1.2"; picture = "logo_ace3_ca.paa"; actionName = "GitHub"; action = "https://github.com/acemod/ACE3"; -description = "ACE3 - Version 3.0.0"; +description = "ACE3 - Version 3.1.2"; logo = "logo_ace3_ca.paa"; logoOver = "logo_ace3_ca.paa"; tooltip = "ACE3"; diff --git a/optionals/compat_asdg/config.cpp b/optionals/compat_asdg/config.cpp index c7e7903ce2..40dae32051 100644 --- a/optionals/compat_asdg/config.cpp +++ b/optionals/compat_asdg/config.cpp @@ -17,6 +17,7 @@ class asdg_FrontSideRail: asdg_SlotInfo { class compatibleItems { ACE_acc_pointer_red = 1; ACE_acc_pointer_green = 1; + ACE_acc_pointer_green_IR = 1; }; }; diff --git a/optionals/compat_bwa3/$PBOPREFIX$ b/optionals/compat_bwa3/$PBOPREFIX$ new file mode 100644 index 0000000000..7331009959 --- /dev/null +++ b/optionals/compat_bwa3/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\compat_bwa3 \ No newline at end of file diff --git a/optionals/compat_bwa3/CfgAmmo.hpp b/optionals/compat_bwa3/CfgAmmo.hpp new file mode 100644 index 0000000000..599651ac10 --- /dev/null +++ b/optionals/compat_bwa3/CfgAmmo.hpp @@ -0,0 +1,135 @@ +class CfgAmmo { + class B_9x21_Ball; + class B_556x45_Ball_Tracer_Red; + class B_762x51_Tracer_Red; + class B_127x99_Ball_Tracer_Red; + class BWA3_B_556x45_Ball: B_556x45_Ball_Tracer_Red { + ACE_caliber=5.69; + ACE_bulletLength=23.012; + ACE_bulletMass=4.0176; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; + }; + class BWA3_B_556x45_Ball_SD: BWA3_B_556x45_Ball { + // Reference? + ACE_ballisticCoefficients[]={}; + ACE_velocityBoundaries[]={}; + ACE_muzzleVelocities[]={}; + ACE_barrelLengths[]={}; + }; + class BWA3_B_556x45_Ball_AP: BWA3_B_556x45_Ball { + ACE_caliber=5.69; + ACE_bulletLength=23.012; + ACE_bulletMass=4.5359237; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.310}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={820, 865, 880}; + ACE_barrelLengths[]={254.0, 393.7, 508.0}; + }; + class BWA3_B_762x51_Ball: B_762x51_Tracer_Red { + ACE_caliber=7.823; + ACE_bulletLength=28.956; + ACE_bulletMass=9.4608; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; + }; + class BWA3_B_762x51_Ball_SD: BWA3_B_762x51_Ball { + ACE_caliber=7.823; + ACE_bulletLength=34.036; + ACE_bulletMass=12.96; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.235}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={305, 325, 335, 340}; + ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + }; + class BWA3_B_762x51_Ball_AP: BWA3_B_762x51_Ball { + ACE_caliber=7.823; + ACE_bulletLength=31.496; + ACE_bulletMass=8.22946157; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.359}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={875, 910, 930}; + ACE_barrelLengths[]={330.2, 406.4, 508.0}; + }; + class BWA3_B_762x51_Ball_LR: BWA3_B_762x51_Ball { + ACE_caliber=7.823; + ACE_bulletLength=31.496; + ACE_bulletMass=11.34; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.243}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; + }; + class BWA3_B_127x99_Ball: B_127x99_Ball_Tracer_Red { + ACE_caliber=12.954; + ACE_bulletLength=58.674; + ACE_bulletMass=41.9256; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={900}; + ACE_barrelLengths[]={736.6}; + }; + class BWA3_B_127x99_Ball_SD: BWA3_B_127x99_Ball { + // Reference? + ACE_ballisticCoefficients[]={}; + ACE_velocityBoundaries[]={}; + ACE_muzzleVelocities[]={}; + ACE_barrelLengths[]={}; + }; + class BWA3_B_127x99_Ball_AP: BWA3_B_127x99_Ball { + ACE_caliber=12.954; + ACE_bulletLength=58.674; + ACE_bulletMass=41.9904; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={900}; + ACE_barrelLengths[]={736.6}; + }; + class BWA3_B_46x30_Ball: B_9x21_Ball { + ACE_caliber=4.902; + ACE_bulletLength=13.005; + ACE_bulletMass=2.0088; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.1455}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 720, 730, 740}; + ACE_barrelLengths[]={101.6, 177.8, 228.6, 304.8}; + }; + class BWA3_B_46x30_Ball_SD: BWA3_B_46x30_Ball { + // Reference? + ACE_ballisticCoefficients[]={}; + ACE_velocityBoundaries[]={}; + ACE_muzzleVelocities[]={}; + ACE_barrelLengths[]={}; + }; +}; \ No newline at end of file diff --git a/optionals/compat_bwa3/CfgWeapons.hpp b/optionals/compat_bwa3/CfgWeapons.hpp new file mode 100644 index 0000000000..731396ed73 --- /dev/null +++ b/optionals/compat_bwa3/CfgWeapons.hpp @@ -0,0 +1,161 @@ +class CfgWeapons { + class Pistol_Base_F; + class Rifle_Base_F; + class Rifle_Long_Base_F; + class BWA3_P8: Pistol_Base_F { + ACE_barrelTwist=248.92; + ACE_barrelLength=108; + }; + class BWA3_MP7: Pistol_Base_F { + ACE_barrelTwist=160.02; + ACE_barrelLength=180; + }; + class BWA3_G36: Rifle_Base_F { + ACE_barrelTwist=177.8; + ACE_barrelLength=480; + }; + class BWA3_G36K: BWA3_G36 { + ACE_barrelTwist=177.8; + ACE_barrelLength=318; + }; + class BWA3_G28_Standard: Rifle_Long_Base_F { + ACE_barrelTwist=304.8; + ACE_barrelLength=421; + }; + class BWA3_G28_Assault: BWA3_G28_Standard { + ACE_barrelTwist=304.8; + ACE_barrelLength=421; + }; + class BWA3_G27: BWA3_G28_Standard { + ACE_barrelTwist=304.8; + ACE_barrelLength=406; + }; + class BWA3_MG4: Rifle_Long_Base_F { + ACE_barrelTwist=177.8; + ACE_barrelLength=480; + }; + class BWA3_MG5: Rifle_Long_Base_F { + ACE_barrelTwist=304.8; + ACE_barrelLength=550; + }; + class BWA3_G82: Rifle_Long_Base_F { + ACE_barrelTwist=381.0; + ACE_barrelLength=736.7; + }; + + class optic_Hamr; + class InventoryOpticsItem_Base_F; + + class BWA3_optic_ZO4x30 : optic_Hamr { + ACE_ScopeAdjust_Vertical[] = { -10, 10 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.2; + ACE_ScopeAdjust_HorizontalIncrement = 0.2; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 200 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class BWA3_optic_ZO4x30_NSV : optic_Hamr { + ACE_ScopeAdjust_Vertical[] = { -10, 10 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.2; + ACE_ScopeAdjust_HorizontalIncrement = 0.2; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 200 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class BWA3_optic_ZO4x30_IRV : optic_Hamr { + ACE_ScopeAdjust_Vertical[] = { -10, 10 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.2; + ACE_ScopeAdjust_HorizontalIncrement = 0.2; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 200 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class BWA3_optic_Shortdot : optic_Hamr { + ACE_ScopeAdjust_Vertical[] = { -0.1, 10.1 }; + ACE_ScopeAdjust_Horizontal[] = { -5.1, 5.1 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class BWA3_optic_20x50 : optic_Hamr { + ACE_ScopeAdjust_Vertical[] = { 0, 26 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class BWA3_optic_20x50_NSV : BWA3_optic_20x50 { + ACE_ScopeAdjust_Vertical[] = { 0, 26 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class BWA3_optic_24x72 : optic_Hamr { + ACE_ScopeAdjust_Vertical[] = { 0, 16 }; + ACE_ScopeAdjust_Horizontal[] = { -7, 7 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class BWA3_optic_24x72_NSV : BWA3_optic_20x50 { + ACE_ScopeAdjust_Vertical[] = { 0, 16 }; + ACE_ScopeAdjust_Horizontal[] = { -7, 7 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Scope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/optionals/compat_hlcmods_ak/config.cpp b/optionals/compat_bwa3/config.cpp similarity index 78% rename from optionals/compat_hlcmods_ak/config.cpp rename to optionals/compat_bwa3/config.cpp index 7c8cdba2ba..e1ca37d121 100644 --- a/optionals/compat_hlcmods_ak/config.cpp +++ b/optionals/compat_bwa3/config.cpp @@ -5,10 +5,11 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_aks"}; + requiredAddons[] = {"BWA3_Weapons"}; author[]={"Ruthberg"}; VERSION_CONFIG; }; }; +#include "CfgAmmo.hpp" #include "CfgWeapons.hpp" diff --git a/optionals/compat_hlcmods_g3/script_component.hpp b/optionals/compat_bwa3/script_component.hpp similarity index 71% rename from optionals/compat_hlcmods_g3/script_component.hpp rename to optionals/compat_bwa3/script_component.hpp index 642977f87b..86bb669119 100644 --- a/optionals/compat_hlcmods_g3/script_component.hpp +++ b/optionals/compat_bwa3/script_component.hpp @@ -1,4 +1,4 @@ -#define COMPONENT hlcweapons_g3_comp +#define COMPONENT BWA3_Weapons_comp #include "\z\ace\addons\main\script_mod.hpp" diff --git a/optionals/compat_cup/CfgAmmo.hpp b/optionals/compat_cup/CfgAmmo.hpp index 58f61aedce..f5ba34fc7e 100644 --- a/optionals/compat_cup/CfgAmmo.hpp +++ b/optionals/compat_cup/CfgAmmo.hpp @@ -1,10 +1,10 @@ class CfgAmmo { - class BulletBase; - class B_762x51_Ball; - class B_127x99_Ball; - class CUP_B_545x39_Ball: BulletBase - { + class BulletBase; + class B_762x51_Ball; + class B_127x99_Ball; + class CUP_B_545x39_Ball: BulletBase { + airFriction=-0.0011204; ACE_caliber=5.588; ACE_bulletLength=21.59; ACE_bulletMass=3.42792; @@ -15,9 +15,9 @@ class CfgAmmo ACE_dragModel=7; ACE_muzzleVelocities[]={780, 880, 920}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_Green: CUP_B_545x39_Ball - { + }; + class CUP_B_545x39_Ball_Tracer_Green: CUP_B_545x39_Ball { + airFriction=-0.0011204; ACE_caliber=5.588; ACE_bulletLength=21.59; ACE_bulletMass=3.22704; @@ -28,9 +28,9 @@ class CfgAmmo ACE_dragModel=7; ACE_muzzleVelocities[]={785, 883, 925}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_Red: BulletBase - { + }; + class CUP_B_545x39_Ball_Tracer_Red: BulletBase { + airFriction=-0.0011204; ACE_caliber=5.588; ACE_bulletLength=21.59; ACE_bulletMass=3.22704; @@ -41,9 +41,9 @@ class CfgAmmo ACE_dragModel=7; ACE_muzzleVelocities[]={785, 883, 925}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_White: BulletBase - { + }; + class CUP_B_545x39_Ball_Tracer_White: BulletBase { + airFriction=-0.0011204; ACE_caliber=5.588; ACE_bulletLength=21.59; ACE_bulletMass=3.22704; @@ -54,9 +54,9 @@ class CfgAmmo ACE_dragModel=7; ACE_muzzleVelocities[]={785, 883, 925}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_Yellow: BulletBase - { + }; + class CUP_B_545x39_Ball_Tracer_Yellow: BulletBase { + airFriction=-0.0011204; ACE_caliber=5.588; ACE_bulletLength=21.59; ACE_bulletMass=3.22704; @@ -67,9 +67,9 @@ class CfgAmmo ACE_dragModel=7; ACE_muzzleVelocities[]={785, 883, 925}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_762x39_Ball: BulletBase - { + }; + class CUP_B_762x39_Ball: BulletBase { + airFriction=-0.00150173; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=7.9704; @@ -80,9 +80,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={650, 716, 750}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_762x39_Ball_Tracer_Green: BulletBase - { + }; + class CUP_B_762x39_Ball_Tracer_Green: BulletBase { + airFriction=-0.00150173; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=7.5816; @@ -93,9 +93,22 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={650, 716, 750}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_9x18_Ball: BulletBase - { + }; + class B_762x39mm_KLT: BulletBase { + airFriction=-0.00150173; + ACE_caliber=7.823; + ACE_bulletLength=28.956; + ACE_bulletMass=7.5816; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={254.0, 414.02, 508.0}; + }; + class CUP_B_9x18_Ball: BulletBase { + airFriction=-0.00180193; ACE_caliber=9.271; ACE_bulletLength=15.494; ACE_bulletMass=6.00048; @@ -107,8 +120,8 @@ class CfgAmmo ACE_muzzleVelocities[]={298, 330, 350}; ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; - class CUP_B_9x18_Ball_Tracer_Green: BulletBase - { + class CUP_B_9x18_Ball_Tracer_Green: BulletBase { + airFriction=-0.00180193; ACE_caliber=9.271; ACE_bulletLength=15.494; ACE_bulletMass=6.00048; @@ -120,8 +133,8 @@ class CfgAmmo ACE_muzzleVelocities[]={298, 330, 350}; ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; - class CUP_B_9x18_Ball_Tracer_Red: BulletBase - { + class CUP_B_9x18_Ball_Tracer_Red: BulletBase { + airFriction=-0.00180193; ACE_caliber=9.271; ACE_bulletLength=15.494; ACE_bulletMass=6.00048; @@ -133,8 +146,8 @@ class CfgAmmo ACE_muzzleVelocities[]={298, 330, 350}; ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; - class CUP_B_9x18_Ball_Tracer_Yellow: BulletBase - { + class CUP_B_9x18_Ball_Tracer_Yellow: BulletBase { + airFriction=-0.00180193; ACE_caliber=9.271; ACE_bulletLength=15.494; ACE_bulletMass=6.00048; @@ -146,8 +159,8 @@ class CfgAmmo ACE_muzzleVelocities[]={298, 330, 350}; ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; - class CUP_B_9x18_Ball_White_Tracer: BulletBase - { + class CUP_B_9x18_Ball_White_Tracer: BulletBase { + airFriction=-0.00180193; ACE_caliber=9.271; ACE_bulletLength=15.494; ACE_bulletMass=6.00048; @@ -159,8 +172,8 @@ class CfgAmmo ACE_muzzleVelocities[]={298, 330, 350}; ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; - class CUP_B_9x19_Ball: BulletBase - { + class CUP_B_9x19_Ball: BulletBase { + airFriction=-0.00205726; ACE_caliber=9.017; ACE_bulletLength=15.494; ACE_bulletMass=8.0352; @@ -171,9 +184,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={340, 370, 400}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; - }; - class CUP_B_762x51_noTracer: B_762x51_Ball - { + }; + class CUP_B_762x51_noTracer: B_762x51_Ball { + airFriction=-0.00099036; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=9.4608; @@ -184,9 +197,9 @@ class CfgAmmo ACE_dragModel=7; ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_303_Ball: BulletBase - { + }; + class CUP_B_303_Ball: BulletBase { + airFriction=-0.00082199; ACE_caliber=7.899; ACE_bulletLength=31.166; ACE_bulletMass=11.2752; @@ -197,9 +210,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={748, 761, 765}; ACE_barrelLengths[]={508.0, 609.6, 660.4}; - }; - class CUP_B_127x107_Ball_Green_Tracer: BulletBase - { + }; + class CUP_B_127x107_Ball_Green_Tracer: BulletBase { + airFriction=-0.00062618; ACE_caliber=12.979; ACE_bulletLength=64.008; ACE_bulletMass=48.276; @@ -211,8 +224,8 @@ class CfgAmmo ACE_muzzleVelocities[]={820}; ACE_barrelLengths[]={728.98}; }; - class CUP_B_127x108_Ball_Green_Tracer: BulletBase - { + class CUP_B_127x108_Ball_Green_Tracer: BulletBase { + airFriction=-0.00062618; ACE_caliber=12.979; ACE_bulletLength=64.008; ACE_bulletMass=48.276; @@ -224,8 +237,8 @@ class CfgAmmo ACE_muzzleVelocities[]={820}; ACE_barrelLengths[]={728.98}; }; - class CUP_B_762x54_Ball_White_Tracer: BulletBase - { + class CUP_B_762x54_Ball_White_Tracer: BulletBase { + airFriction=-0.00101742; ACE_caliber=7.925; ACE_bulletLength=28.956; ACE_bulletMass=9.6552; @@ -237,8 +250,8 @@ class CfgAmmo ACE_muzzleVelocities[]={680, 750, 798, 800}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class CUP_B_762x54_Ball_Red_Tracer: BulletBase - { + class CUP_B_762x54_Ball_Red_Tracer: BulletBase { + airFriction=-0.00101742; ACE_caliber=7.925; ACE_bulletLength=28.956; ACE_bulletMass=9.6552; @@ -250,8 +263,8 @@ class CfgAmmo ACE_muzzleVelocities[]={680, 750, 798, 800}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class CUP_B_762x54_Ball_Green_Tracer: BulletBase - { + class CUP_B_762x54_Ball_Green_Tracer: BulletBase { + airFriction=-0.00101742; ACE_caliber=7.925; ACE_bulletLength=28.956; ACE_bulletMass=9.6552; @@ -263,8 +276,8 @@ class CfgAmmo ACE_muzzleVelocities[]={680, 750, 798, 800}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class CUP_B_762x54_Ball_Yellow_Tracer: BulletBase - { + class CUP_B_762x54_Ball_Yellow_Tracer: BulletBase { + airFriction=-0.00101742; ACE_caliber=7.925; ACE_bulletLength=28.956; ACE_bulletMass=9.6552; @@ -276,8 +289,8 @@ class CfgAmmo ACE_muzzleVelocities[]={680, 750, 798, 800}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class CUP_B_9x39_SP5: BulletBase - { + class CUP_B_9x39_SP5: BulletBase { + airFriction=-0.00075274; ACE_caliber=9.246; ACE_bulletLength=31.496; ACE_bulletMass=16.2; @@ -288,9 +301,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={280, 300, 320}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_762x51_Tracer_Green: BulletBase - { + }; + class CUP_B_762x51_Tracer_Green: BulletBase { + airFriction=-0.00099036; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=9.4608; @@ -302,8 +315,8 @@ class CfgAmmo ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; - class CUP_B_762x51_Tracer_Red: BulletBase - { + class CUP_B_762x51_Tracer_Red: BulletBase { + airFriction=-0.00099036; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=9.4608; @@ -315,8 +328,8 @@ class CfgAmmo ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; - class CUP_B_762x51_Tracer_Yellow: BulletBase - { + class CUP_B_762x51_Tracer_Yellow: BulletBase { + airFriction=-0.00099036; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=9.4608; @@ -328,8 +341,8 @@ class CfgAmmo ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; - class CUP_B_762x51_Tracer_White: BulletBase - { + class CUP_B_762x51_Tracer_White: BulletBase { + airFriction=-0.00099036; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=9.4608; @@ -341,8 +354,7 @@ class CfgAmmo ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; - class B_127x107_Ball: BulletBase - { + class B_127x107_Ball: BulletBase { ACE_caliber=12.979; ACE_bulletLength=64.008; ACE_bulletMass=48.276; @@ -353,9 +365,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={820}; ACE_barrelLengths[]={728.98}; - }; - class CUP_B_9x18_SD: BulletBase - { + }; + class CUP_B_9x18_SD: BulletBase { + airFriction=-0.00180193; ACE_caliber=9.271; ACE_bulletLength=15.494; ACE_bulletMass=6.00048; @@ -366,9 +378,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={298, 330, 340}; ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; - class CUP_B_765x17_Ball: BulletBase - { + }; + class CUP_B_765x17_Ball: BulletBase { + airFriction=-0.00173452; ACE_caliber=7.938; ACE_bulletLength=15.494; ACE_bulletMass=4.212; @@ -379,9 +391,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={282, 300, 320}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; - }; - class CUP_B_145x115_AP_Green_Tracer: BulletBase - { + }; + class CUP_B_145x115_AP_Green_Tracer: BulletBase { + airFriction=-0.00059041; ACE_caliber=14.884; ACE_bulletLength=50.8; ACE_bulletMass=65.448; @@ -392,9 +404,9 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={1000}; ACE_barrelLengths[]={1346.2}; - }; - class CUP_B_127x99_Ball_White_Tracer: B_127x99_Ball - { + }; + class CUP_B_127x99_Ball_White_Tracer: B_127x99_Ball { + airFriction=-0.00057503; ACE_caliber=12.954; ACE_bulletLength=58.674; ACE_bulletMass=41.9256; @@ -405,18 +417,18 @@ class CfgAmmo ACE_dragModel=1; ACE_muzzleVelocities[]={853}; ACE_barrelLengths[]={736.6}; - }; - class CUP_B_86x70_Ball_noTracer: BulletBase - { + }; + class CUP_B_86x70_Ball_noTracer: BulletBase { + airFriction=-0.0005788; ACE_caliber=8.585; - ACE_bulletLength=43.18; - ACE_bulletMass=19.44; + ACE_bulletLength=39.573; + ACE_bulletMass=16.2; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.381}; + ACE_ballisticCoefficients[]={0.322}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={820, 826, 830}; - ACE_barrelLengths[]={609.6, 673.1, 711.2}; - }; + ACE_muzzleVelocities[]={880, 915, 925}; + ACE_barrelLengths[]={508.0, 660.4, 711.2}; + }; }; \ No newline at end of file diff --git a/optionals/compat_cup/CfgMagazines.hpp b/optionals/compat_cup/CfgMagazines.hpp new file mode 100644 index 0000000000..469476734c --- /dev/null +++ b/optionals/compat_cup/CfgMagazines.hpp @@ -0,0 +1,267 @@ +class CfgMagazines { + class CUP_M136_M; + class CUP_RPG18_M; + class CUP_NLAW_M; + class ACE_PreloadedMissileDummy_CUP: CUP_M136_M { // The dummy magazine + author = "$STR_ACE_Common_ACETeam"; + scope = 1; + scopeArsenal = 1; + displayName = "Preloaded Missle"; + //displayName = "$STR_ACE_Disposable_PreloadedMissileDummy"; + picture = PATHTOEF(common,UI\blank_CO.paa); + weaponPoolAvailable = 0; + mass = 0; + }; + class ACE_FiredMissileDummy_CUP: ACE_PreloadedMissileDummy_CUP { + count = 0; + }; + class ACE_UsedTube_M136_F: CUP_M136_M { + author = "$STR_ACE_Common_ACETeam"; + displayName = "$STR_ACE_Disposable_UsedTube"; + descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + displayNameShort = "-"; + count = 0; + weaponPoolAvailable = 0; + modelSpecial = ""; + mass = 0; + }; + class ACE_UsedTube_RPG18_F: CUP_RPG18_M { + author = "$STR_ACE_Common_ACETeam"; + displayName = "$STR_ACE_Disposable_UsedTube"; + descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + displayNameShort = "-"; + count = 0; + weaponPoolAvailable = 0; + modelSpecial = ""; + mass = 0; + }; + class ACE_UsedTube_NLAW_F: CUP_NLAW_M { + author = "$STR_ACE_Common_ACETeam"; + displayName = "$STR_ACE_Disposable_UsedTube"; + descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + displayNameShort = "-"; + count = 0; + weaponPoolAvailable = 0; + modelSpecial = ""; + mass = 0; + }; + + class CA_Magazine; + class 30Rnd_556x45_Stanag; + class CUP_30Rnd_545x39_AK_M: CA_Magazine { + initSpeed = 880; + }; + class CUP_30Rnd_TE1_Green_Tracer_545x39_AK_M: CA_Magazine { + initSpeed = 880; + }; + class CUP_30Rnd_TE1_Red_Tracer_545x39_AK_M: CA_Magazine { + initSpeed = 880; + }; + class CUP_30Rnd_TE1_White_Tracer_545x39_AK_M: CA_Magazine { + initSpeed = 880; + }; + class CUP_30Rnd_TE1_Yellow_Tracer_545x39_AK_M: CA_Magazine { + initSpeed = 880; + }; + class CUP_75Rnd_TE4_LRT4_Green_Tracer_545x39_RPK_M: CA_Magazine { + initSpeed = 880; + }; + class CUP_30Rnd_762x39_AK47_M: CA_Magazine { + initSpeed = 750; + }; + class CUP_64Rnd_9x19_Bizon_M: CA_Magazine { + initSpeed = 350; + }; + class CUP_64Rnd_Green_Tracer_9x19_Bizon_M: CA_Magazine { + initSpeed = 350; + }; + class CUP_64Rnd_Red_Tracer_9x19_Bizon_M: CA_Magazine { + initSpeed = 350; + }; + class CUP_64Rnd_White_Tracer_9x19_Bizon_M: CA_Magazine { + initSpeed = 350; + }; + class CUP_64Rnd_Yellow_Tracer_9x19_Bizon_M: CA_Magazine { + initSpeed = 350; + }; + class CUP_5x_22_LR_17_HMR_M: CA_Magazine { + initSpeed = 830; + }; + class CUP_10x_303_M: CA_Magazine { + initSpeed = 765; + }; + class CUP_20Rnd_762x51_FNFAL_M: CA_Magazine { + initSpeed = 833; + }; + class CUP_5Rnd_127x108_KSVK_M: CA_Magazine { + initSpeed = 820; + }; + class CUP_100Rnd_TE4_LRT4_White_Tracer_762x51_Belt_M: CA_Magazine { + initSpeed = 833; + }; + class CUP_100Rnd_TE4_LRT4_Red_Tracer_762x51_Belt_M: CUP_100Rnd_TE4_LRT4_White_Tracer_762x51_Belt_M { + initSpeed = 833; + }; + class CUP_200Rnd_TE4_LRT4_White_Tracer_762x51_Belt_M: CA_Magazine { + initSpeed = 833; + }; + class CUP_200Rnd_TE4_LRT4_Red_Tracer_762x51_Belt_M: CA_Magazine { + initSpeed = 833; + }; + class CUP_100Rnd_TE4_LRT4_762x54_PK_Tracer_Green_M: CA_Magazine { + initSpeed = 800; + }; + class CUP_10Rnd_762x54_SVD_M: CA_Magazine { + initSpeed = 800; + }; + class CUP_10Rnd_9x39_SP5_VSS_M: CA_Magazine { + initSpeed = 300; + }; + class CUP_20Rnd_9x39_SP5_VSS_M: CA_Magazine { + initSpeed = 300; + }; + class CUP_5Rnd_127x99_as50_M: CA_Magazine { + initSpeed = 900; + }; + class CUP_20Rnd_762x51_DMR: CA_Magazine { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Yellow_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Red_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Green_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_White_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { + initSpeed = 833; + }; + class CUP_20Rnd_762x51_B_SCAR: CA_Magazine { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Yellow_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Red_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Green_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_White_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { + initSpeed = 833; + }; + class CUP_20Rnd_762x51_B_M110: CA_Magazine { + initSpeed = 833; + }; + class CUP_5Rnd_762x51_M24: CA_Magazine { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Yellow_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Red_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_Green_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { + initSpeed = 833; + }; + class CUP_20Rnd_TE1_White_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { + initSpeed = 833; + }; + class CUP_30Rnd_556x45_G36: 30Rnd_556x45_Stanag { + initSpeed = 920; + }; + class CUP_30Rnd_TE1_Red_Tracer_556x45_G36: CUP_30Rnd_556x45_G36 { + initSpeed = 920; + }; + class CUP_30Rnd_TE1_Green_Tracer_556x45_G36: CUP_30Rnd_556x45_G36 { + initSpeed = 920; + }; + class CUP_30Rnd_TE1_Yellow_Tracer_556x45_G36: CUP_30Rnd_556x45_G36 { + initSpeed = 920; + }; + class CUP_100Rnd_556x45_BetaCMag: 30Rnd_556x45_Stanag { + initSpeed = 920; + }; + class CUP_100Rnd_TE1_Red_Tracer_556x45_BetaCMag: CUP_100Rnd_556x45_BetaCMag { + initSpeed = 920; + }; + class CUP_100Rnd_TE1_Green_Tracer_556x45_BetaCMag: CUP_100Rnd_556x45_BetaCMag { + initSpeed = 920; + }; + class CUP_100Rnd_TE1_Yellow_Tracer_556x45_BetaCMag: CUP_100Rnd_556x45_BetaCMag { + initSpeed = 920; + }; + class CUP_200Rnd_TE4_Green_Tracer_556x45_M249: CA_Magazine { + initSpeed = 920; + }; + class CUP_200Rnd_TE4_Red_Tracer_556x45_M249: CUP_200Rnd_TE4_Green_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_200Rnd_TE4_Yellow_Tracer_556x45_M249: CUP_200Rnd_TE4_Green_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_200Rnd_TE1_Red_Tracer_556x45_M249: CUP_200Rnd_TE4_Red_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_100Rnd_TE4_Green_Tracer_556x45_M249: CA_Magazine { + initSpeed = 920; + }; + class CUP_100Rnd_TE4_Red_Tracer_556x45_M249: CUP_100Rnd_TE4_Green_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_100Rnd_TE4_Yellow_Tracer_556x45_M249: CUP_100Rnd_TE4_Green_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_200Rnd_TE4_Green_Tracer_556x45_L110A1: CUP_200Rnd_TE4_Green_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_200Rnd_TE4_Red_Tracer_556x45_L110A1: CUP_200Rnd_TE4_Red_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_200Rnd_TE4_Yellow_Tracer_556x45_L110A1: CUP_200Rnd_TE4_Yellow_Tracer_556x45_M249 { + initSpeed = 920; + }; + class CUP_30Rnd_556x45_Stanag: CA_Magazine { + initSpeed = 920; + }; + class CUP_20Rnd_556x45_Stanag: CUP_30Rnd_556x45_Stanag { + initSpeed = 920; + }; + class CUP_10Rnd_127x99_M107: CA_Magazine { + initSpeed = 900; + }; + class CUP_10Rnd_762x51_CZ750: CA_Magazine { + initSpeed = 833; + }; + class CUP_10Rnd_762x51_CZ750_Tracer: CUP_10Rnd_762x51_CZ750 { + initSpeed = 833; + }; + class CUP_50Rnd_UK59_762x54R_Tracer: CA_Magazine { + initSpeed = 800; + }; + class CUP_8Rnd_9x18_Makarov_M: CA_Magazine { + initSpeed = 300; + }; + class CUP_8Rnd_9x18_MakarovSD_M: CUP_8Rnd_9x18_Makarov_M { + initSpeed = 300; + }; + class CUP_6Rnd_45ACP_M: CA_Magazine { + initSpeed = 250; + }; + class CUP_17Rnd_9x19_glock17: CA_Magazine { + initSpeed = 370; + }; + class CUP_5Rnd_86x70_L115A1: CA_Magazine { + initSpeed = 915; + }; + class CUP_20Rnd_B_765x17_Ball_M: CA_Magazine { + initSpeed = 290; + }; + class CUP_30Rnd_9x19_MP5: CA_Magazine { + initSpeed = 400; + }; +}; \ No newline at end of file diff --git a/optionals/compat_cup/CfgWeapons.hpp b/optionals/compat_cup/CfgWeapons.hpp new file mode 100644 index 0000000000..76d442ee53 --- /dev/null +++ b/optionals/compat_cup/CfgWeapons.hpp @@ -0,0 +1,697 @@ +class CfgWeapons +{ + class Pistol_Base_F; + class Rifle_Base_F; + class Rifle_Long_Base_F; + class Launcher_Base_F; + class CUP_hgun_Colt1911 : Pistol_Base_F { + initSpeed=-1.04; + ACE_barrelTwist=406.4; + ACE_barrelLength=127.0; + }; + class CUP_sgun_AA12 : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=0.0; + ACE_twistDirection=0; + ACE_barrelLength=457.2; + }; + class CUP_arifle_AK_Base : Rifle_Base_F { + initSpeed=-0.95467; + ACE_barrelTwist=240.03; + ACE_barrelLength=414.02; + }; + class CUP_arifle_AK107_Base : CUP_arifle_AK_Base { + initSpeed=-1.0; + ACE_barrelTwist=199.898; + ACE_barrelLength=414.02; + }; + class CUP_arifle_AKS_Base : CUP_arifle_AK_Base { + initSpeed=-0.95467; + ACE_barrelTwist=199.898; + ACE_barrelLength=414.02; + }; + class CUP_arifle_AKS74U : CUP_arifle_AK_Base { + initSpeed=-0.88636; + ACE_barrelTwist=160.02; + ACE_barrelLength=210.82; + }; + class CUP_arifle_AK74; + class CUP_arifle_RPK74 : CUP_arifle_AK74 { + initSpeed=-1.0; + ACE_barrelTwist=195.072; + ACE_barrelLength=589.28; + }; + class CUP_srifle_AS50 : Rifle_Long_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=381.0; + ACE_barrelLength=736.6; + }; + class CUP_srifle_AWM_Base : Rifle_Long_Base_F { + initSpeed=-1.00547; + ACE_barrelTwist=279.4; + ACE_barrelLength=685.8; + }; + class CUP_smg_bizon : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=231.14; + }; + class CUP_hgun_Compact : Pistol_Base_F { + initSpeed=-0.97778; + ACE_barrelTwist=248.92; + ACE_barrelLength=94.996; + }; + class CUP_srifle_CZ750 : Rifle_Long_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=304.8; + ACE_barrelLength=660.4; + }; + class CUP_arifle_CZ805_Base : Rifle_Base_F { + initSpeed=-0.87283; + ACE_barrelTwist=304.8; + ACE_barrelLength=355.6; + }; + class CUP_arifle_CZ805_A1 : CUP_arifle_CZ805_Base { + initSpeed=-0.93696; + ACE_barrelTwist=304.8; + ACE_barrelLength=355.6; + }; + class CUP_arifle_CZ805_A2 : CUP_arifle_CZ805_Base { + initSpeed=-0.87283; + ACE_barrelTwist=304.8; + ACE_barrelLength=276.86; + }; + class CUP_srifle_DMR : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=304.8; + ACE_barrelLength=558.8; + }; + class CUP_hgun_Duty : Pistol_Base_F { + initSpeed=-0.97778; + ACE_barrelTwist=248.92; + ACE_barrelLength=94.996; + }; + class CUP_arifle_FNFAL : Rifle_Base_F { + initSpeed=-0.98796; + ACE_barrelTwist=304.8; + ACE_barrelLength=533.4; + }; + class CUP_arifle_G36_Base; + class CUP_arifle_G36A : CUP_arifle_G36_Base { + initSpeed=-0.99357; + ACE_barrelTwist=177.8; + ACE_barrelLength=480; + }; + class CUP_arifle_G36K : CUP_arifle_G36A { + initSpeed=-0.90761; + ACE_barrelTwist=177.8; + ACE_barrelLength=318; + }; + class CUP_arifle_G36C : Rifle_Base_F { + initSpeed=-0.81522; + ACE_barrelTwist=177.8; + ACE_barrelLength=228; + }; + class CUP_arifle_MG36 : CUP_arifle_G36C { + initSpeed=-0.99457; + ACE_barrelTwist=177.8; + ACE_barrelLength=480; + }; + class CUP_hgun_Glock17 : Pistol_Base_F { + initSpeed=-0.9595; + ACE_barrelTwist=248.92; + ACE_barrelLength=114.046; + }; + class CUP_srifle_CZ550 : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=304.8; + ACE_barrelLength=599.999; + }; + class CUP_srifle_ksvk : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=457.2; + ACE_barrelLength=999.998; + }; + class CUP_lmg_L7A2 : Rifle_Long_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=304.8; + ACE_barrelLength=629.92; + }; + class CUP_arifle_L85A2_Base : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=177.8; + ACE_barrelLength=518.16; + }; + class CUP_arifle_L86A2_Base: Rifle_Base_F { + initSpeed=-0.97826; + ACE_barrelTwist=177.8; + ACE_barrelLength=646; + }; + class CUP_lmg_L110A1 : Rifle_Long_Base_F { + initSpeed=-0.93044; + ACE_barrelTwist=177.8; + ACE_barrelLength=347.98; + }; + class CUP_srifle_LeeEnfield : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=254.0; + ACE_barrelLength=640.08; + }; + class CUP_hgun_M9 : Pistol_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=248.92; + ACE_barrelLength=124.46; + }; + class CUP_srifle_M14 : Rifle_Base_F { + initSpeed=-0.99160; + ACE_barrelTwist=304.8; + ACE_barrelLength=558.8; + }; + class CUP_arifle_M16_Base : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=355.6; + ACE_barrelLength=508.0; + }; + class CUP_arifle_M16A4_Base; + class CUP_arifle_M4_Base : CUP_arifle_M16A4_Base { + initSpeed=-0.94565; + ACE_barrelTwist=177.8; + ACE_barrelLength=368.3; + }; + class CUP_arifle_M4A1; + class CUP_srifle_Mk12SPR : CUP_arifle_M4A1 { + initSpeed=-0.98696; + ACE_barrelTwist=177.8; + ACE_barrelLength=457.2; + }; + class CUP_srifle_M24_des : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=285.75; + ACE_barrelLength=609.6; + }; + class CUP_lmg_M60A4 : Rifle_Long_Base_F { + initSpeed=-0.96639; + ACE_barrelTwist=304.8; + ACE_barrelLength=431.8; + }; + class CUP_srifle_M107_Base : Rifle_Long_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=381.0; + ACE_barrelLength=736.6; + }; + class CUP_srifle_M110 : Rifle_Base_F { + initSpeed=-0.98558; + ACE_barrelTwist=279.4; + ACE_barrelLength=508.0; + }; + class CUP_lmg_M240 : Rifle_Long_Base_F { + initSpeed=-1.00600; + ACE_barrelTwist=304.8; + ACE_barrelLength=629.92; + }; + class CUP_lmg_M249_para : Rifle_Long_Base_F { + initSpeed=-0.96739; + ACE_barrelTwist=177.8; + ACE_barrelLength=414.02; + }; + class CUP_lmg_M249 : Rifle_Long_Base_F { + initSpeed=-0.98696; + ACE_barrelTwist=177.8; + ACE_barrelLength=457.2; + }; + class CUP_sgun_M1014 : Rifle_Base_F { + ACE_twistDirection=0; + ACE_barrelTwist=0.0; + ACE_barrelLength=469.9; + }; + class CUP_hgun_Makarov : Pistol_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=93.472; + }; + class CUP_hgun_MicroUzi : Pistol_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=248.92; + ACE_barrelLength=127.0; + }; + class CUP_lmg_Mk48_Base : Rifle_Long_Base_F { + initSpeed=-0.98558; + ACE_barrelTwist=304.8; + ACE_barrelLength=501.65; + }; + class CUP_smg_MP5SD6 : Rifle_Base_F { + initSpeed=-0.9375; + ACE_barrelTwist=254.0; + ACE_barrelLength=144.78; + }; + class CUP_smg_MP5A5 : CUP_smg_MP5SD6 { + initSpeed=-1.0; + ACE_barrelTwist=254.0; + ACE_barrelLength=226.06; + }; + class CUP_smg_EVO : Rifle_Base_F { + initSpeed=-0.975; + ACE_barrelTwist=254.0; + ACE_barrelLength=195.58; + }; + class CUP_hgun_PB6P9 : Pistol_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=104.14; + }; + class CUP_hgun_Phantom : Pistol_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=246.38; + ACE_barrelLength=119.38; + }; + class CUP_lmg_PKM : Rifle_Long_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=645.16; + }; + class CUP_lmg_Pecheneg : CUP_lmg_PKM { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=657.86; + }; + class CUP_hgun_TaurusTracker455 : Pistol_Base_F { + initSpeed=-0.92; + ACE_barrelTwist=304.8; + ACE_barrelLength=101.6; + }; + class CUP_arifle_Sa58_base; + class CUP_arifle_Sa58P : CUP_arifle_Sa58_base { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=391.16; + }; + class CUP_arifle_Sa58V : CUP_arifle_Sa58P { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=391.16; + }; + class CUP_arifle_Sa58RIS1 : CUP_arifle_Sa58_base { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=391.16; + }; + class CUP_hgun_SA61 : Pistol_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=406.4; + ACE_barrelLength=114.3; + }; + class CUP_sgun_Saiga12K: Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=0.0; + ACE_twistDirection=0; + ACE_barrelLength=429.26; + }; + class CUP_arifle_SCAR_L_Base; + class CUP_arifle_Mk16_CQC : CUP_arifle_SCAR_L_Base { + initSpeed=-0.84783; + ACE_barrelTwist=177.8; + ACE_barrelLength=254.0; + }; + class CUP_arifle_Mk16_STD : CUP_arifle_SCAR_L_Base { + initSpeed=-0.93696; + ACE_barrelTwist=177.8; + ACE_barrelLength=355.6; + }; + class CUP_arifle_Mk16_SV : CUP_arifle_SCAR_L_Base { + initSpeed=-0.98696; + ACE_barrelTwist=177.8; + ACE_barrelLength=457.2; + }; + class CUP_arifle_Mk17_Base; + class CUP_arifle_Mk17_CQC : CUP_arifle_Mk17_Base { + initSpeed=-0.90144; + ACE_barrelTwist=304.8; + ACE_barrelLength=330.2; + }; + class CUP_arifle_Mk17_STD : CUP_arifle_Mk17_Base { + initSpeed=-0.96154; + ACE_barrelTwist=304.8; + ACE_barrelLength=406.4; + }; + class CUP_arifle_Mk20 : CUP_arifle_Mk17_Base { + initSpeed=-0.98558; + ACE_barrelTwist=304.8; + ACE_barrelLength=508.0; + }; + class CUP_srifle_SVD : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=238.76; + ACE_barrelLength=619.76; + }; + class CUP_lmg_UK59 : Rifle_Long_Base_F { + initSpeed=-0.9625; + ACE_barrelTwist=381.0; + ACE_barrelLength=551.18; + }; + class MGun; + class CUP_DSHKM_W : MGun { + initSpeed=-1.0; + ACE_barrelTwist=381.0; + ACE_barrelLength=1069.34; + }; + class CUP_KPVT_W : MGun { + initSpeed=-1.0; + ACE_barrelTwist=454.914; + ACE_barrelLength=1346.2; + }; + class CUP_M242_W; + class CUP_KPVB_W : CUP_M242_W { + initSpeed=-1.0; + ACE_barrelTwist=454.914; + ACE_barrelLength=1346.2; + }; + class MGunCore; + class CUP_M134 : MGunCore { + initSpeed=-1.0; + ACE_barrelTwist=304.8; + ACE_barrelLength=558.8; + }; + class CUP_M240_veh_W : Rifle_Long_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=304.8; + ACE_barrelLength=629.92; + }; + class CUP_PKT_W : MGun { + initSpeed=-1.0; + ACE_barrelTwist=240.03; + ACE_barrelLength=722.122; + }; + class CUP_srifle_VSSVintorez : Rifle_Base_F { + initSpeed=-0.93334; + ACE_barrelTwist=210.82; + ACE_barrelLength=200.66; + }; + class CUP_arifle_XM8_Base : Rifle_Base_F { + initSpeed=-1.0; + ACE_barrelTwist=177.8; + ACE_barrelLength=317.5; + }; + class CUP_arifle_XM8_Carbine : CUP_arifle_XM8_Base { + initSpeed=-0.90760; + ACE_barrelTwist=177.8; + ACE_barrelLength=317.5; + }; + class CUP_arifle_xm8_sharpshooter : CUP_arifle_XM8_Base { + initSpeed=-1.0; + ACE_barrelTwist=177.8; + ACE_barrelLength=508.0; + }; + class CUP_arifle_xm8_SAW : CUP_arifle_XM8_Base { + initSpeed=-1.0; + ACE_barrelTwist=177.8; + ACE_barrelLength=508.0; + }; + class CUP_arifle_XM8_Compact : CUP_arifle_XM8_Base { + initSpeed=-0.81522; + ACE_barrelTwist=177.8; + ACE_barrelLength=228.6; + }; + class CUP_arifle_XM8_Railed_Base : Rifle_Base_F { + initSpeed=-0.90760; + ACE_barrelTwist=177.8; + ACE_barrelLength=317.5; + }; + class CUP_arifle_XM8_Carbine_FG : CUP_arifle_XM8_Base { + initSpeed=-0.90870; + ACE_barrelTwist=177.8; + ACE_barrelLength=317.5; + }; + class CUP_arifle_XM8_Carbine_GL : CUP_arifle_XM8_Base { + initSpeed=-0.90870; + ACE_barrelTwist=177.8; + ACE_barrelLength=317.5; + }; + + class ItemCore; + class InventoryOpticsItem_Base_F; + + class CUP_optic_SB_3_12x50_PMII : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class LRR { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class CUP_optic_LeupoldMk4 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class LRR { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class CUP_optic_Leupold_VX3 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class StepScope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class CUP_optic_AN_PVS_10 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class NVScope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class CUP_optic_LeupoldM3LR : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class LRR { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class CUP_optic_LeupoldMk4_10x40_LRT_Desert : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class LRR { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class CUP_optic_LeupoldMk4_MRT_tan : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class MRT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class CUP_optic_SB_11_4x20_PM : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -0.1, 10.1 }; + ACE_ScopeAdjust_Horizontal[] = { -5.1, 5.1 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class ShortDot { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + /* + // This would require MOA turrets + class CUP_optic_AN_PVS_4 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -12, 50 }; + ACE_ScopeAdjust_Horizontal[] = { -20, 20 }; + ACE_ScopeAdjust_VerticalIncrement = 0.25; + ACE_ScopeAdjust_HorizontalIncrement = 0.25; + ACE_ScopeAdjust_Unit = "MOA"; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class ANPVS4 { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + */ + + class CUP_optic_PSO_1 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { 0, 0 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.0; + ACE_ScopeAdjust_HorizontalIncrement = 0.5; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class PSO { + discreteDistance[]={100, 200, 300, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000}; + discreteDistanceInitIndex=3; + }; + }; + }; + }; + class CUP_optic_PSO_3 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { 0, 0 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.0; + ACE_ScopeAdjust_HorizontalIncrement = 0.5; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class PSO { + discreteDistance[]={100, 200, 300, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000}; + discreteDistanceInitIndex=3; + }; + }; + }; + }; + // Non Disposable launchers + class CUP_launch_Igla: Launcher_Base_F { + EGVAR(overpressure,angle) = 30; + EGVAR(overpressure,range) = 2; + EGVAR(overpressure,damage) = 0.5; + }; + class CUP_launch_M47: Launcher_Base_F { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,range) = 30; + EGVAR(overpressure,damage) = 0.7; + }; + class CUP_launch_MAAWS: Launcher_Base_F { + EGVAR(overpressure,angle) = 60; + EGVAR(overpressure,range) = 28; + EGVAR(overpressure,damage) = 0.7; + }; + class CUP_launch_MAAWS_Scope: CUP_launch_MAAWS {}; + class CUP_launch_Metis: Launcher_Base_F { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,range) = 30; + EGVAR(overpressure,damage) = 0.5; + }; + class CUP_launch_RPG7V: Launcher_Base_F { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,range) = 20; + EGVAR(overpressure,damage) = 1; + }; + class CUP_launch_Mk153Mod0: Launcher_Base_F { + EGVAR(overpressure,angle) = 30; + EGVAR(overpressure,range) = 30; + EGVAR(overpressure,damage) = 1; + }; + class CUP_launch_Mk153Mod0_SMAWOptics: CUP_launch_Mk153Mod0 {}; + class CUP_launch_FIM92Stinger: Launcher_Base_F { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,range) = 15; + EGVAR(overpressure,damage) = 0.3; // Main damage arises from debris rather than the actual backblast + }; + class CUP_launch_9K32Strela: Launcher_Base_F { + EGVAR(overpressure,angle) = 30; + EGVAR(overpressure,range) = 2; + EGVAR(overpressure,damage) = 0.5; + }; + // Disposable launchers under this line + class CUP_launch_M136: Launcher_Base_F { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,range) = 100; + EGVAR(overpressure,damage) = 0.7; + ACE_UsedTube = "ACE_launch_M136_Used_F"; // The class name of the used tube. + magazines[] = {"ACE_PreloadedMissileDummy_CUP"}; // The dummy magazine + }; + class ACE_launch_M136_Used_F: CUP_launch_M136 { + scope = 1; + ACE_isUsedLauncher = 1; + author = "$STR_ACE_Common_ACETeam"; + //displayName = "$STR_ACE_Disposable_UsedTube"; + //descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + displayName = "M136 (Used)"; + descriptionShort = "Used M136 Tube"; + magazines[] = {"ACE_FiredMissileDummy_CUP"}; + //picture = ""; @todo + //model = ""; @todo + weaponPoolAvailable = 0; + }; + class CUP_launch_NLAW: Launcher_Base_F { + EGVAR(overpressure,angle) = 30; + EGVAR(overpressure,range) = 2; + EGVAR(overpressure,damage) = 0.5; + ACE_UsedTube = "ACE_launch_NLAW_Used_F"; // The class name of the used tube. + magazines[] = {"ACE_PreloadedMissileDummy_CUP"}; // The dummy magazine + }; + class ACE_launch_NLAW_Used_F: CUP_launch_NLAW { + scope = 1; + ACE_isUsedLauncher = 1; + author = "$STR_ACE_Common_ACETeam"; + //displayName = "$STR_ACE_Disposable_UsedTube"; + //descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + displayName = "NLAW (Used)"; + descriptionShort = "Used NLAW Tube"; + magazines[] = {"ACE_FiredMissileDummy_CUP"}; + //picture = ""; @todo + //model = ""; @todo + weaponPoolAvailable = 0; + }; + class CUP_launch_RPG18: Launcher_Base_F { + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,range) = 15; + EGVAR(overpressure,damage) = 1; + ACE_UsedTube = "ACE_launch_RPG18_Used_F"; // The class name of the used tube. + magazines[] = {"ACE_PreloadedMissileDummy_CUP"}; // The dummy magazine + }; + class ACE_launch_RPG18_Used_F: CUP_launch_RPG18 { + scope = 1; + ACE_isUsedLauncher = 1; + author = "$STR_ACE_Common_ACETeam"; + //displayName = "$STR_ACE_Disposable_UsedTube"; + //descriptionShort = "$STR_ACE_Disposable_UsedTubeDescription"; + displayName = "RPG18 (Used)"; + descriptionShort = "Used RPG18 Tube"; + magazines[] = {"ACE_FiredMissileDummy_CUP"}; + //picture = ""; @todo + //model = ""; @todo + weaponPoolAvailable = 0; + }; +}; \ No newline at end of file diff --git a/optionals/compat_cup/config.cpp b/optionals/compat_cup/config.cpp index e4f26f8051..d013c9034a 100644 --- a/optionals/compat_cup/config.cpp +++ b/optionals/compat_cup/config.cpp @@ -12,3 +12,5 @@ class CfgPatches { }; #include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" +#include "CfgMagazines.hpp" \ No newline at end of file diff --git a/optionals/compat_hlc_ar15/$PBOPREFIX$ b/optionals/compat_hlc_ar15/$PBOPREFIX$ deleted file mode 100644 index 1151a9959c..0000000000 --- a/optionals/compat_hlc_ar15/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlc_ar15 \ No newline at end of file diff --git a/optionals/compat_hlc_ar15/CfgWeapons.hpp b/optionals/compat_hlc_ar15/CfgWeapons.hpp deleted file mode 100644 index 53928f25d4..0000000000 --- a/optionals/compat_hlc_ar15/CfgWeapons.hpp +++ /dev/null @@ -1,65 +0,0 @@ -class CfgWeapons -{ - class Rifle; - class Rifle_Base_F; - class hlc_ar15_base: Rifle_Base_F - { - ACE_barrelTwist=177.8; - ACE_barrelLength=292.1; - }; - class hlc_rifle_RU556: hlc_ar15_base - { - ACE_barrelTwist=177.8; - ACE_barrelLength=261.62; - }; - class hlc_rifle_RU5562: hlc_rifle_RU556 - { - ACE_barrelTwist=177.8; - ACE_barrelLength=261.62; - }; - class hlc_rifle_CQBR: hlc_rifle_RU556 - { - ACE_barrelTwist=177.8; - ACE_barrelLength=254.0; - }; - class hlc_rifle_M4: hlc_rifle_RU556 - { - ACE_barrelTwist=177.8; - ACE_barrelLength=368.3; - }; - class hlc_rifle_bcmjack: hlc_ar15_base - { - ACE_barrelTwist=177.8; - ACE_barrelLength=368.3; - }; - class hlc_rifle_Colt727: hlc_ar15_base - { - ACE_barrelTwist=177.8; - ACE_barrelLength=368.3; - }; - class hlc_rifle_Colt727_GL: hlc_rifle_Colt727 - { - ACE_barrelTwist=177.8; - ACE_barrelLength=368.3; - }; - class hlc_rifle_Bushmaster300: hlc_rifle_Colt727 - { - ACE_barrelTwist=203.2; - ACE_barrelLength=368.3; - }; - class hlc_rifle_vendimus: hlc_rifle_Bushmaster300 - { - ACE_barrelTwist=203.2; - ACE_barrelLength=406.4; - }; - class hlc_rifle_SAMR: hlc_rifle_RU556 - { - ACE_barrelTwist=228.6; - ACE_barrelLength=406.4; - }; - class hlc_rifle_honeybase: hlc_rifle_RU556 - { - ACE_barrelTwist=203.2; - ACE_barrelLength=152.4; - }; -}; \ No newline at end of file diff --git a/optionals/compat_hlc_ar15/script_component.hpp b/optionals/compat_hlc_ar15/script_component.hpp deleted file mode 100644 index 3fb38b0477..0000000000 --- a/optionals/compat_hlc_ar15/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT hlcweapons_ar15_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_hlc_wp_mp5/$PBOPREFIX$ b/optionals/compat_hlc_wp_mp5/$PBOPREFIX$ deleted file mode 100644 index 397f5e9e6b..0000000000 --- a/optionals/compat_hlc_wp_mp5/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlc_wp_mp5 \ No newline at end of file diff --git a/optionals/compat_hlc_wp_mp5/CfgWeapons.hpp b/optionals/compat_hlc_wp_mp5/CfgWeapons.hpp deleted file mode 100644 index b9cc94818e..0000000000 --- a/optionals/compat_hlc_wp_mp5/CfgWeapons.hpp +++ /dev/null @@ -1,60 +0,0 @@ - -class CfgWeapons -{ - class Rifle_Base_F; - class hlc_MP5_base: Rifle_Base_F - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_mp5k_PDW: hlc_MP5_base - { - ACE_barrelTwist=254.0; - ACE_barrelLength=114.3; - }; - class hlc_smg_mp5k: hlc_smg_mp5k_PDW - { - ACE_barrelTwist=254.0; - ACE_barrelLength=114.3; - }; - class hlc_smg_mp5a2: hlc_MP5_base - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_MP5N: hlc_MP5_base - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_9mmar: hlc_smg_MP5N - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_mp5a4: hlc_MP5_base - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_mp510: hlc_smg_MP5N - { - ACE_barrelTwist=381.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_mp5sd5: hlc_MP5_base - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_mp5a3: hlc_smg_mp5a2 - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; - class hlc_smg_mp5sd6: hlc_smg_mp5sd5 - { - ACE_barrelTwist=254.0; - ACE_barrelLength=228.6; - }; -}; diff --git a/optionals/compat_hlc_wp_mp5/script_component.hpp b/optionals/compat_hlc_wp_mp5/script_component.hpp deleted file mode 100644 index 6b19e4912b..0000000000 --- a/optionals/compat_hlc_wp_mp5/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT hlcweapons_mp5_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_hlcmods_ak/$PBOPREFIX$ b/optionals/compat_hlcmods_ak/$PBOPREFIX$ deleted file mode 100644 index d1d239c6d5..0000000000 --- a/optionals/compat_hlcmods_ak/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlcmods_ak \ No newline at end of file diff --git a/optionals/compat_hlcmods_ak/CfgWeapons.hpp b/optionals/compat_hlcmods_ak/CfgWeapons.hpp deleted file mode 100644 index 82e319ef7c..0000000000 --- a/optionals/compat_hlcmods_ak/CfgWeapons.hpp +++ /dev/null @@ -1,76 +0,0 @@ -class CfgWeapons -{ - class optic_dms; - class hlc_ak_base; - class hlc_rifle_ak12; - class InventoryOpticsItem_Base_F; - class hlc_rifle_ak74: hlc_ak_base - { - ACE_barrelTwist=199.898; - ACE_barrelLength=414.02; - }; - class hlc_rifle_aku12: hlc_rifle_ak12 - { - ACE_barrelTwist=160.02; - ACE_barrelLength=210.82; - }; - class hlc_rifle_RPK12: hlc_rifle_ak12 - { - ACE_barrelLength=589.28; - }; - class hlc_rifle_aks74u: hlc_rifle_ak74 - { - ACE_barrelTwist=160.02; - ACE_barrelLength=210.82; - }; - class hlc_rifle_ak47: hlc_rifle_ak74 - { - ACE_barrelTwist=240.03; - ACE_barrelLength=414.02; - }; - class hlc_rifle_akm: hlc_rifle_ak47 - { - ACE_barrelTwist=199.898; - ACE_barrelLength=414.02; - }; - class hlc_rifle_rpk: hlc_rifle_ak47 - { - ACE_barrelTwist=240.03; - ACE_barrelLength=589.28; - }; - class hlc_rifle_rpk74n: hlc_rifle_rpk - { - ACE_barrelTwist=240.03; - ACE_barrelLength=589.28; - }; - class hlc_rifle_aek971: hlc_rifle_ak74 - { - ACE_barrelTwist=241.3; - ACE_barrelLength=431.8; - }; - class hlc_rifle_saiga12k: hlc_rifle_ak47 - { - ACE_barrelTwist=0.0; - ACE_twistDirection=0; - ACE_barrelLength=429.26; - }; - - class HLC_Optic_PSO1 : optic_dms { - ACE_ScopeAdjust_Vertical[] = { 0, 0 }; - ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; - ACE_ScopeAdjust_Increment = 0.5; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Snip { - discreteDistance[]={100, 200, 300, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000}; - discreteDistanceInitIndex=3; - }; - }; - }; - }; - class HLC_Optic_1p29 : HLC_Optic_PSO1 { - ACE_ScopeAdjust_Vertical[] = {}; - ACE_ScopeAdjust_Horizontal[] = {}; - ACE_ScopeAdjust_Increment = 0; - }; -}; \ No newline at end of file diff --git a/optionals/compat_hlcmods_ak/script_component.hpp b/optionals/compat_hlcmods_ak/script_component.hpp deleted file mode 100644 index a970229846..0000000000 --- a/optionals/compat_hlcmods_ak/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT hlcweapons_aks_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_hlcmods_aug/$PBOPREFIX$ b/optionals/compat_hlcmods_aug/$PBOPREFIX$ deleted file mode 100644 index 6b917cc98c..0000000000 --- a/optionals/compat_hlcmods_aug/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlcmods_aug \ No newline at end of file diff --git a/optionals/compat_hlcmods_aug/CfgWeapons.hpp b/optionals/compat_hlcmods_aug/CfgWeapons.hpp deleted file mode 100644 index 4666605348..0000000000 --- a/optionals/compat_hlcmods_aug/CfgWeapons.hpp +++ /dev/null @@ -1,51 +0,0 @@ - -class CfgWeapons -{ - class Rifle_Base_F; - class hlc_aug_base; - class hlc_rifle_aug: hlc_aug_base - { - ACE_barrelTwist=228.6; - ACE_barrelLength=508.0; - }; - class hlc_rifle_auga1carb: hlc_rifle_aug - { - ACE_barrelTwist=228.6; - ACE_barrelLength=406.4; - }; - class hlc_rifle_aughbar: hlc_rifle_aug - { - ACE_barrelTwist=228.6; - ACE_barrelLength=609.6; - }; - class hlc_rifle_augpara: hlc_rifle_aug - { - ACE_barrelTwist=228.6; - ACE_barrelLength=419.1; - }; - class hlc_rifle_auga2: hlc_rifle_aug - { - ACE_barrelTwist=228.6; - ACE_barrelLength=508.0; - }; - class hlc_rifle_auga2para: hlc_rifle_auga2 - { - ACE_barrelTwist=228.6; - ACE_barrelLength=419.1; - }; - class hlc_rifle_auga2carb: hlc_rifle_auga2 - { - ACE_barrelTwist=228.6; - ACE_barrelLength=457.2; - }; - class hlc_rifle_auga2lsw: hlc_rifle_aughbar - { - ACE_barrelTwist=228.6; - ACE_barrelLength=609.6; - }; - class hlc_rifle_auga3: hlc_rifle_aug - { - ACE_barrelTwist=228.6; - ACE_barrelLength=457.2; - }; -}; \ No newline at end of file diff --git a/optionals/compat_hlcmods_core/$PBOPREFIX$ b/optionals/compat_hlcmods_core/$PBOPREFIX$ deleted file mode 100644 index 9c9e9061e1..0000000000 --- a/optionals/compat_hlcmods_core/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlcmods_core \ No newline at end of file diff --git a/optionals/compat_hlcmods_core/CfgAmmo.hpp b/optionals/compat_hlcmods_core/CfgAmmo.hpp deleted file mode 100644 index afe3f03973..0000000000 --- a/optionals/compat_hlcmods_core/CfgAmmo.hpp +++ /dev/null @@ -1,316 +0,0 @@ -class CfgAmmo -{ - class B_762x51_Ball; - class B_556x45_Ball; - class B_127x99_Ball; - class B_127x99_Ball_Tracer_Red; - class HLC_762x51_tracer; - class HLC_762x51_ball; - class HLC_556NATO_EPR: B_556x45_Ball - { - ACE_caliber=5.69; - ACE_bulletLength=23.012; - ACE_bulletMass=4.0176; - ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; - ACE_ballisticCoefficients[]={0.151}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; - ACE_barrelLengths[]={210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; - }; - class HLC_556NATO_SOST: B_556x45_Ball - { - ACE_caliber=5.69; - ACE_bulletLength=23.012; - ACE_bulletMass=4.0176; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.307}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={780, 886, 950}; - ACE_barrelLengths[]={254.0, 393.7, 508.0}; - }; - class HLC_556NATO_SPR: B_556x45_Ball - { - ACE_caliber=5.69; - ACE_bulletLength=23.012; - ACE_bulletMass=4.9896; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.361}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={624, 816, 832, 838}; - ACE_barrelLengths[]={190.5, 368.3, 457.2, 508.0}; - }; - class HLC_300Blackout_Ball: B_556x45_Ball - { - ACE_caliber=7.823; - ACE_bulletLength=28.397; - ACE_bulletMass=9.5256; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.398}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={559, 609, 625}; - ACE_barrelLengths[]={152.4, 406.4, 508.0}; - }; - class HLC_300Blackout_SMK: HLC_300Blackout_Ball - { - ACE_caliber=7.823; - ACE_bulletLength=37.821; - ACE_bulletMass=14.256; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.608}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={300, 320, 340}; - ACE_barrelLengths[]={228.6, 406.4, 508.0}; - }; - class HLC_762x39_Ball: HLC_300Blackout_Ball - { - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=7.9704; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.275}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={650, 716, 750}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class HLC_762x39_Tracer: HLC_762x39_Ball - { - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=7.5816; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.275}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={650, 716, 750}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class HLC_762x51_MK316_20in: B_762x51_Ball - { - ACE_caliber=7.823; - ACE_bulletLength=31.496; - ACE_bulletMass=11.34; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.243}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={750, 780, 790, 794}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class HLC_762x51_BTSub: B_762x51_Ball - { - ACE_caliber=7.823; - ACE_bulletLength=34.036; - ACE_bulletMass=12.96; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.235}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={305, 325, 335, 340}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class HLC_762x54_ball: HLC_762x51_ball - { - ACE_caliber=7.925; - ACE_bulletLength=28.956; - ACE_bulletMass=9.8496; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.4}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={700, 800, 820, 833}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class HLC_762x54_tracer: HLC_762x51_tracer - { - ACE_caliber=7.925; - ACE_bulletLength=28.956; - ACE_bulletMass=9.6552; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.395}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={680, 750, 798, 800}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class HLC_303Brit_B: B_556x45_Ball - { - ACE_caliber=7.899; - ACE_bulletLength=31.166; - ACE_bulletMass=11.2752; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.499, 0.493, 0.48}; - ACE_velocityBoundaries[]={671, 549}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={748, 761, 765}; - ACE_barrelLengths[]={508.0, 609.6, 660.4}; - }; - class HLC_792x57_Ball: HLC_303Brit_B - { - ACE_caliber=8.077; - ACE_bulletLength=28.651; - ACE_bulletMass=12.7008; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.315}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={785, 800, 815}; - ACE_barrelLengths[]={508.0, 599.948, 660.4}; - }; - class HLC_542x42_ball: HLC_303Brit_B - { - }; - class HLC_542x42_Tracer: HLC_303Brit_B - { - }; - class FH_545x39_Ball: B_556x45_Ball - { - ACE_caliber=5.588; - ACE_bulletLength=21.59; - ACE_bulletMass=3.42792; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.168}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={780, 880, 920}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class FH_545x39_7u1: FH_545x39_Ball - { - ACE_bulletMass=5.184; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_muzzleVelocities[]={260, 303, 320}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class HLC_57x28mm_JHP: FH_545x39_Ball - { - ACE_caliber=5.69; - ACE_bulletLength=12.573; - ACE_bulletMass=1.8144; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.144}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={550, 625, 720}; - ACE_barrelLengths[]={101.6, 152.4, 262.89}; - }; - class HLC_9x19_Ball: B_556x45_Ball - { - ACE_caliber=9.017; - ACE_bulletLength=15.494; - ACE_bulletMass=8.0352; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.165}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={340, 370, 400}; - ACE_barrelLengths[]={101.6, 127.0, 228.6}; - }; - class HLC_9x19_M882_SMG: B_556x45_Ball - { - ACE_caliber=9.017; - ACE_bulletLength=15.494; - ACE_bulletMass=8.0352; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.165}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={340, 370, 400}; - ACE_barrelLengths[]={101.6, 127.0, 228.6}; - }; - class HLC_9x19_GoldDot: HLC_9x19_Ball - { - ACE_muzzleVelocities[]={350, 380, 420}; - }; - class HLC_9x19_Subsonic: HLC_9x19_Ball - { - ACE_muzzleVelocities[]={300, 320, 340}; - }; - class HLC_10mm_FMJ: HLC_9x19_Ball - { - ACE_caliber=12.7; - ACE_bulletLength=19.406; - ACE_bulletMass=10.692; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.189}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={360, 400, 430}; - ACE_barrelLengths[]={101.6, 117.094, 228.6}; - }; - class HLC_45ACP_Ball: B_556x45_Ball - { - ACE_caliber=11.481; - ACE_bulletLength=17.272; - ACE_bulletMass=14.904; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.195}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={230, 250, 285}; - ACE_barrelLengths[]={101.6, 127.0, 228.6}; - }; - class FH_44Mag: HLC_45ACP_Ball - { - ACE_caliber=10.897; - ACE_bulletLength=20.422; - ACE_bulletMass=12.96; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.172}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={360, 390, 420}; - ACE_barrelLengths[]={101.6, 190.5, 228.6}; - }; - class FH_50BMG_SLAP: B_127x99_Ball - { - ACE_caliber=7.823; - ACE_bulletLength=31.75; - ACE_bulletMass=22.68; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={1.056}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={1204}; - ACE_barrelLengths[]={736.6}; - }; - class FH_50BMG_Raufoss: B_127x99_Ball - { - ACE_caliber=12.954; - ACE_bulletLength=60.452; - ACE_bulletMass=42.768; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.670}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={817}; - ACE_barrelLengths[]={736.6}; - }; -}; diff --git a/optionals/compat_hlcmods_core/script_component.hpp b/optionals/compat_hlcmods_core/script_component.hpp deleted file mode 100644 index 444799ed4a..0000000000 --- a/optionals/compat_hlcmods_core/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT hlcweapons_core_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_hlcmods_fal/$PBOPREFIX$ b/optionals/compat_hlcmods_fal/$PBOPREFIX$ deleted file mode 100644 index 91bbe75e96..0000000000 --- a/optionals/compat_hlcmods_fal/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlcmods_fal \ No newline at end of file diff --git a/optionals/compat_hlcmods_fal/CfgWeapons.hpp b/optionals/compat_hlcmods_fal/CfgWeapons.hpp deleted file mode 100644 index fd826a6804..0000000000 --- a/optionals/compat_hlcmods_fal/CfgWeapons.hpp +++ /dev/null @@ -1,50 +0,0 @@ - -class CfgWeapons -{ - class hlc_fal_base; - class hlc_rifle_falosw: hlc_fal_base - { - ACE_barrelTwist=304.8; - ACE_barrelLength=330.2; - }; - class hlc_rifle_osw_GL: hlc_rifle_falosw - { - ACE_barrelTwist=304.8; - ACE_barrelLength=330.2; - }; - class hlc_rifle_SLR: hlc_fal_base - { - ACE_barrelTwist=304.8; - ACE_barrelLength=551.18; - }; - class hlc_rifle_STG58F: hlc_fal_base - { - ACE_barrelTwist=304.8; - ACE_barrelLength=533.4; - }; - class hlc_rifle_FAL5061: hlc_fal_base - { - ACE_barrelTwist=304.8; - ACE_barrelLength=457.2; - }; - class hlc_rifle_L1A1SLR: hlc_rifle_SLR - { - ACE_barrelTwist=304.8; - ACE_barrelLength=551.18; - }; - class hlc_rifle_c1A1: hlc_rifle_SLR - { - ACE_barrelTwist=304.8; - ACE_barrelLength=551.18; - }; - class hlc_rifle_LAR: hlc_rifle_FAL5061 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=533.4; - }; - class hlc_rifle_SLRchopmod: hlc_rifle_FAL5061 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=457.2; - }; -}; \ No newline at end of file diff --git a/optionals/compat_hlcmods_fal/config.cpp b/optionals/compat_hlcmods_fal/config.cpp deleted file mode 100644 index 5428e9871c..0000000000 --- a/optionals/compat_hlcmods_fal/config.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_falpocalypse"}; - author[]={"Ruthberg"}; - VERSION_CONFIG; - }; -}; - -#include "CfgWeapons.hpp" diff --git a/optionals/compat_hlcmods_fal/script_component.hpp b/optionals/compat_hlcmods_fal/script_component.hpp deleted file mode 100644 index 828722a5a4..0000000000 --- a/optionals/compat_hlcmods_fal/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT hlcweapons_falpocalypse_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_hlcmods_g3/$PBOPREFIX$ b/optionals/compat_hlcmods_g3/$PBOPREFIX$ deleted file mode 100644 index ff5b23f6ea..0000000000 --- a/optionals/compat_hlcmods_g3/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlcmods_g3 \ No newline at end of file diff --git a/optionals/compat_hlcmods_g3/CfgWeapons.hpp b/optionals/compat_hlcmods_g3/CfgWeapons.hpp deleted file mode 100644 index dc02124667..0000000000 --- a/optionals/compat_hlcmods_g3/CfgWeapons.hpp +++ /dev/null @@ -1,45 +0,0 @@ - -class CfgWeapons -{ - class hlc_g3_base; - class hlc_rifle_g3sg1: hlc_g3_base - { - ACE_barrelTwist=304.8; - ACE_barrelLength=449.58; - }; - class hlc_rifle_psg1: hlc_rifle_g3sg1 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=650.24; - }; - class hlc_rifle_g3a3: hlc_rifle_g3sg1 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=449.58; - }; - class hlc_rifle_g3a3ris: hlc_rifle_g3a3 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=449.58; - }; - class hlc_rifle_g3ka4: hlc_rifle_g3a3 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=314.96; - }; - class HLC_Rifle_g3ka4_GL: hlc_rifle_g3ka4 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=314.96; - }; - class hlc_rifle_hk51: hlc_rifle_g3sg1 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=211.074; - }; - class hlc_rifle_hk53: hlc_rifle_g3sg1 - { - ACE_barrelTwist=177.8; - ACE_barrelLength=211.074; - }; -}; \ No newline at end of file diff --git a/optionals/compat_hlcmods_m14/$PBOPREFIX$ b/optionals/compat_hlcmods_m14/$PBOPREFIX$ deleted file mode 100644 index 9542452ad0..0000000000 --- a/optionals/compat_hlcmods_m14/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlcmods_m14 \ No newline at end of file diff --git a/optionals/compat_hlcmods_m14/CfgWeapons.hpp b/optionals/compat_hlcmods_m14/CfgWeapons.hpp deleted file mode 100644 index 64db736003..0000000000 --- a/optionals/compat_hlcmods_m14/CfgWeapons.hpp +++ /dev/null @@ -1,16 +0,0 @@ - -class CfgWeapons -{ - class Rifle_Base_F; - class hlc_rifle_M14; - class hlc_M14_base: Rifle_Base_F - { - ACE_barrelTwist=304.8; - ACE_barrelLength=558.8; - }; - class hlc_rifle_m14sopmod: hlc_rifle_M14 - { - ACE_barrelTwist=304.8; - ACE_barrelLength=457.2; - }; -}; diff --git a/optionals/compat_hlcmods_m14/config.cpp b/optionals/compat_hlcmods_m14/config.cpp deleted file mode 100644 index cdf11a7db1..0000000000 --- a/optionals/compat_hlcmods_m14/config.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_m14"}; - author[]={"Ruthberg"}; - VERSION_CONFIG; - }; -}; - -#include "CfgWeapons.hpp" diff --git a/optionals/compat_hlcmods_m14/script_component.hpp b/optionals/compat_hlcmods_m14/script_component.hpp deleted file mode 100644 index a29b751195..0000000000 --- a/optionals/compat_hlcmods_m14/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT hlcweapons_m14_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_hlcmods_m60e4/$PBOPREFIX$ b/optionals/compat_hlcmods_m60e4/$PBOPREFIX$ deleted file mode 100644 index 73c943fe8f..0000000000 --- a/optionals/compat_hlcmods_m60e4/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_hlcmods_m60e4 \ No newline at end of file diff --git a/optionals/compat_hlcmods_m60e4/CfgWeapons.hpp b/optionals/compat_hlcmods_m60e4/CfgWeapons.hpp deleted file mode 100644 index 50b4ffbc80..0000000000 --- a/optionals/compat_hlcmods_m60e4/CfgWeapons.hpp +++ /dev/null @@ -1,15 +0,0 @@ - -class CfgWeapons -{ - class hlc_M60e4_base; - class hlc_lmg_M60E4: hlc_M60e4_base - { - ACE_barrelTwist=304.8; - ACE_barrelLength=431.8; - }; - class hlc_lmg_m60: hlc_M60e4_base - { - ACE_barrelTwist=304.8; - ACE_barrelLength=558.8; - }; -}; diff --git a/optionals/compat_hlcmods_m60e4/config.cpp b/optionals/compat_hlcmods_m60e4/config.cpp deleted file mode 100644 index 1df3a97a20..0000000000 --- a/optionals/compat_hlcmods_m60e4/config.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_m60e4"}; - author[]={"Ruthberg"}; - VERSION_CONFIG; - }; -}; - -#include "CfgWeapons.hpp" diff --git a/optionals/compat_r3f/$PBOPREFIX$ b/optionals/compat_r3f/$PBOPREFIX$ new file mode 100644 index 0000000000..405620f365 --- /dev/null +++ b/optionals/compat_r3f/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\compat_r3f \ No newline at end of file diff --git a/optionals/compat_r3f/CfgAmmo.hpp b/optionals/compat_r3f/CfgAmmo.hpp new file mode 100644 index 0000000000..27865a0430 --- /dev/null +++ b/optionals/compat_r3f/CfgAmmo.hpp @@ -0,0 +1,100 @@ +class CfgAmmo { + class Default; + class BulletBase; + class R3F_9x19_Ball: BulletBase { + ACE_caliber=9.017; + ACE_bulletLength=15.494; + ACE_bulletMass=8.0352; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={101.6, 127.0, 228.6}; + }; + class R3F_556x45_Ball: BulletBase { + ACE_caliber=5.69; + ACE_bulletLength=23.012; + ACE_bulletMass=4.0176; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; + }; + class R3F_762x51_Ball: BulletBase { + ACE_caliber=7.823; + ACE_bulletLength=28.956; + ACE_bulletMass=9.4608; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; + }; + class R3F_127x99_Ball: BulletBase { + ACE_caliber=12.954; + ACE_bulletLength=58.674; + ACE_bulletMass=41.9256; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={900}; + ACE_barrelLengths[]={736.6}; + }; + class R3F_127x99_PEI: R3F_127x99_Ball { + ACE_caliber=12.954; + ACE_bulletLength=58.674; + ACE_bulletMass=41.9256; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={900}; + ACE_barrelLengths[]={736.6}; + }; + class R3F_127x99_Ball2: BulletBase { + ACE_caliber=12.954; + ACE_bulletLength=58.674; + ACE_bulletMass=41.9256; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={900}; + ACE_barrelLengths[]={736.6}; + }; + class R3F_127x99_PEI2: R3F_127x99_Ball2 { + ACE_caliber=12.954; + ACE_bulletLength=58.674; + ACE_bulletMass=41.9256; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={900}; + ACE_barrelLengths[]={736.6}; + }; + class R3F_127x99_Ball3: BulletBase { + ACE_caliber=12.954; + ACE_bulletLength=58.674; + ACE_bulletMass=41.9256; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={900}; + ACE_barrelLengths[]={736.6}; + }; +}; \ No newline at end of file diff --git a/optionals/compat_r3f/CfgWeapons.hpp b/optionals/compat_r3f/CfgWeapons.hpp new file mode 100644 index 0000000000..eae4eeb215 --- /dev/null +++ b/optionals/compat_r3f/CfgWeapons.hpp @@ -0,0 +1,190 @@ +class CfgWeapons { + class Pistol_Base_F; + class Rifle_Base_F; + class R3F_Famas_F1: Rifle_Base_F { + ACE_barrelTwist=304.8; + ACE_barrelLength=488; + }; + class R3F_Famas_surb: R3F_Famas_F1 { + ACE_barrelTwist=304.8; + ACE_barrelLength=403.86; + }; + class R3F_FRF2: Rifle_Base_F { + ACE_barrelTwist=304.8; + ACE_barrelLength=650; + }; + class R3F_PGM_Hecate_II: Rifle_Base_F { + ACE_barrelTwist=381.0; + ACE_barrelLength=700; + }; + class R3F_M107: Rifle_Base_F { + ACE_barrelTwist=381.0; + ACE_barrelLength=736.6; + }; + class R3F_TAC50: Rifle_Base_F + { + ACE_barrelTwist=381.0; + ACE_barrelLength=736.6; + }; + class R3F_Minimi: Rifle_Base_F { + ACE_barrelTwist=177.8; + ACE_barrelLength=347.98; + }; + class R3F_Minimi_HG: R3F_Minimi { + }; + class R3F_Minimi_762: R3F_Minimi { + ACE_barrelTwist=304.8; + ACE_barrelLength=502.92; + }; + class R3F_Minimi_762_HG: R3F_Minimi_762 { + }; + class R3F_HK417M: Rifle_Base_F { + ACE_barrelTwist=279.4; + ACE_barrelLength=406; + }; + class R3F_HK417S_HG: R3F_HK417M + { + ACE_barrelTwist=279.4; + ACE_barrelLength=305; + }; + class R3F_HK417L: R3F_HK417M { + ACE_barrelTwist=279.4; + ACE_barrelLength=508; + }; + class R3F_HK416M: Rifle_Base_F { + ACE_barrelTwist=177.8; + ACE_barrelLength=368.3; + }; + class R3F_MP5SD: Rifle_Base_F { + ACE_barrelTwist=254.0; + ACE_barrelLength=144.78; + }; + class R3F_MP5A5: R3F_MP5SD { + ACE_barrelTwist=254.0; + ACE_barrelLength=226.06; + }; + class R3F_M4S90: Rifle_Base_F { + ACE_twistDirection=0; + ACE_barrelTwist=0; + ACE_barrelLength=144.78; + }; + class R3F_PAMAS: Pistol_Base_F { + ACE_barrelTwist=248.92; + ACE_barrelLength=124.46; + }; + + class ItemCore; + class InventoryOpticsItem_Base_F; + class R3F_J4: ItemCore { + ACE_ScopeAdjust_Vertical[] = { -8, 8 }; + ACE_ScopeAdjust_Horizontal[] = { -8, 8 }; + ACE_ScopeAdjust_VerticalIncrement = 0.2; + ACE_ScopeAdjust_HorizontalIncrement = 0.2; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class J4 { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class R3F_J8: ItemCore { + ACE_ScopeAdjust_Vertical[] = { -10, 10 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class J8 { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class R3F_J8_MILDOT: R3F_J8 { + ACE_ScopeAdjust_Vertical[] = { -10, 10 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class J8_MILDOT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class R3F_J10: ItemCore { + ACE_ScopeAdjust_Vertical[] = { -10, 10 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class J10 { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class R3F_J10_MILDOT: R3F_J10 { + ACE_ScopeAdjust_Vertical[] = { -10, 10 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class J10_MILDOT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class R3F_ZEISS: ItemCore { + ACE_ScopeAdjust_Vertical[] = { 0, 23 }; + ACE_ScopeAdjust_Horizontal[] = { -7, 7 }; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class ZEISS_MILDOT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class R3F_NF: ItemCore { + ACE_ScopeAdjust_Vertical[] = { -0.9, 34 }; + ACE_ScopeAdjust_Horizontal[] = { -11, 11 }; + ACE_ScopeAdjust_VerticalIncrement = 0.2; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class NF_MILDOT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class R3F_NF42: ItemCore { + ACE_ScopeAdjust_Vertical[] = { -27.3, 27.3 }; + ACE_ScopeAdjust_Horizontal[] = { -27.3, 27.3}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class NF42_MILDOT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/optionals/compat_hlc_ar15/config.cpp b/optionals/compat_r3f/config.cpp similarity index 76% rename from optionals/compat_hlc_ar15/config.cpp rename to optionals/compat_r3f/config.cpp index 51e42dc040..d5dbc8e68c 100644 --- a/optionals/compat_hlc_ar15/config.cpp +++ b/optionals/compat_r3f/config.cpp @@ -5,10 +5,11 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_ar15"}; + requiredAddons[] = {"R3F_Armes", "R3F_Acc"}; author[]={"Ruthberg"}; VERSION_CONFIG; }; }; +#include "CfgAmmo.hpp" #include "CfgWeapons.hpp" diff --git a/optionals/compat_hlcmods_aug/script_component.hpp b/optionals/compat_r3f/script_component.hpp similarity index 71% rename from optionals/compat_hlcmods_aug/script_component.hpp rename to optionals/compat_r3f/script_component.hpp index d5a6712b6b..86bb669119 100644 --- a/optionals/compat_hlcmods_aug/script_component.hpp +++ b/optionals/compat_r3f/script_component.hpp @@ -1,4 +1,4 @@ -#define COMPONENT hlcweapons_AUG_comp +#define COMPONENT BWA3_Weapons_comp #include "\z\ace\addons\main\script_mod.hpp" diff --git a/optionals/compat_rh_acc/CfgWeapons.hpp b/optionals/compat_rh_acc/CfgWeapons.hpp index 4dda8ffbe0..ffd18bc12e 100644 --- a/optionals/compat_rh_acc/CfgWeapons.hpp +++ b/optionals/compat_rh_acc/CfgWeapons.hpp @@ -3,10 +3,21 @@ class CfgWeapons { class ItemCore; class InventoryOpticsItem_Base_F; + /* + // This would require MOA turrets + class RH_shortdot : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -1, 25 }; + ACE_ScopeAdjust_Horizontal[] = { -13, 13 }; + ACE_ScopeAdjust_VerticalIncrement = 0.5; + ACE_ScopeAdjust_Unit = "MOA"; + }; + */ + class RH_accupoint : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class Accupoint { @@ -20,7 +31,8 @@ class CfgWeapons { class RH_m3lr : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class m3lr { @@ -34,7 +46,8 @@ class CfgWeapons { class RH_leu_mk4 : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class mk4 { @@ -48,7 +61,8 @@ class CfgWeapons { class RH_c79 : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class c79scope { @@ -62,7 +76,8 @@ class CfgWeapons { class RH_c79_2d : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class c79scope { @@ -76,7 +91,8 @@ class CfgWeapons { class RH_anpvs10 : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class pvs10 { @@ -90,7 +106,8 @@ class CfgWeapons { class RH_pas13cm : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class MTWS { @@ -104,7 +121,8 @@ class CfgWeapons { class RH_pas13cmg : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class MTWSmg { @@ -118,7 +136,8 @@ class CfgWeapons { class RH_pas13ch : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class HTWS { diff --git a/optionals/compat_rhs_afrf3/CfgMagazines.hpp b/optionals/compat_rhs_afrf3/CfgMagazines.hpp new file mode 100644 index 0000000000..6acd70844a --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgMagazines.hpp @@ -0,0 +1,17 @@ +class cfgMagazines { + class VehicleMagazine; + class rhs_30Rnd_545x39_AK; + + class rhs_100Rnd_762x54mmR: rhs_30Rnd_545x39_AK { + ace_isbelt = 1; + }; + class rhs_100Rnd_762x54mmR_green: rhs_100Rnd_762x54mmR { + ace_isbelt = 1; + }; + class rhs_mag_127x108mm_50 : VehicleMagazine { + ace_isbelt = 1; + }; + class rhs_mag_127x108mm_150 : rhs_mag_127x108mm_50 { + ace_isbelt = 0; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/CfgVehicles.hpp b/optionals/compat_rhs_afrf3/CfgVehicles.hpp new file mode 100644 index 0000000000..e9c71f4da7 --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgVehicles.hpp @@ -0,0 +1,156 @@ +class cfgVehicles { + class LandVehicle; + class Tank: LandVehicle { + class NewTurret; + }; + class Tank_F: Tank { + class Turrets { + class MainTurret: NewTurret { + class Turrets { + class CommanderOptics; + }; + }; + }; + }; + class Car; + class Car_F: Car { + class ViewPilot; + class NewTurret; + }; + class Wheeled_APC_F: Car_F { + class NewTurret; + class Turrets { + class MainTurret: NewTurret + { + class ViewOptics; + }; + }; + class CommanderOptics; + }; + class rhs_bmd_base: Tank_F { + class Turrets: Turrets { + class CommanderOptics: NewTurret { + ace_fcs_Enabled = 0; + }; + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + }; + class GPMGTurret1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_bmp1tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + }; + class Com_BMP1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_bmp_base: rhs_bmp1tank_base {}; + class rhs_bmp1_vdv: rhs_bmp_base {}; + class rhs_bmp2e_vdv : rhs_bmp1_vdv { + class Turrets: Turrets { + class MainTurret: MainTurret { + class Turrets: Turrets { + class CommanderOptics : CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + class rhs_bmp3tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + class GPMGTurret1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_btr_base: Wheeled_APC_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + }; + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_a3spruttank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics + { + ace_fcs_Enabled = 0; + }; + }; + }; + class GPMGTurret1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_a3t72tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + class CommanderMG: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + class rhs_t72bd_tv: rhs_a3t72tank_base {}; + class rhs_t90_tv: rhs_t72bd_tv { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + class rhs_tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + class CommanderMG: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + + class rhs_infantry_msv_base; + class rhs_pilot_base : rhs_infantry_msv_base + { + ace_gforcecoef = 0.55; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp index 90474a958f..4c3e2e425e 100644 --- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp @@ -62,6 +62,11 @@ class CfgWeapons class rhs_acc_pso1m2: rhs_acc_sniper_base { ACE_ScopeAdjust_Vertical[] = { 0, 0 }; ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; - ACE_ScopeAdjust_Increment = 0.5; + ACE_ScopeAdjust_VerticalIncrement = 0.0; + ACE_ScopeAdjust_HorizontalIncrement = 0.5; + }; + class Launcher_Base_F; + class rhs_weap_rpg7: Launcher_Base_F { + ace_reloadlaunchers_enabled = 1; }; }; \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp index 8b7f9d5ca4..5e88ad2830 100644 --- a/optionals/compat_rhs_afrf3/config.cpp +++ b/optionals/compat_rhs_afrf3/config.cpp @@ -12,4 +12,6 @@ class CfgPatches { }; #include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" #include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/CfgAmmo.hpp b/optionals/compat_rhs_usf3/CfgAmmo.hpp index 382ad1480e..0dde3eaf62 100644 --- a/optionals/compat_rhs_usf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_usf3/CfgAmmo.hpp @@ -2,8 +2,7 @@ class CfgAmmo { class BulletBase; - class rhsusf_B_300winmag: BulletBase - { + class rhsusf_B_300winmag: BulletBase { ACE_caliber=7.823; ACE_bulletLength=37.821; ACE_bulletMass=14.256; @@ -16,8 +15,7 @@ class CfgAmmo ACE_barrelLengths[]={508.0, 609.6, 660.4}; }; class B_556x45_Ball; - class rhs_ammo_556x45_Mk318_Ball: B_556x45_Ball - { + class rhs_ammo_556x45_Mk318_Ball: B_556x45_Ball { ACE_caliber=5.69; ACE_bulletLength=23.012; ACE_bulletMass=4.0176; @@ -29,8 +27,7 @@ class CfgAmmo ACE_muzzleVelocities[]={780, 886, 950}; ACE_barrelLengths[]={254.0, 393.7, 508.0}; }; - class rhs_ammo_556x45_Mk262_Ball: B_556x45_Ball - { + class rhs_ammo_556x45_Mk262_Ball: B_556x45_Ball { ACE_caliber=5.69; ACE_bulletLength=23.012; ACE_bulletMass=4.9896; @@ -42,8 +39,7 @@ class CfgAmmo ACE_muzzleVelocities[]={624, 816, 832, 838}; ACE_barrelLengths[]={190.5, 368.3, 457.2, 508.0}; }; - class rhs_ammo_762x51_M80_Ball: BulletBase - { + class rhs_ammo_762x51_M80_Ball: BulletBase { ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=9.4608; @@ -55,8 +51,7 @@ class CfgAmmo ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; - class rhs_ammo_762x51_M118_Special_Ball: rhs_ammo_762x51_M80_Ball - { + class rhs_ammo_762x51_M118_Special_Ball: rhs_ammo_762x51_M80_Ball { ACE_caliber=7.823; ACE_bulletLength=31.496; ACE_bulletMass=11.34; @@ -68,8 +63,7 @@ class CfgAmmo ACE_muzzleVelocities[]={750, 780, 790, 794}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class rhs_ammo_762x51_M993_Ball: rhs_ammo_762x51_M80_Ball - { + class rhs_ammo_762x51_M993_Ball: rhs_ammo_762x51_M80_Ball { ACE_caliber=7.823; ACE_bulletLength=31.496; ACE_bulletMass=8.2296; @@ -81,8 +75,7 @@ class CfgAmmo ACE_muzzleVelocities[]={875, 910, 930}; ACE_barrelLengths[]={330.2, 406.4, 508.0}; }; - class rhs_ammo_45ACP_MHP: BulletBase - { + class rhs_ammo_45ACP_MHP: BulletBase { ACE_caliber=11.481; ACE_bulletLength=17.272; ACE_bulletMass=14.904; @@ -94,4 +87,39 @@ class CfgAmmo ACE_muzzleVelocities[]={230, 250, 285}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; -}; \ No newline at end of file + + class M_Titan_AT; + class rhs_ammo_M_fgm148_AT: M_Titan_AT { + irLock = 0; + laserLock = 0; + airLock = 0; + + // Begin ACE guidance Configs + class ace_missileguidance { + enabled = 1; + + minDeflection = 0.00005; // Minium flap deflection for guidance + maxDeflection = 0.025; // Maximum flap deflection for guidance + incDeflection = 0.00005; // The incrmeent in which deflection adjusts. + + canVanillaLock = 0; + + // Guidance type for munitions + defaultSeekerType = "Optic"; + seekerTypes[] = { "Optic" }; + + defaultSeekerLockMode = "LOBL"; + seekerLockModes[] = { "LOBL" }; + + seekerAngle = 180; // Angle in front of the missile which can be searched + seekerAccuracy = 1; // seeker accuracy multiplier + + seekerMinRange = 0; + seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + + // Attack profile type selection + defaultAttackProfile = "JAV_TOP"; + attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; + }; + }; +}; diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp new file mode 100644 index 0000000000..f067cd6eee --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp @@ -0,0 +1,31 @@ +class cfgMagazines { + class CA_Magazine; + class VehicleMagazine; + class rhs_mag_30Rnd_556x45_M855A1_Stanag; + class rhs_mag_30Rnd_556x45_M200_Stanag; + + class rhsusf_100Rnd_556x45_soft_pouch: rhs_mag_30Rnd_556x45_M855A1_Stanag { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_556x45_M200_soft_pouch: rhs_mag_30Rnd_556x45_M200_Stanag { + ace_isbelt = 1; + }; + class rhsusf_200Rnd_556x45_soft_pouch: rhsusf_100Rnd_556x45_soft_pouch { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_762x51: CA_Magazine { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_762x51_m80a1epr: rhsusf_100Rnd_762x51 { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_762x51_m993: rhsusf_100Rnd_762x51 { + ace_isbelt = 1; + }; + class rhs_mag_100rnd_127x99_mag: VehicleMagazine { + ace_isbelt = 1; + }; + class RHS_48Rnd_40mm_MK19: VehicleMagazine { + ace_isbelt = 1; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp new file mode 100644 index 0000000000..2be7a8076e --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -0,0 +1,32 @@ +class cfgVehicles { + class LandVehicle; + class Tank: LandVehicle { + class NewTurret; + }; + class Tank_F: Tank { + class Turrets { + class MainTurret: NewTurret { + class Turrets { + class CommanderOptics; + }; + }; + }; + }; + + class MBT_01_base_F: Tank_F {}; + class rhsusf_m1a1tank_base: MBT_01_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + class Loader: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp index 1cceb9a76b..e2e1efc00e 100644 --- a/optionals/compat_rhs_usf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp @@ -6,86 +6,69 @@ class CfgWeapons class srifle_EBR_F; class launch_O_Titan_F; - class rhs_weap_XM2010_Base_F: Rifle_Base_F - { + class rhs_weap_XM2010_Base_F: Rifle_Base_F { ACE_barrelTwist=254.0; ACE_barrelLength=609.6; }; class arifle_MX_Base_F; - class rhs_weap_m4_Base: arifle_MX_Base_F - { + class rhs_weap_m4_Base: arifle_MX_Base_F { ACE_barrelTwist=177.8; ACE_barrelLength=368.3; }; class rhs_weap_m4a1; - class rhs_weap_mk18: rhs_weap_m4a1 - { + class rhs_weap_mk18: rhs_weap_m4a1 { ACE_barrelTwist=177.8; ACE_barrelLength=261.62; }; - class rhs_weap_m16a4: rhs_weap_m4_Base - { + class rhs_weap_m16a4: rhs_weap_m4_Base { ACE_barrelTwist=177.8; ACE_barrelLength=508.0; }; - class rhs_M249_base; - class rhs_weap_m249_pip: rhs_M249_base - { - ACE_barrelTwist=177.8; - ACE_barrelLength=414.02; - }; - class weap_m240_base; - class rhs_weap_m240B: weap_m240_base - { + class rhs_weap_m240_base; + class rhs_weap_m240B: rhs_weap_m240_base { ACE_barrelTwist=304.8; ACE_barrelLength=629.92; }; - class rhs_weap_m14ebrri: srifle_EBR_F - { + class rhs_weap_m14ebrri: srifle_EBR_F { ACE_barrelTwist=304.8; ACE_barrelLength=558.8; }; - class rhs_weap_sr25: rhs_weap_m14ebrri - { + class rhs_weap_sr25: rhs_weap_m14ebrri { ACE_barrelTwist=285.75; ACE_barrelLength=609.6; }; - class rhs_weap_sr25_ec: rhs_weap_sr25 - { + class rhs_weap_sr25_ec: rhs_weap_sr25 { ACE_barrelTwist=285.75; ACE_barrelLength=508.0; }; - class rhs_weap_M590_5RD: Rifle_Base_F - { + class rhs_weap_M590_5RD: Rifle_Base_F { ACE_barrelTwist=0.0; ACE_twistDirection=0; ACE_barrelLength=469.9; }; - class rhs_weap_M590_8RD: rhs_weap_M590_5RD - { + class rhs_weap_M590_8RD: rhs_weap_M590_5RD { ACE_barrelTwist=0.0; ACE_twistDirection=0; ACE_barrelLength=508.0; }; class hgun_ACPC2_F; - class rhsusf_weap_m1911a1: hgun_ACPC2_F - { + class rhsusf_weap_m1911a1: hgun_ACPC2_F { ACE_barrelTwist=406.4; ACE_barrelLength=127.0; }; - class rhsusf_acc_sniper_base; class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; }; class rhsusf_acc_LEUPOLDMK4_2: rhsusf_acc_sniper_base { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; }; - class rhs_weap_fgm148 : launch_O_Titan_F { ace_javelin_enabled = 1; weaponInfoType = "ACE_RscOptics_javelin"; @@ -95,4 +78,4 @@ class CfgWeapons lockingTargetSound[] = {"",0,1}; lockedTargetSound[] = {"",0,1}; }; -}; \ No newline at end of file +}; diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index bc4d264697..9a13565ccf 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -12,4 +12,6 @@ class CfgPatches { }; #include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" #include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" \ No newline at end of file diff --git a/optionals/compat_rksl_pm_ii/CfgWeapons.hpp b/optionals/compat_rksl_pm_ii/CfgWeapons.hpp index 621dd98b71..339759c2ba 100644 --- a/optionals/compat_rksl_pm_ii/CfgWeapons.hpp +++ b/optionals/compat_rksl_pm_ii/CfgWeapons.hpp @@ -6,7 +6,8 @@ class CfgWeapons { class RKSL_optic_PMII_312 : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class Snip { @@ -20,7 +21,8 @@ class CfgWeapons { class RKSL_optic_PMII_312_sunshade : ItemCore { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_Increment = 0.1; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo : InventoryOpticsItem_Base_F { class OpticsModes { class Snip { diff --git a/optionals/compat_sma3_iansky/$PBOPREFIX$ b/optionals/compat_sma3_iansky/$PBOPREFIX$ new file mode 100644 index 0000000000..c570d4eb98 --- /dev/null +++ b/optionals/compat_sma3_iansky/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\compat_sma3_iansky \ No newline at end of file diff --git a/optionals/compat_sma3_iansky/CfgWeapons.hpp b/optionals/compat_sma3_iansky/CfgWeapons.hpp new file mode 100644 index 0000000000..a387b76c1a --- /dev/null +++ b/optionals/compat_sma3_iansky/CfgWeapons.hpp @@ -0,0 +1,20 @@ + +class CfgWeapons { + class ItemCore; + class InventoryOpticsItem_Base_F; + + class iansky_nfbeast : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -0.9, 34 }; + ACE_ScopeAdjust_Horizontal[] = { -11, 11 }; + ACE_ScopeAdjust_VerticalIncrement = 0.2; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class NF25_MILDOT { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/optionals/compat_hlcmods_g3/config.cpp b/optionals/compat_sma3_iansky/config.cpp similarity index 84% rename from optionals/compat_hlcmods_g3/config.cpp rename to optionals/compat_sma3_iansky/config.cpp index 6b79486364..4dfda50805 100644 --- a/optionals/compat_hlcmods_g3/config.cpp +++ b/optionals/compat_sma3_iansky/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_g3"}; + requiredAddons[] = {"iansky_opt"}; author[]={"Ruthberg"}; VERSION_CONFIG; }; diff --git a/optionals/compat_hlcmods_m60e4/script_component.hpp b/optionals/compat_sma3_iansky/script_component.hpp similarity index 73% rename from optionals/compat_hlcmods_m60e4/script_component.hpp rename to optionals/compat_sma3_iansky/script_component.hpp index 4a5a9c03b0..5b627ce63a 100644 --- a/optionals/compat_hlcmods_m60e4/script_component.hpp +++ b/optionals/compat_sma3_iansky/script_component.hpp @@ -1,4 +1,4 @@ -#define COMPONENT hlc_m60e4_comp +#define COMPONENT sma3_iansky_comp #include "\z\ace\addons\main\script_mod.hpp" diff --git a/optionals/server/script_component.hpp b/optionals/server/script_component.hpp index 18afd814f7..c81bf390de 100644 --- a/optionals/server/script_component.hpp +++ b/optionals/server/script_component.hpp @@ -1,5 +1,5 @@ #define COMPONENT server -#include "\z\ace\Addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_SERVER #define DEBUG_MODE_FULL @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_SERVER #endif -#include "\z\ace\Addons\main\script_macros.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/tracers/$PBOPREFIX$ b/optionals/tracers/$PBOPREFIX$ new file mode 100644 index 0000000000..0b2ee2511f --- /dev/null +++ b/optionals/tracers/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\tracers \ No newline at end of file diff --git a/optionals/tracers/CfgAmmo.hpp b/optionals/tracers/CfgAmmo.hpp new file mode 100644 index 0000000000..7155087627 --- /dev/null +++ b/optionals/tracers/CfgAmmo.hpp @@ -0,0 +1,217 @@ + +class CfgAmmo { + class B_556x45_Ball; + class B_556x45_Ball_Tracer_Red : B_556x45_Ball { + model = PATHTOF(ace_TracerRed2.p3d); + }; + class B_556x45_Ball_Tracer_Green : B_556x45_Ball { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_556x45_Ball_Tracer_Yellow : B_556x45_Ball { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_65x39_Case; + class B_65x39_Case_green: B_65x39_Case { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_65x39_Case_yellow: B_65x39_Case { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class B_65x39_Caseless; + class B_65x39_Caseless_green: B_65x39_Caseless { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_65x39_Caseless_yellow: B_65x39_Caseless { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class B_762x51_Ball; + class B_762x51_Tracer_Red: B_762x51_Ball { + model = PATHTOF(ace_TracerRed2.p3d); + }; + class B_762x51_Tracer_Green: B_762x51_Ball { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_762x51_Tracer_Yellow: B_762x51_Ball { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class B_762x54_Ball; + class B_762x54_Tracer_Red: B_762x54_Ball { + model = PATHTOF(ace_TracerRed2.p3d); + }; + class B_762x54_Tracer_Green: B_762x54_Ball { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_762x54_Tracer_Yellow: B_762x54_Ball { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class ACE_762x54_Ball_7T2 : B_762x54_Tracer_Green { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class ACE_762x39_Ball_57N231P : B_762x54_Tracer_Green { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_9x21_Ball; + class B_9x21_Ball_Tracer_Green: B_9x21_Ball { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_127x99_Ball; + class B_127x99_Ball_Tracer_Red: B_127x99_Ball { + model = PATHTOF(ace_TracerRed2.p3d); + }; + class B_127x99_Ball_Tracer_Green: B_127x99_Ball { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_127x99_Ball_Tracer_Yellow: B_127x99_Ball { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class B_127x99_SLAP; + class B_127x99_SLAP_Tracer_Red: B_127x99_SLAP { + model = PATHTOF(ace_TracerRed2.p3d); + }; + class B_127x99_SLAP_Tracer_Green: B_127x99_SLAP { + model = PATHTOF(ace_TracerGreen2.p3d); + }; + class B_127x99_SLAP_Tracer_Yellow: B_127x99_SLAP { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class B_30mm_HE; + class B_30mm_HE_Tracer_Red: B_30mm_HE { + model = PATHTOF(tracer_red_2.p3d); + }; + class B_30mm_HE_Tracer_Green: B_30mm_HE { + model = PATHTOF(tracer_green_2.p3d); + }; + class B_30mm_HE_Tracer_Yellow: B_30mm_HE { + model = PATHTOF(tracer_yellow_2.p3d); + }; + class B_40mm_GPR; + class B_40mm_GPR_Tracer_Red: B_40mm_GPR { + model = PATHTOF(tracer_red_2.p3d); + }; + class B_40mm_GPR_Tracer_Green: B_40mm_GPR { + model = PATHTOF(tracer_green_2.p3d); + }; + class B_40mm_GPR_Tracer_Yellow: B_40mm_GPR { + model = PATHTOF(tracer_yellow_2.p3d); + }; + class B_20mm; + class B_20mm_Tracer_Red: B_20mm { + model = PATHTOF(tracer_red_2.p3d); + }; + class B_30mm_AP; + class B_30mm_AP_Tracer_Red: B_30mm_AP { + model = PATHTOF(tracer_red_2.p3d); + }; + class B_30mm_AP_Tracer_Green: B_30mm_AP { + model = PATHTOF(tracer_green_2.p3d); + }; + class B_30mm_AP_Tracer_Yellow: B_30mm_AP { + model = PATHTOF(tracer_yellow_2.p3d); + }; + class B_30mm_APFSDS; + class B_30mm_APFSDS_Tracer_Red: B_30mm_APFSDS { + model = PATHTOF(tracer_red_2.p3d); + }; + class B_30mm_APFSDS_Tracer_Green: B_30mm_APFSDS { + model = PATHTOF(tracer_green_2.p3d); + }; + class B_30mm_APFSDS_Tracer_Yellow: B_30mm_APFSDS { + model = PATHTOF(tracer_yellow_2.p3d); + }; + class B_35mm_AA; + class B_35mm_AA_Tracer_Red: B_35mm_AA { + model = PATHTOF(tracer_red_2.p3d); + }; + class B_35mm_AA_Tracer_Green: B_35mm_AA { + model = PATHTOF(tracer_green_2.p3d); + }; + class B_35mm_AA_Tracer_Yellow: B_35mm_AA { + model = PATHTOF(tracer_yellow_2.p3d); + }; + class Sh_120mm_HE; + class Sh_120mm_HE_Tracer_Red: Sh_120mm_HE { + model = PATHTOF(ace_shell_tracer_red.p3d); + }; + class Sh_120mm_HE_Tracer_Green: Sh_120mm_HE { + model = PATHTOF(ace_shell_tracer_green.p3d); + }; + class Sh_120mm_HE_Tracer_Yellow: Sh_120mm_HE { + model = PATHTOF(ace_shell_tracer_yellow.p3d); + }; + class Sh_120mm_APFSDS; + class Sh_120mm_APFSDS_Tracer_Red: Sh_120mm_APFSDS { + model = PATHTOF(ace_shell_tracer_red.p3d); + }; + class Sh_120mm_APFSDS_Tracer_Green: Sh_120mm_APFSDS { + model = PATHTOF(ace_shell_tracer_green.p3d); + }; + class Sh_120mm_APFSDS_Tracer_Yellow: Sh_120mm_APFSDS { + model = PATHTOF(ace_shell_tracer_yellow.p3d); + }; + class SubmunitionBullet; + class B_762x51_Minigun_Tracer_Red: SubmunitionBullet { + model = PATHTOF(ace_TracerRed2.p3d); + }; + class B_762x51_Minigun_Tracer_Yellow: B_762x51_Minigun_Tracer_Red { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class B_762x51_Minigun_Tracer_Red_splash: B_762x51_Ball { + model = PATHTOF(ace_TracerRed2.p3d); + }; + class B_762x51_Minigun_Tracer_Yellow_splash: B_762x51_Minigun_Tracer_Red_splash { + model = PATHTOF(ace_TracerYellow2.p3d); + }; + class Sh_125mm_APFSDS; + class Sh_125mm_APFSDS_T_Red: Sh_125mm_APFSDS { + model = PATHTOF(ace_shell_tracer_red.p3d); + }; + class Sh_125mm_APFSDS_T_Green: Sh_125mm_APFSDS { + model = PATHTOF(ace_shell_tracer_green.p3d); + }; + class Sh_125mm_APFSDS_T_Yellow: Sh_125mm_APFSDS { + model = PATHTOF(ace_shell_tracer_yellow.p3d); + }; + class Sh_125mm_HE; + class Sh_125mm_HE_T_Red: Sh_125mm_HE { + model = PATHTOF(ace_shell_tracer_red.p3d); + }; + class Sh_125mm_HE_T_Green: Sh_125mm_HE { + model = PATHTOF(ace_shell_tracer_green.p3d); + }; + class Sh_125mm_HE_T_Yellow: Sh_125mm_HE { + model = PATHTOF(ace_shell_tracer_yellow.p3d); + }; + class Sh_125mm_HEAT; + class Sh_125mm_HEAT_T_Red: Sh_125mm_HEAT { + model = PATHTOF(ace_shell_tracer_red.p3d); + }; + class Sh_125mm_HEAT_T_Green: Sh_125mm_HEAT { + model = PATHTOF(ace_shell_tracer_green.p3d); + }; + class Sh_125mm_HEAT_T_Yellow: Sh_125mm_HEAT { + model = PATHTOF(ace_shell_tracer_yellow.p3d); + }; + class Sh_105mm_APFSDS; + class Sh_105mm_APFSDS_T_Red: Sh_105mm_APFSDS { + model = PATHTOF(ace_shell_tracer_red.p3d); + }; + class Sh_105mm_APFSDS_T_Green: Sh_105mm_APFSDS { + model = PATHTOF(ace_shell_tracer_green.p3d); + }; + class Sh_105mm_APFSDS_T_Yellow: Sh_105mm_APFSDS { + model = PATHTOF(ace_shell_tracer_yellow.p3d); + }; + class Sh_105mm_HEAT_MP; + class Sh_105mm_HEAT_MP_T_Red: Sh_105mm_HEAT_MP { + model = PATHTOF(ace_shell_tracer_red.p3d); + }; + class Sh_105mm_HEAT_MP_T_Green: Sh_105mm_HEAT_MP { + model = PATHTOF(ace_shell_tracer_green.p3d); + }; + class Sh_105mm_HEAT_MP_T_Yellow: Sh_105mm_HEAT_MP { + model = PATHTOF(ace_shell_tracer_yellow.p3d); + }; +}; diff --git a/optionals/tracers/README.md b/optionals/tracers/README.md new file mode 100644 index 0000000000..868b697cff --- /dev/null +++ b/optionals/tracers/README.md @@ -0,0 +1,10 @@ +ace_balltracers +=========== + +Ball tracers for Arma 3 ported from ACE2. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [jaynus](https://github.com/walterpearce) diff --git a/optionals/tracers/ace_40mm_tracer_red.p3d b/optionals/tracers/ace_40mm_tracer_red.p3d new file mode 100644 index 0000000000..d9ed221913 Binary files /dev/null and b/optionals/tracers/ace_40mm_tracer_red.p3d differ diff --git a/optionals/tracers/ace_TracerGreen2.p3d b/optionals/tracers/ace_TracerGreen2.p3d new file mode 100644 index 0000000000..7ca3d85a0e Binary files /dev/null and b/optionals/tracers/ace_TracerGreen2.p3d differ diff --git a/optionals/tracers/ace_TracerRed2.p3d b/optionals/tracers/ace_TracerRed2.p3d new file mode 100644 index 0000000000..bf22f9b761 Binary files /dev/null and b/optionals/tracers/ace_TracerRed2.p3d differ diff --git a/optionals/tracers/ace_TracerYellow2.p3d b/optionals/tracers/ace_TracerYellow2.p3d new file mode 100644 index 0000000000..7ab78d466e Binary files /dev/null and b/optionals/tracers/ace_TracerYellow2.p3d differ diff --git a/optionals/tracers/ace_shell_tracer_green.p3d b/optionals/tracers/ace_shell_tracer_green.p3d new file mode 100644 index 0000000000..64963617d7 Binary files /dev/null and b/optionals/tracers/ace_shell_tracer_green.p3d differ diff --git a/optionals/tracers/ace_shell_tracer_red.p3d b/optionals/tracers/ace_shell_tracer_red.p3d new file mode 100644 index 0000000000..622427ca63 Binary files /dev/null and b/optionals/tracers/ace_shell_tracer_red.p3d differ diff --git a/optionals/tracers/ace_shell_tracer_yellow.p3d b/optionals/tracers/ace_shell_tracer_yellow.p3d new file mode 100644 index 0000000000..3d2de95cf9 Binary files /dev/null and b/optionals/tracers/ace_shell_tracer_yellow.p3d differ diff --git a/optionals/compat_hlcmods_core/config.cpp b/optionals/tracers/config.cpp similarity index 60% rename from optionals/compat_hlcmods_core/config.cpp rename to optionals/tracers/config.cpp index ecd780908f..7ea5992f14 100644 --- a/optionals/compat_hlcmods_core/config.cpp +++ b/optionals/tracers/config.cpp @@ -1,14 +1,15 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"hlcweapons_core"}; - author[]={"Ruthberg"}; - VERSION_CONFIG; - }; -}; - -#include "CfgAmmo.hpp" +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_ballistics"}; + author[] = {"ACE2 Team"}; + authorUrl = "https://www.ace3mod.com"; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" diff --git a/optionals/tracers/data/SLX_GreenTracer_Material.rvmat b/optionals/tracers/data/SLX_GreenTracer_Material.rvmat new file mode 100644 index 0000000000..7eeaacfac3 --- /dev/null +++ b/optionals/tracers/data/SLX_GreenTracer_Material.rvmat @@ -0,0 +1,9 @@ +ambient[] = {0.2, 0.8, 0.1, 1}; +diffuse[] = {0.2, 0.8, 0.1, 1}; +forcedDiffuse[] = {0.2, 0.8, 0.1, 1}; +emmisive[] = {0.2, 0.8, 0.1, 1}; +specular[] = {0.0, 0.0, 0.0, 0.0}; +specularPower = 0.0; +renderFlags[] = {"NoZWrite", "NoAlphaWrite", "AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; diff --git a/optionals/tracers/data/SLX_RedTracer_Material.rvmat b/optionals/tracers/data/SLX_RedTracer_Material.rvmat new file mode 100644 index 0000000000..d9003198c2 --- /dev/null +++ b/optionals/tracers/data/SLX_RedTracer_Material.rvmat @@ -0,0 +1,9 @@ +ambient[] = {0.8, 0.1, 0.1, 1}; +diffuse[] = {0.8, 0.1, 0.1, 1}; +forcedDiffuse[] = {0.8, 0.1, 0.1, 1}; +emmisive[] = {0.8, 0.1, 0.1, 1}; +specular[] = {0.0, 0.0, 0.0, 0.0}; +specularPower = 0.0; +renderFlags[] = {"NoZWrite", "NoAlphaWrite", "AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; diff --git a/optionals/tracers/data/SLX_YellowTracer_Material.rvmat b/optionals/tracers/data/SLX_YellowTracer_Material.rvmat new file mode 100644 index 0000000000..277f3fba00 --- /dev/null +++ b/optionals/tracers/data/SLX_YellowTracer_Material.rvmat @@ -0,0 +1,9 @@ +ambient[] = {1, 0.98, 0.137, 1}; +diffuse[] = {1, 0.98, 0.137, 1}; +forcedDiffuse[] = {1, 0.98, 0.137, 1}; +emmisive[] = {1, 0.98, 0.137, 1}; +specular[] = {0.0, 0.0, 0.0, 0.0}; +specularPower = 0.0; +renderFlags[] = {"NoZWrite", "NoAlphaWrite", "AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; diff --git a/optionals/tracers/data/TracerGreen.paa b/optionals/tracers/data/TracerGreen.paa new file mode 100644 index 0000000000..5117ab87cf Binary files /dev/null and b/optionals/tracers/data/TracerGreen.paa differ diff --git a/optionals/tracers/data/TracerRed.paa b/optionals/tracers/data/TracerRed.paa new file mode 100644 index 0000000000..c31b94fb80 Binary files /dev/null and b/optionals/tracers/data/TracerRed.paa differ diff --git a/optionals/tracers/data/TracerYellow.paa b/optionals/tracers/data/TracerYellow.paa new file mode 100644 index 0000000000..9783b25831 Binary files /dev/null and b/optionals/tracers/data/TracerYellow.paa differ diff --git a/optionals/tracers/data/clear_empty.paa b/optionals/tracers/data/clear_empty.paa new file mode 100644 index 0000000000..e12f6f1568 Binary files /dev/null and b/optionals/tracers/data/clear_empty.paa differ diff --git a/optionals/tracers/data/tracer_green.rvmat b/optionals/tracers/data/tracer_green.rvmat new file mode 100644 index 0000000000..75861155b7 --- /dev/null +++ b/optionals/tracers/data/tracer_green.rvmat @@ -0,0 +1,18 @@ +//////////////////////////////////////////////////////////////////// +//Produced from mikero's Dos Tools using dll 3.17 +//http://dev-heaven.net/projects/list_files/mikero-pbodll +//////////////////////////////////////////////////////////////////// + +#define _ARMA_ + +//Class weapons : Data\bullettracer\Data\tracer_green.rvmat{ +ambient[] = {1.0,1.0,1.0,3.25}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {1.0,1.0,1.0,1.0}; +specular[] = {0.0,0.0,0.0,1.0}; +specularPower = 1.0; +renderFlags[] = {"NoZWrite","AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; +//}; diff --git a/optionals/tracers/data/tracer_green1_ca.paa b/optionals/tracers/data/tracer_green1_ca.paa new file mode 100644 index 0000000000..a8960e69f8 Binary files /dev/null and b/optionals/tracers/data/tracer_green1_ca.paa differ diff --git a/optionals/tracers/data/tracer_red.rvmat b/optionals/tracers/data/tracer_red.rvmat new file mode 100644 index 0000000000..08b2ab1abc --- /dev/null +++ b/optionals/tracers/data/tracer_red.rvmat @@ -0,0 +1,18 @@ +//////////////////////////////////////////////////////////////////// +//Produced from mikero's Dos Tools using dll 3.17 +//http://dev-heaven.net/projects/list_files/mikero-pbodll +//////////////////////////////////////////////////////////////////// + +#define _ARMA_ + +//Class weapons : Data\bullettracer\Data\tracer_red.rvmat{ +ambient[] = {1.0,1.0,1.0,3.25}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {1.0,1.0,1.0,1.0}; +specular[] = {0.0,0.0,0.0,1.0}; +specularPower = 1.0; +renderFlags[] = {"NoZWrite","AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; +//}; diff --git a/optionals/tracers/data/tracer_red1_ca.paa b/optionals/tracers/data/tracer_red1_ca.paa new file mode 100644 index 0000000000..171325cc55 Binary files /dev/null and b/optionals/tracers/data/tracer_red1_ca.paa differ diff --git a/optionals/tracers/data/tracer_yellow.rvmat b/optionals/tracers/data/tracer_yellow.rvmat new file mode 100644 index 0000000000..f1c7a71670 --- /dev/null +++ b/optionals/tracers/data/tracer_yellow.rvmat @@ -0,0 +1,18 @@ +//////////////////////////////////////////////////////////////////// +//Produced from mikero's Dos Tools using dll 3.17 +//http://dev-heaven.net/projects/list_files/mikero-pbodll +//////////////////////////////////////////////////////////////////// + +#define _ARMA_ + +//Class weapons : Data\bullettracer\Data\tracer_yellow.rvmat{ +ambient[] = {1.0,1.0,1.0,3.25}; +diffuse[] = {1.0,1.0,1.0,1.0}; +forcedDiffuse[] = {0.0,0.0,0.0,0.0}; +emmisive[] = {1.0,1.0,1.0,1.0}; +specular[] = {0.0,0.0,0.0,1.0}; +specularPower = 1.0; +renderFlags[] = {"NoZWrite","AddBlend"}; +PixelShaderID = "Normal"; +VertexShaderID = "Basic"; +//}; diff --git a/optionals/tracers/data/tracer_yellow1_ca.paa b/optionals/tracers/data/tracer_yellow1_ca.paa new file mode 100644 index 0000000000..f895ffe6e3 Binary files /dev/null and b/optionals/tracers/data/tracer_yellow1_ca.paa differ diff --git a/optionals/tracers/model.cfg b/optionals/tracers/model.cfg new file mode 100644 index 0000000000..3de6e77bd1 --- /dev/null +++ b/optionals/tracers/model.cfg @@ -0,0 +1,44 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + class ACE_Tracer_Skeleton : Default {}; + class ACE_Tracer_Skeleton_Default: ACE_Tracer_Skeleton { // BWC + skeletonInherit = "ACE_Tracer_Skeleton"; + skeletonBones[]= { + "core","", + "halo","", + "tracer","" + }; + }; +}; + +class CfgModels { + class Default { + sectionsInherit=""; + sections[] = {}; + skeletonName = ""; + }; + class ACE_Tracer: Default { + skeletonName = "ACE_Tracer_Skeleton"; + }; + class ACE_Tracer_Default: ACE_Tracer { // BWC + skeletonName = "ACE_Tracer_Skeleton_Default"; + }; + // Bullet tracers + class ace_TracerRed2: ACE_Tracer_Default {}; + class ace_TracerGreen2: ACE_Tracer_Default {}; + class ace_TracerYellow2: ACE_Tracer_Default {}; + + // Bullet tracers, alternative + class tracer_green_2: ACE_Tracer {}; + class tracer_red_2: ACE_Tracer {}; + class tracer_yellow_2: ACE_Tracer {}; + + // Shell Tracers + class ace_shell_tracer_green: ACE_Tracer {}; + class ace_shell_tracer_red: ACE_Tracer {}; + class ace_shell_tracer_yellow: ACE_Tracer {}; +}; diff --git a/optionals/tracers/script_component.hpp b/optionals/tracers/script_component.hpp new file mode 100644 index 0000000000..b5dd507dcb --- /dev/null +++ b/optionals/tracers/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT tracers +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_SYS_TRACERS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_SYS_TRACERS + #define DEBUG_SETTINGS DEBUG_SETTINGS_SYS_TRACERS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/tracers/tracer_green_2.p3d b/optionals/tracers/tracer_green_2.p3d new file mode 100644 index 0000000000..215e4938b1 Binary files /dev/null and b/optionals/tracers/tracer_green_2.p3d differ diff --git a/optionals/tracers/tracer_red_2.p3d b/optionals/tracers/tracer_red_2.p3d new file mode 100644 index 0000000000..507fdae336 Binary files /dev/null and b/optionals/tracers/tracer_red_2.p3d differ diff --git a/optionals/tracers/tracer_yellow_2.p3d b/optionals/tracers/tracer_yellow_2.p3d new file mode 100644 index 0000000000..1a52ada09f Binary files /dev/null and b/optionals/tracers/tracer_yellow_2.p3d differ diff --git a/tools/build.py b/tools/build.py index c6a425975e..716d4fb3a7 100644 --- a/tools/build.py +++ b/tools/build.py @@ -4,6 +4,10 @@ import os import sys import subprocess +######## GLOBALS ######### +MAINPREFIX = "z" +PREFIX = "ace_" +########################## def mod_time(path): if not os.path.isdir(path): @@ -15,12 +19,12 @@ def mod_time(path): def check_for_changes(addonspath, module): - if not os.path.exists(os.path.join(addonspath, "ace_{}.pbo".format(module))): + if not os.path.exists(os.path.join(addonspath, "{}{}.pbo".format(PREFIX,module))): return True - return mod_time(os.path.join(addonspath, module)) > mod_time(os.path.join(addonspath, "ace_{}.pbo".format(module))) + return mod_time(os.path.join(addonspath, module)) > mod_time(os.path.join(addonspath, "{}{}.pbo".format(PREFIX,module))) def check_for_obsolete_pbos(addonspath, file): - module = file[4:-4] + module = file[len(PREFIX):-4] if not os.path.exists(os.path.join(addonspath, module)): return True return False @@ -68,9 +72,9 @@ def main(): subprocess.check_output([ "makepbo", "-NUP", - "-@=z\\addons\\ace\\{}".format(p), + "-@={}\\{}\\addons\\{}".format(MAINPREFIX,PREFIX.rstrip("_"),p), p, - "ace_{}.pbo".format(p) + "{}{}.pbo".format(PREFIX,p) ], stderr=subprocess.STDOUT) except: failed += 1 diff --git a/tools/make.cfg b/tools/make.cfg index 5e4460ffd9..5045099e26 100644 --- a/tools/make.cfg +++ b/tools/make.cfg @@ -63,6 +63,10 @@ release_dir = P:\z\ace\release # Default: None pbo_name_prefix = ace_ +# This string will be prefixed to release archive. +# Default: None +zipPrefix = ace3 + # Which build tool will be used? Options: pboproject, addonbuilder # Default: addonbuilder build_tool = pboproject diff --git a/tools/make.py b/tools/make.py index b461d77946..8eb8950c7f 100644 --- a/tools/make.py +++ b/tools/make.py @@ -51,10 +51,13 @@ import traceback import time import re +from tempfile import mkstemp + if sys.platform == "win32": import winreg ######## GLOBALS ######### +project = "@ace" ACE_VERSION = "3.0.0" arma3tools_path = "" work_drive = "" @@ -69,6 +72,8 @@ dssignfile = "" prefix = "ace" pbo_name_prefix = "ace_" signature_blacklist = ["ace_server.pbo"] +importantFiles = ["mod.cpp", "README.md", "AUTHORS.txt", "LICENSE", "logo_ace3_ca.paa"] +versionFiles = ["README.md", "mod.cpp"] ############################################################################### # http://akiscode.com/articles/sha-1directoryhash.shtml @@ -310,12 +315,6 @@ def print_yellow(msg): def copy_important_files(source_dir,destination_dir): originalDir = os.getcwd() - importantFiles = ["mod.cpp", - "README.md", - "AUTHORS.txt", - "LICENSE", - "logo_ace3_ca.paa" - ] #copy importantFiles try: @@ -358,21 +357,21 @@ def copy_optionals_for_building(mod,pbos): try: #special server.pbo processing - files = glob.glob(os.path.join(release_dir, "@ace","optionals","*.pbo")) + files = glob.glob(os.path.join(release_dir, project, "optionals", "*.pbo")) for file in files: file_name = os.path.basename(file) #print ("Adding the following file: {}".format(file_name)) pbos.append(file_name) - pbo_path = os.path.join(release_dir, "@ace","optionals",file_name) + pbo_path = os.path.join(release_dir, project, "optionals", file_name) sigFile_name = file_name +"."+ key_name + ".bisign" - sig_path = os.path.join(release_dir, "@ace","optionals",sigFile_name) + sig_path = os.path.join(release_dir, project, "optionals", sigFile_name) if (os.path.isfile(pbo_path)): print("Moving {} for processing.".format(pbo_path)) - shutil.move(pbo_path, os.path.join(release_dir,"@ace","addons",file_name)) + shutil.move(pbo_path, os.path.join(release_dir, project, "addons", file_name)) if (os.path.isfile(sig_path)): #print("Moving {} for processing.".format(sig_path)) - shutil.move(sig_path, os.path.join(release_dir,"@ace","addons",sigFile_name)) + shutil.move(sig_path, os.path.join(release_dir, project, "addons", sigFile_name)) except: print_error("Error in moving") raise @@ -386,9 +385,9 @@ def copy_optionals_for_building(mod,pbos): #userconfig requires special handling since it is not a PBO source folder. #CfgConvert fails to build server.pbo if userconfig is not found in P:\ if (dir_name == "userconfig"): - if (os.path.exists(os.path.join(release_dir, "@ace","optionals",dir_name))): - shutil.rmtree(os.path.join(release_dir, "@ace","optionals",dir_name), True) - shutil.copytree(os.path.join(optionals_root,dir_name), os.path.join(release_dir, "@ace","optionals",dir_name)) + if (os.path.exists(os.path.join(release_dir, project, "optionals", dir_name))): + shutil.rmtree(os.path.join(release_dir, project, "optionals", dir_name), True) + shutil.copytree(os.path.join(optionals_root,dir_name), os.path.join(release_dir, project, "optionals", dir_name)) destination = os.path.join(work_drive,dir_name) else: destination = os.path.join(module_root,dir_name) @@ -417,13 +416,13 @@ def cleanup_optionals(mod): print("Cleaning {}".format(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) + file_name = "{}{}.pbo".format(pbo_name_prefix,dir_name) + src_file_path = os.path.join(release_dir, project, "addons", file_name) + dst_file_path = os.path.join(release_dir, project, "optionals", file_name) - sigFile_name = file_name +"."+ key_name + ".bisign" - src_sig_path = os.path.join(release_dir, "@ace","addons",sigFile_name) - dst_sig_path = os.path.join(release_dir, "@ace","optionals",sigFile_name) + sigFile_name = "{}.{}.bisign".format(file_name,key_name) + src_sig_path = os.path.join(release_dir, project, "addons", sigFile_name) + dst_sig_path = os.path.join(release_dir, project, "optionals", sigFile_name) if (os.path.isfile(src_file_path)): #print("Preserving {}".format(file_name)) @@ -432,7 +431,7 @@ def cleanup_optionals(mod): #print("Preserving {}".format(sigFile_name)) os.renames(src_sig_path,dst_sig_path) except FileExistsError: - print_error(file_name + " already exists") + print_error("{} already exists".format(file_name)) continue shutil.rmtree(destination) @@ -465,7 +464,7 @@ def build_signature_file(file_name): def check_for_obsolete_pbos(addonspath, file): - module = file[4:-4] + module = file[len(pbo_name_prefix):-4] if not os.path.exists(os.path.join(addonspath, module)): return True return False @@ -576,11 +575,105 @@ def get_ace_version(): input("Press Enter to continue...") print("Resuming build...") - print_yellow("ACE VERSION set to {}".format(versionStamp)) + print_yellow("{} VERSION set to {}".format(project.lstrip("@").upper(),versionStamp)) ACE_VERSION = versionStamp return ACE_VERSION +def replace_file(filePath, oldSubstring, newSubstring): + #Create temp file + fh, absPath = mkstemp() + with open(absPath,'w') as newFile: + with open(filePath) as oldFile: + for line in oldFile: + newFile.write(line.replace(oldSubstring, newSubstring)) + newFile.close() + #Remove original file + os.remove(filePath) + #Move new file + shutil.move(absPath, filePath) + + +def set_version_in_files(): + newVersion = ACE_VERSION # MAJOR.MINOR.PATCH.BUILD + newVersionShort = newVersion[:-2] # MAJOR.MINOR.PATCH + + # Regex patterns + pattern = re.compile(r"(\b[0\.-9]+\b\.[0\.-9]+\b\.[0\.-9]+\b\.[0\.-9]+)") # MAJOR.MINOR.PATCH.BUILD + patternShort = re.compile(r"(\b[0\.-9]+\b\.[0\.-9]+\b\.[0\.-9]+)") # MAJOR.MINOR.PATCH + + # Change versions in files containing version + for i in versionFiles: + filePath = os.path.join(module_root_parent, i) + + try: + # Save the file contents to a variable if the file exists + if os.path.isfile(filePath): + f = open(filePath, "r+") + fileText = f.read() + f.close() + + if fileText: + # Search and save version stamp, search short if long not found + versionFound = re.findall(pattern, fileText) + if not versionFound: + versionFound = re.findall(patternShort, fileText) + + # Replace version stamp if any of the new version parts is higher than the one found + if versionFound: + # First item in the list findall returns + versionFound = versionFound[0] + + # Use the same version length as the one found + if len(versionFound) == len(newVersion): + newVersionUsed = newVersion + if len(versionFound) == len(newVersionShort): + newVersionUsed = newVersionShort + + # Print change and modify the file if changed + if versionFound != newVersionUsed: + print_green("Changing version {} => {} in {}".format(versionFound, newVersionUsed, filePath)) + replace_file(filePath, versionFound, newVersionUsed) + + except WindowsError as e: + # Temporary file is still "in use" by Python, pass this exception + pass + except Exception as e: + print_error("set_version_in_files error: {}".format(e)) + raise + + return True + + +def stash_version_files_for_building(): + try: + for file in versionFiles: + filePath = os.path.join(module_root_parent, file) + stashPath = os.path.join(release_dir, file) + print("Temporarily stashing {} => {}.bak for version update".format(filePath, stashPath)) + shutil.copy(filePath, "{}.bak".format(stashPath)) + except: + print_error("Stashing version files failed") + raise + + # Set version + set_version_in_files() + return True + + +def restore_version_files(): + try: + for file in versionFiles: + filePath = os.path.join(module_root_parent, file) + stashPath = os.path.join(release_dir, file) + print("Restoring {}".format(filePath)) + shutil.move("{}.bak".format(stashPath), filePath) + except: + print_error("Restoring version files failed") + raise + return True + + def get_private_keyname(commitID,module="main"): global pbo_name_prefix @@ -653,6 +746,7 @@ def version_stamp_pboprefix(module,commitID): return True + ############################################################################### @@ -689,8 +783,6 @@ def main(argv): # Default behaviors test = False # Copy to Arma 3 directory? arg_modules = False # Only build modules on command line? - make_release = False # Make zip file from the release? - release_version = 0 # Version of release use_pboproject = True # Default to pboProject build tool make_target = "DEFAULT" # Which section in make.cfg to use for the build new_key = True # Make a new key and use it to sign? @@ -742,10 +834,13 @@ See the make.cfg file for additional build options. argv.remove("test") if "release" in argv: - make_release = True + make_release_zip = True release_version = argv[argv.index("release") + 1] argv.remove(release_version) argv.remove("release") + else: + make_release_zip = False + release_version = ACE_VERSION if "target" in argv: make_target = argv[argv.index("target") + 1] @@ -768,6 +863,12 @@ See the make.cfg file for additional build options. check_external = True else: check_external = False + + if "version" in argv: + argv.remove("version") + version_update = True + else: + version_update = False print_yellow("\nCheck external references is set to {}".format(str(check_external))) @@ -796,6 +897,9 @@ See the make.cfg file for additional build options. # Project prefix (folder path) prefix = cfg.get(make_target, "prefix", fallback="") + + # Release archive prefix + zipPrefix = cfg.get(make_target, "zipPrefix", fallback=project.lstrip("@").lower()) # Should we autodetect modules on a complete build? module_autodetect = cfg.getboolean(make_target, "module_autodetect", fallback=True) @@ -853,7 +957,7 @@ See the make.cfg file for additional build options. sys.exit(1) # See if we have been given specific modules to build from command line. - if len(argv) > 1 and not make_release: + if len(argv) > 1 and not make_release_zip: arg_modules = True modules = argv[1:] @@ -908,9 +1012,18 @@ See the make.cfg file for additional build options. print_error("Cannot create release directory") raise + # Update version stamp in all files that contain it + # Update version only for release if full update not requested (backup and restore files) + print_blue("\nChecking for obsolete version numbers...") + if not version_update: + stash_version_files_for_building() + else: + # Set version + set_version_in_files(); + print("Version in files has been changed, make sure you commit and push the updates!") try: - #Temporarily copy optionals_root for building. They will be removed later. + # Temporarily copy optionals_root for building. They will be removed later. optionals_modules = [] optional_files = [] copy_optionals_for_building(optionals_modules,optional_files) @@ -963,13 +1076,13 @@ See the make.cfg file for additional build options. # Use biKeyNameAbrev to attempt to minimize problems from this BI Bug REFERENCE: http://feedback.arma3.com/view.php?id=22133 biKeyNameAbrev = key_name.split("-")[0] - shutil.copyfile(os.path.join(private_key_path, key_name + ".bikey"), os.path.join(module_root, release_dir, project, "keys", biKeyNameAbrev + ".bikey")) + shutil.copyfile(os.path.join(private_key_path, key_name + ".bikey"), os.path.join(module_root, release_dir, project, "keys", "{}.bikey".format(biKeyNameAbrev))) except: print_error("Could not copy key to release directory.") raise - key = os.path.join(private_key_path, key_name + ".biprivatekey") + key = os.path.join(private_key_path, "{}.biprivatekey".format(key_name)) # Remove any obsolete files. print_blue("\nChecking for obsolete files...") @@ -979,7 +1092,7 @@ See the make.cfg file for additional build options. if check_for_obsolete_pbos(module_root, file): fileName = os.path.splitext(file)[0] print_yellow("Removing obsolete file => {}".format(file)) - purge(obsolete_check_path,fileName+"\..",fileName+".*") + purge(obsolete_check_path, "{}\..".format(fileName), "{}.*".format(fileName)) obsolete_check_path = os.path.join(module_root, release_dir, project) for file in os.listdir(obsolete_check_path): @@ -1010,12 +1123,12 @@ See the make.cfg file for additional build options. new_sha = get_directory_hash(os.path.join(module_root, module)) # Is the pbo or sig file missing? - missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "ace_{}.pbo".format(module))) - sigFile = pbo_name_prefix+module + ".pbo." + key_name + ".bisign" - sigMissing = not os.path.isfile(os.path.join(release_dir, project, "addons", sigFile )) + missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "{}{}.pbo".format(pbo_name_prefix,module))) + sigFile = "{}{}.pbo.{}.bisign".format(pbo_name_prefix,module,key_name) + sigMissing = not os.path.isfile(os.path.join(release_dir, project, "addons", sigFile)) if missing: - print_yellow("Missing PBO file ace_{}.pbo".format(module) + ". Building...") + print_yellow("Missing PBO file {}{}.pbo. Building...".format(pbo_name_prefix,module)) # Check if it needs rebuilt # print ("Hash:", new_sha) @@ -1025,7 +1138,7 @@ See the make.cfg file for additional build options. if sigMissing: if key: print("Missing Signature key {}".format(sigFile)) - build_signature_file(os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix + module + ".pbo")) + build_signature_file(os.path.join(module_root, release_dir, project, "addons", "{}{}.pbo".format(pbo_name_prefix,module))) # Skip everything else continue @@ -1050,13 +1163,13 @@ See the make.cfg file for additional build options. try: # Remove the old pbo, key, and log - old = os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix+module) + "*" + old = os.path.join(module_root, release_dir, project, "addons", "{}{}".format(pbo_name_prefix,module)) + "*" files = glob.glob(old) for f in files: os.remove(f) if pbo_name_prefix: - old = os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix+module) + "*" + old = os.path.join(module_root, release_dir, project, "addons", "{}{}".format(pbo_name_prefix,module)) + "*" files = glob.glob(old) for f in files: os.remove(f) @@ -1083,16 +1196,16 @@ See the make.cfg file for additional build options. if build_tool == "pboproject": try: nobinFilePath = os.path.join(work_drive, prefix, module, "$NOBIN$") + backup_config(module) if (not os.path.isfile(nobinFilePath)): - backup_config(module) convert_config(module) version_stamp_pboprefix(module,commit_id) if os.path.isfile(nobinFilePath): print_green("$NOBIN$ Found. Proceeding with non-binarizing!") - cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")] + cmd = [makepboTool, "-P","-A","-L","-G","-X=*.backup", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")] else: if check_external: @@ -1114,17 +1227,17 @@ See the make.cfg file for additional build options. # Prettyprefix rename the PBO if requested. if pbo_name_prefix: try: - os.rename(os.path.join(module_root, release_dir, project, "addons", module+".pbo"), os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix+module+".pbo")) + os.rename(os.path.join(module_root, release_dir, project, "addons", "{}.pbo".format(module)), os.path.join(module_root, release_dir, project, "addons", "{}{}.pbo".format(pbo_name_prefix,module))) except: raise print_error("Could not rename built PBO with prefix.") # Sign result - if (key and not "ace_{}.pbo".format(module) in signature_blacklist): + if (key and not "{}{}.pbo".format(pbo_name_prefix,module) in signature_blacklist): print("Signing with {}.".format(key)) if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix + module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "addons", "{}{}.pbo".format(pbo_name_prefix,module))]) else: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "addons", module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "addons", "{}.pbo".format(module))]) if ret == 0: build_successful = True @@ -1183,7 +1296,7 @@ See the make.cfg file for additional build options. # Prettyprefix rename the PBO if requested. if pbo_name_prefix: try: - os.rename(os.path.join(make_root, release_dir, project, "addons", module+".pbo"), os.path.join(make_root, release_dir, project, "addons", pbo_name_prefix+module+".pbo")) + os.rename(os.path.join(make_root, release_dir, project, "addons", "{}.pbo".format(module)), os.path.join(make_root, release_dir, project, "addons", "{}{}.pbo".format(pbo_name_prefix,module))) except: raise print_error("Could not rename built PBO with prefix.") @@ -1192,12 +1305,12 @@ See the make.cfg file for additional build options. # Sign result #print_yellow("Sig_fileName: ace_{}.pbo".format(module)) - if (key and not "ace_{}.pbo".format(module) in signature_blacklist) : + if (key and not "{}{}.pbo".format(pbo_name_prefix,module) in signature_blacklist) : print("Signing with {}.".format(key)) if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "addons", pbo_name_prefix + module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "addons","{}{}.pbo".format(pbo_name_prefix,module))]) else: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "addons", module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "addons", "{}.pbo".format(module))]) if ret == 0: build_successful = True @@ -1226,11 +1339,13 @@ See the make.cfg file for additional build options. except Exception as e: print_yellow("Cancel or some error detected: {}".format(e)) - + finally: - copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) + copy_important_files(module_root_parent,os.path.join(release_dir, project)) cleanup_optionals(optionals_modules) + if not version_update: + restore_version_files() # Done building all modules! @@ -1240,25 +1355,34 @@ See the make.cfg file for additional build options. f.write(cache_out) # Delete the pboproject temp files if building a release. - if make_release and build_tool == "pboproject": + if make_release_zip and build_tool == "pboproject": try: - shutil.rmtree(os.path.join(module_root, release_dir, project, "temp"), True) + shutil.rmtree(os.path.join(release_dir, project, "temp"), True) except: print_error("ERROR: Could not delete pboProject temp files.") # Make release - if make_release: - print_blue("\nMaking release: {}-{}.zip".format(project,release_version)) + if make_release_zip: + release_name = "{}_{}".format(zipPrefix, release_version) + print_blue("\nMaking release: {}.zip".format(release_name)) try: # Delete all log files - for root, dirs, files in os.walk(os.path.join(module_root, release_dir, project, "addons")): + for root, dirs, files in os.walk(os.path.join(release_dir, project, "addons")): for currentFile in files: if currentFile.lower().endswith("log"): os.remove(os.path.join(root, currentFile)) - # Create a zip with the contents of release/ in it - shutil.make_archive(project + "-" + release_version, "zip", os.path.join(module_root, release_dir)) + # Remove all zip files from release folder to prevent zipping the zip + for file in os.listdir(release_dir): + if file.endswith(".zip"): + os.remove(os.path.join(release_dir, file)) + + # Create a zip with the contents of release folder in it + release_zip = shutil.make_archive("{}".format(release_name), "zip", release_dir) + # Move release zip to release folder + shutil.copy(release_zip, release_dir) + os.remove(release_zip) except: raise print_error("Could not make release.") diff --git a/tools/setup.py b/tools/setup.py index 1b9ab119d9..62925a6066 100644 --- a/tools/setup.py +++ b/tools/setup.py @@ -4,7 +4,6 @@ # ACE3 Setup Script # ####################### - import os import sys import shutil @@ -12,8 +11,14 @@ import platform import subprocess import winreg +######## GLOBALS ######### +MAINDIR = "z" +PROJECTDIR = "ace" +CBA = "P:\\x\\cba" +########################## def main(): + FULLDIR = "{}\\{}".format(MAINDIR,PROJECTDIR) print(""" ###################################### # ACE3 Development Environment Setup # @@ -28,10 +33,10 @@ def main(): If you have not done those things yet, please abort this script in the next step and do so first. This script will create two hard links on your system, both pointing to your ACE3 project folder: - [Arma 3 installation directory]\\z\\ace => ACE3 project folder - P:\\z\\ace => ACE3 project folder + [Arma 3 installation directory]\\{} => ACE3 project folder + P:\\{} => ACE3 project folder - It will also copy the required CBA includes to P:\\x\\cba, if you do not have the CBA source code already.""") + It will also copy the required CBA includes to {}, if you do not have the CBA source code already.""".format(FULLDIR,FULLDIR,CBA)) print("\n") try: @@ -60,26 +65,26 @@ def main(): print("\n# Creating links ...") - if os.path.exists("P:\\z\\ace"): + if os.path.exists("P:\\{}\\{}".format(MAINDIR,PROJECTDIR)): print("Link on P: already exists. Please finish the setup manually.") return 4 - if os.path.exists(os.path.join(armapath, "z", "ace")): + if os.path.exists(os.path.join(armapath, MAINDIR, PROJECTDIR)): print("Link in Arma directory already exists. Please finish the setup manually.") return 5 try: - if not os.path.exists("P:\\z"): - os.mkdir("P:\\z") - if not os.path.exists(os.path.join(armapath, "z")): - os.mkdir(os.path.join(armapath, "z")) + if not os.path.exists("P:\\{}".format(MAINDIR)): + os.mkdir("P:\\{}".format(MAINDIR)) + if not os.path.exists(os.path.join(armapath, MAINDIR)): + os.mkdir(os.path.join(armapath, MAINDIR)) if platform.win32_ver()[0] == "7": - subprocess.call(["cmd", "/c", "mklink", "/D", "P:\\z\\ace", projectpath]) - subprocess.call(["cmd", "/c", "mklink", "/D", os.path.join(armapath, "z", "ace"), projectpath]) + subprocess.call(["cmd", "/c", "mklink", "/D", "P:\\{}\\{}".format(MAINDIR,PROJECTDIR), projectpath]) + subprocess.call(["cmd", "/c", "mklink", "/D", os.path.join(armapath, MAINDIR, PROJECTDIR), projectpath]) else: - subprocess.call(["cmd", "/c", "mklink", "/D", "/J", "P:\\z\\ace", projectpath]) - subprocess.call(["cmd", "/c", "mklink", "/D", "/J", os.path.join(armapath, "z", "ace"), projectpath]) + subprocess.call(["cmd", "/c", "mklink", "/D", "/J", "P:\\{}\\{}".format(MAINDIR,PROJECTDIR), projectpath]) + subprocess.call(["cmd", "/c", "mklink", "/D", "/J", os.path.join(armapath, MAINDIR, PROJECTDIR), projectpath]) except: raise print("Something went wrong during the link creation. Please finish the setup manually.") @@ -90,18 +95,18 @@ def main(): print("\n# Copying required CBA includes ...") - if os.path.exists("P:\\x\\cba"): - print("P:\\x\\cba already exists, skipping.") + if os.path.exists(CBA): + print("{} already exists, skipping.".format(CBA)) return -1 try: - shutil.copytree(os.path.join(projectpath, "tools", "cba"), "P:\\x\\cba") + shutil.copytree(os.path.join(projectpath, "tools", "cba"), CBA) except: raise - print("Something went wrong while copying CBA includes. Please copy tools\\cba to P:\\x\\cba manually.") + print("Something went wrong while copying CBA includes. Please copy tools\\cba to {} manually.".format(CBA)) return 7 - print("# CBA includes copied successfully to P:\\x\\cba.") + print("# CBA includes copied successfully to {}.".format(CBA)) return 0