Merge branch 'master' into german-merge

This commit is contained in:
KoffeinFlummi 2015-07-25 19:35:03 +02:00
commit 9805a8270a
475 changed files with 10100 additions and 2018 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ texHeaders.bin
*.swp
*.swo
*.biprivatekey
Thumbs.db

View File

@ -18,6 +18,7 @@ Kieran
NouberNou
PabstMirror <pabstmirror@gmail.com>
Ruthberg <ulteq@web.de>
SilentSpike <SilentSpike100@gmail.com>
tpM
ViperMaul
VKing <kauestad@gmail.com>
@ -37,7 +38,7 @@ Alganthe <alganthe@live.fr>
Anthariel <Contact@storm-simulation.com>
Asgar Serran <piechottaf@web.de>
Bla1337
BlackPixxel
BlackPixxel <blackpixxel96@gmail.com>
BlackQwar
Brakoviejo
Brisse <brisse@outlook.com>
@ -81,6 +82,7 @@ nikolauska <nikolauska1@gmail.com>
nomisum <nomisum@gmail.com>
OnkelDisMaster <onkeldismaster@gmail.com>
oscarmolinadev
PaxJaromeMalues <seemax1991@gmail.com>
pokertour
Professor <lukas.trneny@wo.cz>
rakowozz
@ -89,7 +91,6 @@ Raspu86
Riccardo Petricca <petriccarcc@gmail.com>
Robert Boklahánics <bokirobi@gmail.com>
ruPaladin <happyworm24@rambler.ru>
SilentSpike <SilentSpike100@gmail.com>
simon84 <badguy360th@gmail.com>
Sniperwolf572 <tenga6@gmail.com>
SzwedzikPL <szwedzikpl@gmail.com>

View File

@ -4,11 +4,11 @@
</p>
<p align="center">
<a href="https://github.com/acemod/ACE3/releases">
<img src="https://img.shields.io/badge/Version-3.0.1-blue.svg"
<img src="https://img.shields.io/badge/Version-3.1.1-blue.svg"
alt="ACE version">
</a>
<a href="https://github.com/acemod/ACE3/releases/download/v3.0.1/ace3_3.0.1.zip">
<img src="http://img.shields.io/badge/Download-40.9_MB-green.svg"
<a href="https://github.com/acemod/ACE3/releases/download/v3.1.1/ace3_3.1.1.zip">
<img src="http://img.shields.io/badge/Download-51.7_MB-green.svg"
alt="ACE download">
</a>
<a href="https://github.com/acemod/ACE3/issues">

Binary file not shown.

BIN
ace_parse_imagepath.dll Normal file

Binary file not shown.

View File

@ -31,6 +31,7 @@
<Spanish>Balística avanzada</Spanish>
<German>Erweiterte Ballistik</German>
<Czech>Pokročilá balistika</Czech>
<Portuguese>Balística avançada</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_enabled_DisplayName">
<English>Advanced Ballistics</English>
@ -38,6 +39,7 @@
<Spanish>Balística avanzada</Spanish>
<German>Erweiterte Ballistik</German>
<Czech>Pokročilá balistika</Czech>
<Portuguese>Balística avançada</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_enabled_Description">
<English>Enables advanced ballistics</English>
@ -45,6 +47,7 @@
<Spanish>Activa la balística avanzada</Spanish>
<German>Aktiviert die erweiterte Ballistik</German>
<Czech>Aktivuje pokročilou balistiku</Czech>
<Portuguese>Ativa balística avançada</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_DisplayName">
<English>Enabled For Snipers</English>
@ -52,6 +55,7 @@
<Polish>Akt. dla snajperów</Polish>
<German>Für Scharfschützen aktiviert</German>
<Czech>Povoleno pro odstřelovače</Czech>
<Portuguese>Ativar para caçadores</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_Description">
<English>Enables advanced ballistics for non local snipers (when using high power optics)</English>
@ -59,6 +63,7 @@
<Polish>Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki)</Polish>
<German>Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung)</German>
<Czech>Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku)</Czech>
<Portuguese>Ativa balística avançada para caçadores não locais (quando usando miras telescópicas)</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_DisplayName">
<English>Enabled For Group Members</English>
@ -66,6 +71,7 @@
<Polish>Akt. dla czł. grupy</Polish>
<German>Für Gruppenmitglieder aktiviert</German>
<Czech>Povoleno pro členy skupiny</Czech>
<Portuguese>Ativada para membros do grupo</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_Description">
<English>Enables advanced ballistics for non local group members</English>
@ -73,6 +79,7 @@
<Polish>Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy</Polish>
<German>Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder</German>
<Czech>Aktivuje pokročilou balistiku pro nelokální členy skupiny</Czech>
<Portuguese>Ativa balística avançada para membros de grupo não locais</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_DisplayName">
<English>Enabled For Everyone</English>
@ -80,6 +87,7 @@
<Polish>Akt. dla wszystkich</Polish>
<German>Für jeden aktiviert</German>
<Czech>Povoleno pro všechny</Czech>
<Portuguese>Ativada para todos</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_Description">
<English>Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer)</English>
@ -87,6 +95,7 @@
<Polish>Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia)</Polish>
<German>Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen)</German>
<Czech>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)</Czech>
<Portuguese>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)</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_DisplayName">
<English>Always Enabled For Group Members</English>
@ -94,6 +103,7 @@
<Spanish>Siempre activada para miembros de grupo</Spanish>
<German>Für Gruppenmitglieder immer aktiviert</German>
<Czech>Vždy povoleno pro členy skupiny</Czech>
<Portuguese>Sempre ativada para membros do grupo</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_Description">
<English>Always enables advanced ballistics when a group member fires</English>
@ -101,6 +111,7 @@
<Spanish>Activada la balística avanzada siempre cuando miembros de grupo disparan</Spanish>
<German>Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt</German>
<Czech>Aktivuje pokročilou balistiku pro členy skupiny</Czech>
<Portuguese>Sempre ative balística avançada quando um membro do grupo disparar</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_DisplayName">
<English>Disabled In FullAuto Mode</English>
@ -108,6 +119,7 @@
<Spanish>Desactivada en modo automático</Spanish>
<German>Beim vollautomatischen Feuern deaktiviert</German>
<Czech>Zakázáno v automatickém režimu střelby</Czech>
<Portuguese>Desabilitar no modo automático</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_Description">
<English>Disables the advanced ballistics during full auto fire</English>
@ -115,6 +127,7 @@
<Spanish>Desactivada la balística avanzada durante el fuego automático</Spanish>
<German>Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern</German>
<Czech>Zákáže pokročilou balistiku během střelby v režimu automat</Czech>
<Portuguese>Desabilitar a balística avançada durante fogo automático</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_DisplayName">
<English>Enable Ammo Temperature Simulation</English>
@ -122,6 +135,7 @@
<Spanish>Activar simulación de temperatura de munición</Spanish>
<German>Simulation der Munitionstemperatur aktivieren</German>
<Czech>Povolit simulaci teploty munice</Czech>
<Portuguese>Ativar simulação de temperatura de munição</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_Description">
<English>Muzzle velocity varies with ammo temperature</English>
@ -129,6 +143,7 @@
<Spanish>La velocidad de salida varía con la temperatura de la munición</Spanish>
<German>Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit</German>
<Czech>Úsťová rychlost je závislá na teplotě munice</Czech>
<Portuguese>A velocidade de saída varia com a temperatura da munição</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_DisplayName">
<English>Enable Barrel Length Simulation</English>
@ -136,6 +151,7 @@
<Spanish>Habilitar la simulación de longitud del cañón</Spanish>
<German>Simulation der Lauflänge aktivieren</German>
<Czech>Povolit simulaci délky hlavně</Czech>
<Portuguese>Ativar a simulação de comprimento do cano</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_Description">
<English>Muzzle velocity varies with barrel length</English>
@ -143,6 +159,7 @@
<Spanish>La velocidad de salidal varía con la longitud del cañón</Spanish>
<German>Lauflänge beeinflusst Mündungsgeschwindigkeit</German>
<Czech>Úsťová rychlost je závislá na délce hlavně</Czech>
<Portuguese>A velocidade de saída caria com o comprimento do cano</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_DisplayName">
<English>Enable Bullet Trace Effect</English>
@ -150,6 +167,7 @@
<Spanish>Activar el efecto trazador de la bala</Spanish>
<German>Geschossspureffekt aktivieren</German>
<Czech>Povolit efekt trasírek</Czech>
<Portuguese>Ativa efeito traçante de projétil</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_Description">
<English>Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)</English>
@ -157,6 +175,7 @@
<Spanish>Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica)</Spanish>
<German>Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung)</German>
<Czech>Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku)</Czech>
<Portuguese>Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas)</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_DisplayName">
<English>Simulation Interval</English>
@ -164,6 +183,7 @@
<Spanish>Intervalo de simulación</Spanish>
<German>Simulationsintervall</German>
<Czech>Interval simulace</Czech>
<Portuguese>Intervalo da simulação</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_Description">
<English>Defines the interval between every calculation step</English>
@ -171,6 +191,7 @@
<Spanish>Define el intervalo entre cada cálculo</Spanish>
<German>Legt das Intervall zwischen den Berechnungsschritten fest</German>
<Czech>Určuje interval mezi každým výpočtem</Czech>
<Portuguese>Define o intervalo entre cada cálculo</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_DisplayName">
<English>Simulation Radius</English>
@ -178,6 +199,7 @@
<Spanish>Radio de simulación</Spanish>
<German>Simulationsradius</German>
<Czech>Rozsah simulace</Czech>
<Portuguese>Raio de simulação</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_Description">
<English>Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles</English>
@ -185,11 +207,12 @@
<Spanish>Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles</Spanish>
<German>Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird</German>
<Czech>Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil</Czech>
<Portuguese>Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis</Portuguese>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_Description">
<English></English>
<Polish>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.</Polish>
<Czech>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.</Czech>
<Portuguese>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.</Portuguese>
</Key>
</Package>
</Project>

View File

@ -10,7 +10,7 @@ class CfgVehicles {
showDisabled = 0;
priority = 2;
icon = PATHTOF(UI\ATRAG_Icon.paa);
exceptions[] = {"notOnMap", "isNotInside"};
exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"};
};
};
};

View File

@ -1,7 +1,7 @@
["ACE3 Equipment", QGVAR(ATragMXDialogKey), localize LSTRING(ATragMXDialogKey),
{
// Conditions: canInteract
if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] 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
@ -21,7 +21,7 @@ _conditonCode = {
};
_toggleCode = {
// Conditions: canInteract
if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {};
if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {};
if (GVAR(active)) exitWith {
closeDialog 0;
};

View File

@ -3,14 +3,17 @@ class CfgMagazines {
class CA_Magazine;
class B_IR_Grenade: CA_Magazine {
ACE_Attachable = "B_IRStrobe";
model = QUOTE(PATHTOF(data\ace_IRStrobe.p3d));
};
class O_IR_Grenade: B_IR_Grenade {
ACE_Attachable = "O_IRStrobe";
model = QUOTE(PATHTOF(data\ace_IRStrobe.p3d));
};
class I_IR_Grenade: B_IR_Grenade {
ACE_Attachable = "I_IRStrobe";
model = QUOTE(PATHTOF(data\ace_IRStrobe.p3d));
};
class SmokeShell;

View File

@ -1,4 +1,3 @@
class CfgWeapons {
class ACE_ItemCore;
class InventoryItem_Base_F;
@ -9,11 +8,11 @@ class CfgWeapons {
scope = 2;
displayName = CSTRING(IrStrobe_Name);
descriptionShort = CSTRING(IrStrobe_Description);
model = "\A3\weapons_F\ammo\mag_univ.p3d";
model = QUOTE(PATHTOF(data\ace_IRStrobe.p3d));
picture = PATHTOF(UI\irstrobe_item.paa);
class ItemInfo: InventoryItem_Base_F {
mass = 1;
};
};
};
};

Binary file not shown.

View File

@ -0,0 +1,90 @@
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,1};
emmisive[] = {0,0,0,1};
specular[] = {0.99999976,0.99999976,0.99999976,1};
specularPower = 128;
PixelShaderID = "Super";
VertexShaderID = "Super";
class Stage1
{
texture = "z\ace\addons\attach\data\ace_IRStrobe_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 = "#(argb,8,8,3)color(0.5,0.5,0.5,0.5,DT)";
uvSource = "tex";
class uvTransform
{
aside[] = {1,0,0};
up[] = {0,1,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[] = {1,0,0};
up[] = {0,1,0};
dir[] = {0,0,0};
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,0};
pos[] = {0,0,0};
};
};
class Stage5
{
texture = "#(argb,8,8,3)color(0,0.1,0.1,0.1,SMDI)";
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(0.71,0.74)";
uvSource = "none";
};
class Stage7
{
texture = "a3\data_f\env_land_co.paa";
useWorldEnvMap = "true";
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};
};
};

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +1,7 @@
ace_lockbackpacks
ace_backpacks
=================
Introduces the ability to lock one's backpack.
Adds indication when someone else opens your backpack (soundeffect / camShake).
## Maintainers

View File

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

View File

@ -1598,6 +1598,7 @@
<Spanish>[ACE] Caja de suministros de munición</Spanish>
<German>[ACE] Munitionskiste</German>
<Czech>[ACE] Bedna s municí</Czech>
<Portuguese>[ACE] Caixa com suprimentos de munição</Portuguese>
</Key>
</Package>
</Project>

View File

@ -163,6 +163,7 @@
<Spanish>Hacer que la unidad se rinda</Spanish>
<German>Einheit kapitulieren lassen</German>
<Czech>Vzdávající se jednotka</Czech>
<Portuguese>Fazer unidade se render</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_ModuleSurrender_Description">
<English>Sync a unit to make them surrender.&lt;br /&gt;Source: ace_captives</English>
@ -170,6 +171,7 @@
<Spanish>Sincroniza una unidad para hacer que se rinda.&lt;br /&gt;Fuente: ace_captives</Spanish>
<German>Einheit synchronisieren, um sie kapitulieren zu lassen.&lt;br /&gt;Quelle: ace_captives</German>
<Czech>Synchronizuj s jednotkou, která se má vzdát.&lt;br /&gt;Zdroj: ace_captives</Czech>
<Portuguese>Sincroniza uma unidade para fazer com que ela se renda. &lt;br/&gt;Fonte: ace_captives</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_DisplayName">
<English>Captives Settings</English>
@ -177,6 +179,7 @@
<Spanish>Ajustes de prisioneros</Spanish>
<Czech>Nastavení zajatce</Czech>
<German>Gefangenen-Einstellungen</German>
<Portuguese>Ajustes de prisioneiros</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_Description">
<English>Controls settings for surrender and cable ties</English>
@ -184,6 +187,7 @@
<Spanish>Ajustes de control para rendición y precintos</Spanish>
<Czech>Toto kontroluje nastavení kapitulace a pout</Czech>
<German>Einstellungen zur Kapitulation und Kabelbindern</German>
<Portuguese>Controla as configurações de rendição e abraçadeiras</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_handcuffSide_name">
<English>Can handcuff own side</English>
@ -191,6 +195,7 @@
<Spanish>Se puede esposar el bando propio</Spanish>
<Czech>Může spoutat spolubojovníky</Czech>
<German>Kann Teamkollegen fesseln</German>
<Portuguese>Pode algemar o próprio lado</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_handcuffSide_description">
<English>Can players cabletie units on their own side</English>
@ -198,6 +203,7 @@
<Spanish>Pueden los jugadores esposar unidades en su propio bando</Spanish>
<Czech>Mohou hráči spoutat jednotky na své straně</Czech>
<German>Können Spieler eigene Einheiten fesseln</German>
<Portuguese>Os jogadores podem algemar unidades do seu lado</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_allowSurrender_name">
<English>Allow surrendering</English>
@ -205,6 +211,7 @@
<Spanish>Permitir rendición</Spanish>
<Czech>Povolit vzdávání</Czech>
<German>Kapitulation erlauben</German>
<Portuguese>Permite rendição</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_allowSurrender_description">
<English>Players can surrender after holstering their weapon</English>
@ -212,6 +219,7 @@
<Spanish>Los jugadores pueden rendirse después de enfundar su arma</Spanish>
<Czech>Hráč se může vzdát poté, co si skryje zbraň</Czech>
<German>Spieler können kapitulieren, nachdem sie ihre Waffe geholstert haben</German>
<Portuguese>Jogadores podem se render depois de guardar sua arma</Portuguese>
</Key>
</Package>
</Project>
</Project>

View File

@ -1,112 +1,109 @@
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;
};
};
};*/
/*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 <DefaultItems.hpp>
// += needs a non inherited entry in that class, otherwise it simply overwrites
//#include <DefaultItems.hpp>
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;
};
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 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";
class values {
default = "[]";
class ModuleDescription: ModuleDescription {
description = CSTRING(CheckPBO_Description);
};
};
};
class ModuleDescription: ModuleDescription {
description = CSTRING(CheckPBO_Description);
};
};
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 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 = CSTRING(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 = CSTRING(ACETeam);
displayName = CSTRING(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 {
@ -115,10 +112,8 @@ class CfgVehicles {
displayName = CSTRING(bananaDisplayName);
author = CSTRING(ACETeam);
vehicleClass = "Items";
class TransportItems
{
class ACE_banana
{
class TransportItems {
class ACE_banana {
name = "ACE_banana";
count = 1;
};

View File

@ -6,7 +6,7 @@
//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;
@ -56,6 +56,10 @@
["setFuel", {(_this select 0) setFuel (_this select 1)}] call FUNC(addEventhandler);
["setSpeaker", {(_this select 0) setSpeaker (_this select 1)}] call FUNC(addEventhandler);
if (isServer) then {
["hideObjectGlobal", {(_this select 0) hideObjectGlobal (_this select 1)}] call FUNC(addEventHandler);
};
// hack to get PFH to work in briefing
[QGVAR(onBriefingPFH), "onEachFrame", {
if (ACE_time > 0) exitWith {
@ -140,6 +144,15 @@ call FUNC(checkFiles);
}, 0, [false]] call cba_fnc_addPerFrameHandler;
["SettingsInitialized", {
[
GVAR(checkPBOsAction),
GVAR(checkPBOsCheckAll),
call compile GVAR(checkPBOsWhitelist)
] call FUNC(checkPBOs)
}] call FUNC(addEventHandler);
/***************************************************************/
/***************************************************************/
/***************************************************************/
@ -308,14 +321,6 @@ if(isMultiplayer && { ACE_time > 0 || isNull player } ) then {
}, 0, []] call cba_fnc_addPerFrameHandler;
};
["SettingsInitialized", {
[
GVAR(checkPBOsAction),
GVAR(checkPBOsCheckAll),
call compile GVAR(checkPBOsWhitelist)
] call FUNC(checkPBOs)
}] call FUNC(addEventHandler);
//Device Handler:
GVAR(deviceKeyHandlingArray) = [];
GVAR(deviceKeyCurrentIndex) = -1;

View File

@ -11,7 +11,6 @@ PREP(addCanInteractWithCondition);
PREP(addLineToDebugDraw);
PREP(addSetting);
PREP(addToInventory);
PREP(adminKick);
PREP(ambientBrightness);
PREP(applyForceWalkStatus);
PREP(ASLToPosition);
@ -103,6 +102,7 @@ PREP(goKneeling);
PREP(hadamardProduct);
PREP(hasItem);
PREP(hasMagazine);
PREP(hideUnit);
PREP(inheritsFrom);
PREP(insertionSort);
PREP(interpolateFromArray);
@ -180,6 +180,7 @@ PREP(toBin);
PREP(toBitmask);
PREP(toHex);
PREP(toNumber);
PREP(unhideUnit);
PREP(uniqueElementsOnly);
PREP(unloadPerson);
PREP(unloadPersonLocal);

View File

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

View File

@ -56,20 +56,23 @@ _addons = [_addons, {_this find "ace_" == 0}] call FUNC(filter);
} forEach getArray (configFile >> "ACE_Extensions" >> "extensions");
///////////////
// check server version
// check server version/addons
///////////////
if (isMultiplayer) then {
if (isServer) then {
// send servers version of ACE to all clients
GVAR(ServerVersion) = _version;
GVAR(ServerAddons) = _addons;
publicVariable QGVAR(ServerVersion);
publicVariable QGVAR(ServerAddons);
} else {
// clients have to wait for the variable
// clients have to wait for the variables
[{
if (isNil QGVAR(ServerVersion)) exitWith {};
if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith {};
private "_version";
_version = _this select 0;
private ["_version","_addons"];
_version = (_this select 0) select 0;
_addons = (_this select 0) select 1;
if (_version != GVAR(ServerVersion)) then {
private "_errorMsg";
@ -82,7 +85,18 @@ if (isMultiplayer) then {
};
};
_addons = _addons - GVAR(ServerAddons);
if !(_addons isEqualTo []) then {
_errorMsg = format ["Client/Server Addon Mismatch. Client has extra addons: %1.",_addons];
diag_log text format ["[ACE] ERROR: %1", _errorMsg];
if (hasInterface) then {diag_log str "1";
["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage);
};
};
[_this select 1] call CBA_fnc_removePerFrameHandler;
}, 1, _version] call CBA_fnc_addPerFrameHandler;
}, 1, [_version,_addons]] call CBA_fnc_addPerFrameHandler;
};
};

View File

@ -8,8 +8,8 @@
* 0: Warn once
* 1: Warn permanently
* 2: Kick
* 1: Check all PBOs? <BOOL> (Optional - default: "[]")
* 2: Whitelist <STRING> (Optinal - default: false)
* 1: Check all PBOs? <BOOL> (Optional - default: false)
* 2: Whitelist <STRING> (Optinal - default: "[]")
*
* Return value:
* None
@ -67,24 +67,26 @@ if (!isServer) then {
//[_error, "{systemChat _this}"] call FUNC(execRemoteFnc);
diag_log text _error;
_text = composeText [lineBreak, parseText format ["<t align='center'>%1</t>", _text]];
if (_mode < 2) then {
_text = composeText [lineBreak, parseText format ["<t align='center'>%1</t>", _text]];
_rscLayer = "ACE_RscErrorHint" call BIS_fnc_rscLayer;
_rscLayer cutRsc ["ACE_RscErrorHint", "PLAIN", 0, true];
_rscLayer = "ACE_RscErrorHint" call BIS_fnc_rscLayer;
_rscLayer cutRsc ["ACE_RscErrorHint", "PLAIN", 0, true];
disableSerialization;
_ctrlHint = uiNamespace getVariable "ACE_ctrlErrorHint";
_ctrlHint ctrlSetStructuredText _text;
disableSerialization;
_ctrlHint = uiNamespace getVariable "ACE_ctrlErrorHint";
_ctrlHint ctrlSetStructuredText _text;
if (_mode == 0) then {
sleep 10;
_rscLayer cutFadeOut 0.2;
if (_mode == 0) then {
sleep 10;
_rscLayer cutFadeOut 0.2;
};
};
if (_mode == 2) then {
sleep 10;
waitUntil {alive player};
[player] call FUNC(adminKick);
waitUntil {alive player}; // To be able to show list if using checkAll
_text = composeText [parseText format ["<t align='center'>%1</t>", _text]];
["[ACE] ERROR", _text, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage);
};
};
};

View File

@ -0,0 +1,34 @@
/*
* Author: SilentSpike (based on muteUnit)
* Globally hides a unit. This allows the handling of more than one reason to hide an object globally.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Reason to hide the unit <STRING>
*
* Return Value:
* nil
*
* Example:
* [ACE_Player, "SpectatorMode"] call ace_common_fnc_hideUnit
*
* Public: No
*/
#include "script_component.hpp"
PARAMS_2(_unit,_reason);
if (isNull _unit) exitWith {};
private "_setHiddenReasons";
_setHiddenReasons = _unit getVariable [QGVAR(setHiddenReasons), []];
if !(_reason in _setHiddenReasons) then {
_setHiddenReasons pushBack _reason;
_unit setVariable [QGVAR(setHiddenReasons), _setHiddenReasons, true];
};
//if !(isObjectHidden _unit) then { (Uncomment when isObjectHidden hits stable branch)
["hideObjectGlobal",[_unit,true]] call FUNC(serverEvent);
//};

View File

@ -3,7 +3,9 @@
* Initializes the check-PBOs module.
*
* Arguments:
* Whatever the module provides. (I dunno.)
* 0: The module logic <LOGIC>
* 1: units <ARRAY>
* 2: activated <BOOL>
*
* Return Value:
* None

View File

@ -41,11 +41,11 @@ if ((typeName _value) != (_settingData select 1)) then {
_failed = true;
if ((_settingData select 1) == "BOOL" and (typeName _value) == "SCALAR") then {
// If value is not 0 or 1 consider it invalid and don't set anything
if (_value == 0) then {
if (_value isEqualTo 0) then {
_value = false;
_failed = false;
};
if (_value == 1) then {
if (_value isEqualTo 1) then {
_value = true;
_failed = false;
};

View File

@ -0,0 +1,34 @@
/*
* Author: SilentSpike (based on unmuteUnit)
* Globally unhides a unit. Only unhides if the last reason was removed.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Reason to unhide the unit <STRING>
*
* Return Value:
* nil
*
* Example:
* [ACE_Player, "SpectatorMode"] call ace_common_fnc_unhideUnit
*
* Public: No
*/
#include "script_component.hpp"
PARAMS_2(_unit,_reason);
if (isNull _unit) exitWith {};
private "_setHiddenReasons";
_setHiddenReasons = _unit getVariable [QGVAR(setHiddenReasons), []];
if (_reason in _setHiddenReasons) then {
_setHiddenReasons deleteAt (_setHiddenReasons find _reason);
_unit setVariable [QGVAR(setHiddenReasons), _setHiddenReasons, true];
};
if (_setHiddenReasons isEqualTo []) then {
["hideObjectGlobal",[_unit,false]] call FUNC(serverEvent);
};

View File

@ -476,6 +476,7 @@
<Spanish>Comprobar PBOs</Spanish>
<German>Überprüfe PBOs</German>
<Czech>Zkontrolovat PBO</Czech>
<Portuguese>Verificar PBOs</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Description">
<English></English>
@ -483,6 +484,7 @@
<Spanish>Este módulo verifica la integridad de los addons con los que iniciamos el simulador</Spanish>
<German>Dieses Modul überprüft ob jeder Spieler die richtigen PBO-Dateien hat.</German>
<Czech>Zjistit addon který je v souladu se serverem</Czech>
<Portuguese>Este módulo verifica a integridade dos addons quando iniciamos a simulação</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Action_DisplayName">
<English>Action</English>
@ -490,6 +492,7 @@
<Spanish>Acción</Spanish>
<German>Aktion</German>
<Czech>Akce</Czech>
<Portuguese>Ação</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Action_Description">
<English>What to do with people who do not have the right PBOs?</English>
@ -497,6 +500,7 @@
<Spanish>¿Qué hacer con la gente que no tiene correctamente los PBOs?</Spanish>
<German>Was soll mit Leuten passieren, die nicht die richtigen PBOs haben?</German>
<Czech>Co udělat s lidmi, co nemají správné addony?</Czech>
<Portuguese>O que fazer com pessoas que não tem os PBOs corretos?</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Action_WarnOnce">
<English>Warn once</English>
@ -504,6 +508,7 @@
<Spanish>Avisar una vez</Spanish>
<German>Einmal verwarnen</German>
<Czech>Upozornit jednou</Czech>
<Portuguese>Avisar uma vez</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Action_WarnPerm">
<English>Warn (permanent)</English>
@ -511,6 +516,7 @@
<Spanish>Avisar (permanente)</Spanish>
<German>Immer verwarnen</German>
<Czech>Upozornit (permanentně)</Czech>
<Portuguese>Avisar (permanente)</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Action_Kick">
<English>Kick</English>
@ -518,6 +524,7 @@
<Spanish>Expulsar</Spanish>
<German>Kicken</German>
<Czech>Vyhodit</Czech>
<Portuguese>Chutar</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_CheckAll_DisplayName">
<English>Check all addons</English>
@ -525,6 +532,7 @@
<Spanish>Comprobar todos los addons</Spanish>
<German>Alle Addons überprüfen</German>
<Czech>Zkontrolovat všechny addony</Czech>
<Portuguese>Verificar todos addons</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_CheckAll_Description">
<English>Check all addons instead of only those of ACE?</English>
@ -532,6 +540,7 @@
<Spanish>Comprobar todos los addons en vez de solo los del ACE</Spanish>
<German>Alle Addons anstatt nur ACE überprüfen?</German>
<Czech>Zkontrolovat všechny addony namísto jen těch od ACE?</Czech>
<Portuguese>Verificar todos addons invés de só os do ACE?</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Whitelist_DisplayName">
<English>Whitelist</English>
@ -539,6 +548,7 @@
<Spanish>Lista blanca</Spanish>
<German>Whitelist</German>
<Czech>Seznam povolených</Czech>
<Portuguese>Lista branca</Portuguese>
</Key>
<Key ID="STR_ACE_Common_CheckPBO_Whitelist_Description">
<English>What addons are allowed regardless?</English>
@ -546,6 +556,7 @@
<Spanish>Qué addons están permitidos igualmente</Spanish>
<German>Welche Addons werden dennoch erlaubt?</German>
<Czech>Jaké addony jsou povoleny?</Czech>
<Portuguese>Quais addons são permitidos de qualquer maneira?</Portuguese>
</Key>
<Key ID="STR_ACE_Common_LSDVehicles_DisplayName">
<English>LSD Vehicles</English>
@ -553,6 +564,7 @@
<Spanish>Vehículos LSD</Spanish>
<German>LSD-Fahrzeuge</German>
<Czech>LSD vozidla</Czech>
<Portuguese>Veículos LSD</Portuguese>
</Key>
<Key ID="STR_ACE_Common_LSDVehicles_Description">
<English>Adds LSD effect to synchronized vehicle</English>
@ -560,21 +572,31 @@
<Spanish>Añade el efecto LSD al vehículo sincronizado</Spanish>
<German>Fügt einen LSD-Effekt zum synchronisierten Fahrzeug hinzu</German>
<Czech>Přidá LSD efekt pro synchronizované vozidla</Czech>
<Portuguese>Adiciona efeito LSD ao veículo sincronizado</Portuguese>
</Key>
<Key ID="STR_ACE_Common_toggleHandheldDevice">
<English>Toggle Handheld Device</English>
<Spanish>Seleccionar dispositivo de mano</Spanish>
<German>Handheld aufrufen</German>
<Portuguese>Ativa dispositivo de mão</Portuguese>
<Polish>Przełącz urządzenie podręczne</Polish>
<Czech>Přepnout ruční zařízení</Czech>
</Key>
<Key ID="STR_ACE_Common_closeHandheldDevice">
<English>Close Handheld Device</English>
<Spanish>Cerrar dispositivo de mano</Spanish>
<German>Handheld schließen</German>
<Portuguese>Fecha dispositivo de mão</Portuguese>
<Polish>Zamknij urządzenie podręczne</Polish>
<Czech>Zavřít ruční zařízení</Czech>
</Key>
<Key ID="STR_ACE_Common_cycleHandheldDevices">
<English>Cycle Handheld Devices</English>
<Spanish>Cambiar dispositivos de mano</Spanish>
<German>Handheld wechseln</German>
<Portuguese>Troca dispositivos de mão</Portuguese>
<Polish>Następne urządzenie podręczne</Polish>
<Czech>Procházet ruční zařízení</Czech>
</Key>
</Package>
</Project>
</Project>

View File

@ -6,44 +6,48 @@
<German>NATO-Draht</German>
<Russian>Проволочная спираль</Russian>
<Polish>Drut kolczasty</Polish>
<Spanish>Concertina wire</Spanish>
<Spanish>Alambre de espino</Spanish>
<French>Concertina wire</French>
<Czech>Ostnatý drát</Czech>
<Italian>Concertina wire</Italian>
<Hungarian>Concertina wire</Hungarian>
<Portuguese>Arame farpado</Portuguese>
</Key>
<Key ID="STR_ACE_CONCERTINA_WIRECOIL">
<English>Concertina Wire Coil</English>
<German>NATO-Draht Rolle</German>
<Russian>Проволочная спираль (моток)</Russian>
<Polish>Zwój drutu kolczastego</Polish>
<Spanish>Concertina wire coil</Spanish>
<Spanish>Bobina de alambre de espino</Spanish>
<French>Concertina wire coil</French>
<Czech>Smyčka ostnatého drátu</Czech>
<Italian>Concertina wire coil</Italian>
<Hungarian>Concertina wire coil</Hungarian>
<Portuguese>Bobina de arame farpado</Portuguese>
</Key>
<Key ID="STR_ACE_UNROLLWIRE">
<English>Dismount Concertina Wire</English>
<German>NATO-Draht abbauen</German>
<Russian>Демонтировать проволочную спираль</Russian>
<Polish>Zwiń drut kolczasty</Polish>
<Spanish>Dismount Concertina wire</Spanish>
<Spanish>Desmontar alambre de espino</Spanish>
<French>Dismount Concertina wire</French>
<Czech>Svinout ostnatý drát</Czech>
<Italian>Dismount Concertina wire</Italian>
<Hungarian>Dismount Concertina wire</Hungarian>
<Portuguese>Desmontar arame farpado</Portuguese>
</Key>
<Key ID="STR_ACE_ROLLWIRE">
<English>Deploy Concertina Wire</English>
<German>NATO-Draht verlegen</German>
<Russian>Монтировать проволочную спираль</Russian>
<Polish>Rozwiń drut kolczasty</Polish>
<Spanish>Deploy Concertina wire</Spanish>
<Spanish>Desplegar alambre de espino</Spanish>
<French>Deploy Concertina wire</French>
<Czech>Rozvinout ostnatý drát</Czech>
<Italian>Deploy Concertina wire</Italian>
<Hungarian>Deploy Concertina wire</Hungarian>
<Portuguese>Colocar arame farpado</Portuguese>
</Key>
</Package>
</Project>

View File

@ -10,7 +10,7 @@ class CfgVehicles {
showDisabled = 0;
priority = 0.1;
icon = QUOTE(PATHTOF(UI\DAGR_Icon.paa));
exceptions[] = {"isNotInside"};
exceptions[] = {"isNotInside", "isNotSitting"};
class GVAR(toggle) {
displayName = "Toggle DAGR";
condition = QUOTE([ARR_2(_player,'ACE_DAGR')] call EFUNC(common,hasItem));
@ -18,7 +18,7 @@ class CfgVehicles {
showDisabled = 0;
priority = 0.2;
icon = QUOTE(PATHTOF(UI\DAGR_Icon.paa));
exceptions[] = {"notOnMap", "isNotInside"};
exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"};
};
};
};

View File

@ -7,11 +7,11 @@ class CfgWeapons {
author[] = {$STR_ACE_Common_ACETeam, "Ruthberg"};
scope = 2;
displayName = "DAGR";
model = QUOTE(PATHTOF(data\DAGR.p3d));
descriptionShort = "";
picture = PATHTOF(UI\DAGR_Icon.paa);
icon = "iconObject_circle";
mapSize = 0.034;
class ItemInfo: InventoryItem_Base_F {
mass = 10;
};

BIN
addons/dagr/data/DAGR.p3d Normal file

Binary file not shown.

View File

@ -0,0 +1,82 @@
class StageTI
{
texture="a3\data_f\default_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.050000008,0.050000008,0.050000008,1};
specularPower=40;
PixelShaderID="Super";
VertexShaderID="Super";
class Stage1
{
texture="z\ace\addons\dagr\data\DAGR_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="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)";
uvSource="tex";
class uvTransform
{
aside[]={0,9,0};
up[]={4.5,0,0};
dir[]={0,0,0};
pos[]={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(1,1,1,1,AS)";
uvSource="tex";
class uvTransform
{
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage5
{
texture="#(argb,8,8,3)color(1,1,1,1,SMDI)";
uvSource="tex";
class uvTransform
{
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage6
{
texture="#(ai,64,128,1)fresnel(0.4,0.2)";
uvSource="none";
};
class Stage7
{
texture="a3\data_f\env_land_co.paa";
uvSource="none";
};

Binary file not shown.

Binary file not shown.

View File

@ -2,7 +2,7 @@
["ACE3 Equipment", QGVAR(MenuKey), "Configure DAGR",
{
// Conditions: canInteract
if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false};
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
@ -19,7 +19,7 @@
["ACE3 Equipment", QGVAR(ToggleKey), "Toggle DAGR",
{
// Conditions: canInteract
if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false};
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

View File

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

View File

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

View File

@ -96,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 = CSTRING(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 = CSTRING(SLAME_Magnetic);
displayName = CSTRING(PressurePlate);
digDistance = 0;
ammo = "IEDUrbanSmall_Remote_Ammo";
ammo = "IEDUrbanSmall_Range_Ammo";
pitch = 0;
};
};
@ -142,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";
};
};
};

View File

@ -20,6 +20,12 @@ class ACE_ModuleExplosive: ACE_Module {
typeName = "BOOL";
defaultValue = 1;
};
class ExplodeOnDefuse {
displayName = "$STR_ACE_Explosive_ExplodeOnDefuse_DisplayName";
description = "$STR_ACE_Explosive_ExplodeOnDefuse_Description";
typeName = "BOOL";
defaultValue = 1;
};
};
class ModuleDescription {
description = CSTRING(Module_Description);

View File

@ -6,7 +6,7 @@ class CfgVehicles {
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);
@ -17,7 +17,7 @@ class CfgVehicles {
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;
@ -38,7 +38,7 @@ class CfgVehicles {
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;
@ -103,7 +103,7 @@ class CfgVehicles {
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));
};
@ -114,7 +114,7 @@ class CfgVehicles {
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";
};

View File

@ -12,7 +12,7 @@ class CfgWeapons {
displayName = CSTRING(clacker_displayName);
descriptionShort = CSTRING(clacker_description);
picture = PATHTOF(Data\UI\Clacker.paa);
model = "\A3\weapons_F\ammo\mag_univ.p3d";
model = QUOTE(PATHTOF(data\ace_m57.p3d));
ACE_Range = 250;
ACE_Detonator = 1;

Binary file not shown.

View File

@ -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 = 3b0;
PixelShaderID = "Super";
VertexShaderID = "Super";
class Stage1 {
texture="#(rgb,1,1,1)color(0.5,0.5,1,1)";
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};
};
};

Binary file not shown.

View File

@ -17,7 +17,7 @@
#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);
};

View File

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

View File

@ -511,6 +511,7 @@
<Spanish>Sistema de explosivos</Spanish>
<German>Sprengstoffsystem</German>
<Czech>Systém výbušnin</Czech>
<Portuguese>Sistema de explosivos</Portuguese>
</Key>
<Key ID="STR_ACE_Explosives_RequireSpecialist_DisplayName">
<English>Require specialists?</English>
@ -518,6 +519,7 @@
<Spanish>¿Requiere especialista?</Spanish>
<German>Benötigt Sprengstoffexperten?</German>
<Czech>Vyžadovat specialistu?</Czech>
<Portuguese>Requer especialista?</Portuguese>
</Key>
<Key ID="STR_ACE_Explosives_RequireSpecialist_Description">
<English>Require explosive specialists to disable explosives? Default: No</English>
@ -525,6 +527,7 @@
<Spanish>Requiere especialista en explosivos para desactivar explosivos?. Por defecto: No</Spanish>
<German>Benötige Sprengstoffexperte um Sprengladungen zu entschärfen? Standard: Nein</German>
<Czech>Vyžadovat specialistu na zneškodnění výbušniny? Výchozí: Ne</Czech>
<Portuguese>Requer especialista em explosivos para desativar explosivos? Padrão: Não</Portuguese>
</Key>
<Key ID="STR_ACE_Explosives_PunishNonSpecialists_DisplayName">
<English>Punish non-specialists?</English>
@ -532,6 +535,7 @@
<Spanish>¿Penalizar a los no especialistas?</Spanish>
<German>Bestrafe Nicht-Sprengstoffexperten?</German>
<Czech>Potrestat, pokud není specialista?</Czech>
<Portuguese>Punir não especialistas?</Portuguese>
</Key>
<Key ID="STR_ACE_Explosives_PunishNonSpecialists_Description">
<English>Increase the time it takes to complete actions for non-specialists? Default: Yes</English>
@ -539,12 +543,27 @@
<Spanish>Aumenta el tiempo que lleva completar acciones para los no especialstas?. Por defecto: Si</Spanish>
<German>Entschärfungszeit für Nicht-Sprengstoffexperten erhöhen? Standard: Ja</German>
<Czech>Zvýšit čas potřebný k dokončení akce pokud není specialista? Výchozí: Ano</Czech>
<Portuguese>Aumentar o tempo necessário para completar ações por não especialistas? Padrão: Sim</Portuguese>
</Key>
<Key ID="STR_ACE_Explosives_ExplodeOnDefuse_DisplayName">
<English>Explode on defusal?</English>
<Portuguese>Explosão no desarmamento?</Portuguese>
<Polish>Eksplozja przy rozbrajaniu?</Polish>
<Czech>Explodovat při zneškodňování?</Czech>
<Spanish>Explotar al desactivar?</Spanish>
</Key>
<Key ID="STR_ACE_Explosives_ExplodeOnDefuse_Description">
<English>Enable certain explosives to explode on defusal? Default: Yes</English>
<Portuguese>Ativa certos explosivos para detonar no desarmamento? Padrão: Sim</Portuguese>
<Polish>Spraw, aby niektóre ładunki wybuchowe eksplodowały przy próbie ich rozbrojenia? Domyślnie:Tak</Polish>
<Czech>Umožnit u některých výbušnin explozi při pokusu je zneškodnit? Výchozí: Ano</Czech>
<Spanish>¿Habilitar ciertos explosivos para estallar al desactivar? Por defecto: Sí</Spanish>
</Key>
<Key ID="STR_ACE_Explosives_Module_Description">
<English></English>
<Polish>Moduł ten pozwala dostosować opcje związane z ładunkami wybuchowymi, ich podkładaniem oraz rozbrajaniem.</Polish>
<German>Dieses Modul erlaubt die Einstellungen für Sprengstoffe zu verändern.</German>
<Czech>Tento modul umoňuje přizpůsobit nastavení týkajících se výbušnin.</Czech>
<Portuguese>Este módulo permite personalizar as definições relacionadas a explosivos.</Portuguese>
</Key>
</Package>
</Project>

View File

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

View File

@ -7,6 +7,7 @@
<Spanish>Simulación de fragmentación</Spanish>
<German>Splittersimulation</German>
<Czech>Simulace fragmentace</Czech>
<Portuguese>Simulação de fragmentação</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_EnableFrag_Desc">
<English>Enable the ACE Fragmentation Simulation</English>
@ -14,6 +15,7 @@
<Polish>Aktywuje symulację fragmentacji ACE</Polish>
<German>Aktiviere die ACE-Splittersimulation</German>
<Czech>Povolit ACE simulaci fragmentace</Czech>
<Portuguese>Ativa a simulação de fragmentação do ACE</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_EnableSpall">
<English>Spalling Simulation</English>
@ -21,6 +23,7 @@
<Polish>Symulacja odprysków</Polish>
<German>Explosionssimulation</German>
<Czech>Simulace úlomků</Czech>
<Portuguese>Simulação de estilhaços</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_EnableSpall_Desc">
<English>Enable the ACE Spalling Simulation</English>
@ -28,6 +31,7 @@
<Polish>Aktywuje symulację odprysków ACE</Polish>
<German>Aktiviere ACE-Explosionssimulation</German>
<Czech>Povolit ACE simulaci úlomků</Czech>
<Portuguese>Ativa a simulação de estilhaços do ACE</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_MaxTrack">
<English>Maximum Projectiles Tracked</English>
@ -35,6 +39,7 @@
<Polish>Maks. liczba śledzonych pocisków</Polish>
<German>Maximalzahl der verfolgten Projektile</German>
<Czech>Maximální počet sledovaných projektilů</Czech>
<Portuguese>Máximo de projéteis rastreados</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_MaxTrack_Desc">
<English>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 ( &gt;200 rounds in the air at once)</English>
@ -42,6 +47,7 @@
<Polish>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).</Polish>
<German>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 (&gt;200 Objekte gleichzeitig in der Luft)</German>
<Czech>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ů ( &gt;200 nábojů najednou ve vzduchu)</Czech>
<Portuguese>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 (&gt; 200 projéteis no ar ao mesmo tempo)</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_MaxTrackPerFrame">
<English>Maximum Projectiles Per Frame</English>
@ -49,6 +55,7 @@
<German>Maximale Anzahl an Projektilen pro Frame</German>
<Polish>Maks. liczba pocisków na klatkę</Polish>
<Czech>Maximální počet projektilů ze jeden snímek</Czech>
<Portuguese>Projéteis máximos por quadro</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_MaxTrackPerFrame_Desc">
<English>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.</English>
@ -56,6 +63,7 @@
<German>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.</German>
<Spanish>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.</Spanish>
<Czech>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.</Czech>
<Portuguese>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.</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_EnableDebugTrace">
<English>(SP Only) Frag/Spall Debug Tracing</English>
@ -63,6 +71,7 @@
<Polish>(Tylko SP) Wizualny debug odł./odpr.</Polish>
<Czech>(Pouze SP) Debug sledování Frag/Úlomků</Czech>
<German>(nur SP) Splitter-/Explosions-Debug-Verfolgung</German>
<Portuguese>(Somente SP) Depuração de fragmentação e estilhaços traçantes</Portuguese>
</Key>
<Key ID="STR_ACE_Frag_EnableDebugTrace_Desc">
<English>(SP Only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only.</English>
@ -70,6 +79,7 @@
<Polish>(Tylko SP) Wymaga restartu misji/edytora. Aktywuje wizualne śledzenie odłamków oraz odprysków w trybie gry Single Player.</Polish>
<German>(nur SP) Splitter-/Explosions-Debugging</German>
<Czech>(Pouze SP) Vyžaduje restart mise/editoru. Aktivuje vizuální stopování fragmentace a úlomů pouze v režimu jednoho hráče.</Czech>
<Portuguese>(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.</Portuguese>
</Key>
</Package>
</Project>
</Project>

View File

@ -6,7 +6,7 @@ class CfgVehicles {
class ACE_PutInEarplugs {
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;
@ -16,7 +16,7 @@ class CfgVehicles {
class ACE_RemoveEarplugs {
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;

View File

@ -5,11 +5,47 @@ class CfgWeapons {
class ACE_EarPlugs: ACE_ItemCore {
displayName = CSTRING(EarPlugs_Name);
descriptionShort = CSTRING(EarPlugs_Description);
model = PATHTOF(ACE_earplugs.p3d);
model = QUOTE(PATHTOF(data\ace_earplugs.p3d));
picture = PATHTOF(UI\ACE_earplugs_x_ca.paa);
scope = 2;
class ItemInfo: InventoryItem_Base_F {
mass = 1;
};
};
class H_HelmetB;
class H_HelmetCrew_B: H_HelmetB {
GVAR(protection) = 1;
GVAR(lowerVolume) = 0.80;
};
class H_HelmetCrew_0: H_HelmetCrew_B {};
class H_HelmetCrew_I: H_HelmetCrew_B {};
class H_CrewHelmetHeli_B: H_HelmetB {
GVAR(protection) = 0.75;
GVAR(lowerVolume) = 0.70;
};
class H_CrewHelmetHeli_O: H_CrewHelmetHeli_B {};
class H_CrewHelmetHeli_I: H_CrewHelmetHeli_B {};
class H_PilotHelmetHeli_B: H_HelmetB {
GVAR(protection) = 0.75;
GVAR(lowerVolume) = 0.70;
};
class H_PilotHelmetHeli_O: H_PilotHelmetHeli_B {};
class H_PilotHelmetHeli_I: H_PilotHelmetHeli_B {};
class H_PilotHelmetFighter_B: H_HelmetB {
GVAR(protection) = 1;
GVAR(lowerVolume) = 0.80;
};
class H_PilotHelmetFighter_O: H_PilotHelmetFighter_B {};
class H_PilotHelmetFighter_I: H_PilotHelmetFighter_B {};
class H_Cap_headphones: H_HelmetB {
GVAR(protection) = 0.5;
GVAR(lowerVolume) = 0.60;
};
class H_Cap_marshal: H_Cap_headphones {};
};

Binary file not shown.

Binary file not shown.

View File

@ -5,7 +5,7 @@ class CfgPatches {
units[] = {};
weapons[] = {"ACE_EarPlugs"};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_interaction"};
requiredAddons[] = {"ace_interaction", "A3_Characters_F", "A3_Characters_F_Kart"};
author[] = {"KoffeinFlummi", "esteldunedain", "HopeJ", "commy2", "Rocko", "Rommel", "Ruthberg"};
authorUrl = "https://github.com/KoffeinFlummi/";
VERSION_CONFIG;

Binary file not shown.

Binary file not shown.

View File

@ -15,9 +15,12 @@
*/
#include "script_component.hpp"
private ["_unit", "_launcher"];
PARAMS_1(_unit);
_unit = _this select 0;
// Exit if hearing is disabled or soldier has earplugs already in (persistence scenarios)
if (!GVAR(enableCombatDeafness) || {[_unit] call FUNC(hasEarPlugsIn)}) exitWith {};
private ["_launcher"];
// add earplugs if the soldier has a rocket launcher
_launcher = secondaryWeapon _unit;

View File

@ -27,6 +27,15 @@ if (_unit getVariable ["ACE_hasEarPlugsin", false]) then {
_strength = _strength / 4;
};
//headgear hearing protection
if(headgear _unit != "") then {
private ["_protection"];
_protection = (getNumber (configFile >> "CfgWeapons" >> (headgear _unit) >> QGVAR(protection))) min 1;
if(_protection > 0) then {
_strength = _strength * (1 - _protection);
};
};
_unit setVariable [QGVAR(dv), (_unit getVariable [QGVAR(dv), 0]) + _strength];
if (GVAR(earRingingPFH) != -1) exitWith {};
@ -35,8 +44,8 @@ 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 {
if (!alive _unit || _prior <= 0 || GVAR(DisableEarRinging)) exitWith {
_unit setVariable [QGVAR(dv), 0];
_unit setVariable [QGVAR(prior), 0];
GVAR(beep) = false;
@ -47,7 +56,7 @@ GVAR(earRingingPFH) = [{
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;
@ -58,16 +67,16 @@ GVAR(earRingingPFH) = [{
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;
@ -77,7 +86,7 @@ GVAR(earRingingPFH) = [{
// 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 {

View File

@ -58,14 +58,18 @@ if (count _weaponMagazines == 0) then {
_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];
};
_magazine = "";
{
_ammoType = getText(configFile >> "CfgMagazines" >> _x >> "ammo");
EXPLODE_2_PVT(_x,_magazineType,_ammoType)
if (_ammoType == _ammo) exitWith {
_magazine = _x;
_magazine = _magazineType;
};
} forEach _weaponMagazines;

View File

@ -46,6 +46,15 @@ if ([ACE_player] call FUNC(hasEarPlugsIn)) then {
_volume = _volume min GVAR(EarplugsVolume);
};
// Headgear can reduce hearing
if(headgear ACE_player != "") then {
private ["_lowerVolume"];
_lowerVolume = (getNumber (configFile >> "CfgWeapons" >> (headgear ACE_player) >> QGVAR(lowerVolume))) min 1;
if(_lowerVolume > 0) then {
_volume = _volume min (1 - _lowerVolume);
};
};
// Reduce volume if player is unconscious
if (ACE_player getVariable ["ACE_isUnconscious", false]) then {
_volume = _volume min GVAR(UnconsciousnessVolume);

View File

@ -115,6 +115,7 @@
<Spanish>Audición</Spanish>
<German>Gehör</German>
<Czech>Sluch</Czech>
<Portuguese>Audição</Portuguese>
</Key>
<Key ID="STR_ACE_Hearing_CombatDeafness_DisplayName">
<English>Enable combat deafness?</English>
@ -122,6 +123,7 @@
<Spanish>¿Habilitar sordera de combate?</Spanish>
<German>Aktiviere Taubheit im Gefecht?</German>
<Czech>Povolit ztrátu sluchu?</Czech>
<Portuguese>Ativar surdez em combate?</Portuguese>
</Key>
<Key ID="STR_ACE_Hearing_CombatDeafness_Description">
<English>Enable combat deafness?</English>
@ -129,12 +131,14 @@
<Spanish>Habilita la sordera de combate</Spanish>
<German>Aktiviere Taubheit im Gefecht?</German>
<Czech>Povolit ztrátu sluchu?</Czech>
<Portuguese>Ativar surdez em combate?</Portuguese>
</Key>
<Key ID="STR_ACE_Hearing_Module_Description">
<English></English>
<Polish>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.</Polish>
<German>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.</German>
<Czech>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.</Czech>
<Portuguese>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.</Portuguese>
</Key>
</Package>
</Project>

View File

@ -19,16 +19,45 @@ class CfgVehicles {
class Parachute_02_base_F;
class ACE_HuntIR: Parachute_02_base_F {
scope = 1;
author = ECSTRING(common,ACETeam);
castDriverShadow = 0;
destrType = "DestructDefault";
displayName = "HuntIR";
model = PATHTOF(data\huntir.p3d);
castDriverShadow = 0;
soundEnviron[] = {"z\ace\addons\apl\sounds\padak_let", 0.316228, 1, 80};
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 };
mapSize = 0;
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;
@ -56,4 +85,14 @@ class CfgVehicles {
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);
};
};
};

View File

@ -3,7 +3,6 @@
ADDON = false;
PREP(cam);
PREP(handleDamage);
PREP(handleFired);
PREP(huntir);
PREP(huntirCompass);

Binary file not shown.

View File

@ -65,12 +65,12 @@ GVAR(no_cams) sort true;
[{
GVAR(nearHuntIRs) = ACE_player nearEntities ["ACE_HuntIR", HUNTIR_MAX_TRANSMISSION_RANGE];
{
if (((getPosVisual _x) select 2) > 20 && {!(_x in GVAR(no_cams))} && {damage _x < 0.5}) then {
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))} || {damage _x >= 0.5}) then {
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;

View File

@ -1,25 +0,0 @@
/*
* Author: Ruthberg
*
* Handles huntir damage
*
* Arguments:
* 0: huntir <OBJECT>
* 1: selectionName <STRING>
* 2: damage <NUMBER>
* 3: source <OBJECT>
* 4: projectile <STRING>
*
* Return Value:
* Nothing
*
* Return value:
* None
*/
#include "script_component.hpp"
PARAMS_5(_huntir,_selectionName,_damage,_source,_projectile);
systemChat format["Selection: %1; Damage: %2", _selectionName, _damage];
_damage

View File

@ -32,17 +32,16 @@ if (_ammo != "F_HuntIR") exitWith {};
_huntir = createVehicle ["ACE_HuntIR", _position, [], 0, "FLY"];
_huntir setPosATL _position;
_huntir setVariable [QGVAR(startTime), ACE_time, true];
// TODO: Edit the .p3d to allow doing the following _huntir getHit "camera"; _huntir getHit "parachute";
//_huntir addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}];
[{
EXPLODE_1_PVT(_this select 0,_huntir);
if (isNull _huntir) exitWith {
[_this select 1] call CBA_fnc_removePerFrameHandler;
};
if (damage _huntir > 0) then {
private ["_velocity"];
private ["_parachuteDamage", "_velocity"];
_parachuteDamage = _huntir getHitPointDamage "HitParachute";
if (_parachuteDamage > 0) then {
_velocity = velocity _huntir;
_velocity set [2, -1 min -20 * sqrt(damage _huntir)];
_velocity set [2, -1 min -20 * sqrt(_parachuteDamage)];
_huntir setVelocity _velocity;
_huntir setVectorUp [0, 0, 1];
};

View File

@ -61,7 +61,7 @@ createDialog "ace_huntir_cam_dialog_off";
if (_elapsedTime > 10) then {
GVAR(state) = "noGDS";
};
if (_elapsedTime > 5 && {count _nearestHuntIRs > 0}) then {
if (_elapsedTime > 5 && {{_x getHitPointDamage "HitCamera" < 0.25} count _nearestHuntIRs > 0}) then {
GVAR(state) = "connecting";
};
};

View File

@ -4,178 +4,194 @@
<Key ID="STR_DN_ACE_HUNTIRBOX">
<English>HuntIR Transport Box</English>
<German>HuntIR Transportkiste</German>
<Spanish>HuntIR Transport Box</Spanish>
<Spanish>Caja de transporte de HuntIR</Spanish>
<Czech>Trasnportní bedna HuntIR</Czech>
<Russian>Ящик с HuntIR</Russian>
<Italian>HuntIR Transport Box</Italian>
<Polish>Skrzynia HuntIR</Polish>
<French>HuntIR Transport Box</French>
<Hungarian>HuntIR Transport Box</Hungarian>
<Portuguese>Caixa de transporte do HuntIR</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_magazine_displayName">
<English>HuntIR Round</English>
<German>HuntIR Granate</German>
<Spanish>HuntIR Round</Spanish>
<Spanish>Proyectil HuntIR</Spanish>
<Czech>HuntIR Round</Czech>
<Russian>HuntIR снаряд</Russian>
<Italian>HuntIR Round</Italian>
<Polish>Nabój HuntIR</Polish>
<French>Munition HuntIR</French>
<Hungarian>HuntIR lövedék</Hungarian>
<Portuguese>Cartucho HuntIR</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_monitor_displayName">
<English>HuntIR monitor</English>
<German>HuntIR Monitor</German>
<Spanish>HuntIR monitor</Spanish>
<Spanish>Monitor HuntIR</Spanish>
<Czech>HuntIR monitor</Czech>
<Russian>HuntIR монитор</Russian>
<Italian>HuntIR monitor</Italian>
<Polish>Odbiornik HuntIR</Polish>
<French>Ecran HuntIR</French>
<Hungarian>HuntIR monitor</Hungarian>
<Portuguese>Monitor HuntIR</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_activateMonitor">
<English>Activate HuntIR monitor</English>
<German>HuntIR Monitor aktivieren</German>
<Spanish>Activate HuntIR monitor</Spanish>
<Spanish>Activar monitor HuntIR</Spanish>
<Czech>Zapnout HuntIR monitor</Czech>
<Russian>Включить HuntIR монитор</Russian>
<Italian>Activate HuntIR monitor</Italian>
<Polish>Włącz odbiornik HuntIR</Polish>
<French>Allumer écran HuntIR</French>
<Hungarian>HuntIR monitor aktiválása</Hungarian>
<Portuguese>Ativar monitor do HuntIR</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_CAM">
<English>Camera:</English>
<German>Kamera:</German>
<Spanish>Camera:</Spanish>
<Spanish>Camara:</Spanish>
<Czech>Kamera:</Czech>
<Russian>Камера:</Russian>
<Italian>Camera:</Italian>
<Polish>Kamera:</Polish>
<French>Caméra:</French>
<Hungarian>Kamera:</Hungarian>
<Portuguese>Câmera:</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_ALT">
<English>Altitude:</English>
<German>Höhe:</German>
<Spanish>Altitude:</Spanish>
<Spanish>Altitud:</Spanish>
<Czech>Výška:</Czech>
<Russian>Высота:</Russian>
<Italian>Altitude:</Italian>
<Polish>Wysokość:</Polish>
<French>Altitude:</French>
<Hungarian>Magasság:</Hungarian>
<Portuguese>Altitude:</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_TIME">
<English>Recording Time:</English>
<German>Aufnahmezeit:</German>
<Spanish>Recording Time:</Spanish>
<Spanish>Tiempo de grabación:</Spanish>
<Czech>Čas nahrávání:</Czech>
<Russian>Время записи:</Russian>
<Italian>Recording Time:</Italian>
<Polish>Czas nagrywania:</Polish>
<French>Temps d'enregistrement:</French>
<Hungarian>Felvételi idő:</Hungarian>
<Portuguese>Tempo de gravação:</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_ESC">
<English>Press ESC to quit camera</English>
<German>Zum Verlassen ESC drücken</German>
<Spanish>Press ESC to quit camera</Spanish>
<Spanish>Pulsar ESC para salir de la camara</Spanish>
<Czech>Stiskni ESC pro opustění kamery</Czech>
<Russian>Нажмите ESC чтобы выйти из режима камеры</Russian>
<Italian>Press ESC to quit camera</Italian>
<Polish>Wciśnij ESC by wyjść z widoku kamery</Polish>
<French>Appuyer sur ESC pour quitter camera</French>
<Hungarian>Nyomj ESC-ket a kamerából való kilépéshez</Hungarian>
<Portuguese>Pressione ESC para sair da câmera</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP">
<English>Help</English>
<German>Hilfe</German>
<Spanish>Help</Spanish>
<Spanish>Ayuda</Spanish>
<Czech>Pomoc</Czech>
<Russian>Помощь</Russian>
<Italian>Help</Italian>
<Polish>Pomoc</Polish>
<French>Aide</French>
<Hungarian>Súgó</Hungarian>
<Portuguese>Ajuda</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP_ZOOM">
<English>A/D - Cycle zoom</English>
<German>A/D - Zoom</German>
<Spanish>A/D - Cycle zoom</Spanish>
<Spanish>A/D - Cambiar zoom</Spanish>
<Czech>A/D - Změna přiblížení</Czech>
<Russian>A/D - Приближение</Russian>
<Italian>A/D - Cycle zoom</Italian>
<Polish>A/D - powiększenie</Polish>
<French>A/D - Changement zoom</French>
<Hungarian>A/D - Nagyítás</Hungarian>
<Portuguese>A/D - Troca zoom</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP_CAM">
<English>W/S - Select camera</English>
<German>W/S - Wähle Kamera</German>
<Spanish>W/S - Select camera</Spanish>
<Spanish>W/S - Seleccionar camara</Spanish>
<Czech>W/S - Výběr kamery</Czech>
<Russian>W/S - Выбрать камеру</Russian>
<Italian>W/S - Select camera</Italian>
<Polish>W/S - wybór kamery</Polish>
<French>W/S - Sélectionner caméra</French>
<Hungarian>W/S - Kamera váltás</Hungarian>
<Portuguese>W/S - Seleciona câmera</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP_ROT">
<English>Left/Right - Rotate camera</English>
<German>Links/Rechts - Rotiere Kamera</German>
<Spanish>Left/Right - Rotate camera</Spanish>
<Spanish>Left/Right - Rotar camara</Spanish>
<Czech>Levá/Pravá - Rotace kamery</Czech>
<Russian>Влево/Вправо - Вращать камеру</Russian>
<Italian>Left/Right - Rotate camera</Italian>
<Polish>Lewo/Prawo - obrót kamery w poziomie</Polish>
<French>Gauche/Droite - Rotation caméra</French>
<Hungarian>Jobb/Bal - Kamera forgatás</Hungarian>
<Portuguese>Esquerda/Direita - Rotaciona câmera</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP_ELV">
<English>Up/Down - Elevate/lower camera</English>
<German>Hoch/Runter - Neige Kamera</German>
<Spanish>Up/Down - Elevate/lower camera</Spanish>
<Spanish>Up/Down - Subir/bajar camara</Spanish>
<Czech>Nahoru/Dolu - Zvýšít/snížit úhel pohledu kamery</Czech>
<Russian>Вверх/Вниз - Поднять/Опустить камеру</Russian>
<Italian>Up/Down - Elevate/lower camera</Italian>
<Polish>Góra/Dół - obrót kamery w pionie</Polish>
<French>Haut/Bas - Monter/descendre caméra</French>
<Hungarian>Fel/Le - Kamera döntése/süllyesztése</Hungarian>
<Portuguese>Acima/Abaixo - Eleva/Abaixa a câmera</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP_MOD">
<English>N - Cycle IT modes</English>
<German>N - Sichtmodi</German>
<Spanish>N - Cycle IT modes</Spanish>
<Spanish>N - Cambiar modos de IT</Spanish>
<Czech>N - Změna režimů kamery</Czech>
<Russian>N - Режимы камеры</Russian>
<Italian>N - Cycle IT modes</Italian>
<Polish>N - wybór trybu IT</Polish>
<French>N - Changement de modes IT</French>
<Hungarian>N - Hőkép módok</Hungarian>
<Portuguese>N - Troca modo IT</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP_RES">
<English>R - Reset camera</English>
<German>R - Reset</German>
<Spanish>R - Reset camera</Spanish>
<Spanish>R - Reiniciar camara</Spanish>
<Czech>R - Reset kamery</Czech>
<Russian>R - Сбросить настройки камеры</Russian>
<Italian>R - Reset camera</Italian>
<Polish>R - resetuj kamerę</Polish>
<French>R - Reset caméra</French>
<Hungarian>R - Kamera visszaállítása</Hungarian>
<Portuguese>R - Redefine a câmera</Portuguese>
</Key>
<Key ID="STR_ACE_HUNTIR_HELP_EXIT">
<English>Esc - Exit help</English>
<German>ESC - Hilfe verlassen</German>
<Spanish>Esc - Exit help</Spanish>
<Spanish>Esc - Salit de ayuda</Spanish>
<Czech>Esc - Ukončit pomoc </Czech>
<Russian>Esc - Выйти из помощи</Russian>
<Italian>Esc - Exit help</Italian>
<Polish>Esc - wyjście z ekranu Pomocy</Polish>
<French>Esc - Sortir de l'aide</French>
<Hungarian>Exit - Kilépés a súgóból</Hungarian>
<Portuguese>Esc - Sai do Ajuda</Portuguese>
</Key>
</Package>
</Project>

View File

@ -76,4 +76,11 @@ class ACE_Settings {
displayName = CSTRING(background);
values[] = {"$STR_A3_OPTIONS_DISABLED", CSTRING(backgroundBlur), CSTRING(backgroundBlack)};
};
class GVAR(addBuildingActions) {
value = 0;
typeName = "BOOL";
isClientSettable = 1;
displayName = CSTRING(addBuildingActions);
description = CSTRING(addBuildingActionsDescription);
};
};

View File

@ -3,6 +3,9 @@
if (!hasInterface) exitWith {};
GVAR(cachedBuildingTypes) = [];
GVAR(cachedBuildingActionPairs) = [];
GVAR(ParsedTextCached) = [];
//Setup text/shadow/size/color settings matrix
@ -17,6 +20,9 @@ GVAR(ParsedTextCached) = [];
// Install the render EH on the main display
addMissionEventHandler ["Draw3D", DFUNC(render)];
//Add Actions to Houses:
["interactMenuOpened", {_this call FUNC(userActions_addHouseActions)}] call EFUNC(common,addEventHandler);
// This spawn is probably worth keeping, as pfh don't work natively on the briefing screen and IDK how reliable the hack we implemented for them is.
// The thread dies as soon as the mission start, so it's not really compiting for scheduler space.
[] spawn {
@ -30,8 +36,6 @@ addMissionEventHandler ["Draw3D", DFUNC(render)];
["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)},
@ -39,8 +43,6 @@ addMissionEventHandler ["Draw3D", DFUNC(render)];
["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)},
@ -72,3 +74,11 @@ addMissionEventHandler ["Draw3D", DFUNC(render)];
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);

View File

@ -6,6 +6,7 @@ PREP(addActionToClass);
PREP(addActionToObject);
PREP(compileMenu);
PREP(compileMenuSelfAction);
PREP(compileMenuZeus);
PREP(collectActiveActionTree);
PREP(createAction);
PREP(ctrlSetParsedTextCached);
@ -24,6 +25,8 @@ PREP(renderMenu);
PREP(renderSelector);
PREP(setupTextColors);
PREP(splitPath);
PREP(userActions_addHouseActions);
PREP(userActions_getHouseActions);
// Event handlers for all interact menu controls
DFUNC(handleMouseMovement) = {
@ -75,4 +78,7 @@ GVAR(lastTimeSearchedActions) = -1000;
["CAManBase"] call FUNC(compileMenu);
["CAManBase"] call FUNC(compileMenuSelfAction);
// Init zeus menu
[] call FUNC(compileMenuZeus);
ADDON = true;

View File

@ -21,5 +21,5 @@ class CfgPatches {
#include "ACE_Settings.hpp"
class ACE_Extensions {
extensions[] += {"ace_break_line"};
extensions[] += {"ace_break_line", "ace_parse_imagepath"};
};

View File

@ -90,7 +90,7 @@ _recurseFnc = {
[],
_position,
_distance,
[_showDisabled,_enableInside,_canCollapse,_runOnHover],
[_showDisabled,_enableInside,_canCollapse,_runOnHover, false],
_modifierFunction
],
_children

View File

@ -74,7 +74,7 @@ _recurseFnc = {
{},
[0,0,0],
10, //distace
[_showDisabled,_enableInside,_canCollapse,_runOnHover],
[_showDisabled,_enableInside,_canCollapse,_runOnHover, true],
_modifierFunction
],
_children
@ -122,7 +122,7 @@ _actions = if (_isMan) then {
// 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)},
{[ACE_player, _target, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting"]] call EFUNC(common,canInteractWith)},
{},
{},
"Spine3",

View File

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

View File

@ -68,7 +68,7 @@ _distance = if (count _this > 8) then {
_params = if (count _this > 9) then {
_this select 9
} else {
[false,false,false,false]
[false,false,false,false,false]
};
_modifierFunction = if (count _this > 10) then {

View File

@ -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;
};
@ -34,6 +39,7 @@ 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:

View File

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

View File

@ -49,7 +49,7 @@ _fnc_renderNearbyActions = {
_action = _x;
if ([_target, _action] call FUNC(renderBaseMenu)) then {
_numInteractions = _numInteractions + 1;
GVAR(foundActions) pushBack [_target, _action];
GVAR(foundActions) pushBack [_target, _action, GVAR(objectActionList)];
};
};
} forEach GVAR(objectActionList);
@ -61,7 +61,7 @@ _fnc_renderNearbyActions = {
// Try to render the menu
if ([_target, _action] call FUNC(renderBaseMenu)) then {
_numInteractions = _numInteractions + 1;
GVAR(foundActions) pushBack [_target, _action];
GVAR(foundActions) pushBack [_target, _action, GVAR(objectActionList)];
};
} forEach _classActions;
@ -78,7 +78,10 @@ _fnc_renderNearbyActions = {
_fnc_renderLastFrameActions = {
{
_x call FUNC(renderBaseMenu);
EXPLODE_3_PVT(_x,_target,_action,_objectActionList);
GVAR(objectActionList) = _objectActionList;
[_target, _action] call FUNC(renderBaseMenu);
} forEach GVAR(foundActions);
};
@ -118,24 +121,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 (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;
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;
};

View File

@ -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");
@ -44,7 +44,7 @@ if (GVAR(openedMenuType) == 0 && vehicle ACE_player == ACE_player &&
if (_actualDistance > _distance) exitWith {true};
if (_actualDistance > 1.5) exitWith {
if ((_actualDistance > 1.5) && {!((_actionData select 9) select 4)}) exitWith {
// If distance to action is greater than 1.5 m, check LOS
_line = [_headPos call EFUNC(common,positionToASL), _pos call EFUNC(common,positionToASL), _object, ACE_player];
lineIntersects _line

View File

@ -0,0 +1,97 @@
/*
* Author: PabstMirror
* Scans for nearby "Static" objects (buildings) and adds the UserActions to them.
* Called when interact_menu starts rendering (from "interact_keyDown" event)
*
* Arguments:
* 0: Interact Menu Type (0 - world, 1 - self) <NUMBER>
*
* Return Value:
* Nothing
*
* Example:
* [0] call ace_interact_menu_fnc_addHouseActions
*
* Public: Yes
*/
#include "script_component.hpp"
PARAMS_1(_interactionType);
//Ignore if not enabled:
if (!GVAR(addBuildingActions)) exitWith {};
//Ignore self-interaction menu:
if (_interactionType != 0) exitWith {};
//Ignore when mounted:
if ((vehicle ACE_player) != ACE_player) exitWith {};
[{
private ["_nearBuidlings", "_typeOfHouse", "_houseBeingScaned", "_actionSet", "_memPoints", "_memPointsActions", "_helperPos", "_helperObject"];
PARAMS_2(_args,_pfID);
EXPLODE_4_PVT(_args,_setPosition,_addedHelpers,_housesScaned,_housesToScanForActions);
if (!EGVAR(interact_menu,keyDown)) then {
{deleteVehicle _x;} forEach _addedHelpers;
[_pfID] call CBA_fnc_removePerFrameHandler;
} else {
// Prevent Rare Error when ending mission with interact key down:
if (isNull ace_player) exitWith {};
//Make the common case fast (cursorTarget is looking at a door):
if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then {
if (((count (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "UserActions")) > 0) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "ladders"))) > 0}) then {
_housesToScanForActions = [cursorTarget];
} else {
_housesScaned pushBack cursorTarget;
};
};
//For performance, we only do 1 thing per frame,
//-either do a wide scan and search for houses with actions
//-or scan one house at a time and add the actions for that house
if (_housesToScanForActions isEqualTo []) then {
//If player moved >2 meters from last pos, then rescan
if (((getPosASL ace_player) distance _setPosition) < 2) exitWith {};
_nearBuidlings = nearestObjects [ace_player, ["Static"], 30];
{
_typeOfHouse = typeOf _x;
if (((count (configFile >> "CfgVehicles" >> _typeOfHouse >> "UserActions")) == 0) && {(count (getArray (configFile >> "CfgVehicles" >> _typeOfHouse >> "ladders"))) == 0}) then {
_housesScaned pushBack _x;
} else {
_housesToScanForActions pushBack _x;
};
} forEach (_nearBuidlings - _housesScaned);
_args set [0, (getPosASL ace_player)];
} else {
_houseBeingScaned = _housesToScanForActions deleteAt 0;
_typeOfHouse = typeOf _houseBeingScaned;
//Skip this house for now if we are outside of it's radius
//(we have to scan far out for the big houses, but we don't want to waste time adding actions on every little shack)
if ((_houseBeingScaned != cursorTarget) && {((ACE_player distance _houseBeingScaned) - ((sizeOf _typeOfHouse) / 2)) > 4}) exitWith {};
_housesScaned pushBack _houseBeingScaned;
_actionSet = [_typeOfHouse] call FUNC(userActions_getHouseActions);
EXPLODE_2_PVT(_actionSet,_memPoints,_memPointsActions);
// systemChat format ["Add Actions for [%1] (count %2) @ %3", _typeOfHouse, (count _memPoints), diag_tickTime];
{
_helperPos = (_houseBeingScaned modelToWorld (_houseBeingScaned selectionPosition _x)) call EFUNC(common,positionToASL);
_helperObject = "Sign_Sphere25cm_F" createVehicleLocal _helperPos;
_addedHelpers pushBack _helperObject;
_helperObject setVariable [QGVAR(building), _houseBeingScaned];
_helperObject setPosASL _helperPos;
_helperObject hideObject true;
TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScaned);
{
[_helperObject, 0, [], _x] call EFUNC(interact_menu,addActionToObject);
} forEach (_memPointsActions select _forEachIndex);
} forEach _memPoints;
};
};
}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler;

View File

@ -0,0 +1,137 @@
/*
* Author: PabstMirror
* Scans the buidling type for UserActions and Ladder mount points.
*
* Arguments:
* 0: Building Classname <STRING>
*
* Return Value:
* [[Array of MemPoints], [Array Of Actions]]
*
* Public: Yes
*/
#include "script_component.hpp"
PARAMS_1(_typeOfBuilding);
private["_action", "_actionDisplayName", "_actionDisplayNameDefault", "_actionMaxDistance", "_actionOffset", "_actionPath", "_actionPosition", "_building", "_configPath", "_endIndex", "_iconImage", "_index", "_ladders", "_memPointIndex", "_memPoints", "_memPointsActions", "_startIndex"];
_searchIndex = GVAR(cachedBuildingTypes) find _typeOfBuilding;
if (_searchIndex != -1) exitWith {GVAR(cachedBuildingActionPairs) select _searchIndex};
_memPoints = [];
_memPointsActions = [];
//Get the offset for a memory point:
_fnc_getMemPointOffset = {
PARAMS_1(_memoryPoint);
_memPointIndex = _memPoints find _memoryPoint;
_actionOffset = [0,0,0];
if (_memPointIndex == -1) then {
_memPoints pushBack _memoryPoint;
_memPointsActions pushBack [];
} else {
_actionOffset set [2, 0.0254 * (count (_memPointsActions select _memPointIndex))];
};
_actionOffset
};
// Add UserActions for the building:
_fnc_userAction_Statement = {
PARAMS_3(_target,_player,_variable);
EXPLODE_2_PVT(_variable,_actionStatement,_actionCondition);
this = _target getVariable [QGVAR(building), objNull];
call _actionStatement;
};
_fnc_userAction_Condition = {
PARAMS_3(_target,_player,_variable);
EXPLODE_2_PVT(_variable,_actionStatement,_actionCondition);
this = _target getVariable [QGVAR(building), objNull];
if (isNull this) exitWith {false};
call _actionCondition;
};
_configPath = configFile >> "CfgVehicles" >> _typeOfBuilding >> "UserActions";
for "_index" from 0 to ((count _configPath) - 1) do {
_actionPath = _configPath select _index;
_actionDisplayName = getText (_actionPath >> "displayName");
_actionDisplayNameDefault = getText (_actionPath >> "displayNameDefault");
_actionPosition = getText (_actionPath >> "position");
_actionCondition = getText (_actionPath >> "condition");
_actionStatement = getText (_actionPath >> "statement");
_actionMaxDistance = getNumber (_actionPath >> "radius");
if (_actionDisplayName == "") then {_actionDisplayName = (configName _x);};
if (_actionPosition == "") then {ERROR("Bad Position");};
if (_actionCondition == "") then {_actionCondition = "true";};
if (_actionStatement == "") then {ERROR("No Statement");};
_actionStatement = compile _actionStatement;
_actionCondition = compile _actionCondition;
_actionMaxDistance = _actionMaxDistance + 0.1; //increase range slightly
_iconImage = "";
//extension ~4x as fast:
_iconImage = "ace_parse_imagepath" callExtension _actionDisplayNameDefault;
_actionOffset = [_actionPosition] call _fnc_getMemPointOffset;
_memPointIndex = _memPoints find _actionPosition;
_action = [(configName _actionPath), _actionDisplayName, _iconImage, _fnc_userAction_Statement, _fnc_userAction_Condition, {}, [_actionStatement, _actionCondition], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction);
(_memPointsActions select _memPointIndex) pushBack _action;
};
// Add Ladder Actions for the building:
_fnc_ladder_ladderUp = {
PARAMS_3(_target,_player,_variable);
EXPLODE_1_PVT(_variable,_ladderIndex);
_building = _target getVariable [QGVAR(building), objNull];
TRACE_3("Ladder Action - UP",_player,_building,_ladderIndex);
_player action ["LadderUp", _building, _ladderIndex, 0];
};
_fnc_ladder_ladderDown = {
PARAMS_3(_target,_player,_variable);
EXPLODE_1_PVT(_variable,_ladderIndex);
_building = _target getVariable [QGVAR(building), objNull];
TRACE_3("Ladder Action - Down",_player,_building,_ladderIndex);
_player action ["LadderDown", _building, _ladderIndex, 1];
};
_fnc_ladder_conditional = {
PARAMS_2(_target,_player);
//(Check distance < 2) and (Don't show actions if on a ladder)
((_target distance _player) < 2) && {((getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState _player) >> "onLadder")) == 0)}
};
_ladders = getArray (configFile >> "CfgVehicles" >> _typeOfBuilding >> "ladders");
{
EXPLODE_2_PVT(_x,_ladderBottomMemPoint,_ladderTopMemPoint);
_actionMaxDistance = 3; //interact_menu will check head -> target's offset; leave this high and do a precice distance check in condition
_actionDisplayName = localize "str_action_ladderup";
_iconImage = "\A3\ui_f\data\igui\cfg\actions\ladderup_ca.paa";
//Ladder Up Action:
_actionOffset = [_ladderBottomMemPoint] call _fnc_getMemPointOffset;
_actionOffset = _actionOffset vectorAdd [0,0,1];
_memPointIndex = _memPoints find _ladderBottomMemPoint;
_action = [format ["LadderUp_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderUp, _fnc_ladder_conditional, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction);
(_memPointsActions select _memPointIndex) pushBack _action;
_actionDisplayName = localize "str_action_ladderdown";
_iconImage = "\A3\ui_f\data\igui\cfg\actions\ladderdown_ca.paa";
//Ladder Down Action:
_actionOffset = [_ladderTopMemPoint] call _fnc_getMemPointOffset;
_actionOffset = _actionOffset vectorAdd [0,0,0.25];
_memPointIndex = _memPoints find _ladderTopMemPoint;
_action = [format ["LadderDown_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderDown, _fnc_ladder_conditional, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction);
(_memPointsActions select _memPointIndex) pushBack _action;
} forEach _ladders;
GVAR(cachedBuildingTypes) pushBack _typeOfBuilding;
GVAR(cachedBuildingActionPairs) pushBack [_memPoints, _memPointsActions];
[_memPoints, _memPointsActions]

View File

@ -85,6 +85,12 @@
<Italian>Interazioni con veicoli</Italian>
<Portuguese>Ações de Veículos</Portuguese>
</Key>
<Key ID="STR_ACE_Interact_Menu_ZeusActionsRoot">
<English>Zeus Actions</English>
<Polish>Akcje Zeusa</Polish>
<Czech>Akce Zeuse</Czech>
<Spanish>Acciones Zeus</Spanish>
</Key>
<Key ID="STR_ACE_Interact_Menu_ColorTextMax">
<English>Interaction - Text Max</English>
<Polish>Interakcja - Tekst max</Polish>
@ -223,6 +229,7 @@
<Spanish>Fondo del menú de interacción</Spanish>
<Czech>Pozadí menu interakce</Czech>
<German>Interaktionsmenü-Hintergrund</German>
<Portuguese>Fundo do menu de interação</Portuguese>
</Key>
<Key ID="STR_ACE_Interact_Menu_blurScreenDesc">
<English>Blur the background while the interaction menu is open.</English>
@ -230,6 +237,7 @@
<Spanish>Desenfocar el fondo mientras el menú de interacción está abierto.</Spanish>
<Czech>Rozmazat obraz pokud je interakční menu otevřené.</Czech>
<German>Den Hintergrund verschwimmen lassen, während das Interaktionsmenü geöffnet ist.</German>
<Portuguese>Desfocar o fundo enquanto o menu de interação está aberto.</Portuguese>
</Key>
<Key ID="STR_ACE_Interact_Menu_backgroundBlur">
<English>Blur screen</English>
@ -237,13 +245,27 @@
<Spanish>Pantalla de desenfoque</Spanish>
<Czech>Rozmazaný obraz</Czech>
<German>Verschwommenes Bild</German>
<Portuguese>Desfoque de tela</Portuguese>
</Key>
<Key ID="STR_ACE_Interact_Menu_backgroundBlack">
<English>Black</English>
<Polish>Przyciemnienie ekranu</Polish>
<Spanish>Negra</Spanish>
<Spanish>Negro</Spanish>
<Czech>Černý obraz</Czech>
<Portuguese>Preto</Portuguese>
<German>Schwarz</German>
</Key>
<Key ID="STR_ACE_Interact_Menu_addBuildingActions">
<English>Show actions for buildings</English>
<Polish>Pokazuj akcje dla budynków</Polish>
<Czech>Zobrazit akci pro budovy</Czech>
<Spanish>Mostrar acciones para edificios</Spanish>
</Key>
<Key ID="STR_ACE_Interact_Menu_addBuildingActionsDescription">
<English>Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns)</English>
<Polish>Dodaje opcje interakcji dla otwierania drzwi oraz wchodzenia po drabinach do budynków. Uwaga: Użycie tej opcji może spowodować spadek wydajności menu interakcji, szczególnie w dużych miastach.</Polish>
<Czech>Přidá možnost interakce pro otevření dvěří a umistňovat žebříky na budovy. (Poznámka: Použití této možnosti snižuje výkon při otevírání pomocí interakčního menu, zejména ve velkých městech.) </Czech>
<Spanish>Añade las acciones de interacción para la apertura de puertas y montaje de escaleras en los edificios. (Nota: Hay un coste de rendimiento al abrir el menú de interacción, especialmente en las ciudades)</Spanish>
</Key>
</Package>
</Project>
</Project>

View File

@ -0,0 +1,244 @@
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 prone {
displayName = "$STR_Pos_Down";
icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa";
statement = "{_x setUnitPos 'DOWN';} forEach (curatorSelected select 0);";
};
class crouch {
displayName = "$STR_Pos_Crouch";
icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa";
statement = "{_x setUnitPos 'MIDDLE';} forEach (curatorSelected select 0);";
};
class stand {
displayName = "$STR_Pos_Up";
icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa";
statement = "{_x setUnitPos 'UP';} forEach (curatorSelected select 0);";
};
class auto {
displayName = "$STR_Pos_Automatic";
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 = "$STR_Combat_Mode";
class careless {
displayName = "$STR_Combat_Careless";
statement = "{ _x setBehaviour 'CARELESS'; } forEach (curatorSelected select 1);";
};
class safe {
displayName = "$STR_Combat_Safe";
icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa";
statement = "{ _x setBehaviour 'SAFE'; } forEach (curatorSelected select 1);";
};
class aware {
displayName = "$STR_Combat_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_Combat";
icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa";
statement = "{ _x setBehaviour 'COMBAT'; } forEach (curatorSelected select 1);";
};
class stealth {
displayName = "$STR_Combat_Stealth";
icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa";
statement = "{ _x setBehaviour 'STEALTH'; } forEach (curatorSelected select 1);";
};
};
class speed {
displayName = "$STR_HC_Menu_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 formation {
displayName = "$STR_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\Displays\RscDisplayCurator\modeRecent_ca.paa";
class behaviour {
displayName = "$STR_Combat_Mode";
class careless {
displayName = "$STR_Combat_Careless";
statement = "{ _x setWaypointBehaviour 'CARELESS'; } forEach (curatorSelected select 2);";
};
class safe {
displayName = "$STR_Combat_Safe";
icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa";
statement = "{ _x setWaypointBehaviour 'SAFE'; } forEach (curatorSelected select 2);";
};
class aware {
displayName = "$STR_Combat_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_Combat";
icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa";
statement = "{ _x setWaypointBehaviour 'COMBAT'; } forEach (curatorSelected select 2);";
};
class stealth {
displayName = "$STR_Combat_Stealth";
icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa";
statement = "{ _x setWaypointBehaviour 'STEALTH'; } forEach (curatorSelected select 2);";
};
};
class speed {
displayName = "$STR_HC_Menu_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 = "$STR_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";
};
};

View File

@ -191,7 +191,7 @@ class CfgVehicles {
class ACE_TeamManagement {
displayName = CSTRING(TeamManagement);
condition = QUOTE(GVAR(EnableTeamManagement));
exceptions[] = {"isNotInside"};
exceptions[] = {"isNotInside", "isNotSitting"};
statement = "";
showDisabled = 1;
priority = 3.2;
@ -201,7 +201,7 @@ class CfgVehicles {
class ACE_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;
@ -211,7 +211,7 @@ class CfgVehicles {
class ACE_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;
@ -221,7 +221,7 @@ class CfgVehicles {
class ACE_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;
@ -231,7 +231,7 @@ class CfgVehicles {
class ACE_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;
@ -242,7 +242,7 @@ class CfgVehicles {
class ACE_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;
@ -252,7 +252,7 @@ class CfgVehicles {
class ACE_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;
@ -262,7 +262,7 @@ class CfgVehicles {
class ACE_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;
@ -379,7 +379,7 @@ class CfgVehicles {
class ACE_Equipment {
displayName = CSTRING(Equipment);
condition = QUOTE(true);
exceptions[] = {"isNotInside","notOnMap"};
exceptions[] = {"isNotInside","notOnMap", "isNotSitting"};
statement = "";
showDisabled = 1;
priority = 4.5;
@ -581,6 +581,13 @@ class CfgVehicles {
selection = "";
distance = 2;
condition = "true";
class ACE_OpenBox {
displayName = CSTRING(OpenBox);
condition = QUOTE(alive _target);
statement = QUOTE(_player action [ARR_2(QUOTE(QUOTE(Gear)), _target)]);
showDisabled = 0;
priority = -1;
};
};
};
class ACE_SelfActions {};

View File

@ -16,3 +16,4 @@ class CfgPatches {
#include "CfgVehicles.hpp"
#include "Menu_Config.hpp"
#include "ACE_Settings.hpp"
#include "ACE_ZeusActions.hpp"

View File

@ -793,12 +793,19 @@
<Italian>Passeggeri</Italian>
<Portuguese>Passageiros</Portuguese>
</Key>
<Key ID="STR_ACE_Interaction_OpenBox">
<English>Open</English>
<Polish>Otwórz</Polish>
<Czech>Otevřít</Czech>
<Spanish>Abrir</Spanish>
</Key>
<Key ID="STR_ACE_Interaction_Module_DisplayName">
<English>Interaction System</English>
<Polish>System interakcji</Polish>
<Spanish>Sistema de interacción</Spanish>
<German>Interaktionssystem</German>
<Czech>Systém interakce</Czech>
<Russian>Sistema de interação</Russian>
</Key>
<Key ID="STR_ACE_Interaction_EnableTeamManagement_DisplayName">
<English>Enable Team Management</English>
@ -806,6 +813,7 @@
<Spanish>Habilitar gestión de equipos</Spanish>
<German>Aktiviere Gruppenverwaltung</German>
<Czech>Povolit správu týmu</Czech>
<Russian>Habilitar gestão de equipes</Russian>
</Key>
<Key ID="STR_ACE_Interaction_EnableTeamManagement_Description">
<English>Should players be allowed to use the Team Management Menu? Default: Yes</English>
@ -813,12 +821,15 @@
<Spanish>¿Deben tener permitido los jugadores el uso del menu de gestión de equipos? Por defecto: Si</Spanish>
<German>Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja</German>
<Czech>Mohou hráči použít menu správy týmu? Výchozí: Ano</Czech>
<Russian>Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim</Russian>
</Key>
<Key ID="STR_ACE_Interaction_Module_Description">
<English></English>
<English>Team management allows color allocation for team members, taking team command and joining/leaving teams.</English>
<Polish>Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn.</Polish>
<German>Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe.</German>
<Czech>Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. </Czech>
<Russian>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.</Russian>
<Spanish>La gestión del equipo permite la asignación de colores para los miembros del equipo, tomando el mando del equipo y uniendo/dejando equipos.</Spanish>
</Key>
</Package>
</Project>

View File

@ -9,5 +9,7 @@ PREP(showFireMode);
PREP(onFired);
PREP(onOpticLoad);
PREP(onOpticDraw);
PREP(onOpticUnload);
GVAR(isLockKeyDown) = false;
GVAR(isLockKeyDown) = false;
GVAR(pfehID) = -1;

View File

@ -1,21 +1,17 @@
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
PARAMS_2(_shooter,_weapon);
// Bail on not missile
if( _shooter != ACE_player) exitWith { false };
// Bail on not missile or javelin PFEH not running
if ((_shooter != ACE_player) || {(GVAR(pfehID) == -1)}) exitWith { false };
private ["_configs"];
_configs = configProperties [configFile >> "CfgWeapons" >> _weapon, QUOTE(configName _x == QUOTE(QGVAR(enabled))), false];
if (((count _configs) < 1) || {(getNumber (_configs select 0)) != 1}) exitWith {};
_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil];
if(!isNil "_pfh_handle") then {
//[_pfh_handle] call cba_fnc_removePerFrameHandler;
//uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil];
__JavelinIGUITargeting ctrlShow false;
__JavelinIGUITargetingGate ctrlShow false;
__JavelinIGUITargetingLines ctrlShow false;
__JavelinIGUITargetingConstraints ctrlShow false;
};
__JavelinIGUITargeting ctrlShow false;
__JavelinIGUITargetingGate ctrlShow false;
__JavelinIGUITargetingLines ctrlShow false;
__JavelinIGUITargetingConstraints ctrlShow false;

View File

@ -56,7 +56,7 @@ if (((count _weaponConfig) < 1) || {(getNumber (_weaponConfig select 0)) != 1})
};
[(_this select 1)] call cba_fnc_removePerFrameHandler;
uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil];
GVAR(pfehID) = -1;
};
// Find a target within the optic range

View File

@ -18,6 +18,10 @@ __JavelinIGUITargetingConstrains ctrlShow false;
__JavelinIGUITargetingGate ctrlShow false;
__JavelinIGUITargetingLines ctrlShow false;
if(GVAR(pfehID) != -1) then {
[] call FUNC(onOpticUnload); // Unload optic if it was already loaded
};
uiNameSpace setVariable [QGVAR(arguments),
[
ACE_diagTime, // Last runtime
@ -30,11 +34,4 @@ uiNameSpace setVariable [QGVAR(arguments),
]
];
_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil];
if(!isNil "_pfh_handle") then {
[] call FUNC(onOpticUnload); // Unload optic if it was already loaded
};
_pfh_handle = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler;
uiNamespace setVariable["ACE_RscOptics_javelin_PFH", _pfh_handle];
GVAR(pfehID) = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler;

View File

@ -1,14 +1,13 @@
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
TRACE_1("enter", _this);
private["_args", "_disableFireEH", "_pfh"];
private["_args", "_disableFireEH"];
uiNameSpace setVariable ['ACE_RscOptics_javelin',nil];
// uiNameSpace setVariable ['ACE_RscOptics_javelin',nil];
_pfh = uiNamespace getVariable["ACE_RscOptics_javelin_PFH", nil ];
if(!isNil "_pfh") then {
[_pfh] call CBA_fnc_removePerFrameHandler;
uiNameSpace setVariable ['ACE_RscOptics_javelin_PFH',nil];
if(GVAR(pfehID) != -1) then {
[GVAR(pfehID)] call CBA_fnc_removePerFrameHandler;
GVAR(pfehID) = -1;
};
_args = uiNamespace getVariable[QGVAR(arguments), nil ];

View File

@ -10,7 +10,7 @@ class CfgVehicles {
showDisabled = 0;
priority = 0.1;
icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa));
exceptions[] = {"notOnMap"};
exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"};
class GVAR(show) {
displayName = CSTRING(ShowKestrel);
condition = QUOTE(call FUNC(canShow) && !GVAR(Overlay));
@ -18,7 +18,7 @@ class CfgVehicles {
showDisabled = 0;
priority = 0.2;
icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa));
exceptions[] = {"notOnMap", "isNotInside"};
exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"};
};
class GVAR(hide) {
displayName = CSTRING(HideKestrel);
@ -27,7 +27,7 @@ class CfgVehicles {
showDisabled = 0;
priority = 0.3;
icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa));
exceptions[] = {"notOnMap", "isNotInside"};
exceptions[] = {"notOnMap", "isNotInside", "isNotSitting"};
};
};
};

View File

@ -1,7 +1,7 @@
["ACE3 Equipment", QGVAR(KestrelDialogKey), localize LSTRING(KestrelDialogKey),
{
// Conditions: canInteract
if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] 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
@ -16,7 +16,7 @@
["ACE3 Equipment", QGVAR(DisplayKestrelKey), localize LSTRING(DisplayKestrelKey),
{
// Conditions: canInteract
if !([ACE_player, objNull, ["notOnMap", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false};
if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false};
// Statement
[] call FUNC(displayKestrel);

View File

@ -1,7 +1,7 @@
// by commy2 and esteldunedain
#include "script_component.hpp"
private ["_brightness", "_p0", "_p1", "_p0Pos", "_offV1", "_offV2", "_offV3", "_camPos", "_intermediatePos", "_iteration", "_light", "_line", "_pL", "_pL2", "_pX", "_size", "_units", "_fnc_getDistanceToTerrain", "_fnc_doesIntersectWithMan"];
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 {
@ -16,7 +16,7 @@ private ["_brightness", "_p0", "_p1", "_p0Pos", "_offV1", "_offV2", "_offV3", "_
GVAR(laserdot) = _light;
};*/
EXPLODE_3_PVT(_this,_unit,_range,_isGreen);
EXPLODE_4_PVT(_this,_unit,_range,_isGreen,_brightness);
_p0Pos = _unit modelToWorldVisual (_unit selectionPosition "righthand");

View File

@ -35,7 +35,7 @@ _brightness = 2 - call EFUNC(common,ambientBrightness);
};
if (_laserID > 0 && {_x isFlashlightOn _weapon}) then {
[_x, 50, _laserID == 2 || _isIR] call FUNC(drawLaserpoint);
[_x, 50, (_laserID == 2 || _isIR), _brightness] call FUNC(drawLaserpoint);
};
};

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