From fde8f7383f4d4e63f4ff47e37b1cde4e0ac98fc0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 28 Jun 2015 13:08:47 -0500 Subject: [PATCH 001/137] Map Opened/Closed Events + use in maptools --- addons/common/XEH_postInit.sqf | 18 ++++++++++ addons/maptools/XEH_postInitClient.sqf | 16 +++++++-- addons/maptools/XEH_preInit.sqf | 1 - .../functions/fnc_mapStateUpdater.sqf | 33 ------------------- .../functions/fnc_updateMapToolMarkers.sqf | 10 ++++++ 5 files changed, 42 insertions(+), 36 deletions(-) delete mode 100644 addons/maptools/functions/fnc_mapStateUpdater.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 3796a4fdc8..159ef1883a 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -353,5 +353,23 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [true, false, false]], false] call cba_fnc_addKeybind; //SHIFT + Home Key +//Map opened/closed Events: +GVAR(mapOpened) = false; +[] spawn { + waitUntil {(!isNull findDisplay 12)}; + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", { + if (!GVAR(mapOpened)) then { + GVAR(mapOpened) = true; + ["mapOpened", []] call FUNC(localEvent); + [{ + if (!visibleMap) then { + GVAR(mapOpened) = false; + ["mapClosed", []] call FUNC(localEvent); + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + }, 0, []] call CBA_fnc_addPerFrameHandler; + }; + }]; +}; GVAR(commonPostInited) = true; diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index 8129a75b15..e227463711 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -67,6 +67,18 @@ GVAR(drawing_controls) = [36732, 36733, 36734, 36735, 36736, 36737]; // Update the size and rotation of map tools [] call FUNC(updateMapToolMarkers); - - [FUNC(mapStateUpdater), 0, []] call CBA_fnc_addPerFrameHandler; }; + +["mapOpened", { + // Show and update map tools if required + [] call FUNC(updateMapToolMarkers); + // Show GPS if required + [GVAR(mapGpsShow)] call FUNC(openMapGps); +}] call EFUNC(common,addEventHandler); + +["mapClosed", { + // Hide GPS + [false] call FUNC(openMapGps); + // Cancel drawing + call FUNC(cancelDrawing); +}] call EFUNC(common,addEventHandler); diff --git a/addons/maptools/XEH_preInit.sqf b/addons/maptools/XEH_preInit.sqf index 2da38996c3..2bcd68385a 100644 --- a/addons/maptools/XEH_preInit.sqf +++ b/addons/maptools/XEH_preInit.sqf @@ -16,7 +16,6 @@ PREP(handleMouseButton); PREP(handleMouseMove); PREP(handleMouseZChanged); PREP(isInsideMapTool); -PREP(mapStateUpdater); PREP(openMapGps); PREP(openMapGpsUpdate); PREP(removeLineMarker); diff --git a/addons/maptools/functions/fnc_mapStateUpdater.sqf b/addons/maptools/functions/fnc_mapStateUpdater.sqf deleted file mode 100644 index 2b4e634567..0000000000 --- a/addons/maptools/functions/fnc_mapStateUpdater.sqf +++ /dev/null @@ -1,33 +0,0 @@ - -#include "script_component.hpp" - -if (visibleMap) then { - // Show/Hide draw buttons - if ("ACE_MapTools" in items ACE_player) then { - { ((finddisplay 12) displayctrl _x) ctrlShow true; } forEach GVAR(drawing_controls); - } else { - { ((finddisplay 12) displayctrl _x) ctrlShow false; } forEach GVAR(drawing_controls); - if (GVAR(drawing_isDrawing)) then { - call FUNC(cancelDrawing); - }; - }; -}; - -//When Map is Closed: -if (GVAR(mapVisableLastFrame) && (!visibleMap)) then { - GVAR(mapVisableLastFrame) = false; - // Hide GPS - [false] call FUNC(openMapGps); - // Cancel drawing - call FUNC(cancelDrawing); -}; - -//When Map is Opened: -if ((!GVAR(mapVisableLastFrame)) && (visibleMap)) then { - //todo: "mapOpened" Event???? - GVAR(mapVisableLastFrame) = true; - // Show and update map tools if required - [] call FUNC(updateMapToolMarkers); - // Show GPS if required - [GVAR(mapGpsShow)] call FUNC(openMapGps); -}; diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index fa6db8872a..959be6752e 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -20,6 +20,16 @@ PARAMS_1(_theMap); private ["_rotatingTexture", "_textureWidth", "_scale", "_xPos", "_yPos"]; +// Show/Hide draw buttons +if ("ACE_MapTools" in items ACE_player) then { + { ((finddisplay 12) displayctrl _x) ctrlShow true; } forEach GVAR(drawing_controls); +} else { + { ((finddisplay 12) displayctrl _x) ctrlShow false; } forEach GVAR(drawing_controls); + if (GVAR(drawing_isDrawing)) then { + call FUNC(cancelDrawing); + }; +}; + if (!("ACE_MapTools" in items ACE_player)|| {GVAR(mapTool_Shown) == 0}) exitWith {}; _rotatingTexture = ""; From 5609ec7b6b90233cdfbadac5ea093296e6902cc1 Mon Sep 17 00:00:00 2001 From: Jonathan Pereira Date: Sat, 25 Jul 2015 12:56:50 -0300 Subject: [PATCH 002/137] Added PT-BR translations New PT-BR translations, including the slideshow and spectator module. --- addons/interact_menu/stringtable.xml | 3 +++ addons/interaction/stringtable.xml | 9 +++++---- addons/medical/stringtable.xml | 6 ++++++ addons/slideshow/stringtable.xml | 13 +++++++++++++ addons/spectator/stringtable.xml | 15 +++++++++++++++ 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 5ab782803d..736b520f94 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -90,6 +90,7 @@ Akcje Zeusa Akce Zeuse Acciones Zeus + Ações do Zeus Interaction - Text Max @@ -256,12 +257,14 @@ Pokazuj akcje dla budynków Zobrazit akci pro budovy Mostrar acciones para edificios + Mostrar ações para edifícios Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns) 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. 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.) 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) + Adiciona ações de interações para abrir portas e montar escadas em edifícios. (Nota: Existe um custo de performance quando aberto o menu de interação, especialmente em cidades) \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 5bd3282872..7e5eca1947 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -798,6 +798,7 @@ Otwórz Otevřít Abrir + Abrir Interaction System @@ -805,7 +806,7 @@ Sistema de interacción Interaktionssystem Systém interakce - Sistema de interação + Sistema de interação Enable Team Management @@ -813,7 +814,7 @@ Habilitar gestión de equipos Aktiviere Gruppenverwaltung Povolit správu týmu - Habilitar gestão de equipes + Habilitar gestão de equipes Should players be allowed to use the Team Management Menu? Default: Yes @@ -821,15 +822,15 @@ ¿Deben tener permitido los jugadores el uso del menu de gestión de equipos? Por defecto: Si Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja Mohou hráči použít menu správy týmu? Výchozí: Ano - Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim + Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim Team management allows color allocation for team members, taking team command and joining/leaving teams. Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. - O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. 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. + 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. \ No newline at end of file diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 5ceb625f59..b65343d1bf 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -3193,11 +3193,13 @@ Condition PAK Podmínka osobní lékárničky Condición EPA + Condição do KPS When can the Personal Aid Kit be used? Kde může být použita osobní lékárnička? ¿Cuando se puede utilizar el Equipo de primeros auxilios? + Onde o kit de primeiros socorros pode ser utilizado? Anywhere @@ -3302,11 +3304,13 @@ Condition Surgical kit (Adv) Podmínka chirurgické soupravy (Pokr.) Condición de equipo quirúrgico (Av) + Condição do Kit Cirúrgico (Avançado) When can the Surgical kit be used? Kde může být použita chirurgická souprava? ¿Cuando se puede utilizar el equipo quirúrgico? + Onde o kit cirúrgico pode ser utilizado? Bloodstains @@ -3635,11 +3639,13 @@ Anytime Kdykoli Siempre + Sempre Stable Stabilní Estable + Estável \ No newline at end of file diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 63547c06e2..98e8b0e236 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -3,42 +3,55 @@ Slideshow + Apresentação de Slides This module allows you to set up slide-shows on different objects. One module per image list. Only objects with hiddenSelection 0 are supported. + Este módulo permite que você monte apresentações de slides em diferentes objetos. Um módulo por lista de imagem. Somente objetos com hiddenSelection 0 são suportados. Objects + Objetos Object names (can also be synchronized objects) slide-show will be displayed on, separated by commas if multiple. Reference INFO for object support. + Nomes dos objetos (também podem ser objetos sincronizados) em que a apresentação de slides será mostrada, separado por vírgulas se for mais de um. Referência INFO para suporte do objeto. Controllers + Controles Controller object names, separated by commas if multiple. + Nome dos objetos de controle, separado por vírgula se mais de um. Images + Imagens List of images that will be used for the slide-show, separated by commas, with full path correctly formatted (eg. images\image.paa). + Lista das imagens que serão utilizadas na apresentação de slides, separadas por vírgula, com o caminho completo corretamente formatado (ex: imagens\imagem.paa). Interaction Names + Nomes de Interação List of names that will be used for interaction entries, separated by commas, in order of images. + Lista dos nomes que serão usados para entradas de interação, separados por vírgulas, na ordem das imagens. Slide Duration + Duração do Slide Duration of each slide. Default: 0 (Automatic Transitions Disabled) + Duração de cada slide. Padrão: 0 (Transição automática desabilitada) Slides + Slides \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 5cd585108a..a4865cdb9c 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -6,90 +6,105 @@ Obserwator Pozorovatel Espectador + Espectador Enable Spectator Aktywuj obserwatora Povolit pozorovatele Activar espectador + Ativar espectador Begin spectating on player death? Włącz obserwatora po śmierci gracza? Přepnout do pozorovatele po hráčově smrti? ¿Comenzar como espectador al morir el jugador? + Começar como espectador após morte de jogador? Player Side Only Tylko strona gracza Pouze strana hráče Sólo bando del jugador + Somente lado do jogador Only spectate units belonging to player's side? Pozwól obserwować jednostki będące tylko po stronie gracza? Pozorovat pouze jednotky patřící k hráčově straně? ¿Sólo observar unidades que pertenecen al bando del jugador? + Somente observar unidades que pertençam ao lado do jogador? Spectate AI Obserwacja AI Pozorovat AI Observar IA + Observar IA Allow spectating of AI units? Pozwól obserwować jednostki AI? Umožnit pozorovat AI jednotky? ¿Permitir observar unidades de la IA? + Permitir observar unidades da IA? Track Units Śledź jednostki Sledovat jednotky Seguir unidades + Rastrear unidades Track units' movements throughout mission? Śledź ruch jednostek w trakcie misji? Sledovat pohyby jednotek napříč misí? ¿Seguimiento de movimientos de unidades a lo largo de la misión? + Rastrear unidades ao longo da missão? Start Position Pozycja startowa Počáteční pozice Posición de inicio + Posição de início Use this module as a starting position for spectator camera? Użyj pozycji modułu jako pozycje startową dla kamery obserwatora? Použít tento modul jako počáteční pozici pro pozorovací kameru? ¿Utiliza este módulo como una posición de inicio para la cámara de espectador? + Usar este módulo como uma posição de início para a câmera do espectador? End Mission Zakończ misję Konec mise Finalizar misión + Finalizar missão End mission when all players dead (default BIS behaviour)? Zakończ misję kiedy wszyscy gracze będą martwi (domyślne zachowanie BIS)? Ukončit misi když umřou všichni hráči (výchozí BIS chování)? ¿Finalizar misión cuando todos los jugadores mueran (comportamiento por defecto de BIS)? + Finalizar missão quando todos os jogadores estiverem mortos (Comportamento padrão da BIS)? View Distance Zasięg widzenia Dohlednost Distancia de visión + Distância de visão OK OK OK Aceptar + OK \ No newline at end of file From d0f91c5ebfdbfe6f68a1f79da45200afcebe4103 Mon Sep 17 00:00:00 2001 From: Harakhti Date: Thu, 30 Jul 2015 14:40:51 +0200 Subject: [PATCH 003/137] Row 1 Not a miracle, but it's something. --- addons/advanced_ballistics/stringtable.xml | 24 +++++ addons/ballistics/stringtable.xml | 1 + addons/captives/stringtable.xml | 10 +- addons/common/stringtable.xml | 18 +++- addons/explosives/stringtable.xml | 10 +- addons/finger/stringtable.xml | 12 ++- addons/frag/stringtable.xml | 4 +- addons/hearing/stringtable.xml | 4 +- addons/interact_menu/stringtable.xml | 9 +- addons/interaction/stringtable.xml | 5 + addons/map/stringtable.xml | 8 ++ addons/medical/stringtable.xml | 106 +++++++++++++++++++++ addons/microdagr/stringtable.xml | 9 +- addons/missileguidance/stringtable.xml | 3 + addons/missionmodules/stringtable.xml | 9 ++ addons/mk6mortar/stringtable.xml | 6 +- addons/mx2a/stringtable.xml | 4 +- addons/optionsmenu/stringtable.xml | 21 +++- addons/parachute/stringtable.xml | 4 +- addons/rangecard/stringtable.xml | 9 +- addons/respawn/stringtable.xml | 12 ++- addons/sitting/stringtable.xml | 5 + addons/tacticalladder/stringtable.xml | 11 ++- 23 files changed, 280 insertions(+), 24 deletions(-) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index b30485aae6..45e0d042a5 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -32,6 +32,7 @@ Erweiterte Ballistik Pokročilá balistika Balística avançada + Fejlett ballisztika Advanced Ballistics @@ -40,6 +41,7 @@ Erweiterte Ballistik Pokročilá balistika Balística avançada + Fejlett ballisztika Enables advanced ballistics @@ -48,6 +50,7 @@ Aktiviert die erweiterte Ballistik Aktivuje pokročilou balistiku Ativa balística avançada + Engedélyezi a fejlett ballisztikát Enabled For Snipers @@ -56,6 +59,7 @@ Für Scharfschützen aktiviert Povoleno pro odstřelovače Ativar para caçadores + Mesterlövészeknek engedélyezve Enables advanced ballistics for non local snipers (when using high power optics) @@ -64,6 +68,7 @@ Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung) Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku) Ativa balística avançada para caçadores não locais (quando usando miras telescópicas) + Engedélyezi a fejlett ballisztikát nem-helyi mesterlövészeknek (nagy-teljesítményű optika használatakor) Enabled For Group Members @@ -72,6 +77,7 @@ Für Gruppenmitglieder aktiviert Povoleno pro členy skupiny Ativada para membros do grupo + Csoporttagoknak engedélyezve Enables advanced ballistics for non local group members @@ -80,6 +86,7 @@ Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder Aktivuje pokročilou balistiku pro nelokální členy skupiny Ativa balística avançada para membros de grupo não locais + Engedélyezi a fejlett ballisztikát nem-helyi csoporttagoknak Enabled For Everyone @@ -88,6 +95,7 @@ Für jeden aktiviert Povoleno pro všechny Ativada para todos + Mindenkinek engedélyezve Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer) @@ -96,6 +104,7 @@ Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen) Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru) Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer) + Engedélyezi a fejlett ballisztikát az összes nem-helyi játékosnak (ez a funkció leronthatja a teljesítményt intenzív többjátékos tűzharcok alatt) Always Enabled For Group Members @@ -104,6 +113,7 @@ Für Gruppenmitglieder immer aktiviert Vždy povoleno pro členy skupiny Sempre ativada para membros do grupo + Mindig engedélyezve csoporttagoknak Always enables advanced ballistics when a group member fires @@ -112,6 +122,7 @@ Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt Aktivuje pokročilou balistiku pro členy skupiny Sempre ative balística avançada quando um membro do grupo disparar + Mindig engedélyezi a fejlett ballisztikát, ha egy csoporttag tüzel Disabled In FullAuto Mode @@ -120,6 +131,7 @@ Beim vollautomatischen Feuern deaktiviert Zakázáno v automatickém režimu střelby Desabilitar no modo automático + Automata módban letiltva Disables the advanced ballistics during full auto fire @@ -128,6 +140,7 @@ Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern Zákáže pokročilou balistiku během střelby v režimu automat Desabilitar a balística avançada durante fogo automático + Letiltja a fejlett ballisztikát automata tüzelés folyamán Enable Ammo Temperature Simulation @@ -136,6 +149,7 @@ Simulation der Munitionstemperatur aktivieren Povolit simulaci teploty munice Ativar simulação de temperatura de munição + Lőszer-hő szimuláció engedélyezése Muzzle velocity varies with ammo temperature @@ -144,6 +158,7 @@ Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit Úsťová rychlost je závislá na teplotě munice A velocidade de saída varia com a temperatura da munição + A kezdősebesség a lőszer hőmérsékletétől függően változó Enable Barrel Length Simulation @@ -152,6 +167,7 @@ Simulation der Lauflänge aktivieren Povolit simulaci délky hlavně Ativar a simulação de comprimento do cano + Csőhossz-szimuláció engedélyezése Muzzle velocity varies with barrel length @@ -160,6 +176,7 @@ Lauflänge beeinflusst Mündungsgeschwindigkeit Úsťová rychlost je závislá na délce hlavně A velocidade de saída caria com o comprimento do cano + A kezdősebesség a cső hosszától függően változó Enable Bullet Trace Effect @@ -168,6 +185,7 @@ Geschossspureffekt aktivieren Povolit efekt trasírek Ativa efeito traçante de projétil + Nyomkövető-effekt engedélyezése Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics) @@ -176,6 +194,7 @@ Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) + Engedélyezi a nagy kaliberű lövedékek nyomának vizuális követését (csak nagy teljesítményű optikán keresztül látható) Simulation Interval @@ -184,6 +203,7 @@ Simulationsintervall Interval simulace Intervalo da simulação + Szimuláció intervalluma Defines the interval between every calculation step @@ -192,6 +212,7 @@ Legt das Intervall zwischen den Berechnungsschritten fest Určuje interval mezi každým výpočtem Define o intervalo entre cada cálculo + Meghatározza a számítási lépések közötti időintervallumot Simulation Radius @@ -200,6 +221,7 @@ Simulationsradius Rozsah simulace Raio de simulação + Szimuláció hatóköre Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles @@ -208,12 +230,14 @@ Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis + Meghatározza a játékos körüli hatókört (méterben), ahol a lövedékek fejlett ballisztikát használnak This module enables advanced ballistics simulation - meaning the trajectory of projectiles is influenced by variables like air temperature, atmospheric pressure, humidity, gravity, the type of ammunition and the weapon from which it was fired. Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. + Ez a modul engedélyezi a fejlett ballisztikai szimulációt - a lövedékek röppályáját befolyásolni fogja a levegő hőmérséklete, légnyomás, páratartalom, gravitáció, a lövedék fajtája, valamint a fegyver, amiből kilőtték a lövedéket. \ No newline at end of file diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index db44078980..70591dcbfe 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -1599,6 +1599,7 @@ [ACE] Munitionskiste [ACE] Bedna s municí [ACE] Caixa com suprimentos de munição + [ACE] Lőszeres láda \ No newline at end of file diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 39cf65cac7..dfeea70c34 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -164,6 +164,7 @@ Einheit kapitulieren lassen Vzdávající se jednotka Fazer unidade se render + Egység kapitulálása Sync a unit to make them surrender.<br />Source: ace_captives @@ -172,6 +173,7 @@ Einheit synchronisieren, um sie kapitulieren zu lassen.<br />Quelle: ace_captives Synchronizuj s jednotkou, která se má vzdát.<br />Zdroj: ace_captives Sincroniza uma unidade para fazer com que ela se renda. <br/>Fonte: ace_captives + Egység szinkronizálása, hogy kapituláljon.<br />Forrás: ace_captives Captives Settings @@ -180,6 +182,7 @@ Nastavení zajatce Gefangenen-Einstellungen Ajustes de prisioneiros + Fogoly-beállítások Controls settings for surrender and cable ties @@ -188,6 +191,7 @@ Toto kontroluje nastavení kapitulace a pout Einstellungen zur Kapitulation und Kabelbindern Controla as configurações de rendição e abraçadeiras + Szabályozza a kapituláció és bilincselés beállításait Can handcuff own side @@ -196,6 +200,7 @@ Může spoutat spolubojovníky Kann Teamkollegen fesseln Pode algemar o próprio lado + Saját oldal megbilincselhető Can players cabletie units on their own side @@ -204,6 +209,7 @@ Mohou hráči spoutat jednotky na své straně Können Spieler eigene Einheiten fesseln Os jogadores podem algemar unidades do seu lado + A játékosok megkötözhetik-e a saját oldalukon lévő egységeket Allow surrendering @@ -212,6 +218,7 @@ Povolit vzdávání Kapitulation erlauben Permite rendição + Kapituláció engedélyezése Players can surrender after holstering their weapon @@ -220,6 +227,7 @@ Hráč se může vzdát poté, co si skryje zbraň Spieler können kapitulieren, nachdem sie ihre Waffe geholstert haben Jogadores podem se render depois de guardar sua arma + A játékosok megadhatják magukat a fegyverük elrakása után - + \ No newline at end of file diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 6ed5e10d5a..b1faab907e 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -477,9 +477,9 @@ Überprüfe PBOs Zkontrolovat PBO Verificar PBOs + PBO-k ellenőrzése - Sprawdzaj spójność addonów z serwerem Este módulo verifica la integridad de los addons con los que iniciamos el simulador Dieses Modul überprüft ob jeder Spieler die richtigen PBO-Dateien hat. @@ -493,6 +493,7 @@ Aktion Akce Ação + Cselekvés What to do with people who do not have the right PBOs? @@ -501,6 +502,7 @@ Was soll mit Leuten passieren, die nicht die richtigen PBOs haben? Co udělat s lidmi, co nemají správné addony? O que fazer com pessoas que não tem os PBOs corretos? + Mi legyen azokkal a személyekkel, akiknek nincsenek meg a helyes PBO-k? Warn once @@ -509,6 +511,7 @@ Einmal verwarnen Upozornit jednou Avisar uma vez + Egyszeri figyelmeztetés Warn (permanent) @@ -517,6 +520,7 @@ Immer verwarnen Upozornit (permanentně) Avisar (permanente) + Figyelmeztetés (tartós) Kick @@ -525,6 +529,7 @@ Kicken Vyhodit Chutar + Kirúgás Check all addons @@ -533,6 +538,7 @@ Alle Addons überprüfen Zkontrolovat všechny addony Verificar todos addons + Összes bővítmény ellenőrzése Check all addons instead of only those of ACE? @@ -541,6 +547,7 @@ Alle Addons anstatt nur ACE überprüfen? Zkontrolovat všechny addony namísto jen těch od ACE? Verificar todos addons invés de só os do ACE? + Az összes bővítmény ellenőrzése, csak az ACE helyett? Whitelist @@ -549,6 +556,7 @@ Whitelist Seznam povolených Lista branca + Fehérlista What addons are allowed regardless? @@ -557,6 +565,7 @@ Welche Addons werden dennoch erlaubt? Jaké addony jsou povoleny? Quais addons são permitidos de qualquer maneira? + Milyen bővítmények vannak feltétlenül engedélyezve? LSD Vehicles @@ -565,6 +574,7 @@ LSD-Fahrzeuge LSD vozidla Veículos LSD + LSD járművek Adds LSD effect to synchronized vehicle @@ -573,6 +583,7 @@ Fügt einen LSD-Effekt zum synchronisierten Fahrzeug hinzu Přidá LSD efekt pro synchronizované vozidla Adiciona efeito LSD ao veículo sincronizado + LSD-effekt hozzáadása a szinkronizált járművekhez Toggle Handheld Device @@ -581,6 +592,7 @@ Ativa dispositivo de mão Przełącz urządzenie podręczne Přepnout ruční zařízení + Kézi eszköz kapcsolása Close Handheld Device @@ -589,6 +601,7 @@ Fecha dispositivo de mão Zamknij urządzenie podręczne Zavřít ruční zařízení + Kézi eszköz bezárása Cycle Handheld Devices @@ -597,6 +610,7 @@ Troca dispositivos de mão Następne urządzenie podręczne Procházet ruční zařízení + Kézi eszköz váltása - + \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index a985b428c1..b4b9f7c7cf 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -476,7 +476,7 @@ Spínač mrtvého muže Czuwak Detonador de hombre muerto - Dead Man's Switch + Halott ember kapcsolója Detonador do homem morto Кнопка мертвеца Detonatore a rilascio @@ -512,6 +512,7 @@ Sprengstoffsystem Systém výbušnin Sistema de explosivos + Robbanóanyag-rendszer Require specialists? @@ -520,6 +521,7 @@ Benötigt Sprengstoffexperten? Vyžadovat specialistu? Requer especialista? + Specialisták igénylése? Require explosive specialists to disable explosives? Default: No @@ -528,6 +530,7 @@ Benötige Sprengstoffexperte um Sprengladungen zu entschärfen? Standard: Nein Vyžadovat specialistu na zneškodnění výbušniny? Výchozí: Ne Requer especialista em explosivos para desativar explosivos? Padrão: Não + Szükséges-e egy specialista a robbanóanyagok hatástalanításához? Alapértelmezett: Nem Punish non-specialists? @@ -536,6 +539,7 @@ Bestrafe Nicht-Sprengstoffexperten? Potrestat, pokud není specialista? Punir não especialistas? + Nem-specialisták büntetése? Increase the time it takes to complete actions for non-specialists? Default: Yes @@ -544,6 +548,7 @@ Entschärfungszeit für Nicht-Sprengstoffexperten erhöhen? Standard: Ja Zvýšit čas potřebný k dokončení akce pokud není specialista? Výchozí: Ano Aumentar o tempo necessário para completar ações por não especialistas? Padrão: Sim + Nem-specialisták esetén több ideig tartson a cselekvés befejezése? Alapértelmezett: Igen Explode on defusal? @@ -551,6 +556,7 @@ Eksplozja przy rozbrajaniu? Explodovat při zneškodňování? Explotar al desactivar? + Robbanás hatástalanításkor? Enable certain explosives to explode on defusal? Default: Yes @@ -558,6 +564,7 @@ Spraw, aby niektóre ładunki wybuchowe eksplodowały przy próbie ich rozbrojenia? Domyślnie:Tak Umožnit u některých výbušnin explozi při pokusu je zneškodnit? Výchozí: Ano ¿Habilitar ciertos explosivos para estallar al desactivar? Por defecto: Sí + Meghatározott robbanóanyagok felrobbanjanak-e hatástalanításkor? Alapértelmezett: Igen This module adjusts the settings related to explosives. @@ -565,6 +572,7 @@ Dieses Modul erlaubt die Einstellungen für Sprengstoffe zu verändern. Tento modul umoňuje přizpůsobit nastavení týkajících se výbušnin. Este módulo permite personalizar as definições relacionadas a explosivos. + Ez a modul a robbanóanyagokhoz kötött beállításokat szabályozza. \ No newline at end of file diff --git a/addons/finger/stringtable.xml b/addons/finger/stringtable.xml index bbc308fcd7..57fab198fb 100644 --- a/addons/finger/stringtable.xml +++ b/addons/finger/stringtable.xml @@ -4,37 +4,47 @@ Show finger indicator to self Отображать пальце-индикатор для показывающего игрока + Saját mutatási indikátor megjelenítése Render the indicator for the pointing player. This option doesn't affect whether the other players would see the indicator Отображать индикатор для показывающего игрока. Эта настройка не влияет на то, будутт ли другие игроки видеть индикатор + Az indikátor megjelenítése a mutató játékosnak. Ez a beállítás nem változtat azon, hogy más játékosok látják-e az indikátort. Finger indicator Пальце-индикатор + Ujj-indikátor Color of the finger-pointing indicator circle Цвет индикатора пальце-указания + Mutatási indikátor körének színe Action "point a finger at" Действие "показать пальцем на" + Cselekvés "ujj rámutatása" Points, and shows a virtual marker of where you are looking to nearby units. Can be held down. + Mutat, és elhelyez egy virtuális jelölőt a nézett területhez közeli egységekhez. Lenyomva tartható. Finger Settings + Ujj beállításai Finger Pointing Enabled + Mutatás engedélyezése Finger Max Range + Ujj maximum hatótávja How far away players can finger each other. [default: 4] + Milyen messziről ujjazhatják egymást a játékosok. [alapértelmezett: 4] - + \ No newline at end of file diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 5a59b15a4a..c4fac44ec0 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -8,6 +8,7 @@ Splittersimulation Simulace fragmentace Simulação de fragmentação + Repesz-szimuláció Enable the ACE Fragmentation Simulation @@ -16,6 +17,7 @@ Aktiviere die ACE-Splittersimulation Povolit ACE simulaci fragmentace Ativa a simulação de fragmentação do ACE + Az ACE repesz-szimuláció engedélyezése Spalling Simulation @@ -82,4 +84,4 @@ (Somente SP) Requer um reinício de missão / editor. Habilita o rastreamento visual de projéteis de fragmentação e estilhaçamento apenas no modo de jogo SP. - + \ No newline at end of file diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index dbd063b752..6316e06043 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -116,6 +116,7 @@ Gehör Sluch Audição + Hallás Enable combat deafness? @@ -124,6 +125,7 @@ Aktiviere Taubheit im Gefecht? Povolit ztrátu sluchu? Ativar surdez em combate? + Harci süketség engedélyezése? Enable combat deafness? @@ -132,9 +134,9 @@ Aktiviere Taubheit im Gefecht? Povolit ztrátu sluchu? Ativar surdez em combate? + Harci süketség engedélyezése? - Głuchota bojowa pojawia się w momentach, kiedy stoimy w pobliżu broni wielkokalibrowej bez ochrony słuchu, lub np. podczas ostrzału artyleryjskiego. Moduł ten pozwala na włączenie lub wyłączenie tego efektu. Dieses Modul aktiviert/deaktiviert die Taubheit im Gefecht. Wenn aktiviert, können Spieler ohne Gehörschutz taub werden, wenn eine Waffe in ihrer Nähe abgefeuert wird oder eine Explosion stattfindet. Ztráta sluchu je možná ve chvíly, kdy se v bezprostřední blízkosti střílí z velkorážní zbraně nebo při bombardování a osoba je bez ochrany sluchu (např. špunty). Tento modul umožňuje tuto věc povolit nebo zakázat. diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index b55e8483a1..3963125481 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -90,6 +90,7 @@ Akcje Zeusa Akce Zeuse Acciones Zeus + Zeus cselekvések Interaction - Text Max @@ -230,6 +231,7 @@ Pozadí menu interakce Interaktionsmenü-Hintergrund Fundo do menu de interação + Cselekvő menü háttere Blur the background while the interaction menu is open. @@ -238,6 +240,7 @@ Rozmazat obraz pokud je interakční menu otevřené. Den Hintergrund verschwimmen lassen, während das Interaktionsmenü geöffnet ist. Desfocar o fundo enquanto o menu de interação está aberto. + A háttér elmosása a cselekvő menü használata alatt. Blur screen @@ -246,6 +249,7 @@ Rozmazaný obraz Verschwommenes Bild Desfoque de tela + Kép elmosása Black @@ -254,18 +258,21 @@ Černý obraz Preto Schwarz + Fekete Show actions for buildings Pokazuj akcje dla budynków Zobrazit akci pro budovy Mostrar acciones para edificios + Cselekvések mutatása épületeknél Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns) 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. 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.) 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) + Cselekvéseket engedélyez ajtók kinyitására és létrák mászására. (Figyelem: ez teljesítményvesztéssel járhat a menü megnyitásakor, főleg városokban) - + \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 5bd3282872..34a20f4df9 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -798,6 +798,7 @@ Otwórz Otevřít Abrir + Nyitás Interaction System @@ -806,6 +807,7 @@ Interaktionssystem Systém interakce Sistema de interação + Interakciós rendszer Enable Team Management @@ -814,6 +816,7 @@ Aktiviere Gruppenverwaltung Povolit správu týmu Habilitar gestão de equipes + Csapatkezelés engedélyezése Should players be allowed to use the Team Management Menu? Default: Yes @@ -822,6 +825,7 @@ Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja Mohou hráči použít menu správy týmu? Výchozí: Ano Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim + A játékosoknak engedélyezve legyen a csapatkezelő menü? Alapértelmezett: Igen Team management allows color allocation for team members, taking team command and joining/leaving teams. @@ -830,6 +834,7 @@ Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. 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. + A csapatkezelés engedélyezi a tagok színének meghatározását, a vezetés átvételét, és csapatoknál be-és kilépést. \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 3f2d312fae..793dd88599 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -8,6 +8,7 @@ Karte Mapa Mapa + Térkép Map illumination? @@ -87,6 +88,7 @@ Blue Force Tracking Blue Force Tracking Rastreio de forças azuis + Blue Force követés BFT Enable @@ -94,6 +96,7 @@ Aktywuj BFT Povolit BFT Activar BFT + BFT engedélyezése Enable Blue Force Tracking. Default: No @@ -101,6 +104,7 @@ Aktywuj Blue Force Tracking. Domyślnie: Nie Povolit Blue Force Tracking. Výchozí: Ne Activar Blue Force Tracking. Por defecto: No + Blue Force követés engedélyezése. Alapértelmezett: Nem Interval @@ -109,6 +113,7 @@ Intervall Interval Intervalo + Intervallum How often the markers should be refreshed (in seconds) @@ -117,6 +122,7 @@ Wie oft sollen die Markierungen aktualisiert werden (in Sekunden) Jak často budou značky aktualizovány (v sekundách) Frequência em que os marcadores devem ser atualizados (em segundos) + Milyen gyakran frissüljenek a jelölők (másodpercben) Hide AI groups? @@ -125,6 +131,7 @@ KI-Gruppen verstecken? Skrýt AI skupiny? Esconder grupos de IA? + AI csoportok elrejtése? Hide markers for 'AI only' groups? @@ -133,6 +140,7 @@ Verstecke Marker für "nur KI"-Gruppen? Skrýt značky pouze pro AI skupiny? Esconder marcadores que pertencem ao grupo de IA? + Jelölők elrejtése "csak AI" csoportoknál? This module allows the tracking of allied units with BFT map markers. diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 32c38397c0..8fe1afa08e 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1593,6 +1593,7 @@ Keine Žádný Nada + Nincs Weak @@ -2213,6 +2214,7 @@ Obvázání odstraňuje skvrny od krve El vendaje elimina las manchas de sangre Bandagem remove manchas de sangue + A kötözés eltávolítja a vérfoltokat Pain is only temporarily suppressed @@ -2221,6 +2223,7 @@ Bolest je potlačena pouze dočasně El dolor se suprime solo temporalmente Dor é suprimida somente temporáriamente + A fájdalom csak ideiglenesen csökken Pain Effect Type @@ -2734,6 +2737,7 @@ ACE-Medicsystem ACE Zdravotnické ACE Médico + ACE Orvosi Rendszer Medical Settings [ACE] @@ -2743,6 +2747,7 @@ Medizinische Einstellungen [ACE] Lékařské nastavení [ACE] Ajustes médicos [ACE] + Orvosi beállítások [ACE] Medical Level @@ -2752,6 +2757,7 @@ Medizinisches Level Úroveň medického Nível médico + Orvosi szint What is the medical simulation level? @@ -2761,6 +2767,7 @@ Wie hoch soll das medizinische Simulationslevel sein? Jaká je úroveň lékařské simulace? Qual o nível de simulação médica? + Milyen komplex legyen az orvosi szimuláció? Basic @@ -2770,6 +2777,7 @@ Standard Základní Básica + Alap Advanced @@ -2779,6 +2787,7 @@ Erweitert Pokročilé Avançada + Fejlett Medics setting @@ -2788,6 +2797,7 @@ Medizinische Einstellungen Úroveň zdravotníků Configuração médica + Orvosok beállítása What is the level of detail prefered for medics? @@ -2796,6 +2806,7 @@ ¿Cuál es el nivel de detalle preferido para los médicos? Jaká úroveň detailů je preferována pro zdravotníky? Qual o nível de detalhe preferido para os médicos? + Mi a javasolt részletesség orvosok számára? Disable medics @@ -2805,6 +2816,7 @@ Sanitäter deaktivieren Zakázat zdravotníky Desativar médicos + Orvosok letiltása Enable Litter @@ -2814,6 +2826,7 @@ Abfälle aktivieren Povolit odpadky Ativar lixo médico + Szemét engedélyezése Enable litter being created upon treatment @@ -2823,6 +2836,7 @@ Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde Vytváří odpad zdravotnického materiálu pří léčení Ativar lixo ser criado após tratamento + Engedélyezi a szemét keletkezését ellátáskor Life time of litter objects @@ -2832,6 +2846,7 @@ Dauer des angezeigten Abfalls Životnost pro odpadky Tempo de vida dos objetos do lixo + Szemétobjektumok élettartama How long should litter objects stay? In seconds. -1 is forever. @@ -2841,6 +2856,7 @@ Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer. Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy. Quanto tempo os objetos do lixo devem ficar? Em segundos. -1 é para sempre. + Milyen sokáig legyenek jelen a szemétobjektumok (másodpercben)? A -1 végtelen időt jelent. Enable Screams @@ -2850,6 +2866,7 @@ Schreie aktivieren Povolit křik Ativar gritos + Kiáltások engedélyezése Enable screaming by injuried units @@ -2859,6 +2876,7 @@ Aktiviere Schreie bei verletzten Einheiten Povolit křičení zraněných jednotek Ativa gritos para unidades feridas + Engedélyezi a sérült egységek kiáltásait Player Damage @@ -2868,6 +2886,7 @@ Spielerschaden Poškození hráče Dano do jogador + Játékos sérülés What is the damage a player can take before being killed? @@ -2877,6 +2896,7 @@ Wie viel Schaden kann ein Spieler erleiden, bevor er getötet wird? Jaké poškození může hráč dostat než bude zabit? Qal é o dano que um jogador pode sofrer antes de morrer? + Mennyi sérülést szenvedhet el egy játékos, mielőtt meghal? AI Damage @@ -2886,6 +2906,7 @@ KI-Schaden Poškození AI Dano da IA + AI sérülés What is the damage an AI can take before being killed? @@ -2895,6 +2916,7 @@ Wie viel Schaden kann eine KI erleiden, bis sie getötet wird? Jaké poškození může AI dostat než bude zabito? Qual é o dano que uma IA pode sofrer antes de morrer? + Mennyi sérülést szenvedhet el egy AI, mielőtt meghal? AI Unconsciousness @@ -2904,6 +2926,7 @@ KI-Bewusstlosigkeit Bezvědomí AI Inconsciência da IA + AI eszméletlenség Allow AI to go unconscious @@ -2913,6 +2936,7 @@ KI kann bewusstlos werden Umožňuje AI upadnout do bezvědomí Permite IA ficar inconsciente + Engedélyezi az AI eszméletének elvesztését Remote Controlled AI @@ -2920,6 +2944,7 @@ IA controlada remotamente Zdalnie sterowane AI Vzdáleně ovládané AI + Távvezérelt AI Treat remote controlled units as AI not players? @@ -2927,6 +2952,7 @@ Tratar unidades remotamente controladas como IA? Traktuj jednostki zdalnie sterowane (przez Zeusa) jako AI, nie jako graczy? Ošetřit vzdáleně ovládané jednotky jako AI, ne jako hráče? + Távvezérelt egységek AI-ként, nem játékosként való kezelése? Disabled @@ -2936,6 +2962,7 @@ Deaktiviert Zakázáno Desativado + Letiltva Enabled @@ -2945,6 +2972,7 @@ Aktiviert Povoleno Ativado + Engedélyezve Prevent instant death @@ -2954,6 +2982,7 @@ Verhindere direkten Tod Zabránit okamžité smrti Previnir morte instantânea + Azonnali halál kiiktatása Have a unit move to unconscious instead of death @@ -2963,6 +2992,7 @@ Lässt eine Einheit bewusstlos werden anstatt zu sterben Jednotka upadne do bezvědomí namísto smrti Fazer a unidade ficar inconsciente invés de morrer + Egy egység kerüljön eszméletlen állapotba a halott helyett Bleeding coefficient @@ -2972,6 +3002,7 @@ Verblutungsmultiplikator Koeficient krvácení Coeficiente de sangramento + Vérzési koefficiens Coefficient to modify the bleeding speed @@ -2981,6 +3012,7 @@ Multiplikator um die Verblutungsgeschwindigkeit zu verändern Koeficient rychlosti krvácení Coeficiente para modificar a velocidade do sangramento + Egy szorzó a vérzés sebességének szabályozására Pain coefficient @@ -2990,6 +3022,7 @@ Schmerzmultiplikator Koeficient bolesti Coeficiente de dor + Fájdalmi koefficiens Coefficient to modify the pain intensity @@ -2999,6 +3032,7 @@ Multiplikator um den Schmerzintensität zu verändern Koeficient intenzity bolesti Coeficiente para modificar a instensidade de dor + Egy szorzó a fájdalom erősségének szabályozására Sync status @@ -3008,6 +3042,7 @@ Status synchronisieren Synchronizovat status Sincronizar estado + Szinkronizációs állapot Keep unit status synced. Recommended on. @@ -3017,6 +3052,7 @@ Status der Einheit synchron halten. Sollte aktiviert bleiben. Udržuje status jednotky synchronizovaný. Doporučeno zapnout. Mater o estado da unidade sincronizado. Recomendado ativado. + Egységállapotok szinkronizálása. Javasolt a bekapcsolása. Provides a medical system for both players and AI. @@ -3026,6 +3062,7 @@ Aktiviert ein medizinisches System für Spieler und KI. Poskytuje zdravotní systém pro hráče a AI. Proporciona o sistema médico para os jogadores e a IA. + Egy orvosi rendszert ad játékosok és AI-k számára. Advanced Medical Settings [ACE] @@ -3035,6 +3072,7 @@ Erweiterte medizinische Einstellungen [ACE] Pokročilé zdravotnické nastavení [ACE] Ajustes médicos avançados [ACE] + Fejlett orvosi beállítások [ACE] Enabled for @@ -3044,6 +3082,7 @@ Aktiviert für Povoleno pro Habilitado para + Engedélyezve... Select what units the advanced medical system will be enabled for @@ -3053,6 +3092,7 @@ Wähle aus welche Einheiten das erweiterte medizinische System haben Vyberte, pro jaké jednotky bude pokročilý zdravotní systém povolen Selecione quais unidades o sistema médico avançado será habilitado + Kiválasztható, mely egységek számára legyen engedélyezve a fejlett orvosi rendszer Players only @@ -3062,6 +3102,7 @@ Nur Spieler Pouze hráči Somente jogadores + Csak játékosok Players and AI @@ -3071,6 +3112,7 @@ Spieler und KI Hráči a AI Jogadores e IA + Játékosok és AI Enable Advanced wounds @@ -3080,6 +3122,7 @@ Aktiviere erweiterte Wunden Povolit pokročilé zranění Ativar ferimentos avançados + Komplex sebek engedélyezése Allow reopening of bandaged wounds? @@ -3089,6 +3132,7 @@ Erlaube das Öffnen von bandagierten Wunden? Umožnit znovuotevření zavázané rány? Permitr reabertura de ferimentos enfaixados? + Visszanyílhatnak a bekötözött sebek? Vehicle Crashes @@ -3098,6 +3142,7 @@ Fahrzeugunfälle Poškození z kolize Batidas de veículos + Járműbalesetek Do units take damage from a vehicle crash? @@ -3107,6 +3152,7 @@ Bekommen Einheiten von Fahrzeugunfällen Schaden? Dostane jednotka poškození při autonehodě? As unidades recebem dano de uma batida de veículo? + Sérülnek-e az egységek autós ütközés során? Allow PAK @@ -3116,6 +3162,7 @@ Erlaube Erstehilfekasten Povolit osobní lékárničky Permitir Kit de Primeiros Socorros + Elsősegélycsomag engedélyezése Who can use the PAK for full heal? @@ -3125,6 +3172,7 @@ Wer kann den Erstehilfekasten für eine Endheilung verwenden? Kdo může použít osobní lékárničku pro plné vyléčení? Quem pode usar o KPS para cura completa? + Ki használhatja az elsősegélycsomagot teljes gyógyításra? Anyone @@ -3134,6 +3182,7 @@ Jeder Kdokoliv Qualquer um + Akárki Medics only @@ -3143,6 +3192,7 @@ Nur Sanitäter Pouze zdravotník Somente médicos + Csak orvosok Doctors only @@ -3152,6 +3202,7 @@ Nur Ärzte Pouze doktor Somente doutores + Csak doktorok Remove PAK on use @@ -3161,6 +3212,7 @@ Entferne Erstehilfekasten bei Verwendung Odebrat osobní lékárničku po použití Remover o KPS depois do uso + Elsősegélycsomag eltávolítása használatkor Should PAK be removed on usage? @@ -3170,6 +3222,7 @@ Sollen Erstehilfekästen bei Verwendung entfernt werden? Má se osobní lékárnička odstranit po použití? Deve o KPS ser removido depois do uso? + Eltávolítódjon az elsősegélycsomag használatkor? Locations PAK @@ -3179,6 +3232,7 @@ Orte für Erstehilfekasten Lokace osobní lékárničky Localizações do KPS + Elsősegélycsomag helyek Where can the Personal Aid Kit be used? @@ -3188,16 +3242,19 @@ Wo kann der Erstehilfekasten verwendet werden? Kde může být použita osobní lékárnička? Onde o kit de primeiros socorros pode ser utilizado? + Hol lehet az elsősegélycsomagot használni? Condition PAK Podmínka osobní lékárničky Condición EPA + Elsősegélycsomag állapot When can the Personal Aid Kit be used? Kde může být použita osobní lékárnička? ¿Cuando se puede utilizar el Equipo de primeros auxilios? + Mikor lehet az elsősegélycsomagot használni? Anywhere @@ -3207,6 +3264,7 @@ Überall Kdekoliv Qualquer lugar + Akárhol Medical vehicles @@ -3216,6 +3274,7 @@ Medizinische Fahrzeuge Zdravotnická vozidla Veículos médcos + Orvosi járművek Medical facility @@ -3225,6 +3284,7 @@ Medizinische Einrichtungen Zdravotnické zařízení Instalação médica + Orvosi létesítmény Vehicles & facility @@ -3234,6 +3294,7 @@ Fahrzeuge & Einrichtungen Vozidla a zařízení Veículos e instalações + Járművek & létesítmény Disabled @@ -3243,6 +3304,7 @@ Deaktiviert Zakázáno Desativado + Letiltva Allow Surgical kit (Adv) @@ -3252,6 +3314,7 @@ Erlaube Operationskasten Povolit chirurgickou soupravu (Pokr.) Permite kit cirúrgico (avançado) + Sebészkészlet (Fejlett) engedélyezése Who can use the surgical kit? @@ -3261,6 +3324,7 @@ Wer kann den Operationskasten verwenden? Kdo může použít chirurgickou soupravu? Quem pode usar o kit cirúrgico? + Ki használhatja a sebészkészletet? Remove Surgical kit (Adv) @@ -3270,6 +3334,7 @@ Enrtferne Operationskasten (erweitert) Odebrat chirurgickou soupravu (Pokr.) Remover kit cirúrgico (avançado) + Sebészkészlet (Fejlett) eltávolítása Should Surgical kit be removed on usage? @@ -3279,6 +3344,7 @@ Entferne Operationskästen bei Verwendung? Odebrat chirurgickou soupravu po použití? Deve o kit cirúrgico ser removido após o uso? + Eltávolítódjon a sebészkészlet használatkor? Locations Surgical kit (Adv) @@ -3288,6 +3354,7 @@ Orte für Operationskästen (erweitert) Lokace chirurgické soupravy (Pokr.) Localizações do kit cirúrgico (avançado) + Sebészkészlet (Fejlett) helyei Where can the Surgical kit be used? @@ -3297,16 +3364,19 @@ Wo kann der Operationskasten verwendet werden? Kde může být použita chirurgická souprava? Onde o kit cirúrgico pode ser utilizado? + Hol lehet a sebészkészletet használni? Condition Surgical kit (Adv) Podmínka chirurgické soupravy (Pokr.) Condición de equipo quirúrgico (Av) + Sebészkészlet állapot When can the Surgical kit be used? Kde může být použita chirurgická souprava? ¿Cuando se puede utilizar el equipo quirúrgico? + Mikor lehet a sebészkészletet használni? Bloodstains @@ -3315,6 +3385,7 @@ Skvrny od krve Manchas de sangre Manchas de sangue + Vérfoltok Bandaging removes bloodstains @@ -3323,6 +3394,7 @@ Obvázání odstraňuje skvrny od krve El vendaje elimina las manchas de sangre Bandagem remove manchas de sangue + Kötözés eltávolítja a vérfoltokat Pain suppression @@ -3331,6 +3403,7 @@ Potlačení bolesti Supresión del dolor Supressão de dor + Fájdalomcsillapítás Pain is only temporarily suppressed, not removed @@ -3339,6 +3412,7 @@ Bolest je potlačena, ale jen dočastně El dolor se suprime solo temporalmente, no se elimina. Dor é somente temporáriamente suprimida, não removida + A fájdalom csak ideiglenesen csökken, nem távolítódik el Configure the treatment settings from ACE Medical @@ -3348,6 +3422,7 @@ Behandlungseinstellungen vom ACE-Medical konfigurieren Konfigurace nastavení léčby ze zdravotnické systému ACE Configure as opções de tratamento do ACE Médico + Kezelési lehetőségek konfigurálása az ACE Orvosi rendszerből Revive Settings [ACE] @@ -3357,6 +3432,7 @@ Wiederbelebungseinstellungen [ACE] Nastavení oživení [ACE] Sistema de reavivamento [ACE] + Újraélesztés beállításai [ACE] Enable Revive @@ -3366,6 +3442,7 @@ Erlaube Wiederbelebung Povolit oživení Habilitar reavivamento + Újraélesztés engedélyezése Enable a basic revive system @@ -3375,6 +3452,7 @@ Aktiviere Standard-Wiederbelebungssystem Povolit základní systém oživení Habilitar um sistema básico de reavivamento + Egy alap újraélesztési rendszer engedélyezése Max Revive time @@ -3384,6 +3462,7 @@ Maximale Wiederbelebungszeit Maximální čas pro oživení Tempo máximo de reavivamento + Maximum újraélesztési idő Max amount of seconds a unit can spend in revive state @@ -3393,6 +3472,7 @@ Maximale Zeitspanne in Sekunden die eine Einheit im Wiederbelebungszustand verbringen kann Maximální doba v agónii v sekundách Quantidade máxima de segundos que uma unidade pode gastar em um estado de reavivamento + Maximum másodperc, amit egy egység újraélesztési állapotban tölthet Max Revive lives @@ -3402,6 +3482,7 @@ Maximale Leben bei Wiederbelebung Maximální počet oživení Vidas máximas do reavivado + Maximum újraélesztési lehetőségek Max amount of lives a unit. 0 or -1 is disabled. @@ -3411,6 +3492,7 @@ Maximale Anzahl von Leben einer Einheit. 0 or -1 bedeutet deaktiviert. Maximální počet životu pro jednotku. 0 nebo -1 je zakázáno. Quantidade máxima de vidas por unidade. 0 ou -1 é desativado. + Egy egység maximum "életei". 0 vagy -1 letiltja. Provides a medical system for both players and AI. @@ -3420,6 +3502,7 @@ Aktiviert das Medicsystem für Spieler und KI. Poskytuje zdravotní systém pro hráče a AI. Proporciona um sistema médico para jogadores e IA. + Egy orvosi rendszert ad játékosok és AI-k számára. Set Medic Class [ACE] @@ -3429,6 +3512,7 @@ Setze Sanitäterklassen [ACE] Určit třídu medika [ACE] Definir classe médica [ACE] + Orvos beállítása [ACE] List @@ -3438,6 +3522,7 @@ Liste Seznam Lista + Lista List of unit names that will be classified as medic, separated by commas. @@ -3447,6 +3532,7 @@ Liste von Namen, die als Sanitäter verwendet werden. Wird durch Kommas getrennt. Seznam osob které budou klasifikovány jako zdravotník, oddělené čárkami. Lista dos nomes das unidades que se classificam como médicos, separados por vírgulas. + Azon egységek nevei, melyek orvosként vannak meghatározva, vesszővel elválasztva. Is Medic @@ -3456,6 +3542,7 @@ Ist Sanitäter Je zdravotník É médico + Orvos-e This module allows you to assign the medic class to selected units. @@ -3463,6 +3550,7 @@ Dieses Modul legt fest welche Einheit ein Sanitäter ist. Tento modul určuje, která jednotka je zdravotník. Este módulo determina qual unidade é um paramédico. + Ez a modul engedélyezi az orvosi jelző hozzárendelését kiválasztott egységekhez. None @@ -3472,6 +3560,7 @@ Keine Žádný Nada + Nincs Regular medic @@ -3481,6 +3570,7 @@ Normaler Sanitäter Řadový zdravotník Médico regular + Hagyományos orvos Doctor (Only Advanced Medics) @@ -3490,6 +3580,7 @@ Arzt (nur erweiterte Sanitäter) Doktor (Pouze pokročilý zdravotníci) Doutor (Somente médicos avançados) + Doktor (csak fejlett orvosok) Assigns the ACE medic class to a unit @@ -3499,6 +3590,7 @@ Weise die ACE-Sanitäterklasse einer Einheit zu Přiřadí ACE třídu zdravotníka do jednotky Atribui a classe médica do ACE a uma unidade + Az ACE orvosi jelző hozzárendelése egy egységhez Set Medical Vehicle [ACE] @@ -3508,6 +3600,7 @@ Setze medizinisches Fahrzeug [ACE] Určit zdravotnické vozidlo [ACE] Definir veículo médico [ACE] + Orvosi jármű beállítása [ACE] List @@ -3517,6 +3610,7 @@ Liste Seznam Lista + Lista List of vehicles that will be classified as medical vehicle, separated by commas. @@ -3526,6 +3620,7 @@ Liste ovn Fahrzeugen, die als medizinische Fahrzeuge verwendet werden. Wird durch Kommas getrennt. Seznam vozidel které budou klasifikovány jako zdravotnická vozidla, oddělené čárkami. Lista de veículos que serão classificados como veículos médicos, separados por vírgulas. + Orvosi járműveknek tekintett járművek listája, vesszővel elválasztva. Is Medical Vehicle @@ -3535,6 +3630,7 @@ Ist medizinisches Fahrzeug Je zdravotnické vozidlo É um veículo médico + Orvosi jármű-e Whatever or not the objects in the list will be a medical vehicle. @@ -3544,6 +3640,7 @@ Leg fest ob das Objekt in der Liste ein medizinisches Fahrzeug ist. Ať už jsou nebo nejsou objekty v seznamu budou zdravotnická vozidla. Se serão ou não os objetos dessa lista veículos médicos. + A listában lévő objektumok orvosi járművek-e, vagy sem. Assigns the ACE medic class to a unit @@ -3553,6 +3650,7 @@ Weist die ACE-Sanitäterklasse einer Einheit zu Přiřadí ACE třídu zdravotníka do jednotky Atribui a classe médica ACE a uma unidade + Hozzárendeli az ACE orvosi jelzőt egy egységhez Set Medical Facility [ACE] @@ -3562,6 +3660,7 @@ Setze medizinische Einrichtung [ACE] Určit zdravotnické zařízení [ACE] Definir instalação médica [ACE] + Orvosi létesítmény beállítása [ACE] Is Medical Facility @@ -3571,6 +3670,7 @@ Ist eine medizinische Einrichtung Je zdravotnické zařízení É uma instalação médica + Orvosi létesítmény-e Registers an object as a medical facility @@ -3580,6 +3680,7 @@ Definiert ein Objekt als medizinische Einrichtung Registruje objekt jako zdravotnické zařízení Registra um objeto como instalacão médica + Egy objektum orvosi létesítményként való regisztrálása Defines an object as a medical facility. This allows for more advanced treatments. Can be used on buildings and vehicles. @@ -3589,6 +3690,7 @@ Definiert ein Objekt als medizinische Einrichtung. Das ermöglicht weitere Behandlungen. Kann bei Gebäuden und Fahrzeugen verwendet werden. Definuje objekt jako zdravotnické zařízení. To umožňuje více pokročilé léčení. Může být použito na budovy nebo na vozidla. Define um objeto como instalação médica. Isso permite tratamentos mais avançados. Pode ser utilizado em edifícios e veículos. + Egy objektumot orvosi létesítményként határoz meg. Ez fejlett ellátási lehetőségeket engedélyez. Használható járműveken és épületeken. [ACE] Medical Supply Crate (Basic) @@ -3598,6 +3700,7 @@ [ACE] Medizinische Kiste (standard) [ACE] Zdravotnické zásoby (základní) [ACE] Caixa com suprimentos médicos + [ACE] Orvosi láda (Alap) [ACE] Medical Supply Crate (Advanced) @@ -3607,6 +3710,7 @@ [ACE] Medizinische Kiste (erweitert) [ACE] Zdravotnické zásoby (pokročilé) [ACE] Caixa com suprimentos médicos (Avançados) + [ACE] Orvosi láda (Fejlett) Yes @@ -3636,11 +3740,13 @@ Anytime Kdykoli Siempre + Akármikor Stable Stabilní Estable + Stabil \ No newline at end of file diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index a636ffa4de..8933de478f 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -308,6 +308,7 @@ MicroDAGR - Vyplnění mapy MicroDAGR-Kartenfüllung Preenchimento de mapa do MicroDAGR + MicroDAGR térképkitöltés MicroDAGR Map Fill @@ -316,6 +317,7 @@ MicroDAGR - Vyplnění mapy MicroDAGR-Kartenfüllung Preenchimento de mapa do MicroDAGR + MicroDAGR térképkitöltés How much map data is filled on MicroDAGR's @@ -324,6 +326,7 @@ Wie viel Daten auf einem MicroDAGR zu sehen sind Kolik informací je načteno do MicroDAGR? Quanta informação é preenchida no mapa do MicroDAGR + Mennyi térképadatot tartalmaz a MicroDAGR Full Satellite + Buildings @@ -332,6 +335,7 @@ Satellitenbild + Gebäude Satelit + Budovy Satélite completo + Edifícios + Teljes műholdas + épületek Topographical + Roads @@ -340,6 +344,7 @@ Topografisch + Straßen Topografické + Cesty Topográfico + Estradas + Topográfia + utak None (Cannot use map view) @@ -348,6 +353,7 @@ Keine (kann keine Kartenansicht verwenden) Žádný (Nelze použít zobrazení mapy) Nada (Não pode usar a tela de mapa) + Semmi (nem használható a térképnézet) Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap.<br />Source: microDAGR.pbo @@ -356,6 +362,7 @@ Steuert wie viel Daten auf dem microDAGR zu sehen ist. Weniger Daten schränken die Kartenansicht ein, um mehr auf der Minimap zu sehen.<br />Quelle: microDAGR.pbo Tento modul umožňuje kontrolovat, kolik informací je obsaženo v MicroDAGR. Menší množství dat omezené zobrazením mapy ukazují méně věcí na minimapě.<br />Zdroj: microDAGR.pbo Controla quantos dados são preenchidos nos itens microDAGR. Menos dados restringe a visualização de mapa para mostrar menos informações no minimapa<br/>Fonte: MicroDAGR.pbo + Meghatárroza a MicroDAGR objektumok térképének tartalmát. A kevesebb adat korlátozza a térképnézeti módot az eszközön. <br />Forrás: microDAGR.pbo - + \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 2845767f15..2a0544fab7 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -104,6 +104,7 @@ Aus Vypnout Desligado + Ki Player Only @@ -112,6 +113,7 @@ Nur Spieler Pouze hráči Somente jogador + Csak játékosok Player and AI @@ -120,6 +122,7 @@ Spieler und KI Hráči a AI Jogador e IA + Játékosok és AI \ No newline at end of file diff --git a/addons/missionmodules/stringtable.xml b/addons/missionmodules/stringtable.xml index b99285850d..dfa461072b 100644 --- a/addons/missionmodules/stringtable.xml +++ b/addons/missionmodules/stringtable.xml @@ -8,6 +8,7 @@ ACE-Missionsmodule ACE Moduly mise Módulo de missões ACE + ACE küldetési modulok Ambiance Sounds [ACE] @@ -16,6 +17,7 @@ Umgebungsgeräusche [ACE] Zvuky prostředí [ACE] [ACE] Sons ambientes + Ambiens hangok [ACE] Sounds @@ -24,6 +26,7 @@ Sounds Zvuky Sons + Hangok Class names of the ambiance sounds to be played. Seperated by ',' @@ -40,6 +43,7 @@ Mindestabstand Minimální vzdálenost Distância mínima + Minimális távolság Used for calculating a random position and sets the minimal distance between the players and the played sound file(s) @@ -56,6 +60,7 @@ Maximalabstand Maximální vzdálenost Distância máxima + Maximális távolság Used for calculating a random position and sets the maximum distance between the players and the played sound file(s) @@ -72,6 +77,7 @@ Minimale Verzögerung Minimální prodleva Atraso mínimo + Minimum késleltetés Minimal delay between sounds played @@ -88,6 +94,7 @@ Maximale Verzögerung Maximální prodleva Atraso máximo + Maximum késleltetés Maximum delay between sounds played @@ -104,6 +111,7 @@ Spielern folgen Následovat hráče Seguir jogadores + Játékosok követése Follow players. If set to false, loop will play sounds only nearby logic position. @@ -120,6 +128,7 @@ Lautstärke Hlasitost Volume + Hangerő The volume of the sounds played diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index 26ab485db2..300445d482 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -56,6 +56,7 @@ MK6-Einstellungen MK6 - Nastavení Ajustes do MK6 + MK6 beállítások Air Resistance @@ -64,6 +65,7 @@ Luftwiderstand Odpor vzduchu Resistência do Ar + Légellenállás For Player Shots, Model Air Resistance and Wind Effects @@ -80,6 +82,7 @@ Erlaube MK6-Computer MK6 - Povolit počítač Permitir computador do MK6 + MK6 számítógép engedélyezése Show the Computer and Rangefinder (these NEED to be removed if you enable air resistance) @@ -96,6 +99,7 @@ Erlaube MK6-Kompass MK6 - Povolit kompas Permitir bússula do MK6 + MK6 iránytű engedélyezése Show the MK6 Digital Compass @@ -104,9 +108,9 @@ Zeige MK6-Digitaler-Kompass MK6 - Zobrazit digitální kompas Mostra a bússula digital do MK6 + Az MK6 digitális iránytű megjelenítése - Moduł ten pozwala dostosować ustawienia moździerza MK6. Dieses Modul erlaubt das Einstellen des MK6-Mörsers. Tento modul umožňuje nastavení minometu MK6. diff --git a/addons/mx2a/stringtable.xml b/addons/mx2a/stringtable.xml index e8df673866..0de9ce7ff6 100644 --- a/addons/mx2a/stringtable.xml +++ b/addons/mx2a/stringtable.xml @@ -8,6 +8,7 @@ MX-2A MX-2A MX-2A + MX-2A Thermal imaging device @@ -16,6 +17,7 @@ Dispositivo de imagen térmica Termální dalekohled Dispositivo de imagem térmica + Hőleképező készülék - + \ No newline at end of file diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 376935297e..74430baedc 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -248,6 +248,7 @@ Erlaube Config-Export [ACE] Povolit export natavení [ACE] [ACE] Permitir exportação de configurações + Konfiguráció-exportálás engedélyezése [ACE] Allow @@ -256,6 +257,7 @@ Erlaube Povolit Permitir + Engedélyezés Allow export of all settings to a server config formatted. @@ -280,6 +282,7 @@ Verstecken Skrýt Ocultar + Elrejtés Top right, downwards @@ -288,6 +291,7 @@ Open rechts, nach unten Vpravo nahoře, dolů Superior direito, para baixo + Jobb felül, lefele Top right, to the left @@ -296,6 +300,7 @@ Von rechts nach links Vpravo nahoře, do leva Superior direito, à esquerda + Jobb felül, balra Top left, downwards @@ -304,6 +309,7 @@ Von links, nach unten Vlevo nahoře, dolů Superior esquerdo, para baixo + Bal felül, lefele Top left, to the right @@ -312,6 +318,7 @@ Oben links nach rechts Vlevo nahoře, do prava Superior esquerdo, para a direita + Bal felül, jobbra Top @@ -320,6 +327,7 @@ Oben Nahoře Acima + Fent Bottom @@ -328,6 +336,7 @@ Unten Dole Abaixo + Alul Debug To Clipboard @@ -336,6 +345,7 @@ Debug do schránky Debug in die Zwischenablage Depuração para área de transferência + Debug a vágólapra Sends debug information to RPT and clipboard. @@ -344,12 +354,15 @@ Pošle debug informace do RPT a schránky. Protokolliert Debug-Informationen im RPT und speichert sie in der Zwischenablage. Envia informação de depuração para RPT e área de transferência. + Debug információt küld az RPT-be és a vágólapra. - + Headbug Fix + "Fejhiba" fix - + Resets your animation state. + Visszaállítja az animációs állapotodat. ACE News @@ -358,6 +371,7 @@ Notícias do ACE Wiadomości ACE ACE Novinky + ACE hírek Show News on Main Menu @@ -366,6 +380,7 @@ Mostrar notícias no menu principal Pokazuj wiadomości ACE w menu głównym Zobrazit novinky v hlavním menu + Hírek mutatása a főmenüben - + \ No newline at end of file diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index b9ccad48a4..66d6670e51 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -52,10 +52,12 @@ Cut Parachute Fallschirm abschneiden + Ejtőernyő elvágása Reserve Parachute Reserve Fallschirm + Tartalék ejtőernyő - + \ No newline at end of file diff --git a/addons/rangecard/stringtable.xml b/addons/rangecard/stringtable.xml index bda93bcab3..20c3a17e0f 100644 --- a/addons/rangecard/stringtable.xml +++ b/addons/rangecard/stringtable.xml @@ -8,6 +8,7 @@ Vzdálenostní tabulka Entfernungsspinne Tabela de distâncias + Távolsági kártya 50 METER increments -- MRAD/MRAD (reticle/turrets) @@ -16,6 +17,7 @@ Přidat 50 METRŮ -- MRAD/MRAD (síťka/věže) 50-Meter-Schritte MRAD/MRAD (Fadenkreuz/Geschützturm) Incrementos de 50 METROS - MRAD/MRAD (retícula/torres) + 50 MÉTERES lépések - MRAD/MRAD (célzó/lövegek) Open Range Card @@ -24,6 +26,7 @@ Otevřít vzdálenostní tabulku Öffne Entfernungsspinne Abrir tabela de distâncias + Távolsági kártya kinyitása Open Range Card Copy @@ -32,6 +35,7 @@ Otevřít kopii vzdálenostní tabulky Öffne Kopie der Entfernungsspinne Abrir cópia da tabela de distâncias + Távolsági kártya-másolat kinyitása Open Range Card @@ -40,6 +44,7 @@ Otevřít vzdálenostní tabulku Öffne Entfernungsspinne Abrir tabela de distäncias + Távolsági kártya kinyitása Open Range Card Copy @@ -48,6 +53,7 @@ Otevřít kopii vzdálenostní tabulky Öffne Kopie der Entfernungsspinne Abrir cópia da tabela de distâncias + Távolsági kártya-másolat kinyitása Copy Range Card @@ -56,6 +62,7 @@ Kopírovat vzdálenostní tabulku Kopiere Entfernungsspinne Copiar tabela de distäncias + Távolsági kártya másolása - + \ No newline at end of file diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 4b649173f0..99d189ca50 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -152,6 +152,7 @@ Respawn-System Systém znovuzrození Sistema de Renascimento + Respawn-rendszer Save Gear? @@ -160,6 +161,7 @@ Ausrüstung speichern? Uložit výbavu? Salvar equipamento? + Felszerelés elmentése? Respawn with the gear a soldier had just before his death? @@ -168,6 +170,7 @@ Mit der Ausrüstung, die ein Soldat vor seinem Tod hatte, respawnen? Znovuubjevit s výbavou kterou měl voják před smrtí? Renascer com o equipamento que um soldado tinha antes de sua morte? + Az egység halála előtti felszerelésével való respawnolása? Remove bodies? @@ -176,6 +179,7 @@ Körper entfernen? Odstranit těla? Remover corpos? + Holttestek eltávolítása? Remove player bodies after disconnect? @@ -184,9 +188,9 @@ Entferne Spielerkörper nach dem Trennen einer Verbindung? Odstranit hráčova těla po odpojení? Remover corpos dos jogadores depois de desconectar? + Játékosi testek eltávolítása távozás után? - Moduł ten pozwala dostosować ustawienia odrodzenia (respawnu). Dieses Modul erlaubt es die Respawn-Einstellungen anzupassen. Tento modul umožňuje nastavení znovuzrození (spawn). @@ -199,9 +203,9 @@ Freundbeschuss-Nachrichten Upozornění na přátelskou střelbu Mensagens de fogo amigo + Baráti tűz üzenetek - Użycie tego modułu na misji spowoduje wyświetlenie wiadomości na czacie w przypadku, kiedy zostanie popełniony friendly fire - wyświetlona zostanie wtedy wiadomość kto kogo zabił. Zobrazí zprávu v chatu v případě, když budete střílet na vlastní jednotky. Ve zprávě se zobrazí kdo na koho střílel, popř. kdo koho zabil. Usando este módulo em uma missão para exibir mensagens chat, no caso de quando você faz um fogo amigo - então a mensagem será exibida mostrando quem matou quem. @@ -213,9 +217,9 @@ Rallypoint-System Systém shromáždění Sistema de ponto de encontro + Gyülekezőpont-rendszer - Moduł ten pozwala zastosować na misji "punkt zbiórki", do którego można szybko przeteleportować się z "bazy". Wymaga postawienia odpowiednich obiektów na mapie - bazy oraz flagi. Obydwa dostępne są w kategorii Puste -> ACE Odrodzenie. Tento modul umožňuje určit místo shromaždiště, kam se mohou jednokty rychle teleportovat ze "základny". Toto vyžaduje vhodné objekty v mapě - základna a vlajka. Oba dva můžete najít v kategorii Prázdné -> ACE Oživení. Este módulo permite que você aplique em uma missão "pontos de encontro", que pode rapidamente se teletransportar para a "base". Ele requer colocar objetos apropriados no mapa - base e bandeiras. Ambos estão disponíveis na categoria em branco -> ACE Revival. @@ -227,6 +231,7 @@ Bewege Rallypoint Přesun na shromaždiště Mover para ponto de encontro + Gyülekezőpont mozgatása ACE Respawn @@ -235,6 +240,7 @@ ACE-Respawn ACE Znovuzrození ACE Respawn + ACE Respawn \ No newline at end of file diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index 443c34c360..e26c2b36f0 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -7,6 +7,7 @@ Sentar Sednout si Sentarse + Leülés Stand Up @@ -14,6 +15,7 @@ Levantar Vstát Levantarse + Felállás Enable Sitting @@ -21,6 +23,7 @@ Aktywuj siadanie Povolit sezení Acivar asiento + Ülés engedélyezése Sitting @@ -28,6 +31,7 @@ Siadanie Sedící Sentarse + Ülés This module allows you to disable the ability to sit on chairs and toilets. @@ -35,6 +39,7 @@ Moduł ten pozwala na włączenie lub wyłączenie możliwości siadania na krzesłach i toaletach. Tento modul dovoluje zakázat možnost sedět na židlých a toaletách. Este módulo te permite desactivar la capacidad de sentarte en sillas y aseos. + Ez a modul lehetővé teszi a székekre és toalettekre való leülés letiltását. \ No newline at end of file diff --git a/addons/tacticalladder/stringtable.xml b/addons/tacticalladder/stringtable.xml index 4342ac5408..53a6935484 100644 --- a/addons/tacticalladder/stringtable.xml +++ b/addons/tacticalladder/stringtable.xml @@ -10,7 +10,7 @@ Telescopic Ladder Teleskopický žebřík Telescopic Ladder - Telescopic Ladder + Teleszkopikus létra Escada telescópica @@ -22,7 +22,7 @@ Deploy ladder Rozložit žebřík Deploy ladder - Deploy ladder + Létra lerakása Implantar escada @@ -34,7 +34,7 @@ Drop ladder Položit žebřík Drop ladder - Drop ladder + Létra eldobása Derrubar escada @@ -44,6 +44,7 @@ Upravit žebřík Ajustar escalera Ajustar escada + Létra állítása Position ladder @@ -54,7 +55,7 @@ Position ladder Umístit žebřík Position ladder - Position ladder + Létra elhelyezése Posicionar escada @@ -66,7 +67,7 @@ Pickup ladder Vzít žebřík Pickup ladder - Pickup ladder + Létra felvétele Pegar escada From 2b23958fd184b81585b0d938858bc6f66e23c6c9 Mon Sep 17 00:00:00 2001 From: Harakhti Date: Thu, 30 Jul 2015 16:06:32 +0200 Subject: [PATCH 004/137] Row 2 It gets tedious after a while, especially if your language lacks technical terms. That or my B2 language exam isn't good enough. --- addons/frag/stringtable.xml | 8 ++++++++ addons/map/stringtable.xml | 10 ++++++++++ addons/missionmodules/stringtable.xml | 7 +++++++ addons/mk6mortar/stringtable.xml | 2 ++ addons/nametags/stringtable.xml | 28 ++++++++++++++++++++++++++- addons/optionsmenu/stringtable.xml | 2 ++ addons/switchunits/stringtable.xml | 14 +++++++++++++- addons/vehiclelock/stringtable.xml | 3 +++ addons/viewdistance/stringtable.xml | 27 +++++++++++++++++++++++++- addons/weather/stringtable.xml | 14 ++++++++++++++ addons/winddeflection/stringtable.xml | 5 ++++- addons/yardage450/stringtable.xml | 5 ++++- addons/zeus/stringtable.xml | 17 +++++++++++++++- 13 files changed, 136 insertions(+), 6 deletions(-) diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index c4fac44ec0..205fb50c75 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -26,6 +26,7 @@ Explosionssimulation Simulace úlomků Simulação de estilhaços + Pattogzás-szimuláció Enable the ACE Spalling Simulation @@ -34,6 +35,7 @@ Aktiviere ACE-Explosionssimulation Povolit ACE simulaci úlomků Ativa a simulação de estilhaços do ACE + Az ACE pattogzás-szimuláció engedélyezése Maximum Projectiles Tracked @@ -42,6 +44,7 @@ Maximalzahl der verfolgten Projektile Maximální počet sledovaných projektilů Máximo de projéteis rastreados + Maximum követett repeszek This setting controls the maximum amount of projectiles the fragmentation and spalling system will track at any given time. If more projectiles are fired, they will not be tracked. Lower this setting if you do not want FPS drops at high-count projectile scenarios ( >200 rounds in the air at once) @@ -50,6 +53,7 @@ Diese Einstellung steuert die maximale Anzahl an Projektilen, die das Splitter- und Explosionssystem gleichzeitig verfolgen wird. Wenn mehr Projektile abgefeuert werden, werden sie nicht verfolgt werden. Diese Einstellung zu verringern, kann FPS-Einbrüche bei Szenarien mit vielen Projektilen verhindern (>200 Objekte gleichzeitig in der Luft) Toto nastavení kontroluje maximální množství projektilů z fragmentace a úlomků, která jsou sledována v dané době. Pokud je vystřeleno více projektilů, tak nebudou sledovány. Snižte toto nastavení pokud si nepřejete propady FPS v situacích, kde je velké množství projektilů ( >200 nábojů najednou ve vzduchu) Esta definição controla a quantidade máxima de projéteis que o sistema de fragmentação e estilhaçamento irá acompanhar em qualquer momento. Se mais projéteis são disparados, eles não serão rastreados. Diminua essa configuração se você não quiser que o FPS caia em cenários com alta contagem de projéteis (> 200 projéteis no ar ao mesmo tempo) + Ez a beállítás szabályozza a repeszeződés és pattogzás által kilőtt objektumok követett számát. Ha több ez a szám, ezek az objektumok nem lesznek követve. Csökkentsd ezt a beállítást, ha nem akarsz lassulásokat magas-törmelékmennyiségű helyzetekben (200+ repesz a levegőben egyszerre) Maximum Projectiles Per Frame @@ -58,6 +62,7 @@ Maks. liczba pocisków na klatkę Maximální počet projektilů ze jeden snímek Projéteis máximos por quadro + Maximum repesz/képkocka 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. @@ -66,6 +71,7 @@ El número de cálculos de esquirlas que se hará en cualquier cuadro. Esto ayuda a dispersar el impacto en FPS del seguimiento de esquirlas de balas a través de múltiples cuadros, lo que limita aún más su impacto. Počet úlomků v daném snímku. Toto pomáhá rozšířit FPS dopad sledovaného úlomku napříč více snímky, omezuje jeho vliv ještě více. O número de cálculos por estilhaço rastreado para executar em qualquer quadro. Isso ajuda a distribuir o impacto no FPS do rastreamento de estilhaço em vários quadros, o que limita o seu impacto ainda mais. + A lepattogzási útvonalak számításának darabjai képkockánként. Ez eloszlatja az FPS-megszakadást több képkockára, ezzel csökkentve a súlyosságát. (SP Only) Frag/Spall Debug Tracing @@ -74,6 +80,7 @@ (Pouze SP) Debug sledování Frag/Úlomků (nur SP) Splitter-/Explosions-Debug-Verfolgung (Somente SP) Depuração de fragmentação e estilhaços traçantes + (Csak SP) Repesz/Pattogzás debug követés (SP Only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only. @@ -82,6 +89,7 @@ (nur SP) Splitter-/Explosions-Debugging (Pouze SP) Vyžaduje restart mise/editoru. Aktivuje vizuální stopování fragmentace a úlomů pouze v režimu jednoho hráče. (Somente SP) Requer um reinício de missão / editor. Habilita o rastreamento visual de projéteis de fragmentação e estilhaçamento apenas no modo de jogo SP. + (Csak SP) Küldetés/Editor újraindítás szükséges. Engedélyezi a repeszek és pattogzó lövedékek vizuális nyomkövetését, csak egyjátékos módok alatt. \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 793dd88599..5fc03d4343 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -17,6 +17,7 @@ Kartenausleuchtung Osvětlení mapy Iluminação do mapa? + Térkép megvilágítása? Calculate dynamic map illumination based on light conditions? @@ -25,6 +26,7 @@ Berechne die Kartenauslichtung anhand des Umgebungslichts? Vypočítat dynamické osvětlení mapy na základně světelných podmínek? Calcular a iluminação dinâmica do mapa de acordo com as condições de luz? + Számítódjon a térkép megvilágítottsága a környezeti fényviszonyokból? Map shake? @@ -33,6 +35,7 @@ Kamerawackeln Třesení mapy? Tremor de mapa? + Térkép-rázkódás? Make map shake when walking? @@ -41,6 +44,7 @@ Kamerawackeln beim Gehen? Umožnit třesení mapy za pochodu? Tremer o mapa enquanto caminha? + Rázkódjon-e a térkép mozgáskor? Limit map zoom? @@ -49,6 +53,7 @@ Kartenzoom einschränken Omezit přiblížení mapy? Limitar zoom do mapa? + Térkép-nagyítás korlátozása? Limit the amount of zoom available for the map? @@ -57,6 +62,7 @@ Zoomstufe der Karte einschränken? Omezit stupeň přiblížení pro mapu? Limitar a quantidade de zoom disponível para o mapa? + Korlátozva legyen-e a nagyítás mennyisége a térképnél? Show cursor coordinates? @@ -65,6 +71,7 @@ Zeige Cursor-Koordinaten? Zobrazit souřadnice u kurzoru? Mostrar coordenadas no cursor? + Kurzor-koordináták mutatása? Show the grid coordinates on the mouse pointer? @@ -73,6 +80,7 @@ Gitter-Koordinaten auf dem Mauszeiger anzeigen? Zobrazit souřadnice u kurzoru v mapě? Mostrar as coordenadas de grade no ponteiro do mouse? + Mutatva legyen-e a kurzornál található rész rácskoordinátája? This module allows you to customize the map screen. @@ -80,6 +88,7 @@ Dieses Modul erweitert die Kartenfunktionen. Tento modul umožňuje přizpůsobit mapu s obrazem. Este módulo permite que você personalize a tela de mapa. + Ez a modul lehetővé teszi a térképnézet testreszabását. Blue Force Tracking @@ -148,6 +157,7 @@ Dieses Modul ermöglicht es verbündete Einheiten mit dem BFT auf der Karte zu verfolgen. Umožňuje sledovat přátelské jednokty na mapě v rámci BFT. Permite que você acompanhe as posições no mapa das unidades aliadas com marcadores RFA. + Ez a modul lehetővé teszi a szövetséges egységek követését BFT térképjelzőjkkel. \ No newline at end of file diff --git a/addons/missionmodules/stringtable.xml b/addons/missionmodules/stringtable.xml index dfa461072b..6085e00b32 100644 --- a/addons/missionmodules/stringtable.xml +++ b/addons/missionmodules/stringtable.xml @@ -52,6 +52,7 @@ Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Mindestabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest Používá se pro výpočet náhodné pozice a určuje minimální vzdálenost mezi hráči a přehrávaným zvukem. Usada para calcular uma posição aleatória e definir a distância mínima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. + Egy véletlenszerű pozíció számításához használt érték, amihez megadja a minimum távolságot a játékosok és a lejátszott hangfájl(ok) között Maximum Distance @@ -69,6 +70,7 @@ Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Maximalabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest Používá se pro výpočet náhodné pozice a určuje maximální vzdálenost mezi hráči a přehrávaným zvukem. Usado para calcular uma posição aleatória e definir uma distância máxima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. + Egy véletlenszerű pozíció számításához használt érték, amihez megadja a maximum távolságot a játékosok és a lejátszott hangfájl(ok) között Minimal Delay @@ -86,6 +88,7 @@ Minimale Verzögerung zwischen abzuspielenden Sounds Minimální prodleva mezi přehrávanými zvuky Atraso mínimo entre os sons reproduzidos + Minimum késleltetés a lejátszott hangok között Maximum Delay @@ -103,6 +106,7 @@ Maximale Verzögerung zwischen abzuspielenden Sounds Maximální prodleva mezi přehrávanými zvuky Atraso máximo entre os sons reproduzidos + Maximum késleltetés a lejátszott hangok között Follow Players @@ -120,6 +124,7 @@ Spielern folgen. Wenn auf falsch gesetzt, werden Sounds nur in der Nähe des Logikmoduls abgespielt. Následuj hráče. Pokud je FALSE, smyčka zvuku bude přehrávána na nejbližší pozici logiki. Segue os jogadores. Se esta desabilitado (falso), o loop reproduzirá os sons somente perto de sua posição lógica. + Játékosok követése. Ha le van tiltva, az ismétlés csak a legközelebbi logikai ponton játszik le hangokat. Volume @@ -137,6 +142,7 @@ Lautstärke der abzuspielenden Sounds Hlasitost přehrávaného zvuku O volume em que os sons serão reproduzidos + A lejátszott hangok hangereje Ambiance sounds loop (synced across MP) @@ -145,6 +151,7 @@ Umgebungsgeräusch-Schleife (im MP synchronisiert) Smyčka okkolního zvuku (synchronizováno v MP) Loop de sons ambientes (sincronizados através do MP) + Ambiens hangok folyamatossága (MP alatt szinkronizálva) \ No newline at end of file diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index 300445d482..394154a70b 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -74,6 +74,7 @@ Für Spielerschüsse, Luftwiderstand und Windeffekte Pro hráčovu střelbu, Model odporu vzduchu a povětrných podmínek Para disparos do jogador, modelo de resistência de ar e efeitos de vento + Játékos általi lövésekhez, legyen-e számított légellenállás és szélhatás Allow MK6 Computer @@ -91,6 +92,7 @@ Zeige den Computer und den Entfernungsmesser an (diese MÜSSEN entfernt werden, wenn der Luftwiderstand aktiviert ist) Zobrazit počítač a dálkoměr (toto MUSÍ být odstraněno pokud je zapnut odpor vzduchu) Mostra o computador e o medidor de distância (estes DEVEM ser removidos se você habilitar resistência do ar) + A távmérő és számítógép megjelenítése (ezeket el KELL távolítani ha a légellenállás engedélyezve van) Allow MK6 Compass diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index e811b3447c..56ca2e3a5f 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -116,6 +116,7 @@ Namensanzeigen Jmenovky Etiquetas de nome + Névcímkék Player Names View Dist. @@ -124,6 +125,7 @@ Spielernamen-Distanz Vzdálenost zobrazení jména hráčů Distância de visão dos nomes dos jogadores + Játékosok nevének látótávja Distance in meters at which player names are shown. Default: 5 @@ -132,6 +134,7 @@ Distanz in Metern bei der Spielernamen angezeigt werden. Standard: 5 Vzdálenost v metrech pro zobrazení jména. Výchozí: 5 Distância em metros que os nomes dos jogadores são mostrados. Padrão: 5 + Méterben megadott érték a játékosok nevének mutatására. Alapértelmezett: 5 Show name tags for AI? @@ -140,6 +143,7 @@ Zeige Namensanzeigen für KI? Zobrazit jmenovky pro AI? Mostrar nomes para IA? + Névcímkék megjelenítése AI-nál? Show the name and rank tags for friendly AI units? Default: Do not force @@ -148,6 +152,7 @@ Zeige den Namen und Rang für freundliche KI-Einheiten? Standard: nicht erwzingen Zobrazit jména a hodnosti pro spřátelené AI jednotky? Výchozí: Nevynucovat Mostra o nome e patente para unidades IA aliadas? Padrão: Não forçar + Mutassa-e a szövetséges AI egységek nevét és rangját? Alapértelmezett: Nincs felülbírálás Do Not Force @@ -156,6 +161,7 @@ Nicht erzwingen Nevynucovat Não forçar + Nincs felülbírálás Force Hide @@ -164,6 +170,7 @@ Verstecken erzwingen Vynuceno skrýt Ocultar forçado + Erőltetett rejtett Force Show @@ -172,6 +179,7 @@ Anzeigen erzwingen Vynuceno zobrazit Mostrar forçado + Erőltetett látható Show crew info? @@ -180,6 +188,7 @@ Zeige Besatzungsinfo? Zobrazit informace o posádce? Mostrar informação de tripulação? + Legénységi adatok megjelenítése? Show vehicle crew info, or by default allows players to choose it on their own. Default: Do Not Force @@ -188,6 +197,7 @@ Zeige Fahrzeugbesatzungsinfo oder erlaube Spielern es auszuwählen. Standard: nicht erzwingen. Zobrazit informace o posádce, nebo nechat aby si hráč vybral sám. Výchozí: Nevynucovat Mostrar informações de tripulação ou por padrão permitir a escolha dos jogadores. Padrão: Não forçar. + A legénységi adatok mutatása, alapértelmezett esetben a játékos által kiválasztható. Alapértelmezett: Nincs felülbírálás Show for Vehicles @@ -196,6 +206,7 @@ Zeige bei Fahrzeugen Zobrazit pro vozidla Mostrar para veículos + Mutatás járműveknél Show cursor NameTag for vehicle commander (only if client has name tags enabled)Default: No @@ -212,6 +223,7 @@ Este módulo permite personalizar la configuración y la distancia de las Etiquetas de nombre. Tento modul umožňuje si přizpůsobit nastavení a vzdálenost jmenovky. Este módulo permite que você personalize as configurações e distâncias de etiquetas de nome. + Ez a modul lehetővé teszi a névcímkék beállításainak testreszabását. Disabled @@ -220,6 +232,7 @@ Deaktiviert Zakázáno Desativado + Letiltva Enabled @@ -228,6 +241,7 @@ Aktiviert Povoleno Ativado + Engedélyezve Only on Cursor @@ -236,6 +250,7 @@ Nur bei Maus Pouze na kurzor Somente no cursor + Csak kurzorra Only on Keypress @@ -244,6 +259,7 @@ Nur bei Tastendruck Pouze na klávesu Somente em tecla ativada + Csak gombnyomásra Only on Cursor and Keypress @@ -252,6 +268,7 @@ Nur Maus und Tastendruck Pouze na kurzor a klávesu Somente em cursor ou tecla ativada + Csak kurzorra és gombnyomásra Force Show Only on Cursor @@ -260,6 +277,7 @@ Vynuceno zobrazit pouze na kurzor Erzwinge nur mit Mauszeiger anzuzeigen Forçar mostrar somente no cursor + Erőltetett látható, csak kurzorra Force Show Only on Keypress @@ -268,6 +286,7 @@ Vynuceno zobrazit pouze na klávesu Erzwinge nur mit Tastendruck anzuzeigen Forçar somente mostrar em tecla ativada + Erőltetett látható, csak gombnyomásra Force Show Only on Cursor and Keypress @@ -276,6 +295,7 @@ Vynuceno zobrazit pouze na kurzor a klávesu Erzwinge nur mit Mauszeiger und Tastendruck anzuzeigen Forçar mostrar somente em cursor e tecla ativada + Erőltetett látható, csak kurzorra és gombnyomásra Use Nametag settings @@ -284,6 +304,7 @@ Verwende Namenanzeigen Použít nastavení jmenovky Usar ajustes de etiquetas de nome + Névcímkék beállításának használata Always Show All @@ -292,6 +313,7 @@ Immer alle zeigen Vždy zobrazit vše Sempre mostrar tudo + Mindig minden mutatása Show player names and set their activation. Default: Enabled @@ -300,6 +322,7 @@ Zobrazit jména hráčů a nastavit jejich aktivaci. Výchozí: Povoleno Erlaubt das Anzeigen von Spielernamen und stellt ein, ob sie standardmäßig aktiviert oder deaktiviert sind. Standard: aktiviert Mostrar os nomes dos jogadores e definir sua ativação. Padrão: Ativado + Mutassa a játékosok nevét és kezelje az aktivációjukat. Alapértelmezett: Engedélyezve Effect of sound waves above the heads of speaking players after holding the PTT key. This option works with TFAR and ACRE2. @@ -308,6 +331,7 @@ Efekt zvukových vln nad hlavami hráčů když mluví skrz PTT klávesu. Tato volba funguje s TFAR a ACRE2. Es wird ein Schallwellensymbol über den Köpfen von sprechenden Spielern angezeigt, die ihre Push-to-Talk-Taste drücken. Diese Option funktioniert mit TFAR und ACRE2. Efeito de ondas sonoras acima das cabeças dos jogadores que falam depois mantendo pressionada a tecla PTT. Esta opção funciona com TFAR e ACRE2. + Hanghullám-effekt a beszélő játékosok feje felett a PTT-gomb lenyomásakor. Ez a beállítás TFAR és ACRE2 alatt működik. Nametags Size @@ -316,6 +340,7 @@ Velikost jmenovky Namensschildgröße Tamanho das etiquetas de nome + Névcímkék mérete Text and Icon Size Scaling @@ -324,6 +349,7 @@ Velikost textu a ikon Text- und Symbolgrößen Escala de tamanho dos ícones e textos + Szöveg és ikon méretének skálázása - + \ No newline at end of file diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 74430baedc..b26bf6261a 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -266,6 +266,7 @@ Erlaube alle Einstellungen in einer Server-Config zu exportieren. Povolit exportovat všechna nastavení do formátu server configu. Permitir exportação de todas as configurações para uma configuração formatada de servidor. + Az összes beállítás szerver-konfigurációba való exportálásának engedélyezése. When allowed, you have access to the settings modification and export in SP. Clicking export will place the formated config on your clipboard. @@ -274,6 +275,7 @@ Wenn erlaubt, können die Einstellungsmodifikationen angezeigt und im SP exportiert werden. Wenn auf "Exportieren" geklickt wird, wird eine formatierte Config-Datei in der Zwischenablage abgespeichert. Pokud je povoleno, budete mít přístup k modifikaci nastavení a exportování v SP. Kliknutím na export umístníte formátovaný config do vaší schránky. Quando permitido, você tem acesso à modificação de definições e exportação em SP. Clicando em exportação colocará a configuração formatada em sua área de transferência. + Engedélyezéskor hozzáférést kapsz a beállítások módosításához és exportálásához egyjátékos módban. Exportáláskor a formázott konfiguráció a vágólapra kerül. Hide diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index 2d0bc91314..71ef5a9704 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -32,6 +32,7 @@ Einheiten-Switch-System? Systém výměny stran Sistema de troca de unidades + Egységváltó-rendszer Switch to West? @@ -40,6 +41,7 @@ Nach BLUFOR wechseln? Přesunout k BLUFOR? Trocar para Oeste? + Átváltás BLUFOR-ra? Allow switching to west units? @@ -48,6 +50,7 @@ Erlaube das Wechseln zu BLUFOR-Einheiten? Povolit přesun k BLUFOR? Permitir troca de unidades para o Oeste? + Nyugat-fakciós egységekre való váltás engedélyezése? Switch to East? @@ -56,6 +59,7 @@ Nach OPFOR wechseln? Přesunout k OPFOR? Trocar para Leste? + Átváltás OPFOR-ra? Allow switching to east units? @@ -64,6 +68,7 @@ Erlaube das Wechseln zu OPFOR-Einheiten? Povolit přesun k OPFOR? Permitir troca de unidades para o Leste? + Kelet-fakciós egységekre való váltás engedélyezése? Switch to Independent? @@ -72,6 +77,7 @@ Nach INDFOR wechseln? Přesunout k INDFOR? Trocar para Indenpendente + Átváltás INDFOR-ra? Allow switching to independent units? @@ -80,6 +86,7 @@ Erlaube das Wechseln zu INDFOR-Einheiten? Povolit přesun k INDFOR? Permitir troca de unidades para o Indenpendente? + Független egységekre való váltás engedélyezése? Switch to Civilian? @@ -88,6 +95,7 @@ Nach CIVILIAN wechseln? Přesunout k CIVILISTŮM? Trocar para Civis? + Átváltás civilre? Allow switching to civilian units? @@ -96,6 +104,7 @@ Erlaube das Wechseln zu CIVILIAN-Einheiten? Povolit přesun k CIVILISTŮM? Permitir troca de unidades para o Civil? + Civil egységekre való váltás engedélyezése? Enable Safe Zone? @@ -104,6 +113,7 @@ Aktiviere Sicherheitszone? Povolit bezpečné oblasti? Habilitar zona segura? + Biztonságos zóna engedélyezése? Enable a safe zone around enemy units? Players can't switch to units inside of the safe zone. @@ -112,6 +122,7 @@ Aktiviere eine Sicherheitszone um feindliche Einheiten? Spieler können nicht zu Einheiten in der Sicherheitszone wechseln. Povolit bezpečnou zónu kolem nepřátelských jednotek? Hráči se nemohou změnit strany/jednotky uvnitř bezpečné zóny. Habilitar uma zona segur ao redor das unidades inimigas? Jogadores não conseguirão trocar para unidades dentro dessa zona segura. + Engedélyezve legyen-e egy biztonságos zóna az ellenségek körül? A játékosok nem tudnak a biztonságos zónán belüli egységekre váltani. Safe Zone Radius @@ -120,6 +131,7 @@ Sicherheitszonenradius Oblast bezpečné zóny Raio da zona segura + Biztonságos zóna hatóköre The safe zone around players from a different team. Default: 200 @@ -128,9 +140,9 @@ Die Sicherheitszone um Spieler von einem anderen Team. Standard: 200 Bezpečná zóna kolem hráče z jiných týmu. Výchozí: 200 A zona segura ao redor dos jogadores de diferentes equipes. Padrão: 200 + A biztonságos zóna más csapatból lévő játékosok körül. Alapértelmezett: 200 - Moduł ten pozwala na zmianę strony w trakcie gry. Tento modul umožňuje přepínání mazi dostupnými stranami. Este módulo permite mudar o lado à disposição dos jogadores. diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 89a64faf8a..1d567fba62 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -180,6 +180,7 @@ Unverändert Jak je Como está + Úgy-ahogy Locked @@ -188,6 +189,7 @@ Gesperrt Zamčeno Fechado + Zárva Unlocked @@ -196,6 +198,7 @@ Offen Odemčeno Aberto + Nyitva Default Lockpick Strength diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml index bdf96f35a0..f5757a55cc 100644 --- a/addons/viewdistance/stringtable.xml +++ b/addons/viewdistance/stringtable.xml @@ -8,6 +8,7 @@ Omezovač dohlednosti Sichtweitenbegrenzung Limitador de distância de visão + Látótáv-korlátozó Allows limiting maximum view distance that can be set by players. @@ -16,6 +17,7 @@ Umožňuje určit maximální dohlednost, kterou si může hráč nastavit Erlaubt das Einschränken der maximalen Sichtweite, welche von Spielern eingestellt werden kann. Permite limitar a distância máxima de visão que pode ser definida pelos jogadores. + Lehetővé teszi a játékosok által a látótávolság maximumának korlátozását. Enable ACE viewdistance @@ -24,6 +26,7 @@ Povolit ACE dohlednost Aktiviere ACE-Sichtweite Habilitar distância de visão ACE + ACE látótávolság engedélyezése Enables ACE viewdistance @@ -32,6 +35,7 @@ Povolit ACE dohlednost Aktiviert ACE-Sichtweite Habilita a distância de visão ACE + Engedélyezi az ACE látótávolságot View Distance Limit @@ -40,6 +44,7 @@ Limit dohlednosti Sichtweitengrenze Limite da distância de visão + Látótáv-korlát Sets the limit for how high clients can raise their view distance (up to 10000) @@ -48,6 +53,7 @@ Stanoví limit jak daleko si může client zvýšit dohlednost (do 10000) Setze die Grenze fest, wie weit Spieler ihre Sichtweite erhöhen können (bis 10000) Estabelecer um limite de quão alto os clientes podem aumentar sua distância de visão (até 10000) + Korlátozza, mekkora látótávolságot állíthatnak be a kliensek (maximum 10000-ig) Limit for client's view distance set here and can overridden by module @@ -56,6 +62,7 @@ Limit dohlednoti pro klienty se nastavuje zde a může být potlačeno pomocí modulu. Stellt die Grenze für die Sichtweite des Spielers ein. Das kann von einem Modul überschrieben werden. Permite limitar a distância de visão máxima que pode ser definida por jogadores. Pode ser substituído por módulo. + A kliens látótávolsága itt állítható be, és felülbírálható modulok által Client View Distance (On Foot) @@ -64,6 +71,7 @@ Dohlednost (Pěšák) Spielersichtweite (zu Fuß) Distância de visão do cliente (A pé) + Kliens látótáv (gyalog) Changes in game view distance when the player is on foot. @@ -72,6 +80,7 @@ Změna dohlednosti pro hráče pokud jde po svých. Verändert die Sichtweite, wenn ein Spieler zu Fuß unterwegs ist. Muda a distância de visão do jogador dentro do jogo quando ele está a pé. + Megváltoztatja a játékon belüli látótávolságot, amennyiben a játékos gyalogosan van. Client View Distance (Land Vehicle) @@ -80,6 +89,7 @@ Dohlednost (Pozemní technika) Spielersichtweite (Landfahrzeuge) Distância de visão do cliente (Veículo terrestre) + Kliens látótáv (szárazföldi jármű) Changes in game view distance when the player is in a land vehicle. @@ -88,6 +98,7 @@ Změna dohlednosti pro hráče pokud je v pozemní technice. Verändert die Sichtweite, wenn ein Spieler in einem Landfahrzeug ist. Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo terrestre. + Megváltoztatja a játékon belüli látótávolságot, amennyiben a játékos szárazföldi járműben van. Client View Distance (Air Vehicle) @@ -96,6 +107,7 @@ Dohlednost (Vzdušná technika) Spielersichtweite (Luftfahrzeuge) Distância de visão do cliente (Veículo aéreo) + Kliens látótáv (légi jármű) Changes in game view distance when the player is in an air vehicle. @@ -104,6 +116,7 @@ Změna dohlednosti pro hráče pokud je ve vzdušné technice. Verändert die Sichtweite wenn ein Spieler in einem Luftfahrzeug ist. Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo aéreo. + Megváltoztatja a játékon belüli látótávolságot, amennyiben a játékos légi járműben van. Dynamic Object View Distance @@ -112,6 +125,7 @@ Dynamická dohlednost objektů Dynamische Objektsichtweite Distância de visão dinâmica dos objetos + Dinamikus objektum-látótáv Sets the object view distance as a coefficient of the view distance. @@ -120,6 +134,7 @@ Nastaví objekt dohlednosti jako koeficient dohlednosti. Passt die Objektsichtweite dynamisch der Sichtweite an. Estabelece a distância de visão dos objetos com um coeficiente da distância de visão. + Beállítja az objektum-látótávot a megadott látótáv koefficienseként. Off @@ -128,6 +143,7 @@ Vypnout Aus Desligado + Kikapcsolva Very Low @@ -136,6 +152,7 @@ Velmi málo Sehr niedrig Muito baixo + Minimális Low @@ -144,6 +161,7 @@ Málo Niedrig Baixo + Alacsony Medium @@ -152,6 +170,7 @@ Středně Mittel Médio + Közepes High @@ -160,6 +179,7 @@ Hodně Hoch Alto + Magas Very High @@ -168,6 +188,7 @@ Velmi hodně Sehr hoch Muito alto + Maximális View Distance: @@ -176,6 +197,7 @@ Dohlednost: Sichtweite: Distância de visão: + Látótávolság: Object View Distance is @@ -184,6 +206,7 @@ Dohlednost objektů je Objektsichtweite ist Distância de visão do objeto é + Az objektum-látótávolság: That option is invalid! The limit is @@ -192,6 +215,7 @@ Tato volba je neplatná! Limit je Diese Option ist ungültig! Die Grenze ist Essa opção é inválida. O limte é + Ez a beállítás érvénytelen! A maximum mennyiség Video Settings @@ -200,6 +224,7 @@ Nastavení videa Grafikeinstellungen Ajustes de vídeo + Videobeállítások - + \ No newline at end of file diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 69e2d4a792..aa6243b519 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -20,6 +20,7 @@ Wetter Počasí Clima + Időjárás Multiplayer synchronized ACE weather module @@ -28,6 +29,7 @@ ACE-Wettermodul (synchron im Multiplayer) Synchronizovat ACE počasí v multiplayeru Módulo climático ACE para sincronismo multiplayer + Többjátékos szinkronizált ACE időjárás modul Weather propagation @@ -36,6 +38,7 @@ Wetterübertragung Změny počasí Propagação do clima + Időjárás-változás Enables server side weather propagation @@ -44,6 +47,7 @@ Aktiviere serverseitige Wetterübertragung Aktivuje změny počasí na straně serveru Ativa propagação de clima via server + Engedélyezi a szerveroldali időjárás-változást ACE Weather @@ -52,6 +56,7 @@ ACE-Wetter ACE počasí Clima ACE + ACE Időjárás Overrides the default weather (editor, mission settings) with ACE weather (map based) @@ -60,6 +65,7 @@ Überschreibt das Standardwetter (Editor, Missionseinstellungen) mit dem ACE-Wetter (kartenbasiert) Přepíše výchozí počasí (editor, nastavení mise) s ACE počasím (podle mapy) Sobreescreve o clima padrão (editor, ajustes de missão) pelo sistema de clima ACE (baseado por mapa) + Felülbírálja az alapértelmezett időjárást (editor, küldetésbeállítások) az ACE időjárással (térkép-alapú) Sync Rain @@ -68,6 +74,7 @@ Regen synchronisieren Synchronizuj déšť Sincronizar chuva + Eső szinkronizálása Synchronizes rain @@ -76,6 +83,7 @@ Synchronisiert den Regen Synchronizace deště Sincroniza a chuva + Szinkronizálja az esőt Sync Wind @@ -84,6 +92,7 @@ Wind synchronisieren Synchronizuj vítr Sincronizar vento + Szél szinkronizálása Synchronizes wind @@ -92,6 +101,7 @@ Synchronisiert den Wind Synchronizace větru Sincroniza o vento + Szinkronizálja a szelet Sync Misc @@ -100,6 +110,7 @@ Sonstiges synchronisieren Synchronizuj různé Sincronizar outros + Egyéb szinkronizálása Synchronizes lightnings, rainbow, fog, ... @@ -108,6 +119,7 @@ Synchronisiert Blitze, Regenbögen, Nebel, ... Synchronizace blesků, duhy, mlhy, ... Sincroniza relâmpagos, arco-íris, neblina... + Szinkronizálja a villámokat, szivárványokat, ködöt, ... Update Interval @@ -116,6 +128,7 @@ Aktualisierungsintervall Interval aktualizace Intervalo de atualização + Frissítési intervallum Defines the interval (seconds) between weather updates @@ -124,6 +137,7 @@ Definiert das Intervall (in Sekunden) zwischen Wetteraktualisierungen Určit interval (v sekundách) mezi aktualizacemi počasí Defina o intervalo (em segundos) entre as atualizações de clima + Megadja az intervallumot (másodpercben) az időjárás-frissítések között \ No newline at end of file diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index f7b4324233..d643dbfd7f 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -108,6 +108,7 @@ Simulationsintervall Interval simulace Intervalo de simulação + Szimulációs intervallum Defines the interval between every calculation step @@ -116,6 +117,7 @@ Definiert das Intervall zwischen jedem Berechnungsschritt Určuje interval mezi každým výpočtem Define o intervalo entre cada cálculo + Megszabja a számítási lépések közötti intervallumot Simulation Radius @@ -124,6 +126,7 @@ Simulationsradius Oblast simulace Radio da Simulação + Szimulációs hatókör Defines the radius around the player (in meters) at which projectiles are wind deflected @@ -142,4 +145,4 @@ Influência do vento na trajetória dos projéteis - + \ No newline at end of file diff --git a/addons/yardage450/stringtable.xml b/addons/yardage450/stringtable.xml index 30887673e7..7a3a6bdef2 100644 --- a/addons/yardage450/stringtable.xml +++ b/addons/yardage450/stringtable.xml @@ -8,6 +8,7 @@ Yardage 450 Yardage 450 Yardage 450 + Yardage 450 Laser Rangefinder @@ -16,6 +17,7 @@ Telémetro láser Laserový dálkoměr Medidor de Distância a laser + Lézeres távolságmérő Yardage 450 - Power Button @@ -24,6 +26,7 @@ Yardage 450 - Botón de encendido Yardage 450 - Tlačítko napájení Yardage 450 - Botão de energia + Yardage 450 - Főkapcsoló gomb - + \ No newline at end of file diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 7c70978aa4..e4af41a208 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -8,6 +8,7 @@ Nastavení Zeuse Zeus-Einstellungen Ajustes do Zeus + Zeus beállítások Provides control over various aspects of Zeus. @@ -40,6 +41,7 @@ Orel Zeuse Zeus-Adler Águia do Zeus + Zeus sas Spawn an eagle that follows the Zeus camera. @@ -48,6 +50,7 @@ Vytvoří orla, který následuje kameru Zeuse. Erstelle einen Adler, der der Zeus-Kamera folgt. Cria uma águia que segue a câmera do Zeus + Lerak egy sast, ami követi a Zeus kamerát. Wind Sounds @@ -56,6 +59,7 @@ Zvuky větru Windgeräusche Sons de vento + Szélhangok Play wind sounds when Zeus remote controls a unit. @@ -72,6 +76,7 @@ Varování před dělostřelectvem Artilleriewarnung Aviso de explosivos + Tüzérségi figyelmeztetés Play a radio warning when Zeus uses ordnance. @@ -80,6 +85,7 @@ Přehrát varování (rádio) když Zeus použije dělostřelectvo. Spiele eine Radiowarnung ab, wenn Zeus Artillerie verwendet. Reproduz uma aviso via rádio quando o Zeus usa um explosivo. + Rádiós figyelmeztetés kiadása, ha a Zeus tüzérséget használ. Reveal Mines @@ -88,6 +94,7 @@ Odhalit miny Enthülle Minen Revelar minas + Aknák feltárása Reveal mines to allies and place map markers. @@ -96,6 +103,7 @@ Odhalí miny pro spojence a umístnit jejich značku na mapu. Enthülle Minen gegenüber Verbündeten und platziere Kartenmarkierungen. Revelar minas para aliados e colocar marcadores no mapa. + Feltárja az aknákat a szövetségeseknek, és jelölőket helyez el a térképen. Reveal to Allies @@ -104,6 +112,7 @@ Odhalit pro spojence An Verbündete weitergeben Revelar para aliados + Feltárás a szövetségeseknek Allies + Map Markers @@ -112,6 +121,7 @@ Spojenci + Značky na mapě Verbündete + Kartenmarkierungen Aliados + Marcadores no mapa + Szövetségesek + térkép jelölők Toggle Captive @@ -120,6 +130,7 @@ Přepnout - Vězeň Gefangennahme umschalten Alternar prisioneiro + Elfogott állapot váltása Toggle Surrender @@ -128,6 +139,7 @@ Přepnout - Vzdávání Aufgabe umschalten Alternar rendição + Kapituláló állapot váltása Toggle Unconscious @@ -136,6 +148,7 @@ Přepnout - Bezvědomí Bewusstlosigkeit umschalten Alternar inconsciência + Eszméletlen állapot váltása Unit must be alive @@ -168,6 +181,7 @@ Jednotka nemí být vězeň Einheit darf nicht gefangen sein Unidade não pode ser prisioneira + Csak elfogatlan egységeken használni Place on a unit @@ -188,6 +202,7 @@ Vyžaduje addon, který není přítomen Benötigt ein Addon, das nicht vorhanden ist Requer um addon que não está presente + Egy jelenleg hiányzó bővítményt igényel - + \ No newline at end of file From b2aa5eee45f601092061b11148707a78227d5bae Mon Sep 17 00:00:00 2001 From: Harakhti Date: Thu, 30 Jul 2015 16:28:50 +0200 Subject: [PATCH 005/137] Row 3 BINGO FUEL --- addons/slideshow/stringtable.xml | 13 +++++++++++++ addons/tripod/stringtable.xml | 10 +++++++--- addons/vehiclelock/stringtable.xml | 16 +++++++++++++--- addons/winddeflection/stringtable.xml | 7 +++++++ addons/zeus/stringtable.xml | 4 ++++ 5 files changed, 44 insertions(+), 6 deletions(-) diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 63547c06e2..f9d96efe69 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -3,42 +3,55 @@ Slideshow + Vetítés This module allows you to set up slide-shows on different objects. One module per image list. Only objects with hiddenSelection 0 are supported. + Ez a modul lehetővé teszi a különböző objektumokon való vetítést. Egy modul/képlista. Csak "hiddenSelection 0"-t tartalmazó objektumok felelnek meg. Objects + Objektumok Object names (can also be synchronized objects) slide-show will be displayed on, separated by commas if multiple. Reference INFO for object support. + Objektum nevek (szinkronizált is lehet) amik a vetítésen megjelennek, több darab esetén vesszővel elválasztva. Objektumtámogatásért az INFO-t tekintsd meg. Controllers + Vezérlők Controller object names, separated by commas if multiple. + Vezérlő objektum nevek, vesszővel elválasztva több darab esetén. Images + Képek List of images that will be used for the slide-show, separated by commas, with full path correctly formatted (eg. images\image.paa). + A képek listája amit a vetítés használni fog, vesszővel elválasztva, megfelelően formázott teljes útvonallal (pl. képek\kép.paa) Interaction Names + Interakciós nevek List of names that will be used for interaction entries, separated by commas, in order of images. + Olyan nevek listája, melyek interakciós célra kellenek, vesszővel elválasztva, kép szerinti sorrendben. Slide Duration + Dia időtartam Duration of each slide. Default: 0 (Automatic Transitions Disabled) + A diák időtartama. Alapértelmezett: 0 (Automatikus váltás letiltva) Slides + Diák \ No newline at end of file diff --git a/addons/tripod/stringtable.xml b/addons/tripod/stringtable.xml index caddca415f..fc74ed8b92 100644 --- a/addons/tripod/stringtable.xml +++ b/addons/tripod/stringtable.xml @@ -10,7 +10,7 @@ SSWT Kit SSWT souprava SSWT Kit - SSWT Kit + SSWT Készlet Kit SSWT @@ -22,7 +22,7 @@ Place SSWT Kit Rozlož souprava SSWT Place SSWT Kit - Place SSWT Kit + SSWT készlet elhelyezése Colocar kit SSWT @@ -32,6 +32,7 @@ Zvednout SSWT soupravu SSWT-Werkzeug aufheben Pegar kit SSWT + SSWT készlet felvétele Adjust SSWT Kit @@ -40,6 +41,7 @@ Regulovat SSWT soupravu SSWT-Werkzeug anpassen Ajustar kit SSWT + SSWT készlet állítása Done @@ -48,6 +50,7 @@ Hotovo Fertig Feito + Kész + Modifier, adjust @@ -56,6 +59,7 @@ + Modifikátor, regulace + Modifikator, anpassen + Modificador, ajuste + + Módosító, szabályzás - + \ No newline at end of file diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 1d567fba62..c190117fd0 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -140,6 +140,7 @@ Fahrzeugsperreinstellungen Nastavení zámku vozidla Configuração de fechadura do veículo + Jármű-zár beállítás Lock Vehicle Inventory @@ -148,6 +149,7 @@ Sperre Fahrzeuginventar Inventář zamčeného vozidla Bloquear inventário do veículo + Jármű rakodótér zárás Locks the inventory of locked vehicles @@ -156,6 +158,7 @@ Sperrt das Inventar von gesperrten Fahrzeugen Zamknout inventář u zamčených vozidel Bloqueia o inventário de veículos fechados + Bezárja a zárt járművek rakterét is Vehicle Starting Lock State @@ -164,6 +167,7 @@ Fahrzeuge spawnen gesperrt Počáteční stav zámku vozidla Estado inicial da fechadura dos veículos + Jármű kezdő zár-állapot Set lock state for all vehicles (removes ambiguous lock states) @@ -172,6 +176,7 @@ Setze Sperrstatus für alle Fahrzeuge (entfernt unklare Sperrzustände) Nastavit stav zámku u všech vozidel (odstraňuje nejednoznačné stavy zámků) Definir estados de fechadura para todos os veículos (remove estados de fechadura ambíguos) + Beállítja a zár-állapotot az összes járműhöz (eltávolítja az azonosíthatatlan zárállapotokat) As Is @@ -180,7 +185,7 @@ Unverändert Jak je Como está - Úgy-ahogy + Úgy-ahogy Locked @@ -189,7 +194,7 @@ Gesperrt Zamčeno Fechado - Zárva + Zárva Unlocked @@ -198,7 +203,7 @@ Offen Odemčeno Aberto - Nyitva + Nyitva Default Lockpick Strength @@ -207,6 +212,7 @@ Standard-Pick-Stärke Výchozí síla páčidla Durabilidade padrão da chave micha + Alapértelmezett zártörő-erősség Default Time to lockpick (in seconds). Default: 10 @@ -215,6 +221,7 @@ Standardzeit um ein Schloss zu knacken (in Sekunden). Standard: 10 Čas k vypáčení zámku (v sekundách). Výchozí: 10 Tempo padrão para forçar a fechadura (em segundos). Padrão: 10 + Alapértelmezett idő a zárfeltöréshez (másodpercben). Alapértelmezett: 10 Settings for lockpick strength and initial vehicle lock state. Removes ambiguous lock states.<br />Source: vehiclelock.pbo @@ -223,6 +230,7 @@ Einstellungen für Pick-Stärke und anfänglichen Fahrzeugsperrzustand. Entfernt unklare Sperrzustände.<br />Quelle: vehiclelock.pbo Nastavení síly vypáčení a počáteční stav zámku vozidla. Odstraňuje nejednoznačné stavy zámků.<br />Zdroj: vehiclelock.pbo Definições para a durabilidade da chave micha e estado inicial da fechadura do veículo. Remove estados de fechadura ambíguas <br /> Fonte: Vehiclelock.pbo + Beállítások a zártörő erősségére és alapértelmezett zár-állapotra a járműveken. Eltávolítja az azonosíthatatlan zár-állapotokat. <br />Forrás: vehiclelock.pbo Vehicle Key Assign @@ -231,6 +239,7 @@ Fahrzeugschlüsselzuweisung Přidělení klíče k vozidlu Atribuição de chave de veículo + Járműkulcs-osztás Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Only valid for objects present at mission start.<br />Source: vehiclelock.pbo @@ -239,6 +248,7 @@ Synchronisiere mit Fahrzeugen und Spielern. Wird eigene Schlüssel an Spieler für jedes synchronisierte Fahrzeuge aushändigen. Nur gültig für am Missionsstart existierende Fahrzeuge.<br />Quelle: vehiclelock.pbo Synchronizuj s vozidly a hráči. Hráč dostane klíč ke každému synchonizovanému vozidlu. Platné pouze pro objekty přítomné na začátku mise.<br />Zdroj: vehiclelock.pbo Sincronizar com veículos e jogadores. Irá distribuir chaves personalizadas para os jogadores para cada veículo sincronizado. Só é válido para objetos presentes no início da missão <br /> Fonte: vehiclelock.pbo + Szinkronizál a járművekkel és játékosokkal. Egyedi kulcsokat oszt ki a játékosoknak minden szinkronizált járműhöz. Csak a küldetés indításakor jelenlévő járművekhez érvényes. <br />Forrás: vehiclelock.pbo \ No newline at end of file diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index d643dbfd7f..dd96760310 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -68,6 +68,7 @@ Účinky větru Windablenkung Desvio de vento + Szél-hárítás Wind Deflection @@ -76,6 +77,7 @@ Windablenkung Účinky větru Desvio de vento + Szél-hárítás Enables wind deflection @@ -84,6 +86,7 @@ Aktiviert Windablenkung Umožňit vliv větru Ativa o desvio de vento + Engedélyezi a szél-hárítást Vehicle Enabled @@ -92,6 +95,7 @@ Fahrzeuge aktiviert Vozidla povolena Ativado em veículos + Jármű engedélyezve Enables wind deflection for static/vehicle gunners @@ -100,6 +104,7 @@ Aktiviere Windablenkung für statische oder Fahrzeugschützen Umožnit vliv větru pro střelce z vozidla/statiky Ativa o desvio de vento para atiradores de estáticas e veículos + Engedélyezi a szél-hárítást a statikus/jármű-lövészeknél Simulation Interval @@ -135,6 +140,7 @@ Gibt den Radius (in Metern) um den Spieler an, in dem Projektile vom Wind beeinflusst werden Definuje oblast kolem hráče (v metrech) v které je projektil ovlivněn větrem Define o raio ao redor do jogador (em metros) em qual os projéteis são desviados pelo vento + Meghatározza a játékos körüli hatókört (méterben), ahol a lövedékeket háríthatja a szél Wind influence on projectiles trajectory @@ -143,6 +149,7 @@ Windeinfluss auf die Geschossbahnen Vítr ovlivňuje trajektorii projektilu Influência do vento na trajetória dos projéteis + Szél hatása a lövedékek röppályájára \ No newline at end of file diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index e4af41a208..2246cd1786 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -17,6 +17,7 @@ Poskytuje kontrolu na různými aspekty Zeuse. Bietet die Steuerung verschiedener Zeus-Optionen an. Proporciona controle sobre diversos aspectos do Zeus. + Különböző beállítási lehetőségeket biztosít a Zeus részeihez. Ascension Messages @@ -25,6 +26,7 @@ Zpráva o novém Zeusovi Aufstiegsnachrichten Mensagens de ascensão + Felemelkedési üzenetek Display global popup messages when a player is assigned as Zeus. @@ -33,6 +35,7 @@ Zobrazit globální zprávu když je hráč přiřazen jako Zeus. Zeige globale Popup-Nachrichten wenn ein Spieler zu Zeus wird. Mostra uma mensagem popup quando um jogador é atribuido ao Zeus. + Globális üzeneteket jelez ki, ha egy játékos Zeus-nak lesz beosztva. Zeus Eagle @@ -68,6 +71,7 @@ Přehrát varování (vítr) když Zeus převezmě kontrolu nad jednotkou. Spiele Windgeräusche ab, wenn Zeus eine Einheit steuert. Reproduz sons de vento quando uma unidade é remotamente controlada pelo Zeus. + Szélhangokat játszik le, ha a Zeus távvezérel egy egységet. Ordnance Warning From 33314f8a9e7675f7e6694ebf86062d9e02213924 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 31 Jul 2015 23:32:25 +0100 Subject: [PATCH 006/137] Adjust spectator camera boom speed Vertical camera movement (boom) was previously at a constant speed. However this felt too slow at times, half the horizontal (dolly) speed should improve this. --- addons/spectator/functions/fnc_handleInterface.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 864ae32adc..709c0263b2 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -224,7 +224,7 @@ switch (toLower _mode) do { [_display,nil,nil,true] call FUNC(toggleInterface); }; case 16: { // Q - GVAR(camBoom) = 0.5; + GVAR(camBoom) = 0.5 * GVAR(camSpeed); }; case 17: { // W GVAR(camDolly) set [1, GVAR(camSpeed)]; @@ -245,7 +245,7 @@ switch (toLower _mode) do { [_display,nil,true] call FUNC(toggleInterface); }; case 44: { // Z - GVAR(camBoom) = -0.5; + GVAR(camBoom) = -0.5 * GVAR(camSpeed); }; case 49: { // N if (_ctrl) then { From 861119f22fa2449bf77697a502ac46e246be9188 Mon Sep 17 00:00:00 2001 From: Harakhti Date: Sat, 1 Aug 2015 14:54:29 +0200 Subject: [PATCH 007/137] Sync rephrasing with upstream The humor wilts quickly. --- addons/finger/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/finger/stringtable.xml b/addons/finger/stringtable.xml index 57fab198fb..0b1b4f65d7 100644 --- a/addons/finger/stringtable.xml +++ b/addons/finger/stringtable.xml @@ -44,7 +44,7 @@ How far away players can finger each other. [default: 4] - Milyen messziről ujjazhatják egymást a játékosok. [alapértelmezett: 4] + A maximális távolság, amelyben a közeli játékosoknak megjelenik az indikátor. [alapértelmezett: 4 méter] \ No newline at end of file From 612aa2d679515c0d74156c823852efe10083bf5a Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 1 Aug 2015 18:10:11 +0100 Subject: [PATCH 008/137] Separate spectator physical and virtual states With the changes planned to allow spectator in the true death state, physical changes aren't applicable in all of the possible usage cases. This separates the physical process into new function ace_spectator_fnc_stageSpectator --- addons/spectator/XEH_preInit.sqf | 1 + .../spectator/functions/fnc_setSpectator.sqf | 49 +++---------- .../functions/fnc_stageSpectator.sqf | 68 +++++++++++++++++++ 3 files changed, 77 insertions(+), 41 deletions(-) create mode 100644 addons/spectator/functions/fnc_stageSpectator.sqf diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index e5872c3272..2cc65602cc 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -16,6 +16,7 @@ PREP(handleUnits); PREP(moduleSpectatorSettings); PREP(setCameraAttributes); PREP(setSpectator); +PREP(stageSpectator); PREP(transitionCamera); PREP(toggleInterface); PREP(updateCameraModes); diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index fd3dd9861c..f4dc86c3da 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -1,10 +1,14 @@ /* * Author: SilentSpike - * Sets target unit to the given spectator state + * Sets target unit to the given spectator state (virtually) + * To physically handle a spectator see ace_spectator_fnc_stageSpectator + * + * Units will be able to communicate in ACRE/TFAR as appropriate + * The spectator interface will be opened/closed * * Arguments: * 0: Unit to put into spectator state - * 1: New spectator state + * 1: Spectator state * * Return Value: * None @@ -17,10 +21,7 @@ #include "script_component.hpp" -params ["_unit",["_set",true,[true]],["_target",objNull,[objNull]]]; - -// No change, no service (but allow spectators who respawn to be reset) -if !(_set || (_unit getVariable [QGVAR(isSpectator), false])) exitWith {}; +params ["_unit", ["_set",true,[true]]]; // Only run for player units if !(isPlayer _unit) exitWith {}; @@ -29,49 +30,15 @@ if !(local _unit) exitwith { [[_unit, _set, _target], QFUNC(setSpectator), _unit] call EFUNC(common,execRemoteFnc); }; -// Prevent player falling into water -_unit enableSimulation !_set; - -// Move to/from group as appropriate -[_unit, _set, QGVAR(isSpectator), side group _unit] call EFUNC(common,switchToGroupSide); - if (_set) then { - // Move and hide the player ASAP to avoid being seen - _unit setPos (getMarkerPos QGVAR(respawn)); - - // Ghosts can't talk - [_unit, QGVAR(isSpectator)] call EFUNC(common,hideUnit); - [_unit, QGVAR(isSpectator)] call EFUNC(common,muteUnit); - ["open"] call FUNC(handleInterface); } else { ["close"] call FUNC(handleInterface); - - // Physical beings can talk - [_unit, QGVAR(isSpectator)] call EFUNC(common,unhideUnit); - [_unit, QGVAR(isSpectator)] call EFUNC(common,unmuteUnit); - - private "_marker"; - _marker = ["respawn_west","respawn_east","respawn_guerrila","respawn_civilian"] select ([west,east,resistance,civilian] find (side group _unit)); - _unit setPos (getMarkerPos _marker); }; -// Enable/disable input as appropriate -//[QGVAR(isSpectator), _set] call EFUNC(common,setDisableUserInputStatus); - // Handle common addon audio if (["ace_hearing"] call EFUNC(common,isModLoaded)) then {EGVAR(hearing,disableVolumeUpdate) = _set}; if (["acre_sys_radio"] call EFUNC(common,isModLoaded)) then {[_set] call acre_api_fnc_setSpectator}; if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {[_unit, _set] call TFAR_fnc_forceSpectator}; -// Spectators ignore damage (vanilla and ace_medical) -_unit allowDamage !_set; -_unit setVariable [QEGVAR(medical,allowDamage), !_set]; - -// No theoretical change if an existing spectator was reset -if !(_set && (_unit getVariable [QGVAR(isSpectator), false])) then { - // Mark spectator state for reference - _unit setVariable [QGVAR(isSpectator), _set, true]; - - ["spectatorChanged",[_set]] call EFUNC(common,localEvent); -}; +["spectatorSet",[_set]] call EFUNC(common,localEvent); diff --git a/addons/spectator/functions/fnc_stageSpectator.sqf b/addons/spectator/functions/fnc_stageSpectator.sqf new file mode 100644 index 0000000000..2f6741e35a --- /dev/null +++ b/addons/spectator/functions/fnc_stageSpectator.sqf @@ -0,0 +1,68 @@ +/* + * Author: SilentSpike + * Sets target unit to the given spectator state (physically) + * To virtually handle a spectator see ace_spectator_fnc_setSpectator + * + * Units will be gathered at marker ace_spectator_respawn (or [0,0,0] by default) + * Upon unstage, units will be moved to the position they were in upon staging + * + * Arguments: + * 0: Unit to put into spectator stage + * 1: Spectator stage + * + * Return Value: + * None + * + * Example: + * [player, false] call ace_spectator_fnc_stageSpectator + * + * Public: Yes + */ + +#include "script_component.hpp" + +params ["_unit", ["_set",true,[true]]]; + +// No change, no service (but allow spectators who respawn to be reset) +if !(_set || (GETVAR(_unit,GVAR(isSpectator),false))) exitWith {}; + +// Only run for player units +if !(isPlayer _unit) exitWith {}; + +if !(local _unit) exitwith { + [[_unit, _set, _target], QFUNC(stageSpectator), _unit] call EFUNC(common,execRemoteFnc); +}; + +// Prevent player falling into water +_unit enableSimulation !_set; + +// Move to/from group as appropriate +[_unit, _set, QGVAR(isSpectator), side group _unit] call EFUNC(common,switchToGroupSide); + +if (_set) then { + // Move and hide the player ASAP to avoid being seen + GVAR(oldPos) = getPosATL _unit; + _unit setPos (getMarkerPos QGVAR(respawn)); + + // Ghosts can't talk + [_unit, QGVAR(isSpectator)] call EFUNC(common,hideUnit); + [_unit, QGVAR(isSpectator)] call EFUNC(common,muteUnit); +} else { + // Physical beings can talk + [_unit, QGVAR(isSpectator)] call EFUNC(common,unhideUnit); + [_unit, QGVAR(isSpectator)] call EFUNC(common,unmuteUnit); + + _unit setPosATL GVAR(oldPos); +}; + +// Spectators ignore damage (vanilla and ace_medical) +_unit allowDamage !_set; +_unit setVariable [QEGVAR(medical,allowDamage), !_set]; + +// No theoretical change if an existing spectator was reset +if !(_set isEqualTo (GETVAR(_unit,GVAR(isSpectator),false))) then { + // Mark spectator state for reference + _unit setVariable [QGVAR(isSpectator), _set, true]; + + ["spectatorStaged",[_set]] call EFUNC(common,localEvent); +}; From 38e08d513a91fe0c084ecfd2d8dfd575224961d2 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 2 Aug 2015 12:34:35 +0100 Subject: [PATCH 009/137] Clear spectator display variable at preInit uiNamespace persists between missions and should be reset on mission start --- addons/spectator/XEH_preInit.sqf | 2 ++ addons/spectator/functions/fnc_handleInterface.sqf | 8 ++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index 2cc65602cc..a77d731478 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -38,6 +38,8 @@ GVAR(camUnit) = objNull; GVAR(camVision) = -2; GVAR(camZoom) = 1.25; +SETUVAR(GVAR(display),nil); + GVAR(showComp) = true; GVAR(showHelp) = true; GVAR(showIcons) = true; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 709c0263b2..2fa0d1439c 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -95,9 +95,7 @@ switch (toLower _mode) do { case "onload": { _args params ["_display"]; - with uiNamespace do { - GVAR(display) = _display; - }; + SETUVAR(GVAR(display),_display); // Always show interface and hide map upon opening [_display,nil,nil,!GVAR(showInterface),GVAR(showMap)] call FUNC(toggleInterface); @@ -151,9 +149,7 @@ switch (toLower _mode) do { //_display displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; }; case "onunload": { - with uiNamespace do { - GVAR(display) = nil; - }; + SETUVAR(GVAR(display),nil); GVAR(camHandler) = nil; GVAR(compHandler) = nil; From 63c034e348421d22a01e84f923841b48e76deebc Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 2 Aug 2015 12:47:26 +0100 Subject: [PATCH 010/137] Differentiate between staged and set spectators Existing variable "ace_spectator_isSpectator" split into counterparts "ace_spectator_isSet" and "ace_spectator_isStaged" in order to better manage spectator events --- addons/spectator/XEH_postInit.sqf | 2 +- .../spectator/functions/fnc_setSpectator.sqf | 11 ++++++++++- .../spectator/functions/fnc_stageSpectator.sqf | 18 +++++++++--------- addons/spectator/functions/fnc_updateUnits.sqf | 2 +- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/addons/spectator/XEH_postInit.sqf b/addons/spectator/XEH_postInit.sqf index bad3758c19..45ac78e89c 100644 --- a/addons/spectator/XEH_postInit.sqf +++ b/addons/spectator/XEH_postInit.sqf @@ -2,7 +2,7 @@ //#include "initKeybinds.sqf"; // Add interaction menu exception -["isNotSpectating", {!((_this select 0) getVariable [QGVAR(isSpectator), false])}] call EFUNC(common,addCanInteractWithCondition); +["isNotSpectating", {!(GETVAR((_this select 0),GVAR(isStaged),false))}] call EFUNC(common,addCanInteractWithCondition); ["SettingsInitialized", { GVAR(availableModes) = [[0,1,2], [1,2], [0], [1], [2]] select GVAR(restrictModes); diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index f4dc86c3da..2f8e1d3c2d 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -23,6 +23,9 @@ params ["_unit", ["_set",true,[true]]]; +// No change, no service (but allow spectators to be reset) +if !(_set || (GETVAR(_unit,GVAR(isSet),false))) exitWith {}; + // Only run for player units if !(isPlayer _unit) exitWith {}; @@ -41,4 +44,10 @@ if (["ace_hearing"] call EFUNC(common,isModLoaded)) then {EGVAR(hearing,disableV if (["acre_sys_radio"] call EFUNC(common,isModLoaded)) then {[_set] call acre_api_fnc_setSpectator}; if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {[_unit, _set] call TFAR_fnc_forceSpectator}; -["spectatorSet",[_set]] call EFUNC(common,localEvent); +// No theoretical change if an existing spectator was reset +if !(_set isEqualTo (GETVAR(_unit,GVAR(isSet),false))) then { + // Mark spectator state for reference + _unit setVariable [QGVAR(isSet), _set, true]; + + ["spectatorSet",[_set]] call EFUNC(common,localEvent); +}; diff --git a/addons/spectator/functions/fnc_stageSpectator.sqf b/addons/spectator/functions/fnc_stageSpectator.sqf index 2f6741e35a..84bd6ffced 100644 --- a/addons/spectator/functions/fnc_stageSpectator.sqf +++ b/addons/spectator/functions/fnc_stageSpectator.sqf @@ -23,8 +23,8 @@ params ["_unit", ["_set",true,[true]]]; -// No change, no service (but allow spectators who respawn to be reset) -if !(_set || (GETVAR(_unit,GVAR(isSpectator),false))) exitWith {}; +// No change, no service (but allow spectators to be reset) +if !(_set || (GETVAR(_unit,GVAR(isStaged),false))) exitWith {}; // Only run for player units if !(isPlayer _unit) exitWith {}; @@ -37,7 +37,7 @@ if !(local _unit) exitwith { _unit enableSimulation !_set; // Move to/from group as appropriate -[_unit, _set, QGVAR(isSpectator), side group _unit] call EFUNC(common,switchToGroupSide); +[_unit, _set, QGVAR(isStaged), side group _unit] call EFUNC(common,switchToGroupSide); if (_set) then { // Move and hide the player ASAP to avoid being seen @@ -45,12 +45,12 @@ if (_set) then { _unit setPos (getMarkerPos QGVAR(respawn)); // Ghosts can't talk - [_unit, QGVAR(isSpectator)] call EFUNC(common,hideUnit); - [_unit, QGVAR(isSpectator)] call EFUNC(common,muteUnit); + [_unit, QGVAR(isStaged)] call EFUNC(common,hideUnit); + [_unit, QGVAR(isStaged)] call EFUNC(common,muteUnit); } else { // Physical beings can talk - [_unit, QGVAR(isSpectator)] call EFUNC(common,unhideUnit); - [_unit, QGVAR(isSpectator)] call EFUNC(common,unmuteUnit); + [_unit, QGVAR(isStaged)] call EFUNC(common,unhideUnit); + [_unit, QGVAR(isStaged)] call EFUNC(common,unmuteUnit); _unit setPosATL GVAR(oldPos); }; @@ -60,9 +60,9 @@ _unit allowDamage !_set; _unit setVariable [QEGVAR(medical,allowDamage), !_set]; // No theoretical change if an existing spectator was reset -if !(_set isEqualTo (GETVAR(_unit,GVAR(isSpectator),false))) then { +if !(_set isEqualTo (GETVAR(_unit,GVAR(isStaged),false))) then { // Mark spectator state for reference - _unit setVariable [QGVAR(isSpectator), _set, true]; + _unit setVariable [QGVAR(isStaged), _set, true]; ["spectatorStaged",[_set]] call EFUNC(common,localEvent); }; diff --git a/addons/spectator/functions/fnc_updateUnits.sqf b/addons/spectator/functions/fnc_updateUnits.sqf index 0393fa0e36..ef8fc3b4f1 100644 --- a/addons/spectator/functions/fnc_updateUnits.sqf +++ b/addons/spectator/functions/fnc_updateUnits.sqf @@ -55,7 +55,7 @@ _filteredUnits = []; {(_x isKindOf "CAManBase")} && {(side group _x) in _sides} && // Side filter {simulationEnabled _x} && - {!(_x getVariable [QGVAR(isSpectator), false])} // Who watches the watchmen? + {!(_x getVariable [QGVAR(isStaged), false])} // Who watches the watchmen? ) then { _filteredUnits pushBack _x; }; From 52460182c9c662dacc76e27f21a5d9e8b37786e8 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 2 Aug 2015 16:42:24 +0100 Subject: [PATCH 011/137] Enable spectator on death system New spectator on death system should enter spectator mode upon dying and exit upon respawning. Only virtual spectator state is suitable for this system since the body should remain as is. --- addons/spectator/functions/fnc_handleKilled.sqf | 9 ++++----- addons/spectator/functions/fnc_handleRespawn.sqf | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/addons/spectator/functions/fnc_handleKilled.sqf b/addons/spectator/functions/fnc_handleKilled.sqf index 67c556cc3f..05671ed749 100644 --- a/addons/spectator/functions/fnc_handleKilled.sqf +++ b/addons/spectator/functions/fnc_handleKilled.sqf @@ -1,7 +1,7 @@ /* * Author: SilentSpike - * Cache necessary details and process unit for spectator on death - * Part of the basic spectator system + * Set inital camera attributes and set as spectator on death + * Part of the spectator during death system * * Arguments: * 0: Corpse @@ -17,11 +17,10 @@ params ["_unit","_killer"]; -// Remove from group to prevent appearing on HUD upon respawn -[_unit, true, QGVAR(isSpectator), side group _unit] call EFUNC(common,switchToGroupSide); - if (isNull _killer) then { [2,_unit] call FUNC(setCameraAttributes); } else { [2,_killer] call FUNC(setCameraAttributes); }; + +[_unit] call FUNC(setSpectator); diff --git a/addons/spectator/functions/fnc_handleRespawn.sqf b/addons/spectator/functions/fnc_handleRespawn.sqf index 9b6b0bb802..3e7dfa41f3 100644 --- a/addons/spectator/functions/fnc_handleRespawn.sqf +++ b/addons/spectator/functions/fnc_handleRespawn.sqf @@ -1,7 +1,7 @@ /* * Author: SilentSpike - * Start the interface on respawn - * Part of the basic spectator system + * Un-set as spectator on respawn + * Part of the spectator during death system * * Arguments: * 0: New unit @@ -15,4 +15,4 @@ #include "script_component.hpp" -[_this select 0] call FUNC(setSpectator); +[_unit,false] call FUNC(setSpectator); From 9b764bbba45a3980114676842d07c260379c55c2 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 2 Aug 2015 17:27:32 +0100 Subject: [PATCH 012/137] Preserve Polish translations from master branch Since spectator was pushed back to a feature branch from the release branch these translations from a PR were also lost (as the commits were prior to the removal commit) when it was merged after the fact. --- addons/spectator/stringtable.xml | 70 +++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 8b91608981..1f74d08c43 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -3,195 +3,253 @@ Spectator Settings + Ustawienia obserwatora Configure how the spectator system will operate by default. + Skonfiguruj domyślne ustawienia obserwatora. Spectate on death + Obserwator po śmierci Enables spectator upon death. + Włącz obserwatora po śmierci Unit filter + Filtr jednostek Method of filtering spectatable units. + Wybierz jednostki, jakie będzie można obserwować po uruchomeniu obserwatora. No units + Brak jednostek Only players + Tylko gracze All units + Wszystkie jednostki Side filter + Filtr stron Method of filtering spectatable sides. + Wybierz strony, jakie będzie można obserwować po uruchomeniu obserwatora. Player side + Strona gracza Friendly sides + Strony sojusznicze Hostile sides + Strony wrogie All sides + Wszystkie strony Camera modes + Tryby kamery Camera modes that can be used. + Tryby kamery, jakie mogą być używane. All + Wszystkie Free only + Tylko wolna Internal only + Tylko wewnętrzna External only + Tylko zewnętrzna Internal and external + Wewnętrzna i zewnętrzna Vision modes + Tryby wizji Vision modes that can be used. + Tryby wizji, jakie mogą być używane. Night vision + Noktowizja Thermal imaging + Termowizja Unit icons + Ikony jednostek Render icons above spectatable units. + Renderuj ikony nad głowami jednostek, które można obserwować. - Spectator Controls + Sterowanie obserwatorem Free + Wolna Internal + Wewnętrzna External + Zewnętrzna Normal + Normalna Night + Noc Thermal + Termo - Free Camera Controls + Wolne sterowanie kamerą Camera Forward + Kamera naprzód Camera Backward + Kamera w tył Camera Left + Kamera w lewo Camera Right + Kamera w prawo Camera Up + Kamera w górę Camera Down + Kamera w dół Pan Camera + Panoramowanie Dolly Camera + Płynna kamera Lock Camera to Target + Zablokuj kamerę na celu - Zoom In/Out + Zoom +/- + Zoom +/- - Speed Up/Down + Speed +/- + Prędkość +/- Next Vision Mode + Następny tryb wizji Previous Vision Mode + Poprzedni tryb wizji - Interface Controls + Sterowanie interfejsem Toggle Interface + Przełącz interfejs Toggle Unit Icons + Przełącz ikony jednostek Toggle Unit List + Przełącz listę jednostek Toggle Toolbar + Przełącz pasek narzędzi Toggle Compass + Przełącz kompas Toggle Map + Przełącz mapę Toggle Help + Przełącz pomoc - Other Controls + Pozostałe sterowanie Next Camera + Następna kamera Previous Camera + Poprzednia kamera Next Unit + Następna jednostka Previous Unit + Poprzednia jednostka From b87b4ea16aba273aca2ad287239bd45f60c890c5 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 3 Aug 2015 00:22:50 +0100 Subject: [PATCH 013/137] Improve spectator GUI reopening prevention Using boolean instead of simply checking for the display. Checking for diplay was unreliable since it can be technically closed while theoretically open during the escape menu and such. --- addons/spectator/XEH_preInit.sqf | 2 +- addons/spectator/functions/fnc_handleInterface.sqf | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index a77d731478..3b317ba904 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -38,7 +38,7 @@ GVAR(camUnit) = objNull; GVAR(camVision) = -2; GVAR(camZoom) = 1.25; -SETUVAR(GVAR(display),nil); +GVAR(open) = false; GVAR(showComp) = true; GVAR(showHelp) = true; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 2fa0d1439c..114f4e163b 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -23,7 +23,8 @@ switch (toLower _mode) do { // Safely open/close the interface case "open": { // Prevent reopening - if !(isNull (GETUVAR(GVAR(display),displayNull))) exitWith {}; + if (GVAR(open)) exitWith {}; + GVAR(open) = true; // Initalize camera variables GVAR(camBoom) = 0; @@ -57,13 +58,13 @@ switch (toLower _mode) do { }; case "close": { // Can't close a second time - if (isNull (GETUVAR(GVAR(display),displayNull))) exitWith {}; + if !(GVAR(open)) exitWith {}; + GVAR(open) = false; // Terminate interface while {dialog} do { closeDialog 0; }; - GETUVAR(GVAR(display),displayNull) closeDisplay 0; // Terminate camera GVAR(camera) cameraEffect ["terminate", "back"]; @@ -95,8 +96,6 @@ switch (toLower _mode) do { case "onload": { _args params ["_display"]; - SETUVAR(GVAR(display),_display); - // Always show interface and hide map upon opening [_display,nil,nil,!GVAR(showInterface),GVAR(showMap)] call FUNC(toggleInterface); @@ -149,8 +148,7 @@ switch (toLower _mode) do { //_display displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; }; case "onunload": { - SETUVAR(GVAR(display),nil); - + // Kill GUI PFHs GVAR(camHandler) = nil; GVAR(compHandler) = nil; GVAR(iconHandler) = nil; From 98b088f26f717d172c3bdb5e1a0695412ce38c5a Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 3 Aug 2015 00:24:36 +0100 Subject: [PATCH 014/137] Fix pre-spectator position saving When staging a spectator (physically applying the spectator state) the unit position is saved for potential later restoration. This shouldn't be done multiple times since the function can be called again to reset staged units. --- addons/spectator/functions/fnc_handleRespawn.sqf | 2 ++ addons/spectator/functions/fnc_stageSpectator.sqf | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/spectator/functions/fnc_handleRespawn.sqf b/addons/spectator/functions/fnc_handleRespawn.sqf index 3e7dfa41f3..aa695dd553 100644 --- a/addons/spectator/functions/fnc_handleRespawn.sqf +++ b/addons/spectator/functions/fnc_handleRespawn.sqf @@ -15,4 +15,6 @@ #include "script_component.hpp" +params ["_unit","_oldUnit"]; + [_unit,false] call FUNC(setSpectator); diff --git a/addons/spectator/functions/fnc_stageSpectator.sqf b/addons/spectator/functions/fnc_stageSpectator.sqf index 84bd6ffced..bac5174601 100644 --- a/addons/spectator/functions/fnc_stageSpectator.sqf +++ b/addons/spectator/functions/fnc_stageSpectator.sqf @@ -40,13 +40,16 @@ _unit enableSimulation !_set; [_unit, _set, QGVAR(isStaged), side group _unit] call EFUNC(common,switchToGroupSide); if (_set) then { - // Move and hide the player ASAP to avoid being seen - GVAR(oldPos) = getPosATL _unit; - _unit setPos (getMarkerPos QGVAR(respawn)); + // Position should only be saved on first entry + if !(GETVAR(_unit,GVAR(isStaged),false)) then { + GVAR(oldPos) = getPosATL _unit; + }; // Ghosts can't talk [_unit, QGVAR(isStaged)] call EFUNC(common,hideUnit); [_unit, QGVAR(isStaged)] call EFUNC(common,muteUnit); + + _unit setPos (getMarkerPos QGVAR(respawn)); } else { // Physical beings can talk [_unit, QGVAR(isStaged)] call EFUNC(common,unhideUnit); From f5e7185aec965d0166cf8cae2e85a6b81d717a44 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 3 Aug 2015 13:04:36 +0100 Subject: [PATCH 015/137] Fix spectator camera exiting mechanism When using ACE_Player the camera would return to the dead body. It makes sense to simply pass the reset unit by reference to the camera exit code. --- addons/spectator/functions/fnc_handleInterface.sqf | 4 +++- addons/spectator/functions/fnc_setSpectator.sqf | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 114f4e163b..255d282983 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -57,6 +57,8 @@ switch (toLower _mode) do { }; }; case "close": { + _args params ["_unit"]; + // Can't close a second time if !(GVAR(open)) exitWith {}; GVAR(open) = false; @@ -71,7 +73,7 @@ switch (toLower _mode) do { camDestroy GVAR(camera); // Return to player view - ACE_Player switchCamera "internal"; + _unit switchCamera "internal"; // Cleanup camera variables GVAR(camera) = nil; diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index 2f8e1d3c2d..b6e85926c5 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -36,7 +36,7 @@ if !(local _unit) exitwith { if (_set) then { ["open"] call FUNC(handleInterface); } else { - ["close"] call FUNC(handleInterface); + ["close",_unit] call FUNC(handleInterface); }; // Handle common addon audio From 5bfa4e597113356d534d28cef9b5dc011b761e6f Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 3 Aug 2015 15:18:09 +0100 Subject: [PATCH 016/137] Improve spectator camera vision mode on start The spectator camera should start in night vision mode if the sun to moon transition state is appropriate --- addons/spectator/functions/fnc_handleInterface.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 255d282983..315398ab0c 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -37,6 +37,11 @@ switch (toLower _mode) do { GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; + // Camera starts with night vision if it's dark + if (sunOrMoon < 1) then { + [nil,nil,-1] call FUNC(setCameraAttributes); + }; + // Initalize the camera view GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); [] call FUNC(transitionCamera); From 7e9500f2ca6a240458b16031153565ff8e451efa Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 3 Aug 2015 21:38:44 +0100 Subject: [PATCH 017/137] Enable ace_spectator respawn framework integration Seamlessly integrates the spectator system with the vanilla respawn framework when the onDeath setting is enabled. This commit makes a lot of changes: - Edit BI functions used by the vanilla respawn framework to enable support for ace_spectator. - Set spectator state is now tracked using a GVAR for the local player since using a unit won't be reliable all of the time. However unit is still marked for any filtering purposes. - Instead of NV being used based on the sun to moon transition state by default, that functionality only takes place in the integrated system so that custom frameworks can do what they want. - Seagull units are hidden when using framework integration since they're spawned by the engine with respawn type 1 and they just hang around undesirably --- addons/spectator/XEH_postInit.sqf | 7 - addons/spectator/XEH_preInit.sqf | 12 +- addons/spectator/config.cpp | 35 +++ .../functions/fnc_bi_respawnBase.sqf | 35 +++ .../functions/fnc_bi_respawnCounter.sqf | 35 +++ .../functions/fnc_bi_respawnEndMission.sqf | 62 ++++ .../functions/fnc_bi_respawnInstant.sqf | 35 +++ .../functions/fnc_bi_respawnNone.sqf | 293 ++++++++++++++++++ .../functions/fnc_bi_respawnSeagull.sqf | 101 ++++++ .../functions/fnc_bi_respawnSpectator.sqf | 59 ++++ .../functions/fnc_bi_respawnWave.sqf | 43 +++ .../functions/fnc_handleInterface.sqf | 22 +- .../spectator/functions/fnc_handleKilled.sqf | 26 -- .../spectator/functions/fnc_handleRespawn.sqf | 20 -- .../functions/fnc_setCameraAttributes.sqf | 2 +- .../spectator/functions/fnc_setSpectator.sqf | 31 +- .../functions/fnc_stageSpectator.sqf | 4 +- 17 files changed, 736 insertions(+), 86 deletions(-) create mode 100644 addons/spectator/functions/fnc_bi_respawnBase.sqf create mode 100644 addons/spectator/functions/fnc_bi_respawnCounter.sqf create mode 100644 addons/spectator/functions/fnc_bi_respawnEndMission.sqf create mode 100644 addons/spectator/functions/fnc_bi_respawnInstant.sqf create mode 100644 addons/spectator/functions/fnc_bi_respawnNone.sqf create mode 100644 addons/spectator/functions/fnc_bi_respawnSeagull.sqf create mode 100644 addons/spectator/functions/fnc_bi_respawnSpectator.sqf create mode 100644 addons/spectator/functions/fnc_bi_respawnWave.sqf delete mode 100644 addons/spectator/functions/fnc_handleKilled.sqf delete mode 100644 addons/spectator/functions/fnc_handleRespawn.sqf diff --git a/addons/spectator/XEH_postInit.sqf b/addons/spectator/XEH_postInit.sqf index 45ac78e89c..35b463837f 100644 --- a/addons/spectator/XEH_postInit.sqf +++ b/addons/spectator/XEH_postInit.sqf @@ -7,11 +7,4 @@ ["SettingsInitialized", { GVAR(availableModes) = [[0,1,2], [1,2], [0], [1], [2]] select GVAR(restrictModes); GVAR(availableVisions) = [[-2,-1,0,1], [-2,-1], [-2,0,1], [-2]] select GVAR(restrictVisions); - - if !(hasInterface) exitWith {}; - - if (GVAR(onDeath)) then { - player addEventHandler ["Killed",FUNC(handleKilled)]; - player addEventHandler ["Respawn",FUNC(handleRespawn)]; - }; }] call EFUNC(common,addEventHandler); diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index 3b317ba904..73c629a0ce 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -2,15 +2,21 @@ ADDON = false; +PREP(bi_respawnBase); +PREP(bi_respawnCounter); +PREP(bi_respawnEndMission); +PREP(bi_respawnInstant); +PREP(bi_respawnNone); +PREP(bi_respawnSeagull); +PREP(bi_respawnSpectator); +PREP(bi_respawnWave); PREP(cacheUnitInfo); PREP(cycleCamera); PREP(handleCamera); PREP(handleCompass); PREP(handleIcons); PREP(handleInterface); -PREP(handleKilled); PREP(handleMouse); -PREP(handleRespawn); PREP(handleToolbar); PREP(handleUnits); PREP(moduleSpectatorSettings); @@ -38,7 +44,7 @@ GVAR(camUnit) = objNull; GVAR(camVision) = -2; GVAR(camZoom) = 1.25; -GVAR(open) = false; +GVAR(isSet) = false; GVAR(showComp) = true; GVAR(showHelp) = true; diff --git a/addons/spectator/config.cpp b/addons/spectator/config.cpp index e686c75294..eb73761e5f 100644 --- a/addons/spectator/config.cpp +++ b/addons/spectator/config.cpp @@ -16,3 +16,38 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "ui\interface.hpp" + +class CfgRespawnTemplates { + class None { + onPlayerKilled = QFUNC(bi_respawnNone); + }; + class Spectator { + onPlayerKilled = QFUNC(bi_respawnSpectator); + onPlayerRespawn = QFUNC(bi_respawnSpectator); + }; + class Instant { + onPlayerKilled = QFUNC(bi_respawnInstant); + onPlayerRespawn = QFUNC(bi_respawnInstant); + }; + class Base { + onPlayerKilled = QFUNC(bi_respawnBase); + onPlayerRespawn = QFUNC(bi_respawnBase); + }; + class EndMission + { + onPlayerKilled = QFUNC(bi_respawnEndMission); + onPlayerRespawn = QFUNC(bi_respawnEndMission); + }; + class Seagull { + onPlayerRespawn = QFUNC(bi_respawnSeagull); + }; + class Wave + { + onPlayerKilled = QFUNC(bi_respawnWave); + onPlayerRespawn = QFUNC(bi_respawnWave); + }; + class Counter { + onPlayerKilled = QFUNC(bi_respawnCounter); + onPlayerRespawn = QFUNC(bi_respawnCounter); + }; +}; diff --git a/addons/spectator/functions/fnc_bi_respawnBase.sqf b/addons/spectator/functions/fnc_bi_respawnBase.sqf new file mode 100644 index 0000000000..7ea5b0c745 --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnBase.sqf @@ -0,0 +1,35 @@ +/* + * Author: Bohemia Interactive + * Part of the BI respawn framework + * Handles base respawn type (respawn on marker) + * Edited to support ace_spectator integration + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +if !(GVAR(onDeath)) exitWith {}; + +params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]]]; + +if (alive _unit) then { + [_unit,false] call FUNC(setSpectator); +} else { + private ["_vision","_pos"]; + if (isNull _killer) then {_killer = _unit}; + _vision = [-2,-1] select (sunOrMoon < 1); + _pos = (getPosATL _unit) vectorAdd [0,0,5]; + + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); +}; diff --git a/addons/spectator/functions/fnc_bi_respawnCounter.sqf b/addons/spectator/functions/fnc_bi_respawnCounter.sqf new file mode 100644 index 0000000000..0bee90ec61 --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnCounter.sqf @@ -0,0 +1,35 @@ +/* + * Author: Bohemia Interactive (Karel Moricky) + * Part of the BI respawn framework + * Handles the respawn timer display + * Edited to disable counter when spectator is opened + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +_player = [_this,0,objNull,[objnull]] call bis_fnc_param; + +_respawnDelay = [_this,3,0,[0]] call bis_fnc_param; + +if (!isplayer _player && !isnull _player && _respawnDelay > 0) exitwith {["Attempting to use the function on AI unit %1, can be used only on players."] call bis_fnc_error;}; + +//--- Engine-triggered respawn +_layer = "BIS_fnc_respawnCounter" call bis_fnc_rscLayer; + +if (!alive _player) then { + if (GVAR(onDeath) || (playerrespawntime < 1)) exitwith {}; + _layer cutrsc ["RscRespawnCounter","plain"]; +} else { + _layer cuttext ["","plain"]; +}; diff --git a/addons/spectator/functions/fnc_bi_respawnEndMission.sqf b/addons/spectator/functions/fnc_bi_respawnEndMission.sqf new file mode 100644 index 0000000000..23b8dacc17 --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnEndMission.sqf @@ -0,0 +1,62 @@ +/* + * Author: Bohemia Interactive (Karel Moricky) + * Part of the BI respawn framework + * Ends the mission when all players are dead + * Edited to support ace_spectator integration + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]]]; +private ["_vision","_pos"]; + +if (isNull _killer) then {_killer = _unit}; +_vision = [-2,-1] select (sunOrMoon < 1); +_pos = (getPosATL _unit) vectorAdd [0,0,5]; + +if (ismultiplayer) then { + + _respawnType = 0 call bis_fnc_missionRespawnType; + if (_respawnType in [0,1,4,5]) then { + + //--- No more respawn slots + if ({isplayer _x && alive _x} count playableunits == 0) then { + [["endDeath",false],"bis_fnc_endmission"] call bis_fnc_mp; + } else { + if (GVAR(onDeath) && (_respawnType in [0,1])) then { + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); + }; + }; + + //--- Don't end the script to prevent premature mission end + waituntil {false}; + } else { + + if (!alive _unit) then { + + //--- No more respawn tickets + if ([] call bis_fnc_respawntickets == 0 && {isplayer _x} count playableunits == 0) then { + [["endDeath",false],"bis_fnc_endmission"] call bis_fnc_mp; + } else { + if (GVAR(onDeath)) then { + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); + }; + }; + } else { + [_unit,false] call FUNC(setSpectator); + }; + }; +}; diff --git a/addons/spectator/functions/fnc_bi_respawnInstant.sqf b/addons/spectator/functions/fnc_bi_respawnInstant.sqf new file mode 100644 index 0000000000..fd1d255cf9 --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnInstant.sqf @@ -0,0 +1,35 @@ +/* + * Author: Bohemia Interactive + * Part of the BI respawn framework + * Handles instant respawn type (respawn at position of death) + * Edited to support ace_spectator integration + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +if !(GVAR(onDeath)) exitWith {}; + +params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]]]; + +if (alive _unit) then { + [_unit,false] call FUNC(setSpectator); +} else { + private ["_vision","_pos"]; + if (isNull _killer) then {_killer = _unit}; + _vision = [-2,-1] select (sunOrMoon < 1); + _pos = (getPosATL _unit) vectorAdd [0,0,5]; + + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); +}; diff --git a/addons/spectator/functions/fnc_bi_respawnNone.sqf b/addons/spectator/functions/fnc_bi_respawnNone.sqf new file mode 100644 index 0000000000..a5031a8fd9 --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnNone.sqf @@ -0,0 +1,293 @@ +/* + * Author: Bohemia Interactive (Karel Moricky) + * Part of the BI respawn framework + * Shows death screen for respawn type "None" + * Edited to support ace_spectator integration + * + * Arguments: + * 0: Corpse + * 1: Killer + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ +private ["_soundvolume","_musicvolume"]; + +#define BI_CONTROL (_display displayctrl _n) + +#include "script_component.hpp" + +disableserialization; +_player = _this select 0; +_killer = _this select 1; +if (isnull _killer) then {_killer = _player}; + +_musicvolume = musicvolume; +_soundvolume = soundvolume; //MUF-TODO: check if this is done before sound is faded in fn_feedbackMain.fsm + +_start = isnil "bis_fnc_respawnNone_start"; +if (_start) then { + bis_fnc_respawnNone_start = [daytime,time / 3600]; + + //3.5 fadesound 0; //MUF-commented + + sleep 2; + if (alive player) exitwith {}; + cutText ["","BLACK OUT",1]; + sleep 1.5; + BIS_fnc_feedback_allowPP = false; //MUF-switch health PP off + //(["HealthPP_black"] call bis_fnc_rscLayer) cutText ["","BLACK IN",1];//MUF-black in (remove black screen that was launched in FSM PP) + + if (ismultiplayer) then { + if (GVAR(onDeath)) then { + private ["_vision","_pos"]; + _vision = [-2,-1] select (sunOrMoon < 1); + _pos = (getPosATL _player) vectorAdd [0,0,5]; + + [2,_killer,_vision,_pos,getDir _player] call FUNC(setCameraAttributes); + [_player] call FUNC(setSpectator); + } else { + (finddisplay 46) createdisplay "RscDisplayMissionEnd"; + }; + } else {enableenddialog}; +}; +if (alive player) exitwith { + [player,false] call FUNC(setSpectator); + cuttext ["","plain"]; +}; //--- Terminate when player manages to switch do different unit already + +if (GVAR(onDeath)) exitWith {}; + +waituntil {!isnull (finddisplay 58)}; +_display = finddisplay 58; + +//--- Black fade in +_n = 1060; +BI_CONTROL ctrlsetfade 1; +if (_start) then { + + //--- Play ambient radio + setacctime 1; + 0 fademusic 0; + 4 fademusic 0.8; + playmusic format ['RadioAmbient%1',ceil random 1/*30*/]; + _musicEH = addMusicEventHandler ["MusicStop",{[] spawn {playmusic format ['RadioAmbient%1',ceil random 1/*30*/];};}]; + uinamespace setvariable ["bis_fnc_respawnNone_musicEH",_musicEH]; + _display displayaddeventhandler ["unload","removeMusicEventHandler ['MusicStop',uinamespace getvariable ['bis_fnc_respawnNone_musicEH',-1]];"]; + + BI_CONTROL ctrlcommit 4; +} else { + BI_CONTROL ctrlcommit 0; +}; +cuttext ["","plain"]; + +//--- HUD +_n = 5800; +BI_CONTROL ctrlsettext gettext (configfile >> "cfgingameui" >> "cursor" >> "select"); +BI_CONTROL ctrlsetposition [-10,-10,safezoneH * 0.07 * 3/4,safezoneH * 0.07]; +BI_CONTROL ctrlsettextcolor [1,1,1,1]; +BI_CONTROL ctrlcommit 0; + +//--- SITREP (ToDO: Localize) +_sitrep = "SITREP||"; +if (name _player != "Error: No unit") then { + _sitrep = _sitrep + "KIA: %4. %5|"; +}; +_sitrep = _sitrep + "TOD: %2 [%3]|LOC: %6 \ %7"; +if (_killer != _player) then { + _sitrep = _sitrep + "||ENY: %8"; + if (currentweapon _killer != "") then { + _sitrep = _sitrep + "|ENW: %9" + }; +}; +_sitrep = format [ + _sitrep, + 1 * safezoneH, + [bis_fnc_respawnNone_start select 0,"HH:MM:SS"] call bis_fnc_timetostring, + [bis_fnc_respawnNone_start select 1,"HH:MM:SS"] call bis_fnc_timetostring, + toupper localize format ["STR_SHORT_%1",rank _player], + toupper name _player, + mapGridPosition _player, + toupper worldname, + toupper ((configfile >> "cfgvehicles" >> typeof _killer) call bis_fnc_displayname), + toupper ((configfile >> "cfgweapons" >> currentweapon _killer) call bis_fnc_displayname) + +]; + +_n = 11000; +_bcgPos = ctrlposition BI_CONTROL; +_n = 5858; +//BI_CONTROL ctrlsetposition [_bcgPos select 0,safezoneY + ((_bcgPos select 0) - safezoneX) * 4/3,safezoneW - 2 * (_bcgPos select 2),safezoneH / 2]; +BI_CONTROL ctrlsetposition [(((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX), + ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY), + safezoneW - 2 * (_bcgPos select 2), + safezoneH / 2]; +BI_CONTROL ctrlcommit 0; +[BI_CONTROL,_sitrep] spawn { + scriptname "bis_fnc_respawnNone: SITREP"; + disableserialization; + _control = _this select 0; + _sitrepArray = toarray (_this select 1); + {_sitrepArray set [_foreachindex,tostring [_x]]} foreach _sitrepArray; + _sitrep = ""; + //_sitrepFormat = "%1"; + _sitrepFormat = "%1"; + + sleep 1; + for "_i" from 0 to (count _sitrepArray - 1) do { + _letter = _sitrepArray select _i; + _delay = if (_letter == "|") then {_letter = "
"; 1} else {0.01}; + _sitrep = _sitrep + _letter; + _control ctrlsetstructuredtext parsetext format [_sitrepFormat,_sitrep + "_"]; + //playsound ["IncomingChallenge",true]; + sleep _delay; + if (isnull _control) exitwith {}; + }; + _control ctrlsetstructuredtext parsetext format [_sitrepFormat,_sitrep]; +}; + + +//--- Create UAV camera +_camera = "camera" camcreate position player; +_camera cameraeffect ["internal","back"]; +_camera campreparefov 0.4; +_camera campreparetarget _killer; +showcinemaborder false; + +//--- Set PP effects +_saturation = 0.0 + random 0.3; +_ppColor = ppEffectCreate ["ColorCorrections", 1999]; +_ppColor ppEffectEnable true; +_ppColor ppEffectAdjust [1, 1, 0, [1, 1, 1, 0], [1 - _saturation, 1 - _saturation, 1 - _saturation, _saturation], [1, 0.25, 0, 1.0]]; +_ppColor ppEffectCommit 0; + +_ppGrain = ppEffectCreate ["filmGrain", 2012]; +_ppGrain ppEffectEnable true; +_ppGrain ppEffectAdjust [random 0.2, 1, 1, 0, 1]; +_ppGrain ppEffectCommit 0; + +//--- Camera update executed every frame +bis_fnc_respawnNone_player = _player; +bis_fnc_respawnNone_killer = _killer; +bis_fnc_respawnNone_camera = _camera; +bis_fnc_respawnNone_loop = { + scriptname "bis_fnc_respawnNone: camera"; + _display = _this select 0; + _player = bis_fnc_respawnNone_player; + _killer = bis_fnc_respawnNone_killer; + _camera = bis_fnc_respawnNone_camera; + + _sin = 20 * sin (time * 7); + _killerPos = [ + (visiblepositionasl _killer select 0), + (visiblepositionasl _killer select 1) + (_sin), + (visiblepositionasl _killer select 2) + (_sin) + ]; + + _dirToKiller = if (_killer == _player) then { + direction _player; + } else { + ([_player,_killerPos] call bis_fnc_dirto) + _sin; + }; + _pos = [ + visiblepositionasl _player, + -20, + _dirToKiller + ] call bis_fnc_relpos; + _pos set [2,((_pos select 2) + 7) max (getterrainheightasl _pos + 7)]; + + //--- Pitch + _heightCamera = getterrainheightasl _pos; + _heightKiller = getterrainheightasl _killerPos; + _height = _heightCamera - _heightKiller; + _dis = _killerPos distance _pos; + _angle = (asin (_height/_dis)); + + _camera setdir _dirtokiller; + [_camera,-_angle,_sin] call bis_fnc_setpitchbank; + _camera setposasl _pos; + + //--- HUD + _n = 5800; + _hudPos = (worldtoscreen position _player); + if (count _hudPos > 0) then { + _hudPosW = ctrlposition BI_CONTROL select 2; + _hudPosH = ctrlposition BI_CONTROL select 3; + _hudPos = [ + (_hudPos select 0) - _hudPosW / 2, + (_hudPos select 1) - _hudPosH / 2, + _hudPosW, + _hudPosH + ]; + BI_CONTROL ctrlsetposition _hudPos; + BI_CONTROL ctrlcommit 0; + }; +}; + +bis_fnc_respawnNone_keydown = { + _key = _this select 1; + + if (_key in (actionkeys 'nightvision') || _key < 0) then { + bis_fnc_respawnNone_vision = bis_fnc_respawnNone_vision + 1; + _vision = bis_fnc_respawnNone_vision % 4; + switch (_vision) do { + case 0: { + camusenvg false; + call compile 'false SetCamUseTi 0'; + }; + case 1: { + camusenvg true; + call compile 'false SetCamUseTi 0'; + }; + case 2: { + camusenvg false; + call compile 'true SetCamUseTi 0'; + }; + case 3: { + camusenvg false; + call compile 'true SetCamUseTi 1'; + }; + }; + }; +}; +//bis_fnc_respawnNone_vision = (1 + floor random 3) % 4; //--- Random vision (not NVG) +bis_fnc_respawnNone_vision = -1; +if (sunormoon < 1) then {bis_fnc_respawnNone_vision = 0;}; +[-1,-1] call bis_fnc_respawnNone_keydown; + +_display displayaddeventhandler ["mousemoving","_this call bis_fnc_respawnNone_loop"]; +_display displayaddeventhandler ["mouseholding","_this call bis_fnc_respawnNone_loop"]; +_display displayaddeventhandler ["keydown","_this call bis_fnc_respawnNone_keydown"]; + + +//--- Team Switch display opened +waituntil {isnull _display}; +_displayTeamSwitch = finddisplay 632; + +//--- Team Switch display closed - cleanup and restart the view +waituntil {isnull _displayTeamSwitch}; + +_camera cameraeffect ["terminate","back"]; +camdestroy _camera; + +bis_fnc_respawnNone_player = nil; +bis_fnc_respawnNone_killer = nil; +bis_fnc_respawnNone_camera = nil; +bis_fnc_respawnNone_loop = nil; + +ppeffectdestroy _ppColor; +ppeffectdestroy _ppGrain; + +if (!alive player) exitwith {_this call bis_fnc_respawnNone;}; + + +//--- Resurrection! +BIS_fnc_feedback_allowPP = true; +0 fadesound _soundvolume; +0 fademusic _musicvolume; +playmusic ""; +bis_fnc_respawnNone_start = nil; diff --git a/addons/spectator/functions/fnc_bi_respawnSeagull.sqf b/addons/spectator/functions/fnc_bi_respawnSeagull.sqf new file mode 100644 index 0000000000..2e01ffa6ea --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnSeagull.sqf @@ -0,0 +1,101 @@ +/* + * Author: Bohemia Interactive + * Part of the BI respawn framework + * Correctly handles seagull respawn (not used by default) + * Edited to support ace_spectator integration + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +_seagull = _this select 0; +_player = _this select 1; +_this call bis_fnc_log; + +if (!isplayer _player && !isplayer _seagull) exitwith {["Attempting to use the function on AI unit %1, can be used only on players."] call bis_fnc_error;}; + +waituntil {missionnamespace getvariable ["BIS_fnc_feedback_allowDeathScreen",true]}; +BIS_fnc_feedback_allowPP = false; +//(["HealthPP_black"] call bis_fnc_rscLayer) cutText ["","BLACK IN",8]; + +if (GVAR(onDeath)) exitWith { + private ["_vision","_pos"]; + + if (isNull _player) then {_player = _seagull}; + _vision = [-2,-1] select (sunOrMoon < 1); + _pos = (getPosATL _player) vectorAdd [0,0,5]; + + [_seagull,QGVAR(isSeagull)] call EFUNC(common,hideUnit); + [2,_player,_vision,_pos,getDir _seagull] call FUNC(setCameraAttributes); + [_seagull] call FUNC(setSpectator); +}; + +_camera = "camera" camCreate [(position _player select 0)-0.75, (position _player select 1)-0.75,(position _player select 2) + 0.5]; +_camera cameraEffect ["internal","back"]; +_camera camSetFOV 0.800; +_camera camCommit 0; +waituntil {camCommitted _camera}; + +0 fadeMusic 0.5; +playMusic "Track06_Abandoned_Battlespace"; + +_camera camSetTarget vehicle _player; +_camera camSetRelPos [-0.82,-3.12,3.38]; +_camera camSetFOV 0.800; +_camera camCommit 7; + +sleep 1; +_preload = _player spawn {waitUntil {(preloadCamera getPos _this) && (2 preloadObject _this)}}; +sleep 5; +waituntil {camCommitted _camera}; + +_camera camSetRelPos [1.17,-21.71,2.07]; +_camera camSetFOV 0.400; +_camera camCommit 10; +sleep 2; +terminate _preload; +sleep 3; +_preload = _player spawn {waitUntil {(preloadCamera getPos _this) && (3 preloadObject _this)}}; +waituntil {camCommitted _camera}; + +_camera camSetTarget vehicle _player; +_camera camSetRelPos [5.80,1.29,5.07]; +_camera camSetFOV 0.300; +_camera camCommit 7; +sleep 2; +terminate _preload; +_preload = _seagull spawn {waitUntil {(preloadCamera getPos _this) && (4 preloadObject _this)}}; +waituntil {camCommitted _camera}; + +_camera camSetRelPos [2.71,19.55,12.94]; +_camera camSetFOV 0.700; +_camera camCommit 2; +waituntil {camCommitted _camera}; + +_camera camSetTarget _seagull; +_camera camSetRelPos [-6.66,18.99,2.59]; +_camera camSetFOV 0.700; +_camera camCommit 3; +waituntil {camCommitted _camera}; + +3 fadeMusic 0; + +_camera camSetRelPos [1.17,-21.71,-1.07]; +_camera camSetFOV 0.300; +_camera camCommit 3; +waituntil {camCommitted _camera}; +terminate _preload; + +_seagull switchCamera "EXTERNAL"; +_seagull cameraEffect ["terminate","back"]; +camDestroy _camera; diff --git a/addons/spectator/functions/fnc_bi_respawnSpectator.sqf b/addons/spectator/functions/fnc_bi_respawnSpectator.sqf new file mode 100644 index 0000000000..5097b61ab2 --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnSpectator.sqf @@ -0,0 +1,59 @@ +/* + * Author: Bohemia Interactive + * Part of the BI respawn framework + * Opens BI spectator interface (default used by seagull respawn) + * Edited to support ace_spectator integration + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]], ["_respawn",-1,[0]]]; +private ["_vision","_pos"]; + +if (isNull _killer) then {_killer = _unit}; +_vision = [-2,-1] select (sunOrMoon < 1); +_pos = (getPosATL _unit) vectorAdd [0,0,5]; + +_layer = "BIS_fnc_respawnSpectator" call bis_fnc_rscLayer; + +if (!alive _unit) then { + if (GVAR(onDeath)) then { + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); + } else { + _layer cutrsc ["RscSpectator","plain"]; + }; +} else { + if (_respawn == 1) then { + + //--- Open + waituntil {missionnamespace getvariable ["BIS_fnc_feedback_allowDeathScreen",true]}; + BIS_fnc_feedback_allowPP = false; + //(["HealthPP_black"] call bis_fnc_rscLayer) cutText ["","BLACK IN",1]; + if (GVAR(onDeath)) then { + [_unit,QGVAR(isSeagull)] call EFUNC(common,hideUnit); + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); + } else { + _layer cutrsc ["RscSpectator","plain"]; + }; + } else { + if (GVAR(onDeath)) then { + [_unit,false] call FUNC(setSpectator); + }; + + //--- Close + _layer cuttext ["","plain"]; + }; +}; diff --git a/addons/spectator/functions/fnc_bi_respawnWave.sqf b/addons/spectator/functions/fnc_bi_respawnWave.sqf new file mode 100644 index 0000000000..371a8edcdc --- /dev/null +++ b/addons/spectator/functions/fnc_bi_respawnWave.sqf @@ -0,0 +1,43 @@ +/* + * Author: Bohemia Interactive + * Part of the BI respawn framework + * Handles wave respawning system + * Edited to support ace_spectator integration + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]], ["_respawn",0,[0]], ["_respawnDelay",0,[0]]]; + +if (!isplayer _unit && !isnull _unit) exitwith {["Attempting to use the function on AI unit %1, can be used only on players."] call bis_fnc_error;}; + +if (!alive _unit) then { + //--- Set the time only when it was not modified already + if (_respawnDelay != 0 && _respawnDelay == playerrespawntime) then { + setplayerrespawntime (_respawnDelay + _respawnDelay - (servertime % _respawnDelay)); + + if !(GVAR(onDeath)) exitWith {}; + private ["_vision","_pos"]; + + if (isNull _killer) then {_killer = _unit}; + _vision = [-2,-1] select (sunOrMoon < 1); + _pos = (getPosATL _unit) vectorAdd [0,0,5]; + + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); + }; +} else { + setplayerrespawntime _respawndelay; + [_unit,false] call FUNC(setSpectator); +}; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 315398ab0c..5c8c958451 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -23,8 +23,7 @@ switch (toLower _mode) do { // Safely open/close the interface case "open": { // Prevent reopening - if (GVAR(open)) exitWith {}; - GVAR(open) = true; + if (GVAR(isSet)) exitWith {}; // Initalize camera variables GVAR(camBoom) = 0; @@ -37,15 +36,17 @@ switch (toLower _mode) do { GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; - // Camera starts with night vision if it's dark - if (sunOrMoon < 1) then { - [nil,nil,-1] call FUNC(setCameraAttributes); - }; - // Initalize the camera view GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); [] call FUNC(transitionCamera); + // Close map + openMap [false,false]; + + // Close any BI layers/effects + BIS_fnc_feedback_allowPP = false; + ("BIS_fnc_respawnCounter" call BIS_fnc_rscLayer) cutText ["","plain"]; + // Close all existing dialogs while {dialog} do { closeDialog 0; @@ -65,8 +66,7 @@ switch (toLower _mode) do { _args params ["_unit"]; // Can't close a second time - if !(GVAR(open)) exitWith {}; - GVAR(open) = false; + if !(GVAR(isSet)) exitWith {}; // Terminate interface while {dialog} do { @@ -80,6 +80,10 @@ switch (toLower _mode) do { // Return to player view _unit switchCamera "internal"; + // Re-enable any BI effects + BIS_fnc_feedback_allowPP = true; + BIS_fnc_respawnNone_start = nil; + // Cleanup camera variables GVAR(camera) = nil; GVAR(camBoom) = nil; diff --git a/addons/spectator/functions/fnc_handleKilled.sqf b/addons/spectator/functions/fnc_handleKilled.sqf deleted file mode 100644 index 05671ed749..0000000000 --- a/addons/spectator/functions/fnc_handleKilled.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Author: SilentSpike - * Set inital camera attributes and set as spectator on death - * Part of the spectator during death system - * - * Arguments: - * 0: Corpse - * 1: Killer - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -params ["_unit","_killer"]; - -if (isNull _killer) then { - [2,_unit] call FUNC(setCameraAttributes); -} else { - [2,_killer] call FUNC(setCameraAttributes); -}; - -[_unit] call FUNC(setSpectator); diff --git a/addons/spectator/functions/fnc_handleRespawn.sqf b/addons/spectator/functions/fnc_handleRespawn.sqf deleted file mode 100644 index aa695dd553..0000000000 --- a/addons/spectator/functions/fnc_handleRespawn.sqf +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Author: SilentSpike - * Un-set as spectator on respawn - * Part of the spectator during death system - * - * Arguments: - * 0: New unit - * 1: Old unit - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -params ["_unit","_oldUnit"]; - -[_unit,false] call FUNC(setSpectator); diff --git a/addons/spectator/functions/fnc_setCameraAttributes.sqf b/addons/spectator/functions/fnc_setCameraAttributes.sqf index da2373318d..278a8c4758 100644 --- a/addons/spectator/functions/fnc_setCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_setCameraAttributes.sqf @@ -51,7 +51,7 @@ if !(_vision in GVAR(availableVisions)) then { }; GVAR(camPan) = _heading % 360; -GVAR(camPosition) = (ATLtoASL _position); +GVAR(camPos) = (ATLtoASL _position); GVAR(camSpeed) = (_speed max 0.05) min 10; GVAR(camTilt) = (_tilt max -89) min 89; GVAR(camUnit) = _unit; diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index b6e85926c5..2d5ada415c 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -1,9 +1,9 @@ /* * Author: SilentSpike - * Sets target unit to the given spectator state (virtually) + * Sets target player to the given spectator state (virtually) * To physically handle a spectator see ace_spectator_fnc_stageSpectator * - * Units will be able to communicate in ACRE/TFAR as appropriate + * Player will be able to communicate in ACRE/TFAR as appropriate * The spectator interface will be opened/closed * * Arguments: @@ -23,20 +23,11 @@ params ["_unit", ["_set",true,[true]]]; -// No change, no service (but allow spectators to be reset) -if !(_set || (GETVAR(_unit,GVAR(isSet),false))) exitWith {}; - // Only run for player units if !(isPlayer _unit) exitWith {}; if !(local _unit) exitwith { - [[_unit, _set, _target], QFUNC(setSpectator), _unit] call EFUNC(common,execRemoteFnc); -}; - -if (_set) then { - ["open"] call FUNC(handleInterface); -} else { - ["close",_unit] call FUNC(handleInterface); + [[_unit, _set], QFUNC(setSpectator), _unit] call EFUNC(common,execRemoteFnc); }; // Handle common addon audio @@ -44,10 +35,14 @@ if (["ace_hearing"] call EFUNC(common,isModLoaded)) then {EGVAR(hearing,disableV if (["acre_sys_radio"] call EFUNC(common,isModLoaded)) then {[_set] call acre_api_fnc_setSpectator}; if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {[_unit, _set] call TFAR_fnc_forceSpectator}; -// No theoretical change if an existing spectator was reset -if !(_set isEqualTo (GETVAR(_unit,GVAR(isSet),false))) then { - // Mark spectator state for reference - _unit setVariable [QGVAR(isSet), _set, true]; - - ["spectatorSet",[_set]] call EFUNC(common,localEvent); +if (_set) then { + ["open"] call FUNC(handleInterface); +} else { + ["close",_unit] call FUNC(handleInterface); }; + +// Mark spectator state for reference +_unit setVariable [QGVAR(isSet), _set, true]; +GVAR(isSet) = _set; + +["spectatorSet",[_set,_unit]] call EFUNC(common,localEvent); diff --git a/addons/spectator/functions/fnc_stageSpectator.sqf b/addons/spectator/functions/fnc_stageSpectator.sqf index bac5174601..3e17235e3e 100644 --- a/addons/spectator/functions/fnc_stageSpectator.sqf +++ b/addons/spectator/functions/fnc_stageSpectator.sqf @@ -30,7 +30,7 @@ if !(_set || (GETVAR(_unit,GVAR(isStaged),false))) exitWith {}; if !(isPlayer _unit) exitWith {}; if !(local _unit) exitwith { - [[_unit, _set, _target], QFUNC(stageSpectator), _unit] call EFUNC(common,execRemoteFnc); + [[_unit, _set], QFUNC(stageSpectator), _unit] call EFUNC(common,execRemoteFnc); }; // Prevent player falling into water @@ -49,7 +49,7 @@ if (_set) then { [_unit, QGVAR(isStaged)] call EFUNC(common,hideUnit); [_unit, QGVAR(isStaged)] call EFUNC(common,muteUnit); - _unit setPos (getMarkerPos QGVAR(respawn)); + _unit setPos (markerPos QGVAR(respawn)); } else { // Physical beings can talk [_unit, QGVAR(isStaged)] call EFUNC(common,unhideUnit); From 1b12d3728437a948d4e6779f724f7a6387e50396 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Tue, 4 Aug 2015 22:11:34 +0100 Subject: [PATCH 018/137] Replace spectator respawn changes with a template Hacking the BI respawn framework to support a spectator setting was intrusive and limiting. Instead of using a setting, I've opted to introduce a new respawn template that can be used within BI's respawn framework. The benefits of this approach are: - Compatibility isn't a concern, that responsibility is shifted onto mission designers. - Mission designers can use the functionality of the BI framework alongside the spectator system (combining templates, using different templates for different sides, etc.). - If a custom respawn framework is used, then this doesn't change anything. Custom frameworks are still fully supported via the public functions provided. - Remains simple to set up, just requires a description.ext edit --- addons/spectator/ACE_Settings.hpp | 4 - addons/spectator/CfgVehicles.hpp | 6 - addons/spectator/XEH_preInit.sqf | 10 +- addons/spectator/config.cpp | 34 +- .../functions/fnc_bi_respawnBase.sqf | 35 --- .../functions/fnc_bi_respawnCounter.sqf | 35 --- .../functions/fnc_bi_respawnEndMission.sqf | 62 ---- .../functions/fnc_bi_respawnInstant.sqf | 35 --- .../functions/fnc_bi_respawnNone.sqf | 293 ------------------ .../functions/fnc_bi_respawnSeagull.sqf | 101 ------ .../functions/fnc_bi_respawnSpectator.sqf | 59 ---- .../functions/fnc_bi_respawnWave.sqf | 43 --- .../functions/fnc_handleInterface.sqf | 5 +- .../functions/fnc_moduleSpectatorSettings.sqf | 1 - .../functions/fnc_respawnTemplate.sqf | 39 +++ .../functions/fnc_transitionCamera.sqf | 8 +- addons/spectator/stringtable.xml | 8 - 17 files changed, 52 insertions(+), 726 deletions(-) delete mode 100644 addons/spectator/functions/fnc_bi_respawnBase.sqf delete mode 100644 addons/spectator/functions/fnc_bi_respawnCounter.sqf delete mode 100644 addons/spectator/functions/fnc_bi_respawnEndMission.sqf delete mode 100644 addons/spectator/functions/fnc_bi_respawnInstant.sqf delete mode 100644 addons/spectator/functions/fnc_bi_respawnNone.sqf delete mode 100644 addons/spectator/functions/fnc_bi_respawnSeagull.sqf delete mode 100644 addons/spectator/functions/fnc_bi_respawnSpectator.sqf delete mode 100644 addons/spectator/functions/fnc_bi_respawnWave.sqf create mode 100644 addons/spectator/functions/fnc_respawnTemplate.sqf diff --git a/addons/spectator/ACE_Settings.hpp b/addons/spectator/ACE_Settings.hpp index 5e7907d19f..539f7cef2d 100644 --- a/addons/spectator/ACE_Settings.hpp +++ b/addons/spectator/ACE_Settings.hpp @@ -1,8 +1,4 @@ class ACE_Settings { - class GVAR(onDeath) { - typeName = "BOOL"; - value = 0; - }; class GVAR(filterUnits) { typeName = "SCALAR"; value = 1; diff --git a/addons/spectator/CfgVehicles.hpp b/addons/spectator/CfgVehicles.hpp index 7067257f23..8e685dae07 100644 --- a/addons/spectator/CfgVehicles.hpp +++ b/addons/spectator/CfgVehicles.hpp @@ -9,12 +9,6 @@ class CfgVehicles { isGlobal = 1; author = ECSTRING(common,ACETeam); class Arguments { - class systemEnable { - displayName = CSTRING(system_DisplayName); - description = CSTRING(system_Description); - typeName = "BOOL"; - defaultValue = 0; - }; class unitsFilter { displayName = CSTRING(units_DisplayName); description = CSTRING(units_Description); diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index 73c629a0ce..95c18f4a54 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -2,14 +2,6 @@ ADDON = false; -PREP(bi_respawnBase); -PREP(bi_respawnCounter); -PREP(bi_respawnEndMission); -PREP(bi_respawnInstant); -PREP(bi_respawnNone); -PREP(bi_respawnSeagull); -PREP(bi_respawnSpectator); -PREP(bi_respawnWave); PREP(cacheUnitInfo); PREP(cycleCamera); PREP(handleCamera); @@ -20,6 +12,7 @@ PREP(handleMouse); PREP(handleToolbar); PREP(handleUnits); PREP(moduleSpectatorSettings); +PREP(respawnTemplate); PREP(setCameraAttributes); PREP(setSpectator); PREP(stageSpectator); @@ -35,6 +28,7 @@ GVAR(availableModes) = [0,1,2]; GVAR(availableSides) = [west,east,resistance,civilian]; GVAR(availableVisions) = [-2,-1,0,1]; +GVAR(camAgent) = objNull; GVAR(camMode) = 0; GVAR(camPan) = 0; GVAR(camPos) = ATLtoASL [worldSize * 0.5, worldSize * 0.5, 20]; diff --git a/addons/spectator/config.cpp b/addons/spectator/config.cpp index eb73761e5f..6e32ed0413 100644 --- a/addons/spectator/config.cpp +++ b/addons/spectator/config.cpp @@ -18,36 +18,8 @@ class CfgPatches { #include "ui\interface.hpp" class CfgRespawnTemplates { - class None { - onPlayerKilled = QFUNC(bi_respawnNone); - }; - class Spectator { - onPlayerKilled = QFUNC(bi_respawnSpectator); - onPlayerRespawn = QFUNC(bi_respawnSpectator); - }; - class Instant { - onPlayerKilled = QFUNC(bi_respawnInstant); - onPlayerRespawn = QFUNC(bi_respawnInstant); - }; - class Base { - onPlayerKilled = QFUNC(bi_respawnBase); - onPlayerRespawn = QFUNC(bi_respawnBase); - }; - class EndMission - { - onPlayerKilled = QFUNC(bi_respawnEndMission); - onPlayerRespawn = QFUNC(bi_respawnEndMission); - }; - class Seagull { - onPlayerRespawn = QFUNC(bi_respawnSeagull); - }; - class Wave - { - onPlayerKilled = QFUNC(bi_respawnWave); - onPlayerRespawn = QFUNC(bi_respawnWave); - }; - class Counter { - onPlayerKilled = QFUNC(bi_respawnCounter); - onPlayerRespawn = QFUNC(bi_respawnCounter); + class ADDON { + onPlayerKilled = QFUNC(respawnTemplate); + onPlayerRespawn = QFUNC(respawnTemplate); }; }; diff --git a/addons/spectator/functions/fnc_bi_respawnBase.sqf b/addons/spectator/functions/fnc_bi_respawnBase.sqf deleted file mode 100644 index 7ea5b0c745..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnBase.sqf +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Author: Bohemia Interactive - * Part of the BI respawn framework - * Handles base respawn type (respawn on marker) - * Edited to support ace_spectator integration - * - * Arguments: - * 0: Corpse/New Unit - * 1: Killer/Old Unit - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -if !(GVAR(onDeath)) exitWith {}; - -params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]]]; - -if (alive _unit) then { - [_unit,false] call FUNC(setSpectator); -} else { - private ["_vision","_pos"]; - if (isNull _killer) then {_killer = _unit}; - _vision = [-2,-1] select (sunOrMoon < 1); - _pos = (getPosATL _unit) vectorAdd [0,0,5]; - - [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); -}; diff --git a/addons/spectator/functions/fnc_bi_respawnCounter.sqf b/addons/spectator/functions/fnc_bi_respawnCounter.sqf deleted file mode 100644 index 0bee90ec61..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnCounter.sqf +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Author: Bohemia Interactive (Karel Moricky) - * Part of the BI respawn framework - * Handles the respawn timer display - * Edited to disable counter when spectator is opened - * - * Arguments: - * 0: Corpse/New Unit - * 1: Killer/Old Unit - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -_player = [_this,0,objNull,[objnull]] call bis_fnc_param; - -_respawnDelay = [_this,3,0,[0]] call bis_fnc_param; - -if (!isplayer _player && !isnull _player && _respawnDelay > 0) exitwith {["Attempting to use the function on AI unit %1, can be used only on players."] call bis_fnc_error;}; - -//--- Engine-triggered respawn -_layer = "BIS_fnc_respawnCounter" call bis_fnc_rscLayer; - -if (!alive _player) then { - if (GVAR(onDeath) || (playerrespawntime < 1)) exitwith {}; - _layer cutrsc ["RscRespawnCounter","plain"]; -} else { - _layer cuttext ["","plain"]; -}; diff --git a/addons/spectator/functions/fnc_bi_respawnEndMission.sqf b/addons/spectator/functions/fnc_bi_respawnEndMission.sqf deleted file mode 100644 index 23b8dacc17..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnEndMission.sqf +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Author: Bohemia Interactive (Karel Moricky) - * Part of the BI respawn framework - * Ends the mission when all players are dead - * Edited to support ace_spectator integration - * - * Arguments: - * 0: Corpse/New Unit - * 1: Killer/Old Unit - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]]]; -private ["_vision","_pos"]; - -if (isNull _killer) then {_killer = _unit}; -_vision = [-2,-1] select (sunOrMoon < 1); -_pos = (getPosATL _unit) vectorAdd [0,0,5]; - -if (ismultiplayer) then { - - _respawnType = 0 call bis_fnc_missionRespawnType; - if (_respawnType in [0,1,4,5]) then { - - //--- No more respawn slots - if ({isplayer _x && alive _x} count playableunits == 0) then { - [["endDeath",false],"bis_fnc_endmission"] call bis_fnc_mp; - } else { - if (GVAR(onDeath) && (_respawnType in [0,1])) then { - [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); - }; - }; - - //--- Don't end the script to prevent premature mission end - waituntil {false}; - } else { - - if (!alive _unit) then { - - //--- No more respawn tickets - if ([] call bis_fnc_respawntickets == 0 && {isplayer _x} count playableunits == 0) then { - [["endDeath",false],"bis_fnc_endmission"] call bis_fnc_mp; - } else { - if (GVAR(onDeath)) then { - [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); - }; - }; - } else { - [_unit,false] call FUNC(setSpectator); - }; - }; -}; diff --git a/addons/spectator/functions/fnc_bi_respawnInstant.sqf b/addons/spectator/functions/fnc_bi_respawnInstant.sqf deleted file mode 100644 index fd1d255cf9..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnInstant.sqf +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Author: Bohemia Interactive - * Part of the BI respawn framework - * Handles instant respawn type (respawn at position of death) - * Edited to support ace_spectator integration - * - * Arguments: - * 0: Corpse/New Unit - * 1: Killer/Old Unit - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -if !(GVAR(onDeath)) exitWith {}; - -params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]]]; - -if (alive _unit) then { - [_unit,false] call FUNC(setSpectator); -} else { - private ["_vision","_pos"]; - if (isNull _killer) then {_killer = _unit}; - _vision = [-2,-1] select (sunOrMoon < 1); - _pos = (getPosATL _unit) vectorAdd [0,0,5]; - - [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); -}; diff --git a/addons/spectator/functions/fnc_bi_respawnNone.sqf b/addons/spectator/functions/fnc_bi_respawnNone.sqf deleted file mode 100644 index a5031a8fd9..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnNone.sqf +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Author: Bohemia Interactive (Karel Moricky) - * Part of the BI respawn framework - * Shows death screen for respawn type "None" - * Edited to support ace_spectator integration - * - * Arguments: - * 0: Corpse - * 1: Killer - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ -private ["_soundvolume","_musicvolume"]; - -#define BI_CONTROL (_display displayctrl _n) - -#include "script_component.hpp" - -disableserialization; -_player = _this select 0; -_killer = _this select 1; -if (isnull _killer) then {_killer = _player}; - -_musicvolume = musicvolume; -_soundvolume = soundvolume; //MUF-TODO: check if this is done before sound is faded in fn_feedbackMain.fsm - -_start = isnil "bis_fnc_respawnNone_start"; -if (_start) then { - bis_fnc_respawnNone_start = [daytime,time / 3600]; - - //3.5 fadesound 0; //MUF-commented - - sleep 2; - if (alive player) exitwith {}; - cutText ["","BLACK OUT",1]; - sleep 1.5; - BIS_fnc_feedback_allowPP = false; //MUF-switch health PP off - //(["HealthPP_black"] call bis_fnc_rscLayer) cutText ["","BLACK IN",1];//MUF-black in (remove black screen that was launched in FSM PP) - - if (ismultiplayer) then { - if (GVAR(onDeath)) then { - private ["_vision","_pos"]; - _vision = [-2,-1] select (sunOrMoon < 1); - _pos = (getPosATL _player) vectorAdd [0,0,5]; - - [2,_killer,_vision,_pos,getDir _player] call FUNC(setCameraAttributes); - [_player] call FUNC(setSpectator); - } else { - (finddisplay 46) createdisplay "RscDisplayMissionEnd"; - }; - } else {enableenddialog}; -}; -if (alive player) exitwith { - [player,false] call FUNC(setSpectator); - cuttext ["","plain"]; -}; //--- Terminate when player manages to switch do different unit already - -if (GVAR(onDeath)) exitWith {}; - -waituntil {!isnull (finddisplay 58)}; -_display = finddisplay 58; - -//--- Black fade in -_n = 1060; -BI_CONTROL ctrlsetfade 1; -if (_start) then { - - //--- Play ambient radio - setacctime 1; - 0 fademusic 0; - 4 fademusic 0.8; - playmusic format ['RadioAmbient%1',ceil random 1/*30*/]; - _musicEH = addMusicEventHandler ["MusicStop",{[] spawn {playmusic format ['RadioAmbient%1',ceil random 1/*30*/];};}]; - uinamespace setvariable ["bis_fnc_respawnNone_musicEH",_musicEH]; - _display displayaddeventhandler ["unload","removeMusicEventHandler ['MusicStop',uinamespace getvariable ['bis_fnc_respawnNone_musicEH',-1]];"]; - - BI_CONTROL ctrlcommit 4; -} else { - BI_CONTROL ctrlcommit 0; -}; -cuttext ["","plain"]; - -//--- HUD -_n = 5800; -BI_CONTROL ctrlsettext gettext (configfile >> "cfgingameui" >> "cursor" >> "select"); -BI_CONTROL ctrlsetposition [-10,-10,safezoneH * 0.07 * 3/4,safezoneH * 0.07]; -BI_CONTROL ctrlsettextcolor [1,1,1,1]; -BI_CONTROL ctrlcommit 0; - -//--- SITREP (ToDO: Localize) -_sitrep = "SITREP||"; -if (name _player != "Error: No unit") then { - _sitrep = _sitrep + "KIA: %4. %5|"; -}; -_sitrep = _sitrep + "TOD: %2 [%3]|LOC: %6 \ %7"; -if (_killer != _player) then { - _sitrep = _sitrep + "||ENY: %8"; - if (currentweapon _killer != "") then { - _sitrep = _sitrep + "|ENW: %9" - }; -}; -_sitrep = format [ - _sitrep, - 1 * safezoneH, - [bis_fnc_respawnNone_start select 0,"HH:MM:SS"] call bis_fnc_timetostring, - [bis_fnc_respawnNone_start select 1,"HH:MM:SS"] call bis_fnc_timetostring, - toupper localize format ["STR_SHORT_%1",rank _player], - toupper name _player, - mapGridPosition _player, - toupper worldname, - toupper ((configfile >> "cfgvehicles" >> typeof _killer) call bis_fnc_displayname), - toupper ((configfile >> "cfgweapons" >> currentweapon _killer) call bis_fnc_displayname) - -]; - -_n = 11000; -_bcgPos = ctrlposition BI_CONTROL; -_n = 5858; -//BI_CONTROL ctrlsetposition [_bcgPos select 0,safezoneY + ((_bcgPos select 0) - safezoneX) * 4/3,safezoneW - 2 * (_bcgPos select 2),safezoneH / 2]; -BI_CONTROL ctrlsetposition [(((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX), - ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY), - safezoneW - 2 * (_bcgPos select 2), - safezoneH / 2]; -BI_CONTROL ctrlcommit 0; -[BI_CONTROL,_sitrep] spawn { - scriptname "bis_fnc_respawnNone: SITREP"; - disableserialization; - _control = _this select 0; - _sitrepArray = toarray (_this select 1); - {_sitrepArray set [_foreachindex,tostring [_x]]} foreach _sitrepArray; - _sitrep = ""; - //_sitrepFormat = "%1"; - _sitrepFormat = "%1"; - - sleep 1; - for "_i" from 0 to (count _sitrepArray - 1) do { - _letter = _sitrepArray select _i; - _delay = if (_letter == "|") then {_letter = "
"; 1} else {0.01}; - _sitrep = _sitrep + _letter; - _control ctrlsetstructuredtext parsetext format [_sitrepFormat,_sitrep + "_"]; - //playsound ["IncomingChallenge",true]; - sleep _delay; - if (isnull _control) exitwith {}; - }; - _control ctrlsetstructuredtext parsetext format [_sitrepFormat,_sitrep]; -}; - - -//--- Create UAV camera -_camera = "camera" camcreate position player; -_camera cameraeffect ["internal","back"]; -_camera campreparefov 0.4; -_camera campreparetarget _killer; -showcinemaborder false; - -//--- Set PP effects -_saturation = 0.0 + random 0.3; -_ppColor = ppEffectCreate ["ColorCorrections", 1999]; -_ppColor ppEffectEnable true; -_ppColor ppEffectAdjust [1, 1, 0, [1, 1, 1, 0], [1 - _saturation, 1 - _saturation, 1 - _saturation, _saturation], [1, 0.25, 0, 1.0]]; -_ppColor ppEffectCommit 0; - -_ppGrain = ppEffectCreate ["filmGrain", 2012]; -_ppGrain ppEffectEnable true; -_ppGrain ppEffectAdjust [random 0.2, 1, 1, 0, 1]; -_ppGrain ppEffectCommit 0; - -//--- Camera update executed every frame -bis_fnc_respawnNone_player = _player; -bis_fnc_respawnNone_killer = _killer; -bis_fnc_respawnNone_camera = _camera; -bis_fnc_respawnNone_loop = { - scriptname "bis_fnc_respawnNone: camera"; - _display = _this select 0; - _player = bis_fnc_respawnNone_player; - _killer = bis_fnc_respawnNone_killer; - _camera = bis_fnc_respawnNone_camera; - - _sin = 20 * sin (time * 7); - _killerPos = [ - (visiblepositionasl _killer select 0), - (visiblepositionasl _killer select 1) + (_sin), - (visiblepositionasl _killer select 2) + (_sin) - ]; - - _dirToKiller = if (_killer == _player) then { - direction _player; - } else { - ([_player,_killerPos] call bis_fnc_dirto) + _sin; - }; - _pos = [ - visiblepositionasl _player, - -20, - _dirToKiller - ] call bis_fnc_relpos; - _pos set [2,((_pos select 2) + 7) max (getterrainheightasl _pos + 7)]; - - //--- Pitch - _heightCamera = getterrainheightasl _pos; - _heightKiller = getterrainheightasl _killerPos; - _height = _heightCamera - _heightKiller; - _dis = _killerPos distance _pos; - _angle = (asin (_height/_dis)); - - _camera setdir _dirtokiller; - [_camera,-_angle,_sin] call bis_fnc_setpitchbank; - _camera setposasl _pos; - - //--- HUD - _n = 5800; - _hudPos = (worldtoscreen position _player); - if (count _hudPos > 0) then { - _hudPosW = ctrlposition BI_CONTROL select 2; - _hudPosH = ctrlposition BI_CONTROL select 3; - _hudPos = [ - (_hudPos select 0) - _hudPosW / 2, - (_hudPos select 1) - _hudPosH / 2, - _hudPosW, - _hudPosH - ]; - BI_CONTROL ctrlsetposition _hudPos; - BI_CONTROL ctrlcommit 0; - }; -}; - -bis_fnc_respawnNone_keydown = { - _key = _this select 1; - - if (_key in (actionkeys 'nightvision') || _key < 0) then { - bis_fnc_respawnNone_vision = bis_fnc_respawnNone_vision + 1; - _vision = bis_fnc_respawnNone_vision % 4; - switch (_vision) do { - case 0: { - camusenvg false; - call compile 'false SetCamUseTi 0'; - }; - case 1: { - camusenvg true; - call compile 'false SetCamUseTi 0'; - }; - case 2: { - camusenvg false; - call compile 'true SetCamUseTi 0'; - }; - case 3: { - camusenvg false; - call compile 'true SetCamUseTi 1'; - }; - }; - }; -}; -//bis_fnc_respawnNone_vision = (1 + floor random 3) % 4; //--- Random vision (not NVG) -bis_fnc_respawnNone_vision = -1; -if (sunormoon < 1) then {bis_fnc_respawnNone_vision = 0;}; -[-1,-1] call bis_fnc_respawnNone_keydown; - -_display displayaddeventhandler ["mousemoving","_this call bis_fnc_respawnNone_loop"]; -_display displayaddeventhandler ["mouseholding","_this call bis_fnc_respawnNone_loop"]; -_display displayaddeventhandler ["keydown","_this call bis_fnc_respawnNone_keydown"]; - - -//--- Team Switch display opened -waituntil {isnull _display}; -_displayTeamSwitch = finddisplay 632; - -//--- Team Switch display closed - cleanup and restart the view -waituntil {isnull _displayTeamSwitch}; - -_camera cameraeffect ["terminate","back"]; -camdestroy _camera; - -bis_fnc_respawnNone_player = nil; -bis_fnc_respawnNone_killer = nil; -bis_fnc_respawnNone_camera = nil; -bis_fnc_respawnNone_loop = nil; - -ppeffectdestroy _ppColor; -ppeffectdestroy _ppGrain; - -if (!alive player) exitwith {_this call bis_fnc_respawnNone;}; - - -//--- Resurrection! -BIS_fnc_feedback_allowPP = true; -0 fadesound _soundvolume; -0 fademusic _musicvolume; -playmusic ""; -bis_fnc_respawnNone_start = nil; diff --git a/addons/spectator/functions/fnc_bi_respawnSeagull.sqf b/addons/spectator/functions/fnc_bi_respawnSeagull.sqf deleted file mode 100644 index 2e01ffa6ea..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnSeagull.sqf +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Author: Bohemia Interactive - * Part of the BI respawn framework - * Correctly handles seagull respawn (not used by default) - * Edited to support ace_spectator integration - * - * Arguments: - * 0: Corpse/New Unit - * 1: Killer/Old Unit - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -_seagull = _this select 0; -_player = _this select 1; -_this call bis_fnc_log; - -if (!isplayer _player && !isplayer _seagull) exitwith {["Attempting to use the function on AI unit %1, can be used only on players."] call bis_fnc_error;}; - -waituntil {missionnamespace getvariable ["BIS_fnc_feedback_allowDeathScreen",true]}; -BIS_fnc_feedback_allowPP = false; -//(["HealthPP_black"] call bis_fnc_rscLayer) cutText ["","BLACK IN",8]; - -if (GVAR(onDeath)) exitWith { - private ["_vision","_pos"]; - - if (isNull _player) then {_player = _seagull}; - _vision = [-2,-1] select (sunOrMoon < 1); - _pos = (getPosATL _player) vectorAdd [0,0,5]; - - [_seagull,QGVAR(isSeagull)] call EFUNC(common,hideUnit); - [2,_player,_vision,_pos,getDir _seagull] call FUNC(setCameraAttributes); - [_seagull] call FUNC(setSpectator); -}; - -_camera = "camera" camCreate [(position _player select 0)-0.75, (position _player select 1)-0.75,(position _player select 2) + 0.5]; -_camera cameraEffect ["internal","back"]; -_camera camSetFOV 0.800; -_camera camCommit 0; -waituntil {camCommitted _camera}; - -0 fadeMusic 0.5; -playMusic "Track06_Abandoned_Battlespace"; - -_camera camSetTarget vehicle _player; -_camera camSetRelPos [-0.82,-3.12,3.38]; -_camera camSetFOV 0.800; -_camera camCommit 7; - -sleep 1; -_preload = _player spawn {waitUntil {(preloadCamera getPos _this) && (2 preloadObject _this)}}; -sleep 5; -waituntil {camCommitted _camera}; - -_camera camSetRelPos [1.17,-21.71,2.07]; -_camera camSetFOV 0.400; -_camera camCommit 10; -sleep 2; -terminate _preload; -sleep 3; -_preload = _player spawn {waitUntil {(preloadCamera getPos _this) && (3 preloadObject _this)}}; -waituntil {camCommitted _camera}; - -_camera camSetTarget vehicle _player; -_camera camSetRelPos [5.80,1.29,5.07]; -_camera camSetFOV 0.300; -_camera camCommit 7; -sleep 2; -terminate _preload; -_preload = _seagull spawn {waitUntil {(preloadCamera getPos _this) && (4 preloadObject _this)}}; -waituntil {camCommitted _camera}; - -_camera camSetRelPos [2.71,19.55,12.94]; -_camera camSetFOV 0.700; -_camera camCommit 2; -waituntil {camCommitted _camera}; - -_camera camSetTarget _seagull; -_camera camSetRelPos [-6.66,18.99,2.59]; -_camera camSetFOV 0.700; -_camera camCommit 3; -waituntil {camCommitted _camera}; - -3 fadeMusic 0; - -_camera camSetRelPos [1.17,-21.71,-1.07]; -_camera camSetFOV 0.300; -_camera camCommit 3; -waituntil {camCommitted _camera}; -terminate _preload; - -_seagull switchCamera "EXTERNAL"; -_seagull cameraEffect ["terminate","back"]; -camDestroy _camera; diff --git a/addons/spectator/functions/fnc_bi_respawnSpectator.sqf b/addons/spectator/functions/fnc_bi_respawnSpectator.sqf deleted file mode 100644 index 5097b61ab2..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnSpectator.sqf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Author: Bohemia Interactive - * Part of the BI respawn framework - * Opens BI spectator interface (default used by seagull respawn) - * Edited to support ace_spectator integration - * - * Arguments: - * 0: Corpse/New Unit - * 1: Killer/Old Unit - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]], ["_respawn",-1,[0]]]; -private ["_vision","_pos"]; - -if (isNull _killer) then {_killer = _unit}; -_vision = [-2,-1] select (sunOrMoon < 1); -_pos = (getPosATL _unit) vectorAdd [0,0,5]; - -_layer = "BIS_fnc_respawnSpectator" call bis_fnc_rscLayer; - -if (!alive _unit) then { - if (GVAR(onDeath)) then { - [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); - } else { - _layer cutrsc ["RscSpectator","plain"]; - }; -} else { - if (_respawn == 1) then { - - //--- Open - waituntil {missionnamespace getvariable ["BIS_fnc_feedback_allowDeathScreen",true]}; - BIS_fnc_feedback_allowPP = false; - //(["HealthPP_black"] call bis_fnc_rscLayer) cutText ["","BLACK IN",1]; - if (GVAR(onDeath)) then { - [_unit,QGVAR(isSeagull)] call EFUNC(common,hideUnit); - [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); - } else { - _layer cutrsc ["RscSpectator","plain"]; - }; - } else { - if (GVAR(onDeath)) then { - [_unit,false] call FUNC(setSpectator); - }; - - //--- Close - _layer cuttext ["","plain"]; - }; -}; diff --git a/addons/spectator/functions/fnc_bi_respawnWave.sqf b/addons/spectator/functions/fnc_bi_respawnWave.sqf deleted file mode 100644 index 371a8edcdc..0000000000 --- a/addons/spectator/functions/fnc_bi_respawnWave.sqf +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Author: Bohemia Interactive - * Part of the BI respawn framework - * Handles wave respawning system - * Edited to support ace_spectator integration - * - * Arguments: - * 0: Corpse/New Unit - * 1: Killer/Old Unit - * 2: Respawn Type - * 3: Respawn Delay - * - * Return Value: - * None - * - * Public: No - */ - -#include "script_component.hpp" - -params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]], ["_respawn",0,[0]], ["_respawnDelay",0,[0]]]; - -if (!isplayer _unit && !isnull _unit) exitwith {["Attempting to use the function on AI unit %1, can be used only on players."] call bis_fnc_error;}; - -if (!alive _unit) then { - //--- Set the time only when it was not modified already - if (_respawnDelay != 0 && _respawnDelay == playerrespawntime) then { - setplayerrespawntime (_respawnDelay + _respawnDelay - (servertime % _respawnDelay)); - - if !(GVAR(onDeath)) exitWith {}; - private ["_vision","_pos"]; - - if (isNull _killer) then {_killer = _unit}; - _vision = [-2,-1] select (sunOrMoon < 1); - _pos = (getPosATL _unit) vectorAdd [0,0,5]; - - [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); - }; -} else { - setplayerrespawntime _respawndelay; - [_unit,false] call FUNC(setSpectator); -}; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 5c8c958451..777e8d2ea9 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -43,7 +43,7 @@ switch (toLower _mode) do { // Close map openMap [false,false]; - // Close any BI layers/effects + // Disable BI damage effects and remove counter layer BIS_fnc_feedback_allowPP = false; ("BIS_fnc_respawnCounter" call BIS_fnc_rscLayer) cutText ["","plain"]; @@ -80,9 +80,8 @@ switch (toLower _mode) do { // Return to player view _unit switchCamera "internal"; - // Re-enable any BI effects + // Re-enable BI damage effects BIS_fnc_feedback_allowPP = true; - BIS_fnc_respawnNone_start = nil; // Cleanup camera variables GVAR(camera) = nil; diff --git a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf index 1fd20f50e4..c23fb7ad20 100644 --- a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf +++ b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf @@ -19,7 +19,6 @@ params ["_logic", "_units", "_activated"]; if !(_activated) exitWith {}; -[_logic, QGVAR(onDeath), "systemEnable"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(filterUnits), "unitsFilter"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(filterSides), "sidesFilter"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(restrictModes), "cameraModes"] call EFUNC(common,readSettingFromModule); diff --git a/addons/spectator/functions/fnc_respawnTemplate.sqf b/addons/spectator/functions/fnc_respawnTemplate.sqf new file mode 100644 index 0000000000..b03c6dfb06 --- /dev/null +++ b/addons/spectator/functions/fnc_respawnTemplate.sqf @@ -0,0 +1,39 @@ +/* + * Author: SilentSpike + * The ace_spectator respawn template, handles killed + respawn + * Can be used via BI's respawn framework, see: + * https://community.bistudio.com/wiki/Arma_3_Respawn + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]], ["_respawn",0,[0]], ["_respawnDelay",0,[0]]]; +private ["_vision","_pos"]; + +if (isNull _killer) then {_killer = _unit}; +_vision = [-2,-1] select (sunOrMoon < 1); +_pos = (getPosATL _unit) vectorAdd [0,0,5]; + +if (alive _unit) then { + if (_respawn == 1) then { + [_unit,QGVAR(isSeagull)] call EFUNC(common,hideUnit); + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); + } else { + [_unit,false] call FUNC(setSpectator); + }; +} else { + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [_unit] call FUNC(setSpectator); +}; diff --git a/addons/spectator/functions/fnc_transitionCamera.sqf b/addons/spectator/functions/fnc_transitionCamera.sqf index 07abbc94ab..a4d99445fb 100644 --- a/addons/spectator/functions/fnc_transitionCamera.sqf +++ b/addons/spectator/functions/fnc_transitionCamera.sqf @@ -53,8 +53,12 @@ if (_newMode == 0) then { // Free GVAR(camera) camSetFov -(linearConversion [0.01,2,GVAR(camZoom),-2,-0.01,true]); GVAR(camera) camCommit 0; - // Switch to camera to stop AI group chat - ACE_Player switchCamera "internal"; + // Agent is switched to in free cam to hide death table and prevent AI chat + if (isNull GVAR(camAgent)) then { + GVAR(camAgent) = createAgent ["VirtualMan_F",markerPos QGVAR(respawn),[],0,""]; + }; + + GVAR(camAgent) switchCamera "internal"; clearRadio; // If new vision isn't available then keep current (unless current also isn't) diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 1f74d08c43..4eb0e25c0a 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -9,14 +9,6 @@ Configure how the spectator system will operate by default. Skonfiguruj domyślne ustawienia obserwatora. - - Spectate on death - Obserwator po śmierci - - - Enables spectator upon death. - Włącz obserwatora po śmierci - Unit filter Filtr jednostek From 79e607836b20f828f00f5c0525c42a779e64d123 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Wed, 5 Aug 2015 12:51:13 +0100 Subject: [PATCH 019/137] Add contributor email for Head --- AUTHORS.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 70bd7af086..814ab311a3 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -68,8 +68,8 @@ Hamburger SV Harakhti havena Hawkins -Head -jokoho482 ` +Head +jokoho482 Jonpas Karneck Kavinsky From 07e09b60faa7b4b09663d53cb7baa414259bdbb8 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Wed, 5 Aug 2015 13:19:47 +0100 Subject: [PATCH 020/137] Stop spectator camera unit changing on corpses Previously the camera would be automatically moved away from corpses (when the unit currently being watched dies). This changes it to stay on them until the view is manually switched as users might want to stick around and watch whatever was going on at the time of death. --- addons/spectator/functions/fnc_handleInterface.sqf | 1 + addons/spectator/functions/fnc_handleUnits.sqf | 6 ++++-- addons/spectator/functions/fnc_transitionCamera.sqf | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 777e8d2ea9..b85e73dabb 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -78,6 +78,7 @@ switch (toLower _mode) do { camDestroy GVAR(camera); // Return to player view + clearRadio; _unit switchCamera "internal"; // Re-enable BI damage effects diff --git a/addons/spectator/functions/fnc_handleUnits.sqf b/addons/spectator/functions/fnc_handleUnits.sqf index b64a1a2717..e8cd561da0 100644 --- a/addons/spectator/functions/fnc_handleUnits.sqf +++ b/addons/spectator/functions/fnc_handleUnits.sqf @@ -26,9 +26,11 @@ if (isNull _display) exitWith { [_this select 1] call CBA_fnc_removePerFrameHand // Remove all dead and null units from the list [] call FUNC(updateUnits); -// Camera shouldn't stay on unit that isn't in the list +// Camera shouldn't stay on unit that isn't in the list (unless dead) if !(GVAR(camUnit) in GVAR(unitList)) then { - [nil,1] call FUNC(cycleCamera); + if (alive GVAR(camUnit) || isNull GVAR(camUnit)) then { + [nil,1] call FUNC(cycleCamera); + }; }; // Reduce overhead when unit tree is hidden diff --git a/addons/spectator/functions/fnc_transitionCamera.sqf b/addons/spectator/functions/fnc_transitionCamera.sqf index a4d99445fb..4957540fa4 100644 --- a/addons/spectator/functions/fnc_transitionCamera.sqf +++ b/addons/spectator/functions/fnc_transitionCamera.sqf @@ -33,7 +33,7 @@ if !(_newMode in GVAR(availableModes)) then { }; // When no units available to spectate, exit to freecam -if (GVAR(unitList) isEqualTo []) then { +if ((GVAR(unitList) isEqualTo []) && (alive _newUnit || isNull _newUnit)) then { _newMode = 0; _newUnit = objNull; }; From 5200fd6a0298a593fc21d4233de494ff2867a927 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Wed, 5 Aug 2015 14:15:27 +0100 Subject: [PATCH 021/137] Add new option to spectator unit filter setting Adds an option to use playableUnits for scenarios where AI playable units are enabled. --- addons/spectator/ACE_Settings.hpp | 4 ++-- addons/spectator/CfgVehicles.hpp | 6 +++++- addons/spectator/functions/fnc_updateUnits.sqf | 2 +- addons/spectator/stringtable.xml | 3 +++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/addons/spectator/ACE_Settings.hpp b/addons/spectator/ACE_Settings.hpp index 539f7cef2d..2889fd2e0f 100644 --- a/addons/spectator/ACE_Settings.hpp +++ b/addons/spectator/ACE_Settings.hpp @@ -1,8 +1,8 @@ class ACE_Settings { class GVAR(filterUnits) { typeName = "SCALAR"; - value = 1; - values[] = {CSTRING(units_none), CSTRING(units_players), CSTRING(units_all)}; + value = 2; + values[] = {CSTRING(units_none), CSTRING(units_players), CSTRING(units_playable), CSTRING(units_all)}; }; class GVAR(filterSides) { typeName = "SCALAR"; diff --git a/addons/spectator/CfgVehicles.hpp b/addons/spectator/CfgVehicles.hpp index 8e685dae07..b63f349b0a 100644 --- a/addons/spectator/CfgVehicles.hpp +++ b/addons/spectator/CfgVehicles.hpp @@ -21,11 +21,15 @@ class CfgVehicles { class players { name = CSTRING(units_players); value = 1; + }; + class playable { + name = CSTRING(units_playable); + value = 2; default = 1; }; class all { name = CSTRING(units_all); - value = 2; + value = 3; }; }; }; diff --git a/addons/spectator/functions/fnc_updateUnits.sqf b/addons/spectator/functions/fnc_updateUnits.sqf index ef8fc3b4f1..75f1402179 100644 --- a/addons/spectator/functions/fnc_updateUnits.sqf +++ b/addons/spectator/functions/fnc_updateUnits.sqf @@ -36,7 +36,7 @@ if !(_newUnits isEqualTo []) exitWith { private ["_sides","_cond","_filteredUnits","_color","_icon"]; // Unit setting filter -_newUnits = [[],allPlayers,allUnits] select GVAR(filterUnits); +_newUnits = [[],allPlayers,playableUnits,allUnits] select GVAR(filterUnits); // Side setting filter _sides = []; diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 4eb0e25c0a..5219ba7e2d 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -25,6 +25,9 @@ Only players Tylko gracze + + Playable Units + All units Wszystkie jednostki From 42b5abae116c27cad907aee5cc5dd85ad978c59c Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Wed, 5 Aug 2015 19:25:38 +0100 Subject: [PATCH 022/137] Add support for respawn counter to spectator UI Rather than hiding the BI respawn counter, it should be "integrated" into the UI via code if present. --- addons/spectator/UI/interface.hpp | 11 +++++- .../functions/fnc_handleInterface.sqf | 35 +++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index e8df31c280..bd6d34339f 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -1,6 +1,15 @@ +// Temporary fix until BI take care of it +class RscFrame { + x = 0; + y = 0; + w = 0; + h = 0; +}; + + class RscButtonMenu; class RscControlsGroupNoScrollbars; -class RscFrame; +//class RscFrame; class RscListNBox; class RscMapControl; class RscPicture; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index b85e73dabb..b6608959b7 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -43,9 +43,8 @@ switch (toLower _mode) do { // Close map openMap [false,false]; - // Disable BI damage effects and remove counter layer + // Disable BI damage effects BIS_fnc_feedback_allowPP = false; - ("BIS_fnc_respawnCounter" call BIS_fnc_rscLayer) cutText ["","plain"]; // Close all existing dialogs while {dialog} do { @@ -81,7 +80,7 @@ switch (toLower _mode) do { clearRadio; _unit switchCamera "internal"; - // Re-enable BI damage effects + // Enable BI damage effects BIS_fnc_feedback_allowPP = true; // Cleanup camera variables @@ -154,9 +153,33 @@ switch (toLower _mode) do { [localize LSTRING(prevUnit),"Left Arrow"] ]; - // Hacky way to enable keybindings - //_display displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}]; - //_display displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; + // Handle support for BI's respawn counter + [{ + if !(isNull (GETUVAR(RscRespawnCounter,displayNull))) then { + disableSerialization; + private ["_counter","_title","_back","_timer","_frame","_x","_y"]; + _counter = GETUVAR(RscRespawnCounter,displayNull); + _title = _counter displayCtrl 1001; + _back = _counter displayCtrl 1002; + _timer = _counter displayCtrl 1003; + _frame = _counter ctrlCreate ["RscFrame",1008]; + + _x = safeZoneX + safeZoneW - TOOL_W * 4 - MARGIN * 3; + _y = safeZoneY + safeZoneH - TOOL_H; + + // Timer + _title ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + _back ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + _timer ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + _frame ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + _timer ctrlSetFontHeight TOOL_H; + + _title ctrlCommit 0; + _back ctrlCommit 0; + _timer ctrlCommit 0; + _frame ctrlCommit 0; + }; + },[],0.5] call EFUNC(common,waitAndExecute); }; case "onunload": { // Kill GUI PFHs From c808021c7c9ae480d2d27a4735516ed02f688049 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Wed, 5 Aug 2015 21:11:25 +0100 Subject: [PATCH 023/137] Tweak spectator interface layout - Swap the FOV and vision mode tools into a more logical order. - Shorten the unit list to prevent overlay with main UI - Fix name tool on dead units --- addons/spectator/UI/interface.hpp | 14 +++++++------- addons/spectator/functions/fnc_handleToolbar.sqf | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index bd6d34339f..2ac33e4a64 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -121,11 +121,11 @@ class GVAR(interface) { idc = -1; style = 64; }; - class fovTool: viewTool { - idc = IDC_TOOL_FOV; + class visionTool: viewTool { + idc = IDC_TOOL_VISION; x = TOOL_W * 3 + MARGIN * 2; }; - class fovFrame: fovTool { + class visionFrame: visionTool { idc = -1; style = 64; }; @@ -137,11 +137,11 @@ class GVAR(interface) { idc = -1; style = 64; }; - class visionTool: viewTool { - idc = IDC_TOOL_VISION; + class fovTool: viewTool { + idc = IDC_TOOL_FOV; x = safeZoneW - TOOL_W * 2 - MARGIN; }; - class visionFrame: visionTool { + class fovFrame: fovTool { idc = -1; style = 64; }; @@ -160,7 +160,7 @@ class GVAR(interface) { x = safeZoneX; y = safeZoneY + TOOL_H * 2; w = TOOL_W * 2; - h = safeZoneH - TOOL_H * 4; + h = safeZoneH - TOOL_H * 6; sizeEx = H_PART(0.8); borderSize = 1; colorBorder[] = {COL_FORE}; diff --git a/addons/spectator/functions/fnc_handleToolbar.sqf b/addons/spectator/functions/fnc_handleToolbar.sqf index fd29ca532e..878f3e46de 100644 --- a/addons/spectator/functions/fnc_handleToolbar.sqf +++ b/addons/spectator/functions/fnc_handleToolbar.sqf @@ -1,6 +1,6 @@ /* * Author: Karel Moricky, SilentSpike - * Handles the spectator UI toolbar values and applies them to the camera + * Handles the spectator UI toolbar values * * Arguments: * 0: Parameters @@ -31,15 +31,15 @@ if (GVAR(camMode) == 0) then { _fov = format ["%1x", floor(GVAR(camZoom) * 100) * 0.01]; _speed = format ["%1 m/s", floor(GVAR(camSpeed) * 100) * 0.01]; } else { - _vision = format ["%1 m", floor(getPosASL GVAR(camUnit) select 2)]; - _fov = [side group GVAR(camUnit)] call BIS_fnc_sideName; + _vision = [side group GVAR(camUnit)] call BIS_fnc_sideName; + _fov = format ["%1 m", floor(getPosASL GVAR(camUnit) select 2)]; _speed = format ["%1 km/h", floor(speed GVAR(camUnit)) max 0]; }; -if (isNull GVAR(camUnit)) then { - _name = localize "STR_Special_None"; -} else { +if (alive GVAR(camUnit)) then { _name = GETVAR(GVAR(camUnit),GVAR(uName),""); +} else { + _name = localize "STR_Special_None"; }; _mode = [localize LSTRING(ViewFree),localize LSTRING(ViewInternal),localize LSTRING(ViewExternal)] select GVAR(camMode); From d1975a593dc6d88755b5792b1bd627181bc6d9f0 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Thu, 6 Aug 2015 00:39:14 +0100 Subject: [PATCH 024/137] Improve spectator pause menu emulation Makes the fake pause menu closer to the real thing for UX purposes --- .../functions/fnc_handleInterface.sqf | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index b6608959b7..fdd84ee5ef 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -457,10 +457,10 @@ switch (toLower _mode) do { }; } forEach GVAR(unitList); }; - // Other + // Break from interface for escape menu case "escape": { _args params ["_display"]; - private ["_dlg","_key","_index","_ctrl","_config"]; + private "_dlg"; // Kill display _display closeDisplay 0; @@ -474,7 +474,6 @@ switch (toLower _mode) do { GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; - // Below is from EFUNC(common,disableUserInput) createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); disableSerialization; @@ -484,30 +483,35 @@ switch (toLower _mode) do { !(_key == 1) }]; - for "_index" from 100 to 2000 do { - (_dlg displayCtrl _index) ctrlEnable false; + // Disable save, respawn, options & manual buttons + (_dlg displayCtrl 103) ctrlEnable false; + if !(alive player) then { + (_dlg displayCtrl 1010) ctrlEnable false; }; + (_dlg displayCtrl 101) ctrlEnable false; + (_dlg displayCtrl 122) ctrlEnable false; - _ctrl = _dlg displayctrl 103; - _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {dialog} do {closeDialog 0}; failMission 'LOSER';)]; - _ctrl ctrlEnable true; - _ctrl ctrlSetText "ABORT"; - _ctrl ctrlSetTooltip "Abort."; - - _ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer); - _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1;)]; - _ctrl ctrlEnable (call {_config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}}); - _ctrl ctrlSetText "RESPAWN"; - _ctrl ctrlSetTooltip "Respawn."; + // Initalize abort button (the "spawn" is a necessary evil) + (_dlg displayCtrl 104) ctrlAddEventHandler ["ButtonClick",{_this spawn { + disableSerialization; + _display = ctrlparent (_this select 0); + _abort = [localize "str_msg_confirm_return_lobby",nil,localize "str_disp_xbox_hint_yes",localize "str_disp_xbox_hint_no",_display,nil,true] call BIS_fnc_guiMessage; + if (_abort) then {_display closeDisplay 2; failMission "loser"}; + }}]; // PFH to re-open display when menu closes [{ if !(isNull (findDisplay 49)) exitWith {}; - createDialog QGVAR(interface); - [] call FUNC(transitionCamera); + // If still a spectator then re-enter the interface + if (GVAR(isSet)) then { + createDialog QGVAR(interface); + [] call FUNC(transitionCamera); + }; [_this select 1] call CBA_fnc_removePerFrameHandler; },0] call CBA_fnc_addPerFrameHandler; + + true }; }; From d6cc14a39d20afbd4734ab4c90ddfdbde63cee12 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Thu, 6 Aug 2015 00:52:39 +0100 Subject: [PATCH 025/137] Add zeus support to spectator UI Can only use zeus while alive, so it won't work using the respawn template. However it's useful for communities usign custom frameworks --- .../functions/fnc_handleInterface.sqf | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index fdd84ee5ef..defe5332ba 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -225,6 +225,10 @@ switch (toLower _mode) do { case "onkeydown": { _args params ["_display","_dik","_shift","_ctrl","_alt"]; + if ((alive player) && {_dik in (actionKeys "curatorInterface")} && {!isNull (getAssignedCuratorLogic player)}) exitWith { + ["zeus", [_display]] call FUNC(handleInterface); + }; + // Handle held keys (prevent repeat calling) if (_dik in GVAR(heldKeys)) exitwith {}; // Exclude movement keys so that speed can be adjusted on fly @@ -457,7 +461,7 @@ switch (toLower _mode) do { }; } forEach GVAR(unitList); }; - // Break from interface for escape menu + // Break from interface for eexternal events case "escape": { _args params ["_display"]; private "_dlg"; @@ -511,6 +515,38 @@ switch (toLower _mode) do { [_this select 1] call CBA_fnc_removePerFrameHandler; },0] call CBA_fnc_addPerFrameHandler; + }; + case "zeus": { + _args params ["_display"]; + + // Kill display + _display closeDisplay 0; + + // Reset cam/UI vars + GVAR(camBoom) = 0; + GVAR(camDolly) = [0,0]; + + GVAR(ctrlKey) = false; + GVAR(heldKeys) = []; + GVAR(mouse) = [false,false]; + GVAR(mousePos) = [0.5,0.5]; + + openCuratorInterface; + + [{ + // PFH to re-open display when menu closes + [{ + if !((isNull curatorCamera) && {isNull (GETMVAR(bis_fnc_moduleRemoteControl_unit,objNull))}) exitWith {}; + + // If still a spectator then re-enter the interface + if (GVAR(isSet)) then { + createDialog QGVAR(interface); + [] call FUNC(transitionCamera); + }; + + [_this select 1] call CBA_fnc_removePerFrameHandler; + },0] call CBA_fnc_addPerFrameHandler; + },[],5] call EFUNC(common,waitAndExecute); true }; From 92ef0bfe995632527c255099d45862a99a913a3f Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Thu, 6 Aug 2015 11:34:24 +0100 Subject: [PATCH 026/137] Whitelist spectator free camera boom keys Now that booming the free camera is influenced by the camera speed, the keys should be whitelisted from the held-key prevention system to allow the speed to be adjusted on the move. Also includes a failed attempt to fix the free camera map teleporting functionality. --- addons/spectator/UI/interface.hpp | 2 +- addons/spectator/functions/fnc_handleInterface.sqf | 12 +++++++----- addons/spectator/functions/fnc_transitionCamera.sqf | 4 +++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index 2ac33e4a64..182263e7b4 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -180,7 +180,7 @@ class GVAR(interface) { y = safeZoneY; w = safeZoneW; h = safeZoneH; - onMouseButtonDblClick = QUOTE([ARR_2('onMapDblClick',_this)] call FUNC(handleInterface)); + onMouseButtonDown = QUOTE([ARR_2('onMapClick',_this)] call FUNC(handleInterface)); onDraw = QUOTE([ARR_2('onDraw',_this)] call FUNC(handleInterface)); }; class helpSplash: RscControlsGroupNoScrollbars { diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index defe5332ba..502ce65fd4 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -40,8 +40,9 @@ switch (toLower _mode) do { GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); [] call FUNC(transitionCamera); - // Close map + // Close map and clear radio openMap [false,false]; + clearRadio; // Disable BI damage effects BIS_fnc_feedback_allowPP = false; @@ -76,8 +77,9 @@ switch (toLower _mode) do { GVAR(camera) cameraEffect ["terminate", "back"]; camDestroy GVAR(camera); - // Return to player view clearRadio; + + // Return to player view _unit switchCamera "internal"; // Enable BI damage effects @@ -232,7 +234,7 @@ switch (toLower _mode) do { // Handle held keys (prevent repeat calling) if (_dik in GVAR(heldKeys)) exitwith {}; // Exclude movement keys so that speed can be adjusted on fly - if !(_dik in [17,30,31,32]) then { + if !(_dik in [16,17,30,31,32,44]) then { GVAR(heldKeys) pushBack _dik; }; @@ -422,8 +424,8 @@ switch (toLower _mode) do { _tree tvSort [[],false]; }; // Map events - case "onmapdblclick": { - _args params ["_map","_button","_x","_y"]; + case "onmapclick": { + _args params ["_map","_button","_x","_y","_shift","_ctrl","_alt"]; private ["_newPos","_oldZ"]; if ((GVAR(camMode) == 0) && (_button == 0)) then { diff --git a/addons/spectator/functions/fnc_transitionCamera.sqf b/addons/spectator/functions/fnc_transitionCamera.sqf index 4957540fa4..90a2dc776b 100644 --- a/addons/spectator/functions/fnc_transitionCamera.sqf +++ b/addons/spectator/functions/fnc_transitionCamera.sqf @@ -53,7 +53,9 @@ if (_newMode == 0) then { // Free GVAR(camera) camSetFov -(linearConversion [0.01,2,GVAR(camZoom),-2,-0.01,true]); GVAR(camera) camCommit 0; - // Agent is switched to in free cam to hide death table and prevent AI chat + // Agent is switched to in free cam to hide death table and prevent AI chat while allowing icons to draw + // However, map click events don't fire in free cam for some reason... + // (Why is so much stuff tied into the current camera unit BI?!) if (isNull GVAR(camAgent)) then { GVAR(camAgent) = createAgent ["VirtualMan_F",markerPos QGVAR(respawn),[],0,""]; }; From bcb21b782e1ed9d52ca5c7ac61b30d09e90ef795 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Thu, 6 Aug 2015 13:42:31 +0100 Subject: [PATCH 027/137] Overhaul spectator icon handling and rendering - Optimize and improve 3D icon drawing - Combine 2D and 3D PFHs into 1 - Render group icons outside of 200m, unit icons within - Store list of groups on units update to cut down on what needs to be done each frame - Change map control type to 100 to remove all default unit icons - Improve colour caching, group colours don't change, unit colours do - Remove icon setting, toggling should be at users discretion --- addons/spectator/ACE_Settings.hpp | 4 -- addons/spectator/UI/interface.hpp | 3 +- addons/spectator/XEH_preInit.sqf | 2 + .../spectator/functions/fnc_cacheUnitInfo.sqf | 11 +++- .../spectator/functions/fnc_handleIcons.sqf | 57 ++++++++----------- .../functions/fnc_handleInterface.sqf | 32 ++--------- addons/spectator/functions/fnc_handleMap.sqf | 46 +++++++++++++++ .../functions/fnc_transitionCamera.sqf | 6 -- .../spectator/functions/fnc_updateUnits.sqf | 7 ++- addons/spectator/stringtable.xml | 8 --- 10 files changed, 90 insertions(+), 86 deletions(-) create mode 100644 addons/spectator/functions/fnc_handleMap.sqf diff --git a/addons/spectator/ACE_Settings.hpp b/addons/spectator/ACE_Settings.hpp index 2889fd2e0f..78402cff23 100644 --- a/addons/spectator/ACE_Settings.hpp +++ b/addons/spectator/ACE_Settings.hpp @@ -19,8 +19,4 @@ class ACE_Settings { value = 0; values[] = {CSTRING(modes_all), CSTRING(visions_nv), CSTRING(visions_ti), "$STR_Special_None"}; }; - class GVAR(unitIcons) { - typeName = "BOOL"; - value = 1; - }; }; diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index 182263e7b4..0b4d33ea75 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -176,12 +176,13 @@ class GVAR(interface) { }; class mapOverlay: RscMapControl { idc = IDC_MAP; + type = 100; x = safeZoneX; y = safeZoneY; w = safeZoneW; h = safeZoneH; onMouseButtonDown = QUOTE([ARR_2('onMapClick',_this)] call FUNC(handleInterface)); - onDraw = QUOTE([ARR_2('onDraw',_this)] call FUNC(handleInterface)); + onDraw = QUOTE(_this call FUNC(handleMap)); }; class helpSplash: RscControlsGroupNoScrollbars { idc = IDC_HELP; diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index 95c18f4a54..2c29598ebc 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(handleCamera); PREP(handleCompass); PREP(handleIcons); PREP(handleInterface); +PREP(handleMap); PREP(handleMouse); PREP(handleToolbar); PREP(handleUnits); @@ -51,5 +52,6 @@ GVAR(showUnit) = true; GVAR(unitList) = []; GVAR(unitBlacklist) = []; GVAR(unitWhitelist) = []; +GVAR(groupList) = []; ADDON = true; diff --git a/addons/spectator/functions/fnc_cacheUnitInfo.sqf b/addons/spectator/functions/fnc_cacheUnitInfo.sqf index 13977bf398..9f40651748 100644 --- a/addons/spectator/functions/fnc_cacheUnitInfo.sqf +++ b/addons/spectator/functions/fnc_cacheUnitInfo.sqf @@ -19,15 +19,20 @@ params ["_unit"]; private ["_color","_icon","_name"]; -_color = [side group _unit] call BIS_fnc_sideColor; +// Group info only needs to be cached once (groups can't change) +if (isNil { GETVAR((group _unit),GVAR(gColor),nil) }) then { + _color = [side group _unit] call BIS_fnc_sideColor; + SETVAR((group _unit),GVAR(gColor),_color); +}; + +// Unit info should be updated each time _icon = getText (configFile >> "CfgVehicles" >> typeOf _unit >> "Icon"); _name = [_unit,false] call EFUNC(common,getName); // Handle CfgVehicleIcons -if isText (configFile >> "CfgVehicleIcons" >> _icon) then { +if (isText (configFile >> "CfgVehicleIcons" >> _icon)) then { _icon = getText (configFile >> "CfgVehicleIcons" >> _icon); }; -SETVAR(_unit,GVAR(uColor),_color); SETVAR(_unit,GVAR(uIcon),_icon); SETVAR(_unit,GVAR(uName),_name); diff --git a/addons/spectator/functions/fnc_handleIcons.sqf b/addons/spectator/functions/fnc_handleIcons.sqf index c52943ad10..72c0d7dee6 100644 --- a/addons/spectator/functions/fnc_handleIcons.sqf +++ b/addons/spectator/functions/fnc_handleIcons.sqf @@ -1,5 +1,5 @@ /* - * Author: SilentSpike + * Author: Head, SilentSpike * Handles rendering the spectator 3D unit icons * * Arguments: @@ -17,41 +17,30 @@ #include "script_component.hpp" -// Kill PFH when not in free cam (or display is closed) -if (isNil QGVAR(iconHandler)) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; - if !(GVAR(showIcons)) exitWith {}; +private ["_refPoint","_drawVehicles","_leader","_color","_txt","_unit"]; -private ["_cachedVehicles","_unit","_cameraPos","_cameraDir","_lambda","_uPos","_cmd","_txt"]; -_cachedVehicles = []; +// Draw groups unless leader is within distance +_refPoint = [GVAR(camera),GVAR(camUnit)] select (GVAR(camMode) > 0); +_drawVehicles = []; { - _unit = vehicle _x; + _leader = leader _x; + if ((_leader distanceSqr _refPoint) > 40000) then { + _color = GETVAR(_x,GVAR(gColor),[ARR_4(0,0,0,0)]); + _txt = groupID _x; - // Only try each vehicle once - if !(_unit in _cachedVehicles) then { - _cachedVehicles pushBack _unit; - - // Within 200m - if ((GVAR(camera) distanceSqr _unit) < 40000) then { - _cameraPos = (positionCameraToWorld [0, 0, 0]) call EFUNC(common,positionToASL); - _cameraDir = ((positionCameraToWorld [0, 0, 1]) call EFUNC(common,positionToASL)) vectorDiff _cameraPos; - - // Quick oclussion test (taken from interact_menu) - _lambda = ((getPosASL _x) vectorDiff _cameraPos) vectorDotProduct _cameraDir; - if (_lambda > -1) then { - _uPos = worldToScreen (visiblePosition _unit); - - // Only draw if onscreen - if ((_uPos select 0 > safeZoneXAbs) && (_uPos select 0 < safeZoneXAbs + safeZoneWAbs)) then { - if ((_uPos select 1 > safeZoneY) && (_uPos select 1 < safeZoneY + safeZoneH)) then { - // Use commander's info if available - _cmd = [_x, effectiveCommander _unit] select ((effectiveCommander _unit) in GVAR(unitList)); - _txt = ["", GETVAR(_cmd,GVAR(uName),"")] select (isPlayer _cmd); - - drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", GETVAR(_cmd,GVAR(uColor),[ARR_4(0,0,0,0)]), _unit modelToWorldVisual [0,0,3], 0.7, 0.7, 0, _txt, 1, 0.02]; - }; - }; - }; - }; + drawIcon3D ["\A3\ui_f\data\map\markers\nato\b_inf.paa", _color, _leader modelToWorldVisual [0,0,30], 1, 1, 0, _txt, 2, 0.02]; + } else { + _drawVehicles append (units _x); }; -} forEach GVAR(unitList); + false +} count GVAR(groupList); + +// Draw units for groups within distance +{ + _color = GETVAR((group _x),GVAR(gColor),[ARR_4(0,0,0,0)]); + _txt = ["", GETVAR(_x,GVAR(uName),"")] select (isPlayer _x); + + drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", _color, _x modelToWorldVisual [0,0,3], 0.7, 0.7, 0, _txt, 1, 0.02]; + false +} count (_drawVehicles arrayIntersect GVAR(unitList)); diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 502ce65fd4..d58566968c 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -114,6 +114,9 @@ switch (toLower _mode) do { // Keep unit list and tree up to date [FUNC(handleUnits), 21, _display] call CBA_fnc_addPerFrameHandler; + // Handle unit icons on map and 3D + GVAR(iconHandler) = addMissionEventHandler ["Draw3D",FUNC(handleIcons)]; + // Populate the help splash private "_help"; _help = (_display displayCtrl IDC_HELP) controlsGroupCtrl IDC_HELP_LIST; @@ -187,6 +190,7 @@ switch (toLower _mode) do { // Kill GUI PFHs GVAR(camHandler) = nil; GVAR(compHandler) = nil; + removeMissionEventHandler ["Draw3D",GVAR(iconHandler)]; GVAR(iconHandler) = nil; GVAR(toolHandler) = nil; }; @@ -435,34 +439,6 @@ switch (toLower _mode) do { [nil,nil,nil, _newPos] call FUNC(setCameraAttributes); }; }; - case "ondraw": { - _args params ["_map"]; - - if (GVAR(camMode) == 0) then { - _map drawIcon ["\A3\UI_F\Data\GUI\Rsc\RscDisplayMissionEditor\iconcamera_ca.paa",[0,0,0,1],GVAR(camera),24,24,GVAR(camPan)]; - }; - - if !(GVAR(showIcons)) exitWith {}; - - private ["_cachedVehicles","_unit","_color","_icon"]; - _cachedVehicles = []; - { - _unit = vehicle _x; - - if !(_unit in _cachedVehicles) then { - _cachedVehicles pushBack _unit; - - // Use previously cached info where possible - if (isNil { GETVAR(_unit,GVAR(uIcon),nil) }) then { - [_unit] call FUNC(cacheUnitInfo); - }; - - _color = GETVAR(_unit,GVAR(uColor),[ARR_4(0,0,0,0)]); - _icon = GETVAR(_unit,GVAR(uIcon),""); - _map drawIcon [_icon, _color, _unit, 24, 24, getDir _unit]; - }; - } forEach GVAR(unitList); - }; // Break from interface for eexternal events case "escape": { _args params ["_display"]; diff --git a/addons/spectator/functions/fnc_handleMap.sqf b/addons/spectator/functions/fnc_handleMap.sqf new file mode 100644 index 0000000000..a0000718bd --- /dev/null +++ b/addons/spectator/functions/fnc_handleMap.sqf @@ -0,0 +1,46 @@ +/* + * Author: Head, SilentSpike + * Handles rendering the spectator map icons + * + * Arguments: + * 0: Parameters + * 1: PFH handle + * + * Return Value: + * None + * + * Example: + * [ace_spectator_fnc_handleIcons, 0] call CBA_fnc_addPerFrameHandler; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_map"]; +private ["_cachedVehicles","_unit","_color","_icon"]; + +if (GVAR(camMode) == 0) then { + _map drawIcon ["\A3\UI_F\Data\GUI\Rsc\RscDisplayMissionEditor\iconcamera_ca.paa",[0,0,0,1],GVAR(camera),20,20,GVAR(camPan)]; +}; + +_cachedVehicles = []; +{ + _unit = vehicle _x; + + if !(_unit in _cachedVehicles) then { + _cachedVehicles pushBack _unit; + + // Use previously cached info where possible + if (GETVAR(_unit,GVAR(uIcon),"") == "") then { + [_unit] call FUNC(cacheUnitInfo); + }; + + // Function has caching built in + _color = [side effectiveCommander _unit] call BIS_fnc_sideColor; + _icon = GETVAR(_unit,GVAR(uIcon),""); + + _map drawIcon [_icon, _color, _unit, 19, 19, getDir _unit]; + }; + false +} count GVAR(unitList); diff --git a/addons/spectator/functions/fnc_transitionCamera.sqf b/addons/spectator/functions/fnc_transitionCamera.sqf index 90a2dc776b..b35b61b311 100644 --- a/addons/spectator/functions/fnc_transitionCamera.sqf +++ b/addons/spectator/functions/fnc_transitionCamera.sqf @@ -79,11 +79,6 @@ if (_newMode == 0) then { // Free // Handle camera movement if (isNil QGVAR(camHandler)) then { GVAR(camHandler) = [FUNC(handleCamera), 0] call CBA_fnc_addPerFrameHandler; }; - - // Handle unit icons - if (GVAR(unitIcons)) then { - if (isNil QGVAR(iconHandler)) then { GVAR(iconHandler) = [FUNC(handleIcons), 0] call CBA_fnc_addPerFrameHandler; }; - }; } else { // When null unit is given choose random if (isNull _newUnit) then { @@ -111,7 +106,6 @@ if (_newMode == 0) then { // Free // Terminate camera view GVAR(camera) cameraEffect ["terminate", "back"]; GVAR(camHandler) = nil; - GVAR(iconHandler) = nil; cameraEffectEnableHUD true; }; diff --git a/addons/spectator/functions/fnc_updateUnits.sqf b/addons/spectator/functions/fnc_updateUnits.sqf index 75f1402179..50494cf499 100644 --- a/addons/spectator/functions/fnc_updateUnits.sqf +++ b/addons/spectator/functions/fnc_updateUnits.sqf @@ -33,7 +33,7 @@ if !(_newUnits isEqualTo []) exitWith { }; }; -private ["_sides","_cond","_filteredUnits","_color","_icon"]; +private ["_sides","_cond","_filteredUnits","_filteredGroups"]; // Unit setting filter _newUnits = [[],allPlayers,playableUnits,allUnits] select GVAR(filterUnits); @@ -63,10 +63,13 @@ _filteredUnits = []; _filteredUnits append GVAR(unitWhitelist); // Cache icons and colour for drawing +_filteredGroups = []; { // Intentionally re-applied to units in case their status changes [_x] call FUNC(cacheUnitInfo); + _filteredGroups pushBack (group _x); } forEach _filteredUnits; -// Replace previous list entirely (removes any no longer valid) +// Replace previous lists entirely (removes any no longer valid) GVAR(unitList) = _filteredUnits arrayIntersect _filteredUnits; +GVAR(groupList) = _filteredGroups arrayIntersect _filteredGroups; diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 5219ba7e2d..4d615d4e1e 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -100,14 +100,6 @@ Thermal imaging Termowizja - - Unit icons - Ikony jednostek - - - Render icons above spectatable units. - Renderuj ikony nad głowami jednostek, które można obserwować. - Spectator Controls From 4c9b6e94cfa915a70b3911d18acda892c7ff8c66 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 00:05:21 +0100 Subject: [PATCH 028/137] Overhaul and improve spectator unit tree UX The old method of refreshing the tree on each update would reset all expanded/collapsed nodes. Now the code will cull any units/groups/sides no longer spectatable from the list and cache the ones that are still valid. The cached data is then used to populate the list with new units. Add coloured unit icons beside units in the list for quick user reference of side and type. Store group netIDs in respective nodes for possible use in code. --- addons/spectator/UI/interface.hpp | 4 +- .../functions/fnc_handleInterface.sqf | 85 ++++++++++++------- 2 files changed, 55 insertions(+), 34 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index 0b4d33ea75..ea5f5f0e53 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -158,9 +158,9 @@ class GVAR(interface) { class unitTree: RscTree { idc = IDC_UNIT; x = safeZoneX; - y = safeZoneY + TOOL_H * 2; + y = safeZoneY + TOOL_H * 6; w = TOOL_W * 2; - h = safeZoneH - TOOL_H * 6; + h = safeZoneH - TOOL_H * 13; sizeEx = H_PART(0.8); borderSize = 1; colorBorder[] = {COL_FORE}; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index d58566968c..9687ba8b2a 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -367,17 +367,43 @@ switch (toLower _mode) do { }; case "onunitsupdate": { _args params ["_tree"]; - private ["_curSelData","_cachedGrps","_cachedSides","_grp","_side","_sNode","_gNode","_uNode"]; + private ["_cachedUnits","_cachedGrps","_cachedSides","_s","_g","_grp","_u","_unit","_side"]; - // Cache current selection - _curSelData = _tree tvData (tvCurSel _tree); - - // Clear the tree - tvClear _tree; - - // Update the tree from the unit list + // Cache existing group and side nodes and cull removed data + _cachedUnits = []; _cachedGrps = []; _cachedSides = []; + for "_s" from 0 to ((_tree tvCount []) - 1) do { + for "_g" from 0 to ((_tree tvCount [_s]) - 1) do { + _grp = groupFromNetID (_tree tvData [_s,_g]); + + if (_grp in GVAR(groupList)) then { + _cachedGrps pushBack _grp; + _cachedGrps pushBack _g; + + for "_u" from 0 to ((_tree tvCount [_s,_g])) do { + _unit = objectFromNetId (_tree tvData [_s,_g,_u]); + + if (_unit in GVAR(unitList)) then { + _cachedUnits pushBack _unit; + } else { + _tree tvDelete [_s,_g,_u]; + }; + }; + } else { + _tree tvDelete [_s,_g]; + }; + }; + + if ((_tree tvCount [_s]) > 0) then { + _cachedSides pushBack (_tree tvText [_s]); + _cachedSides pushBack _s; + } else { + _tree tvDelete [_s]; + }; + }; + + // Update the tree from the unit list { _grp = group _x; _side = [side _grp] call BIS_fnc_sideName; @@ -385,47 +411,42 @@ switch (toLower _mode) do { // Use correct side node if !(_side in _cachedSides) then { // Add side node - _sNode = _tree tvAdd [[], _side]; + _s = _tree tvAdd [[], _side]; + _tree tvExpand [_s]; _cachedSides pushBack _side; - _cachedSides pushBack _sNode; + _cachedSides pushBack _s; } else { // If side already processed, use existing node - _sNode = _cachedSides select ((_cachedSides find _side) + 1); + _s = _cachedSides select ((_cachedSides find _side) + 1); }; // Use correct group node if !(_grp in _cachedGrps) then { // Add group node - _gNode = _tree tvAdd [[_sNode], groupID _grp]; + _g = _tree tvAdd [[_s], groupID _grp]; + _tree tvSetData [[_s,_g], netID _grp]; _cachedGrps pushBack _grp; - _cachedGrps pushBack _gNode; + _cachedGrps pushBack _g; } else { // If group already processed, use existing node - _gNode = _cachedGrps select ((_cachedGrps find _grp) + 1); + _g = _cachedGrps select ((_cachedGrps find _grp) + 1); }; - _uNode = _tree tvAdd [[_sNode,_gNode], GETVAR(_x,GVAR(uName),"")]; - _tree tvSetData [[_sNode,_gNode,_uNode], netID _x]; + _u = _tree tvAdd [[_s,_g], GETVAR(_x,GVAR(uName),"")]; + _tree tvSetData [[_s,_g,_u], netID _x]; + _tree tvSetPicture [[_s,_g,_u], GETVAR(_x,GVAR(uIcon),"")]; + _tree tvSetPictureColor [[_s,_g,_u], GETVAR(_grp,GVAR(gColor),[ARR_4(1,1,1,1)])]; - // Preserve the previous selection - if (_curSelData == (_tree tvData [_sNode,_gNode,_uNode])) then { - _tree tvSetCurSel [_sNode,_gNode,_uNode]; - }; - - _tree tvSort [[_sNode,_gNode],false]; - _tree tvExpand [_sNode,_gNode]; - } forEach GVAR(unitList); - - { - if (typeName _x == "SCALAR") then { - _tree tvSort [[_x],false]; - _tree tvExpand [_x]; - }; - } forEach _cachedSides; + _tree tvSort [[_s,_g],false]; + } forEach (GVAR(unitList) - _cachedUnits); _tree tvSort [[],false]; + + if ((_tree tvCount []) <= 0) then { + _tree tvAdd [[], localize LSTRING(units_none)]; + }; }; // Map events case "onmapclick": { @@ -439,7 +460,7 @@ switch (toLower _mode) do { [nil,nil,nil, _newPos] call FUNC(setCameraAttributes); }; }; - // Break from interface for eexternal events + // Break from interface for external events case "escape": { _args params ["_display"]; private "_dlg"; From f59536b5a3c26c1bee28f77ae01c8d739c06ad19 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 00:28:54 +0100 Subject: [PATCH 029/137] Remove legacy spectator settings module argument --- addons/spectator/CfgVehicles.hpp | 6 ------ addons/spectator/functions/fnc_moduleSpectatorSettings.sqf | 1 - 2 files changed, 7 deletions(-) diff --git a/addons/spectator/CfgVehicles.hpp b/addons/spectator/CfgVehicles.hpp index b63f349b0a..f6869462ac 100644 --- a/addons/spectator/CfgVehicles.hpp +++ b/addons/spectator/CfgVehicles.hpp @@ -109,12 +109,6 @@ class CfgVehicles { }; }; }; - class unitIcons { - displayName = CSTRING(icons_DisplayName); - description = CSTRING(icons_Description); - typeName = "BOOL"; - defaultValue = 1; - }; }; class ModuleDescription { description = CSTRING(Settings_Description); diff --git a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf index c23fb7ad20..52b6e5d8fa 100644 --- a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf +++ b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf @@ -23,4 +23,3 @@ if !(_activated) exitWith {}; [_logic, QGVAR(filterSides), "sidesFilter"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(restrictModes), "cameraModes"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(restrictVisions), "visionModes"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(unitIcons), "unitIcons"] call EFUNC(common,readSettingFromModule); From 043c5c47c5765c64d32e8df23d408db87a8df75b Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 01:44:32 +0100 Subject: [PATCH 030/137] Improve spectator help window layout Having the help window in the centre of the screen blocked too much of the users view and also clashed with the MPTable element (the table that appears on death, aka "respawnDialog"). It was moved to the right of the screen and now mirrors the unit list. To save screen space, the action keys are given as tooltips for the listbox entries so users must mouse over for more info. --- addons/spectator/UI/interface.hpp | 53 +++++++++++-------- .../functions/fnc_handleInterface.sqf | 39 +++++++------- 2 files changed, 50 insertions(+), 42 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index ea5f5f0e53..5dbea22273 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -10,7 +10,7 @@ class RscFrame { class RscButtonMenu; class RscControlsGroupNoScrollbars; //class RscFrame; -class RscListNBox; +class RscListBox; class RscMapControl; class RscPicture; class RscText; @@ -163,12 +163,13 @@ class GVAR(interface) { h = safeZoneH - TOOL_H * 13; sizeEx = H_PART(0.8); borderSize = 1; + colorText[] = {COL_FORE}; colorBorder[] = {COL_FORE}; colorBackground[] = {COL_BACK}; colorSelect[] = { - "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.77])", - "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.51])", - "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.08])", + QUOTE(GETPRVAR(GUI_BCG_RGB_R,0.77)), + QUOTE(GETPRVAR(GUI_BCG_RGB_G,0.51)), + QUOTE(GETPRVAR(GUI_BCG_RGB_B,0.08)), 1 }; multiselectEnabled = 0; @@ -184,35 +185,43 @@ class GVAR(interface) { onMouseButtonDown = QUOTE([ARR_2('onMapClick',_this)] call FUNC(handleInterface)); onDraw = QUOTE(_this call FUNC(handleMap)); }; - class helpSplash: RscControlsGroupNoScrollbars { + class helpWindow: RscControlsGroupNoScrollbars { idc = IDC_HELP; - x = 0.5 - W_PART(12); - y = 0.5 - H_PART(12); - w = W_PART(24); - h = H_PART(24); + x = safeZoneX + safeZoneW - TOOL_W * 2; + y = safeZoneY + TOOL_H * 6; + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 13; + colorText[] = {COL_FORE}; + colorSelectBackground[] = {COL_FORE_D}; + colorSelectBackground2[] = {COL_BACK}; + colorBackground[] = {0,0,0,0}; class controls { - class helpBack: RscText { + class helpTitle: RscText { x = 0; y = 0; - w = W_PART(24); - h = H_PART(24); - colorBackground[] = {COL_BACK}; - }; - class helpTitle: helpBack { + w = TOOL_W * 2; h = H_PART(1); - colorText[]={COL_FORE}; + colorText[] = {COL_FORE}; colorBackground[] = {COL_FORE_D}; sizeEx = H_PART(1); text = CSTRING(HelpTitle); }; - class helpContent: RscListNBox { + class helpContent: RscListBox { idc = IDC_HELP_LIST; - x = W_PART(1); - y = H_PART(2); - W = W_PART(22); - H = H_PART(21); + x = 0; + y = H_PART(1); + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 14; + colorBackground[] = {COL_BACK}; default = 1; - columns[] = {0.01,0.5}; + }; + class helpFrame: RscText { + x = 0; + y = 0; + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 13; + colorText[] = {COL_FORE}; + style = 64; }; }; }; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 9687ba8b2a..ef3363b72c 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -117,27 +117,27 @@ switch (toLower _mode) do { // Handle unit icons on map and 3D GVAR(iconHandler) = addMissionEventHandler ["Draw3D",FUNC(handleIcons)]; - // Populate the help splash + // Populate the help window private "_help"; _help = (_display displayCtrl IDC_HELP) controlsGroupCtrl IDC_HELP_LIST; { - // Add space before category titles - if (count _x == 1) then { - _help lnbAddRow [""]; + _i = _help lbAdd (_x select 0); + if ((_x select 1) == "") then { + _help lbSetPicture [_i,"\A3\ui_f\data\map\markers\military\dot_CA.paa"]; + _help lbSetPictureColor [_i,[COL_FORE]]; + } else { + _help lbSetTooltip [_i,_x select 1]; }; - - _help lnbAddRow _x; } forEach [ [localize LSTRING(uiControls),""], - [localize LSTRING(uiToggleHelp),"H"], - [localize LSTRING(uiToggleMap),"M"], [localize LSTRING(uiToggleUnits),"1"], - [localize LSTRING(uiToggleTools),"2"], - [localize LSTRING(uiToggleCompass),"3"], - [localize LSTRING(uiToggleIcons),"4"], + [localize LSTRING(uiToggleHelp),"2"], + [localize LSTRING(uiToggleTools),"3"], + [localize LSTRING(uiToggleCompass),"4"], + [localize LSTRING(uiToggleIcons),"5"], + [localize LSTRING(uiToggleMap),"M"], [localize LSTRING(uiToggleInterface),"Backspace"], - - [localize LSTRING(freeCamControls)], + [localize LSTRING(freeCamControls),""], [localize LSTRING(freeCamForward),"W"], [localize LSTRING(freeCamBackward),"S"], [localize LSTRING(freeCamLeft),"A"], @@ -150,8 +150,7 @@ switch (toLower _mode) do { [localize LSTRING(freeCamZoom),"Ctrl + Scrollwheel"], [localize LSTRING(freeCamNextVis),"N"], [localize LSTRING(freeCamPrevVis),"Ctrl + N"], - - [localize LSTRING(otherControls)], + [localize LSTRING(otherControls),""], [localize LSTRING(nextCam),"Up Arrow"], [localize LSTRING(prevCam),"Down Arrow"], [localize LSTRING(nextUnit),"Right Arrow"], @@ -250,12 +249,15 @@ switch (toLower _mode) do { [_display,nil,nil,nil,nil,nil,true] call FUNC(toggleInterface); }; case 3: { // 2 - [_display,nil,nil,nil,nil,true] call FUNC(toggleInterface); + [_display,nil,true] call FUNC(toggleInterface); }; case 4: { // 3 - [_display,true] call FUNC(toggleInterface); + [_display,nil,nil,nil,nil,true] call FUNC(toggleInterface); }; case 5: { // 4 + [_display,true] call FUNC(toggleInterface); + }; + case 6: { // 5 GVAR(showIcons) = !GVAR(showIcons); }; case 14: { // Backspace @@ -279,9 +281,6 @@ switch (toLower _mode) do { case 32: { // D GVAR(camDolly) set [0, GVAR(camSpeed)]; }; - case 35: { // H - [_display,nil,true] call FUNC(toggleInterface); - }; case 44: { // Z GVAR(camBoom) = -0.5 * GVAR(camSpeed); }; From 485f9438bb1e2aa56e908156b0a7fd5f883a69d5 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 01:51:46 +0100 Subject: [PATCH 031/137] Change spectator UI toggle to include help window With new layout of help window the toggle UX also changes. User expects help window to toggle as part of overall UI. --- .../spectator/functions/fnc_toggleInterface.sqf | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/addons/spectator/functions/fnc_toggleInterface.sqf b/addons/spectator/functions/fnc_toggleInterface.sqf index 609c7cd757..4a03de4271 100644 --- a/addons/spectator/functions/fnc_toggleInterface.sqf +++ b/addons/spectator/functions/fnc_toggleInterface.sqf @@ -31,17 +31,8 @@ _map = _display displayCtrl IDC_MAP; _tool = _display displayCtrl IDC_TOOL; _unit = _display displayCtrl IDC_UNIT; -// Map and help operate outside of interface -GVAR(showHelp) = [GVAR(showHelp), !GVAR(showHelp)] select _toggleHelp; +// Map operates outside of interface GVAR(showMap) = [GVAR(showMap), !GVAR(showMap)] select _toggleMap; - -// When help changes with map open, minimise the map -if (GVAR(showMap) && _toggleHelp) then { - GVAR(showHelp) = true; - GVAR(showMap) = false; -}; - -_help ctrlShow GVAR(showHelp); _map ctrlShow GVAR(showMap); if (GVAR(showMap)) then { @@ -62,16 +53,18 @@ if (GVAR(showMap)) then { if (GVAR(showInterface)) then { // Can only toggle interface elements with interface shown GVAR(showComp) = [GVAR(showComp), !GVAR(showComp)] select _toggleComp; + GVAR(showHelp) = [GVAR(showHelp), !GVAR(showHelp)] select _toggleHelp; GVAR(showTool) = [GVAR(showTool), !GVAR(showTool)] select _toggleTool; GVAR(showUnit) = [GVAR(showUnit), !GVAR(showUnit)] select _toggleUnit; _comp ctrlShow GVAR(showComp); + _help ctrlShow GVAR(showHelp); _tool ctrlShow GVAR(showTool); _unit ctrlShow GVAR(showUnit); } else { { _x ctrlShow false; - } forEach [_comp,_tool,_unit]; + } forEach [_comp,_help,_tool,_unit]; }; }; From f143db7fc067133e53e81897ff614297a5a25109 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 12:07:22 +0100 Subject: [PATCH 032/137] Draw player names on spectator map --- addons/spectator/UI/interface.hpp | 6 +++--- addons/spectator/functions/fnc_handleMap.sqf | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index 5dbea22273..51105b216b 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -167,9 +167,9 @@ class GVAR(interface) { colorBorder[] = {COL_FORE}; colorBackground[] = {COL_BACK}; colorSelect[] = { - QUOTE(GETPRVAR(GUI_BCG_RGB_R,0.77)), - QUOTE(GETPRVAR(GUI_BCG_RGB_G,0.51)), - QUOTE(GETPRVAR(GUI_BCG_RGB_B,0.08)), + "profilenamespace getvariable ['GUI_BCG_RGB_R',0.77]", + "profilenamespace getvariable ['GUI_BCG_RGB_G',0.51]", + "profilenamespace getvariable ['GUI_BCG_RGB_B',0.08]", 1 }; multiselectEnabled = 0; diff --git a/addons/spectator/functions/fnc_handleMap.sqf b/addons/spectator/functions/fnc_handleMap.sqf index a0000718bd..4eeb5fd7e1 100644 --- a/addons/spectator/functions/fnc_handleMap.sqf +++ b/addons/spectator/functions/fnc_handleMap.sqf @@ -18,7 +18,7 @@ #include "script_component.hpp" params ["_map"]; -private ["_cachedVehicles","_unit","_color","_icon"]; +private ["_cachedVehicles","_unit","_color","_icon","_txt"]; if (GVAR(camMode) == 0) then { _map drawIcon ["\A3\UI_F\Data\GUI\Rsc\RscDisplayMissionEditor\iconcamera_ca.paa",[0,0,0,1],GVAR(camera),20,20,GVAR(camPan)]; @@ -39,8 +39,9 @@ _cachedVehicles = []; // Function has caching built in _color = [side effectiveCommander _unit] call BIS_fnc_sideColor; _icon = GETVAR(_unit,GVAR(uIcon),""); + _txt = ["", GETVAR(_x,GVAR(uName),"")] select (isPlayer _x); - _map drawIcon [_icon, _color, _unit, 19, 19, getDir _unit]; + _map drawIcon [_icon, _color, _unit, 19, 19, getDir _unit, _txt, 1, 0.03]; }; false } count GVAR(unitList); From 702e50b731fd849c59a1ee1a7e531601ff703b52 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 12:30:50 +0100 Subject: [PATCH 033/137] Improve spectator UI respawn counter blending When the BI respawn counter is blended with the spectator UI its colours are also updated to match --- addons/spectator/functions/fnc_handleInterface.sqf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index ef3363b72c..db701366b0 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -176,7 +176,11 @@ switch (toLower _mode) do { _back ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; _timer ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; _frame ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + + _title ctrlSetBackgroundColor [0,0,0,0]; + _back ctrlSetBackgroundColor [COL_BACK]; _timer ctrlSetFontHeight TOOL_H; + _frame ctrlSetTextColor [COL_FORE]; _title ctrlCommit 0; _back ctrlCommit 0; From 1c79c8fa45fc55c85cd90458803879ae22a8e6de Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 15:15:04 +0100 Subject: [PATCH 034/137] Update spectator UI styling Adds a title to the unit tree to match the help list and enters the title text. --- addons/spectator/UI/interface.hpp | 67 +++++++++++++------ .../spectator/functions/fnc_handleUnits.sqf | 2 +- addons/spectator/script_component.hpp | 5 +- addons/spectator/stringtable.xml | 3 + 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index 51105b216b..a7790d6da0 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -137,11 +137,11 @@ class GVAR(interface) { idc = -1; style = 64; }; - class fovTool: viewTool { + class zoomTool: viewTool { idc = IDC_TOOL_FOV; x = safeZoneW - TOOL_W * 2 - MARGIN; }; - class fovFrame: fovTool { + class zoomFrame: zoomTool { idc = -1; style = 64; }; @@ -155,25 +155,52 @@ class GVAR(interface) { }; }; }; - class unitTree: RscTree { + class unitTree: RscControlsGroupNoScrollbars { idc = IDC_UNIT; x = safeZoneX; y = safeZoneY + TOOL_H * 6; w = TOOL_W * 2; h = safeZoneH - TOOL_H * 13; - sizeEx = H_PART(0.8); - borderSize = 1; - colorText[] = {COL_FORE}; - colorBorder[] = {COL_FORE}; - colorBackground[] = {COL_BACK}; - colorSelect[] = { - "profilenamespace getvariable ['GUI_BCG_RGB_R',0.77]", - "profilenamespace getvariable ['GUI_BCG_RGB_G',0.51]", - "profilenamespace getvariable ['GUI_BCG_RGB_B',0.08]", - 1 + class controls { + class unitTitle: RscText { + x = 0; + y = 0; + w = TOOL_W * 2; + h = H_PART(1); + style = 2; + colorText[] = {COL_FORE}; + colorBackground[] = {COL_FORE_D}; + sizeEx = H_PART(1); + text = CSTRING(UnitTitle); + }; + class unitTree: RscTree { + idc = IDC_UNIT_TREE; + x = 0; + y = H_PART(1); + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 14; + sizeEx = H_PART(0.8); + colorText[] = {COL_FORE}; + colorBorder[] = {0,0,0,0}; + colorBackground[] = {COL_BACK}; + colorSelect[] = { + "profilenamespace getvariable ['GUI_BCG_RGB_R',0.77]", + "profilenamespace getvariable ['GUI_BCG_RGB_G',0.51]", + "profilenamespace getvariable ['GUI_BCG_RGB_B',0.08]", + 1 + }; + multiselectEnabled = 0; + onTreeDblClick = QUOTE([ARR_2('onTreeDblClick',_this)] call FUNC(handleInterface)); + }; + class unitFrame: RscFrame { + x = 0; + y = 0; + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 13; + shadow = 2; + colorText[] = {COL_FORE}; + }; }; - multiselectEnabled = 0; - onTreeDblClick = QUOTE([ARR_2('onTreeDblClick',_this)] call FUNC(handleInterface)); }; class mapOverlay: RscMapControl { idc = IDC_MAP; @@ -191,16 +218,13 @@ class GVAR(interface) { y = safeZoneY + TOOL_H * 6; w = TOOL_W * 2; h = safeZoneH - TOOL_H * 13; - colorText[] = {COL_FORE}; - colorSelectBackground[] = {COL_FORE_D}; - colorSelectBackground2[] = {COL_BACK}; - colorBackground[] = {0,0,0,0}; class controls { class helpTitle: RscText { x = 0; y = 0; w = TOOL_W * 2; h = H_PART(1); + style = 2; colorText[] = {COL_FORE}; colorBackground[] = {COL_FORE_D}; sizeEx = H_PART(1); @@ -213,15 +237,16 @@ class GVAR(interface) { w = TOOL_W * 2; h = safeZoneH - TOOL_H * 14; colorBackground[] = {COL_BACK}; + sizeEx = H_PART(0.8); default = 1; }; - class helpFrame: RscText { + class helpFrame: RscFrame { x = 0; y = 0; w = TOOL_W * 2; h = safeZoneH - TOOL_H * 13; + shadow = 2; colorText[] = {COL_FORE}; - style = 64; }; }; }; diff --git a/addons/spectator/functions/fnc_handleUnits.sqf b/addons/spectator/functions/fnc_handleUnits.sqf index e8cd561da0..c32961024c 100644 --- a/addons/spectator/functions/fnc_handleUnits.sqf +++ b/addons/spectator/functions/fnc_handleUnits.sqf @@ -36,5 +36,5 @@ if !(GVAR(camUnit) in GVAR(unitList)) then { // Reduce overhead when unit tree is hidden if (ctrlShown (_display displayCtrl IDC_UNIT)) then { // Reduce overhead by spreading across frames - [FUNC(handleInterface),["onUnitsUpdate",[_display displayCtrl IDC_UNIT]],1] call EFUNC(common,waitAndExecute); + [FUNC(handleInterface),["onUnitsUpdate",[(_display displayCtrl IDC_UNIT) controlsGroupCtrl IDC_UNIT_TREE]],1] call EFUNC(common,waitAndExecute); }; diff --git a/addons/spectator/script_component.hpp b/addons/spectator/script_component.hpp index a726c6c67f..de2ee22363 100644 --- a/addons/spectator/script_component.hpp +++ b/addons/spectator/script_component.hpp @@ -49,8 +49,9 @@ #define IDC_TOOL_VISION 3004 #define IDC_UNIT 6002 +#define IDC_UNIT_TREE 6005 // UI colours -#define COL_BACK 0.1,0.1,0.1,0.8 +#define COL_BACK 0.1,0.1,0.1,0.7 #define COL_FORE 1,1,1,1 -#define COL_FORE_D 0.1,0.1,0.1,1 +#define COL_FORE_D 0.1,0.1,0.1,0.8 diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 4d615d4e1e..30af5d1aa6 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -101,6 +101,9 @@ Termowizja + + Spectator Units + Spectator Controls Sterowanie obserwatorem From c5d9ec5d500a83db1bc3e85c4dc9c005f89f8fb0 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 18:59:48 +0100 Subject: [PATCH 035/137] Add speed boost button to spectator free camera Sometimes you just want a burst of speed rather than to adjust it and then adjust it back. Also swapped the speed/zoom scrolling modifier around. --- .../functions/fnc_handleInterface.sqf | 33 ++++++++++--------- addons/spectator/stringtable.xml | 3 ++ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index db701366b0..80d87cf40a 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -114,7 +114,7 @@ switch (toLower _mode) do { // Keep unit list and tree up to date [FUNC(handleUnits), 21, _display] call CBA_fnc_addPerFrameHandler; - // Handle unit icons on map and 3D + // Handle 3D unit icons GVAR(iconHandler) = addMissionEventHandler ["Draw3D",FUNC(handleIcons)]; // Populate the help window @@ -146,8 +146,9 @@ switch (toLower _mode) do { [localize LSTRING(freeCamDown),"Z"], [localize LSTRING(freeCamPan),"RMB (Hold)"], [localize LSTRING(freeCamDolly),"LMB (Hold)"], - [localize LSTRING(freeCamSpeed),"Scrollwheel"], - [localize LSTRING(freeCamZoom),"Ctrl + Scrollwheel"], + [localize LSTRING(freeCamZoom),"Scrollwheel"], + [localize LSTRING(freeCamSpeed),"Ctrl + Scrollwheel"], + [localize LSTRING(freeCamBoost),"Shift (Hold)"], [localize LSTRING(freeCamNextVis),"N"], [localize LSTRING(freeCamPrevVis),"Ctrl + N"], [localize LSTRING(otherControls),""], @@ -220,9 +221,9 @@ switch (toLower _mode) do { // Scroll to change speed, modifier for zoom if (GVAR(ctrlKey)) then { - [nil,nil,nil,nil,nil,nil, GVAR(camZoom) + _zChange * 0.1] call FUNC(setCameraAttributes); - } else { [nil,nil,nil,nil,nil,nil,nil, GVAR(camSpeed) + _zChange * 0.2] call FUNC(setCameraAttributes); + } else { + [nil,nil,nil,nil,nil,nil, GVAR(camZoom) + _zChange * 0.1] call FUNC(setCameraAttributes); }; }; case "onmousemoving": { @@ -268,31 +269,33 @@ switch (toLower _mode) do { [_display,nil,nil,true] call FUNC(toggleInterface); }; case 16: { // Q - GVAR(camBoom) = 0.5 * GVAR(camSpeed); + GVAR(camBoom) = 0.5 * GVAR(camSpeed) * ([1, 2] select _shift); }; case 17: { // W - GVAR(camDolly) set [1, GVAR(camSpeed)]; + GVAR(camDolly) set [1, GVAR(camSpeed) * ([1, 2] select _shift)]; }; case 29: { // Ctrl GVAR(ctrlKey) = true; }; case 30: { // A - GVAR(camDolly) set [0, -GVAR(camSpeed)]; + GVAR(camDolly) set [0, -GVAR(camSpeed) * ([1, 2] select _shift)]; }; case 31: { // S - GVAR(camDolly) set [1, -GVAR(camSpeed)]; + GVAR(camDolly) set [1, -GVAR(camSpeed) * ([1, 2] select _shift)]; }; case 32: { // D - GVAR(camDolly) set [0, GVAR(camSpeed)]; + GVAR(camDolly) set [0, GVAR(camSpeed) * ([1, 2] select _shift)]; }; case 44: { // Z - GVAR(camBoom) = -0.5 * GVAR(camSpeed); + GVAR(camBoom) = -0.5 * GVAR(camSpeed) * ([1, 2] select _shift); }; case 49: { // N - if (_ctrl) then { - [nil,nil,-1] call FUNC(cycleCamera); - } else { - [nil,nil,1] call FUNC(cycleCamera); + if (GVAR(camMode) == 0) then { + if (_ctrl) then { + [nil,nil,-1] call FUNC(cycleCamera); + } else { + [nil,nil,1] call FUNC(cycleCamera); + }; }; }; case 50: { // M diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 30af5d1aa6..b174608d03 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -181,6 +181,9 @@ Speed +/- Prędkość +/- + + Speed Boost + Next Vision Mode Następny tryb wizji From 57bda372f0f221f049ecbeebf9d9f0d2ff88ae15 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 7 Aug 2015 19:00:31 +0100 Subject: [PATCH 036/137] Adjust spectator free camera speed with zoom --- addons/spectator/functions/fnc_handleCamera.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/spectator/functions/fnc_handleCamera.sqf b/addons/spectator/functions/fnc_handleCamera.sqf index 7f53b59009..1d1d5bef9e 100644 --- a/addons/spectator/functions/fnc_handleCamera.sqf +++ b/addons/spectator/functions/fnc_handleCamera.sqf @@ -23,9 +23,9 @@ if (isNil QGVAR(camHandler)) exitWith { [_this select 1] call CBA_fnc_removePerF private ["_oldPos","_mX","_mY","_mZ","_pan","_x","_y","_z"]; _oldPos = getPosASL GVAR(camera); -_mX = GVAR(camDolly) select 0; -_mY = GVAR(camDolly) select 1; -_mZ = GVAR(camBoom); +_mX = (GVAR(camDolly) select 0) / ((GVAR(camZoom) * 0.8) max 1); +_mY = (GVAR(camDolly) select 1) / ((GVAR(camZoom) * 0.8) max 1); +_mZ = GVAR(camBoom) / ((GVAR(camZoom) * 0.8) max 1); _pan = (GVAR(camPan) + 360) % 360; _x = (_oldPos select 0) + (_mX * cos(_pan)) + (_mY * sin(_pan)); From e59f0ce822ab64c8a8fd6c330341e16113437282 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 8 Aug 2015 12:24:49 +0100 Subject: [PATCH 037/137] Fix spectator respawn template for types 0 and 1 Type 0 worked, but the mission didn't end when all players were killed. Type 1 didn't work because isPlayer isn't true for seagulls. So spectator virtual state is now entirely unassociated from objects in the game. --- .../functions/fnc_handleInterface.sqf | 2 +- .../functions/fnc_respawnTemplate.sqf | 11 +++++--- .../spectator/functions/fnc_setSpectator.sqf | 26 +++++++------------ .../functions/fnc_stageSpectator.sqf | 9 +++---- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 80d87cf40a..d06c19bd38 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -80,7 +80,7 @@ switch (toLower _mode) do { clearRadio; // Return to player view - _unit switchCamera "internal"; + player switchCamera "internal"; // Enable BI damage effects BIS_fnc_feedback_allowPP = true; diff --git a/addons/spectator/functions/fnc_respawnTemplate.sqf b/addons/spectator/functions/fnc_respawnTemplate.sqf index b03c6dfb06..b808c43eab 100644 --- a/addons/spectator/functions/fnc_respawnTemplate.sqf +++ b/addons/spectator/functions/fnc_respawnTemplate.sqf @@ -21,6 +21,11 @@ params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]], ["_respawn",0,[0]], ["_respawnDelay",0,[0]]]; private ["_vision","_pos"]; +// End mission when all are dead with respawn type "None" +if ((_respawn == 0) && {{alive _x} count allPlayers <= 0}) exitWith { + [["endDeath",false],"BIS_fnc_endMission"] call EFUNC(common,execRemoteFnc); +}; + if (isNull _killer) then {_killer = _unit}; _vision = [-2,-1] select (sunOrMoon < 1); _pos = (getPosATL _unit) vectorAdd [0,0,5]; @@ -29,11 +34,11 @@ if (alive _unit) then { if (_respawn == 1) then { [_unit,QGVAR(isSeagull)] call EFUNC(common,hideUnit); [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); + [true] call FUNC(setSpectator); } else { - [_unit,false] call FUNC(setSpectator); + [false] call FUNC(setSpectator); }; } else { [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); - [_unit] call FUNC(setSpectator); + [true] call FUNC(setSpectator); }; diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index 2d5ada415c..4f41e073d7 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -1,48 +1,42 @@ /* * Author: SilentSpike - * Sets target player to the given spectator state (virtually) + * Sets local client to the given spectator state (virtually) * To physically handle a spectator see ace_spectator_fnc_stageSpectator * - * Player will be able to communicate in ACRE/TFAR as appropriate + * Client will be able to communicate in ACRE/TFAR as appropriate * The spectator interface will be opened/closed * * Arguments: - * 0: Unit to put into spectator state - * 1: Spectator state + * 0: Spectator state of local client * * Return Value: * None * * Example: - * [player, true] call ace_spectator_fnc_setSpectator + * [true] call ace_spectator_fnc_setSpectator * * Public: Yes */ #include "script_component.hpp" -params ["_unit", ["_set",true,[true]]]; +params [["_set",true,[true]]]; -// Only run for player units -if !(isPlayer _unit) exitWith {}; - -if !(local _unit) exitwith { - [[_unit, _set], QFUNC(setSpectator), _unit] call EFUNC(common,execRemoteFnc); -}; +// Only clients can be spectators +if !(hasInterface) exitWith {}; // Handle common addon audio if (["ace_hearing"] call EFUNC(common,isModLoaded)) then {EGVAR(hearing,disableVolumeUpdate) = _set}; if (["acre_sys_radio"] call EFUNC(common,isModLoaded)) then {[_set] call acre_api_fnc_setSpectator}; -if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {[_unit, _set] call TFAR_fnc_forceSpectator}; +if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {[player, _set] call TFAR_fnc_forceSpectator}; if (_set) then { ["open"] call FUNC(handleInterface); } else { - ["close",_unit] call FUNC(handleInterface); + ["close"] call FUNC(handleInterface); }; // Mark spectator state for reference -_unit setVariable [QGVAR(isSet), _set, true]; GVAR(isSet) = _set; -["spectatorSet",[_set,_unit]] call EFUNC(common,localEvent); +["spectatorSet",[_set]] call EFUNC(common,localEvent); diff --git a/addons/spectator/functions/fnc_stageSpectator.sqf b/addons/spectator/functions/fnc_stageSpectator.sqf index 3e17235e3e..7f0d862719 100644 --- a/addons/spectator/functions/fnc_stageSpectator.sqf +++ b/addons/spectator/functions/fnc_stageSpectator.sqf @@ -7,7 +7,7 @@ * Upon unstage, units will be moved to the position they were in upon staging * * Arguments: - * 0: Unit to put into spectator stage + * 0: Unit to put into spectator stage * 1: Spectator stage * * Return Value: @@ -21,19 +21,16 @@ #include "script_component.hpp" -params ["_unit", ["_set",true,[true]]]; +params [["_unit",player,[objNull]], ["_set",true,[true]]]; // No change, no service (but allow spectators to be reset) if !(_set || (GETVAR(_unit,GVAR(isStaged),false))) exitWith {}; -// Only run for player units -if !(isPlayer _unit) exitWith {}; - if !(local _unit) exitwith { [[_unit, _set], QFUNC(stageSpectator), _unit] call EFUNC(common,execRemoteFnc); }; -// Prevent player falling into water +// Prevent unit falling into water _unit enableSimulation !_set; // Move to/from group as appropriate From 5b881224c5a231c35fb96d79183f240265915e89 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 8 Aug 2015 13:19:07 +0100 Subject: [PATCH 038/137] Allow admins to use chat in the spectator UI --- addons/spectator/functions/fnc_handleInterface.sqf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index d06c19bd38..21d6266fba 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -238,6 +238,9 @@ switch (toLower _mode) do { if ((alive player) && {_dik in (actionKeys "curatorInterface")} && {!isNull (getAssignedCuratorLogic player)}) exitWith { ["zeus", [_display]] call FUNC(handleInterface); }; + if ((isServer || {serverCommandAvailable "#kick"}) && {_dik in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) exitWith { + false + }; // Handle held keys (prevent repeat calling) if (_dik in GVAR(heldKeys)) exitwith {}; From be7b156c49170da938b120cd16d45ec7c6daa245 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 8 Aug 2015 15:49:07 +0100 Subject: [PATCH 039/137] Add "focus on unit" to spectator free camera Pressing F will move the free camera to a position viewing the unit currently selected in the list. Fixes map teleporting functionality also. --- addons/spectator/UI/interface.hpp | 23 ++++++++-------- .../functions/fnc_handleInterface.sqf | 26 +++++++++++++++++-- .../functions/fnc_setCameraAttributes.sqf | 9 ++++--- .../functions/fnc_transitionCamera.sqf | 3 +-- addons/spectator/stringtable.xml | 3 +++ 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp index a7790d6da0..e8bc6c210f 100644 --- a/addons/spectator/UI/interface.hpp +++ b/addons/spectator/UI/interface.hpp @@ -155,7 +155,7 @@ class GVAR(interface) { }; }; }; - class unitTree: RscControlsGroupNoScrollbars { + class unitWindow: RscControlsGroupNoScrollbars { idc = IDC_UNIT; x = safeZoneX; y = safeZoneY + TOOL_H * 6; @@ -191,6 +191,7 @@ class GVAR(interface) { }; multiselectEnabled = 0; onTreeDblClick = QUOTE([ARR_2('onTreeDblClick',_this)] call FUNC(handleInterface)); + onTreeSelChanged = QUOTE([ARR_2('onTreeSelChanged',_this)] call FUNC(handleInterface)); }; class unitFrame: RscFrame { x = 0; @@ -202,16 +203,6 @@ class GVAR(interface) { }; }; }; - class mapOverlay: RscMapControl { - idc = IDC_MAP; - type = 100; - x = safeZoneX; - y = safeZoneY; - w = safeZoneW; - h = safeZoneH; - onMouseButtonDown = QUOTE([ARR_2('onMapClick',_this)] call FUNC(handleInterface)); - onDraw = QUOTE(_this call FUNC(handleMap)); - }; class helpWindow: RscControlsGroupNoScrollbars { idc = IDC_HELP; x = safeZoneX + safeZoneW - TOOL_W * 2; @@ -250,5 +241,15 @@ class GVAR(interface) { }; }; }; + class mapOverlay: RscMapControl { + idc = IDC_MAP; + type = 100; + x = safeZoneX; + y = safeZoneY; + w = safeZoneW; + h = safeZoneH; + onMouseButtonDown = QUOTE([ARR_2('onMapClick',_this)] call FUNC(handleInterface)); + onDraw = QUOTE(_this call FUNC(handleMap)); + }; }; }; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 21d6266fba..eda24dccf6 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -35,6 +35,7 @@ switch (toLower _mode) do { GVAR(heldKeys) = []; GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; + GVAR(treeSel) = objNull; // Initalize the camera view GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); @@ -96,6 +97,7 @@ switch (toLower _mode) do { GVAR(heldKeys) = nil; GVAR(mouse) = nil; GVAR(mousePos) = nil; + GVAR(treeSel) = nil; // Reset nametag settings if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { @@ -146,11 +148,12 @@ switch (toLower _mode) do { [localize LSTRING(freeCamDown),"Z"], [localize LSTRING(freeCamPan),"RMB (Hold)"], [localize LSTRING(freeCamDolly),"LMB (Hold)"], + [localize LSTRING(freeCamFocus),"F"], + [localize LSTRING(freeCamNextVis),"N"], + [localize LSTRING(freeCamPrevVis),"Ctrl + N"], [localize LSTRING(freeCamZoom),"Scrollwheel"], [localize LSTRING(freeCamSpeed),"Ctrl + Scrollwheel"], [localize LSTRING(freeCamBoost),"Shift (Hold)"], - [localize LSTRING(freeCamNextVis),"N"], - [localize LSTRING(freeCamPrevVis),"Ctrl + N"], [localize LSTRING(otherControls),""], [localize LSTRING(nextCam),"Up Arrow"], [localize LSTRING(prevCam),"Down Arrow"], @@ -289,6 +292,14 @@ switch (toLower _mode) do { case 32: { // D GVAR(camDolly) set [0, GVAR(camSpeed) * ([1, 2] select _shift)]; }; + case 33: { // F + private ["_sel","_vector"]; + _sel = GVAR(treeSel); + if !((GVAR(camMode) == 0) && {isNull _sel} && {_sel in GVAR(unitList)}) then { + _vector = (positionCameraToWorld [0,0,0]) vectorDiff (positionCameraToWorld [0,0,25]); + [nil,nil,nil,(getPosATL _sel) vectorAdd _vector] call FUNC(setCameraAttributes); + }; + }; case 44: { // Z GVAR(camBoom) = -0.5 * GVAR(camSpeed) * ([1, 2] select _shift); }; @@ -374,6 +385,15 @@ switch (toLower _mode) do { [_newMode,_newUnit] call FUNC(transitionCamera); }; }; + case "ontreeselchanged": { + _args params ["_tree","_sel"]; + + if (count _sel == 3) then { + GVAR(treeSel) = objectFromNetId (_tree tvData _sel); + } else { + GVAR(treeSel) = objNull; + }; + }; case "onunitsupdate": { _args params ["_tree"]; private ["_cachedUnits","_cachedGrps","_cachedSides","_s","_g","_grp","_u","_unit","_side"]; @@ -485,6 +505,7 @@ switch (toLower _mode) do { GVAR(heldKeys) = []; GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; + GVAR(treeSel) = objNull; createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); @@ -538,6 +559,7 @@ switch (toLower _mode) do { GVAR(heldKeys) = []; GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; + GVAR(treeSel) = objNull; openCuratorInterface; diff --git a/addons/spectator/functions/fnc_setCameraAttributes.sqf b/addons/spectator/functions/fnc_setCameraAttributes.sqf index 278a8c4758..8eb6fe51ac 100644 --- a/addons/spectator/functions/fnc_setCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_setCameraAttributes.sqf @@ -51,7 +51,6 @@ if !(_vision in GVAR(availableVisions)) then { }; GVAR(camPan) = _heading % 360; -GVAR(camPos) = (ATLtoASL _position); GVAR(camSpeed) = (_speed max 0.05) min 10; GVAR(camTilt) = (_tilt max -89) min 89; GVAR(camUnit) = _unit; @@ -59,8 +58,10 @@ GVAR(camVision) = _vision; GVAR(camZoom) = (_zoom min 2) max 0.01; // Apply if camera exists -if !(isNil QGVAR(camera)) then { - [_mode,_unit,_vision] call FUNC(transitionCamera); -} else { +if (isNil QGVAR(camera)) then { GVAR(camMode) = _mode; + GVAR(camPos) = (ATLtoASL _position); +} else { + [_mode,_unit,_vision] call FUNC(transitionCamera); + GVAR(camera) setPosATL _position; }; diff --git a/addons/spectator/functions/fnc_transitionCamera.sqf b/addons/spectator/functions/fnc_transitionCamera.sqf index b35b61b311..72cb9f1a45 100644 --- a/addons/spectator/functions/fnc_transitionCamera.sqf +++ b/addons/spectator/functions/fnc_transitionCamera.sqf @@ -53,8 +53,7 @@ if (_newMode == 0) then { // Free GVAR(camera) camSetFov -(linearConversion [0.01,2,GVAR(camZoom),-2,-0.01,true]); GVAR(camera) camCommit 0; - // Agent is switched to in free cam to hide death table and prevent AI chat while allowing icons to draw - // However, map click events don't fire in free cam for some reason... + // Agent is switched to in free cam to hide death table and prevent AI chat while allowing icons to draw (also prevents systemChat and unit HUD) // (Why is so much stuff tied into the current camera unit BI?!) if (isNull GVAR(camAgent)) then { GVAR(camAgent) = createAgent ["VirtualMan_F",markerPos QGVAR(respawn),[],0,""]; diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index b174608d03..c4b9b6b631 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -184,6 +184,9 @@ Speed Boost + + Focus on Unit + Next Vision Mode Następny tryb wizji From d7730103c98c0cf5d677abeb42128de29e375aaf Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 8 Aug 2015 17:22:04 +0100 Subject: [PATCH 040/137] Update ace_spectator readme --- addons/spectator/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/spectator/README.md b/addons/spectator/README.md index b3e586149b..b827bdcc49 100644 --- a/addons/spectator/README.md +++ b/addons/spectator/README.md @@ -1,7 +1,11 @@ ace_spectator ======= -Spectator. Includes features from Splendid Cam, and much more. +A flexible spectator framework for mission makers to use. + +Includes a public API for integration into custom respawn frameworks and a template for use with the vanilla respawn framework. + +For more information, see: http://ace3mod.com/wiki/feature/spectator.html ## Maintainers From 213deeffb405ac85138bd8376b25274922b6af02 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 8 Aug 2015 18:31:37 +0100 Subject: [PATCH 041/137] Add keys to adjust spectator camera speed and zoom Allows for finer control of the speed and zoom, as well as a quick way to reset either. --- addons/spectator/XEH_preInit.sqf | 2 +- .../functions/fnc_handleInterface.sqf | 40 ++++++++++---- addons/spectator/stringtable.xml | 53 +++++++++++-------- 3 files changed, 61 insertions(+), 34 deletions(-) diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index 2c29598ebc..a40f4a0dcb 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -33,7 +33,7 @@ GVAR(camAgent) = objNull; GVAR(camMode) = 0; GVAR(camPan) = 0; GVAR(camPos) = ATLtoASL [worldSize * 0.5, worldSize * 0.5, 20]; -GVAR(camSpeed) = 1; +GVAR(camSpeed) = 2.5; GVAR(camTilt) = -10; GVAR(camUnit) = objNull; GVAR(camVision) = -2; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index eda24dccf6..80ee564ab5 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -148,17 +148,21 @@ switch (toLower _mode) do { [localize LSTRING(freeCamDown),"Z"], [localize LSTRING(freeCamPan),"RMB (Hold)"], [localize LSTRING(freeCamDolly),"LMB (Hold)"], - [localize LSTRING(freeCamFocus),"F"], - [localize LSTRING(freeCamNextVis),"N"], - [localize LSTRING(freeCamPrevVis),"Ctrl + N"], - [localize LSTRING(freeCamZoom),"Scrollwheel"], - [localize LSTRING(freeCamSpeed),"Ctrl + Scrollwheel"], [localize LSTRING(freeCamBoost),"Shift (Hold)"], - [localize LSTRING(otherControls),""], + [localize LSTRING(freeCamFocus),"F"], + [localize LSTRING(attributeControls),""], [localize LSTRING(nextCam),"Up Arrow"], [localize LSTRING(prevCam),"Down Arrow"], [localize LSTRING(nextUnit),"Right Arrow"], - [localize LSTRING(prevUnit),"Left Arrow"] + [localize LSTRING(prevUnit),"Left Arrow"], + [localize LSTRING(nextVis),"N"], + [localize LSTRING(prevVis),"Ctrl + N"], + [localize LSTRING(adjZoom),"Scrollwheel"], + [localize LSTRING(adjSpeed),"Ctrl + Scrollwheel"], + [localize LSTRING(incZoom),"Num-/Num+"], + [localize LSTRING(incSpeed),"Ctrl + Num-/Num+"], + [localize LSTRING(reZoom),"Alt + Num-"], + [localize LSTRING(reSpeed),"Alt + Num+"] ]; // Handle support for BI's respawn counter @@ -247,8 +251,8 @@ switch (toLower _mode) do { // Handle held keys (prevent repeat calling) if (_dik in GVAR(heldKeys)) exitwith {}; - // Exclude movement keys so that speed can be adjusted on fly - if !(_dik in [16,17,30,31,32,44]) then { + // Exclude movement/adjustment keys so that speed can be adjusted on fly + if !(_dik in [16,17,30,31,32,44,74,78]) then { GVAR(heldKeys) pushBack _dik; }; @@ -295,7 +299,7 @@ switch (toLower _mode) do { case 33: { // F private ["_sel","_vector"]; _sel = GVAR(treeSel); - if !((GVAR(camMode) == 0) && {isNull _sel} && {_sel in GVAR(unitList)}) then { + if ((GVAR(camMode) == 0) && {!isNull _sel} && {_sel in GVAR(unitList)}) then { _vector = (positionCameraToWorld [0,0,0]) vectorDiff (positionCameraToWorld [0,0,25]); [nil,nil,nil,(getPosATL _sel) vectorAdd _vector] call FUNC(setCameraAttributes); }; @@ -318,6 +322,22 @@ switch (toLower _mode) do { case 57: { // Spacebar // Freecam attachment here, if in external then set cam pos and attach }; + case 74: { // Num - + if (_alt) exitWith { [nil,nil,nil,nil,nil,nil, 1.25] call FUNC(setCameraAttributes); }; + if (_ctrl) then { + [nil,nil,nil,nil,nil,nil,nil, GVAR(camSpeed) - 0.05] call FUNC(setCameraAttributes); + } else { + [nil,nil,nil,nil,nil,nil, GVAR(camZoom) - 0.01] call FUNC(setCameraAttributes); + }; + }; + case 78: { // Num + + if (_alt) exitWith { [nil,nil,nil,nil,nil,nil,nil, 2.5] call FUNC(setCameraAttributes); }; + if (_ctrl) then { + [nil,nil,nil,nil,nil,nil,nil, GVAR(camSpeed) + 0.05] call FUNC(setCameraAttributes); + } else { + [nil,nil,nil,nil,nil,nil, GVAR(camZoom) + 0.01] call FUNC(setCameraAttributes); + }; + }; case 200: { // Up arrow [-1] call FUNC(cycleCamera); }; diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index c4b9b6b631..895a279844 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -134,8 +134,7 @@ - Free Camera Controls - Wolne sterowanie kamerą + Free Camera Camera Forward @@ -173,31 +172,14 @@ Lock Camera to Target Zablokuj kamerę na celu - - Zoom +/- - Zoom +/- - - - Speed +/- - Prędkość +/- - Speed Boost Focus on Unit - - Next Vision Mode - Następny tryb wizji - - - Previous Vision Mode - Poprzedni tryb wizji - - Interface Controls - Sterowanie interfejsem + Interface Toggle Interface @@ -227,9 +209,8 @@ Toggle Help Przełącz pomoc - - Other Controls - Pozostałe sterowanie + + Camera Attributes Next Camera @@ -247,5 +228,31 @@ Previous Unit Poprzednia jednostka + + Next Vision Mode + Następny tryb wizji + + + Previous Vision Mode + Poprzedni tryb wizji + + + Adjust Zoom + + + Adjust Speed + + + Increment Zoom + + + Increment Speed + + + Reset Zoom + + + Reset Speed + From 182eef39de65cc53d413df36db6b7286bca20c68 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 8 Aug 2015 18:41:38 +0100 Subject: [PATCH 042/137] Adjust spectator camera pan and tilt with zoom --- addons/spectator/functions/fnc_handleCamera.sqf | 11 +++++++---- addons/spectator/functions/fnc_handleMouse.sqf | 9 ++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/addons/spectator/functions/fnc_handleCamera.sqf b/addons/spectator/functions/fnc_handleCamera.sqf index 1d1d5bef9e..960a20df80 100644 --- a/addons/spectator/functions/fnc_handleCamera.sqf +++ b/addons/spectator/functions/fnc_handleCamera.sqf @@ -20,12 +20,15 @@ // Kill PFH when not in free cam (or display is closed) if (isNil QGVAR(camHandler)) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; -private ["_oldPos","_mX","_mY","_mZ","_pan","_x","_y","_z"]; +private ["_oldPos","_zoomMod","_mX","_mY","_mZ","_pan","_x","_y","_z"]; _oldPos = getPosASL GVAR(camera); -_mX = (GVAR(camDolly) select 0) / ((GVAR(camZoom) * 0.8) max 1); -_mY = (GVAR(camDolly) select 1) / ((GVAR(camZoom) * 0.8) max 1); -_mZ = GVAR(camBoom) / ((GVAR(camZoom) * 0.8) max 1); + +// Dolly/Boom amount should be influnced by zoom level (it should really be exponential) +_zoomMod = (GVAR(camZoom) * 0.8) max 1; +_mX = (GVAR(camDolly) select 0) / _zoomMod; +_mY = (GVAR(camDolly) select 1) / _zoomMod; +_mZ = GVAR(camBoom) / _zoomMod; _pan = (GVAR(camPan) + 360) % 360; _x = (_oldPos select 0) + (_mX * cos(_pan)) + (_mY * sin(_pan)); diff --git a/addons/spectator/functions/fnc_handleMouse.sqf b/addons/spectator/functions/fnc_handleMouse.sqf index 8158ba95b5..1c2b62798c 100644 --- a/addons/spectator/functions/fnc_handleMouse.sqf +++ b/addons/spectator/functions/fnc_handleMouse.sqf @@ -18,7 +18,7 @@ #include "script_component.hpp" params ["_x","_y"]; -private ["_leftButton","_rightButton","_oldX","_oldY","_deltaX","_deltaY"]; +private ["_leftButton","_rightButton","_oldX","_oldY","_deltaX","_deltaY","_zoomMod"]; _leftButton = GVAR(mouse) select 0; _rightButton = GVAR(mouse) select 1; @@ -35,8 +35,11 @@ if (_leftButton) then { GVAR(camDolly) set [1, _deltaY * 100 * GVAR(camSpeed)]; } else { if (_rightButton) then { - GVAR(camPan) = GVAR(camPan) - (_deltaX * 360); - GVAR(camTilt) = ((GVAR(camTilt) + (_deltaY * 180)) min 89) max -89; + // Pan/Tilt amount should be influnced by zoom level (it should really be exponential) + _zoomMod = (GVAR(camZoom) * 0.8) max 1; + + GVAR(camPan) = GVAR(camPan) - ((_deltaX * 360) / _zoomMod); + GVAR(camTilt) = ((GVAR(camTilt) + ((_deltaY * 180) / _zoomMod)) min 89) max -89; }; }; From a6acff9178bf2a6072d9a67673ca623ccdd2c092 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 8 Aug 2015 14:40:19 -0500 Subject: [PATCH 043/137] Setting to disable hearing for zeus RC --- addons/hearing/ACE_Settings.hpp | 6 ++++++ addons/hearing/CfgVehicles.hpp | 6 ++++++ addons/hearing/functions/fnc_earRinging.sqf | 1 + addons/hearing/functions/fnc_moduleHearing.sqf | 2 ++ addons/hearing/stringtable.xml | 8 +++++++- 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/addons/hearing/ACE_Settings.hpp b/addons/hearing/ACE_Settings.hpp index 867914b857..262c3edc34 100644 --- a/addons/hearing/ACE_Settings.hpp +++ b/addons/hearing/ACE_Settings.hpp @@ -19,4 +19,10 @@ class ACE_Settings { isClientSettable = 1; displayName = CSTRING(DisableEarRinging); }; + class GVAR(enabledForZeusUnits) { + value = 1; + typeName = "BOOL"; + displayName = CSTRING(enabledForZeusUnits_DisplayName); + description = CSTRING(enabledForZeusUnits_Description); + }; }; diff --git a/addons/hearing/CfgVehicles.hpp b/addons/hearing/CfgVehicles.hpp index 44ea8f734f..2273653c3a 100644 --- a/addons/hearing/CfgVehicles.hpp +++ b/addons/hearing/CfgVehicles.hpp @@ -130,6 +130,12 @@ class CfgVehicles { }; }; }; + class enabledForZeusUnits { + displayName = CSTRING(enabledForZeusUnits_DisplayName); + description = CSTRING(enabledForZeusUnits_Description); + typeName = "BOOL"; + defaultValue = 1; + }; }; class ModuleDescription { description = CSTRING(Module_Description); diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf index 6a896c1820..de70c4f860 100644 --- a/addons/hearing/functions/fnc_earRinging.sqf +++ b/addons/hearing/functions/fnc_earRinging.sqf @@ -21,6 +21,7 @@ PARAMS_2(_unit,_strength); if (_unit != ACE_player) exitWith {}; if (_strength < 0.05) exitWith {}; if (!isNull curatorCamera) exitWith {}; +if ((!GVAR(enabledForZeusUnits)) && {player != ACE_player}) exitWith {}; if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { _strength = _strength / 4; diff --git a/addons/hearing/functions/fnc_moduleHearing.sqf b/addons/hearing/functions/fnc_moduleHearing.sqf index 6ec0af0231..fed6335c07 100644 --- a/addons/hearing/functions/fnc_moduleHearing.sqf +++ b/addons/hearing/functions/fnc_moduleHearing.sqf @@ -21,4 +21,6 @@ if ((_logic getVariable "DisableEarRinging") != -1) then { [_logic, QGVAR(DisableEarRinging), "DisableEarRinging"] call EFUNC(common,readSettingFromModule); }; +[_logic, QGVAR(enabledForZeusUnits), "enabledForZeusUnits"] call EFUNC(common,readSettingFromModule); + diag_log text "[ACE]: Hearing Module Initialized."; diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index a3af102580..403434cf4f 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -118,7 +118,7 @@ Audição - Enable combat deafness? + Combat Deafness Wł. głuchotę bojową ¿Habilitar sordera de combate? Aktiviere Taubheit im Gefecht? @@ -140,5 +140,11 @@ Ztráta sluchu je možná ve chvíly, kdy se v bezprostřední blízkosti střílí z velkorážní zbraně nebo při bombardování a osoba je bez ochrany sluchu (např. špunty). Tento modul umožňuje tuto věc povolit nebo zakázat. Este módulo ativa / desativa surdez em combate. Quando ativado, os jogadores podem ficar surdos quando uma arma é disparada ao seu redor ou uma explosão ocorre sem proteção auditiva. + + Effect Zeus RC + + + Allow zeus remote controlled units to be able to take hearing damage. + \ No newline at end of file From c30cb45bd63fc40a0f6d8087f82655ac0363227d Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 9 Aug 2015 20:59:57 +0100 Subject: [PATCH 044/137] Optimize spectator UI held key prevention system --- addons/spectator/functions/fnc_handleInterface.sqf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 80ee564ab5..335b71bbe1 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -33,6 +33,7 @@ switch (toLower _mode) do { // Initalize display variables GVAR(ctrlKey) = false; GVAR(heldKeys) = []; + GVAR(heldKeys) resize 255; GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; GVAR(treeSel) = objNull; @@ -250,10 +251,10 @@ switch (toLower _mode) do { }; // Handle held keys (prevent repeat calling) - if (_dik in GVAR(heldKeys)) exitwith {}; + if (GVAR(heldKeys) param [_dik,false]) exitwith {}; // Exclude movement/adjustment keys so that speed can be adjusted on fly if !(_dik in [16,17,30,31,32,44,74,78]) then { - GVAR(heldKeys) pushBack _dik; + GVAR(heldKeys) set [_dik,true]; }; switch (_dik) do { @@ -358,7 +359,7 @@ switch (toLower _mode) do { _args params ["_display","_dik","_shift","_ctrl","_alt"]; // No longer being held - GVAR(heldKeys) = GVAR(heldKeys) - [_dik]; + GVAR(heldKeys) set [_dik,nil]; switch (_dik) do { case 16: { // Q @@ -523,6 +524,7 @@ switch (toLower _mode) do { GVAR(ctrlKey) = false; GVAR(heldKeys) = []; + GVAR(heldKeys) resize 255; GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; GVAR(treeSel) = objNull; @@ -577,6 +579,7 @@ switch (toLower _mode) do { GVAR(ctrlKey) = false; GVAR(heldKeys) = []; + GVAR(heldKeys) resize 255; GVAR(mouse) = [false,false]; GVAR(mousePos) = [0.5,0.5]; GVAR(treeSel) = objNull; From 95aa9f604bf83d29ad51267cc1d62ded6eaf2f18 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Tue, 11 Aug 2015 13:53:55 +0100 Subject: [PATCH 045/137] Fix manual pre-setting of spectator camera unit If the spectator camera unit was set before the camera had ever opened then the unit list wouldn't be populated and as such the camera would automatically abort to free mode since the unit wasn't available to spectate. So now I'm running the updateUnits function before opening the camera to pre-populate the list. --- addons/spectator/functions/fnc_handleInterface.sqf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 335b71bbe1..95f05d01ec 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -38,6 +38,9 @@ switch (toLower _mode) do { GVAR(mousePos) = [0.5,0.5]; GVAR(treeSel) = objNull; + // Update units before opening to support pre-set camera unit + [] call FUNC(updateUnits); + // Initalize the camera view GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); [] call FUNC(transitionCamera); From c6fbdb420c13f0c3d0224079cd84fe8ec7d25c83 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Thu, 13 Aug 2015 23:42:20 +0200 Subject: [PATCH 046/137] Code cleanup of Hearing module --- addons/hearing/XEH_postInit.sqf | 2 +- addons/hearing/functions/fnc_addEarPlugs.sqf | 3 +- addons/hearing/functions/fnc_earRinging.sqf | 3 +- .../hearing/functions/fnc_explosionNear.sqf | 2 +- addons/hearing/functions/fnc_firedNear.sqf | 32 +++++++++---------- .../hearing/functions/fnc_hasEarPlugsIn.sqf | 3 +- .../hearing/functions/fnc_moduleHearing.sqf | 3 +- .../hearing/functions/fnc_putInEarplugs.sqf | 2 +- .../hearing/functions/fnc_removeEarplugs.sqf | 2 +- addons/hearing/functions/fnc_updateVolume.sqf | 4 +-- 10 files changed, 25 insertions(+), 31 deletions(-) diff --git a/addons/hearing/XEH_postInit.sqf b/addons/hearing/XEH_postInit.sqf index ad73ed55d5..66406ad917 100644 --- a/addons/hearing/XEH_postInit.sqf +++ b/addons/hearing/XEH_postInit.sqf @@ -15,7 +15,7 @@ GVAR(time4) = 0; ["SettingsInitialized", { // Spawn volume updating process - [FUNC(updateVolume), 1, [false] ] call CBA_fnc_addPerFrameHandler; + [FUNC(updateVolume), 1, [false]] call CBA_fnc_addPerFrameHandler; }] call EFUNC(common,addEventHandler); //Update veh attunation when player veh changes diff --git a/addons/hearing/functions/fnc_addEarPlugs.sqf b/addons/hearing/functions/fnc_addEarPlugs.sqf index 62ed4518e2..b2e43bc718 100644 --- a/addons/hearing/functions/fnc_addEarPlugs.sqf +++ b/addons/hearing/functions/fnc_addEarPlugs.sqf @@ -14,8 +14,7 @@ * Public: No */ #include "script_component.hpp" - -PARAMS_1(_unit); +params ["_unit"]; // Exit if hearing is disabled or soldier has earplugs already in (persistence scenarios) if (!GVAR(enableCombatDeafness) || {[_unit] call FUNC(hasEarPlugsIn)}) exitWith {}; diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf index 6a896c1820..63ca3e5f1c 100644 --- a/addons/hearing/functions/fnc_earRinging.sqf +++ b/addons/hearing/functions/fnc_earRinging.sqf @@ -15,8 +15,7 @@ * Public: No */ #include "script_component.hpp" - -PARAMS_2(_unit,_strength); +params ["_unit", "_strength"]; if (_unit != ACE_player) exitWith {}; if (_strength < 0.05) exitWith {}; diff --git a/addons/hearing/functions/fnc_explosionNear.sqf b/addons/hearing/functions/fnc_explosionNear.sqf index dde9bc50cc..8cea263fec 100644 --- a/addons/hearing/functions/fnc_explosionNear.sqf +++ b/addons/hearing/functions/fnc_explosionNear.sqf @@ -19,7 +19,7 @@ //Only run if deafness or ear ringing is enabled: if ((!GVAR(enableCombatDeafness)) && GVAR(DisableEarRinging)) exitWith {}; -PARAMS_2(_unit,_damage); +params ["_unit", "_damage"]; private ["_strength"]; _strength = 0 max _damage; diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index 6fc48b27fa..5adf66fb25 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -24,7 +24,7 @@ //Only run if deafness or ear ringing is enabled: if ((!GVAR(enableCombatDeafness)) && GVAR(DisableEarRinging)) exitWith {}; -PARAMS_7(_object,_firer,_distance,_weapon,_muzzle,_mode,_ammo); +params ["_object", "_firer", "_distance", "_weapon", "_muzzle", "_mode", "_ammo"]; //Only run if firedNear object is player or player's vehicle: if ((ACE_player != _object) && {(vehicle ACE_player) != _object}) exitWith {}; @@ -37,11 +37,11 @@ _vehAttenuation = if ((ACE_player == (vehicle ACE_player)) || {isTurnedOut ACE_p _distance = 1 max _distance; -_silencer = switch (_weapon) do { - case (primaryWeapon _firer) : {(primaryWeaponItems _firer) select 0}; - case (secondaryWeapon _firer) : {(secondaryWeaponItems _firer) select 0}; - case (handgunWeapon _firer) : {(handgunItems _firer) select 0}; - default {""}; +_silencer = call { + if (primaryWeapon _firer) exitWith {(primaryWeaponItems _firer) select 0}; + if (secondaryWeapon _firer) exitWith {(secondaryWeaponItems _firer) select 0}; + if (handgunWeapon _firer) exitWith {(handgunItems _firer) select 0}; + "" }; _audibleFireCoef = 1; @@ -58,7 +58,7 @@ if (count _weaponMagazines == 0) then { _muzzleMagazines = getArray (configFile >> "CfgWeapons" >> _weapon >> _x >> "magazines"); _weaponMagazines append _muzzleMagazines; }; - } forEach _muzzles; + } count _muzzles; { _ammoType = getText(configFile >> "CfgMagazines" >> _x >> "ammo"); _weaponMagazines set [_forEachIndex, [_x, _ammoType]]; @@ -68,11 +68,11 @@ if (count _weaponMagazines == 0) then { _magazine = ""; { - EXPLODE_2_PVT(_x,_magazineType,_ammoType); + params ["_magazineType", "_ammoType"]; if (_ammoType == _ammo) exitWith { _magazine = _magazineType; }; -} forEach _weaponMagazines; +} count _weaponMagazines; if (_magazine == "") exitWith {}; @@ -80,14 +80,12 @@ _initSpeed = getNumber(configFile >> "CfgMagazines" >> _magazine >> "initSpeed") _ammoConfig = (configFile >> "CfgAmmo" >> _ammo); _parentClasses = [_ammoConfig, true] call BIS_fnc_returnParents; _caliber = getNumber(_ammoConfig >> "ACE_caliber"); -_caliber = switch (true) do { - case ("ShellBase" in _parentClasses): { 80 }; - case ("RocketBase" in _parentClasses): { 200 }; - case ("MissileBase" in _parentClasses): { 600 }; - case ("SubmunitionBase" in _parentClasses): { 80 }; - default { - if (_caliber <= 0) then { 6.5 } else { _caliber }; - }; +_caliber = call { + if ("ShellBase" in _parentClasses) exitWith { 80 }; + if ("RocketBase" in _parentClasses) exitWith { 200 }; + if ("MissileBase" in _parentClasses) exitWith { 600 }; + if ("SubmunitionBase" in _parentClasses) exitWith { 80 }; + if (_caliber <= 0) then { 6.5 } else { _caliber }; }; _loudness = (_caliber ^ 1.25 / 10) * (_initspeed / 1000) * _audibleFireCoef / 5; _strength = _vehAttenuation * (_loudness - (_loudness / 50 * _distance)); // linear drop off diff --git a/addons/hearing/functions/fnc_hasEarPlugsIn.sqf b/addons/hearing/functions/fnc_hasEarPlugsIn.sqf index 58dc302888..67a76685f4 100644 --- a/addons/hearing/functions/fnc_hasEarPlugsIn.sqf +++ b/addons/hearing/functions/fnc_hasEarPlugsIn.sqf @@ -14,7 +14,6 @@ * Public: No */ #include "script_component.hpp" - -PARAMS_1(_unit); +params ["_unit"]; _unit getVariable ["ACE_hasEarPlugsin", false] diff --git a/addons/hearing/functions/fnc_moduleHearing.sqf b/addons/hearing/functions/fnc_moduleHearing.sqf index 6ec0af0231..50675022a0 100644 --- a/addons/hearing/functions/fnc_moduleHearing.sqf +++ b/addons/hearing/functions/fnc_moduleHearing.sqf @@ -9,8 +9,7 @@ * None */ #include "script_component.hpp" - -PARAMS_3(_logic,_units,_activated); +params ["_logic", "_units", "_activated"]; if !(_activated) exitWith {}; diff --git a/addons/hearing/functions/fnc_putInEarplugs.sqf b/addons/hearing/functions/fnc_putInEarplugs.sqf index 8b11e6ba25..8d5479c17b 100644 --- a/addons/hearing/functions/fnc_putInEarplugs.sqf +++ b/addons/hearing/functions/fnc_putInEarplugs.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -PARAMS_1(_player); +params ["_player"]; // Plugs in inventory, putting them in _player removeItem "ACE_EarPlugs"; diff --git a/addons/hearing/functions/fnc_removeEarplugs.sqf b/addons/hearing/functions/fnc_removeEarplugs.sqf index 19a34831cd..f5b5ca2442 100644 --- a/addons/hearing/functions/fnc_removeEarplugs.sqf +++ b/addons/hearing/functions/fnc_removeEarplugs.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -PARAMS_1(_player); +params ["_player"]; if !(_player canAdd "ACE_EarPlugs") exitWith { // inventory full [localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured); diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index 3a72e8eb3b..f1cb063971 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -19,9 +19,9 @@ //Only run if deafness or ear ringing is enabled: if ((!GVAR(enableCombatDeafness)) && GVAR(DisableEarRinging)) exitWith {}; -EXPLODE_1_PVT((_this select 0),_justUpdateVolume); - private["_volume", "_soundTransitionTime"]; +(_this select 0) params ["_justUpdateVolume"]; + GVAR(deafnessDV) = (GVAR(deafnessDV) min 20) max 0; GVAR(volume) = (1 - (GVAR(deafnessDV) / 20)) max 0; From cb8d009ef033a629fbb41328007ba8cebdf8d816 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Fri, 14 Aug 2015 00:31:42 +0200 Subject: [PATCH 047/137] Woops --- addons/hearing/functions/fnc_firedNear.sqf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index 5adf66fb25..02de8db928 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -38,9 +38,9 @@ _vehAttenuation = if ((ACE_player == (vehicle ACE_player)) || {isTurnedOut ACE_p _distance = 1 max _distance; _silencer = call { - if (primaryWeapon _firer) exitWith {(primaryWeaponItems _firer) select 0}; - if (secondaryWeapon _firer) exitWith {(secondaryWeaponItems _firer) select 0}; - if (handgunWeapon _firer) exitWith {(handgunItems _firer) select 0}; + if (_weapon == primaryWeapon _firer) exitWith {(primaryWeaponItems _firer) select 0}; + if (_weapon == secondaryWeapon _firer) exitWith {(secondaryWeaponItems _firer) select 0}; + if (_weapon == handgunWeapon _firer) exitWith {(handgunItems _firer) select 0}; "" }; @@ -68,7 +68,7 @@ if (count _weaponMagazines == 0) then { _magazine = ""; { - params ["_magazineType", "_ammoType"]; + _x params ["_magazineType", "_ammoType"]; if (_ammoType == _ammo) exitWith { _magazine = _magazineType; }; From bd56d1bb83855cd055f21b2e779337e19fab87f1 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Fri, 14 Aug 2015 00:36:36 +0200 Subject: [PATCH 048/137] ok that is my fault --- addons/hearing/functions/fnc_firedNear.sqf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index 02de8db928..1ede8db3ea 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -37,11 +37,11 @@ _vehAttenuation = if ((ACE_player == (vehicle ACE_player)) || {isTurnedOut ACE_p _distance = 1 max _distance; -_silencer = call { - if (_weapon == primaryWeapon _firer) exitWith {(primaryWeaponItems _firer) select 0}; - if (_weapon == secondaryWeapon _firer) exitWith {(secondaryWeaponItems _firer) select 0}; - if (_weapon == handgunWeapon _firer) exitWith {(handgunItems _firer) select 0}; - "" +_silencer = switch (_weapon) do { + case (primaryWeapon _firer) : {(primaryWeaponItems _firer) select 0}; + case (secondaryWeapon _firer) : {(secondaryWeaponItems _firer) select 0}; + case (handgunWeapon _firer) : {(handgunItems _firer) select 0}; + default {""}; }; _audibleFireCoef = 1; From c35fc35eb34b80ae21a7df1dccc625f95948c183 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 14 Aug 2015 21:29:01 -0500 Subject: [PATCH 049/137] Captive FFV stuff --- addons/captives/XEH_postInit.sqf | 3 +- addons/captives/XEH_preInit.sqf | 1 + .../captives/functions/fnc_canLoadCaptive.sqf | 2 +- .../captives/functions/fnc_doFriskPerson.sqf | 1 - .../fnc_findEmptyNonFFVCargoSeat.sqf | 40 +++++++++++++++++++ .../captives/functions/fnc_handleGetOut.sqf | 1 + .../functions/fnc_handleUnitInitPost.sqf | 2 +- .../functions/fnc_moduleSurrender.sqf | 4 +- .../captives/functions/fnc_setHandcuffed.sqf | 39 +++++++++++++----- .../captives/functions/fnc_setSurrendered.sqf | 10 ++--- .../functions/fnc_vehicleCaptiveMoveIn.sqf | 6 ++- .../functions/fnc_vehicleCaptiveMoveOut.sqf | 1 + 12 files changed, 86 insertions(+), 24 deletions(-) create mode 100644 addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index da2192d3d6..1372b4e10a 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -6,12 +6,11 @@ if (isServer) then { addMissionEventHandler ["HandleDisconnect", { - PARAMS_1(_disconnectedPlayer); + params ["_disconnectedPlayer"]; private "_escortedUnit"; _escortedUnit = _disconnectedPlayer getVariable [QGVAR(escortedUnit), objNull]; if ((!isNull _escortedUnit) && {(attachedTo _escortedUnit) == _disconnectedPlayer}) then { detach _escortedUnit; - //systemChat "debug: DC detach"; }; if (_disconnectedPlayer getVariable [QGVAR(isEscorting), false]) then { _disconnectedPlayer setVariable [QGVAR(isEscorting), false, true]; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 31bcbe8e02..d2b5b615bb 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -16,6 +16,7 @@ PREP(doFriskPerson); PREP(doLoadCaptive); PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); +PREP(findEmptyNonFFVCargoSeat); PREP(handleGetIn); PREP(handleGetOut); PREP(handleKilled); diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index 0e028ac1ec..1cdc4d86a1 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -35,4 +35,4 @@ if (isNull _vehicle) then { && {!isNull _vehicle} && {_unit getVariable [QGVAR(isEscorting), false]} && {_target getVariable [QGVAR(isHandcuffed), false]} -&& {_vehicle emptyPositions "cargo" > 0} +&& {([_vehicle] call FUNC(findEmptyNonFFVCargoSeat)) != -1} diff --git a/addons/captives/functions/fnc_doFriskPerson.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf index e14025b88f..9a8a423dc3 100644 --- a/addons/captives/functions/fnc_doFriskPerson.sqf +++ b/addons/captives/functions/fnc_doFriskPerson.sqf @@ -18,7 +18,6 @@ private ["_weapon", "_listedItemClasses", "_actions", "_allGear"]; -PARAMS_2(_player,_unit); params ["_player", "_unit"]; _weapon = currentWeapon _player; diff --git a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf new file mode 100644 index 0000000000..a6bd625870 --- /dev/null +++ b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" + +params ["_vehicle"]; + +_vehicleConfig = configFile >> "CfgVehicles" >> (typeOf _vehicle); + +_proxyOrder = getArray (_vehicleConfig >> "getInProxyOrder"); +_transportSoldier = getNumber (_vehicleConfig >> "transportSoldier"); +_realCargoCount = if (isArray (_vehicleConfig >> "getInProxyOrder")) then {count _proxyOrder} else {_transportSoldier}; + +//Find FFV turrets: +_ffvCargoIndexes = []; +{ + _turretConfig = [_vehicleConfig, _x] call EFUNC(common,getTurretConfigPath); + _isCargoProxy = ((getText (_turretConfig >> "proxyType")) == "CPCargo") && {isNumber (_turretConfig >> "proxyIndex")}; + + if (_isCargoProxy) then { + _proxyCargoIndex = getNumber (_turretConfig >> "proxyIndex"); + _cargoIndex = _proxyOrder find _proxyCargoIndex; + _ffvCargoIndexes pushBack _cargoIndex; + }; +} forEach (allTurrets [_vehicle, true]); + +//Find Empty Seats: +_occupiedSeats = []; +{ + _x params ["", "", "_xIndex"]; + if (_xIndex > -1) then {_occupiedSeats pushBack _xIndex;}; +} forEach (fullCrew _vehicle); + +TRACE_3("Searching for empty seat",_realCargoCount,_ffvCargoIndexes,_occupiedSeats); + +_emptyCargoSeatReturn = -1; +for "_index" from 0 to (_realCargoCount - 1) do { + if ((!(_index in _ffvCargoIndexes)) && {!(_index in _occupiedSeats)}) exitWith { + _emptyCargoSeatReturn = _index; + }; +}; + +_emptyCargoSeatReturn diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index daf88b7e34..756c14ec10 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -30,4 +30,5 @@ if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then { }; [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 66cbcff794..52957acd68 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -18,7 +18,7 @@ params ["_unit"]; // prevent players from throwing grenades (added to all units) -[_unit, "Throw", {((_this select 1) getVariable [QGVAR(isHandcuffed), false]) || {(_this select 1) getVariable [QGVAR(isSurrendering), false]}}, {}] call EFUNC(common,addActionEventhandler); +// [_unit, "Throw", {systemChat "a"; ((_this select 1) getVariable [QGVAR(isHandcuffed), false]) || {(_this select 1) getVariable [QGVAR(isSurrendering), false]}; true}, {systemChat "b";}] call EFUNC(common,addActionEventhandler); if (local _unit) then { // reset status on mission start diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 64c80af35c..bdb0f7c1b5 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -26,11 +26,11 @@ if (!_activated) exitWith {}; if (local _logic) then { //Modules run before postInit can instal the event handler, so we need to wait a little bit [{ - PARAMS_1(_units); + params ["_units"]; { ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); } forEach _units; - }, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute); + }, [_units], 0.05]call EFUNC(common,waitAndExecute); deleteVehicle _logic; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 9bde3b399d..413e3d59b5 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -43,24 +43,43 @@ if (_state) then { // fix anim on mission start (should work on dedicated servers) [{ params ["_unit"]; - if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { + if (!(_unit getVariable [QGVAR(isHandcuffed), false])) exitWith {}; + + if ((vehicle _unit) == _unit) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + }; - //Adds an animation changed eh - //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) - private "_animChangedEHID"; - _animChangedEHID = _unit addEventHandler ["AnimChanged", { - PARAMS_2(_unit,_newAnimation); + //Adds an animation changed eh + //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + private "_animChangedEHID"; + TRACE_1("Adding animChangedEH",_unit); + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + params ["_unit", "_newAnimation"]; + TRACE_2("AnimChanged",_unit,_newAnimation); + if (_unit == (vehicle _unit)) then { if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { TRACE_1("Handcuff animation interrupted",_newAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; - }]; - _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; + } else { + // _turretPath = []; + // { + // _x params ["_xUnit", "", "", "_xTurretPath"]; + // if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; + // } forEach (fullCrew (vehicle _unit)); + // TRACE_1("turret Path",_turretPath); + // if (_turretPath isEqualTo []) exitWith {}; + // _turretConfig = [(configFile >> "CfgVehicles" >> (typeOf (vehicle _unit))), _turretPath] call EFUNC(common,getTurretConfigPath); + // _gunnerAction = getText (_turretConfig >> "gunnerAction"); + // TRACE_1("reseting to",_gunnerAction); + // [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + // [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + }; + }]; + _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; - }; - }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); + }, [_unit], 0.01] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index 4fad2d3853..22736c8e59 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -43,13 +43,13 @@ if (_state) then { // fix anim on mission start (should work on dedicated servers) [{ - PARAMS_1(_unit); + params ["_unit"]; if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then { //Adds an animation changed eh //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) private "_animChangedEHID"; _animChangedEHID = _unit addEventHandler ["AnimChanged", { - PARAMS_2(_unit,_newAnimation); + params ["_unit", "_newAnimation"]; if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { TRACE_1("Surrender animation interrupted",_newAnimation); [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); @@ -57,7 +57,7 @@ if (_state) then { }]; _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; }; - }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); + }, [_unit], 0.01] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); @@ -85,8 +85,8 @@ if (_state) then { //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter "hands up" //Handles long animation chains [{ - PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_unit,_maxTime); + params ["_args", "_pfID"]; + _args params ["_unit", "_maxTime"]; //If waited long enough or they re-surrendered or they are unconscious, exit loop if ((ACE_time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index 7e30fe4af4..6e79725242 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -20,7 +20,9 @@ private ["_cargoIndex"]; params ["_target","_vehicle"]; -_target moveInCargo _vehicle; +_cargoIndex = [_vehicle] call FUNC(findEmptyNonFFVCargoSeat); +if (_cargoIndex < 0) exitWith {ERROR("No Seat Avail");}; + +_target moveInCargo [_vehicle, _cargoIndex]; _target assignAsCargo _vehicle; -_cargoIndex = _vehicle getCargoIndex _target; _target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf index 000d5ef568..db8a7bd12e 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf @@ -20,4 +20,5 @@ _unit setVariable [QGVAR(CargoIndex), -1, true]; moveOut _unit; [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); +[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); unassignVehicle _unit; From ea2dc46d59f57ec0bbe8a824b3b937e12e3fd9c5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 15 Aug 2015 02:56:34 -0500 Subject: [PATCH 050/137] 1.50 realisticnames - ubc --- addons/realisticnames/CfgWeapons.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 0a83239047..cd7624e581 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -1,4 +1,4 @@ - +class Mode_SemiAuto; class Mode_FullAuto; class CfgWeapons { @@ -510,14 +510,14 @@ class CfgWeapons { class player: player {}; }; - class cannon_105mm: cannon_120mm { + class cannon_105mm: CannonCore { displayName = "M68"; - class player: player { + class player: Mode_SemiAuto { displayName = "M68"; }; }; - class cannon_125mm: cannon_120mm { + class cannon_125mm: CannonCore { displayName = "2A46"; }; From 1f9a98f77d7caf1242cfcb6391cb099756301464 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 17 Aug 2015 21:51:40 -0500 Subject: [PATCH 051/137] Cleanup / Params --- addons/maptools/XEH_postInitClient.sqf | 12 ++++------ .../maptools/functions/fnc_addLineMarker.sqf | 2 +- .../functions/fnc_calculateMapScale.sqf | 4 ++-- .../functions/fnc_copyMapReceiveMarkers.sqf | 2 +- .../functions/fnc_copyMapRemoteSend.sqf | 2 +- .../maptools/functions/fnc_copyMapStart.sqf | 2 +- .../maptools/functions/fnc_handleKeyDown.sqf | 4 +++- .../functions/fnc_handleMouseButton.sqf | 24 ++++++++----------- .../functions/fnc_handleMouseMove.sqf | 7 +++--- addons/maptools/functions/fnc_openMapGps.sqf | 2 +- .../functions/fnc_removeLineMarker.sqf | 2 +- .../functions/fnc_updateLineMarker.sqf | 2 +- .../functions/fnc_updateMapToolMarkers.sqf | 6 ++--- 13 files changed, 33 insertions(+), 38 deletions(-) diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index e227463711..34c0a9e750 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -26,11 +26,11 @@ GVAR(drawing_controls) = [36732, 36733, 36734, 36735, 36736, 36737]; _fnc_installMapEvents = { private "_d"; _d = _this; - ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseMoving", {_this call FUNC(handleMouseMove);}]; - ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseButtonDown", {[1, _this] call FUNC(handleMouseButton);}]; - ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseButtonUp", {[0, _this] call FUNC(handleMouseButton)}]; - ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["Draw", {_this call FUNC(updateMapToolMarkers);}]; - (finddisplay _d) displayAddEventHandler ["KeyDown", {_this call FUNC(handleKeyDown);}]; + ((findDisplay _d) displayCtrl 51) ctrlAddEventHandler ["MouseMoving", {_this call FUNC(handleMouseMove);}]; + ((findDisplay _d) displayCtrl 51) ctrlAddEventHandler ["MouseButtonDown", {[1, _this] call FUNC(handleMouseButton);}]; + ((findDisplay _d) displayCtrl 51) ctrlAddEventHandler ["MouseButtonUp", {[0, _this] call FUNC(handleMouseButton)}]; + ((findDisplay _d) displayCtrl 51) ctrlAddEventHandler ["Draw", {_this call FUNC(updateMapToolMarkers);}]; + (findDisplay _d) displayAddEventHandler ["KeyDown", {_this call FUNC(handleKeyDown);}]; }; // Wait until the briefing map is detected @@ -70,8 +70,6 @@ GVAR(drawing_controls) = [36732, 36733, 36734, 36735, 36736, 36737]; }; ["mapOpened", { - // Show and update map tools if required - [] call FUNC(updateMapToolMarkers); // Show GPS if required [GVAR(mapGpsShow)] call FUNC(openMapGps); }] call EFUNC(common,addEventHandler); diff --git a/addons/maptools/functions/fnc_addLineMarker.sqf b/addons/maptools/functions/fnc_addLineMarker.sqf index 157891a262..017dc5b494 100644 --- a/addons/maptools/functions/fnc_addLineMarker.sqf +++ b/addons/maptools/functions/fnc_addLineMarker.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -PARAMS_4(_name,_startPos,_endPos,_color); +params ["_name", "_startPos", "_endPos", "_color"]; private ["_marker", "_difPos", "_mag"]; diff --git a/addons/maptools/functions/fnc_calculateMapScale.sqf b/addons/maptools/functions/fnc_calculateMapScale.sqf index 4723a4f5e1..78bfae43af 100644 --- a/addons/maptools/functions/fnc_calculateMapScale.sqf +++ b/addons/maptools/functions/fnc_calculateMapScale.sqf @@ -14,7 +14,7 @@ private ["_screenOffset", "_pos"]; -_pos = ((finddisplay 12) displayctrl 51) ctrlMapScreenToWorld [0.5, 0.5]; -_screenOffset = ((finddisplay 12) displayctrl 51) posWorldToScreen [(_pos select 0) + 100, (_pos select 1)]; +_pos = ((findDisplay 12) displayCtrl 51) ctrlMapScreenToWorld [0.5, 0.5]; +_screenOffset = ((findDisplay 12) displayCtrl 51) posWorldToScreen [(_pos select 0) + 100, (_pos select 1)]; (_screenOffset select 0) - 0.5 diff --git a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf index 44f6ed6203..6c3c706208 100644 --- a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf +++ b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" -PARAMS_1(_lineMarkers); +params ["_lineMarkers"]; { private "_marker"; diff --git a/addons/maptools/functions/fnc_copyMapRemoteSend.sqf b/addons/maptools/functions/fnc_copyMapRemoteSend.sqf index f4aebf6093..551019f900 100644 --- a/addons/maptools/functions/fnc_copyMapRemoteSend.sqf +++ b/addons/maptools/functions/fnc_copyMapRemoteSend.sqf @@ -12,6 +12,6 @@ #include "script_component.hpp" -PARAMS_1(_requester); +params ["_requester"]; ["drawing_sendbackMarkers", _requester, [GVAR(drawing_lineMarkers)]] call EFUNC(common,targetEvent); diff --git a/addons/maptools/functions/fnc_copyMapStart.sqf b/addons/maptools/functions/fnc_copyMapStart.sqf index a39c74d225..7295f6f499 100644 --- a/addons/maptools/functions/fnc_copyMapStart.sqf +++ b/addons/maptools/functions/fnc_copyMapStart.sqf @@ -17,6 +17,6 @@ #include "script_component.hpp" -PARAMS_1(_player,_target); +params ["_player", "_target"]; ["drawing_requestMarkers", _target, [_player]] call EFUNC(common,targetEvent); diff --git a/addons/maptools/functions/fnc_handleKeyDown.sqf b/addons/maptools/functions/fnc_handleKeyDown.sqf index d1f9e199c9..297c87e789 100644 --- a/addons/maptools/functions/fnc_handleKeyDown.sqf +++ b/addons/maptools/functions/fnc_handleKeyDown.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -PARAMS_5(_display,_code,_shiftKey,_ctrlKey,_altKey); +params ["", "_code"]; private ["_handled", "_relPos", "_diffVector", "_magDiffVector", "_lambdaLong", "_lambdaTrasAbs"]; @@ -30,6 +30,7 @@ if (_code == DIK_ESCAPE) exitWith { call FUNC(cancelDrawing); _handled = true; }; + _handled }; if (_code == DIK_DELETE) exitWith { @@ -65,6 +66,7 @@ if (_code == DIK_DELETE) exitWith { }; } forEach GVAR(drawing_lineMarkers); }; + _handled }; _handled diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index 16cabe9719..ec0d1264fc 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -1,6 +1,5 @@ /* * Author: esteldunedain - * * Handle mouse buttons. * * Argument: @@ -13,23 +12,18 @@ #include "script_component.hpp" -private ["_control", "_button", "_screenPos", "_shiftKey", "_ctrlKey", "_handled", "_pos", "_altKey", "_gui", "_marker"]; +params ["_dir", "_params"]; +_params params ["_control", "_button", "_screenPosX", "_screenPosY", "_shiftKey", "_ctrlKey", "_altKey"]; -PARAMS_2(_dir,_params); -_control = _params select 0; -_button = _params select 1; -_screenPos = [_params select 2, _params select 3]; -_shiftKey = _params select 4; -_ctrlKey = _params select 5; -_altKey = _params select 6; -_handled = false; +private["_gui", "_handled", "_marker", "_pos"]; +_handled = false; // If it's not a left button event, exit -if (_button != 0) exitWith {}; +if (_button != 0) exitWith {_handled}; // If releasing -if (_dir != 1 && (GVAR(mapTool_isDragging) or GVAR(mapTool_isRotating))) exitWith { +if ((_dir != 1) && {(GVAR(mapTool_isDragging) || GVAR(mapTool_isRotating))}) exitWith { GVAR(mapTool_isDragging) = false; GVAR(mapTool_isRotating) = false; _handled = true; @@ -42,7 +36,7 @@ if (_dir == 1) exitWith { if !(call FUNC(canDraw)) exitWith {_handled = false;}; // Transform mouse screen position to coordinates - _pos = _control ctrlMapScreenToWorld _screenPos; + _pos = _control ctrlMapScreenToWorld [_screenPosX, _screenPosY]; _pos set [count _pos, 0]; if (GVAR(drawing_isDrawing)) exitWith { @@ -52,7 +46,7 @@ if (_dir == 1) exitWith { // [GVAR(drawing_tempLineMarker), "FUNC(addLineMarker)", 2] call EFUNC(common,execRemoteFnc); ["drawing_addLineMarker", GVAR(drawing_tempLineMarker)] call EFUNC(common,globalEvent); // Log who drew on the briefing screen - (text format ["[ACE] Server: Player %1 drew on the briefing screen", name player]) call EFUNC(common,serverLog); + (text format ["[ACE] Server: Player %1 drew on the briefing screen", profileName]) call EFUNC(common,serverLog); } else { GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); GVAR(drawing_lineMarkers) pushBack (+GVAR(drawing_tempLineMarker)); @@ -96,6 +90,8 @@ if (_dir == 1) exitWith { }; _handled = true; }; + + _handled }; _handled diff --git a/addons/maptools/functions/fnc_handleMouseMove.sqf b/addons/maptools/functions/fnc_handleMouseMove.sqf index 2148c5a162..7e2883382b 100644 --- a/addons/maptools/functions/fnc_handleMouseMove.sqf +++ b/addons/maptools/functions/fnc_handleMouseMove.sqf @@ -1,6 +1,5 @@ /* * Author: esteldunedain - * * Handle mouse movement over the map tool. * * Argument: @@ -13,11 +12,11 @@ #include "script_component.hpp" +params ["_control", "_mousePosX", "_mousePosY"]; + private ["_control", "_pos"]; -_control = _this select 0; -_pos = [_this select 1, _this select 2]; -GVAR(mousePosition) = _control ctrlMapScreenToWorld _pos; +GVAR(mousePosition) = _control ctrlMapScreenToWorld [_mousePosX, _mousePosY]; GVAR(mousePosition) set [2, 0]; //convert 2d pos to 3d // If cannot draw then exit diff --git a/addons/maptools/functions/fnc_openMapGps.sqf b/addons/maptools/functions/fnc_openMapGps.sqf index 7d29d9e169..dc2df07b57 100644 --- a/addons/maptools/functions/fnc_openMapGps.sqf +++ b/addons/maptools/functions/fnc_openMapGps.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" -PARAMS_1(_shouldOpenGps); +params ["_shouldOpenGps"]; private ["_isOpen"]; diff --git a/addons/maptools/functions/fnc_removeLineMarker.sqf b/addons/maptools/functions/fnc_removeLineMarker.sqf index be82970524..bd0a16adb1 100644 --- a/addons/maptools/functions/fnc_removeLineMarker.sqf +++ b/addons/maptools/functions/fnc_removeLineMarker.sqf @@ -11,7 +11,7 @@ #include "script_component.hpp" -PARAMS_1(_name); +params ["_name"]; deleteMarkerLocal _name; { diff --git a/addons/maptools/functions/fnc_updateLineMarker.sqf b/addons/maptools/functions/fnc_updateLineMarker.sqf index a745bfa123..6400d02461 100644 --- a/addons/maptools/functions/fnc_updateLineMarker.sqf +++ b/addons/maptools/functions/fnc_updateLineMarker.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" -PARAMS_4(_name,_startPos,_endPos,_color); +params ["_name", "_startPos", "_endPos", "_color"]; private ["_difPos", "_mag"]; diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index 959be6752e..c4f2f6f1dc 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -16,15 +16,15 @@ #define CENTER_OFFSET_Y_PERC 0.1606 #define CONSTANT_SCALE 0.2 -PARAMS_1(_theMap); +params ["_theMap"]; private ["_rotatingTexture", "_textureWidth", "_scale", "_xPos", "_yPos"]; // Show/Hide draw buttons if ("ACE_MapTools" in items ACE_player) then { - { ((finddisplay 12) displayctrl _x) ctrlShow true; } forEach GVAR(drawing_controls); + { ((findDisplay 12) displayCtrl _x) ctrlShow true; } forEach GVAR(drawing_controls); } else { - { ((finddisplay 12) displayctrl _x) ctrlShow false; } forEach GVAR(drawing_controls); + { ((findDisplay 12) displayCtrl _x) ctrlShow false; } forEach GVAR(drawing_controls); if (GVAR(drawing_isDrawing)) then { call FUNC(cancelDrawing); }; From 4a245bd935c8d5b77b8f0c974b7d6acfccec4586 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 17 Aug 2015 22:21:18 -0500 Subject: [PATCH 052/137] Remove Spawn for CBA_fnc_addPerFrameHandler --- addons/common/XEH_postInit.sqf | 35 ++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 43b5478eff..0dbbff04ec 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -373,21 +373,24 @@ GVAR(deviceKeyCurrentIndex) = -1; //Map opened/closed Events: GVAR(mapOpened) = false; -[] spawn { - waitUntil {(!isNull findDisplay 12)}; - ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", { - if (!GVAR(mapOpened)) then { - GVAR(mapOpened) = true; - ["mapOpened", []] call FUNC(localEvent); - [{ - if (!visibleMap) then { - GVAR(mapOpened) = false; - ["mapClosed", []] call FUNC(localEvent); - [_this select 1] call CBA_fnc_removePerFrameHandler; - }; - }, 0, []] call CBA_fnc_addPerFrameHandler; - }; - }]; -}; +[{ + if (!isNull (findDisplay 12)) then { + [_this select 1] call CBA_fnc_removePerFrameHandler; + TRACE_1("Installing Map Draw EH for MapOpened event"); + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", { + if (!GVAR(mapOpened)) then { + GVAR(mapOpened) = true; + ["mapOpened", []] call FUNC(localEvent); + [{ + if (!visibleMap) then { + GVAR(mapOpened) = false; + ["mapClosed", []] call FUNC(localEvent); + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + }, 0, []] call CBA_fnc_addPerFrameHandler; + }; + }]; + }; +}, 0, []] call CBA_fnc_addPerFrameHandler; GVAR(commonPostInited) = true; From 3bcebf9033492874f4118fa2172c72281a350fa8 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 18 Aug 2015 23:41:25 +0200 Subject: [PATCH 053/137] Moved spare parts adding to init, Added module option to add spare parts or not, Added module to add specific spare part and amount of it to specific vehicle(s) --- addons/repair/ACE_Settings.hpp | 7 +++ addons/repair/CfgEventHandlers.hpp | 10 +-- addons/repair/CfgVehicles.hpp | 60 +++++++++++++++--- addons/repair/XEH_postInit.sqf | 14 +++++ addons/repair/XEH_preInit.sqf | 4 ++ addons/repair/functions/fnc_addSpareParts.sqf | 46 ++++++++++++++ .../functions/fnc_moduleAddSpareParts.sqf | 61 +++++++++++++++++++ .../functions/fnc_moduleRepairSettings.sqf | 2 + addons/repair/stringtable.xml | 32 ++++++++++ 9 files changed, 223 insertions(+), 13 deletions(-) create mode 100644 addons/repair/functions/fnc_addSpareParts.sqf create mode 100644 addons/repair/functions/fnc_moduleAddSpareParts.sqf diff --git a/addons/repair/ACE_Settings.hpp b/addons/repair/ACE_Settings.hpp index e956e853de..b4be91d1c3 100644 --- a/addons/repair/ACE_Settings.hpp +++ b/addons/repair/ACE_Settings.hpp @@ -61,4 +61,11 @@ class ACE_Settings { values[] = {CSTRING(engineerSetting_anyone), CSTRING(engineerSetting_EngineerOnly), CSTRING(engineerSetting_RepairSpecialistOnly)}; category = CSTRING(categoryName); }; + class GVAR(addSpareParts) { + displayName = CSTRING(addSpareParts_name); + description = CSTRING(addSpareParts_description); + typeName = "BOOL"; + value = 1; + category = CSTRING(categoryName); + }; }; diff --git a/addons/repair/CfgEventHandlers.hpp b/addons/repair/CfgEventHandlers.hpp index 27e14937cf..8a2d3e728c 100644 --- a/addons/repair/CfgEventHandlers.hpp +++ b/addons/repair/CfgEventHandlers.hpp @@ -13,31 +13,31 @@ class Extended_PostInit_EventHandlers { class Extended_Init_EventHandlers { class Car { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Tank { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Helicopter { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Plane { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Ship_F { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class ACE_RepairItem_Base { diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index f24cd9bc9a..47cca3387b 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -91,6 +91,12 @@ class CfgVehicles { class Special { name = CSTRING(engineerSetting_RepairSpecialistOnly); value = 2; default = 1;}; }; }; + class addSpareParts { + displayName = CSTRING(addSpareParts_name); + description = CSTRING(addSpareParts_description); + typeName = "BOOL"; + defaultValue = 1; + }; }; class ModuleDescription { description = CSTRING(moduleDescription); @@ -215,19 +221,57 @@ class CfgVehicles { sync[] = {}; }; }; + class ACE_moduleAddSpareParts: Module_F { + scope = 2; + displayName = CSTRING(AddSpareParts_Module_DisplayName); + icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); + category = "ACE"; + function = QFUNC(moduleAddSpareParts); + functionPriority = 10; + isGlobal = 0; + isTriggerActivated = 0; + isDisposable = 0; + author = ECSTRING(common,ACETeam); + class Arguments { + class List { + displayName = CSTRING(AddSpareParts_List_DisplayName); + description = CSTRING(AddSpareParts_List_Description); + defaultValue = ""; + typeName = "STRING"; + }; + class Part { + displayName = CSTRING(AddSpareParts_Part_DisplayName); + description = CSTRING(AddSpareParts_Part_Description); + typeName = "STRING"; + class values { + class Wheel { + name = CSTRING(SpareWheel); + value = "ACE_Wheel"; + default = 1; + }; + class Track { + name = CSTRING(SpareTrack); + value = "ACE_Track"; + }; + }; + }; + class Amount { + displayName = CSTRING(AddSpareParts_Amount_DisplayName); + description = CSTRING(AddSpareParts_Amount_Description); + typeName = "NUMBER"; + defaultValue = 1; + }; + }; + class ModuleDescription { + description = CSTRING(AddSpareParts_Module_Description); + sync[] = {}; + }; + }; class LandVehicle; class Car: LandVehicle { MACRO_REPAIRVEHICLE - class ACE_Cargo { - class Cargo { - class ACE_Wheel { - type = "ACE_Wheel"; - amount = 1; - }; - }; - }; }; class Tank: LandVehicle { diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index 44ca157b0c..d61f20a31e 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -5,3 +5,17 @@ // wheels ["setWheelHitPointDamage", {(_this select 0) setHitPointDamage [_this select 1, _this select 2]}] call EFUNC(common,addEventHandler); + +if (isServer) then { + ["SettingsInitialized", { + GVAR(settingInitted) = true; // Stop collecting in FUNC(addSpareParts) + + // Exit if adding spare parts disabled + if (!GVAR(addSpareParts)) exitWith {GVAR(addSparePartsCollection) = nil}; + + // Add spare parts to vehicles in collection + { + [_x] call FUNC(addSpareParts); + } forEach GVAR(addSparePartsCollection); + }] call EFUNC(common,addEventHandler); +}; diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index ebf4c87537..28078d1b9c 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -3,6 +3,7 @@ ADDON = false; PREP(addRepairActions); +PREP(addSpareParts); PREP(canRemove); PREP(canRepair); PREP(canRepairTrack); @@ -22,6 +23,7 @@ PREP(isEngineer); PREP(isInRepairFacility); PREP(isNearRepairVehicle); PREP(isRepairVehicle); +PREP(moduleAddSpareParts); PREP(moduleAssignEngineer); PREP(moduleAssignRepairVehicle); PREP(moduleAssignRepairFacility); @@ -36,4 +38,6 @@ PREP(spawnObject); PREP(useItem); PREP(useItems); +GVAR(addSparePartsCollection) = []; + ADDON = true; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf new file mode 100644 index 0000000000..dd6588b485 --- /dev/null +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -0,0 +1,46 @@ +/* + * Author: Jonpas + * Adds spare parts to the vehicle. Before SettingsInitialized only collect for later execution. + * + * Arguments: + * 0: Vehicle + * 1: Amount (default: 1) + * 2: Spare Part Classname (default: "") + * 3: Force (add even if setting is disabled) (default: false) + * + * Return Value: + * None + * + * Example: + * _added = [vehicle] call ace_repair_fnc_addSpareParts + * + * Public: No + */ +#include "script_component.hpp" + +private ["_part"]; +params ["_vehicle", ["_amount", 1], ["_part", ""], ["_force", false]]; +TRACE_2("params",_vehicle,_amount); + +// Exit if ace_cargo is not loaded +if !(["ace_cargo"] call EFUNC(common,isModLoaded)) exitWith {}; + +// Collect until SettingsInitialized +if (isNil QGVAR(settingInitted)) exitWith { + GVAR(addSparePartsCollection) pushBack _vehicle; +}; + +// Exit if not forced and add spare parts is disabled (after settings initted to make sure it really is) +if (!_force && !GVAR(addSpareParts)) exitWith {}; + +// Select appropriate part +if (_part == "") then { + if (_vehicle isKindOf "Car") then { _part = "ACE_Wheel" }; + if (_vehicle isKindOf "Tank") then { _part = "ACE_Track" }; +}; +// Exit if no appropriate part +if (_part == "") exitWith {}; + +// Load +//["LoadItem", [_part, _vehicle]] call EFUNC(cargo,loadItem); +[_part, _vehicle, _amount] call EFUNC(cargo,addItem); // Change to above event diff --git a/addons/repair/functions/fnc_moduleAddSpareParts.sqf b/addons/repair/functions/fnc_moduleAddSpareParts.sqf new file mode 100644 index 0000000000..46689951a7 --- /dev/null +++ b/addons/repair/functions/fnc_moduleAddSpareParts.sqf @@ -0,0 +1,61 @@ +/* + * Author: Jonpas + * Adds spare parts to a vehicle. + * + * Arguments: + * 0: The module logic + * 1: Synchronized units + * 2: Activated + * + * Return Value: + * None + * + * Example: + * function = "ace_repair_fnc_moduleAssignRepairVehicle" + * + * Public: No + */ +#define DEBUG_MODE_FULL +#include "script_component.hpp" + +params ["_logic"]; + +if (!isNull _logic) then { + private ["_list", "_part", "_amount", "_nilCheckPassedList"]; + // Module settings + _list = _logic getVariable ["List", ""]; + _part = _logic getVariable ["Part", 0]; + _amount = _logic getVariable ["Amount", 1]; + + // Parse list + _nilCheckPassedList = ""; + { + _x = [_x] call EFUNC(common,stringRemoveWhiteSpace); + if !(isnil _x) then { + if (_nilCheckPassedList == "") then { + _nilCheckPassedList = _x; + } else { + _nilCheckPassedList = _nilCheckPassedList + "," + _x; + }; + }; + } forEach ([_list, ","] call BIS_fnc_splitString); + _list = "[" + _nilCheckPassedList + "]"; + _list = [] call compile _list; + + // Add synchronized objects to list + { + _list pushBack _x; + } forEach (synchronizedObjects _logic); + + if (_list isEqualTo []) exitWith {}; + + TRACE_3("module info parsed",_list,_part,_amount); + // Add spare parts + { + if (!isNil "_x" && {typeName _x == typeName objNull}) then { + [_x, _amount, _part, true] call FUNC(addSpareParts); + }; + } forEach _list; +}; + +true diff --git a/addons/repair/functions/fnc_moduleRepairSettings.sqf b/addons/repair/functions/fnc_moduleRepairSettings.sqf index 3b97d2f168..2c7e406490 100644 --- a/addons/repair/functions/fnc_moduleRepairSettings.sqf +++ b/addons/repair/functions/fnc_moduleRepairSettings.sqf @@ -31,4 +31,6 @@ if (!isServer) exitWith {}; [_logic, QGVAR(fullRepairLocation), "fullRepairLocation"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(engineerSetting_fullRepair), "engineerSetting_fullRepair"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(addSpareParts), "addSpareParts"] call EFUNC(common,readSettingFromModule); + diag_log text "[ACE]: Repair Module Initialized."; diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index ffafc56683..ce53e79c6d 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -104,6 +104,12 @@ Who can perform a full repair on a vehicle? + + Add Spare Parts + + + Add spare parts to vehicles (requires Cargo component)? + Repair %1 Reparieren %1 @@ -635,6 +641,32 @@ Assign one or multiple objects as a repair Facility + + + Add Spare Parts + + + Add spare parts to one or multiple objects + + + List + + + List of objects that will get spare parts added, separated by commas. + + + Part + + + Spare part. + + + Amount + + + Number of selected spare parts. + + Vehicle Repair From ffb765bf7a7adaf311c8ced43328c4683af539ba Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 18 Aug 2015 23:43:34 +0200 Subject: [PATCH 054/137] Changed to AddCargoItem event --- addons/repair/functions/fnc_addSpareParts.sqf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index dd6588b485..4ec01a6cc1 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -12,7 +12,7 @@ * None * * Example: - * _added = [vehicle] call ace_repair_fnc_addSpareParts + * [vehicle] call ace_repair_fnc_addSpareParts * * Public: No */ @@ -42,5 +42,4 @@ if (_part == "") then { if (_part == "") exitWith {}; // Load -//["LoadItem", [_part, _vehicle]] call EFUNC(cargo,loadItem); -[_part, _vehicle, _amount] call EFUNC(cargo,addItem); // Change to above event +["AddCargoItem", [_part, _vehicle, _amount]] call EFUNC(common,localEvent); From 4e3bbfac1677c0f09178012521907671c2d55cdd Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 18 Aug 2015 16:57:56 -0500 Subject: [PATCH 055/137] Clean old updateMapToolMarkers calls --- addons/maptools/CfgVehicles.hpp | 10 ++++---- addons/maptools/XEH_postInitClient.sqf | 3 --- .../maptools/functions/fnc_handleKeyDown.sqf | 3 ++- .../functions/fnc_handleMouseButton.sqf | 23 +++++++++---------- .../functions/fnc_handleMouseMove.sqf | 6 ++--- .../functions/fnc_updateLineMarker.sqf | 1 + .../functions/fnc_updateMapToolMarkers.sqf | 2 +- 7 files changed, 22 insertions(+), 26 deletions(-) diff --git a/addons/maptools/CfgVehicles.hpp b/addons/maptools/CfgVehicles.hpp index 5c3266d2d6..063f88f38b 100644 --- a/addons/maptools/CfgVehicles.hpp +++ b/addons/maptools/CfgVehicles.hpp @@ -14,7 +14,7 @@ class CfgVehicles { class ACE_MapToolsHide { displayName = CSTRING(MapToolsHide); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 0})); - statement = QUOTE(GVAR(mapTool_Shown) = 0; [] call FUNC(updateMapToolMarkers)); + statement = QUOTE(GVAR(mapTool_Shown) = 0;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 5; @@ -22,7 +22,7 @@ class CfgVehicles { class ACE_MapToolsShowNormal { displayName = CSTRING(MapToolsShowNormal); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 1})); - statement = QUOTE(GVAR(mapTool_Shown) = 1; [] call FUNC(updateMapToolMarkers)); + statement = QUOTE(GVAR(mapTool_Shown) = 1;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 4; @@ -30,7 +30,7 @@ class CfgVehicles { class ACE_MapToolsShowSmall { displayName = CSTRING(MapToolsShowSmall); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 2})); - statement = QUOTE(GVAR(mapTool_Shown) = 2; [] call FUNC(updateMapToolMarkers)); + statement = QUOTE(GVAR(mapTool_Shown) = 2;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 3; @@ -38,7 +38,7 @@ class CfgVehicles { class ACE_MapToolsAlignNorth { displayName = CSTRING(MapToolsAlignNorth); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 0})); - statement = QUOTE(GVAR(mapTool_angle) = 0; [] call FUNC(updateMapToolMarkers)); + statement = QUOTE(GVAR(mapTool_angle) = 0;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 2; @@ -46,7 +46,7 @@ class CfgVehicles { class ACE_MapToolsAlignCompass { displayName = CSTRING(MapToolsAlignCompass); condition = QUOTE((call FUNC(canUseMapTools) && {GVAR(mapTool_Shown) != 0} && {('ItemCompass' in assigneditems ACE_player) || {'ItemCompass' in assigneditems ACE_player}})); - statement = QUOTE(GVAR(mapTool_angle) = getDir ACE_player; [] call FUNC(updateMapToolMarkers)); + statement = QUOTE(GVAR(mapTool_angle) = getDir ACE_player;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; priority = 1; diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index 34c0a9e750..1e428f71b7 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -64,9 +64,6 @@ GVAR(drawing_controls) = [36732, 36733, 36734, 36735, 36736, 36737]; // Install event handlers on the map control and display (control = 51) GVAR(drawing_syncMarkers) = false; 12 call _fnc_installMapEvents; - - // Update the size and rotation of map tools - [] call FUNC(updateMapToolMarkers); }; ["mapOpened", { diff --git a/addons/maptools/functions/fnc_handleKeyDown.sqf b/addons/maptools/functions/fnc_handleKeyDown.sqf index 297c87e789..a83522ac91 100644 --- a/addons/maptools/functions/fnc_handleKeyDown.sqf +++ b/addons/maptools/functions/fnc_handleKeyDown.sqf @@ -16,10 +16,11 @@ #include "script_component.hpp" params ["", "_code"]; +TRACE_1("params",_code); private ["_handled", "_relPos", "_diffVector", "_magDiffVector", "_lambdaLong", "_lambdaTrasAbs"]; -_handled = false; +_handled = false; #define DIK_ESCAPE 0x01 #define DIK_DELETE 0xD3 diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index ec0d1264fc..442ec4d50e 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -14,6 +14,7 @@ params ["_dir", "_params"]; _params params ["_control", "_button", "_screenPosX", "_screenPosY", "_shiftKey", "_ctrlKey", "_altKey"]; +TRACE_2("params",_dir,_params); private["_gui", "_handled", "_marker", "_pos"]; @@ -23,16 +24,14 @@ _handled = false; if (_button != 0) exitWith {_handled}; // If releasing -if ((_dir != 1) && {(GVAR(mapTool_isDragging) || GVAR(mapTool_isRotating))}) exitWith { - GVAR(mapTool_isDragging) = false; - GVAR(mapTool_isRotating) = false; - _handled = true; - _handled -}; - -// If clicking -if (_dir == 1) exitWith { - +if (_dir != 1) then { + if (GVAR(mapTool_isDragging) || GVAR(mapTool_isRotating)) then { + GVAR(mapTool_isDragging) = false; + GVAR(mapTool_isRotating) = false; + _handled = true; + }; +} else { + // If clicking if !(call FUNC(canDraw)) exitWith {_handled = false;}; // Transform mouse screen position to coordinates @@ -43,7 +42,6 @@ if (_dir == 1) exitWith { // Already drawing -> Add tempLineMarker to permanent list if (GVAR(drawing_syncMarkers)) then { deleteMarkerLocal (GVAR(drawing_tempLineMarker) select 0); - // [GVAR(drawing_tempLineMarker), "FUNC(addLineMarker)", 2] call EFUNC(common,execRemoteFnc); ["drawing_addLineMarker", GVAR(drawing_tempLineMarker)] call EFUNC(common,globalEvent); // Log who drew on the briefing screen (text format ["[ACE] Server: Player %1 drew on the briefing screen", profileName]) call EFUNC(common,serverLog); @@ -90,8 +88,9 @@ if (_dir == 1) exitWith { }; _handled = true; }; - _handled }; +diag_log text format ["HJa %1", _handled]; + _handled diff --git a/addons/maptools/functions/fnc_handleMouseMove.sqf b/addons/maptools/functions/fnc_handleMouseMove.sqf index 7e2883382b..b27087290b 100644 --- a/addons/maptools/functions/fnc_handleMouseMove.sqf +++ b/addons/maptools/functions/fnc_handleMouseMove.sqf @@ -13,6 +13,7 @@ #include "script_component.hpp" params ["_control", "_mousePosX", "_mousePosY"]; +TRACE_3("params",_control,_mousePosX,_mousePosY); private ["_control", "_pos"]; @@ -31,6 +32,7 @@ if !(call FUNC(canDraw)) exitWith { // Handle drawing if (GVAR(drawing_isDrawing)) exitWith { GVAR(drawing_tempLineMarker) set [2, GVAR(mousePosition)]; + TRACE_1("updating line pos",GVAR(mousePosition)); GVAR(drawing_tempLineMarker) call FUNC(updateLineMarker); false }; @@ -43,8 +45,6 @@ if (GVAR(mapTool_isDragging)) exitWith { GVAR(mapTool_pos) set [0, (GVAR(mapTool_startPos) select 0) + (GVAR(mousePosition) select 0) - (GVAR(mapTool_startDragPos) select 0)]; GVAR(mapTool_pos) set [1, (GVAR(mapTool_startPos) select 1) + (GVAR(mousePosition) select 1) - (GVAR(mapTool_startDragPos) select 1)]; - // Update the size and rotation of the maptool - [] call FUNC(updateMapToolMarkers); true }; @@ -55,8 +55,6 @@ if (GVAR(mapTool_isRotating)) exitWith { _angle = (180 + ((GVAR(mousePosition) select 0) - (GVAR(mapTool_startPos) select 0)) atan2 ((GVAR(mousePosition) select 1) - (GVAR(mapTool_startPos) select 1)) mod 360); GVAR(mapTool_angle) = GVAR(mapTool_startAngle) + _angle - GVAR(mapTool_startDragAngle); - // Update the size and rotation of the maptool - [] call FUNC(updateMapToolMarkers); true }; diff --git a/addons/maptools/functions/fnc_updateLineMarker.sqf b/addons/maptools/functions/fnc_updateLineMarker.sqf index 6400d02461..12aee5b1df 100644 --- a/addons/maptools/functions/fnc_updateLineMarker.sqf +++ b/addons/maptools/functions/fnc_updateLineMarker.sqf @@ -14,6 +14,7 @@ #include "script_component.hpp" params ["_name", "_startPos", "_endPos", "_color"]; +TRACE_4("params",_name,_startPos,_endPos,_color); private ["_difPos", "_mag"]; diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index c4f2f6f1dc..5c88d907b8 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -21,7 +21,7 @@ params ["_theMap"]; private ["_rotatingTexture", "_textureWidth", "_scale", "_xPos", "_yPos"]; // Show/Hide draw buttons -if ("ACE_MapTools" in items ACE_player) then { +if ([] call FUNC(canDraw)) then { { ((findDisplay 12) displayCtrl _x) ctrlShow true; } forEach GVAR(drawing_controls); } else { { ((findDisplay 12) displayCtrl _x) ctrlShow false; } forEach GVAR(drawing_controls); From 645e8a63efc42038ba7e11c83645003e1c5dacdb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 20 Aug 2015 04:20:46 -0500 Subject: [PATCH 056/137] Captive FFV Lock Animation --- addons/captives/CfgMoves.hpp | 13 ++++++ .../captives/functions/fnc_canLoadCaptive.sqf | 33 +++++++++------ .../captives/functions/fnc_doLoadCaptive.sqf | 40 ++++++++++++------- .../captives/functions/fnc_setHandcuffed.sqf | 12 +++++- .../functions/fnc_vehicleCaptiveMoveIn.sqf | 13 ++++-- addons/captives/script_component.hpp | 2 + 6 files changed, 81 insertions(+), 32 deletions(-) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index aa64e85e22..6c0bfc3ce9 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -18,6 +18,11 @@ class CfgMovesBasic { default = "ACE_AmovPercMstpSsurWnonDnon"; PutDown = ""; }; + class ACE_CivilHandCuffedFFVActions: ACE_CivilStandHandcuffedActions { + stop = "ACE_HandcuffedFFV"; + StopRelaxed = "ACE_HandcuffedFFV"; + default = "ACE_HandcuffedFFV"; + }; }; }; @@ -55,6 +60,14 @@ class CfgMovesMaleSdr: CfgMovesBasic { InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; }; + //Handcuffed-FFV: + class ACE_HandcuffedFFV: ACE_AmovPercMstpScapWnonDnon { + file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm"; + actions = "ACE_CivilHandCuffedFFVActions"; + ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; + }; + + //Surrender Anims: class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase { actions = "ACE_CivilStandSurrenderActions"; diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index 1cdc4d86a1..254f0de693 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -17,22 +17,31 @@ */ #include "script_component.hpp" -private ["_objects"]; params ["_unit", "_target","_vehicle"]; -if (isNull _target) then { - _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); - if ((count _objects) > 0) then {_target = _objects select 0;}; +if ((isNull _target) && {_unit getVariable [QGVAR(isEscorting), false]}) then { + //Looking at a vehicle while escorting, get target from attached objects: + { + if (_x getVariable [QGVAR(isHandcuffed), false]) exitWith { + _target = _x; + }; + } forEach (attachedObjects _unit); }; +if ((isNull _target) || {(vehicle _target) != _target} || {!(_target getVariable [QGVAR(isHandcuffed), false])}) exitWith {false}; if (isNull _vehicle) then { - _objects = nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]; - if ((count _objects) > 0) then {_vehicle = _objects select 0;}; + //Looking at a captive unit, search for nearby vehicles with valid seats: + { + // if (([_x] call FUNC(findEmptyNonFFVCargoSeat)) != -1) exitWith { + if ((_x emptyPositions "cargo") > 0) exitWith { + _vehicle = _x; + }; + } forEach (nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]); +} else { + // if (([_vehicle] call FUNC(findEmptyNonFFVCargoSeat)) == -1) then { + if ((_vehicle emptyPositions "cargo") == 0) then { + _vehicle = objNull; + }; }; -(!isNull _target) -&& {!isNull _vehicle} -&& {_unit getVariable [QGVAR(isEscorting), false]} -&& {_target getVariable [QGVAR(isHandcuffed), false]} -&& {([_vehicle] call FUNC(findEmptyNonFFVCargoSeat)) != -1} +(!isNull _vehicle) diff --git a/addons/captives/functions/fnc_doLoadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf index d7df42eb0a..a4d7df8892 100644 --- a/addons/captives/functions/fnc_doLoadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -1,6 +1,6 @@ /* * Author: commy2 - * Unit loads the target object into a vehicle. + * Unit loads the target object into a vehicle. (logic same as canLoadCaptive) * * Arguments: * 0: Unit that wants to load a captive @@ -17,24 +17,34 @@ */ #include "script_component.hpp" -private "_objects"; - params ["_unit", "_target","_vehicle"]; -if (isNull _target) then { - _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); - if ((count _objects) > 0) then {_target = _objects select 0;}; +if ((isNull _target) && {_unit getVariable [QGVAR(isEscorting), false]}) then { + //Looking at a vehicle while escorting, get target from attached objects: + { + if (_x getVariable [QGVAR(isHandcuffed), false]) exitWith { + _target = _x; + }; + } forEach (attachedObjects _unit); }; -if (isNull _target) exitWith {}; +if ((isNull _target) || {(vehicle _target) != _target} || {!(_target getVariable [QGVAR(isHandcuffed), false])}) exitWith {ERROR("");}; if (isNull _vehicle) then { - _objects = nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]; - if ((count _objects) > 0) then {_vehicle = _objects select 0;}; + //Looking at a captive unit, search for nearby vehicles with valid seats: + { + // if (([_x] call FUNC(findEmptyNonFFVCargoSeat)) != -1) exitWith { + if ((_x emptyPositions "cargo") > 0) exitWith { + _vehicle = _x; + }; + } forEach (nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]); +} else { + // if (([_vehicle] call FUNC(findEmptyNonFFVCargoSeat)) == -1) then { + if ((_vehicle emptyPositions "cargo") == 0) then { + _vehicle = objNull; + }; }; -if (isNull _vehicle) exitWith {}; -if ((!isNil "_target") && {!isNil "_vehicle"}) then { - _unit setVariable [QGVAR(isEscorting), false, true]; - ["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); -}; +if (isNull _vehicle) exitWith {ERROR("");}; + +_unit setVariable [QGVAR(isEscorting), false, true]; +["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 413e3d59b5..e1f06e2b61 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -48,6 +48,9 @@ if (_state) then { if ((vehicle _unit) == _unit) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + } else { + [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); }; //Adds an animation changed eh @@ -63,10 +66,11 @@ if (_state) then { [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; } else { + // _turretPath = []; // { - // _x params ["_xUnit", "", "", "_xTurretPath"]; - // if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; + // _x params ["_xUnit", "", "", "_xTurretPath"]; + // if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; // } forEach (fullCrew (vehicle _unit)); // TRACE_1("turret Path",_turretPath); // if (_turretPath isEqualTo []) exitWith {}; @@ -75,6 +79,10 @@ if (_state) then { // TRACE_1("reseting to",_gunnerAction); // [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); // [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + + + [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); }; }]; _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index 6e79725242..cb1c2fd37a 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -20,9 +20,16 @@ private ["_cargoIndex"]; params ["_target","_vehicle"]; -_cargoIndex = [_vehicle] call FUNC(findEmptyNonFFVCargoSeat); -if (_cargoIndex < 0) exitWith {ERROR("No Seat Avail");}; +// _cargoIndex = [_vehicle] call FUNC(findEmptyNonFFVCargoSeat); +// if (_cargoIndex < 0) exitWith {ERROR("No Seat Avail");}; +// _target moveInCargo [_vehicle, _cargoIndex]; + +_target moveInCargo _vehicle; -_target moveInCargo [_vehicle, _cargoIndex]; _target assignAsCargo _vehicle; + +_cargoIndex = _vehicle getCargoIndex _target; _target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; + +[_target, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); +[_target, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); diff --git a/addons/captives/script_component.hpp b/addons/captives/script_component.hpp index e68eb19d2f..375c956129 100644 --- a/addons/captives/script_component.hpp +++ b/addons/captives/script_component.hpp @@ -1,6 +1,8 @@ #define COMPONENT captives #include "\z\ace\addons\main\script_mod.hpp" +// #define DEBUG_MODE_FULL + #ifdef DEBUG_ENABLED_CAPTIVES #define DEBUG_MODE_FULL #endif From 5b8708a179df47fbf4a2c87d117f8dcbaafc55d3 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Thu, 20 Aug 2015 18:17:37 +0100 Subject: [PATCH 057/137] Prevent CBA keybindings in zeus interface Checks if the key pressed matches the zeus menu keybind and only fires the code to handle CBA keybinds if true. Should fix the majority of weirdness with keybinds in zeus. However, not perfect as shared keybinds with different modifiers will still fire and it's really an un-ideal workaround. --- addons/interact_menu/XEH_clientInit.sqf | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index cbc28e66b4..7c7724d9b4 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -75,10 +75,24 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; 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) +// Let key work with zeus open (not perfect, contains workaround to prevent other CBA keybindings) ["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}]; + (finddisplay 312) displayAddEventHandler ["KeyUp", { + _key = ["ACE3 Common","ace_interact_menu_InteractKey"] call CBA_fnc_getKeybind; + _key = (_key select 5) select 0; + + if ((_this select 1) == _key) then { + [_this,'keyup'] call CBA_events_fnc_keyHandler + }; + }]; + (finddisplay 312) displayAddEventHandler ["KeyDown", { + _key = ["ACE3 Common","ace_interact_menu_InteractKey"] call CBA_fnc_getKeybind; + _key = (_key select 5) select 0; + + if ((_this select 1) == _key) then { + [_this,'keydown'] call CBA_events_fnc_keyHandler + }; + }]; }; }] call EFUNC(common,addEventHandler); From 51a8cb79749f2a89aa4ad6cb511bbba01c6ec637 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 20 Aug 2015 23:58:06 -0500 Subject: [PATCH 058/137] Only force Animation for FFV Cargo Seats --- addons/captives/CfgMoves.hpp | 2 +- .../captives/functions/fnc_setHandcuffed.sqf | 21 +++++++------------ .../functions/fnc_vehicleCaptiveMoveIn.sqf | 11 ++++++++++ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index 6c0bfc3ce9..161fcce9a4 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -64,7 +64,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { class ACE_HandcuffedFFV: ACE_AmovPercMstpScapWnonDnon { file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm"; actions = "ACE_CivilHandCuffedFFVActions"; - ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; + ConnectTo[] = {}; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index e1f06e2b61..c4bde3a839 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -67,20 +67,15 @@ if (_state) then { }; } else { - // _turretPath = []; - // { - // _x params ["_xUnit", "", "", "_xTurretPath"]; - // if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; - // } forEach (fullCrew (vehicle _unit)); - // TRACE_1("turret Path",_turretPath); - // if (_turretPath isEqualTo []) exitWith {}; - // _turretConfig = [(configFile >> "CfgVehicles" >> (typeOf (vehicle _unit))), _turretPath] call EFUNC(common,getTurretConfigPath); - // _gunnerAction = getText (_turretConfig >> "gunnerAction"); - // TRACE_1("reseting to",_gunnerAction); - // [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); - // [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); - + _turretPath = []; + { + _x params ["_xUnit", "", "", "_xTurretPath"]; + if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; + } forEach (fullCrew (vehicle _unit)); + TRACE_1("turret Path",_turretPath); + if (_turretPath isEqualTo []) exitWith {}; + TRACE_1("Handcuff (FFV) animation interrupted",_newAnimation); [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index cb1c2fd37a..959bbd71b9 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -31,5 +31,16 @@ _target assignAsCargo _vehicle; _cargoIndex = _vehicle getCargoIndex _target; _target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; +//Check if is a FFV turret: +_turretPath = []; +{ + _x params ["_xUnit", "", "", "_xTurretPath"]; + if (_target == _xUnit) exitWith {_turretPath = _xTurretPath}; +} forEach (fullCrew (vehicle _target)); +TRACE_1("turret Path",_turretPath); +if (_turretPath isEqualTo []) exitWith {}; + +TRACE_1("Setting FFV Animation",_newAnimation); + [_target, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); [_target, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); From 21b0ee087a48d55d7b86e901da6eeb6644882967 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 22 Aug 2015 00:26:01 +0100 Subject: [PATCH 059/137] Add spectator UI interrupt system A public API system to allow external systems to interrupt and resume the spectator interface. Also made use of it for the escape menu and zeus support. --- addons/spectator/XEH_preInit.sqf | 2 + .../functions/fnc_handleInterface.sqf | 66 +++++++------------ addons/spectator/functions/fnc_interrupt.sqf | 44 +++++++++++++ 3 files changed, 68 insertions(+), 44 deletions(-) create mode 100644 addons/spectator/functions/fnc_interrupt.sqf diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index a40f4a0dcb..d1bf48d106 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -12,6 +12,7 @@ PREP(handleMap); PREP(handleMouse); PREP(handleToolbar); PREP(handleUnits); +PREP(interrupt); PREP(moduleSpectatorSettings); PREP(respawnTemplate); PREP(setCameraAttributes); @@ -39,6 +40,7 @@ GVAR(camUnit) = objNull; GVAR(camVision) = -2; GVAR(camZoom) = 1.25; +GVAR(interrupts) = []; GVAR(isSet) = false; GVAR(showComp) = true; diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 95f05d01ec..57026fb6fa 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -24,6 +24,7 @@ switch (toLower _mode) do { case "open": { // Prevent reopening if (GVAR(isSet)) exitWith {}; + GVAR(interrupts) = []; // Initalize camera variables GVAR(camBoom) = 0; @@ -68,16 +69,18 @@ switch (toLower _mode) do { }; }; case "close": { - _args params ["_unit"]; - // Can't close a second time if !(GVAR(isSet)) exitWith {}; + GVAR(interrupts) = []; // Terminate interface while {dialog} do { closeDialog 0; }; + // Kill the display + (findDisplay 12249) closeDisplay 0; + // Terminate camera GVAR(camera) cameraEffect ["terminate", "back"]; camDestroy GVAR(camera); @@ -203,11 +206,21 @@ switch (toLower _mode) do { }; case "onunload": { // Kill GUI PFHs + removeMissionEventHandler ["Draw3D",GVAR(iconHandler)]; GVAR(camHandler) = nil; GVAR(compHandler) = nil; - removeMissionEventHandler ["Draw3D",GVAR(iconHandler)]; GVAR(iconHandler) = nil; GVAR(toolHandler) = nil; + + // Reset variables + GVAR(camBoom) = 0; + GVAR(camDolly) = [0,0]; + GVAR(ctrlKey) = false; + GVAR(heldKeys) = []; + GVAR(heldKeys) resize 255; + GVAR(mouse) = [false,false]; + GVAR(mousePos) = [0.5,0.5]; + GVAR(treeSel) = objNull; }; // Mouse events case "onmousebuttondown": { @@ -247,7 +260,8 @@ switch (toLower _mode) do { _args params ["_display","_dik","_shift","_ctrl","_alt"]; if ((alive player) && {_dik in (actionKeys "curatorInterface")} && {!isNull (getAssignedCuratorLogic player)}) exitWith { - ["zeus", [_display]] call FUNC(handleInterface); + [QGVAR(zeus)] call FUNC(interrupt); + ["zeus"] call FUNC(handleInterface); }; if ((isServer || {serverCommandAvailable "#kick"}) && {_dik in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) exitWith { false @@ -262,7 +276,8 @@ switch (toLower _mode) do { switch (_dik) do { case 1: { // Esc - ["escape", [_display]] call FUNC(handleInterface); + [QGVAR(escape)] call FUNC(interrupt); + ["escape"] call FUNC(handleInterface); }; case 2: { // 1 [_display,nil,nil,nil,nil,nil,true] call FUNC(toggleInterface); @@ -515,23 +530,8 @@ switch (toLower _mode) do { }; // Break from interface for external events case "escape": { - _args params ["_display"]; private "_dlg"; - // Kill display - _display closeDisplay 0; - - // Reset cam/UI vars - GVAR(camBoom) = 0; - GVAR(camDolly) = [0,0]; - - GVAR(ctrlKey) = false; - GVAR(heldKeys) = []; - GVAR(heldKeys) resize 255; - GVAR(mouse) = [false,false]; - GVAR(mousePos) = [0.5,0.5]; - GVAR(treeSel) = objNull; - createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); disableSerialization; @@ -562,31 +562,12 @@ switch (toLower _mode) do { if !(isNull (findDisplay 49)) exitWith {}; // If still a spectator then re-enter the interface - if (GVAR(isSet)) then { - createDialog QGVAR(interface); - [] call FUNC(transitionCamera); - }; + [QGVAR(escape),false] call FUNC(interrupt); [_this select 1] call CBA_fnc_removePerFrameHandler; },0] call CBA_fnc_addPerFrameHandler; }; case "zeus": { - _args params ["_display"]; - - // Kill display - _display closeDisplay 0; - - // Reset cam/UI vars - GVAR(camBoom) = 0; - GVAR(camDolly) = [0,0]; - - GVAR(ctrlKey) = false; - GVAR(heldKeys) = []; - GVAR(heldKeys) resize 255; - GVAR(mouse) = [false,false]; - GVAR(mousePos) = [0.5,0.5]; - GVAR(treeSel) = objNull; - openCuratorInterface; [{ @@ -595,10 +576,7 @@ switch (toLower _mode) do { if !((isNull curatorCamera) && {isNull (GETMVAR(bis_fnc_moduleRemoteControl_unit,objNull))}) exitWith {}; // If still a spectator then re-enter the interface - if (GVAR(isSet)) then { - createDialog QGVAR(interface); - [] call FUNC(transitionCamera); - }; + [QGVAR(zeus),false] call FUNC(interrupt) [_this select 1] call CBA_fnc_removePerFrameHandler; },0] call CBA_fnc_addPerFrameHandler; diff --git a/addons/spectator/functions/fnc_interrupt.sqf b/addons/spectator/functions/fnc_interrupt.sqf new file mode 100644 index 0000000000..48cca7d102 --- /dev/null +++ b/addons/spectator/functions/fnc_interrupt.sqf @@ -0,0 +1,44 @@ +/* + * Author: SilentSpike + * Interrupts the spectator interface for external systems + * + * Arguments: + * 0: Reason + * 1: Interrupting + * + * Return Value: + * None + * + * Example: + * ["mySystem"] call ace_spectator_fnc_interrupt + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_reason", "", [""]], ["_interrupt", true, [true]]]; + +// Nothing to do when spectator is closed +if !(GVAR(isSet)) exitWith {}; + +if (_reason == "") exitWith { ERROR("Invalid Reason"); }; +if (_interrupt) then { + GVAR(interrupts) pushBack _reason; +} else { + GVAR(interrupts) = GVAR(interrupts) - [_reason]; +}; + +if (GVAR(interrupts) isEqualTo []) then { + if (isNull (findDisplay 12249)) then { + createDialog QGVAR(interface); + [] call FUNC(transitionCamera); + }; +} else { + if !(isNull (findDisplay 12249)) then { + while {dialog} do { + closeDialog 0; + }; + + (findDisplay 12249) closeDisplay 0; + }; +}; From 69df301e677056ea2801a2f81fc8a1922f3d824b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 23 Aug 2015 02:29:51 -0500 Subject: [PATCH 060/137] Replace one more macro --- addons/captives/functions/fnc_doEscortCaptive.sqf | 4 +++- addons/captives/functions/fnc_setHandcuffed.sqf | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index bb070b057a..08b64195f3 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -35,7 +35,9 @@ if (_state) then { nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))]; [{ - EXPLODE_3_PVT((_this select 0),_unit,_target,_actionID); + params ["_args", "_pfID"]; + _args params ["_unit", "_target", "_actionID"]; + if (_unit getVariable [QGVAR(isEscorting), false]) then { if (!alive _target || {!alive _unit} || {!canStand _target} || {!canStand _unit} || {_target getVariable ["ACE_isUnconscious", false]} || {_unit getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo _unit)}) then { _unit setVariable [QGVAR(isEscorting), false, true]; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index c4bde3a839..a8c8e02fd4 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -17,6 +17,7 @@ #include "script_component.hpp" params ["_unit","_state"]; +TRACE_2("params",_unit,_state); if (!local _unit) exitwith { ERROR("running setHandcuffed on remote unit"); @@ -56,7 +57,7 @@ if (_state) then { //Adds an animation changed eh //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) private "_animChangedEHID"; - TRACE_1("Adding animChangedEH",_unit); + _animChangedEHID = _unit addEventHandler ["AnimChanged", { params ["_unit", "_newAnimation"]; TRACE_2("AnimChanged",_unit,_newAnimation); @@ -80,6 +81,7 @@ if (_state) then { [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); }; }]; + TRACE_2("Adding animChangedEH",_unit,_animChangedEHID); _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; }, [_unit], 0.01] call EFUNC(common,waitAndExecute); @@ -90,6 +92,7 @@ if (_state) then { //remove AnimChanged EH private "_animChangedEHID"; _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; + TRACE_1("removing animChanged EH",_animChangedEHID); _unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit setVariable [QGVAR(handcuffAnimEHID), -1]; From 8ca06a9a76f14348dd0df65db05cf09807cc8737 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 23 Aug 2015 12:32:46 -0500 Subject: [PATCH 061/137] More FFV animation stuff --- .../fnc_findEmptyNonFFVCargoSeat.sqf | 31 ++++++++++++++++-- addons/captives/functions/fnc_handleGetIn.sqf | 21 ++++++++++-- .../captives/functions/fnc_handleGetOut.sqf | 19 ++++++----- .../captives/functions/fnc_setSurrendered.sqf | 1 + .../functions/fnc_vehicleCaptiveMoveIn.sqf | 32 ++++++------------- .../functions/fnc_vehicleCaptiveMoveOut.sqf | 2 ++ 6 files changed, 70 insertions(+), 36 deletions(-) diff --git a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf index a6bd625870..cf67614f91 100644 --- a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf +++ b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf @@ -1,6 +1,22 @@ +/* + * Author: PabstMirror + * Finds a free cargo seat, searching non FFV first + * + * Arguments: + * 0: The Vehicle + * + * Return Value: + * ARRAY [seat index , is FFV ] + * + * Example: + * [car1] call ACE_captives_fnc_findEmptyNonFFVCargoSeat + * + * Public: No + */ #include "script_component.hpp" params ["_vehicle"]; +TRACE_1("params", _vehicle); _vehicleConfig = configFile >> "CfgVehicles" >> (typeOf _vehicle); @@ -30,10 +46,21 @@ _occupiedSeats = []; TRACE_3("Searching for empty seat",_realCargoCount,_ffvCargoIndexes,_occupiedSeats); -_emptyCargoSeatReturn = -1; +_emptyCargoSeatReturn = [-1, false]; + +//First seach for non-ffv seats: for "_index" from 0 to (_realCargoCount - 1) do { if ((!(_index in _ffvCargoIndexes)) && {!(_index in _occupiedSeats)}) exitWith { - _emptyCargoSeatReturn = _index; + _emptyCargoSeatReturn = [_index, false]; + }; +}; + +//Only use FFV if none found: +if (_emptyCargoSeatReturn isEqualTo [-1, false]) then { + for "_index" from 0 to (_realCargoCount - 1) do { + if (!(_index in _occupiedSeats)) exitWith { + _emptyCargoSeatReturn = [_index, true]; + }; }; }; diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf index 487e7d4179..5476073b38 100644 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -4,8 +4,8 @@ * * Arguments: * 0: _vehicle - * 2: dunno - * 1: _unit + * 1: dunno + * 2: _unit * * Return Value: * The return value @@ -17,7 +17,8 @@ */ #include "script_component.hpp" -params ["_vehicle", "_dontcare","_unit"]; +params ["_vehicle", "","_unit"]; +TRACE_2("params",_vehicle,_unit); if (local _unit) then { if (_unit getVariable [QGVAR(isEscorting), false]) then { @@ -27,4 +28,18 @@ if (local _unit) then { if (_unit getVariable [QGVAR(isSurrendering), false]) then { [_unit, false] call FUNC(setSurrender); }; + + if (_unit getVariable [QGVAR(isHandcuffed), false]) then { + //Need to force animation for FFV turrets + _turretPath = []; + { + _x params ["_xUnit", "", "", "_xTurretPath"]; + if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; + } forEach (fullCrew (vehicle _unit)); + if (!(_turretPath isEqualTo [])) then { + TRACE_1("Setting FFV Handcuffed Animation",_turretPath); + [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); + }; + }; }; diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index 756c14ec10..dea97eb600 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -4,8 +4,8 @@ * * Arguments: * 0: _vehicle - * 2: dunno - * 1: _unit + * 1: dunno + * 2: _unit * * Return Value: * The return value @@ -17,18 +17,21 @@ */ #include "script_component.hpp" -params ["_vehicle", "_dontcare","_unit"]; +params ["_vehicle", "", "_unit"]; +TRACE_2("params",_vehicle,_unit); if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then { private ["_cargoIndex"]; _cargoIndex = _unit getVariable [QGVAR(CargoIndex), -1]; - //If captive was not "unloaded", then move them back into the vehicle. - if (_cargoIndex != -1) exitWith { + if (_cargoIndex != -1) then { + //If captive was not "unloaded", then move them back into the vehicle. + TRACE_1("forcing back into vehicle",_cargoIndex); _unit moveInCargo [_vehicle, _cargoIndex]; + } else { + //Getting out of vehicle: + [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; - - [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); - [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index 22736c8e59..dd9ac417c5 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -17,6 +17,7 @@ #include "script_component.hpp" params ["_unit","_state"]; +TRACE_2("params",_unit,_state); if (!local _unit) exitwith { ERROR("running surrender on remote unit"); diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index 959bbd71b9..0839c61ea1 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -16,31 +16,17 @@ */ #include "script_component.hpp" +params ["_target","_vehicle"]; +TRACE_2("params",_target,_vehicle); + private ["_cargoIndex"]; -params ["_target","_vehicle"]; +_getSeat = [_vehicle] call FUNC(findEmptyNonFFVCargoSeat); +TRACE_1("free cargo seat",_getSeat); +_cargoIndex = _getSeat select 0; +if (_cargoIndex == -1) exitWith {ERROR("cargo index -1");}; -// _cargoIndex = [_vehicle] call FUNC(findEmptyNonFFVCargoSeat); -// if (_cargoIndex < 0) exitWith {ERROR("No Seat Avail");}; -// _target moveInCargo [_vehicle, _cargoIndex]; +_target moveInCargo [_vehicle, _cargoIndex]; +_target assignAsCargoIndex [_vehicle, _cargoIndex]; -_target moveInCargo _vehicle; - -_target assignAsCargo _vehicle; - -_cargoIndex = _vehicle getCargoIndex _target; _target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; - -//Check if is a FFV turret: -_turretPath = []; -{ - _x params ["_xUnit", "", "", "_xTurretPath"]; - if (_target == _xUnit) exitWith {_turretPath = _xTurretPath}; -} forEach (fullCrew (vehicle _target)); -TRACE_1("turret Path",_turretPath); -if (_turretPath isEqualTo []) exitWith {}; - -TRACE_1("Setting FFV Animation",_newAnimation); - -[_target, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); -[_target, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf index db8a7bd12e..ce44b5926f 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf @@ -16,6 +16,8 @@ #include "script_component.hpp" params ["_unit"]; +TRACE_1("params",_unit); + _unit setVariable [QGVAR(CargoIndex), -1, true]; moveOut _unit; From ca1b47beb5e52b3c35e0073d0ae2227c977d8a24 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sun, 23 Aug 2015 19:54:55 +0200 Subject: [PATCH 062/137] Use correct module group --- addons/repair/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index 53f1aa7a46..d0f3645678 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -224,7 +224,7 @@ class CfgVehicles { scope = 2; displayName = CSTRING(AddSpareParts_Module_DisplayName); icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); - category = "ACE"; + category = "ACE_Logistics"; function = QFUNC(moduleAddSpareParts); functionPriority = 10; isGlobal = 0; From 152faf63886e43e752b8fc53498a5cf1b3b86a58 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 23 Aug 2015 17:50:11 +0100 Subject: [PATCH 063/137] Improve spectator interface entry and exit - Use a display rather than a dialog (contextually makes more sense). - Move the entry/exit functionality to the setSpectator function. Preserves the handleInterface function for purely display related events and makes more sense. - Fix missing semi-colon --- .../functions/fnc_handleInterface.sqf | 98 +------------------ .../spectator/functions/fnc_setSpectator.sqf | 88 ++++++++++++++++- 2 files changed, 88 insertions(+), 98 deletions(-) diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf index 57026fb6fa..93c6ca3ddd 100644 --- a/addons/spectator/functions/fnc_handleInterface.sqf +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -20,100 +20,6 @@ params ["_mode",["_args",[]]]; switch (toLower _mode) do { - // Safely open/close the interface - case "open": { - // Prevent reopening - if (GVAR(isSet)) exitWith {}; - GVAR(interrupts) = []; - - // Initalize camera variables - GVAR(camBoom) = 0; - GVAR(camDolly) = [0,0]; - GVAR(camGun) = false; - - // Initalize display variables - GVAR(ctrlKey) = false; - GVAR(heldKeys) = []; - GVAR(heldKeys) resize 255; - GVAR(mouse) = [false,false]; - GVAR(mousePos) = [0.5,0.5]; - GVAR(treeSel) = objNull; - - // Update units before opening to support pre-set camera unit - [] call FUNC(updateUnits); - - // Initalize the camera view - GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); - [] call FUNC(transitionCamera); - - // Close map and clear radio - openMap [false,false]; - clearRadio; - - // Disable BI damage effects - BIS_fnc_feedback_allowPP = false; - - // Close all existing dialogs - while {dialog} do { - closeDialog 0; - }; - - // Create the dialog - createDialog QGVAR(interface); - - // Cache and disable nametag settings - if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { - GVAR(nametagSettingCache) = [EGVAR(nametags,showPlayerNames), EGVAR(nametags,showNamesForAI)]; - EGVAR(nametags,showPlayerNames) = 0; - EGVAR(nametags,showNamesForAI) = false; - }; - }; - case "close": { - // Can't close a second time - if !(GVAR(isSet)) exitWith {}; - GVAR(interrupts) = []; - - // Terminate interface - while {dialog} do { - closeDialog 0; - }; - - // Kill the display - (findDisplay 12249) closeDisplay 0; - - // Terminate camera - GVAR(camera) cameraEffect ["terminate", "back"]; - camDestroy GVAR(camera); - - clearRadio; - - // Return to player view - player switchCamera "internal"; - - // Enable BI damage effects - BIS_fnc_feedback_allowPP = true; - - // Cleanup camera variables - GVAR(camera) = nil; - GVAR(camBoom) = nil; - GVAR(camDolly) = nil; - GVAR(camGun) = nil; - - // Cleanup display variables - GVAR(ctrlKey) = nil; - GVAR(heldKeys) = nil; - GVAR(mouse) = nil; - GVAR(mousePos) = nil; - GVAR(treeSel) = nil; - - // Reset nametag settings - if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { - EGVAR(nametags,showPlayerNames) = GVAR(nametagSettingCache) select 0; - EGVAR(nametags,showNamesForAI) = GVAR(nametagSettingCache) select 1; - GVAR(nametagSettingCache) = nil; - }; - }; - // Dialog events case "onload": { _args params ["_display"]; @@ -528,7 +434,7 @@ switch (toLower _mode) do { [nil,nil,nil, _newPos] call FUNC(setCameraAttributes); }; }; - // Break from interface for external events + // Interrupt events case "escape": { private "_dlg"; @@ -576,7 +482,7 @@ switch (toLower _mode) do { if !((isNull curatorCamera) && {isNull (GETMVAR(bis_fnc_moduleRemoteControl_unit,objNull))}) exitWith {}; // If still a spectator then re-enter the interface - [QGVAR(zeus),false] call FUNC(interrupt) + [QGVAR(zeus),false] call FUNC(interrupt); [_this select 1] call CBA_fnc_removePerFrameHandler; },0] call CBA_fnc_addPerFrameHandler; diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index 4f41e073d7..621100a5ba 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -25,17 +25,101 @@ params [["_set",true,[true]]]; // Only clients can be spectators if !(hasInterface) exitWith {}; +// Exit if no change +if (_set isEqualTo GVAR(isSet)) exitwith {}; + // Handle common addon audio if (["ace_hearing"] call EFUNC(common,isModLoaded)) then {EGVAR(hearing,disableVolumeUpdate) = _set}; if (["acre_sys_radio"] call EFUNC(common,isModLoaded)) then {[_set] call acre_api_fnc_setSpectator}; if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {[player, _set] call TFAR_fnc_forceSpectator}; if (_set) then { - ["open"] call FUNC(handleInterface); + // Initalize camera variables + GVAR(camBoom) = 0; + GVAR(camDolly) = [0,0]; + GVAR(camGun) = false; + + // Initalize display variables + GVAR(ctrlKey) = false; + GVAR(heldKeys) = []; + GVAR(heldKeys) resize 255; + GVAR(mouse) = [false,false]; + GVAR(mousePos) = [0.5,0.5]; + GVAR(treeSel) = objNull; + + // Update units before opening to support pre-set camera unit + [] call FUNC(updateUnits); + + // Initalize the camera view + GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); + [] call FUNC(transitionCamera); + + // Close map and clear radio + openMap [false,false]; + clearRadio; + + // Disable BI damage effects + BIS_fnc_feedback_allowPP = false; + + // Close any open dialogs + while {dialog} do { + closeDialog 0; + }; + + // Create the display + (findDisplay 46) createDisplay QGVAR(interface); + + // Cache and disable nametag settings + if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { + GVAR(nametagSettingCache) = [EGVAR(nametags,showPlayerNames), EGVAR(nametags,showNamesForAI)]; + EGVAR(nametags,showPlayerNames) = 0; + EGVAR(nametags,showNamesForAI) = false; + }; } else { - ["close"] call FUNC(handleInterface); + // Close any open dialogs (could be interrupts) + while {dialog} do { + closeDialog 0; + }; + + // Kill the display + (findDisplay 12249) closeDisplay 0; + + // Terminate camera + GVAR(camera) cameraEffect ["terminate", "back"]; + camDestroy GVAR(camera); + + clearRadio; + + // Return to player view + player switchCamera "internal"; + + // Enable BI damage effects + BIS_fnc_feedback_allowPP = true; + + // Cleanup camera variables + GVAR(camera) = nil; + GVAR(camBoom) = nil; + GVAR(camDolly) = nil; + GVAR(camGun) = nil; + + // Cleanup display variables + GVAR(ctrlKey) = nil; + GVAR(heldKeys) = nil; + GVAR(mouse) = nil; + GVAR(mousePos) = nil; + GVAR(treeSel) = nil; + + // Reset nametag settings + if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { + EGVAR(nametags,showPlayerNames) = GVAR(nametagSettingCache) select 0; + EGVAR(nametags,showNamesForAI) = GVAR(nametagSettingCache) select 1; + GVAR(nametagSettingCache) = nil; + }; }; +// Reset interruptions +GVAR(interrupts) = []; + // Mark spectator state for reference GVAR(isSet) = _set; From 40634318f00977c5047945cf7f2e09cea9ee8e04 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 23 Aug 2015 23:41:35 -0500 Subject: [PATCH 064/137] Move RemoveHandcuffs to Main (always blocked by hands) --- addons/captives/CfgVehicles.hpp | 32 +++++++++---------- .../functions/fnc_canRemoveHandcuffs.sqf | 3 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 774ecf87e3..afda86cfda 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -12,17 +12,17 @@ class CfgVehicles { exceptions[] = {}; icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); }; - class ACE_RemoveHandcuffs { - displayName = CSTRING(ReleaseCaptive); - selection = "righthand"; - distance = 2; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); - exceptions[] = {}; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - }; class ACE_MainActions { + class ACE_RemoveHandcuffs { + displayName = CSTRING(ReleaseCaptive); + selection = "righthand"; + distance = 2; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); + exceptions[] = {}; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + }; class ACE_EscortCaptive { displayName = CSTRING(EscortCaptive); distance = 4; @@ -97,7 +97,7 @@ class CfgVehicles { }; }; -#define MACRO_LOADUNLOADCAPTIVE \ +#define MACRO_LOADCAPTIVE \ class ACE_Actions { \ class ACE_MainActions { \ class GVAR(LoadCaptive) { \ @@ -113,27 +113,27 @@ class CfgVehicles { class LandVehicle; class Car: LandVehicle { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Tank: LandVehicle { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Air; class Helicopter: Air { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Plane: Air { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Ship; class Ship_F: Ship { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class StaticWeapon: LandVehicle { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Box_NATO_Support_F; diff --git a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf index e8bbe3b50e..e36ba5cd5b 100644 --- a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf +++ b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf @@ -20,4 +20,5 @@ params ["_unit", "_target"]; //Unit is handcuffed and not currently being escorted _target getVariable [QGVAR(isHandcuffed), false] && -{isNull (attachedTo _target)} +{isNull (attachedTo _target)} && +{(vehicle _target) == _target} From d3db5ad2ed58f1fbffd0de40f68b414134963a27 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 24 Aug 2015 00:07:40 -0500 Subject: [PATCH 065/137] Cleanup --- addons/captives/functions/fnc_canLoadCaptive.sqf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index 254f0de693..a59c2e3be6 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * [player, bob] call ACE_captives_fnc_canLoadCaptive + * [player, bob, car] call ACE_captives_fnc_canLoadCaptive * * Public: No */ @@ -32,13 +32,12 @@ if ((isNull _target) || {(vehicle _target) != _target} || {!(_target getVariable if (isNull _vehicle) then { //Looking at a captive unit, search for nearby vehicles with valid seats: { - // if (([_x] call FUNC(findEmptyNonFFVCargoSeat)) != -1) exitWith { if ((_x emptyPositions "cargo") > 0) exitWith { _vehicle = _x; }; } forEach (nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]); } else { - // if (([_vehicle] call FUNC(findEmptyNonFFVCargoSeat)) == -1) then { + //We have a vehicle picked, make sure it has empty seats: if ((_vehicle emptyPositions "cargo") == 0) then { _vehicle = objNull; }; From 0fa10045d2507bf4a42247c5576c28d804a460af Mon Sep 17 00:00:00 2001 From: gienkov Date: Mon, 24 Aug 2015 14:35:15 +0200 Subject: [PATCH 066/137] pl translation of spectator --- addons/spectator/stringtable.xml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 895a279844..e6cf1d7fd4 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -27,6 +27,7 @@ Playable Units + Grywalne jednostki All units @@ -103,6 +104,7 @@ Spectator Units + Obserwatorzy Spectator Controls @@ -135,6 +137,7 @@ Free Camera + Kamera swobodna Camera Forward @@ -174,12 +177,15 @@ Speed Boost + Przyśpieszenie kamery Focus on Unit + Skup na jednostce Interface + Interfejs Toggle Interface @@ -211,6 +217,7 @@ Camera Attributes + Atrybuty kamery Next Camera @@ -238,21 +245,27 @@ Adjust Zoom + Reguluj zoom Adjust Speed + Reguluj prędkość Increment Zoom + Reguluj zoom (krok) Increment Speed + Reguluj prędkość (krok) Reset Zoom + Resetuj zoom Reset Speed + Resetuj prędkość - + \ No newline at end of file From 288457d3665d43125a60ccfff56f6b462205ad8f Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Mon, 24 Aug 2015 17:43:02 +0200 Subject: [PATCH 067/137] fix --- addons/spectator/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index e6cf1d7fd4..5c24224b72 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -104,7 +104,7 @@ Spectator Units - Obserwatorzy + Jednostki obserwatora Spectator Controls @@ -268,4 +268,4 @@ Resetuj prędkość - \ No newline at end of file + From 2af486ab6b09f8e42c33eb1c45d7f4a6a53baae4 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Tue, 25 Aug 2015 18:34:10 +0200 Subject: [PATCH 068/137] Update Main Config File --- addons/main/config.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/addons/main/config.cpp b/addons/main/config.cpp index 9399b14279..52f2c6d4ac 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -541,26 +541,28 @@ class CfgPatches { "a3_weapons_f_vests", "a3data", "map_vr", - "extended_eventhandlers", "CBA_UI", "CBA_XEH", "CBA_XEH_A3" + "extended_eventhandlers", "CBA_UI", "CBA_XEH", "CBA_XEH_A3", + "ace_common" }; - author[] = {"ACE Team"}; - authorUrl = ""; - versionDesc = "A.C.E."; - versionAct = QUOTE(['MAIN',_this] execVM '\z\ace\addons\main\about.sqf';); + author[] = {ELSTRING(common,ACETeam)}; + authorUrl = "http://ace3mod.com/"; + versionDesc = "ACE3"; + //versionAct = QUOTE(['MAIN',_this] execVM '\z\ace\addons\main\about.sqf';); + versionAct = ""; VERSION_CONFIG; }; }; class CfgMods { class PREFIX { - dir = "@ACE"; - name = "Core - Advanced Combat Environment"; + dir = "@ACE3"; + name = "Advanced Combat Environment 3"; picture = "A3\Ui_f\data\Logos\arma3_expansion_alpha_ca"; hidePicture = "true"; hideName = "true"; actionName = "Website"; - action = "http://ace.dev-heaven.net"; - description = "Bugtracker: "; + action = "http://ace3mod.com/"; + description = "Bugtracker: https://github.com/acemod/ACE3/issues"; }; }; From ea79e5ef0153f85db1484dee65e8d932b5d9bdd1 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 19:30:34 +0200 Subject: [PATCH 069/137] Updated DE readme, Fixed issues, ACE to ACE3 --- AUTHORS.txt | 2 +- README.md | 18 +++++++++--------- documentation/README_DE.md | 32 +++++++++++++++++++------------- documentation/README_PL.md | 28 +++++++++++----------------- 4 files changed, 40 insertions(+), 40 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 62329d7c1d..0a9322e924 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1,4 +1,4 @@ -# ACE 3 CONTRIBUTOR LIST +# ACE3 CONTRIBUTOR LIST # If you contributed, but are not listed here, contact me: # koffeinflummi@gmail.com # diff --git a/README.md b/README.md index 2739ce55be..73e959d4ea 100644 --- a/README.md +++ b/README.md @@ -3,19 +3,19 @@

- ACE3 version + ACE3 Version - ACE3 download + ACE3 Download - ACE3 issues + ACE3 Issues - - BIF thread + + BIF Thread - ACE3 license + ACE3 License

Requires the latest version of CBA A3. Visit us on Facebook | YouTube | Twitter | Reddit

@@ -24,7 +24,7 @@ The project is entirely **open-source** and all contributions are welcome. Feel free to maintain your own custom version, so long as the changes you make are open to the public in accordance with the GNU General Public License ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). -The mod is **built modularly**, so almost any included PBO can be easily removed from the configuration. This way, a team can maintain its own tailored version of ACE by simply excluding any components they don't need, or those possibly in conflict with other add-ons. Modules themselves, e.g. the medical system, also include various customization options, allowing mission designers to tweak the overall experience. +The mod is **built modularly**, so almost any included PBO can be easily removed from the configuration. This way, a team can maintain its own tailored version of ACE3 by simply excluding any components they don't need, or those possibly in conflict with other mods. Modules themselves, e.g. the medical system, also include various customization options, allowing mission designers to tweak the overall experience. ### Core features * Brand new 3D interaction/action system @@ -66,7 +66,7 @@ If you installed ACE3 but have trouble understanding how it all works, or where * [Getting started](http://ace3mod.com/wiki/user/getting-started.html) #### Contributing -You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address. +You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address. Please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues) to report a bug, propose a feature, or suggest changes to the existing ones. See also: * [How to report an issue](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) @@ -74,4 +74,4 @@ Please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues) to report #### Testing & building To help us test the latest development changes, download our master branch ([directly](https://github.com/acemod/ACE3/archive/master.zip), or [with git](https://help.github.com/articles/fetching-a-remote/)), then assemble a test build: -* [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – step-by-step instructions on how to properly setup and build a version of ACE for testing purposes. +* [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – step-by-step instructions on how to properly setup and build a version of ACE3 for testing purposes. diff --git a/documentation/README_DE.md b/documentation/README_DE.md index 0b5ca4d0ef..6d932e2450 100644 --- a/documentation/README_DE.md +++ b/documentation/README_DE.md @@ -1,27 +1,31 @@

- +

- ACE version + ACE3 Version - - ACE download + + ACE3 Download - ACE issues + ACE3 Issues + + + BIF Thread - ACE license + ACE3 License

Benötigt eine Aktuelle Version von CBA A3 | BIF thread

+

Requires the latest version of CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

**ACE3** ist ein Gemeinschaftsprojekt der sich zusammengeschlossenen Moddinggruppen von **ACE2**, **AGM** und **CSE** mit dem Ziel den Realismus und die Spieltiefe von Arma 3 zu steigern. Da die MOD vollkommen als **open-source** Projekt gestaltet ist, steht es jedem frei Änderungen vorzuschlagen, oder seine eigene, modifizierte Version zu erstellen, solange diese ebenfalls der Öffentlichkeit zugänglich ist und mit GNU General Public License übereinstimmt. (Weitere Informationen ist der Lizenzdatei in diesem Projekt entnehmbar) -Die Mod ist **modular gestaltet** — beinahe jede PBO kann entfernt werden, sodass jede Gemeinschaft ihre eigene Version der Mod unterhalten kann. Dies kann zum Beispiel einige Funktionalitäten ausschließen, da das Feature nicht gewünscht ist, oder es mit einer anderen MOD in Konflikt gerät etc. .Ebenfalls können viele Einstellungen vom Missionsersteller vorgenommen werden (u.a. am medizinischem System), sodass eine individuelle Erfahrung gewährleistet wird. +Die Mod ist **modular gestaltet** — beinahe jede PBO kann entfernt werden, sodass jede Gemeinschaft ihre eigene Version der Mod unterhalten kann. Dies kann zum Beispiel einige Funktionalitäten ausschließen, da das Feature nicht gewünscht ist, oder es mit einer anderen MOD in Konflikt gerät etc. .Ebenfalls können viele Einstellungen vom Missionsersteller vorgenommen werden (u.a. am medizinischem System), sodass eine individuelle Erfahrung gewährleistet wird. ### Features * Verbessertes medizinisches System @@ -35,14 +39,16 @@ Die Mod ist **modular gestaltet** — beinahe jede PBO kann entfernt werden, so ***und noch viel mehr...*** #### Anleitungen -Du hast ACE3 installiert, hast aber keine Ahnung was und wie alles funktioniert und wo sich was befindet? [Erste Schritte](https://github.com/acemod/ACE3/blob/master/documentation/user/getting-started.md). +Du hast ACE3 installiert, hast aber keine Ahnung was und wie alles funktioniert und wo sich was befindet? +* [Erste Schritte](http://ace3mod.com/wiki/user/getting-started.html). #### Mitwirken -Wenn du bei der Entwicklung der MOD mithelfen möchtest, so kannst du dies tun, indem du nach Fehlern Ausschau hältst, oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" einfach dieses Archiv (bzw. repository) und erstelle deine "Pull-Request", welche von anderen Entwicklern und Beiträgern überprüft wird. Bitte trage dich dabei in "AUTHORS.txt" mit deinem Nutzernamen und einer gütligen Email-Adresse ein. +Wenn du bei der Entwicklung der MOD mithelfen möchtest, so kannst du dies tun, indem du nach Fehlern Ausschau hältst, oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" einfach dieses Archiv (bzw. repository) und erstelle deine "Pull-Request", welche von anderen Entwicklern und Beiträgern überprüft wird. Bitte trage dich dabei in [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) mit deinem Nutzernamen und einer gütligen Email-Adresse ein. -Um einen Fehler oder ein Feature zu melden bzw. ein bereits Bestehendes zu ändern - nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). +Um einen Fehler oder ein Feature zu melden bzw. ein bereits Bestehendes zu ändern - nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). Besuche auch: +* [Wie kann ich ein Problem melden](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) +* [Wie kann ich ein Feature Request erstellen](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) #### Testen & MOD erstellen -Wenn du die neusten Entwicklungen erleben und uns dabei helfen möchtest bestehende Fehler zu entdecken, lade dir einfach die "Master Branch" herunter. Entweder nutzt du Git - wenn die Schritte bekannt sind - oder du lädst es dir direkt über [diesen Link] (https://github.com/acemod/ACE3/archive/master.zip) herunter. - -Wie du deine eigene Entwicklungsumgebung und eine Testversion von ACE erstellst folge [dieser Anleitung](https://github.com/acemod/ACE3/blob/master/documentation/development/setting-up-the-development-environment.md). +Wenn du die neusten Entwicklungen erleben und uns dabei helfen möchtest bestehende Fehler zu entdecken, lade dir einfach die "Master Branch" herunter. Entweder nutzt du [Git](https://help.github.com/articles/fetching-a-remote/) - wenn die Schritte bekannt sind - oder du lädst es dir direkt über [diesen Link](https://github.com/acemod/ACE3/archive/master.zip) herunter. +Wie du deine eigene Entwicklungsumgebung und eine Testversion von ACE3 erstellst folge [dieser Anleitung](https://github.com/acemod/ACE3/blob/master/documentation/development/setting-up-the-development-environment.md). diff --git a/documentation/README_PL.md b/documentation/README_PL.md index 4d4c36a619..157a254742 100644 --- a/documentation/README_PL.md +++ b/documentation/README_PL.md @@ -1,27 +1,21 @@

- +

- ACE wersja + ACE3 Wersja - - ACE pobierz + + ACE3 Pobierz - ACE zagadnienia + ACE3 Zagadnienia - - Temat BIF + + Temat BIF - ACE licencja + ACE3 Licencja

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

@@ -30,7 +24,7 @@ Projekt ten jest całkowicie **otwarty źródłowo** i wszelki wkład w rozwój jest mile widziany. Możesz bez przeszkód prowadzić swoją własną dostosowaną wersję, o ile zmiany jakie wprowadzisz będą otwarte dla publiki zgodnie z GNU General Public License ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). -Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczony plik PBO może zostać łatwo usunięty z konfiguracji. Dzięki temu, grupa może prowadzić własną, dostosowaną do siebie, wersję ACE wyłączając elementy, których nie potrzebują, lub które po prostu nie działają z innymi addonami. Moduły same w sobie np. system medyczny, posiadają wiele możliwości konfiguracji, pozwalając mission designerom dostosować ogólne doświadczenie z gry. +Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczony plik PBO może zostać łatwo usunięty z konfiguracji. Dzięki temu, grupa może prowadzić własną, dostosowaną do siebie, wersję ACE3 wyłączając elementy, których nie potrzebują, lub które po prostu nie działają z innymi addonami. Moduły same w sobie np. system medyczny, posiadają wiele możliwości konfiguracji, pozwalając mission designerom dostosować ogólne doświadczenie z gry. ### Główne cechy * Całkowicie nowy system akcji/interakcji 3D @@ -72,7 +66,7 @@ Jeżeli zainstalowałeś ACE3 lecz masz problem ze zrozumieniem jak to wszystko * [Wprowadzenie](http://ace3mod.com/wiki/user/getting-started.html) #### Współpraca -Możesz pomóc w rozwoju addonu szukając potencjalnych bugów w naszym kodzie, lub zgłaszając nowe funkcje. Aby wnieść swój wkład do ACE, po prostu zforkuj to repozytorium na swoje konto GitHub i zgłoś swoje pull requesty do przeglądu przez innych współpracowników. Pamiętaj, aby dodać siebie do listy autorów każdego PBO jakie edytujesz oraz do pliku ['AUTHORS.txt'](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) dodając także swój adres e-mail. +Możesz pomóc w rozwoju addonu szukając potencjalnych bugów w naszym kodzie, lub zgłaszając nowe funkcje. Aby wnieść swój wkład do ACE3, po prostu zforkuj to repozytorium na swoje konto GitHub i zgłoś swoje pull requesty do przeglądu przez innych współpracowników. Pamiętaj, aby dodać siebie do listy autorów każdego PBO jakie edytujesz oraz do pliku ['AUTHORS.txt'](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) dodając także swój adres e-mail. Używaj naszego [Issue Tracker-a](https://github.com/acemod/ACE3/issues) aby zgłaszać bugi, proponować nowe funkcje lub sugerować zmiany do aktualnie istniejących. Zobacz także: * [Jak zgłosić bug-a](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) @@ -80,4 +74,4 @@ Używaj naszego [Issue Tracker-a](https://github.com/acemod/ACE3/issues) aby zg #### Testowanie i budowanie Aby pomóc nam w testowaniu najnowszych zmian rozwojowych, pobierz nasz master branch ([bezpośrednio](https://github.com/acemod/ACE3/archive/master.zip), lub [korzystając z git](https://help.github.com/articles/fetching-a-remote/)), a następnie złóż testowego build-a: -* [Konfiguracja środowiska do testów](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE do celów testowych. +* [Konfiguracja środowiska do testów](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. From 8d291705513c249af323eef1dc2ff85a0ceb0d05 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Tue, 25 Aug 2015 19:33:10 +0200 Subject: [PATCH 070/137] fixing Spelling Issues Change from DEBUG_SETTINGS_CORE to DEBUG_SETTINGS_MAIN --- addons/main/config.cpp | 33 ++++---------------------------- addons/main/script_component.hpp | 6 +++--- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/addons/main/config.cpp b/addons/main/config.cpp index 52f2c6d4ac..241183bc87 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -541,50 +541,25 @@ class CfgPatches { "a3_weapons_f_vests", "a3data", "map_vr", - "extended_eventhandlers", "CBA_UI", "CBA_XEH", "CBA_XEH_A3", - "ace_common" + "extended_eventhandlers", "CBA_UI", "CBA_XEH", "CBA_XEH_A3" }; - author[] = {ELSTRING(common,ACETeam)}; + author[] = {ECSTRING(common,ACETeam)}; authorUrl = "http://ace3mod.com/"; versionDesc = "ACE3"; - //versionAct = QUOTE(['MAIN',_this] execVM '\z\ace\addons\main\about.sqf';); - versionAct = ""; VERSION_CONFIG; }; }; class CfgMods { class PREFIX { - dir = "@ACE3"; + dir = "@ace"; name = "Advanced Combat Environment 3"; picture = "A3\Ui_f\data\Logos\arma3_expansion_alpha_ca"; hidePicture = "true"; hideName = "true"; actionName = "Website"; action = "http://ace3mod.com/"; - description = "Bugtracker: https://github.com/acemod/ACE3/issues"; - }; -}; - -class CfgSettings { - class CBA { - class Versioning { - class PREFIX { - level = DEFAULT_VERSIONING_LEVEL; - handler = "ace_common_fnc_mismatch"; - class Dependencies { - CBA[]={"cba_main", {1,0,0}, "true"}; - XEH[]={"cba_xeh", {1,0,0}, "true"}; - }; - }; - }; - /* - class Registry { - class PREFIX { - removed[] = {}; - }; - }; - */ + description = "Issue Tracker: https://github.com/acemod/ACE3/issues"; }; }; diff --git a/addons/main/script_component.hpp b/addons/main/script_component.hpp index 9a18b78a7a..3ac1d0b7aa 100644 --- a/addons/main/script_component.hpp +++ b/addons/main/script_component.hpp @@ -3,12 +3,12 @@ // #define DEBUG_MODE_FULL -#ifdef DEBUG_ENABLED_CORE +#ifdef DEBUG_ENABLED_MAIN #define DEBUG_MODE_FULL #endif -#ifdef DEBUG_SETTINGS_CORE - #define DEBUG_SETTINGS DEBUG_SETTINGS_CORE +#ifdef DEBUG_SETTINGS_MAIN + #define DEBUG_SETTINGS DEBUG_SETTINGS_MAIN #endif #include "\z\ace\addons\main\script_macros.hpp" From 393b69f20c2d3a400805ce5ac9e200f94d7dbc68 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 19:48:18 +0200 Subject: [PATCH 071/137] Readme * to - --- README.md | 68 +++++++++++++++++++------------------- documentation/README_DE.md | 24 +++++++------- documentation/README_PL.md | 68 +++++++++++++++++++------------------- 3 files changed, 80 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 73e959d4ea..827e7d2562 100644 --- a/README.md +++ b/README.md @@ -27,51 +27,51 @@ The project is entirely **open-source** and all contributions are welcome. Feel The mod is **built modularly**, so almost any included PBO can be easily removed from the configuration. This way, a team can maintain its own tailored version of ACE3 by simply excluding any components they don't need, or those possibly in conflict with other mods. Modules themselves, e.g. the medical system, also include various customization options, allowing mission designers to tweak the overall experience. ### Core features -* Brand new 3D interaction/action system -* Performance and reliability framework -* Focus on modularity and customization -* New flexible client and server settings & configuration -* Improved medical system with various levels (basic/advanced) focus on gameplay/realism -* Proper & consistent network-synced weather -* Wind and weather-based ballistics -* Captivity system -* Explosives system, including different trigger types -* Map screen improvements – marker placement and map tools -* Advanced missile guidance and laser designation +- Brand new 3D interaction/action system +- Performance and reliability framework +- Focus on modularity and customization +- New flexible client and server settings & configuration +- Improved medical system with various levels (basic/advanced) focus on gameplay/realism +- Proper & consistent network-synced weather +- Wind and weather-based ballistics +- Captivity system +- Explosives system, including different trigger types +- Map screen improvements – marker placement and map tools +- Advanced missile guidance and laser designation #### Additional features -* Carrying and dragging -* Realistic names for vehicles and weapons -* A fire control system (FCS) for armored vehicles and helicopters -* Realistic ballistics/FCS calculated in C/C++ extensions -* Backblast area and overpressure simulation -* Disposable launchers -* Realistic G-forces -* Vehicle locking -* Realistic night and thermal vision modes -* Magazine repacking -* Realistic weapon overheating mechanic -* Combat deafness (temporary loss of hearing) simulation -* Improved ragdoll physics -* Improved interactions for AARs and ammo bearers -* Adjustable sniper scopes -* No idle animation with lowered weapon -* No talking player avatar -* Jumping over obstacles, climbing over walls and cutting down fences -* Vector, MicroDAGR and Kestrel devices
+- Carrying and dragging +- Realistic names for vehicles and weapons +- A fire control system (FCS) for armored vehicles and helicopters +- Realistic ballistics/FCS calculated in C/C++ extensions +- Backblast area and overpressure simulation +- Disposable launchers +- Realistic G-forces +- Vehicle locking +- Realistic night and thermal vision modes +- Magazine repacking +- Realistic weapon overheating mechanic +- Combat deafness (temporary loss of hearing) simulation +- Improved ragdoll physics +- Improved interactions for AARs and ammo bearers +- Adjustable sniper scopes +- No idle animation with lowered weapon +- No talking player avatar +- Jumping over obstacles, climbing over walls and cutting down fences +- Vector, MicroDAGR and Kestrel devices
***and much more...*** ### Guides & how-tos If you installed ACE3 but have trouble understanding how it all works, or where to start, read this first: -* [Getting started](http://ace3mod.com/wiki/user/getting-started.html) +- [Getting started](http://ace3mod.com/wiki/user/getting-started.html) #### Contributing You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address. Please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues) to report a bug, propose a feature, or suggest changes to the existing ones. See also: -* [How to report an issue](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) -* [How to make a feature request](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [How to report an issue](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) +- [How to make a feature request](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) #### Testing & building To help us test the latest development changes, download our master branch ([directly](https://github.com/acemod/ACE3/archive/master.zip), or [with git](https://help.github.com/articles/fetching-a-remote/)), then assemble a test build: -* [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – step-by-step instructions on how to properly setup and build a version of ACE3 for testing purposes. +- [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – step-by-step instructions on how to properly setup and build a version of ACE3 for testing purposes. diff --git a/documentation/README_DE.md b/documentation/README_DE.md index 6d932e2450..f70562e389 100644 --- a/documentation/README_DE.md +++ b/documentation/README_DE.md @@ -28,26 +28,26 @@ Da die MOD vollkommen als **open-source** Projekt gestaltet ist, steht es jedem Die Mod ist **modular gestaltet** — beinahe jede PBO kann entfernt werden, sodass jede Gemeinschaft ihre eigene Version der Mod unterhalten kann. Dies kann zum Beispiel einige Funktionalitäten ausschließen, da das Feature nicht gewünscht ist, oder es mit einer anderen MOD in Konflikt gerät etc. .Ebenfalls können viele Einstellungen vom Missionsersteller vorgenommen werden (u.a. am medizinischem System), sodass eine individuelle Erfahrung gewährleistet wird. ### Features -* Verbessertes medizinisches System -* Logistik System: U.a. Transport und Fahrzeugreparatur -* Sprengstoffsystem mit unterschiedlichen Zündern -* Gefangenensystem -* Reale Namen für Arma 3 Fahrzeuge und Waffen -* Realistisches, ballistisches Verhalten (Wind und Luftfeuchtigkeit) -* Simulation der Rückstrahlzone -* Ein Feuerleitsystem für gepanzerte Fahrzeuge und Hubschrauber - ***und noch viel mehr...*** +- Verbessertes medizinisches System +- Logistik System: U.a. Transport und Fahrzeugreparatur +- Sprengstoffsystem mit unterschiedlichen Zündern +- Gefangenensystem +- Reale Namen für Arma 3 Fahrzeuge und Waffen +- Realistisches, ballistisches Verhalten (Wind und Luftfeuchtigkeit) +- Simulation der Rückstrahlzone +- Ein Feuerleitsystem für gepanzerte Fahrzeuge und Hubschrauber +***und noch viel mehr...*** #### Anleitungen Du hast ACE3 installiert, hast aber keine Ahnung was und wie alles funktioniert und wo sich was befindet? -* [Erste Schritte](http://ace3mod.com/wiki/user/getting-started.html). +- [Erste Schritte](http://ace3mod.com/wiki/user/getting-started.html). #### Mitwirken Wenn du bei der Entwicklung der MOD mithelfen möchtest, so kannst du dies tun, indem du nach Fehlern Ausschau hältst, oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" einfach dieses Archiv (bzw. repository) und erstelle deine "Pull-Request", welche von anderen Entwicklern und Beiträgern überprüft wird. Bitte trage dich dabei in [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) mit deinem Nutzernamen und einer gütligen Email-Adresse ein. Um einen Fehler oder ein Feature zu melden bzw. ein bereits Bestehendes zu ändern - nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). Besuche auch: -* [Wie kann ich ein Problem melden](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) -* [Wie kann ich ein Feature Request erstellen](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Wie kann ich ein Problem melden](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) +- [Wie kann ich ein Feature Request erstellen](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) #### Testen & MOD erstellen Wenn du die neusten Entwicklungen erleben und uns dabei helfen möchtest bestehende Fehler zu entdecken, lade dir einfach die "Master Branch" herunter. Entweder nutzt du [Git](https://help.github.com/articles/fetching-a-remote/) - wenn die Schritte bekannt sind - oder du lädst es dir direkt über [diesen Link](https://github.com/acemod/ACE3/archive/master.zip) herunter. diff --git a/documentation/README_PL.md b/documentation/README_PL.md index 157a254742..56a9c72caa 100644 --- a/documentation/README_PL.md +++ b/documentation/README_PL.md @@ -27,51 +27,51 @@ Projekt ten jest całkowicie **otwarty źródłowo** i wszelki wkład w rozwój Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczony plik PBO może zostać łatwo usunięty z konfiguracji. Dzięki temu, grupa może prowadzić własną, dostosowaną do siebie, wersję ACE3 wyłączając elementy, których nie potrzebują, lub które po prostu nie działają z innymi addonami. Moduły same w sobie np. system medyczny, posiadają wiele możliwości konfiguracji, pozwalając mission designerom dostosować ogólne doświadczenie z gry. ### Główne cechy -* Całkowicie nowy system akcji/interakcji 3D -* Wydajna i niezawodna struktura -* Skupienie na modułowości i customizacji -* Elastyczny system ustawień i konfiguracji opcji u klienta i serwera -* Ulepszony system medyczny z różnymi stopniami zaawansowania (podstawowy/rozszerzony) skupiony na grywalności i realizmowi -* Prawidłowa i spójna synchronizowana pogoda -* Balistyka oparta na warunkach pogodowych i wietrze -* Możliwość brania jeńców -* Rozszerzony system ładunków wybuchowych, włączając w to użycie różnego rodzaju zapalników -* Ulepszenia mapy - stawianie markerów i przybory mapy -* Zaawansowane naprowadzanie rakiet i wskazywanie laserem +- Całkowicie nowy system akcji/interakcji 3D +- Wydajna i niezawodna struktura +- Skupienie na modułowości i customizacji +- Elastyczny system ustawień i konfiguracji opcji u klienta i serwera +- Ulepszony system medyczny z różnymi stopniami zaawansowania (podstawowy/rozszerzony) skupiony na grywalności i realizmowi +- Prawidłowa i spójna synchronizowana pogoda +- Balistyka oparta na warunkach pogodowych i wietrze +- Możliwość brania jeńców +- Rozszerzony system ładunków wybuchowych, włączając w to użycie różnego rodzaju zapalników +- Ulepszenia mapy - stawianie markerów i przybory mapy +- Zaawansowane naprowadzanie rakiet i wskazywanie laserem #### Dodatkowe cechy -* Przeciąganie i przenoszenie -* Realistyczne nazwy pojazdów i broni -* System kontroli ognia (SKO) dla pojazdów opancerzonych oraz śmigłowców -* Realistyczna balistyka/SKO obliczana w rozszerzeniach C/C++ -* Symulacja strefy backblastu i podciśnienia -* Jednorazowe wyrzutnie -* Realistyczne siły G -* Zamykanie pojazdów na kluczyk -* Realistyczne tryby termowizji oraz noktowizji -* Przepakowywanie magazynków -* Realistyczna mechanika przegrzewania broni -* Symulacja głuchoty bitewnej (tymczasowej utraty słuchu) -* Ulepszona fizyka ragdoll -* Ulepszona interakcja dla asystentów i amunicyjnych -* Regulowane celowniki snajperskie -* Usunięte animacje bezczynności z opuszczoną bronią -* Usunięte głosy awatara gracza -* Skakanie przez przeszkody, wspinanie się na ściany i przecinanie płotów -* Urządzenia Vector, MicroDAGR, Kestrel
+- Przeciąganie i przenoszenie +- Realistyczne nazwy pojazdów i broni +- System kontroli ognia (SKO) dla pojazdów opancerzonych oraz śmigłowców +- Realistyczna balistyka/SKO obliczana w rozszerzeniach C/C++ +- Symulacja strefy backblastu i podciśnienia +- Jednorazowe wyrzutnie +- Realistyczne siły G +- Zamykanie pojazdów na kluczyk +- Realistyczne tryby termowizji oraz noktowizji +- Przepakowywanie magazynków +- Realistyczna mechanika przegrzewania broni +- Symulacja głuchoty bitewnej (tymczasowej utraty słuchu) +- Ulepszona fizyka ragdoll +- Ulepszona interakcja dla asystentów i amunicyjnych +- Regulowane celowniki snajperskie +- Usunięte animacje bezczynności z opuszczoną bronią +- Usunięte głosy awatara gracza +- Skakanie przez przeszkody, wspinanie się na ściany i przecinanie płotów +- Urządzenia Vector, MicroDAGR, Kestrel
***i wiele wiele więcej...*** ### Poradniki i instrukcje Jeżeli zainstalowałeś ACE3 lecz masz problem ze zrozumieniem jak to wszystko działa, lub gdzie zacząć, zacznij od przeczytania tego: -* [Wprowadzenie](http://ace3mod.com/wiki/user/getting-started.html) +- [Wprowadzenie](http://ace3mod.com/wiki/user/getting-started.html) #### Współpraca Możesz pomóc w rozwoju addonu szukając potencjalnych bugów w naszym kodzie, lub zgłaszając nowe funkcje. Aby wnieść swój wkład do ACE3, po prostu zforkuj to repozytorium na swoje konto GitHub i zgłoś swoje pull requesty do przeglądu przez innych współpracowników. Pamiętaj, aby dodać siebie do listy autorów każdego PBO jakie edytujesz oraz do pliku ['AUTHORS.txt'](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) dodając także swój adres e-mail. Używaj naszego [Issue Tracker-a](https://github.com/acemod/ACE3/issues) aby zgłaszać bugi, proponować nowe funkcje lub sugerować zmiany do aktualnie istniejących. Zobacz także: -* [Jak zgłosić bug-a](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) -* [Jak zgłosić feature request-a](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Jak zgłosić bug-a](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) +- [Jak zgłosić feature request-a](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) #### Testowanie i budowanie Aby pomóc nam w testowaniu najnowszych zmian rozwojowych, pobierz nasz master branch ([bezpośrednio](https://github.com/acemod/ACE3/archive/master.zip), lub [korzystając z git](https://help.github.com/articles/fetching-a-remote/)), a następnie złóż testowego build-a: -* [Konfiguracja środowiska do testów](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. +- [Konfiguracja środowiska do testów](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. From 8498589920345e650aec7b4efeeab67b499e738f Mon Sep 17 00:00:00 2001 From: gienkov Date: Wed, 26 Aug 2015 02:37:51 +0200 Subject: [PATCH 072/137] pulse zero on limb with TQ on --- addons/medical/functions/fnc_actionCheckPulse.sqf | 5 +++-- .../medical/functions/fnc_actionCheckPulseLocal.sqf | 12 ++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf index fd96321e8f..134cf7dd20 100644 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ b/addons/medical/functions/fnc_actionCheckPulse.sqf @@ -14,7 +14,8 @@ #include "script_component.hpp" -private ["_caller","_target"]; +private ["_caller","_target","_selectionName"]; _caller = _this select 0; _target = _this select 1; -[[_caller, _target], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +_selectionName = _this select 2; +[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ \ No newline at end of file diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index d759bf1bc8..d79c96549b 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -14,10 +14,10 @@ #include "script_component.hpp" -private ["_caller", "_unit", "_heartRateOutput", "_heartRate", "_logOutPut"]; +private ["_caller", "_unit", "_selectionName", "_heartRateOutput", "_heartRate", "_logOutPut"]; _caller = _this select 0; _unit = _this select 1; - +_selectionName = _this select 2; _heartRate = _unit getvariable [QGVAR(heartRate), 80]; if (!alive _unit) then { @@ -46,9 +46,13 @@ if (_heartRate > 1.0) then { }; }; +if ([_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)) then { + _heartRateOutput = LSTRING(Check_Pulse_Output_5); + _logOutPut = LSTRING(Check_Pulse_None); + }; + ["displayTextStructured", [_caller], [[_heartRateOutput, [_unit] call EFUNC(common,getName), round(_heartRate)], 1.5, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { [_unit,"activity", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); - [_unit,"quick_view", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); -}; +}; \ No newline at end of file From 5a9817322b1cb5a86c6bfe2b03f60ec802105524 Mon Sep 17 00:00:00 2001 From: gienkov Date: Wed, 26 Aug 2015 02:39:34 +0200 Subject: [PATCH 073/137] remove tabs --- addons/medical/functions/fnc_actionCheckPulseLocal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index d79c96549b..96b1bc698c 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -49,7 +49,7 @@ if (_heartRate > 1.0) then { if ([_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)) then { _heartRateOutput = LSTRING(Check_Pulse_Output_5); _logOutPut = LSTRING(Check_Pulse_None); - }; +}; ["displayTextStructured", [_caller], [[_heartRateOutput, [_unit] call EFUNC(common,getName), round(_heartRate)], 1.5, _caller]] call EFUNC(common,targetEvent); From c3af5e81e7bff1d707df311883fc2728b35b591b Mon Sep 17 00:00:00 2001 From: gienkov Date: Wed, 26 Aug 2015 02:41:12 +0200 Subject: [PATCH 074/137] fix my error --- addons/medical/functions/fnc_actionCheckPulseLocal.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index 96b1bc698c..54b03ec247 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -55,4 +55,5 @@ if ([_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)) then { if (_logOutPut != "") then { [_unit,"activity", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); + [_unit,"quick_view", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); }; \ No newline at end of file From cae5f828fbb507eada6ae336ee0f2a96cfd89cb7 Mon Sep 17 00:00:00 2001 From: gienkov Date: Wed, 26 Aug 2015 02:51:05 +0200 Subject: [PATCH 075/137] run check only on arms --- addons/medical/functions/fnc_actionCheckPulseLocal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index 54b03ec247..adbafd004f 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -46,7 +46,7 @@ if (_heartRate > 1.0) then { }; }; -if ([_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)) then { +if (_selectionName in ["hand_l","hand_r"] && [_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)) then { _heartRateOutput = LSTRING(Check_Pulse_Output_5); _logOutPut = LSTRING(Check_Pulse_None); }; From b8a29bfd442aeee64454065c3a0f1c0fdd5c5184 Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Wed, 26 Aug 2015 03:00:43 +0200 Subject: [PATCH 076/137] @jokoho482 suggestion --- addons/medical/functions/fnc_actionCheckPulseLocal.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index adbafd004f..f719aad2d8 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -46,7 +46,7 @@ if (_heartRate > 1.0) then { }; }; -if (_selectionName in ["hand_l","hand_r"] && [_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)) then { +if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { _heartRateOutput = LSTRING(Check_Pulse_Output_5); _logOutPut = LSTRING(Check_Pulse_None); }; @@ -56,4 +56,4 @@ if (_selectionName in ["hand_l","hand_r"] && [_unit, _selectionName] call FUNC(h if (_logOutPut != "") then { [_unit,"activity", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); [_unit,"quick_view", LSTRING(Check_Pulse_Log),[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); -}; \ No newline at end of file +}; From f1e5ca24bfdacd7102c577d83b1dced11249e4a9 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 06:11:52 +0200 Subject: [PATCH 077/137] Updated required CBA files --- .../cba/addons/main/script_macros_common.hpp | 1159 ++++++++++------- tools/cba/addons/xeh/init_pre.sqf | 310 ++--- tools/cba/addons/xeh/script_xeh.hpp | 45 +- 3 files changed, 839 insertions(+), 675 deletions(-) diff --git a/tools/cba/addons/main/script_macros_common.hpp b/tools/cba/addons/main/script_macros_common.hpp index 1385d7b389..78893db662 100644 --- a/tools/cba/addons/main/script_macros_common.hpp +++ b/tools/cba/addons/main/script_macros_common.hpp @@ -1,11 +1,11 @@ /* - Header: script_macros_common.hpp + Header: script_macros_common.hpp - Description: - A general set of useful macro functions for use by CBA itself or by any module that uses CBA. + Description: + A general set of useful macro functions for use by CBA itself or by any module that uses CBA. - Authors: - Sickboy and Spooner + Authors: + Sickboy and Spooner */ /* **************************************************** @@ -40,27 +40,27 @@ */ #ifndef MAINPREFIX - #define MAINPREFIX x + #define MAINPREFIX x #endif #ifndef SUBPREFIX - #define SUBPREFIX addons + #define SUBPREFIX addons #endif #ifndef MAINLOGIC - #define MAINLOGIC main + #define MAINLOGIC main #endif #ifndef VERSION - #define VERSION 0 + #define VERSION 0 #endif #ifndef VERSION_AR - #define VERSION_AR VERSION + #define VERSION_AR VERSION #endif #ifndef VERSION_CONFIG - #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION); versionAr[] = {VERSION_AR} + #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION); versionAr[] = {VERSION_AR} #endif #define ADDON DOUBLES(PREFIX,COMPONENT) @@ -72,50 +72,50 @@ Group: Debugging /* ------------------------------------------- Macros: DEBUG_MODE_x - Managing debugging based on debug level. + Managing debugging based on debug level. - According to the *highest* level of debugging that has been defined *before* script_macros_common.hpp is included, - only the appropriate debugging commands will be functional. With no level explicitely defined, assume DEBUG_MODE_NORMAL. + According to the *highest* level of debugging that has been defined *before* script_macros_common.hpp is included, + only the appropriate debugging commands will be functional. With no level explicitely defined, assume DEBUG_MODE_NORMAL. - DEBUG_MODE_FULL - Full debugging output. - DEBUG_MODE_NORMAL - All debugging except and (Default setting if none specified). - DEBUG_MODE_MINIMAL - Only and enabled. + DEBUG_MODE_FULL - Full debugging output. + DEBUG_MODE_NORMAL - All debugging except and (Default setting if none specified). + DEBUG_MODE_MINIMAL - Only and enabled. Examples: - In order to turn on full debugging for a single file, - (begin example) - // Top of individual script file. - #define DEBUG_MODE_FULL - #include "script_component.hpp" - (end) + In order to turn on full debugging for a single file, + (begin example) + // Top of individual script file. + #define DEBUG_MODE_FULL + #include "script_component.hpp" + (end) - In order to force minimal debugging for a single component, - (begin example) - // Top of addons\\script_component.hpp - // Ensure that any FULL and NORMAL setting from the individual files are undefined and MINIMAL is set. - #ifdef DEBUG_MODE_FULL - #undef DEBUG_MODE_FULL - #endif - #ifdef DEBUG_MODE_NORMAL - #undef DEBUG_MODE_NORMAL - #endif - #ifndef DEBUG_MODE_MINIMAL - #define DEBUG_MODE_MINIMAL - #endif - #include "script_macros.hpp" - (end) + In order to force minimal debugging for a single component, + (begin example) + // Top of addons\\script_component.hpp + // Ensure that any FULL and NORMAL setting from the individual files are undefined and MINIMAL is set. + #ifdef DEBUG_MODE_FULL + #undef DEBUG_MODE_FULL + #endif + #ifdef DEBUG_MODE_NORMAL + #undef DEBUG_MODE_NORMAL + #endif + #ifndef DEBUG_MODE_MINIMAL + #define DEBUG_MODE_MINIMAL + #endif + #include "script_macros.hpp" + (end) - In order to turn on full debugging for a whole addon, - (begin example) - // Top of addons\main\script_macros.hpp - #ifndef DEBUG_MODE_FULL - #define DEBUG_MODE_FULL - #endif - #include "\x\cba\addons\main\script_macros_common.hpp" - (end) + In order to turn on full debugging for a whole addon, + (begin example) + // Top of addons\main\script_macros.hpp + #ifndef DEBUG_MODE_FULL + #define DEBUG_MODE_FULL + #endif + #include "\x\cba\addons\main\script_macros_common.hpp" + (end) Author: - Spooner + Spooner ------------------------------------------- */ // If DEBUG_MODE_FULL, then also enable DEBUG_MODE_NORMAL. @@ -142,20 +142,20 @@ Author: /* ------------------------------------------- Macro: LOG() - Log a timestamped message into the RPT log. + Log a timestamped message into the RPT log. - Only run if or higher is defined. + Only run if or higher is defined. Parameters: - MESSAGE - Message to record [String] + MESSAGE - Message to record [String] Example: - (begin example) - LOG("Initiated clog-dancing simulator."); - (end) + (begin example) + LOG("Initiated clog-dancing simulator."); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #ifdef DEBUG_MODE_FULL #define LOG(MESSAGE) [THIS_FILE_, __LINE__, MESSAGE] call CBA_fnc_log @@ -165,20 +165,20 @@ Author: /* ------------------------------------------- Macro: WARNING() - Record a timestamped, non-critical error in the RPT log. + Record a timestamped, non-critical error in the RPT log. - Only run if or higher is defined. + Only run if or higher is defined. Parameters: - MESSAGE - Message to record [String] + MESSAGE - Message to record [String] Example: - (begin example) - WARNING("This function has been deprecated. Please don't use it in future!"); - (end) + (begin example) + WARNING("This function has been deprecated. Please don't use it in future!"); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #ifdef DEBUG_MODE_NORMAL #define WARNING(MESSAGE) [THIS_FILE_, __LINE__, ('WARNING: ' + MESSAGE)] call CBA_fnc_log @@ -188,152 +188,171 @@ Author: /* ------------------------------------------- Macro: ERROR() - Record a timestamped, critical error in the RPT log. + Record a timestamped, critical error in the RPT log. - The heading is "ERROR" (use for a specific title). + The heading is "ERROR" (use for a specific title). - TODO: Popup an error dialog & throw an exception. + TODO: Popup an error dialog & throw an exception. Parameters: - MESSAGE - Message to record [String] + MESSAGE - Message to record [String] Example: - (begin example) - ERROR("Value not found","value of frog not found in config ...yada...yada..."); - (end) + (begin example) + ERROR("Value not found","value of frog not found in config ...yada...yada..."); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define ERROR(MESSAGE) \ - [THIS_FILE_, __LINE__, "ERROR", MESSAGE] call CBA_fnc_error; + [THIS_FILE_, __LINE__, "ERROR", MESSAGE] call CBA_fnc_error; /* ------------------------------------------- Macro: ERROR_WITH_TITLE() - Record a timestamped, critical error in the RPT log. + Record a timestamped, critical error in the RPT log. - The title can be specified (in the heading is always just "ERROR") - Newlines (\n) in the MESSAGE will be put on separate lines. + The title can be specified (in the heading is always just "ERROR") + Newlines (\n) in the MESSAGE will be put on separate lines. - TODO: Popup an error dialog & throw an exception. + TODO: Popup an error dialog & throw an exception. Parameters: - TITLE - Title of error message [String] - MESSAGE - Body of error message [String] + TITLE - Title of error message [String] + MESSAGE - Body of error message [String] Example: - (begin example) - ERROR_WITH_TITLE("Value not found","Value of frog not found in config ...yada...yada..."); - (end) + (begin example) + ERROR_WITH_TITLE("Value not found","Value of frog not found in config ...yada...yada..."); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define ERROR_WITH_TITLE(TITLE,MESSAGE) \ - [THIS_FILE_, __LINE__, TITLE, MESSAGE] call CBA_fnc_error; + [THIS_FILE_, __LINE__, TITLE, MESSAGE] call CBA_fnc_error; + +/* ------------------------------------------- +Macro: MESSAGE_WITH_TITLE() + Record a single line, timestamped log entry in the RPT log. + +Parameters: + TITLE - Title of log message [String] + MESSAGE - Body of message [String] + +Example: + (begin example) + MESSAGE_WITH_TITLE("Value found","Value of frog found in config "); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define MESSAGE_WITH_TITLE(TITLE,MESSAGE) \ + [THIS_FILE_, __LINE__, TITLE + ': ' + (MESSAGE)] call CBA_fnc_log; /* ------------------------------------------- Macro: RETNIL() - If a variable is undefined, return the value nil. Otherwise, return the - variable itself. + If a variable is undefined, return the value nil. Otherwise, return the + variable itself. Parameters: - VARIABLE - the variable to check + VARIABLE - the variable to check Example: - (begin example) - // _var is undefined - hintSilent format ["_var=%1", RETNIL(_var) ]; // "_var=any" - (end example) + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETNIL(_var) ]; // "_var=any" + (end example) Author: - Alef (see CBA issue #8514) + Alef (see CBA issue #8514) ------------------------------------------- */ #define RETNIL(VARIABLE) if (isNil{VARIABLE}) then {nil} else {VARIABLE} /* ------------------------------------------- Macros: TRACE_n() - Log a message and 1-8 variables to the RPT log. + Log a message and 1-8 variables to the RPT log. - Only run if is defined. + Only run if is defined. - TRACE_1(MESSAGE,A) - Log 1 variable. - TRACE_2(MESSAGE,A,B) - Log 2 variables. - TRACE_3(MESSAGE,A,B,C) - Log 3 variables. - TRACE_4(MESSAGE,A,B,C,D) - Log 4 variables. - TRACE_5(MESSAGE,A,B,C,D,E) - Log 5 variables. - TRACE_6(MESSAGE,A,B,C,D,E,F) - Log 6 variables. - TRACE_7(MESSAGE,A,B,C,D,E,F,G) - Log 7 variables. - TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) - Log 8 variables. - TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) - Log 9 variables. + TRACE_1(MESSAGE,A) - Log 1 variable. + TRACE_2(MESSAGE,A,B) - Log 2 variables. + TRACE_3(MESSAGE,A,B,C) - Log 3 variables. + TRACE_4(MESSAGE,A,B,C,D) - Log 4 variables. + TRACE_5(MESSAGE,A,B,C,D,E) - Log 5 variables. + TRACE_6(MESSAGE,A,B,C,D,E,F) - Log 6 variables. + TRACE_7(MESSAGE,A,B,C,D,E,F,G) - Log 7 variables. + TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) - Log 8 variables. + TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) - Log 9 variables. Parameters: - MESSAGE - Message to add to the trace [String] - A..H - Variable names to log values of [Any] + MESSAGE - Message to add to the trace [String] + A..H - Variable names to log values of [Any] Example: - (begin example) - TRACE_3("After takeoff",_vehicle player,getPos (_vehicle player), getPosASL (_vehicle player)); - (end) + (begin example) + TRACE_3("After takeoff",_vehicle player,getPos (_vehicle player), getPosASL (_vehicle player)); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define PFORMAT_1(MESSAGE,A) \ - format ['%1: A=%2', MESSAGE, RETNIL(A)] + format ['%1: A=%2', MESSAGE, RETNIL(A)] #define PFORMAT_2(MESSAGE,A,B) \ - format ['%1: A=%2, B=%3', MESSAGE, RETNIL(A), RETNIL(B)] + format ['%1: A=%2, B=%3', MESSAGE, RETNIL(A), RETNIL(B)] #define PFORMAT_3(MESSAGE,A,B,C) \ - format ['%1: A=%2, B=%3, C=%4', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C)] + format ['%1: A=%2, B=%3, C=%4', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C)] #define PFORMAT_4(MESSAGE,A,B,C,D) \ - format ['%1: A=%2, B=%3, C=%4, D=%5', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D)] + format ['%1: A=%2, B=%3, C=%4, D=%5', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D)] #define PFORMAT_5(MESSAGE,A,B,C,D,E) \ - format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E)] + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E)] #define PFORMAT_6(MESSAGE,A,B,C,D,E,F) \ - format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F)] + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F)] #define PFORMAT_7(MESSAGE,A,B,C,D,E,F,G) \ - format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G)] + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G)] #define PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H) \ - format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H)] + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H)] #define PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I) \ - format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I)] + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I)] #ifdef DEBUG_MODE_FULL #define TRACE_1(MESSAGE,A) \ - [THIS_FILE_, __LINE__, PFORMAT_1(MESSAGE,A)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_1(MESSAGE,A)] call CBA_fnc_log #define TRACE_2(MESSAGE,A,B) \ - [THIS_FILE_, __LINE__, PFORMAT_2(MESSAGE,A,B)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_2(MESSAGE,A,B)] call CBA_fnc_log #define TRACE_3(MESSAGE,A,B,C) \ - [THIS_FILE_, __LINE__, PFORMAT_3(MESSAGE,A,B,C)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_3(MESSAGE,A,B,C)] call CBA_fnc_log #define TRACE_4(MESSAGE,A,B,C,D) \ - [THIS_FILE_, __LINE__, PFORMAT_4(MESSAGE,A,B,C,D)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_4(MESSAGE,A,B,C,D)] call CBA_fnc_log #define TRACE_5(MESSAGE,A,B,C,D,E) \ - [THIS_FILE_, __LINE__, PFORMAT_5(MESSAGE,A,B,C,D,E)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_5(MESSAGE,A,B,C,D,E)] call CBA_fnc_log #define TRACE_6(MESSAGE,A,B,C,D,E,F) \ - [THIS_FILE_, __LINE__, PFORMAT_6(MESSAGE,A,B,C,D,E,F)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_6(MESSAGE,A,B,C,D,E,F)] call CBA_fnc_log #define TRACE_7(MESSAGE,A,B,C,D,E,F,G) \ - [THIS_FILE_, __LINE__, PFORMAT_7(MESSAGE,A,B,C,D,E,F,G)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_7(MESSAGE,A,B,C,D,E,F,G)] call CBA_fnc_log #define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) \ - [THIS_FILE_, __LINE__, PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H)] call CBA_fnc_log #define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) \ - [THIS_FILE_, __LINE__, PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I)] call CBA_fnc_log + [THIS_FILE_, __LINE__, PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I)] call CBA_fnc_log #else @@ -360,37 +379,37 @@ Group: General #define QUOTE(var1) #var1 #ifdef MODULAR - #define COMPONENT_T DOUBLES(t,COMPONENT) - #define COMPONENT_M DOUBLES(m,COMPONENT) - #define COMPONENT_S DOUBLES(s,COMPONENT) - #define COMPONENT_C DOUBLES(c,COMPONENT) - #define COMPONENT_F COMPONENT_C + #define COMPONENT_T DOUBLES(t,COMPONENT) + #define COMPONENT_M DOUBLES(m,COMPONENT) + #define COMPONENT_S DOUBLES(s,COMPONENT) + #define COMPONENT_C DOUBLES(c,COMPONENT) + #define COMPONENT_F COMPONENT_C #else - #define COMPONENT_T COMPONENT - #define COMPONENT_M COMPONENT - #define COMPONENT_S COMPONENT - #define COMPONENT_F COMPONENT - #define COMPONENT_C COMPONENT + #define COMPONENT_T COMPONENT + #define COMPONENT_M COMPONENT + #define COMPONENT_S COMPONENT + #define COMPONENT_F COMPONENT + #define COMPONENT_C COMPONENT #endif /* ------------------------------------------- Macro: INC() Description: - Increase a number by one. + Increase a number by one. Parameters: - VAR - Variable to increment [Number] + VAR - Variable to increment [Number] Example: - (begin example) - _counter = 0; - INC(_counter); - // _counter => 1 - (end) + (begin example) + _counter = 0; + INC(_counter); + // _counter => 1 + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define INC(var) var = (var) + 1 @@ -398,20 +417,20 @@ Author: Macro: DEC() Description: - Decrease a number by one. + Decrease a number by one. Parameters: - VAR - Variable to decrement [Number] + VAR - Variable to decrement [Number] Example: - (begin example) - _counter = 99; - DEC(_counter); - // _counter => 98 - (end) + (begin example) + _counter = 99; + DEC(_counter); + // _counter => 98 + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define DEC(var) var = (var) - 1 @@ -419,27 +438,27 @@ Author: Macro: ADD() Description: - Add a value to a variable. Variable and value should be both Numbers or both Strings. + Add a value to a variable. Variable and value should be both Numbers or both Strings. Parameters: - VAR - Variable to add to [Number or String] - VALUE - Value to add [Number or String] + VAR - Variable to add to [Number or String] + VALUE - Value to add [Number or String] Examples: - (begin example) - _counter = 2; - ADD(_counter,3); - // _counter => 5 - (end) - (begin example) - _str = "hello"; - ADD(_str," "); - ADD(_str,"Fred"); - // _str => "hello Fred" - (end) + (begin example) + _counter = 2; + ADD(_counter,3); + // _counter => 5 + (end) + (begin example) + _str = "hello"; + ADD(_str," "); + ADD(_str,"Fred"); + // _str => "hello Fred" + (end) Author: - Sickboy + Sickboy ------------------------------------------- */ #define ADD(var1,var2) var1 = (var1) + (var2) @@ -447,18 +466,18 @@ Author: Macro: SUB() Description: - Subtract a value from a number variable. VAR and VALUE should both be Numbers. + Subtract a value from a number variable. VAR and VALUE should both be Numbers. Parameters: - VAR - Variable to subtract from [Number] - VALUE - Value to subtract [Number] + VAR - Variable to subtract from [Number] + VALUE - Value to subtract [Number] Examples: - (begin example) - _numChickens = 2; - SUB(_numChickens,3); - // _numChickens => -1 - (end) + (begin example) + _numChickens = 2; + SUB(_numChickens,3); + // _numChickens => -1 + (end) ------------------------------------------- */ #define SUB(var1,var2) var1 = (var1) - (var2) @@ -466,24 +485,24 @@ Examples: Macro: REM() Description: - Remove an element from an array each time it occurs. + Remove an element from an array each time it occurs. - This recreates the entire array, so use BIS_fnc_removeIndex if modification of the original array is required - or if only one of the elements that matches ELEMENT needs to be removed. + This recreates the entire array, so use BIS_fnc_removeIndex if modification of the original array is required + or if only one of the elements that matches ELEMENT needs to be removed. Parameters: - ARRAY - Array to modify [Array] - ELEMENT - Element to remove [Any] + ARRAY - Array to modify [Array] + ELEMENT - Element to remove [Any] Examples: - (begin example) - _array = [1, 2, 3, 4, 3, 8]; - REM(_array,3); - // _array = [1, 2, 4, 8]; - (end) + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + REM(_array,3); + // _array = [1, 2, 4, 8]; + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define REM(var1,var2) SUB(var1,[var2]) @@ -491,21 +510,21 @@ Author: Macro: PUSH() Description: - Appends a single value onto the end of an ARRAY. Change is made to the ARRAY itself, not creating a new array. + Appends a single value onto the end of an ARRAY. Change is made to the ARRAY itself, not creating a new array. Parameters: - ARRAY - Array to push element onto [Array] - ELEMENT - Element to push [Any] + ARRAY - Array to push element onto [Array] + ELEMENT - Element to push [Any] Examples: - (begin example) - _fish = ["blue", "green", "smelly"]; - PUSH(_fish,"monkey-flavoured"); - // _fish => ["blue", "green", "smelly", "monkey-flavoured"] - (end) + (begin example) + _fish = ["blue", "green", "smelly"]; + PUSH(_fish,"monkey-flavoured"); + // _fish => ["blue", "green", "smelly", "monkey-flavoured"] + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define PUSH(var1,var2) (var1) pushBack (var2) @@ -513,27 +532,27 @@ Author: Macro: ISNILS() Description: - Sets a variable with a value, but only if it is undefined. + Sets a variable with a value, but only if it is undefined. Parameters: - VARIABLE - Variable to set [Any, not nil] - DEFAULT_VALUE - Value to set VARIABLE to if it is undefined [Any, not nil] + VARIABLE - Variable to set [Any, not nil] + DEFAULT_VALUE - Value to set VARIABLE to if it is undefined [Any, not nil] Examples: - (begin example) - // _fish is undefined - ISNILS(_fish,0); - // _fish => 0 - (end) - (begin example) - _fish = 12; - // ...later... - ISNILS(_fish,0); - // _fish => 12 - (end) + (begin example) + // _fish is undefined + ISNILS(_fish,0); + // _fish => 0 + (end) + (begin example) + _fish = 12; + // ...later... + ISNILS(_fish,0); + // _fish => 12 + (end) Author: - Sickboy + Sickboy ------------------------------------------- */ #define ISNILS(VARIABLE,DEFAULT_VALUE) if (isNil #VARIABLE) then { ##VARIABLE = ##DEFAULT_VALUE } #define ISNILS2(var1,var2,var3,var4) ISNILS(TRIPLES(var1,var2,var3),var4) @@ -550,14 +569,14 @@ Author: #define GETVARMAINS(var1,var2) GETVARS(var1,MAINLOGIC,var2) #ifndef PATHTO_SYS - #define PATHTO_SYS(var1,var2,var3) \MAINPREFIX\##var1\SUBPREFIX\##var2\##var3.sqf + #define PATHTO_SYS(var1,var2,var3) \MAINPREFIX\##var1\SUBPREFIX\##var2\##var3.sqf #endif #ifndef PATHTOF_SYS - #define PATHTOF_SYS(var1,var2,var3) \MAINPREFIX\##var1\SUBPREFIX\##var2\##var3 + #define PATHTOF_SYS(var1,var2,var3) \MAINPREFIX\##var1\SUBPREFIX\##var2\##var3 #endif #ifndef PATHTOF2_SYS - #define PATHTOF2_SYS(var1,var2,var3) MAINPREFIX\##var1\SUBPREFIX\##var2\##var3 + #define PATHTOF2_SYS(var1,var2,var3) MAINPREFIX\##var1\SUBPREFIX\##var2\##var3 #endif #define PATHTO_R(var1) PATHTOF2_SYS(PREFIX,COMPONENT_C,var1) @@ -606,7 +625,7 @@ Author: #define CACHE_DIS(var1) (!isNil "CBA_RECOMPILE" || CACHE_DIS_SYS(configFile,var1) || CACHE_DIS_SYS(missionConfigFile,var1)) #ifndef DEBUG_SETTINGS - #define DEBUG_SETTINGS [false, true, false] + #define DEBUG_SETTINGS [false, true, false] #endif #define MSG_INIT QUOTE(Initializing: ADDON version: VERSION) @@ -625,34 +644,34 @@ Author: #define VERSIONING_SYS(var1) class CfgSettings \ { \ - class CBA \ - { \ - class Versioning \ - { \ - class var1 \ - { \ - }; \ - }; \ - }; \ + class CBA \ + { \ + class Versioning \ + { \ + class var1 \ + { \ + }; \ + }; \ + }; \ }; #define VERSIONING VERSIONING_SYS(PREFIX) /* ------------------------------------------- Macro: GVAR() - Get full variable identifier for a global variable owned by this component. + Get full variable identifier for a global variable owned by this component. Parameters: - VARIABLE - Partial name of global variable owned by this component [Any]. + VARIABLE - Partial name of global variable owned by this component [Any]. Example: - (begin example) - GVAR(frog) = 12; - // In SPON_FrogDancing component, equivalent to SPON_FrogDancing_frog = 12 - (end) + (begin example) + GVAR(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_FrogDancing_frog = 12 + (end) Author: - Sickboy + Sickboy ------------------------------------------- */ #define GVAR(var1) DOUBLES(ADDON,var1) #define EGVAR(var1,var2) DOUBLES(DOUBLES(PREFIX,var1),var2) @@ -660,19 +679,19 @@ Author: /* ------------------------------------------- Macro: GVARMAIN() - Get full variable identifier for a global variable owned by this addon. + Get full variable identifier for a global variable owned by this addon. Parameters: - VARIABLE - Partial name of global variable owned by this addon [Any]. + VARIABLE - Partial name of global variable owned by this addon [Any]. Example: - (begin example) - GVARMAIN(frog) = 12; - // In SPON_FrogDancing component, equivalent to SPON_frog = 12 - (end) + (begin example) + GVARMAIN(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_frog = 12 + (end) Author: - Sickboy + Sickboy ------------------------------------------- */ #define GVARMAIN(var1) GVARMAINS(PREFIX,var1) // TODO: What's this? @@ -693,7 +712,7 @@ Author: #define PREP(var1) TRIPLES(ADDON,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' #define PREPMAIN(var1) TRIPLES(PREFIX,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' #else - #define PREP(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(ADDON,fnc,var1)'] call SLX_XEH_COMPILE_NEW + #define PREP(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(ADDON,fnc,var1)'] call SLX_XEH_COMPILE_NEW #define PREPMAIN(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(PREFIX,fnc,var1)'] call SLX_XEH_COMPILE_NEW #endif @@ -703,27 +722,27 @@ Author: #define EFUNC(var1,var2) FUNC_INNER(var1,var2) #ifndef PRELOAD_ADDONS - #define PRELOAD_ADDONS class CfgAddons \ + #define PRELOAD_ADDONS class CfgAddons \ { \ - class PreloadAddons \ - { \ - class ADDON \ - { \ - list[]={ QUOTE(ADDON) }; \ - }; \ - }; \ + class PreloadAddons \ + { \ + class ADDON \ + { \ + list[]={ QUOTE(ADDON) }; \ + }; \ + }; \ } #endif /* ------------------------------------------- Macros: ARG_#() - Select from list of array arguments + Select from list of array arguments Parameters: - VARIABLE(1-8) - elements for the list + VARIABLE(1-8) - elements for the list Author: - Rommel + Rommel ------------------------------------------- */ #define ARG_1(A,B) ((A) select (B)) #define ARG_2(A,B,C) (ARG_1(ARG_1(A,B),C)) @@ -736,14 +755,14 @@ Author: /* ------------------------------------------- Macros: ARR_#() - Create list from arguments. Useful for working around , in macro parameters. - 1-8 arguments possible. + Create list from arguments. Useful for working around , in macro parameters. + 1-8 arguments possible. Parameters: - VARIABLE(1-8) - elements for the list + VARIABLE(1-8) - elements for the list Author: - Nou + Nou ------------------------------------------- */ #define ARR_1(ARG1) ARG1 #define ARR_2(ARG1,ARG2) ARG1, ARG2 @@ -756,15 +775,15 @@ Author: /* ------------------------------------------- Macros: FORMAT_#(STR, ARG1) - Format - Useful for working around , in macro parameters. - 1-8 arguments possible. + Format - Useful for working around , in macro parameters. + 1-8 arguments possible. Parameters: - STRING - string used by format - VARIABLE(1-8) - elements for usage in format + STRING - string used by format + VARIABLE(1-8) - elements for usage in format Author: - Nou & Sickboy + Nou & Sickboy ------------------------------------------- */ #define FORMAT_1(STR,ARG1) format[STR, ARG1] #define FORMAT_2(STR,ARG1,ARG2) format[STR, ARG1, ARG2] @@ -781,32 +800,32 @@ Author: /* ------------------------------------------- Macros: IS_x() - Checking the data types of variables. + Checking the data types of variables. - IS_ARRAY() - Array - IS_BOOL() - Boolean - IS_BOOLEAN() - UI display handle(synonym for ) - IS_CODE() - Code block (i.e a compiled function) - IS_CONFIG() - Configuration - IS_CONTROL() - UI control handle. - IS_DISPLAY() - UI display handle. - IS_FUNCTION() - A compiled function (synonym for ) - IS_GROUP() - Group. - IS_INTEGER() - Is a number a whole number? - IS_LOCATION() - World location. - IS_NUMBER() - A floating point number (synonym for ) - IS_OBJECT() - World object. - IS_SCALAR() - Floating point number. - IS_SCRIPT() - A script handle (as returned by execVM and spawn commands). - IS_SIDE() - Game side. - IS_STRING() - World object. - IS_TEXT() - Structured text. + IS_ARRAY() - Array + IS_BOOL() - Boolean + IS_BOOLEAN() - UI display handle(synonym for ) + IS_CODE() - Code block (i.e a compiled function) + IS_CONFIG() - Configuration + IS_CONTROL() - UI control handle. + IS_DISPLAY() - UI display handle. + IS_FUNCTION() - A compiled function (synonym for ) + IS_GROUP() - Group. + IS_INTEGER() - Is a number a whole number? + IS_LOCATION() - World location. + IS_NUMBER() - A floating point number (synonym for ) + IS_OBJECT() - World object. + IS_SCALAR() - Floating point number. + IS_SCRIPT() - A script handle (as returned by execVM and spawn commands). + IS_SIDE() - Game side. + IS_STRING() - World object. + IS_TEXT() - Structured text. Parameters: - VARIABLE - Variable to check if it is of a particular type [Any, not nil] + VARIABLE - Variable to check if it is of a particular type [Any, not nil] Author: - Spooner + Spooner ------------------------------------------- */ #define IS_META_SYS(VAR,TYPE) (if (isNil {VAR}) then { false } else { (typeName (VAR)) == TYPE }) #define IS_ARRAY(VAR) IS_META_SYS(VAR,"ARRAY") @@ -829,107 +848,120 @@ Author: #define IS_INTEGER(VAR) if ( IS_SCALAR(VAR) ) then { (floor(VAR) == (VAR)) } else { false } #define IS_NUMBER(VAR) IS_SCALAR(VAR) +#define FLOAT_TO_STRING(num) (str parseNumber (str (_this%_this) + str floor abs _this) + "." + (str (abs _this-floor abs _this) select [2]) + "0") + /* ------------------------------------------- Macro: SCRIPT() - Sets name of script (relies on PREFIX and COMPONENT values being #defined). + Sets name of script (relies on PREFIX and COMPONENT values being #defined). Parameters: - NAME - Name of script [Indentifier] + NAME - Name of script [Indentifier] Example: - (begin example) - SCRIPT(eradicateMuppets); - (end) + (begin example) + SCRIPT(eradicateMuppets); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define SCRIPT(NAME) \ - scriptName 'PREFIX\COMPONENT\NAME' + scriptName 'PREFIX\COMPONENT\NAME' /* ------------------------------------------- Macros: EXPLODE_n() - Splitting an ARRAY into a number of variables (A, B, C, etc). + DEPRECATED - Use param/params commands added in Arma 3 1.48 - Note that this NOT does make the created variables private. - _PVT variants do. + Splitting an ARRAY into a number of variables (A, B, C, etc). - EXPLODE_1(ARRAY,A,B) - Split a 1-element array into separate variable. - EXPLODE_2(ARRAY,A,B) - Split a 2-element array into separate variables. - EXPLODE_3(ARRAY,A,B,C) - Split a 3-element array into separate variables. - EXPLODE_4(ARRAY,A,B,C,D) - Split a 4-element array into separate variables. - EXPLODE_5(ARRAY,A,B,C,D,E) - Split a 5-element array into separate variables. - EXPLODE_6(ARRAY,A,B,C,D,E,F) - Split a 6-element array into separate variables. - EXPLODE_7(ARRAY,A,B,C,D,E,F,G) - Split a 7-element array into separate variables. - EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) - Split a 8-element array into separate variables. - EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) - Split a 9-element array into separate variables. + Note that this NOT does make the created variables private. + _PVT variants do. + + EXPLODE_1(ARRAY,A,B) - Split a 1-element array into separate variable. + EXPLODE_2(ARRAY,A,B) - Split a 2-element array into separate variables. + EXPLODE_3(ARRAY,A,B,C) - Split a 3-element array into separate variables. + EXPLODE_4(ARRAY,A,B,C,D) - Split a 4-element array into separate variables. + EXPLODE_5(ARRAY,A,B,C,D,E) - Split a 5-element array into separate variables. + EXPLODE_6(ARRAY,A,B,C,D,E,F) - Split a 6-element array into separate variables. + EXPLODE_7(ARRAY,A,B,C,D,E,F,G) - Split a 7-element array into separate variables. + EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) - Split a 8-element array into separate variables. + EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) - Split a 9-element array into separate variables. Parameters: - ARRAY - Array to read from [Array] - A..H - Names of variables to set from array [Identifier] + ARRAY - Array to read from [Array] + A..H - Names of variables to set from array [Identifier] Example: - (begin example) - _array = ["fred", 156.8, 120.9]; - EXPLODE_3(_array,_name_height,_weight); - (end) + (begin example) + _array = ["fred", 156.8, 120.9]; + EXPLODE_3(_array,_name,_height,_weight); + (end) Author: - Spooner + Spooner ------------------------------------------- */ -#define EXPLODE_1_SYS(ARRAY,A) A = if (IS_ARRAY((ARRAY))) then { (ARRAY) select 0 } else { ARRAY } +#define EXPLODE_1_SYS(ARRAY,A) A = ARRAY param [0] #define EXPLODE_1(ARRAY,A) EXPLODE_1_SYS(ARRAY,A); TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) -#define EXPLODE_1_PVT(ARRAY,A) \ - private #A; \ - EXPLODE_1(ARRAY,A) +#define EXPLODE_1_PVT(ARRAY,A) ARRAY params [#A]; TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) -#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS(ARRAY,A); B = (ARRAY) select 1 +#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS(ARRAY,A); B = ARRAY param [1] #define EXPLODE_2(ARRAY,A,B) EXPLODE_2_SYS(ARRAY,A,B); TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) -#define EXPLODE_2_PVT(ARRAY,A,B) \ - private [#A,#B]; \ - EXPLODE_2(ARRAY,A,B) +#define EXPLODE_2_PVT(ARRAY,A,B) ARRAY params [#A,#B]; TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) -#define EXPLODE_3_SYS(ARRAY,A,B,C) EXPLODE_2_SYS(ARRAY,A,B); C = (ARRAY) select 2 +#define EXPLODE_3_SYS(ARRAY,A,B,C) EXPLODE_2_SYS(ARRAY,A,B); C = ARRAY param [2] #define EXPLODE_3(ARRAY,A,B,C) EXPLODE_3_SYS(ARRAY,A,B,C); TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) -#define EXPLODE_3_PVT(ARRAY,A,B,C) \ - private [#A,#B,#C]; \ - EXPLODE_3(ARRAY,A,B,C) - -#define EXPLODE_4_SYS(ARRAY,A,B,C,D) EXPLODE_3_SYS(ARRAY,A,B,C); D = (ARRAY) select 3 +#define EXPLODE_3_PVT(ARRAY,A,B,C) ARRAY params [#A,#B,#C]; TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) + +#define EXPLODE_4_SYS(ARRAY,A,B,C,D) EXPLODE_3_SYS(ARRAY,A,B,C); D = ARRAY param [3] #define EXPLODE_4(ARRAY,A,B,C,D) EXPLODE_4_SYS(ARRAY,A,B,C,D); TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) -#define EXPLODE_4_PVT(ARRAY,A,B,C,D) \ - private [#A,#B,#C,#D]; \ - EXPLODE_4(ARRAY,A,B,C,D) +#define EXPLODE_4_PVT(ARRAY,A,B,C,D) ARRAY params [#A,#B,#C,#D]; TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) -#define EXPLODE_5_SYS(ARRAY,A,B,C,D,E) EXPLODE_4_SYS(ARRAY,A,B,C,D); E = (ARRAY) select 4 +#define EXPLODE_5_SYS(ARRAY,A,B,C,D,E) EXPLODE_4_SYS(ARRAY,A,B,C,D); E = ARRAY param [4] #define EXPLODE_5(ARRAY,A,B,C,D,E) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) -#define EXPLODE_5_PVT(ARRAY,A,B,C,D,E) \ - private [#A,#B,#C,#D,#E]; \ - EXPLODE_5(ARRAY,A,B,C,D,E) +#define EXPLODE_5_PVT(ARRAY,A,B,C,D,E) ARRAY params [#A,#B,#C,#D,#E]; TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) -#define EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); F = (ARRAY) select 5 +#define EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); F = ARRAY param [5] #define EXPLODE_6(ARRAY,A,B,C,D,E,F) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) -#define EXPLODE_6_PVT(ARRAY,A,B,C,D,E,F) \ - private [#A,#B,#C,#D,#E,#F]; \ - EXPLODE_6(ARRAY,A,B,C,D,E,F) +#define EXPLODE_6_PVT(ARRAY,A,B,C,D,E,F) ARRAY params [#A,#B,#C,#D,#E,#F]; TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) -#define EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); G = (ARRAY) select 6 +#define EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); G = ARRAY param [6] #define EXPLODE_7(ARRAY,A,B,C,D,E,F,G) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) -#define EXPLODE_7_PVT(ARRAY,A,B,C,D,E,F,G) \ - private [#A,#B,#C,#D,#E,#F,#G]; \ - EXPLODE_7(ARRAY,A,B,C,D,E,F,G) +#define EXPLODE_7_PVT(ARRAY,A,B,C,D,E,F,G) ARRAY params [#A,#B,#C,#D,#E,#F,#G]; TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) -#define EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); H = (ARRAY) select 7 +#define EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); H = ARRAY param [7] #define EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) -#define EXPLODE_8_PVT(ARRAY,A,B,C,D,E,F,G,H) \ - private [#A,#B,#C,#D,#E,#F,#G,#H]; \ - EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) +#define EXPLODE_8_PVT(ARRAY,A,B,C,D,E,F,G,H) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H]; TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) -#define EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); I = (ARRAY) select 8 +#define EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); I = ARRAY param [8] #define EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I); TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) -#define EXPLODE_9_PVT(ARRAY,A,B,C,D,E,F,G,H,I) \ - private [#A,#B,#C,#D,#E,#F,#G,#H,#I]; \ - EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) +#define EXPLODE_9_PVT(ARRAY,A,B,C,D,E,F,G,H,I) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H,#I]; TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: xSTRING() + Get full string identifier from a stringtable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + ADDON is CBA_Balls. + (begin example) + // Localized String (localize command must still be used with it) + LSTRING(Example); // STR_CBA_Balls_Example; + // Config String (note the $) + CSTRING(Example); // $STR_CBA_Balls_Example; + (end) + +Author: + Jonpas +------------------------------------------- */ +#ifndef STRING_MACROS_GUARD +#define STRING_MACROS_GUARD + #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) + #define ELSTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) + #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) +#endif /* ------------------------------------------- @@ -938,37 +970,39 @@ Group: Managing Function Parameters /* ------------------------------------------- Macros: PARAMS_n() - Setting variables based on parameters passed to a function. + DEPRECATED - Use param/params commands added in Arma 3 1.48 - Each parameter is defines as private and set to the appropriate value from _this. + Setting variables based on parameters passed to a function. - PARAMS_1(A) - Get 1 parameter from the _this array (or _this if it's not an array). - PARAMS_2(A,B) - Get 2 parameters from the _this array. - PARAMS_3(A,B,C) - Get 3 parameters from the _this array. - PARAMS_4(A,B,C,D) - Get 4 parameters from the _this array. - PARAMS_5(A,B,C,D,E) - Get 5 parameters from the _this array. - PARAMS_6(A,B,C,D,E,F) - Get 6 parameters from the _this array. - PARAMS_7(A,B,C,D,E,F,G) - Get 7 parameters from the _this array. - PARAMS_8(A,B,C,D,E,F,G,H) - Get 8 parameters from the _this array. + Each parameter is defines as private and set to the appropriate value from _this. + + PARAMS_1(A) - Get 1 parameter from the _this array (or _this if it's not an array). + PARAMS_2(A,B) - Get 2 parameters from the _this array. + PARAMS_3(A,B,C) - Get 3 parameters from the _this array. + PARAMS_4(A,B,C,D) - Get 4 parameters from the _this array. + PARAMS_5(A,B,C,D,E) - Get 5 parameters from the _this array. + PARAMS_6(A,B,C,D,E,F) - Get 6 parameters from the _this array. + PARAMS_7(A,B,C,D,E,F,G) - Get 7 parameters from the _this array. + PARAMS_8(A,B,C,D,E,F,G,H) - Get 8 parameters from the _this array. Parameters: - A..H - Name of variable to read from _this [Identifier] + A..H - Name of variable to read from _this [Identifier] Example: - A function called like this: - (begin example) - [_name,_address,_telephone] call recordPersonalDetails; - (end) - expects 3 parameters and those variables could be initialised at the start of the function definition with: - (begin example) - recordPersonalDetails = { - PARAMS_3(_name,_address,_telephone); - // Rest of function follows... - }; - (end) + A function called like this: + (begin example) + [_name,_address,_telephone] call recordPersonalDetails; + (end) + expects 3 parameters and those variables could be initialised at the start of the function definition with: + (begin example) + recordPersonalDetails = { + PARAMS_3(_name,_address,_telephone); + // Rest of function follows... + }; + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define PARAMS_1(A) EXPLODE_1_PVT(_this,A) #define PARAMS_2(A,B) EXPLODE_2_PVT(_this,A,B) @@ -982,59 +1016,62 @@ Author: /* ------------------------------------------- Macro: DEFAULT_PARAM() - Getting a default function parameter. This may be used together with to have a mix of required and - optional parameters. + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Getting a default function parameter. This may be used together with to have a mix of required and + optional parameters. Parameters: - INDEX - Index of parameter in _this [Integer, 0+] - NAME - Name of the variable to set [Identifier] - DEF_VALUE - Default value to use in case the array is too short or the value at INDEX is nil [Any] + INDEX - Index of parameter in _this [Integer, 0+] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case the array is too short or the value at INDEX is nil [Any] Example: - A function called with optional parameters: - (begin example) - [_name] call myFunction; - [_name, _numberOfLegs] call myFunction; - [_name, _numberOfLegs, _hasAHead] call myFunction; - (end) - 1 required parameter and 2 optional parameters. Those variables could be initialised at the start of the function - definition with: - (begin example) - myFunction = { - PARAMS_1(_name); - DEFAULT_PARAM(1,_numberOfLegs,2); - DEFAULT_PARAM(2,_hasAHead,true); - // Rest of function follows... - }; - (end) + A function called with optional parameters: + (begin example) + [_name] call myFunction; + [_name, _numberOfLegs] call myFunction; + [_name, _numberOfLegs, _hasAHead] call myFunction; + (end) + 1 required parameter and 2 optional parameters. Those variables could be initialised at the start of the function + definition with: + (begin example) + myFunction = { + PARAMS_1(_name); + DEFAULT_PARAM(1,_numberOfLegs,2); + DEFAULT_PARAM(2,_hasAHead,true); + // Rest of function follows... + }; + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define DEFAULT_PARAM(INDEX,NAME,DEF_VALUE) \ - private #NAME; \ - NAME = [RETNIL(_this), INDEX, DEF_VALUE] call CBA_fnc_defaultParam; \ - TRACE_3("DEFAULT_PARAM",INDEX,NAME,DEF_VALUE) + private [#NAME,"_this"]; \ + ISNILS(_this,[]); \ + NAME = _this param [INDEX, DEF_VALUE]; \ + TRACE_3("DEFAULT_PARAM",INDEX,NAME,DEF_VALUE) /* ------------------------------------------- Macro: KEY_PARAM() - Get value from key in _this list, return default when key is not included in list. + Get value from key in _this list, return default when key is not included in list. Parameters: - KEY - Key name [String] - NAME - Name of the variable to set [Identifier] - DEF_VALUE - Default value to use in case key not found [ANY] + KEY - Key name [String] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case key not found [ANY] Example: Author: - Muzzleflash + Muzzleflash ------------------------------------------- */ #define KEY_PARAM(KEY,NAME,DEF_VALUE) \ - private #NAME; \ - NAME = [toLower KEY, toUpper KEY, DEF_VALUE, RETNIL(_this)] call CBA_fnc_getArg; \ - TRACE_3("KEY_PARAM",KEY,NAME,DEF_VALUE) + private #NAME; \ + NAME = [toLower KEY, toUpper KEY, DEF_VALUE, RETNIL(_this)] call CBA_fnc_getArg; \ + TRACE_3("KEY_PARAM",KEY,NAME,DEF_VALUE) /* ------------------------------------------- Group: Assertions @@ -1044,94 +1081,210 @@ Group: Assertions /* ------------------------------------------- Macro: ASSERT_TRUE() - Asserts that a CONDITION is true. When an assertion fails, an error is raised with the given MESSAGE. + Asserts that a CONDITION is true. When an assertion fails, an error is raised with the given MESSAGE. Parameters: - CONDITION - Condition to assert as true [Boolean] - MESSSAGE - Message to display if (A OPERATOR B) is false [String] + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] Example: - (begin example) - ASSERT_TRUE(_frogIsDead,"The frog is alive"); - (end) + (begin example) + ASSERT_TRUE(_frogIsDead,"The frog is alive"); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define ASSERT_TRUE(CONDITION,MESSAGE) \ - if (not (CONDITION)) then \ - { \ - ASSERTION_ERROR('Assertion (CONDITION) failed!\n\n' + (MESSAGE)); \ - } + if (not (CONDITION)) then \ + { \ + ASSERTION_ERROR('Assertion (CONDITION) failed!\n\n' + (MESSAGE)); \ + } /* ------------------------------------------- Macro: ASSERT_FALSE() - Asserts that a CONDITION is false. When an assertion fails, an error is raised with the given MESSAGE. + Asserts that a CONDITION is false. When an assertion fails, an error is raised with the given MESSAGE. Parameters: - CONDITION - Condition to assert as false [Boolean] - MESSSAGE - Message to display if (A OPERATOR B) is true [String] + CONDITION - Condition to assert as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] Example: - (begin example) - ASSERT_FALSE(_frogIsDead,"The frog died"); - (end) + (begin example) + ASSERT_FALSE(_frogIsDead,"The frog died"); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define ASSERT_FALSE(CONDITION,MESSAGE) \ - if (CONDITION) then \ - { \ - ASSERTION_ERROR('Assertion (not (CONDITION)) failed!\n\n' + (MESSAGE)) \ - } + if (CONDITION) then \ + { \ + ASSERTION_ERROR('Assertion (not (CONDITION)) failed!\n\n' + (MESSAGE)) \ + } /* ------------------------------------------- Macro: ASSERT_OP() - Asserts that (A OPERATOR B) is true. When an assertion fails, an error is raised with the given MESSAGE. + Asserts that (A OPERATOR B) is true. When an assertion fails, an error is raised with the given MESSAGE. Parameters: - A - First value [Any] - OPERATOR - Binary operator to use [Operator] - B - Second value [Any] - MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] Example: - (begin example) - ASSERT_OP(_fish,>,5,"Too few fish!"); - (end) + (begin example) + ASSERT_OP(_fish,>,5,"Too few fish!"); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define ASSERT_OP(A,OPERATOR,B,MESSAGE) \ - if (not ((A) OPERATOR (B))) then \ - { \ - ASSERTION_ERROR('Assertion (A OPERATOR B) failed!\n' + 'A: ' + (str (A)) + '\n' + 'B: ' + (str (B)) + "\n\n" + (MESSAGE)); \ - } + if (not ((A) OPERATOR (B))) then \ + { \ + ASSERTION_ERROR('Assertion (A OPERATOR B) failed!\n' + 'A: ' + (str (A)) + '\n' + 'B: ' + (str (B)) + "\n\n" + (MESSAGE)); \ + } /* ------------------------------------------- Macro: ASSERT_DEFINED() - Asserts that a VARIABLE is defined. When an assertion fails, an error is raised with the given MESSAGE.. + Asserts that a VARIABLE is defined. When an assertion fails, an error is raised with the given MESSAGE.. Parameters: - VARIABLE - Variable to test if defined [String or Function]. - MESSAGE - Message to display if variable is undefined [String]. + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. Examples: - (begin example) - ASSERT_DEFINED("_anUndefinedVar","Too few fish!"); - ASSERT_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); - (end) + (begin example) + ASSERT_DEFINED("_anUndefinedVar","Too few fish!"); + ASSERT_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define ASSERT_DEFINED(VARIABLE,MESSAGE) \ - if (isNil VARIABLE) then \ - { \ - ASSERTION_ERROR('Assertion (VARIABLE is defined) failed!\n\n' + (MESSAGE)); \ - } + if (isNil VARIABLE) then \ + { \ + ASSERTION_ERROR('Assertion (VARIABLE is defined) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Unit tests +------------------------------------------- */ +#define TEST_SUCCESS(MESSAGE) MESSAGE_WITH_TITLE("Test OK",MESSAGE) +#define TEST_FAIL(MESSAGE) ERROR_WITH_TITLE("Test FAIL",MESSAGE) + +/* ------------------------------------------- +Macro: TEST_TRUE() + Tests that a CONDITION is true. + If the condition is not true, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + TEST_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_TRUE(CONDITION, MESSAGE) \ + if (CONDITION) then \ + { \ + TEST_SUCCESS('(CONDITION)'); \ + } \ + else \ + { \ + TEST_FAIL('(CONDITION) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_FALSE() + Tests that a CONDITION is false. + If the condition is not false, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to test as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + TEST_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_FALSE(CONDITION, MESSAGE) \ + if (not (CONDITION)) then \ + { \ + TEST_SUCCESS('(not (CONDITION))'); \ + } \ + else \ + { \ + TEST_FAIL('(not (CONDITION)) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_OP() + Tests that (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_OP(A,OPERATOR,B,MESSAGE) \ + if ((A) OPERATOR (B)) then \ + { \ + TEST_SUCCESS('(A OPERATOR B)') \ + } \ + else \ + { \ + TEST_FAIL('(A OPERATOR B)') \ + }; + +/* ------------------------------------------- +Macro: TEST_DEFINED() + Tests that a VARIABLE is defined. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + TEST_DEFINED("_anUndefinedVar","Too few fish!"); + TEST_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_DEFINED(VARIABLE,MESSAGE) \ + if (not isNil VARIABLE) then \ + { \ + TEST_SUCCESS('(' + VARIABLE + ' is defined)'); \ + } \ + else \ + { \ + TEST_FAIL('(' + VARIABLE + ' is not defined)' + (MESSAGE)); \ + } /* ------------------------------------------- Group: Managing Deprecation @@ -1139,117 +1292,117 @@ Group: Managing Deprecation /* ------------------------------------------- Macro: DEPRECATE_SYS() - Allow deprecation of a function that has been renamed. + Allow deprecation of a function that has been renamed. - Replaces an old OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION - (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + Replaces an old OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. - Shows a warning in RPT each time the deprecated function is used, but runs the new function. + Shows a warning in RPT each time the deprecated function is used, but runs the new function. Parameters: - OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] - NEW_FUNCTION - Full name of new function [Function] + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + NEW_FUNCTION - Full name of new function [Function] Example: - (begin example) - // After renaming CBA_fnc_frog as CBA_fnc_fish - DEPRECATE_SYS(CBA_fnc_frog,CBA_fnc_fish); - (end) + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE_SYS(CBA_fnc_frog,CBA_fnc_fish); + (end) Author: - Sickboy + Sickboy ------------------------------------------- */ #define DEPRECATE_SYS(OLD_FUNCTION,NEW_FUNCTION) \ - OLD_FUNCTION = { \ - WARNING('Deprecated function used: OLD_FUNCTION (new: NEW_FUNCTION) in ADDON'); \ - if (isNil "_this") then { call NEW_FUNCTION } else { _this call NEW_FUNCTION }; \ - } + OLD_FUNCTION = { \ + WARNING('Deprecated function used: OLD_FUNCTION (new: NEW_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call NEW_FUNCTION } else { _this call NEW_FUNCTION }; \ + } /* ------------------------------------------- Macro: DEPRECATE() - Allow deprecation of a function, in the current component, that has been renamed. + Allow deprecation of a function, in the current component, that has been renamed. - Replaces an OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION - (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + Replaces an OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. - Shows a warning in RPT each time the deprecated function is used, but runs the new function. + Shows a warning in RPT each time the deprecated function is used, but runs the new function. Parameters: - OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] - NEW_FUNCTION - Name of new function, assuming PREFIX [Function] + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + NEW_FUNCTION - Name of new function, assuming PREFIX [Function] Example: - (begin example) - // After renaming CBA_fnc_frog as CBA_fnc_fish - DEPRECATE(fnc_frog,fnc_fish); - (end) + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE(fnc_frog,fnc_fish); + (end) Author: - Sickboy + Sickboy ------------------------------------------- */ #define DEPRECATE(OLD_FUNCTION,NEW_FUNCTION) \ - DEPRECATE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),DOUBLES(PREFIX,NEW_FUNCTION)) + DEPRECATE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),DOUBLES(PREFIX,NEW_FUNCTION)) /* ------------------------------------------- Macro: OBSOLETE_SYS() - Replace a function that has become obsolete. + Replace a function that has become obsolete. - Replace an obsolete OLD_FUNCTION with a simple COMMAND_FUNCTION, with the intention that anyone - using the function should replace it with the simple command, since the function will be disabled in the future. + Replace an obsolete OLD_FUNCTION with a simple COMMAND_FUNCTION, with the intention that anyone + using the function should replace it with the simple command, since the function will be disabled in the future. - Shows a warning in RPT each time the deprecated function is used, and runs the command function. + Shows a warning in RPT each time the deprecated function is used, and runs the command function. Parameters: - OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] - COMMAND_CODE - Code to replace the old function [Function] + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] Example: - (begin example) - // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: - OBSOLETE_SYS(CBA_fMyWeapon,{ currentWeapon player }); - (end) + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE_SYS(CBA_fMyWeapon,{ currentWeapon player }); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define OBSOLETE_SYS(OLD_FUNCTION,COMMAND_CODE) \ - OLD_FUNCTION = { \ - WARNING('Obsolete function used: (use: OLD_FUNCTION) in ADDON'); \ - if (isNil "_this") then { call COMMAND_CODE } else { _this call COMMAND_CODE }; \ - } + OLD_FUNCTION = { \ + WARNING('Obsolete function used: (use: OLD_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call COMMAND_CODE } else { _this call COMMAND_CODE }; \ + } /* ------------------------------------------- Macro: OBSOLETE() - Replace a function, in the current component, that has become obsolete. + Replace a function, in the current component, that has become obsolete. - Replace an obsolete OLD_FUNCTION (which will have PREFIX_ prepended) with a simple - COMMAND_CODE, with the intention that anyone using the function should replace it with the simple - command. + Replace an obsolete OLD_FUNCTION (which will have PREFIX_ prepended) with a simple + COMMAND_CODE, with the intention that anyone using the function should replace it with the simple + command. - Shows a warning in RPT each time the deprecated function is used. + Shows a warning in RPT each time the deprecated function is used. Parameters: - OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] - COMMAND_CODE - Code to replace the old function [Function] + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] Example: - (begin example) - // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: - OBSOLETE(fMyWeapon,{ currentWeapon player }); - (end) + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE(fMyWeapon,{ currentWeapon player }); + (end) Author: - Spooner + Spooner ------------------------------------------- */ #define OBSOLETE(OLD_FUNCTION,COMMAND_CODE) \ - OBSOLETE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),COMMAND_CODE) + OBSOLETE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),COMMAND_CODE) #define BWC_CONFIG(NAME) class NAME { \ - units[] = {}; \ - weapons[] = {}; \ - requiredVersion = REQUIRED_VERSION; \ - requiredAddons[] = {}; \ - version = VERSION; \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {}; \ + version = VERSION; \ } // XEH Specific diff --git a/tools/cba/addons/xeh/init_pre.sqf b/tools/cba/addons/xeh/init_pre.sqf index 8e6a31f8c8..44b4657aca 100644 --- a/tools/cba/addons/xeh/init_pre.sqf +++ b/tools/cba/addons/xeh/init_pre.sqf @@ -23,10 +23,10 @@ uiNamespace setVariable ["CBA_isCached", CBA_isCached]; if (isNil "SLX_XEH_RECOMPILE") then { SLX_XEH_RECOMPILE = CACHE_DIS(xeh) }; if (!isMultiplayer || {isDedicated} || {CBA_isCached == -1}) then { - uiNamespace setVariable ["SLX_XEH_CACHE_KEYS", []]; - uiNamespace setVariable ["SLX_XEH_CACHE_KEYS2", []]; - uiNamespace setVariable ["SLX_XEH_CACHE_KEYS3", []]; - uiNamespace setVariable ["CBA_CACHE_KEYS", []]; + uiNamespace setVariable ["SLX_XEH_CACHE_KEYS", []]; + uiNamespace setVariable ["SLX_XEH_CACHE_KEYS2", []]; + uiNamespace setVariable ["SLX_XEH_CACHE_KEYS3", []]; + uiNamespace setVariable ["CBA_CACHE_KEYS", []]; }; SLX_XEH_CACHE_KEYS = uiNamespace getVariable "SLX_XEH_CACHE_KEYS"; @@ -46,24 +46,24 @@ SLX_XEH_DisableLogging = isClass(configFile/"CfgPatches"/"Disable_XEH_Logging"); /* CBA_fnc_defaultParam = { - PARAMS_3(_params,_index,_defaultValue); - - private "_value"; - - if (!isNil "_defaultValue") then { - _value = _defaultValue; - }; - - if (!isNil "_params" && {(typeName _params) == "ARRAY"} && {count _params > _index} && {!isNil { _params select _index }}) then { - _value = _params select _index; - }; - - // Return. - if (isNil "_value") then { - nil; - } else { - _value; - }; + params ["_params","_index","_defaultValue"]; + + private "_value"; + + if (!isNil "_defaultValue") then { + _value = _defaultValue; + }; + + if (!isNil "_params" && {(typeName _params) == "ARRAY"} && {count _params > _index} && {!isNil { _params select _index }}) then { + _value = _params select _index; + }; + + // Return. + if (isNil "_value") then { + nil; + } else { + _value; + }; }; */ @@ -74,10 +74,10 @@ if (time > 0) then { XEH_LOG("XEH WARNING: Time > 0; This probably means there a _cfgRespawn = (missionConfigFile/"respawn"); _respawn = false; if ( isNumber(_cfgRespawn) ) then { - _respawn = !(getNumber(_cfgRespawn) in [0, 1, 4, 5]); + _respawn = !(getNumber(_cfgRespawn) in [0, 1, 4, 5]); }; if ( isText(_cfgRespawn) ) then { - _respawn = !(getText(_cfgRespawn) in ["none", "bird", "group", "side"]); + _respawn = !(getText(_cfgRespawn) in ["none", "bird", "group", "side"]); }; SLX_XEH_objects = []; // Temporary array, to track InitPosts at mission initialization @@ -90,81 +90,81 @@ _level = 0; // pre v1.60 // TODO: Improve v1.60 detection // TODO: Temporary disabled due to #28652 //if ((isNumber (configFile >> "CfgDifficulties" >> "recruit" >> "recoilCoef")) && (isNumber (configFile >> "CfgVehicles" >> "Car" >> "turnCoef"))) then { - //_level = 1; // v1.60 + //_level = 1; // v1.60 //}; FUNC(determineProductVersion) = { - private "_pv"; - _pv = call {productVersion}; + private "_pv"; + _pv = call {productVersion}; - // A2 (and OA pre 1.61beta, and TOH pre 1.05?) does not support productVersion so we deal with it manually - if (isNil "_pv") then { - _pv = if (isClass(configFile >> "CfgPatches" >> "A3_Map_Stratis")) then { - // A3 Backup - ["Arma 3 Alpha","Arma3Alpha", -1, -1]; //,5,102571] + // A2 (and OA pre 1.61beta, and TOH pre 1.05?) does not support productVersion so we deal with it manually + if (isNil "_pv") then { + _pv = if (isClass(configFile >> "CfgPatches" >> "A3_Map_Stratis")) then { + // A3 Backup + ["Arma 3 Alpha","Arma3Alpha", -1, -1]; //,5,102571] - } else { - if (isClass(configFile >> "CfgPatches" >> "United_States_H")) then { - // TOH Backup - ["TakeOn H", "TakeOnH", -1, -1]; - } else { - if (isClass(configFile >> "CfgPatches" >> "Takistan")) then { - // OA Backup - ["ArmA 2OA", "ArmA2OA", -1, -1]; - } else { - // A2 Backup - ["ArmA 2", "ArmA2", -1, -1]; - }; - }; - }; - }; + } else { + if (isClass(configFile >> "CfgPatches" >> "United_States_H")) then { + // TOH Backup + ["TakeOn H", "TakeOnH", -1, -1]; + } else { + if (isClass(configFile >> "CfgPatches" >> "Takistan")) then { + // OA Backup + ["ArmA 2OA", "ArmA2OA", -1, -1]; + } else { + // A2 Backup + ["ArmA 2", "ArmA2", -1, -1]; + }; + }; + }; + }; - _pv; + _pv; }; FUNC(determineGame) = { - // 0 = A2 - // 1 = OA - // 2 = TOH - // 3 = A3 :P - private "_pv"; - _pv = call FUNC(determineProductVersion); + // 0 = A2 + // 1 = OA + // 2 = TOH + // 3 = A3 :P + private "_pv"; + _pv = call FUNC(determineProductVersion); - switch (_pv select 1) do { - case "ArmA2": {0}; - case "ArmA2OA": {1}; - case "TakeOnH": {2}; - case "Arma3Alpha": {3}; - case "Arma3": {3}; - default {0}; - }; + switch (_pv select 1) do { + case "ArmA2": {0}; + case "ArmA2OA": {1}; + case "TakeOnH": {2}; + case "Arma3Alpha": {3}; + case "Arma3": {3}; + default {0}; + }; }; // System array with machine / mission / session information SLX_XEH_MACHINE = [ - !isDedicated, // 0 - isClient (and thus has player) - false, // 1 - isJip - !isServer, // 2 - isDedicatedClient (and thus not a Client-Server) - isServer, // 3 - isServer - isDedicated, // 4 - isDedicatedServer (and thus not a Client-Server) - false, // 5 - Player Check Finished - !isMultiplayer, // 6 - SP? - false, // 7 - StartInit Passed - false, // 8 - Postinit Passed - isMultiplayer && {_respawn}, // 9 - Multiplayer && respawn? - if (isDedicated) then { 0 } else { if (isServer) then { 1 } else { 2 } }, // 10 - Machine type (only 3 possible configurations) - _id, // 11 - SESSION_ID - _level, // 12 - LEVEL - Used for version determination - false, // 13 - TIMEOUT - PostInit timedOut - call FUNC(determineGame), // 14 - Game - call FUNC(determineProductVersion) // 15 - Product+Version + !isDedicated, // 0 - isClient (and thus has player) + false, // 1 - isJip + !isServer, // 2 - isDedicatedClient (and thus not a Client-Server) + isServer, // 3 - isServer + isDedicated, // 4 - isDedicatedServer (and thus not a Client-Server) + false, // 5 - Player Check Finished + !isMultiplayer, // 6 - SP? + false, // 7 - StartInit Passed + false, // 8 - Postinit Passed + isMultiplayer && {_respawn}, // 9 - Multiplayer && respawn? + if (isDedicated) then { 0 } else { if (isServer) then { 1 } else { 2 } }, // 10 - Machine type (only 3 possible configurations) + _id, // 11 - SESSION_ID + _level, // 12 - LEVEL - Used for version determination + false, // 13 - TIMEOUT - PostInit timedOut + call FUNC(determineGame), // 14 - Game + call FUNC(determineProductVersion) // 15 - Product+Version ]; SLX_XEH_DUMMY = switch (SLX_XEH_MACHINE select 14) do { - case 2: {"Helipad_Invisible_H" }; - case 3: {"Land_HelipadEmpty_F" }; - default { "HeliHEmpty" }; + case 2: {"Helipad_Invisible_H" }; + case 3: {"Land_HelipadEmpty_F" }; + default { "HeliHEmpty" }; }; SLX_XEH_STR = ""; // Empty string @@ -259,24 +259,24 @@ call COMPILE_FILE(init_eh); // All XEH Event functions GVAR(init_obj) = SLX_XEH_DUMMY createVehicleLocal [0, 0, 0]; GVAR(init_obj) addEventHandler ["killed", { - #ifdef DEBUG_MODE_FULL - XEH_LOG("XEH: VehicleCrewInit: "+str(count vehicles)); - #endif + #ifdef DEBUG_MODE_FULL + XEH_LOG("XEH: VehicleCrewInit: "+str(count vehicles)); + #endif - { - _sim = getText(configFile/"CfgVehicles"/(typeOf _x)/"simulation"); - _crew = crew _x; - /* - * If it's a vehicle then start event handlers for the crew. - * (Vehicles have crew and are neither humanoids nor game logics) - */ - if (count _crew > 0 && {{ _sim == _x }count["soldier", "invisible"] == 0}) then { - { if !(_x in SLX_XEH_INIT_MEN) then { [_x] call SLX_XEH_EH_Init } } forEach _crew; - }; - } forEach vehicles; - SLX_XEH_INIT_MEN = nil; - - deleteVehicle GVAR(init_obj);GVAR(init_obj) = nil + { + _sim = getText(configFile/"CfgVehicles"/(typeOf _x)/"simulation"); + _crew = crew _x; + /* + * If it's a vehicle then start event handlers for the crew. + * (Vehicles have crew and are neither humanoids nor game logics) + */ + if (count _crew > 0 && {{ _sim == _x }count["soldier", "invisible"] == 0}) then { + { if !(_x in SLX_XEH_INIT_MEN) then { [_x] call SLX_XEH_EH_Init } } forEach _crew; + }; + } forEach vehicles; + SLX_XEH_INIT_MEN = nil; + + deleteVehicle GVAR(init_obj);GVAR(init_obj) = nil }]; GVAR(init_obj) setDamage 1; // Schedule to run itsy bitsy later @@ -284,73 +284,75 @@ GVAR(init_obj) setDamage 1; // Schedule to run itsy bitsy later // Prepare postInit GVAR(init_obj2) = SLX_XEH_DUMMY createVehicleLocal [0, 0, 0]; GVAR(init_obj2) addEventHandler ["killed", { - call COMPILE_FILE(init_post); - deleteVehicle GVAR(init_obj2);GVAR(init_obj2) = nil; + call COMPILE_FILE(init_post); + deleteVehicle GVAR(init_obj2);GVAR(init_obj2) = nil; }]; // Schedule PostInit SLX_XEH_STR spawn { - // Warn if PostInit takes longer than 10 tickTime seconds - SLX_XEH_STR spawn { - private["_time2Wait"]; - _time2Wait = diag_ticktime + 10; - waituntil {diag_ticktime > _time2Wait}; - if !(SLX_XEH_MACHINE select 8) then { - XEH_LOG("WARNING: PostInit did not finish in a timely fashion"); - waitUntil {time > 0}; - // Consider there will be no player if neither PostInit-Ready, nor PlayerCheck-Ready - if !(SLX_XEH_MACHINE select 8 || {SLX_XEH_MACHINE select 5}) then { SLX_XEH_MACHINE set [13, true]; }; - }; - }; + // Warn if PostInit takes longer than 10 tickTime seconds + SLX_XEH_STR spawn { + private["_time2Wait"]; + _time2Wait = diag_ticktime + 10; + waituntil {diag_ticktime > _time2Wait}; + if !(SLX_XEH_MACHINE select 8) then { + XEH_LOG("WARNING: PostInit did not finish in a timely fashion"); + waitUntil {time > 0}; + // Consider there will be no player if neither PostInit-Ready, nor PlayerCheck-Ready + if !(SLX_XEH_MACHINE select 8 || {SLX_XEH_MACHINE select 5}) then { SLX_XEH_MACHINE set [13, true]; }; + }; + }; - // On Server + Non JIP Client, we are now after all objects have inited - // and at the briefing, still time == 0 - if (isNull player) then { - #ifdef DEBUG_MODE_FULL - "NULL PLAYER" call SLX_XEH_LOG; - #endif - if !((SLX_XEH_MACHINE select 4) || {(SLX_XEH_MACHINE select 6)}) then { // only if MultiPlayer and not dedicated - #ifdef DEBUG_MODE_FULL - "JIP" call SLX_XEH_LOG; - #endif - - SLX_XEH_MACHINE set [1, true]; // set JIP - // TEST for weird jip-is-server-issue :S - if (!(SLX_XEH_MACHINE select 2) || {SLX_XEH_MACHINE select 3} || {SLX_XEH_MACHINE select 4}) then { - str(["WARNING: JIP Client, yet wrong detection", SLX_XEH_MACHINE]) call SLX_XEH_LOG; - SLX_XEH_MACHINE set [2, true]; // set Dedicated client - SLX_XEH_MACHINE set [3, false]; // set server - SLX_XEH_MACHINE set [4, false]; // set dedicatedserver - }; - waitUntil { !(isNull player) || {SLX_XEH_MACHINE select 13} }; - if (SLX_XEH_MACHINE select 13) then { XEH_LOG("WARNING: TimedOut waiting for player object to be ready. Continueing PostInit without Player ready") }; - }; - }; - - if !(isNull player) then { - if (isNull (group player) && {player isKindOf "CAManBase"}) then { - // DEBUG TEST: Crashing due to JIP, or when going from briefing - // into game - #ifdef DEBUG_MODE_FULL - "NULLGROUP" call SLX_XEH_LOG; - #endif - waitUntil { !(isNull (group player)) }; - }; - waitUntil { local player }; - }; + // On Server + Non JIP Client, we are now after all objects have inited + // and at the briefing, still time == 0 + if (isNull player) then { + #ifdef DEBUG_MODE_FULL + "NULL PLAYER" call SLX_XEH_LOG; + #endif + if !((SLX_XEH_MACHINE select 4) || {(SLX_XEH_MACHINE select 6)}) then { // only if MultiPlayer and not dedicated + #ifdef DEBUG_MODE_FULL + "JIP" call SLX_XEH_LOG; + #endif - GVAR(init_obj2) setDamage 1; // Schedule to run itsy bitsy later + // TEST for weird jip-is-server-issue :S + if (!(SLX_XEH_MACHINE select 2) || {SLX_XEH_MACHINE select 3} || {SLX_XEH_MACHINE select 4}) then { + str(["WARNING: JIP Client, yet wrong detection", SLX_XEH_MACHINE]) call SLX_XEH_LOG; + SLX_XEH_MACHINE set [2, true]; // set Dedicated client + SLX_XEH_MACHINE set [3, false]; // set server + SLX_XEH_MACHINE set [4, false]; // set dedicatedserver + }; + waitUntil { !(isNull player) || {SLX_XEH_MACHINE select 13} }; + if (SLX_XEH_MACHINE select 13) then { XEH_LOG("WARNING: TimedOut waiting for player object to be ready. Continueing PostInit without Player ready") }; + }; + }; - SLX_XEH_MACHINE set [5, true]; // set player check = complete + if !(isNull player) then { + if (isNull (group player) && {player isKindOf "CAManBase"}) then { + // DEBUG TEST: Crashing due to JIP, or when going from briefing + // into game + #ifdef DEBUG_MODE_FULL + "NULLGROUP" call SLX_XEH_LOG; + #endif + waitUntil { !(isNull (group player)) }; + }; + waitUntil { local player }; + }; + + // set JIP + SLX_XEH_MACHINE set [1, !isDedicated && getClientState in ["BRIEFING SHOWN","BRIEFING READ","GAME FINISHED","DEBRIEFING READ"]]; + + GVAR(init_obj2) setDamage 1; // Schedule to run itsy bitsy later + + SLX_XEH_MACHINE set [5, true]; // set player check = complete }; // Load and call any "pre-init", run-once event handlers /* - Compile code strings in the Extended_PreInit_EventHandlers class and call - them. This is done once per mission and before any extended init event - handler code is run. An addon maker can put run-once initialisation code - in such a pre-init "EH" rather than in a normal XEH init EH which might be - called several times. + Compile code strings in the Extended_PreInit_EventHandlers class and call + them. This is done once per mission and before any extended init event + handler code is run. An addon maker can put run-once initialisation code + in such a pre-init "EH" rather than in a normal XEH init EH which might be + called several times. */ { (_x/SLX_XEH_STR_PreInit) call FUNC(init_once) } forEach SLX_XEH_CONFIG_FILES; diff --git a/tools/cba/addons/xeh/script_xeh.hpp b/tools/cba/addons/xeh/script_xeh.hpp index ec7a1d8b88..ba55dbc917 100644 --- a/tools/cba/addons/xeh/script_xeh.hpp +++ b/tools/cba/addons/xeh/script_xeh.hpp @@ -1,8 +1,14 @@ +/* + Header: script_xeh.hpp + + Description: + Used internally. +*/ ///////////////////////////////////////////////////////////////////////////////// // MACRO: EXTENDED_EVENTHANDLERS -// XEH uses all existing event handlers +// Add all XEH event handlers ///////////////////////////////////////////////////////////////////////////////// -#define EXTENDED_EVENTHANDLERS init = QUOTE(if(isNil'SLX_XEH_MACHINE')then{call compile preProcessFileLineNumbers '\x\cba\addons\xeh\init_pre.sqf'};_this call SLX_XEH_EH_Init); \ +#define EXTENDED_EVENTHANDLERS init = "_this call SLX_XEH_EH_Init"; \ fired = "_this call SLX_XEH_EH_Fired"; \ animChanged = "_this call SLX_XEH_EH_AnimChanged"; \ animDone = "_this call SLX_XEH_EH_AnimDone"; \ @@ -45,22 +51,25 @@ weaponDisAssembled = "_this call SLX_XEH_EH_WeaponDisassembled"; -///////////////////////////////////////////////////////////////////////////////// -// MACRO: DELETE_EVENTHANDLERS -// -// Example: -// -// class DefaultEventhandlers; -// class Car_F; -// class MRAP_01_base_F: Car_F { -// class EventHandlers; -// }; -// class B_MRAP_01_F: MRAP_01_base_F { -// class Eventhandlers: EventHandlers { -// DELETE_EVENTHANDLERS -// }; -// }; -///////////////////////////////////////////////////////////////////////////////// +/* + MACRO: DELETE_EVENTHANDLERS + + Removes all event handlers. + + Example: + (begin example) + class DefaultEventhandlers; + class Car_F; + class MRAP_01_base_F: Car_F { + class EventHandlers; + }; + class B_MRAP_01_F: MRAP_01_base_F { + class Eventhandlers: EventHandlers { + DELETE_EVENTHANDLERS + }; + }; + (end example) +*/ #define DELETE_EVENTHANDLERS delete init; \ delete fired; \ From 6a123020d2d32a69f92f0d9c609d4f0db46be9c7 Mon Sep 17 00:00:00 2001 From: gienkov Date: Wed, 26 Aug 2015 08:55:50 +0200 Subject: [PATCH 078/137] fail to find BP on limbs with TQ on --- addons/medical/functions/fnc_actionCheckBloodPressure.sqf | 5 +++-- .../functions/fnc_actionCheckBloodPressureLocal.sqf | 8 +++++++- addons/medical/functions/fnc_actionCheckPulse.sqf | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf index e8e03bb4c0..646e472f70 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf @@ -14,7 +14,8 @@ #include "script_component.hpp" -private ["_caller","_target"]; +private ["_caller","_target","_selectionName"]; _caller = _this select 0; _target = _this select 1; -[[_caller, _target], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +_selectionName = _this select 2; +[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf index 82edd1749f..92120a280c 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -14,9 +14,10 @@ #include "script_component.hpp" -private ["_caller","_target","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; +private ["_caller","_target","_selectionName","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; _caller = _this select 0; _target = _this select 1; +_selectionName = _this select 2; _bloodPressure = [_target] call FUNC(getBloodPressure); if (!alive _target) then { @@ -54,6 +55,11 @@ if ([_caller] call FUNC(isMedic)) then { }; }; +if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { + _output = LSTRING(Check_Bloodpressure_Output_6); + _logOutPut = ""; +}; + ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)], 1.75, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf index 134cf7dd20..f615c69983 100644 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ b/addons/medical/functions/fnc_actionCheckPulse.sqf @@ -18,4 +18,4 @@ private ["_caller","_target","_selectionName"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; -[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ \ No newline at end of file +[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ From c0379c78097cc233baf72da9df063f9bc645aef5 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 17:02:29 +0200 Subject: [PATCH 079/137] Updated with correct cargo events and settings category --- addons/repair/ACE_Settings.hpp | 2 +- addons/repair/functions/fnc_addSpareParts.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/repair/ACE_Settings.hpp b/addons/repair/ACE_Settings.hpp index 9116ff61ef..9dbcd21731 100644 --- a/addons/repair/ACE_Settings.hpp +++ b/addons/repair/ACE_Settings.hpp @@ -66,6 +66,6 @@ class ACE_Settings { description = CSTRING(addSpareParts_description); typeName = "BOOL"; value = 1; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; }; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index 4ec01a6cc1..c7366b27ba 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -42,4 +42,4 @@ if (_part == "") then { if (_part == "") exitWith {}; // Load -["AddCargoItem", [_part, _vehicle, _amount]] call EFUNC(common,localEvent); +["AddCargoByClass", [_part, _vehicle, _amount]] call EFUNC(common,localEvent); From b3838262f1c916fc49002f86c98576cdd5e404d3 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 21:33:55 +0200 Subject: [PATCH 080/137] Fixed duplicated part of DE readme --- documentation/README_DE.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/documentation/README_DE.md b/documentation/README_DE.md index f70562e389..a6c333eb42 100644 --- a/documentation/README_DE.md +++ b/documentation/README_DE.md @@ -18,8 +18,7 @@ ACE3 License

-

Benötigt eine Aktuelle Version von CBA A3 | BIF thread

-

Requires the latest version of CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

+

Benötigt eine Aktuelle Version von CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

**ACE3** ist ein Gemeinschaftsprojekt der sich zusammengeschlossenen Moddinggruppen von **ACE2**, **AGM** und **CSE** mit dem Ziel den Realismus und die Spieltiefe von Arma 3 zu steigern. From 23f8bbaca17f6529eaf24fee1fc910424858c064 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 21:34:51 +0200 Subject: [PATCH 081/137] Improved german langauge --- documentation/README_DE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/README_DE.md b/documentation/README_DE.md index a6c333eb42..be47583c03 100644 --- a/documentation/README_DE.md +++ b/documentation/README_DE.md @@ -18,7 +18,7 @@ ACE3 License

-

Benötigt eine Aktuelle Version von CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

+

Benötigt die aktuellste Version von CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

**ACE3** ist ein Gemeinschaftsprojekt der sich zusammengeschlossenen Moddinggruppen von **ACE2**, **AGM** und **CSE** mit dem Ziel den Realismus und die Spieltiefe von Arma 3 zu steigern. From 497199e5ed252042d62286ea475e83ee9a67012b Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 21:35:37 +0200 Subject: [PATCH 082/137] Changed CBA A3 link from Armaholic to GitHub --- README.md | 2 +- documentation/README_DE.md | 2 +- documentation/README_PL.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 827e7d2562..755eaceb30 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ACE3 License

-

Requires the latest version of CBA A3. Visit us on Facebook | YouTube | Twitter | Reddit

+

Requires the latest version of CBA A3. Visit us on Facebook | YouTube | Twitter | Reddit

**ACE3** is a joint effort by the teams behind **ACE2**, **AGM** and **CSE** to improve the realism and authenticity of Arma 3. diff --git a/documentation/README_DE.md b/documentation/README_DE.md index be47583c03..23d54f9e35 100644 --- a/documentation/README_DE.md +++ b/documentation/README_DE.md @@ -18,7 +18,7 @@ ACE3 License

-

Benötigt die aktuellste Version von CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

+

Benötigt die aktuellste Version von CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

**ACE3** ist ein Gemeinschaftsprojekt der sich zusammengeschlossenen Moddinggruppen von **ACE2**, **AGM** und **CSE** mit dem Ziel den Realismus und die Spieltiefe von Arma 3 zu steigern. diff --git a/documentation/README_PL.md b/documentation/README_PL.md index 56a9c72caa..3fbeb31664 100644 --- a/documentation/README_PL.md +++ b/documentation/README_PL.md @@ -18,7 +18,7 @@ ACE3 Licencja

-

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

+

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

**ACE3** to efekt wspólnego wysiłku grup moderów odpowiedzialnych za **ACE2**, **AGM** oraz **CSE** w celu zwiększenia realizmu i autentyczności Arma 3. From 9c8e9732edd59b72cd90235ca79ceb2f6070378a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 26 Aug 2015 16:26:08 -0500 Subject: [PATCH 083/137] Add canInteractWith checks for cargo --- addons/cargo/functions/fnc_canLoad.sqf | 2 ++ addons/cargo/functions/fnc_initVehicle.sqf | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/cargo/functions/fnc_canLoad.sqf b/addons/cargo/functions/fnc_canLoad.sqf index da41d93358..f5d1304a95 100644 --- a/addons/cargo/functions/fnc_canLoad.sqf +++ b/addons/cargo/functions/fnc_canLoad.sqf @@ -18,6 +18,8 @@ params ["_player", "_object"]; +if (!([_player, _object, []] call EFUNC(common,canInteractWith))) exitWith {false}; + private ["_nearestVehicle"]; _nearestVehicle = [_player] call FUNC(findNearestVehicle); diff --git a/addons/cargo/functions/fnc_initVehicle.sqf b/addons/cargo/functions/fnc_initVehicle.sqf index 06f8fbcbbc..b817688336 100644 --- a/addons/cargo/functions/fnc_initVehicle.sqf +++ b/addons/cargo/functions/fnc_initVehicle.sqf @@ -39,7 +39,10 @@ SETMVAR(GVAR(initializedClasses),_initializedClasses); if (getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) != 1) exitWith {}; private ["_text", "_condition", "_statement", "_icon", "_action"]; -_condition = {GVAR(enable)}; +_condition = { + params ["_target", "_player"]; + GVAR(enable) && {[_player, _target, []] call EFUNC(common,canInteractWith)} +}; _text = localize LSTRING(openMenu); _statement = {GVAR(interactionVehicle) = _target; createDialog QGVAR(menu);}; _icon = ""; From 6d27299883141e48f60b23c66bbaa2a5881e6f94 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 23:43:06 +0200 Subject: [PATCH 084/137] Cleaned up spare parts collection after SettingsInitialized, Check if vehicle already in collection --- addons/repair/XEH_postInit.sqf | 5 ++++- addons/repair/functions/fnc_addSpareParts.sqf | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index d61f20a31e..7095b0bfd0 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -10,12 +10,15 @@ if (isServer) then { ["SettingsInitialized", { GVAR(settingInitted) = true; // Stop collecting in FUNC(addSpareParts) - // Exit if adding spare parts disabled + // Exit if adding spare parts disabled and clean collection if (!GVAR(addSpareParts)) exitWith {GVAR(addSparePartsCollection) = nil}; // Add spare parts to vehicles in collection { [_x] call FUNC(addSpareParts); } forEach GVAR(addSparePartsCollection); + + // Clean collection + GVAR(addSparePartsCollection) = nil; }] call EFUNC(common,addEventHandler); }; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index c7366b27ba..6dfbb49bc0 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -27,7 +27,9 @@ if !(["ace_cargo"] call EFUNC(common,isModLoaded)) exitWith {}; // Collect until SettingsInitialized if (isNil QGVAR(settingInitted)) exitWith { - GVAR(addSparePartsCollection) pushBack _vehicle; + if !(_vehicle in GVAR(addSparePartsCollection)) then { + GVAR(addSparePartsCollection) pushBack _vehicle; + }; }; // Exit if not forced and add spare parts is disabled (after settings initted to make sure it really is) From 19a6226ced3e204e1474fea74f24e1fe418f35f2 Mon Sep 17 00:00:00 2001 From: bux578 Date: Fri, 28 Aug 2015 09:05:31 +0200 Subject: [PATCH 085/137] add Hearing Protection to Helmets with Peltors --- addons/hearing/CfgWeapons.hpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/hearing/CfgWeapons.hpp b/addons/hearing/CfgWeapons.hpp index 2806ef9970..7c21baaed2 100644 --- a/addons/hearing/CfgWeapons.hpp +++ b/addons/hearing/CfgWeapons.hpp @@ -47,5 +47,16 @@ class CfgWeapons { GVAR(lowerVolume) = 0.60; }; class H_Cap_marshal: H_Cap_headphones {}; -}; + class H_HelmetB_light: H_HelmetB { + GVAR(protection) = 0.8; + GVAR(lowerVolume) = 0.20; + }; + + class H_HelmetB_plain_mcamo; + class H_HelmetSpecB: H_HelmetB_plain_mcamo { + GVAR(protection) = 0.8; + GVAR(lowerVolume) = 0.20; + }; + +}; From 326911486143316fa08938046745a619dca3570f Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Fri, 28 Aug 2015 11:55:32 +0200 Subject: [PATCH 086/137] Fix Tactical Ladder Animation Clipping --- .../data/ace_tacticalladder.p3d | Bin 2100184 -> 2115464 bytes addons/tacticalladder/data/model.cfg | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/tacticalladder/data/ace_tacticalladder.p3d b/addons/tacticalladder/data/ace_tacticalladder.p3d index a331f2408498f3c39bdb1aeea28d5433c70f212d..7bb924ff46e4ba8f2e454a9f674878e178f4238e 100644 GIT binary patch delta 211758 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

#e@{9Q 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

o6rqqE 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 TRus90t?imNoHC?h&;kDqf4eg4 diff --git a/addons/tacticalladder/data/model.cfg b/addons/tacticalladder/data/model.cfg index 1fc8840d4f..ba19d58c65 100644 --- a/addons/tacticalladder/data/model.cfg +++ b/addons/tacticalladder/data/model.cfg @@ -1,4 +1,4 @@ -class CfgSkeletons { +class CfgSkeletons { class Default { isDiscrete = 1; skeletonInherit = ""; @@ -21,7 +21,7 @@ class CfgSkeletons { "10","9", "11","10", "step","11" - }; + }; }; class OFP2_ManSkeleton { isDiscrete = 0; @@ -180,7 +180,7 @@ class CfgModels { class ace_tacticalladder { skeletonName = "ace_tacticalladder_skeleton"; sections[] = { "roadway" }; - sectionsInherit = ""; + sectionsInherit = ""; class Animations { class rotate { type = "rotation"; @@ -192,7 +192,7 @@ class CfgModels { maxValue = 90; angle0="rad 0"; angle1="rad +90"; - }; + }; class extract_1 { type = "translation"; source = ""; @@ -280,4 +280,4 @@ class CfgModels { }; class ace_tacticalladder_pack: ArmaMan { }; -}; \ No newline at end of file +}; From 007859d42ea9a17f98a68d71e5385faae442971a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 28 Aug 2015 16:57:16 -0500 Subject: [PATCH 087/137] Attach - getin/out/killed event handlers (#2200 #2300) --- addons/attach/CfgEventHandlers.hpp | 21 +++++++++++ addons/attach/XEH_preInit.sqf | 3 ++ addons/attach/functions/fnc_attach.sqf | 22 ++++++------ addons/attach/functions/fnc_canAttach.sqf | 15 ++++---- addons/attach/functions/fnc_canDetach.sqf | 24 +++++-------- addons/attach/functions/fnc_detach.sqf | 32 +++++++---------- addons/attach/functions/fnc_handleGetIn.sqf | 38 ++++++++++++++++++++ addons/attach/functions/fnc_handleGetOut.sqf | 35 ++++++++++++++++++ addons/attach/functions/fnc_handleKilled.sqf | 33 +++++++++++++++++ addons/attach/functions/fnc_placeApprove.sqf | 13 +++---- 10 files changed, 176 insertions(+), 60 deletions(-) create mode 100644 addons/attach/functions/fnc_handleGetIn.sqf create mode 100644 addons/attach/functions/fnc_handleGetOut.sqf create mode 100644 addons/attach/functions/fnc_handleKilled.sqf diff --git a/addons/attach/CfgEventHandlers.hpp b/addons/attach/CfgEventHandlers.hpp index 3daad1425a..c050fbd1c7 100644 --- a/addons/attach/CfgEventHandlers.hpp +++ b/addons/attach/CfgEventHandlers.hpp @@ -8,3 +8,24 @@ class Extended_PostInit_EventHandlers { clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); }; }; +class Extended_GetIn_EventHandlers { + class All { + class ADDON { + getIn = QUOTE(_this call FUNC(handleGetIn)); + }; + }; +}; +class Extended_GetOut_EventHandlers { + class All { + class ADDON { + getOut = QUOTE(_this call FUNC(handleGetOut)); + }; + }; +}; +class Extended_Killed_EventHandlers { + class All { + class ADDON { + killed = QUOTE(_this call FUNC(handleKilled)); + }; + }; +}; diff --git a/addons/attach/XEH_preInit.sqf b/addons/attach/XEH_preInit.sqf index 06c6ed1b01..17b8490a77 100644 --- a/addons/attach/XEH_preInit.sqf +++ b/addons/attach/XEH_preInit.sqf @@ -7,6 +7,9 @@ PREP(canAttach); PREP(canDetach); PREP(detach); PREP(getChildrenAttachActions); +PREP(handleGetIn); +PREP(handleGetOut); +PREP(handleKilled); PREP(placeApprove); ADDON = true; diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index bd363b1307..6362edb33c 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -17,15 +17,14 @@ */ #include "script_component.hpp" -private ["_itemVehClass", "_onAtachText", "_selfAttachPosition", "_attachedItem", "_tempObject", "_actionID", "_model"]; -params ["_attachToVehicle","_unit","_args"]; +params ["_attachToVehicle","_unit","_args", ["_silentScripted", false]]; _args params [["_itemClassname","", [""]]]; -TRACE_3("params",_attachToVehicle,_unit,_itemClassname); +TRACE_4("params",_attachToVehicle,_unit,_itemClassname,_silentScripted); + +private ["_itemVehClass", "_onAtachText", "_selfAttachPosition", "_attachedItem", "_tempObject", "_actionID", "_model"]; //Sanity Check (_unit has item in inventory, not over attach limit) -if ((_itemClassname == "") || {!(_this call FUNC(canAttach))}) exitWith {ERROR("Tried to attach, but check failed");}; - -_selfAttachPosition = [_unit, [-0.05, 0, 0.12], "rightshoulder"]; +if ((_itemClassname == "") || {(!_silentScripted) && {!(_this call FUNC(canAttach))}}) exitWith {ERROR("Tried to attach, but check failed");}; _itemVehClass = getText (configFile >> "CfgWeapons" >> _itemClassname >> "ACE_Attachable"); _onAtachText = getText (configFile >> "CfgWeapons" >> _itemClassname >> "displayName"); @@ -40,12 +39,13 @@ if (_itemVehClass == "") exitWith {ERROR("no ACE_Attachable for Item");}; _onAtachText = format [localize LSTRING(Item_Attached), _onAtachText]; if (_unit == _attachToVehicle) then { //Self Attachment - _unit removeItem _itemClassname; // Remove item _attachedItem = _itemVehClass createVehicle [0,0,0]; - _attachedItem attachTo _selfAttachPosition; - [_onAtachText] call EFUNC(common,displayTextStructured); - _attachToVehicle setVariable [QGVAR(Objects), [_attachedItem], true]; - _attachToVehicle setVariable [QGVAR(ItemNames), [_itemClassname], true]; + _attachedItem attachTo [_unit, [-0.05, 0, 0.12], "rightshoulder"]; + if (!_silentScripted) then { + _unit removeItem _itemClassname; // Remove item + [_onAtachText] call EFUNC(common,displayTextStructured); + }; + _unit setVariable [QGVAR(attached), [[_attachedItem, _itemClassname]], true]; } else { GVAR(placeAction) = PLACE_WAITING; diff --git a/addons/attach/functions/fnc_canAttach.sqf b/addons/attach/functions/fnc_canAttach.sqf index 20a49c09be..37d92e8908 100644 --- a/addons/attach/functions/fnc_canAttach.sqf +++ b/addons/attach/functions/fnc_canAttach.sqf @@ -17,14 +17,17 @@ */ #include "script_component.hpp" -private ["_attachLimit", "_attachedObjects","_playerPos"]; params ["_attachToVehicle","_player","_args"]; _args params [["_itemClassname","", [""]]]; -TRACE_3("params",_attachToVehicle,_unit,_itemClassname); +TRACE_3("params",_attachToVehicle,_player,_itemClassname); + +private ["_attachLimit", "_attachedObjects"]; _attachLimit = [6, 1] select (_player == _attachToVehicle); -_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; +_attachedObjects = _attachToVehicle getVariable [QGVAR(attached), []]; -_playerPos = (ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot")); - -(canStand _player) && {(_attachToVehicle distance _player) < 7} && {alive _attachToVehicle} && {(count _attachedObjects) < _attachLimit} && {_itemClassname in ((itemsWithMagazines _player) + [""])}; +((_player == _attachToVehicle) || {canStand _player}) && +{(_attachToVehicle distance _player) < 7} && +{alive _attachToVehicle} && +{(count _attachedObjects) < _attachLimit} && +{_itemClassname in ((itemsWithMagazines _player) + [""])}; diff --git a/addons/attach/functions/fnc_canDetach.sqf b/addons/attach/functions/fnc_canDetach.sqf index ba3182ddea..303d0baf44 100644 --- a/addons/attach/functions/fnc_canDetach.sqf +++ b/addons/attach/functions/fnc_canDetach.sqf @@ -16,25 +16,17 @@ */ #include "script_component.hpp" -private ["_attachedObjects", "_inRange"]; params ["_attachToVehicle", "_unit"]; TRACE_2("params",_attachToVehicle,_unit); -_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; +private ["_inRange"]; _inRange = false; -if (_unit == _attachToVehicle) then { - _inRange = count _attachedObjects > 0; -} else { - //Scan if unit is within range (using 2d distance) - private ["_unitPos", "_objectPos"]; - _unitPos = getPos _unit; - _unitPos set [2,0]; - { - _objectPos = getPos _x; - _objectPos set [2, 0]; - if (_objectPos distance _unitPos < 4) exitWith {_inRange = true}; - } forEach _attachedObjects; -}; +{ + _x params ["_xObject"]; + if (((getPos _unit) distance2d (getPos _xObject)) < 4) exitWith {_inRange = true}; +} forEach (_attachToVehicle getVariable [QGVAR(attached), []]); -canStand _unit && {_inRange} && {alive _attachToVehicle} +_inRange && +{(_unit == _attachToVehicle) || {canStand _unit}} && +{alive _attachToVehicle} diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index 98f482f17b..ec389b5c25 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -16,15 +16,12 @@ */ #include "script_component.hpp" -private ["_attachedObjects", "_attachedItems", "_itemDisplayName", - "_attachedObject", "_attachedIndex", "_itemName", "_minDistance", - "_unitPos", "_objectPos" -]; params ["_attachToVehicle","_unit"], TRACE_2("params",_attachToVehicle,_unit); -_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; -_attachedItems = _attachToVehicle getVariable [QGVAR(ItemNames), []]; +private ["_attachedList", "_itemDisplayName", "_attachedObject", "_attachedIndex", "_itemName", "_minDistance", "_unitPos", "_objectPos"]; + +_attachedList = _attachToVehicle getVariable [QGVAR(attached), []]; _attachedObject = objNull; _attachedIndex = -1; @@ -32,18 +29,17 @@ _itemName = ""; //Find closest attached object _minDistance = 1000; -_unitPos = getPos _unit; -_unitPos set [2,0]; + { - _objectPos = getPos _x; - _objectPos set [2, 0]; - if (_objectPos distance _unitPos < _minDistance) then { - _minDistance = _objectPos distance _unitPos; - _attachedObject = _x; - _itemName = _attachedItems select _forEachIndex; + _x params ["_xObject", "_xItemName"]; + + if (((getPos _unit) distance2d (getPos _xObject)) < _minDistance) then { + _minDistance = ((getPos _unit) distance2d (getPos _xObject)); + _attachedObject = _xObject; + _itemName = _xItemName; _attachedIndex = _forEachIndex; }; -} forEach _attachedObjects; +} forEach _attachedList; // Check if unit has an attached item if (isNull _attachedObject || {_itemName == ""}) exitWith {ERROR("Could not find attached object")}; @@ -68,10 +64,8 @@ if (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then }; // Reset unit variables -_attachedObjects deleteAt _attachedIndex; -_attachedItems deleteAt _attachedIndex; -_attachToVehicle setVariable [QGVAR(Objects), _attachedObjects, true]; -_attachToVehicle setVariable [QGVAR(ItemNames), _attachedItems, true]; +_attachedList deleteAt _attachedIndex; +_attachToVehicle setVariable [QGVAR(attached), _attachedList, true]; // Display message _itemDisplayName = getText (configFile >> "CfgWeapons" >> _itemName >> "displayName"); diff --git a/addons/attach/functions/fnc_handleGetIn.sqf b/addons/attach/functions/fnc_handleGetIn.sqf new file mode 100644 index 0000000000..415fdddf8a --- /dev/null +++ b/addons/attach/functions/fnc_handleGetIn.sqf @@ -0,0 +1,38 @@ +/* + * Author: PabstMirror + * Handles when a unit gets in to a vehicle. + * + * Arguments: + * 0: vehicle + * 1: dunno + * 2: unit + * + * Return Value: + * None + * + * Example: + * [car2, x, player] call ACE_attach_fnc_handleGetIn + * + * Public: No + */ +#include "script_component.hpp" + +if (!isServer) exitWith {}; + +params ["", "", "_unit"]; +TRACE_1("params",_unit); + +private ["_attachedList"]; + +_attachedList = _unit getVariable [QGVAR(attached), []]; +if ((count _attachedList) == 0) exitWith {}; + +(_attachedList select 0) params ["_xObject", "_xItemName"]; +if (!isNull _xObject) then { + detach _xObject; + _xObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]); + [{deleteVehicle (_this select 0)}, [_xObject], 2] call EFUNC(common,waitAndExecute); + (_attachedList select 0) set [0, objNull]; +}; + +_unit setVariable [QGVAR(attached), _attachedList, true]; diff --git a/addons/attach/functions/fnc_handleGetOut.sqf b/addons/attach/functions/fnc_handleGetOut.sqf new file mode 100644 index 0000000000..57fb69cf15 --- /dev/null +++ b/addons/attach/functions/fnc_handleGetOut.sqf @@ -0,0 +1,35 @@ +/* + * Author: PabstMirror + * Handles when a unit gets in to a vehicle. + * + * Arguments: + * 0: vehicle + * 1: dunno + * 2: unit + * + * Return Value: + * None + * + * Example: + * [car2, x, player] call ACE_attach_fnc_handleGetOut + * + * Public: No + */ +#include "script_component.hpp" + +if (!isServer) exitWith {}; + +params ["", "", "_unit"]; +TRACE_1("params",_unit); + +private ["_attachedList"]; + +_attachedList = _unit getVariable [QGVAR(attached), []]; +if ((count _attachedList) == 0) exitWith {}; + +(_attachedList select 0) params ["_xObject", "_xItemName"]; +if (isNull _xObject) then { + TRACE_1("null attached when exiting vehicle, scripted reattach",_xItemName); + _unit setVariable [QGVAR(attached), [], true]; + [_unit, _unit, _xItemName, true] call FUNC(attach); +}; diff --git a/addons/attach/functions/fnc_handleKilled.sqf b/addons/attach/functions/fnc_handleKilled.sqf new file mode 100644 index 0000000000..5fb33c2abe --- /dev/null +++ b/addons/attach/functions/fnc_handleKilled.sqf @@ -0,0 +1,33 @@ +/* + * Author: PabstMirror + * Handles when vehicle or man is killed. + * + * Arguments: + * 0: DeadVehicle + * + * Return Value: + * None + * + * Example: + * [bob1] call ACE_attach_fnc_handleKilled + * + * Public: No + */ +#include "script_component.hpp" + +if (!isServer) exitWith {}; + +params ["_deadUnit"]; + +private ["_attachedList"]; + +_attachedList = _deadUnit getVariable [QGVAR(attached), []]; + +if ((count _attachedList) == 0) exitWith {}; + +{ + _x params ["_xObject", "_xItemName"]; + detach _xObject; +} forEach _attachedList; + +_deadUnit setVariable [QGVAR(attached), nil, true]; diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf index 0656e7880f..b8e2cc17fb 100644 --- a/addons/attach/functions/fnc_placeApprove.sqf +++ b/addons/attach/functions/fnc_placeApprove.sqf @@ -25,7 +25,7 @@ */ #include "script_component.hpp" -private ["_startingOffset", "_startDistanceFromCenter", "_closeInUnitVector", "_closeInMax", "_closeInMin", "_closeInDistance", "_endPosTestOffset", "_endPosTest", "_doesIntersect", "_startingPosShifted", "_startASL", "_endPosShifted", "_endASL", "_attachedObject", "_currentObjects", "_currentItemNames"]; +private ["_startingOffset", "_startDistanceFromCenter", "_closeInUnitVector", "_closeInMax", "_closeInMin", "_closeInDistance", "_endPosTestOffset", "_endPosTest", "_doesIntersect", "_startingPosShifted", "_startASL", "_endPosShifted", "_endASL", "_attachedObject", "_attachList"]; params ["_unit", "_attachToVehicle", "_itemClassname", "_itemVehClass", "_onAtachText", "_startingPosition"]; TRACE_6("params",_unit,_attachToVehicle,_itemClassname,_itemVehClass,_onAtachText,_startingPosition); @@ -87,12 +87,9 @@ _attachedObject attachTo [_attachToVehicle, _endPosTestOffset]; //Remove Item from inventory _unit removeItem _itemClassname; -//Add Object to ACE_AttachedObjects and ACE_AttachedItemNames -_currentObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; -_currentObjects pushBack _attachedObject; -_attachToVehicle setVariable [QGVAR(Objects), _currentObjects, true]; -_currentItemNames = _attachToVehicle getVariable [QGVAR(ItemNames), []]; -_currentItemNames pushBack _itemClassname; -_attachToVehicle setVariable [QGVAR(ItemNames), _currentItemNames, true]; +//Add Object to attached array +_attachList = _attachToVehicle getVariable [QGVAR(attached), []]; +_attachList pushBack [_attachedObject, _itemClassname]; +_attachToVehicle setVariable [QGVAR(attached), _attachList, true]; [_onAtachText] call EFUNC(common,displayTextStructured); From f6c752045c4f7f3b3d41d77313e933ac91c943c8 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 29 Aug 2015 09:38:57 -0500 Subject: [PATCH 088/137] Cleanup --- addons/attach/functions/fnc_detach.sqf | 2 +- addons/attach/functions/fnc_handleGetIn.sqf | 2 +- addons/attach/functions/fnc_handleKilled.sqf | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index ec389b5c25..05c625b374 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -19,7 +19,7 @@ params ["_attachToVehicle","_unit"], TRACE_2("params",_attachToVehicle,_unit); -private ["_attachedList", "_itemDisplayName", "_attachedObject", "_attachedIndex", "_itemName", "_minDistance", "_unitPos", "_objectPos"]; +private ["_attachedList", "_itemDisplayName", "_attachedObject", "_attachedIndex", "_itemName", "_minDistance"]; _attachedList = _attachToVehicle getVariable [QGVAR(attached), []]; diff --git a/addons/attach/functions/fnc_handleGetIn.sqf b/addons/attach/functions/fnc_handleGetIn.sqf index 415fdddf8a..b7b2997081 100644 --- a/addons/attach/functions/fnc_handleGetIn.sqf +++ b/addons/attach/functions/fnc_handleGetIn.sqf @@ -27,7 +27,7 @@ private ["_attachedList"]; _attachedList = _unit getVariable [QGVAR(attached), []]; if ((count _attachedList) == 0) exitWith {}; -(_attachedList select 0) params ["_xObject", "_xItemName"]; +(_attachedList select 0) params ["_xObject"]; if (!isNull _xObject) then { detach _xObject; _xObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]); diff --git a/addons/attach/functions/fnc_handleKilled.sqf b/addons/attach/functions/fnc_handleKilled.sqf index 5fb33c2abe..355360d95f 100644 --- a/addons/attach/functions/fnc_handleKilled.sqf +++ b/addons/attach/functions/fnc_handleKilled.sqf @@ -1,6 +1,7 @@ /* * Author: PabstMirror - * Handles when vehicle or man is killed. + * Handles when vehicle or man is killed. + * Note: Runs where unit is local. * * Arguments: * 0: DeadVehicle @@ -15,9 +16,8 @@ */ #include "script_component.hpp" -if (!isServer) exitWith {}; - params ["_deadUnit"]; +TRACE_1("params",_deadUnit); private ["_attachedList"]; @@ -26,7 +26,8 @@ _attachedList = _deadUnit getVariable [QGVAR(attached), []]; if ((count _attachedList) == 0) exitWith {}; { - _x params ["_xObject", "_xItemName"]; + _x params ["_xObject"]; + TRACE_2("detaching",_xObject,_deadUnit); detach _xObject; } forEach _attachedList; From 200f44d96336c08eb8f4e1b055de5e052761a808 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 29 Aug 2015 16:03:43 +0100 Subject: [PATCH 089/137] Adjust spectator camera speed based on height Slows the camera movement close to the ground as it feels more natural when spectating units up close and such --- .../spectator/functions/fnc_handleCamera.sqf | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/spectator/functions/fnc_handleCamera.sqf b/addons/spectator/functions/fnc_handleCamera.sqf index 960a20df80..db196c8504 100644 --- a/addons/spectator/functions/fnc_handleCamera.sqf +++ b/addons/spectator/functions/fnc_handleCamera.sqf @@ -20,14 +20,18 @@ // Kill PFH when not in free cam (or display is closed) if (isNil QGVAR(camHandler)) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; -private ["_oldPos","_zoomMod","_mX","_mY","_mZ","_pan","_x","_y","_z"]; +private ["_camera","_oldPos","_altMod","_zoomMod","_mX","_mY","_mZ","_pan","_x","_y","_z"]; -_oldPos = getPosASL GVAR(camera); +_camera = GVAR(camera); +_oldPos = getPosASL _camera; // Dolly/Boom amount should be influnced by zoom level (it should really be exponential) +// Dollying should also slow as the camera gets close to the ground _zoomMod = (GVAR(camZoom) * 0.8) max 1; -_mX = (GVAR(camDolly) select 0) / _zoomMod; -_mY = (GVAR(camDolly) select 1) / _zoomMod; +_altMod = ((((getPos _camera) select 2) * 0.05) max 0.1) min 1; + +_mX = (GVAR(camDolly) select 0) * _altMod / _zoomMod; +_mY = (GVAR(camDolly) select 1) * _altMod / _zoomMod; _mZ = GVAR(camBoom) / _zoomMod; _pan = (GVAR(camPan) + 360) % 360; @@ -39,6 +43,6 @@ _z = (_oldPos select 2) + _mZ; GVAR(camPos) = [_x,_y,_z max (getTerrainHeightASL [_x,_y])]; // Update camera position and rotation -GVAR(camera) setPosASL GVAR(camPos); -GVAR(camera) setDir GVAR(camPan); -[GVAR(camera), GVAR(camTilt), 0] call BIS_fnc_setPitchBank; +_camera setPosASL GVAR(camPos); +_camera setDir GVAR(camPan); +[_camera, GVAR(camTilt), 0] call BIS_fnc_setPitchBank; From d06680e2a0bc03a47d9fb7f8dbfa4222d8ab75b2 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 29 Aug 2015 11:47:56 -0500 Subject: [PATCH 090/137] #1571 - Handle Null Attached Objects --- addons/attach/functions/fnc_canDetach.sqf | 10 +++++++++- addons/attach/functions/fnc_handleKilled.sqf | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/addons/attach/functions/fnc_canDetach.sqf b/addons/attach/functions/fnc_canDetach.sqf index 303d0baf44..915295e6c9 100644 --- a/addons/attach/functions/fnc_canDetach.sqf +++ b/addons/attach/functions/fnc_canDetach.sqf @@ -19,13 +19,21 @@ params ["_attachToVehicle", "_unit"]; TRACE_2("params",_attachToVehicle,_unit); +_attachedList = _attachToVehicle getVariable [QGVAR(attached), []]; +if ((count _attachedList) == 0) exitWith {false}; + private ["_inRange"]; _inRange = false; { _x params ["_xObject"]; + if (isNull _xObject) exitWith { + TRACE_1("Null attached",_x); + _attachedList deleteAt _forEachIndex; + _attachToVehicle setVariable [QGVAR(attached), _attachedList, true]; + }; if (((getPos _unit) distance2d (getPos _xObject)) < 4) exitWith {_inRange = true}; -} forEach (_attachToVehicle getVariable [QGVAR(attached), []]); +} forEach _attachedList; _inRange && {(_unit == _attachToVehicle) || {canStand _unit}} && diff --git a/addons/attach/functions/fnc_handleKilled.sqf b/addons/attach/functions/fnc_handleKilled.sqf index 355360d95f..06c5473c88 100644 --- a/addons/attach/functions/fnc_handleKilled.sqf +++ b/addons/attach/functions/fnc_handleKilled.sqf @@ -29,6 +29,11 @@ if ((count _attachedList) == 0) exitWith {}; _x params ["_xObject"]; TRACE_2("detaching",_xObject,_deadUnit); detach _xObject; + //If it's a vehicle, also delete the attached + if (!(_deadUnit isKindOf "CAManBase")) then { + _xObject setPos ((getPos _deadUnit) vectorAdd [0, 0, -1000]); + [{deleteVehicle (_this select 0)}, [_xObject], 2] call EFUNC(common,waitAndExecute); + }; } forEach _attachedList; _deadUnit setVariable [QGVAR(attached), nil, true]; From 8307ccea9638e43fce04d3c4958eb9c57c9b7c88 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 30 Aug 2015 01:37:14 -0500 Subject: [PATCH 091/137] firedNear - use new isKindOf --- addons/hearing/functions/fnc_firedNear.sqf | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index 1ede8db3ea..1ee84a2dc8 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -7,8 +7,8 @@ * 1: Firer: Object - Object which fires a weapon near the unit * 2: Distance - Distance in meters between the unit and firer * 3: weapon - Fired weapon - * 4: muzzle - Muzzle that was used - * 5: mod - Current mode of the fired weapon + * 4: muzzle - Muzzle that was used (not used) + * 5: mode - Current mode of the fired weapon (not used) * 6: ammo - Ammo used * * Return Value: @@ -16,6 +16,7 @@ * * Example: * [clientFiredNearEvent] call ace_hearing_fnc_firedNear + * [player, player, 10, "arifle_MX_ACO_pointer_F", "arifle_MX_ACO_pointer_F", "single", "B_65x39_Caseless"] call ace_hearing_fnc_firedNear * * Public: No */ @@ -24,14 +25,14 @@ //Only run if deafness or ear ringing is enabled: if ((!GVAR(enableCombatDeafness)) && GVAR(DisableEarRinging)) exitWith {}; -params ["_object", "_firer", "_distance", "_weapon", "_muzzle", "_mode", "_ammo"]; +params ["_object", "_firer", "_distance", "_weapon", "", "", "_ammo"]; //Only run if firedNear object is player or player's vehicle: if ((ACE_player != _object) && {(vehicle ACE_player) != _object}) exitWith {}; if (_weapon in ["Throw", "Put"]) exitWith {}; if (_distance > 50) exitWith {}; -private ["_silencer", "_audibleFireCoef", "_loudness", "_strength", "_vehAttenuation", "_magazine", "_muzzles", "_weaponMagazines", "_muzzleMagazines", "_ammoType", "_initSpeed", "_ammoConfig", "_caliber", "_parentClasses"]; +private ["_silencer", "_audibleFireCoef", "_loudness", "_strength", "_vehAttenuation", "_magazine", "_muzzles", "_weaponMagazines", "_muzzleMagazines", "_ammoType", "_initSpeed", "_ammoConfig", "_caliber"]; _vehAttenuation = if ((ACE_player == (vehicle ACE_player)) || {isTurnedOut ACE_player}) then {1} else {GVAR(playerVehAttenuation)}; @@ -78,21 +79,20 @@ if (_magazine == "") exitWith {}; _initSpeed = getNumber(configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); _ammoConfig = (configFile >> "CfgAmmo" >> _ammo); -_parentClasses = [_ammoConfig, true] call BIS_fnc_returnParents; _caliber = getNumber(_ammoConfig >> "ACE_caliber"); _caliber = call { - if ("ShellBase" in _parentClasses) exitWith { 80 }; - if ("RocketBase" in _parentClasses) exitWith { 200 }; - if ("MissileBase" in _parentClasses) exitWith { 600 }; - if ("SubmunitionBase" in _parentClasses) exitWith { 80 }; + if (_ammo isKindOf ["ShellBase", (configFile >> "CfgAmmo")]) exitWith { 80 }; + if (_ammo isKindOf ["RocketBase", (configFile >> "CfgAmmo")]) exitWith { 200 }; + if (_ammo isKindOf ["MissileBase", (configFile >> "CfgAmmo")]) exitWith { 600 }; + if (_ammo isKindOf ["SubmunitionBase", (configFile >> "CfgAmmo")]) exitWith { 80 }; if (_caliber <= 0) then { 6.5 } else { _caliber }; }; _loudness = (_caliber ^ 1.25 / 10) * (_initspeed / 1000) * _audibleFireCoef / 5; _strength = _vehAttenuation * (_loudness - (_loudness / 50 * _distance)); // linear drop off -//systemChat format["%1 : %2 : %3", _strength, _initSpeed, _parentClasses]; +//systemChat format["%1 : %2", _strength, _initSpeed]; //systemChat format["%1 : %2 : %3", _weapon, _magazine, _initSpeed]; if (_strength < 0.01) exitWith {}; -[{_this call FUNC(earRinging)}, [ACE_player, _strength], 0.2, 0] call EFUNC(common,waitAndExecute); +[{_this call FUNC(earRinging)}, [ACE_player, _strength], 0.2] call EFUNC(common,waitAndExecute); From 910bb151e252d4c116b5603459194301d8d78aa9 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 30 Aug 2015 01:47:40 -0500 Subject: [PATCH 092/137] #1988 - Boost explosive hearing damage --- addons/hearing/CfgEventHandlers.hpp | 2 +- addons/hearing/functions/fnc_explosionNear.sqf | 8 ++++++-- addons/hearing/functions/fnc_moduleHearing.sqf | 3 +-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/addons/hearing/CfgEventHandlers.hpp b/addons/hearing/CfgEventHandlers.hpp index ce968ed2ca..f09f259266 100644 --- a/addons/hearing/CfgEventHandlers.hpp +++ b/addons/hearing/CfgEventHandlers.hpp @@ -29,7 +29,7 @@ class Extended_FiredNear_EventHandlers { class Extended_Explosion_EventHandlers { class CAManBase { class GVAR(ExplosionNear) { - clientExplosion = QUOTE( if (GVAR(enableCombatDeafness) && {_this select 0 == ACE_player}) then {_this call FUNC(explosionNear)}; ); + clientExplosion = QUOTE(_this call FUNC(explosionNear);); }; }; }; diff --git a/addons/hearing/functions/fnc_explosionNear.sqf b/addons/hearing/functions/fnc_explosionNear.sqf index 8cea263fec..7e4d0b9bfc 100644 --- a/addons/hearing/functions/fnc_explosionNear.sqf +++ b/addons/hearing/functions/fnc_explosionNear.sqf @@ -21,8 +21,12 @@ if ((!GVAR(enableCombatDeafness)) && GVAR(DisableEarRinging)) exitWith {}; params ["_unit", "_damage"]; +if (_unit != ACE_player) exitWith {}; + +TRACE_2("explosion near player",_unit,_damage); + private ["_strength"]; -_strength = 0 max _damage; +_strength = (0 max _damage) * 30; if (_strength < 0.01) exitWith {}; -[{_this call FUNC(earRinging)}, [_unit, _strength], 0.2, 0] call EFUNC(common,waitAndExecute); +[{_this call FUNC(earRinging)}, [_unit, _strength], 0.2] call EFUNC(common,waitAndExecute); diff --git a/addons/hearing/functions/fnc_moduleHearing.sqf b/addons/hearing/functions/fnc_moduleHearing.sqf index 035d5eaa88..2b4daecc72 100644 --- a/addons/hearing/functions/fnc_moduleHearing.sqf +++ b/addons/hearing/functions/fnc_moduleHearing.sqf @@ -9,9 +9,8 @@ * None */ #include "script_component.hpp" -params ["_logic", "_units", "_activated"]; -if !(_activated) exitWith {}; +params ["_logic"]; [_logic, QGVAR(enableCombatDeafness), "EnableCombatDeafness"] call EFUNC(common,readSettingFromModule); From 32300a0a809b62c89199bb3cc446dc628bd9eb7b Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 10:45:14 +0200 Subject: [PATCH 093/137] objectParent command replacing fnc_getBackpackAssignedUnit --- addons/backpacks/XEH_preInit.sqf | 1 - .../functions/fnc_getBackpackAssignedUnit.sqf | 22 ------------------- .../functions/fnc_onOpenInventory.sqf | 13 ++++++----- 3 files changed, 7 insertions(+), 29 deletions(-) delete mode 100644 addons/backpacks/functions/fnc_getBackpackAssignedUnit.sqf diff --git a/addons/backpacks/XEH_preInit.sqf b/addons/backpacks/XEH_preInit.sqf index a47825d0b0..f4c6a1a5d8 100644 --- a/addons/backpacks/XEH_preInit.sqf +++ b/addons/backpacks/XEH_preInit.sqf @@ -3,7 +3,6 @@ ADDON = false; PREP(backpackOpened); -PREP(getBackpackAssignedUnit); PREP(isBackpack); PREP(onOpenInventory); diff --git a/addons/backpacks/functions/fnc_getBackpackAssignedUnit.sqf b/addons/backpacks/functions/fnc_getBackpackAssignedUnit.sqf deleted file mode 100644 index 85f5966aa9..0000000000 --- a/addons/backpacks/functions/fnc_getBackpackAssignedUnit.sqf +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Author: commy2 - * - * Returns the unit that has the given backpack object equipped. - * - * Argument: - * 0: Executing Unit (Object) - * 1: A backpack object (Object) - * - * Return value: - * Unit that has the backpack equipped. (Object) - */ -#include "script_component.hpp" -scopeName "main"; - -params ["_unit","_backpack"]; -_target = objNull; -{ - if (backpackContainer _x == _backpack) then {_target = _x; breakTo "main"}; -} count nearestObjects [_unit, ["Man"], 5]; -if (isNull _target) exitWith {ACE_Player}; -_target diff --git a/addons/backpacks/functions/fnc_onOpenInventory.sqf b/addons/backpacks/functions/fnc_onOpenInventory.sqf index d79f8aed9b..afeeb21313 100644 --- a/addons/backpacks/functions/fnc_onOpenInventory.sqf +++ b/addons/backpacks/functions/fnc_onOpenInventory.sqf @@ -1,7 +1,7 @@ /* * Author: commy2 * - * Handle the open inventory event. Display message on traget client. + * Handle the open inventory event. Display message on target client. * * Argument: * Input from "InventoryOpened" eventhandler @@ -11,16 +11,17 @@ */ #include "script_component.hpp" -private "_target"; -params ["","_backpack"]; +params ["_unit","_backpack"]; -// exit if the target is not a backpack -if !([_backpack] call FUNC(isBackpack)) exitWith {}; +// exit if the target is not a real backpack, i.e. parachute, static weapon bag etc. +if !([_backpack] call FUNC(isBackpack)) exitWith {false}; // get the unit that wears the backpack object -_target = _this call FUNC(getBackpackAssignedUnit); +private "_target"; +_target = objectParent _backpack; if (isNull _target) exitWith {false}; + // raise event on target unit ["backpackOpened", _target, [_target, _backpack]] call EFUNC(common,targetEvent); From 4682235d8a937fa6e02ebfa808442c214380191e Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 11:13:26 +0200 Subject: [PATCH 094/137] increase reach in 3rd person for opening doors, fix #2301 --- addons/interaction/XEH_postInit.sqf | 2 +- addons/interaction/functions/fnc_openDoor.sqf | 4 ++-- addons/interaction/script_component.hpp | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf index 8db2d34ad1..801102b4d4 100644 --- a/addons/interaction/XEH_postInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -35,7 +35,7 @@ private ["_team"]; // Conditions: canInteract if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if (GVAR(isOpeningDoor) || {[2] call FUNC(getDoor) select 1 == ''}) exitWith {false}; + if (GVAR(isOpeningDoor) || {[MACRO_DOOR_REACH_DISTANCE] call FUNC(getDoor) select 1 == ''}) exitWith {false}; // Statement call EFUNC(interaction,openDoor); diff --git a/addons/interaction/functions/fnc_openDoor.sqf b/addons/interaction/functions/fnc_openDoor.sqf index db808e2eba..9555502a93 100644 --- a/addons/interaction/functions/fnc_openDoor.sqf +++ b/addons/interaction/functions/fnc_openDoor.sqf @@ -18,7 +18,7 @@ private ["_info", "_phase", "_position", "_time", "_usedMouseWheel", "_getDoorAnimations"]; -_info = [2] call FUNC(getDoor); +_info = [MACRO_DOOR_REACH_DISTANCE] call FUNC(getDoor); EXPLODE_2_PVT(_info,_house,_door); @@ -36,7 +36,7 @@ if (_house animationPhase (_animations select 0) <= 0 && {_house getVariable [_l }; GVAR(isOpeningDoor) = true; -playSound "ACE_Sound_Click"; +playSound "ACE_Sound_Click"; //@todo replace with smth. more fitting [_house, _animations] spawn { private ["_house", "_animations", "_phase", "_position", "_time", "_usedMouseWheel"]; diff --git a/addons/interaction/script_component.hpp b/addons/interaction/script_component.hpp index 68f22e96d7..d668387bb9 100644 --- a/addons/interaction/script_component.hpp +++ b/addons/interaction/script_component.hpp @@ -9,4 +9,6 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_INTERACTION #endif -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" + +#define MACRO_DOOR_REACH_DISTANCE (AGLToASL positionCameraToWorld [0,0,0] vectorDistance AGLToASL (ACE_player modelToWorld (ACE_player selectionPosition "Head"))) + 2 From 58ec4a68cb00f90a404ef51f47b35434c0482647 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 12:01:13 +0200 Subject: [PATCH 095/137] fix weapon select in ffv slots not working --- addons/weaponselect/XEH_postInit.sqf | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/weaponselect/XEH_postInit.sqf b/addons/weaponselect/XEH_postInit.sqf index dfb70f4f71..d2bfb55236 100644 --- a/addons/weaponselect/XEH_postInit.sqf +++ b/addons/weaponselect/XEH_postInit.sqf @@ -7,7 +7,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(SelectPistolNew), localize LSTRING(SelectPistol), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -21,7 +21,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(SelectRifleNew), localize LSTRING(SelectRifle), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -35,7 +35,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(SelectRifleMuzzleNew), localize LSTRING(SelectRifleMuzzle), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -49,7 +49,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(SelectLauncherNew), localize LSTRING(SelectLauncher), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -63,7 +63,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(SelectBinocularNew), localize LSTRING(SelectBinocular), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -77,7 +77,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(SelectGrenadeFrag), localize LSTRING(SelectGrenadeFrag), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -91,7 +91,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(SelectGrenadeOther), localize LSTRING(SelectGrenadeOther), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -105,7 +105,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Weapons", QGVAR(HolsterWeapon), localize LSTRING(HolsterWeapon), { // Conditions: canInteract - if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, ACE_player, ["isNotInside", "isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; @@ -130,12 +130,12 @@ if !(hasInterface) exitWith {}; ["ACE3 Vehicles", QGVAR(EngineOn), localize LSTRING(EngineOn), { // Conditions: canInteract - if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !((ACE_player != vehicle ACE_player) && {ACE_player == driver vehicle ACE_player} && {!isEngineOn vehicle ACE_player}) exitWith {false}; // Statement - (vehicle ACE_player) engineOn true; + vehicle ACE_player engineOn true; true }, {false}, @@ -144,12 +144,12 @@ if !(hasInterface) exitWith {}; ["ACE3 Vehicles", QGVAR(EngineOff), localize LSTRING(EngineOff), { // Conditions: canInteract - if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !(ACE_player != vehicle ACE_player && {ACE_player == driver vehicle ACE_player} && {isEngineOn vehicle ACE_player}) exitWith {false}; // Statement - (vehicle ACE_player) engineOn false; + vehicle ACE_player engineOn false; true }, {false}, @@ -158,7 +158,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Vehicles", QGVAR(SelectMainGunNew), localize LSTRING(SelectMainGun), { // Conditions: canInteract - if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !(ACE_player != vehicle ACE_player) exitWith {false}; @@ -172,7 +172,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Vehicles", QGVAR(SelectMachineGunNew), localize LSTRING(SelectMachineGun), { // Conditions: canInteract - if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !(ACE_player != vehicle ACE_player) exitWith {false}; @@ -186,7 +186,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Vehicles", QGVAR(SelectMissilesNew), localize LSTRING(SelectMissiles), { // Conditions: canInteract - if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !(ACE_player != vehicle ACE_player) exitWith {false}; @@ -200,7 +200,7 @@ if !(hasInterface) exitWith {}; ["ACE3 Vehicles", QGVAR(FireSmokeLauncher), localize LSTRING(FireSmokeLauncher), { // Conditions: canInteract - if !([ACE_player, (vehicle ACE_player), []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific if !(ACE_player != vehicle ACE_player && {ACE_player == commander vehicle ACE_player}) exitWith {false}; From 610bb7a1df1e292cd522c98117cfcc5a049847fc Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 13:10:25 +0200 Subject: [PATCH 096/137] better animation for spotting scope, fix #1638 --- addons/spottingscope/CfgMoves.hpp | 28 ++++++++++++++++++++ addons/spottingscope/CfgVehicles.hpp | 2 +- addons/spottingscope/config.cpp | 5 ++-- addons/spottingscope/data/spottingscope.p3d | Bin 1583477 -> 1585552 bytes 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 addons/spottingscope/CfgMoves.hpp diff --git a/addons/spottingscope/CfgMoves.hpp b/addons/spottingscope/CfgMoves.hpp new file mode 100644 index 0000000000..c7436801ee --- /dev/null +++ b/addons/spottingscope/CfgMoves.hpp @@ -0,0 +1,28 @@ + +class CfgMovesBasic { + class DefaultDie; + + class ManActions { + ACE_SpottingScope = "ACE_SpottingScope"; + }; +}; + +class CfgMovesMaleSdr: CfgMovesBasic { + class States { + class ACE_KIA_SpottingScope: DefaultDie { + actions = "DeadActions"; + file = "\A3\anims_f\Data\Anim\Sdr\dth\pne\stp\ras\Rfl\AdthPpneMstpSrasWrflDnon_1"; + speed = 1; + looped = "false"; + terminal = 1; + soundEnabled = 0; + connectTo[] = {"Unconscious",0.1}; + }; + + class Crew; + class ACE_SpottingScope: Crew { + file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\stp\non\non\AmovPpneMstpSnonWnonDnon"; + interpolateTo[] = {"ACE_KIA_SpottingScope",1}; + }; + }; +}; diff --git a/addons/spottingscope/CfgVehicles.hpp b/addons/spottingscope/CfgVehicles.hpp index b0b8bf9c77..2c8159fbb1 100644 --- a/addons/spottingscope/CfgVehicles.hpp +++ b/addons/spottingscope/CfgVehicles.hpp @@ -77,7 +77,7 @@ class CfgVehicles { gunnerOpticsEffect[] = {"OpticsCHAbera1","OpticsBlur2"}; gunnerOutOpticsShowCursor = 0; gunnerOpticsShowCursor = 0; - gunnerAction = "gunner_static_low01"; + gunnerAction = "ACE_SpottingScope"; gunnerGetInAction = "GetInLow"; gunnerGetOutAction = "GetOutLow"; gunnerForceOptics = 0; diff --git a/addons/spottingscope/config.cpp b/addons/spottingscope/config.cpp index a615e5da79..157e430868 100644 --- a/addons/spottingscope/config.cpp +++ b/addons/spottingscope/config.cpp @@ -6,11 +6,12 @@ class CfgPatches { weapons[] = {"ACE_SpottingScope"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_apl", "ace_interaction"}; - author[] = {"Rocko", "Scubaman3D", "Ruthberg"}; + author[] = {"Rocko", "Scubaman3D", "Ruthberg", "commy2"}; VERSION_CONFIG; }; }; #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" -#include "CfgWeapons.hpp" \ No newline at end of file +#include "CfgWeapons.hpp" +#include "CfgMoves.hpp" diff --git a/addons/spottingscope/data/spottingscope.p3d b/addons/spottingscope/data/spottingscope.p3d index c4e0363dcf124ff1181bf332bfe028297e309950..fba9d66b913cf18b1cfef9b7e191808ce19c91d3 100644 GIT binary patch delta 690 zcmex*DPh9ngbg2TRldxeW6!|Az_=i|-{wYYt$p7ND1X{+n=Rgr`yVxPI&8OH#kC<( zGObU;X6vtdd(-MK)+p@eyYt)c&S%_ycRtg~4_wN@sX3|1C8;UO+aJtee#kt%;fFB$ z^aopn`?t+xUc)?HUxtru`!;UALlWD4Rx)d@Aa66%0ZXOE|vu>B0$9D1- zaYk}ivgfGdF>=BJ_U#iEaEP8G&bX6#oLhwO7&onvbNjSLu4WD5j3W@{oA1s~y)=_ss7#9Th+uTU4wf9ef@~7>#+2Y-}KW^b0`|UZKxHcq8 zruJ#rZ2eVlZ(9Au8in0_cYgcb`Hb7|&SzTrVf#a2zGD*Gt2Z)ht|89!6R|8g9=J_! z_g%&U#H`zWm$99^MVygVjqEw5c2>rFA(zqF+UIs0I?ttgXD#QSOkbgfmm$&nrGq- zCM--$3=G>1q$PGU`w|nqpy^ From fc6f97e09eec448ffe7e556463758f911685d8c8 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 13:29:23 +0200 Subject: [PATCH 097/137] fix autoriflemen spawning with 0x frag grenade bug --- addons/overheating/CfgWeapons.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/overheating/CfgWeapons.hpp b/addons/overheating/CfgWeapons.hpp index 025fa5e280..5c9717dbcf 100644 --- a/addons/overheating/CfgWeapons.hpp +++ b/addons/overheating/CfgWeapons.hpp @@ -9,7 +9,7 @@ class CfgWeapons { picture = QUOTE(PATHTOF(UI\spare_barrel_ca.paa)); scope = 2; class ItemInfo: InventoryItem_Base_F { - mass = 50; + mass = 30; }; }; From 8d589ea8f00f6b7809a2a2474f1f9a3295a0615d Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 15:50:51 +0200 Subject: [PATCH 098/137] solution for custom cameras (for intros) being broken with ACE --- addons/optics/XEH_postInit.sqf | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/addons/optics/XEH_postInit.sqf b/addons/optics/XEH_postInit.sqf index df6d0ae486..b4c326d31a 100644 --- a/addons/optics/XEH_postInit.sqf +++ b/addons/optics/XEH_postInit.sqf @@ -3,8 +3,18 @@ if (!hasInterface) exitWith {}; +#define ALL_CAMERAS [ \ + missionNamespace getVariable ["BIS_DEBUG_CAM", objNull], \ + missionNamespace getVariable ["BIS_fnc_camera_cam", objNull], \ + uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull], \ + uiNamespace getVariable ["BIS_fnc_animViewer_cam", objNull], \ + missionNamespace getVariable ["BIS_fnc_establishingShot_fakeUAV", objNull], \ + missionNamespace getVariable ["ACE_CustomCamera", objNull] \ +] + 0 = 0 spawn { waituntil {!isNull ACE_player}; + waituntil {sleep 0.5; {!isNull _x} count ALL_CAMERAS == 0}; // PiP technique by BadBenson GVAR(camera) = "camera" camCreate positioncameratoworld [0,0,0]; From 74dfd73167569f63ab547866f992b96c28a75289 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 19:05:35 +0200 Subject: [PATCH 099/137] fix issues with pip optics camera in virtual arsenal --- addons/common/XEH_postInit.sqf | 11 +------- addons/optics/XEH_postInit.sqf | 27 +++++++++---------- addons/optics/functions/fnc_onDrawScope2D.sqf | 4 +-- 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 1f060c8900..cd1c8c2dd0 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -284,22 +284,13 @@ GVAR(OldVisibleMap) = false; }, 0, []] call CBA_fnc_addPerFrameHandler; -// PFH to raise camera created event. Only works on these cams by BI. -#define ALL_CAMERAS [ \ - missionNamespace getVariable ["BIS_DEBUG_CAM", objNull], \ - missionNamespace getVariable ["BIS_fnc_camera_cam", objNull], \ - uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull], \ - uiNamespace getVariable ["BIS_fnc_animViewer_cam", objNull], \ - missionNamespace getVariable ["BIS_fnc_establishingShot_fakeUAV", objNull] \ -] - GVAR(OldIsCamera) = false; [{ // "activeCameraChanged" event private ["_isCamera"]; - _isCamera = {!isNull _x} count ALL_CAMERAS > 0; + _isCamera = call FUNC(isfeatureCameraActive); if !(_isCamera isEqualTo GVAR(OldIsCamera)) then { // Raise ACE event locally GVAR(OldIsCamera) = _isCamera; diff --git a/addons/optics/XEH_postInit.sqf b/addons/optics/XEH_postInit.sqf index b4c326d31a..34b52b83fb 100644 --- a/addons/optics/XEH_postInit.sqf +++ b/addons/optics/XEH_postInit.sqf @@ -3,26 +3,22 @@ if (!hasInterface) exitWith {}; -#define ALL_CAMERAS [ \ - missionNamespace getVariable ["BIS_DEBUG_CAM", objNull], \ - missionNamespace getVariable ["BIS_fnc_camera_cam", objNull], \ - uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull], \ - uiNamespace getVariable ["BIS_fnc_animViewer_cam", objNull], \ - missionNamespace getVariable ["BIS_fnc_establishingShot_fakeUAV", objNull], \ - missionNamespace getVariable ["ACE_CustomCamera", objNull] \ -] +GVAR(camera) = objNull; 0 = 0 spawn { waituntil {!isNull ACE_player}; - waituntil {sleep 0.5; {!isNull _x} count ALL_CAMERAS == 0}; + waituntil {sleep 0.5; !(call EFUNC(common,isfeatureCameraActive)) && isNull (missionNamespace getVariable ["ACE_CustomCamera", objNull])}; + + GVAR(camera) cameraEffect ["TERMINATE", "BACK"]; + camDestroy GVAR(camera); // PiP technique by BadBenson - GVAR(camera) = "camera" camCreate positioncameratoworld [0,0,0]; + GVAR(camera) = "camera" camCreate positionCameraToWorld [0,0,0]; GVAR(camera) camSetFov 0.7; GVAR(camera) camSetTarget ACE_player; GVAR(camera) camCommit 1; - "ace_optics_rendertarget0" setPiPEffect [2, 1.0, 1.0, 1.0, 0.0, [0.0, 1.0, 0.0, 0.25], [1.0, 0.0, 1.0, 1.0], [0.199, 0.587, 0.114, 0.0]]; + "ace_optics_rendertarget0" setPiPEffect [0]; GVAR(camera) cameraEffect ["INTERNAL", "BACK", "ace_optics_rendertarget0"]; }; @@ -33,18 +29,19 @@ if (!hasInterface) exitWith {}; }; }] call EFUNC(common,addEventHandler); -// camera has to be re-created every ACE_time another camera is created. Otherwise r2t is either black or transparent. @todo Add popular custom cameras to the event in ACE_common. +// camera has to be re-created every time another camera is created. Otherwise r2t is either black or transparent. @todo Add popular custom cameras to the event in ACE_common. ["activeCameraChanged", { if !(_this select 1) then { - deleteVehicle GVAR(camera); + GVAR(camera) cameraEffect ["TERMINATE", "BACK"]; + camDestroy GVAR(camera); // PiP technique by BadBenson - GVAR(camera) = "camera" camCreate positioncameratoworld [0,0,0]; + GVAR(camera) = "camera" camCreate positionCameraToWorld [0,0,0]; GVAR(camera) camSetFov 0.7; GVAR(camera) camSetTarget ACE_player; GVAR(camera) camCommit 1; - "ace_optics_rendertarget0" setPiPEffect [2, 1.0, 1.0, 1.0, 0.0, [0.0, 1.0, 0.0, 0.25], [1.0, 0.0, 1.0, 1.0], [0.199, 0.587, 0.114, 0.0]]; + "ace_optics_rendertarget0" setPiPEffect [0]; GVAR(camera) cameraEffect ["INTERNAL", "BACK", "ace_optics_rendertarget0"]; }; }] call EFUNC(common,addEventHandler); diff --git a/addons/optics/functions/fnc_onDrawScope2D.sqf b/addons/optics/functions/fnc_onDrawScope2D.sqf index 7abee8f122..9ea038f877 100644 --- a/addons/optics/functions/fnc_onDrawScope2D.sqf +++ b/addons/optics/functions/fnc_onDrawScope2D.sqf @@ -22,8 +22,8 @@ _optic = (primaryWeaponItems ACE_player) select 2; _isPIP = (getText (configFile >> "CfgWeapons" >> _optic >> "ItemInfo" >> "modelOptics")) == QUOTE(PATHTOF(models\ace_optics_pip.p3d)); if (_isPIP) then { - GVAR(camera) setposATL positioncameratoworld [0,0,0.4]; - GVAR(camera) camPrepareTarget positioncameratoworld [0,0,50]; + GVAR(camera) setPosATL positionCameraToWorld [0,0,0.4]; + GVAR(camera) camPrepareTarget positionCameraToWorld [0,0,50]; GVAR(camera) camCommitPrepared 0; // @todo, check if that needs to be done at all From c18af0d34bb2f0ab8520a12f9707ad94bda8de65 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 19:30:44 +0200 Subject: [PATCH 100/137] completely prevent ace_optics from interfering with any mission camera scripts --- addons/optics/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/optics/XEH_postInit.sqf b/addons/optics/XEH_postInit.sqf index 34b52b83fb..64226fcf3d 100644 --- a/addons/optics/XEH_postInit.sqf +++ b/addons/optics/XEH_postInit.sqf @@ -7,7 +7,7 @@ GVAR(camera) = objNull; 0 = 0 spawn { waituntil {!isNull ACE_player}; - waituntil {sleep 0.5; !(call EFUNC(common,isfeatureCameraActive)) && isNull (missionNamespace getVariable ["ACE_CustomCamera", objNull])}; + waituntil {sleep 1; {_x != GVAR(camera)} count allMissionObjects "camera" == 0}; GVAR(camera) cameraEffect ["TERMINATE", "BACK"]; camDestroy GVAR(camera); From fae38a223255f2c95a9dd09bd2fc715988fc8e68 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 20:20:00 +0200 Subject: [PATCH 101/137] tripod hmgs should have 100rnd mags instead of 500rnd mags, fix #1190 --- addons/vehicles/CfgVehicles.hpp | 93 +++++++++++++++++++++++++++++++++ addons/vehicles/CfgWeapons.hpp | 5 ++ 2 files changed, 98 insertions(+) diff --git a/addons/vehicles/CfgVehicles.hpp b/addons/vehicles/CfgVehicles.hpp index fa60a72961..a07781a413 100644 --- a/addons/vehicles/CfgVehicles.hpp +++ b/addons/vehicles/CfgVehicles.hpp @@ -331,4 +331,97 @@ class CfgVehicles { }; }; }; + + // static mgs shouldn't use 500 rnd mags. + class StaticWeapon: LandVehicle { + class Turrets { + class MainTurret; //: NewTurret {}; + }; + }; + + class StaticMGWeapon: StaticWeapon {}; + + class HMG_01_base_F: StaticMGWeapon { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag","100Rnd_127x99_mag","100Rnd_127x99_mag","100Rnd_127x99_mag","100Rnd_127x99_mag"}; + }; + }; + }; + + class B_HMG_01_F: HMG_01_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red"}; + }; + }; + }; + + class O_HMG_01_F: HMG_01_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green"}; + }; + }; + }; + + class I_HMG_01_F: HMG_01_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow"}; + }; + }; + }; + + class HMG_01_high_base_F: HMG_01_base_F {}; + + class B_HMG_01_high_F: HMG_01_high_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red"}; + }; + }; + }; + + class O_HMG_01_high_F: HMG_01_high_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green"}; + }; + }; + }; + + class I_HMG_01_high_F: HMG_01_high_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow"}; + }; + }; + }; + + class HMG_01_A_base_F: HMG_01_base_F {}; + + class B_HMG_01_A_F: HMG_01_A_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red"}; + }; + }; + }; + + class O_HMG_01_A_F: HMG_01_A_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Green"}; + }; + }; + }; + + class I_HMG_01_A_F: HMG_01_A_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag_Tracer_Yellow"}; + }; + }; + }; }; diff --git a/addons/vehicles/CfgWeapons.hpp b/addons/vehicles/CfgWeapons.hpp index 2eee38643f..76feb1818a 100644 --- a/addons/vehicles/CfgWeapons.hpp +++ b/addons/vehicles/CfgWeapons.hpp @@ -62,4 +62,9 @@ class CfgWeapons { muzzles[] = {"AP"}; }; + + // make static weapons compatible with 100rnd mag variants + class HMG_static: HMG_01 { + magazines[] = {"500Rnd_127x99_mag","500Rnd_127x99_mag_Tracer_Red","500Rnd_127x99_mag_Tracer_Green","500Rnd_127x99_mag_Tracer_Yellow","200Rnd_127x99_mag","200Rnd_127x99_mag_Tracer_Red","200Rnd_127x99_mag_Tracer_Green","200Rnd_127x99_mag_Tracer_Yellow","100Rnd_127x99_mag","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Green","100Rnd_127x99_mag_Tracer_Yellow"}; + }; }; From 7a4c37c0854cab20cb6211f379823b37ce6f6a2c Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Aug 2015 22:03:45 +0200 Subject: [PATCH 102/137] disable all actions on ladders by default, close #2289 --- .../functions/fnc_compileMenuSelfAction.sqf | 2 +- addons/interact_menu/functions/fnc_keyDown.sqf | 2 +- addons/interaction/CfgVehicles.hpp | 18 +++++++++--------- addons/interaction/XEH_postInit.sqf | 1 + 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index f486b3ee58..2c8cdc279c 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -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", "isNotSitting"]] call EFUNC(common,canInteractWith)}, + {[ACE_player, _target, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder"]] call EFUNC(common,canInteractWith)}, {}, {}, "Spine3", diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index ca06e25eb6..8c8ecf0c20 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -18,7 +18,7 @@ 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)) + !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) }) exitWith {false}; while {dialog} do { diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index d2cef4c9ef..abfdb976ab 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -191,7 +191,7 @@ class CfgVehicles { class ACE_TeamManagement { displayName = CSTRING(TeamManagement); condition = QUOTE(GVAR(EnableTeamManagement)); - exceptions[] = {"isNotInside", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; statement = ""; showDisabled = 1; priority = 3.2; @@ -201,7 +201,7 @@ class CfgVehicles { class ACE_JoinTeamRed { displayName = CSTRING(JoinTeamRed); condition = QUOTE(true); - exceptions[] = {"isNotInside", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; 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", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; 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", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; 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", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; 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", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; 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", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; 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", "isNotSitting"}; + exceptions[] = {"isNotInside", "isNotSitting", "isNotOnLadder"}; 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", "isNotSitting"}; + exceptions[] = {"isNotInside", "notOnMap", "isNotSitting"}; statement = ""; showDisabled = 1; priority = 4.5; diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf index 8db2d34ad1..0906e48d35 100644 --- a/addons/interaction/XEH_postInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -82,3 +82,4 @@ private ["_team"]; [29, [false, false, false]], false] call cba_fnc_addKeybind; ["isNotSwimming", {!underwater (_this select 0)}] call EFUNC(common,addCanInteractWithCondition); +["isNotOnLadder", {getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> animationState (_this select 0) >> "ACE_isLadder") != 1}] call EFUNC(common,addCanInteractWithCondition); From 4be7411a05228e3773b559ba8b06d072f2fbb7a9 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 30 Aug 2015 15:26:43 -0500 Subject: [PATCH 103/137] Use "visibleMapChanged" event --- addons/common/XEH_postInit.sqf | 27 +++++--------------------- addons/maptools/XEH_postInitClient.sqf | 21 ++++++++++---------- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index bbb1302218..4f58e6f3cf 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -1,4 +1,6 @@ // ACE - Common + +// #define ENABLE_PERFORMANCE_COUNTERS #include "script_component.hpp" //IGNORE_PRIVATE_WARNING("_handleNetEvent", "_handleRequestAllSyncedEvents", "_handleRequestSyncedEvent", "_handleSyncedEvent"); @@ -208,6 +210,7 @@ GVAR(OldVisibleMap) = false; // PFH to raise varios events [{ + BEGIN_COUNTER(stateChecker); private ["_newCameraView", "_newInventoryDisplayIsOpen", "_newPlayerInventory", "_newPlayerTurret", "_newPlayerVehicle", "_newPlayerVisionMode", "_newPlayerWeapon", "_newZeusDisplayIsOpen", "_newVisibleMap"]; // "playerInventoryChanged" event _newPlayerInventory = [ACE_player] call FUNC(getAllGear); @@ -281,6 +284,8 @@ GVAR(OldVisibleMap) = false; ["visibleMapChanged", [ACE_player, _newVisibleMap]] call FUNC(localEvent); }; + END_COUNTER(stateChecker); + }, 0, []] call CBA_fnc_addPerFrameHandler; @@ -381,26 +386,4 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [true, false, false]], false] call cba_fnc_addKeybind; //SHIFT + Home Key -//Map opened/closed Events: -GVAR(mapOpened) = false; -[{ - if (!isNull (findDisplay 12)) then { - [_this select 1] call CBA_fnc_removePerFrameHandler; - TRACE_1("Installing Map Draw EH for MapOpened event"); - ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", { - if (!GVAR(mapOpened)) then { - GVAR(mapOpened) = true; - ["mapOpened", []] call FUNC(localEvent); - [{ - if (!visibleMap) then { - GVAR(mapOpened) = false; - ["mapClosed", []] call FUNC(localEvent); - [_this select 1] call CBA_fnc_removePerFrameHandler; - }; - }, 0, []] call CBA_fnc_addPerFrameHandler; - }; - }]; - }; -}, 0, []] call CBA_fnc_addPerFrameHandler; - GVAR(commonPostInited) = true; diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index 1e428f71b7..06cb8eda3d 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -66,14 +66,15 @@ GVAR(drawing_controls) = [36732, 36733, 36734, 36735, 36736, 36737]; 12 call _fnc_installMapEvents; }; -["mapOpened", { - // Show GPS if required - [GVAR(mapGpsShow)] call FUNC(openMapGps); -}] call EFUNC(common,addEventHandler); - -["mapClosed", { - // Hide GPS - [false] call FUNC(openMapGps); - // Cancel drawing - call FUNC(cancelDrawing); +["visibleMapChanged", { + params ["", "_mapOn"]; + if (_mapOn) then { + // Show GPS if required + [GVAR(mapGpsShow)] call FUNC(openMapGps); + } else { + // Hide GPS + [false] call FUNC(openMapGps); + // Cancel drawing + call FUNC(cancelDrawing); + }; }] call EFUNC(common,addEventHandler); From 04269831e87a6526175bf8adb4ec2c3698024458 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 31 Aug 2015 14:40:31 +0100 Subject: [PATCH 104/137] Consider modifier keys for zeus interaction hack The hacky keybind detection method should consider modifier keys also to prevent keybinds on the same key with different modifiers from firing --- addons/interact_menu/XEH_clientInit.sqf | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index 7c7724d9b4..31dedfbe22 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -80,18 +80,26 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; if (_this select 1) then { (finddisplay 312) displayAddEventHandler ["KeyUp", { _key = ["ACE3 Common","ace_interact_menu_InteractKey"] call CBA_fnc_getKeybind; - _key = (_key select 5) select 0; + _key = _key select 5; + _dik = _key select 0; + _mods = _key select 1; - if ((_this select 1) == _key) then { - [_this,'keyup'] call CBA_events_fnc_keyHandler + if ((_this select 1) == _dik) then { + if ((_this select [2,3]) isEqualTo _mods) then { + [_this,'keyup'] call CBA_events_fnc_keyHandler + }; }; }]; (finddisplay 312) displayAddEventHandler ["KeyDown", { _key = ["ACE3 Common","ace_interact_menu_InteractKey"] call CBA_fnc_getKeybind; - _key = (_key select 5) select 0; + _key = _key select 5; + _dik = _key select 0; + _mods = _key select 1; - if ((_this select 1) == _key) then { - [_this,'keydown'] call CBA_events_fnc_keyHandler + if ((_this select 1) == _dik) then { + if ((_this select [2,3]) isEqualTo _mods) then { + [_this,'keydown'] call CBA_events_fnc_keyHandler + }; }; }]; }; From 543e829278bdb76f76592dc384e122f609708120 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 31 Aug 2015 14:56:51 +0100 Subject: [PATCH 105/137] Fix goggles overlay for FFV seats When aiming down sights, view is considered to be "gunner" and so the overlay would be disabled. Introduces addition canUseWeapon check if view is "gunner" to differentiate FFV seats from regular gunner seats --- addons/goggles/functions/fnc_checkGoggles.sqf | 2 +- addons/goggles/functions/fnc_isGogglesVisible.sqf | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/goggles/functions/fnc_checkGoggles.sqf b/addons/goggles/functions/fnc_checkGoggles.sqf index f222ea9881..84b86c3da4 100644 --- a/addons/goggles/functions/fnc_checkGoggles.sqf +++ b/addons/goggles/functions/fnc_checkGoggles.sqf @@ -18,7 +18,7 @@ if (!alive ace_player) exitWith {}; if (true) then { // Detect if curator interface is open and disable effects - if (!isNull(findDisplay 312)) exitWith { + if !(isNull curatorCamera) exitWith { if (GVAR(EffectsActive)) then { call FUNC(removeGlassesEffect); }; diff --git a/addons/goggles/functions/fnc_isGogglesVisible.sqf b/addons/goggles/functions/fnc_isGogglesVisible.sqf index 253a82f0a3..9f586a9cbf 100644 --- a/addons/goggles/functions/fnc_isGogglesVisible.sqf +++ b/addons/goggles/functions/fnc_isGogglesVisible.sqf @@ -15,14 +15,16 @@ */ #include "script_component.hpp" -PARAMS_1(_unit); - +params ["_unit"]; private ["_currentGlasses", "_result", "_position", "_visible"]; _currentGlasses = goggles _unit; _result = false; -if ((vehicle _unit) != _unit) exitWith {(cameraView != "GUNNER")}; +if ((vehicle _unit) != _unit) exitWith { + (cameraView != "GUNNER") || + {[_unit] call EFUNC(common,canUseWeapon)} +}; if (_currentGlasses != "") then { _position =(getPosASLW _unit); From 397d77e5b553db45cf635d5643fe71f192d2713c Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 31 Aug 2015 15:25:40 +0100 Subject: [PATCH 106/137] Remove special goggles treatment of vehicle units The condition to disable the overlay for gunners introduces more problems (and inconsistencies for that matter) than it was worth. Vehicle gunners using camera based weapons should probably consider not wearing a pair of glasses/goggles before doing so. --- addons/goggles/functions/fnc_isGogglesVisible.sqf | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/addons/goggles/functions/fnc_isGogglesVisible.sqf b/addons/goggles/functions/fnc_isGogglesVisible.sqf index 9f586a9cbf..80f9de4830 100644 --- a/addons/goggles/functions/fnc_isGogglesVisible.sqf +++ b/addons/goggles/functions/fnc_isGogglesVisible.sqf @@ -21,13 +21,8 @@ private ["_currentGlasses", "_result", "_position", "_visible"]; _currentGlasses = goggles _unit; _result = false; -if ((vehicle _unit) != _unit) exitWith { - (cameraView != "GUNNER") || - {[_unit] call EFUNC(common,canUseWeapon)} -}; - if (_currentGlasses != "") then { - _position =(getPosASLW _unit); + _position = getPosASLW _unit; if (surfaceIsWater _position && {((_position select 2) < 0.25)}) exitWith { _result = ([_currentGlasses] call FUNC(isDivingGoggles)); }; From e1d683d8dc09a83bb09b09df3278de0bc6813d24 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 31 Aug 2015 17:31:37 +0200 Subject: [PATCH 107/137] laserpointer with new command lineintersectssurface --- .../functions/fnc_drawLaserpoint.sqf | 103 +++--------------- addons/laserpointer/functions/fnc_onDraw.sqf | 2 +- 2 files changed, 19 insertions(+), 86 deletions(-) diff --git a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf index e69fc5e271..34ca98808b 100644 --- a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf +++ b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf @@ -1,30 +1,11 @@ // by commy2 and esteldunedain #include "script_component.hpp" -private ["_p0", "_p1", "_p0Pos", "_offV1", "_offV2", "_offV3", "_camPos", "_intermediatePos", "_iteration", "_light", "_line", "_pL", "_pL2", "_pX", "_size", "_units", "_fnc_getDistanceToTerrain", "_fnc_doesIntersectWithMan"]; +params ["_unit", "_range", "_isGreen", "_brightness"]; -// init object -/*if (isNil QGVAR(laserdot)) then { - _light = "#lightpoint" createVehicleLocal [0,0,0]; - _light setLightBrightness 10; - _light setLightColor [1,0,0]; - _light setLightAmbient [1,0,0]; - _light setLightDayLight true; - //_light lightAttachObject [GVAR(laserdot), [0,0,0]]; - _light setLightAttenuation [0.04,4,4,0,0.04,0.08]; +private ["_p0", "_v1", "_v2", "_v3", "_p1", "_pL", "_distance", "_pL2", "_camPos", "_size"]; - GVAR(laserdot) = _light; -};*/ - -EXPLODE_4_PVT(_this,_unit,_range,_isGreen,_brightness); - -_p0Pos = _unit modelToWorldVisual (_unit selectionPosition "righthand"); - -// Convert _p0Pos to ASL -_p0 = + _p0Pos; -if (!surfaceIsWater _p0) then { - _p0 = ATLtoASL _p0; -}; +_p0 = AGLToASL (_unit modelToWorldVisual (_unit selectionPosition "righthand")); // Find a system of orthogonal reference vectors // _v1 points in the direction of the weapon @@ -36,68 +17,22 @@ _v3 = _v2 vectorCrossProduct _v1; // Offset over the 3 reference axis // This offset could eventually be configured by weapon in the config -_offV1 = 0.31; -_offV2 = 0; -_offV3 = 0.08; +#define OFFV1 0.31 +#define OFFV2 0 +#define OFFV3 0.08 // Offset _p0, the start of the laser -_p0 = _p0 vectorAdd (_v1 vectorMultiply _offV1) vectorAdd (_v3 vectorMultiply _offV3) vectorAdd (_v2 vectorMultiply _offV2); -_p0Pos = _p0Pos vectorAdd (_v1 vectorMultiply _offV1) vectorAdd (_v3 vectorMultiply _offV3) vectorAdd (_v2 vectorMultiply _offV2); +_p0 = _p0 vectorAdd (_v1 vectorMultiply OFFV1) vectorAdd (_v3 vectorMultiply OFFV3) vectorAdd (_v2 vectorMultiply OFFV2); + // Calculate _p1, the potential end of the laser _p1 = _p0 vectorAdd (_v1 vectorMultiply _range); -//Debugaaa = lineIntersectsObjs [_p0, _p1, objNull, _unit, false, 2]; +_pL = lineIntersectsSurfaces [_p0, _p1, ACE_player, vehicle ACE_player, true, 1, "GEOM", "FIRE"] select 0 select 0; -_fnc_getDistanceToTerrain = { - private ["_distance"]; +// no intersection found, quit +if (isNil "_pL") exitWith {}; - _pX = + _p0; - _line = [_p0, _pX]; - - _distance = _this; - _iteration = _distance; - - while {_iteration > 0.05 / 2} do { - _iteration = _iteration / 2; - - _pX = _p0 vectorAdd (_v1 vectorMultiply _distance); - - _line set [1, _pX]; - - _distance = _distance + (([1, -1] select (lineIntersects (_line + [_unit]) || {terrainIntersectASL _line})) * _iteration); - - if (_distance > _this) exitWith {_distance = _this}; - }; - - _distance -}; - -// Get distance to nearest object or terrain (excluding men) -_distance = _range call _fnc_getDistanceToTerrain; - -// Find all men potentially intercepted by the ray -_intermediatePos = _p0 vectorAdd (_v1 vectorMultiply _distance/2); -if (!surfaceIsWater _intermediatePos) then { - _intermediatePos = ASLtoATL _intermediatePos; -}; -_units = nearestObjects [_intermediatePos, ["Man"], _distance/2]; - -_units deleteAt (_units find _unit); - -_fnc_doesIntersectWithMan = { - _pX = _p0 vectorAdd (_v1 vectorMultiply (_this select 1)); - if (!surfaceIsWater _pX) then { - _pX = ASLtoATL _pX; - }; - count ([_this select 0, "FIRE"] intersect [_p0Pos, _pX]) > 0 -}; - -// Test intersection with nearby men -{ - if ([_x, _distance] call _fnc_doesIntersectWithMan) then { - _distance = _distance min ((_unit distance _x) - _offV1); - }; -} forEach _units; +_distance = _p0 vectorDistance _pL; //systemChat str _distance; if (_distance < 0.5) exitWith {}; @@ -105,31 +40,29 @@ if (_distance < 0.5) exitWith {}; _pL = _p0 vectorAdd (_v1 vectorMultiply _distance); _pL2 = _p0 vectorAdd (_v1 vectorMultiply (_distance - 0.5)); -// Convert _pL to pos -if (!surfaceIsWater _pL) then { - _pL = ASLtoATL _pL; -}; +_pL = ASLtoAGL _pL; /* drawLine3D [ - _p0Pos, + _p0, _pL, [[1,0,0,1], [0,1,0,1]] select _isGreen ]; */ -_size = 2 * (_range - (positionCameraToWorld [0,0,0] vectorDistance _pL)) / _range; +//systemChat str [_unit, "FIRE"] intersect [_camPos, _pL]; _camPos = positionCameraToWorld [0,0,0.2]; if (count ([_unit, "FIRE"] intersect [_camPos, _pL]) > 0) exitWith {}; if (count ([ACE_player, "FIRE"] intersect [_camPos, _pL]) > 0) exitWith {}; // Convert _camPos to ASL -if (!surfaceIsWater _camPos) then { _camPos = ATLtoASL _camPos; }; +_camPos = AGLToASL _camPos; + if ( terrainIntersectASL [_camPos, _pL2]) exitWith {}; if ( lineIntersects [_camPos, _pL2]) exitWith {}; -//GVAR(laserdot) setPos _pL; +_size = 2 * (_range - (positionCameraToWorld [0,0,0] vectorDistance _pL)) / _range; drawIcon3D [ format ["\a3\weapons_f\acc\data\collimdot_%1_ca.paa", ["red", "green"] select _isGreen], diff --git a/addons/laserpointer/functions/fnc_onDraw.sqf b/addons/laserpointer/functions/fnc_onDraw.sqf index 09663f9ecf..9e61e70156 100644 --- a/addons/laserpointer/functions/fnc_onDraw.sqf +++ b/addons/laserpointer/functions/fnc_onDraw.sqf @@ -35,7 +35,7 @@ _brightness = 2 - call EFUNC(common,ambientBrightness); }; if (_laserID > 0 && {_x isFlashlightOn _weapon}) then { - [_x, 50, (_laserID == 2 || _isIR), _brightness] call FUNC(drawLaserpoint); + [_x, 100, (_laserID == 2 || _isIR), _brightness] call FUNC(drawLaserpoint); }; }; From f15805d1f388293171a4daa1c2f0dca690645290 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 31 Aug 2015 20:05:38 +0200 Subject: [PATCH 108/137] setStructuralDamage function --- addons/medical/XEH_preInit.sqf | 1 + addons/medical/functions/fnc_copyDeadBody.sqf | 2 +- addons/medical/functions/fnc_setDead.sqf | 2 +- .../functions/fnc_setStructuralDamage.sqf | 25 +++++++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 addons/medical/functions/fnc_setStructuralDamage.sqf diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index b479383468..838dce7404 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -68,6 +68,7 @@ PREP(selectionNameToNumber); PREP(setCardiacArrest); PREP(setDead); PREP(setHitPointDamage); +PREP(setStructuralDamage); PREP(setUnconscious); PREP(treatment); PREP(treatment_failure); diff --git a/addons/medical/functions/fnc_copyDeadBody.sqf b/addons/medical/functions/fnc_copyDeadBody.sqf index 36bcd91487..85fea5eafc 100644 --- a/addons/medical/functions/fnc_copyDeadBody.sqf +++ b/addons/medical/functions/fnc_copyDeadBody.sqf @@ -79,5 +79,5 @@ _newUnit setvariable ["ACE_isUnconscious", true, true]; _newUnit setvariable [QGVAR(disableInteraction), true, true]; _oldBody setvariable [QGVAR(disableInteraction), true, true]; -_newUnit setDamage 0.89; +[_newUnit, 0.89] call FUNC(setStructuralDamage); _newUnit; diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index c29edcd5e3..1423d594ad 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -82,5 +82,5 @@ if (isPLayer _unit) then { ["medical_onSetDead", [_unit]] call EFUNC(common,localEvent); -_unit setdamage 1; +[_unit, 1] call FUNC(setStructuralDamage); true; diff --git a/addons/medical/functions/fnc_setStructuralDamage.sqf b/addons/medical/functions/fnc_setStructuralDamage.sqf new file mode 100644 index 0000000000..b4dc74eac1 --- /dev/null +++ b/addons/medical/functions/fnc_setStructuralDamage.sqf @@ -0,0 +1,25 @@ +/* + * Author: commy2 + * Set the structural damage of a soldier without changing the individual hitpoints. Unit has to be local. Not safe to use with vehicles! + * + * Arguments: + * 0: The unit + * + * ReturnValue: + * + * + * Public: no? + */ + +params ["_unit", "_damage"]; + +if (!local _unit) exitWith {}; + +private "_allHitPoints"; +_allHitPoints = getAllHitPointsDamage _unit select 2; + +_unit setDamage _damage; + +{ + _unit setHitIndex [_forEachIndex, _x]; +} forEach _allHitPoints; From 37aec2b3c3e984417ff0de0227806a61b5661a8b Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 31 Aug 2015 21:22:22 +0200 Subject: [PATCH 109/137] enable repairing while on ladder --- addons/repair/CfgVehicles.hpp | 1 + addons/repair/functions/fnc_canRepairTrack.sqf | 2 +- addons/repair/functions/fnc_canReplaceTrack.sqf | 2 +- addons/repair/functions/fnc_canReplaceWheel.sqf | 2 +- addons/repair/functions/fnc_doRepairTrack.sqf | 2 +- addons/repair/functions/fnc_doReplaceTrack.sqf | 2 +- addons/repair/functions/fnc_doReplaceWheel.sqf | 2 +- addons/repair/functions/fnc_repair.sqf | 2 +- 8 files changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index 47459f532d..27e8890dbc 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -10,6 +10,7 @@ priority = 2; \ icon = "\A3\ui_f\data\igui\cfg\actions\repair_ca.paa"; \ distance = 4; \ + exceptions[] = {"isNotOnLadder"}; \ }; \ }; \ }; diff --git a/addons/repair/functions/fnc_canRepairTrack.sqf b/addons/repair/functions/fnc_canRepairTrack.sqf index 34165068d7..806fa14b2e 100644 --- a/addons/repair/functions/fnc_canRepairTrack.sqf +++ b/addons/repair/functions/fnc_canRepairTrack.sqf @@ -30,7 +30,7 @@ if (typeName _wheel == "OBJECT") then { _wheel = objNull; { - if ([_unit, _x, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith { + if ([_unit, _x, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith { _wheel = _x; }; } forEach nearestObjects [_unit, ["ACE_Track"], 5]; diff --git a/addons/repair/functions/fnc_canReplaceTrack.sqf b/addons/repair/functions/fnc_canReplaceTrack.sqf index 94a62a5289..3f4ae77581 100644 --- a/addons/repair/functions/fnc_canReplaceTrack.sqf +++ b/addons/repair/functions/fnc_canReplaceTrack.sqf @@ -31,7 +31,7 @@ if (typeName _track == "OBJECT") then { _track = objNull; { - if ([_unit, _x, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith { + if ([_unit, _x, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith { _track = _x; }; } forEach nearestObjects [_unit, ["ACE_Track"], 5]; diff --git a/addons/repair/functions/fnc_canReplaceWheel.sqf b/addons/repair/functions/fnc_canReplaceWheel.sqf index 9497504370..e0a2fbbed2 100644 --- a/addons/repair/functions/fnc_canReplaceWheel.sqf +++ b/addons/repair/functions/fnc_canReplaceWheel.sqf @@ -37,7 +37,7 @@ if (typeName _wheel == "OBJECT") then { _wheel = objNull; { - if ([_unit, _x, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith { + if ([_unit, _x, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith { _wheel = _x; }; } forEach nearestObjects [_unit, ["ACE_Wheel"], 5]; diff --git a/addons/repair/functions/fnc_doRepairTrack.sqf b/addons/repair/functions/fnc_doRepairTrack.sqf index 4803518e3d..de04e71920 100644 --- a/addons/repair/functions/fnc_doRepairTrack.sqf +++ b/addons/repair/functions/fnc_doRepairTrack.sqf @@ -27,7 +27,7 @@ private ["_hitPointDamage", "_newDamage", "_wheel"]; _wheel = objNull; { - if ([_unit, _x, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith { + if ([_unit, _x, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith { _wheel = _x; }; } forEach nearestObjects [_unit, ["ACE_Track"], 5]; diff --git a/addons/repair/functions/fnc_doReplaceTrack.sqf b/addons/repair/functions/fnc_doReplaceTrack.sqf index 13e53b3f3a..a95a669159 100644 --- a/addons/repair/functions/fnc_doReplaceTrack.sqf +++ b/addons/repair/functions/fnc_doReplaceTrack.sqf @@ -27,7 +27,7 @@ private["_hitPointDamage", "_wheel"]; _wheel = objNull; { - if ([_unit, _x, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith { + if ([_unit, _x, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith { _wheel = _x; }; } forEach nearestObjects [_unit, ["ACE_Track"], 5]; diff --git a/addons/repair/functions/fnc_doReplaceWheel.sqf b/addons/repair/functions/fnc_doReplaceWheel.sqf index 62db39aa6d..f10712d65d 100644 --- a/addons/repair/functions/fnc_doReplaceWheel.sqf +++ b/addons/repair/functions/fnc_doReplaceWheel.sqf @@ -27,7 +27,7 @@ private ["_hitPointDamage", "_wheel"]; _wheel = objNull; { - if ([_unit, _x, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith { + if ([_unit, _x, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith { _wheel = _x; }; } forEach nearestObjects [_unit, ["ACE_Wheel"], 5]; diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf index 8fa7f498bd..4fa1c2d903 100644 --- a/addons/repair/functions/fnc_repair.sqf +++ b/addons/repair/functions/fnc_repair.sqf @@ -177,7 +177,7 @@ _processText = getText (_config >> "displayNameProgress"); DFUNC(repair_failure), _text, _callbackProgress, - [] + ["isNotOnLadder"] ] call EFUNC(common,progressBar); // Display Icon From 3362bbf0bf41bb496c469d549fae034d81239c51 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 00:01:42 +0200 Subject: [PATCH 110/137] fix protection 1.50 ubc issues --- addons/protection/FixUniforms.hpp | 569 ------------------------------ 1 file changed, 569 deletions(-) diff --git a/addons/protection/FixUniforms.hpp b/addons/protection/FixUniforms.hpp index 24c02b79aa..e69de29bb2 100644 --- a/addons/protection/FixUniforms.hpp +++ b/addons/protection/FixUniforms.hpp @@ -1,569 +0,0 @@ - -class Man; -class CAManBase: Man { - class HitPoints { - class HitHead { - /*armor = 1; - passThrough = 1; - radius = 0.1; - explosionShielding = 0.5; - minimalHit = 0;*/ - }; - - class HitBody { - /*armor = 1; - passThrough = 1; - radius = 0.15; - explosionShielding = 10; - minimalHit = 0;*/ - }; - - class HitHands { - /*armor = 1; - passThrough = 1; - radius = 0.08; - explosionShielding = 1; - minimalHit = 0;*/ - }; - - class HitLegs { - /*armor = 1; - passThrough = 1; - radius = 0.1; - explosionShielding = 1; - minimalHit = 0;*/ - }; - }; - - /*armor = 2; - armorStructural = 5;*/ -}; - -class Civilian: CAManBase { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 2; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ -}; - -/*class Civilian_F: Civilian {}; -class C_man_1: Civilian_F {};*/ - -class SoldierWB: CAManBase {}; -class SoldierEB: CAManBase {}; -class SoldierGB: CAManBase {}; - -class B_Soldier_base_F: SoldierWB { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 2; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - }; - - armor = 2; - armorStructural = 5;*/ -}; - -class B_Soldier_02_f: B_Soldier_base_F { // t-shirt - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - }; - - class HitBody: HitBody { - armor = 1; - }; - - class HitHands: HitHands { - armor = 1; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ - - armorStructural = 5; //7; -}; - -class B_Soldier_03_f: B_Soldier_base_F { // sleeves - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 1; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ - - armorStructural = 5; //7; -}; - -class B_Soldier_04_f: B_Soldier_base_F { // heli pilot - class HitPoints: HitPoints { - class HitHead: HitHead { - /*armor = 1; - passThrough = 1; - explosionShielding = 0.5;*/ - }; - - class HitBody: HitBody { - /*armor = 2;*/ - passThrough = 1; //0.5; - /*explosionShielding = 2.4;*/ - }; - - class HitHands: HitHands { - armor = 2; //8; - passThrough = 1; //0.5; - /*explosionShielding = 1.2;*/ - }; - - class HitLegs: HitLegs { - armor = 2; //8; - passThrough = 1; //0.5; - /*explosionShielding = 1.2;*/ - }; - }; -}; - -class B_Soldier_05_f: B_Soldier_base_F { // cas pilot - armorStructural = 5; //3; - - class HitPoints: HitPoints { - class HitHead: HitHead { - /*armor = 1; - passThrough = 1; - explosionShielding = 0.5;*/ - }; - - class HitBody: HitBody { - armor = 3; //2; - passThrough = 1; //0.5; - /*explosionShielding = 2.4;*/ - }; - - class HitHands: HitHands { - armor = 3; //8; - /*passThrough = 1; - explosionShielding = 1.2;*/ - }; - - class HitLegs: HitLegs { - armor = 3; //8; - /*passThrough = 1; - explosionShielding = 1.2;*/ - }; - }; -}; - -class B_Soldier_diver_base_F: B_Soldier_base_F { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 2; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 2; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ -}; - -// these appear to be broken, remnants from A2? -/*class C_man_p_fugitive_F: C_man_1 { - class HitPoints: HitPoints { - class HitBody: HitBody { - armor = "0.3*10"; - }; - - class HitLegs: HitLegs { - armor = "0.3*5"; - }; - }; -}; - -class C_man_w_worker_F: C_man_1 { - class HitPoints: HitPoints { - class HitBody: HitBody { - armor = "0.6*10"; - }; - - class HitHands: HitHands { - armor = "0.5*5"; - }; - - class HitLegs: HitLegs { - armor = "0.5*5"; - }; - }; -}; - -class C_man_hunter_1_F: C_man_1 { - class HitPoints: HitPoints { - class HitBody: HitBody { - armor = "0.6*10"; - }; - - class HitHands: HitHands { - armor = "0.5*5"; - }; - - class HitLegs: HitLegs { - armor = "0.5*5"; - }; - }; -}; - -class C_man_p_shorts_1_F: C_man_1 { - class HitPoints: HitPoints { - class HitLegs: HitLegs { - armor = "0.3*5"; - }; - }; -}; - -class C_man_pilot_F: C_man_1 { - class HitPoints: HitPoints { - class HitBody: HitBody { - armor = "0.6*10"; - }; - - class HitHands: HitHands { - armor = "0.5*5"; - }; - - class HitLegs: HitLegs { - armor = "0.5*5"; - }; - }; -};*/ - -class I_Soldier_base_F: SoldierGB { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 2; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ - - /*armor = 2;*/ - armorStructural = 5; //7; -}; - -class I_Soldier_02_F: I_Soldier_base_F { // sleeves - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 1; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ -}; - -class I_Soldier_03_F: I_Soldier_base_F { // heli pilot - /*armorStructural = 5;*/ - - class HitPoints: HitPoints { - class HitHead: HitHead { - /*armor = 1; - passThrough = 1; - explosionShielding = 0.5;*/ - }; - - class HitBody: HitBody { - /*armor = 2;*/ - passThrough = 1; //0.5; - /*explosionShielding = 2.4;*/ - }; - - class HitHands: HitHands { - armor = 2; //8; - passThrough = 1; //0.5; - /*explosionShielding = 1.2;*/ - }; - - class HitLegs: HitLegs { - armor = 2; //8; - passThrough = 1; //0.5; - /*explosionShielding = 1.2;*/ - }; - }; -}; - -class I_Soldier_04_F: I_Soldier_base_F { // cas pilot - armorStructural = 5; //3; - - class HitPoints: HitPoints { - class HitHead: HitHead { - /*armor = 1; - passThrough = 1; - explosionShielding = 0.5;*/ - }; - - class HitBody: HitBody { - armor = 3; //2; - passThrough = 1; //0.5; - /*explosionShielding = 2.4;*/ - }; - - class HitHands: HitHands { - armor = 3; //8; - /*passThrough = 1; - explosionShielding = 1.2;*/ - }; - - class HitLegs: HitLegs { - armor = 3; //8; - /*passThrough = 1; - explosionShielding = 1.2;*/ - }; - }; -}; - -class I_Soldier_diver_base_F: I_Soldier_base_F { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 2; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 2; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ -}; - -class O_Soldier_base_F: SoldierEB { - class HitPoints: HitPoints { - class HitHead: HitHead { - /*armor = 1; - passThrough = 1; - explosionShielding = 0.5;*/ - }; - - class HitBody: HitBody { - armor = 4; //6; - passThrough = 0.85; //0.5; - /*explosionShielding = 1.5;*/ - }; - - class HitHands: HitHands { - armor = 4; //8; - passThrough = 0.85; //0.5; - /*explosionShielding = 0.8;*/ - }; - - class HitLegs: HitLegs { - armor = 4; //8; - passThrough = 0.85; //0.5; - /*explosionShielding = 0.8;*/ - }; - }; - - /*armor = 2; - armorStructural = 5;*/ -}; - -class O_officer_F: O_Soldier_base_F { - class HitPoints: HitPoints { - class HitHead: HitHead { - /*armor = 1; - passThrough = 1; - explosionShielding = 0.5;*/ - }; - - class HitBody: HitBody { - /*armor = 2; - passThrough = 1; - explosionShielding = 10;*/ - }; - - class HitHands: HitHands { - /*armor = 2; - passThrough = 1; - explosionShielding = 1;*/ - }; - - class HitLegs: HitLegs { - armor = 2; //8; - passThrough = 1; //0.5; - /*explosionShielding = 1;*/ - }; - }; -}; - -class O_Soldier_02_F: O_Soldier_base_F { // crew ? - armorStructural = 5; //3; - - class HitPoints: HitPoints { - class HitHead: HitHead { - /*armor = 1; - passThrough = 1; - explosionShielding = 0.5;*/ - }; - - class HitBody: HitBody { - armor = 4; //6; - passThrough = 0.85; //0.5; - /*explosionShielding = 1.5;*/ - }; - - class HitHands: HitHands { - armor = 4; //8; - passThrough = 0.85; //1; - /*explosionShielding = 0.8;*/ - }; - - class HitLegs: HitLegs { - armor = 4; //8; - passThrough = 0.85; //1; - /*explosionShielding = 0.8;*/ - }; - }; -}; - -class O_Soldier_diver_base_F: O_Soldier_base_F { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 2; - }; - - class HitBody: HitBody { - armor = 2; - }; - - class HitHands: HitHands { - armor = 2; - }; - - class HitLegs: HitLegs { - armor = 2; - }; - };*/ -}; - -class O_Soldier_VR_F: O_Soldier_base_F { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - passThrough = 1; - explosionShielding = 0.5; - }; - - class HitBody: HitBody { - armor = 2; - passThrough = 1; - explosionShielding = 10; - }; - - class HitHands: HitHands { - armor = 2; - passThrough = 1; - explosionShielding = 1; - }; - - class HitLegs: HitLegs { - armor = 2; - passThrough = 1; - explosionShielding = 1; - }; - };*/ -}; - -class O_Protagonist_VR_F: O_Soldier_base_F { - /*class HitPoints: HitPoints { - class HitHead: HitHead { - armor = 1; - passThrough = 1; - explosionShielding = 0.5; - }; - - class HitBody: HitBody { - armor = 2; - passThrough = 1; - explosionShielding = 10; - }; - - class HitHands: HitHands { - armor = 2; - passThrough = 1; - explosionShielding = 1; - }; - - class HitLegs: HitLegs { - armor = 2; - passThrough = 1; - explosionShielding = 1; - }; - };*/ -}; From c97e0eb500825394dc63894ea11922bfc4d9dcd5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 31 Aug 2015 22:50:01 -0500 Subject: [PATCH 111/137] MapTools - Handle Bad Aspect Ratio --- addons/maptools/functions/fnc_updateMapToolMarkers.sqf | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index 5c88d907b8..5d11c6a6e9 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -18,7 +18,7 @@ params ["_theMap"]; -private ["_rotatingTexture", "_textureWidth", "_scale", "_xPos", "_yPos"]; +private ["_rotatingTexture", "_textureWidth", "_scaleX", "_scaleY", "_xPos", "_yPos"]; // Show/Hide draw buttons if ([] call FUNC(canDraw)) then { @@ -43,16 +43,18 @@ if (GVAR(mapTool_Shown) == 1) then { }; // Update scale of both parts -_scale = _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale)); +getResolution params ["_resWidth", "_resHeight", "", "", "_aspectRatio"]; +_scaleX = 32 * _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale)); +_scaleY = _scaleX * ((_resWidth / _resHeight) / _aspectRatio); //handle bad aspect ratios // Position of the fixed part _xPos = GVAR(mapTool_pos) select 0; _yPos = (GVAR(mapTool_pos) select 1) + _textureWidth * CENTER_OFFSET_Y_PERC; -_theMap drawIcon [QUOTE(PATHTOF(data\mapToolFixed.paa)), [1,1,1,1], [_xPos,_yPos], (32 * _scale), (32 * _scale), 0, "", 0]; +_theMap drawIcon [QUOTE(PATHTOF(data\mapToolFixed.paa)), [1,1,1,1], [_xPos,_yPos], _scaleX, _scaleY, 0, "", 0]; // Position and rotation of the rotating part _xPos = (GVAR(mapTool_pos) select 0) + sin(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC; _yPos = (GVAR(mapTool_pos) select 1) + cos(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC; -_theMap drawIcon [_rotatingTexture, [1,1,1,1], [_xPos,_yPos], (32 * _scale), (32 * _scale), GVAR(mapTool_angle), "", 0]; +_theMap drawIcon [_rotatingTexture, [1,1,1,1], [_xPos,_yPos], _scaleX, _scaleY, GVAR(mapTool_angle), "", 0]; From 73911f701d4319633c2f316fd3e5a766a02ed727 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 08:53:11 +0200 Subject: [PATCH 112/137] add debug messages for #2134 --- addons/common/functions/fnc_checkFiles.sqf | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 647a1b00a6..468a5c906c 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -63,24 +63,33 @@ if (isMultiplayer) then { // send servers version of ACE to all clients GVAR(ServerVersion) = _version; GVAR(ServerAddons) = _addons; + diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; + diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; publicVariable QGVAR(ServerVersion); publicVariable QGVAR(ServerAddons); } else { // clients have to wait for the variables [{ - if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith {}; + if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith { + diag_log text "[ACE] DEBUG: Waiting for file info from server."; + }; private ["_version","_addons"]; _version = (_this select 0) select 0; _addons = (_this select 0) select 1; + diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; + diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; + diag_log text format ["[ACE] DEBUG: ClientVersion - %1", _version]; + diag_log text format ["[ACE] DEBUG: ClientAddons - %1", _addons]; + if (_version != GVAR(ServerVersion)) then { private "_errorMsg"; _errorMsg = format ["Client/Server Version Mismatch. Server: %1, Client: %2.", GVAR(ServerVersion), _version]; diag_log text format ["[ACE] ERROR: %1", _errorMsg]; - if (hasInterface) then {diag_log str "1"; + if (hasInterface) then { ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); }; }; @@ -91,7 +100,7 @@ if (isMultiplayer) then { diag_log text format ["[ACE] ERROR: %1", _errorMsg]; - if (hasInterface) then {diag_log str "1"; + if (hasInterface) then { ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); }; }; From 5e68486233b8e56418d9a235215b9d046ea77ed9 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 10:06:01 +0200 Subject: [PATCH 113/137] high command module breaks ace, fix #2134 --- addons/common/functions/fnc_checkFiles.sqf | 18 ++++++++++-------- addons/main/config.cpp | 1 - addons/winddeflection/config.cpp | 1 - 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 468a5c906c..3205209130 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -20,7 +20,9 @@ _version = getText (configFile >> "CfgPatches" >> "ace_main" >> "versionStr"); diag_log text format ["[ACE]: ACE is version %1.", _version]; private "_addons"; -_addons = activatedAddons; +//_addons = activatedAddons; // broken with High-Command module, see #2134 +_addons = "true" configClasses (configFile >> "CfgPatches");// +_addons = [_addons, {toLower configName _this}] call FUNC(map);// _addons = [_addons, {_this find "ace_" == 0}] call FUNC(filter); { @@ -63,25 +65,25 @@ if (isMultiplayer) then { // send servers version of ACE to all clients GVAR(ServerVersion) = _version; GVAR(ServerAddons) = _addons; - diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; - diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; + //diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; + //diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; publicVariable QGVAR(ServerVersion); publicVariable QGVAR(ServerAddons); } else { // clients have to wait for the variables [{ if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith { - diag_log text "[ACE] DEBUG: Waiting for file info from server."; + //diag_log text "[ACE] DEBUG: Waiting for file info from server."; }; private ["_version","_addons"]; _version = (_this select 0) select 0; _addons = (_this select 0) select 1; - diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; - diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; - diag_log text format ["[ACE] DEBUG: ClientVersion - %1", _version]; - diag_log text format ["[ACE] DEBUG: ClientAddons - %1", _addons]; + //diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; + //diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; + //diag_log text format ["[ACE] DEBUG: ClientVersion - %1", _version]; + //diag_log text format ["[ACE] DEBUG: ClientAddons - %1", _addons]; if (_version != GVAR(ServerVersion)) then { private "_errorMsg"; diff --git a/addons/main/config.cpp b/addons/main/config.cpp index c6f487aa53..a013d8e971 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -545,7 +545,6 @@ class CfgPatches { }; author[] = {ECSTRING(common,ACETeam)}; authorUrl = "http://ace3mod.com/"; - versionDesc = "ACE3"; VERSION_CONFIG; }; }; diff --git a/addons/winddeflection/config.cpp b/addons/winddeflection/config.cpp index df2b55d221..a7bedbb9ef 100644 --- a/addons/winddeflection/config.cpp +++ b/addons/winddeflection/config.cpp @@ -6,7 +6,6 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_weather"}; - versionDesc = "ACE Wind Deflection"; author[] = {ECSTRING(common,ACETeam), "Glowbal", "Ruthberg"}; authorUrl = "http://ace3mod.com/"; VERSION_CONFIG; From b1fbbcc49f1be5ad84aedf39d679cae08885a7a5 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 12:46:15 +0200 Subject: [PATCH 114/137] bouncing flashbangs, fix #1907 --- addons/grenades/CfgAmmo.hpp | 41 ++++++++++++++++++++++--------------- addons/grenades/Effects.hpp | 4 ++++ addons/grenades/config.cpp | 2 ++ 3 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 addons/grenades/Effects.hpp diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 61f20eb935..120d3ab5ea 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -5,28 +5,28 @@ class CfgAmmo { flareSize = 12; timeToLive = 60; }; + class F_40mm_White: FlareBase { intensity = 40000; flareSize = 12; }; + class F_20mm_White: FlareBase { intensity = 20000; flareSize = 6; }; + class F_Signal_Green: FlareBase { intensity = 20000; flareSize = 12; }; + class Flare_82mm_AMOS_White: FlareCore { intensity = 80000; flareSize = 12; timeToLive = 60; }; - class F_20mm_Red: F_20mm_White {}; - class F_20mm_Green: F_20mm_White {}; - class F_20mm_Yellow: F_20mm_White {}; - class ACE_F_Hand_White: F_20mm_White { grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; @@ -38,6 +38,8 @@ class CfgAmmo { SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; timeToLive = 60; }; + + class F_20mm_Red; class ACE_F_Hand_Red: F_20mm_Red { grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; @@ -49,6 +51,8 @@ class CfgAmmo { SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; timeToLive = 60; }; + + class F_20mm_Green; class ACE_F_Hand_Green: F_20mm_Green { grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; @@ -60,6 +64,8 @@ class CfgAmmo { SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; timeToLive = 60; }; + + class F_20mm_Yellow; class ACE_F_Hand_Yellow: F_20mm_Yellow { grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; @@ -72,20 +78,21 @@ class CfgAmmo { timeToLive = 60; }; - class ACE_G_M84: F_20mm_Yellow { - useFlare = 0; - flareSize = 0; - intensity = 0; - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; + class SmokeShell; + class ACE_G_M84: SmokeShell { + model = PATHTOF(models\ACE_m84_thrown.p3d); + dangerRadiusHit = -1; + suppressionRadiusHit = 20; + typicalSpeed = 22; + cost = 40; + deflecting = 15; timeToLive = 6; fuseDistance = 2.3; - model = PATHTOF(models\ACE_m84_thrown.p3d); + grenadeFireSound[] = {}; + grenadeBurningSound[] = {}; + aiAmmoUsageFlags = "0"; + smokeColor[] = {0,0,0,0}; + effectsSmoke = "ACE_M84FlashbangEffect"; + whistleDist = 0; }; }; diff --git a/addons/grenades/Effects.hpp b/addons/grenades/Effects.hpp new file mode 100644 index 0000000000..c9e214de5c --- /dev/null +++ b/addons/grenades/Effects.hpp @@ -0,0 +1,4 @@ + +class ACE_M84FlashbangEffect { + // empty +}; diff --git a/addons/grenades/config.cpp b/addons/grenades/config.cpp index c2a899d66c..2f9e631fe1 100644 --- a/addons/grenades/config.cpp +++ b/addons/grenades/config.cpp @@ -17,3 +17,5 @@ class CfgPatches { #include "CfgWeapons.hpp" #include "CfgMagazines.hpp" #include "CfgVehicles.hpp" + +#include "Effects.hpp" From de66c2be7b19d951394fa6303fffda569fbd9071 Mon Sep 17 00:00:00 2001 From: bux578 Date: Tue, 1 Sep 2015 13:16:58 +0200 Subject: [PATCH 115/137] add commy's newest issue --- documentation/development/arma-3-issues.md | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/development/arma-3-issues.md b/documentation/development/arma-3-issues.md index 16f9988409..c28dc2f118 100644 --- a/documentation/development/arma-3-issues.md +++ b/documentation/development/arma-3-issues.md @@ -18,6 +18,7 @@ Keeping track of Arma 3 issues that need to be fixed. If you want to support us * [bux578: 0022000: Add/Alter script command to add perfectly configured weapons to cargo](http://feedback.arma3.com/view.php?id=22000) * [commy2: 0021443: Unexpected behavior of += array in configs](http://feedback.arma3.com/view.php?id=21443) * [commy2: 0022671: setVariable is not always JIP persistent](http://feedback.arma3.com/view.php?id=22671) +* [commy2: 0025404: splitString scripting command causes game crash] (http://feedback.arma3.com/view.php?id=25404) * [CorruptedHeart: 0022318: Can no longer use "MenuBack" shortcut in AddAction](http://feedback.arma3.com/view.php?id=22318) * [James2464: 0023725: All Environment Rocks Should Have PhysX LODs](http://feedback.arma3.com/view.php?id=23725) * [Jaynus: 0023679: Display event handler return values for mouse buttons should be respected](http://feedback.arma3.com/view.php?id=23679) From dd788342fe80576dfeb5614b95b56e87b350997c Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 16:37:46 +0200 Subject: [PATCH 116/137] remove commented debug messages --- addons/common/functions/fnc_checkFiles.sqf | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 3205209130..c1a0b1cb89 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -65,26 +65,17 @@ if (isMultiplayer) then { // send servers version of ACE to all clients GVAR(ServerVersion) = _version; GVAR(ServerAddons) = _addons; - //diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; - //diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; publicVariable QGVAR(ServerVersion); publicVariable QGVAR(ServerAddons); } else { // clients have to wait for the variables [{ - if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith { - //diag_log text "[ACE] DEBUG: Waiting for file info from server."; - }; + if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith {}; private ["_version","_addons"]; _version = (_this select 0) select 0; _addons = (_this select 0) select 1; - //diag_log text format ["[ACE] DEBUG: ServerVersion - %1", GVAR(ServerVersion)]; - //diag_log text format ["[ACE] DEBUG: ServerAddons - %1", GVAR(ServerAddons)]; - //diag_log text format ["[ACE] DEBUG: ClientVersion - %1", _version]; - //diag_log text format ["[ACE] DEBUG: ClientAddons - %1", _addons]; - if (_version != GVAR(ServerVersion)) then { private "_errorMsg"; _errorMsg = format ["Client/Server Version Mismatch. Server: %1, Client: %2.", GVAR(ServerVersion), _version]; From 264091957a53995e320b29edd4c4b972d5e58739 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 1 Sep 2015 10:09:08 -0500 Subject: [PATCH 117/137] #1917 - Pointing Update Circle Icon --- addons/finger/functions/fnc_perFrameEH.sqf | 2 +- addons/finger/ui/fp_icon2.paa | Bin 0 -> 66500 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 addons/finger/ui/fp_icon2.paa diff --git a/addons/finger/functions/fnc_perFrameEH.sqf b/addons/finger/functions/fnc_perFrameEH.sqf index d6297a4095..7f0150c492 100644 --- a/addons/finger/functions/fnc_perFrameEH.sqf +++ b/addons/finger/functions/fnc_perFrameEH.sqf @@ -41,7 +41,7 @@ _iconSize = BASE_SIZE * _fovCorrection; _drawColor set [3, ((_drawColor select 3) * (_timeLeftToShow / 0.5))]; }; - drawIcon3D [QUOTE(PATHTOF(UI\fp_icon.paa)), _drawColor, _pos, _iconSize, _iconSize, 0, _name, 1, 0.03, "PuristaMedium"]; + drawIcon3D [QUOTE(PATHTOF(UI\fp_icon2.paa)), _drawColor, _pos, _iconSize, _iconSize, 0, _name, 1, 0.03, "PuristaMedium"]; }; } count (GVAR(fingersHash) select 0); diff --git a/addons/finger/ui/fp_icon2.paa b/addons/finger/ui/fp_icon2.paa new file mode 100644 index 0000000000000000000000000000000000000000..4f7fde9f10bc96e84a1a076ff8ffbcea57ea3e7d GIT binary patch literal 66500 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%0D}Va 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 F{{YsY(?9?K literal 0 HcmV?d00001 From 405d85eaaa0369a65b0523e7dd7f806f264cf629 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 19:06:20 +0200 Subject: [PATCH 118/137] fix leaning back through chair while sitting, fix #1795 --- addons/sitting/CfgMoves.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/sitting/CfgMoves.hpp b/addons/sitting/CfgMoves.hpp index fc902032e2..5cef0fbc6d 100644 --- a/addons/sitting/CfgMoves.hpp +++ b/addons/sitting/CfgMoves.hpp @@ -1,6 +1,9 @@ // Enable visual head movement while free-looking #define MACRO_ANIMATION \ - head = "headDefault"; + head = "headDefault"; \ + aimingBody = "aimingNo"; \ + forceAim = 1; \ + static = 1; class CfgMovesBasic; class CfgMovesMaleSdr: CfgMovesBasic { From acfc48efc22591784905b56b7f4804b821e74c34 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 20:00:28 +0200 Subject: [PATCH 119/137] animate head when surrendered and handcuffed --- addons/captives/CfgMoves.hpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index 161fcce9a4..8fa3440706 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -35,6 +35,12 @@ class CfgMovesMaleSdr: CfgMovesBasic { class CutSceneAnimationBase; + #define MACRO_ANIMATION \ + head = "headDefault"; \ + aimingBody = "aimingNo"; \ + forceAim = 1; \ + static = 1; + //Handcuffed Anims: class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { actions = "ACE_CivilStandHandcuffedActions"; @@ -45,6 +51,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; canReload = 0; + MACRO_ANIMATION }; class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease"; @@ -52,12 +59,14 @@ class CfgMovesMaleSdr: CfgMovesBasic { ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01}; looped = 1; + MACRO_ANIMATION }; class ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { actions = "CivilStandActions"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\amovpercmstpsnonwnondnon_easeout"; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; + MACRO_ANIMATION }; //Handcuffed-FFV: @@ -65,6 +74,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm"; actions = "ACE_CivilHandCuffedFFVActions"; ConnectTo[] = {}; + MACRO_ANIMATION }; @@ -78,6 +88,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; canReload = 0; + MACRO_ANIMATION }; class ACE_AmovPercMstpSsurWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon"; @@ -85,6 +96,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { looped = 1; ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01}; + MACRO_ANIMATION }; class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { speed = 0.5; //for gameplay reasons, slow this down @@ -92,6 +104,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; + MACRO_ANIMATION }; }; }; From 237d5b6536f8e79f8f2cff2127196e8be10fd448 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 21:03:28 +0200 Subject: [PATCH 120/137] stand up action (uses get out shortcut) and less awkward standing animaton --- addons/sitting/functions/fnc_sit.sqf | 22 +++++++++++++++++++++- addons/sitting/functions/fnc_stand.sqf | 13 ++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/addons/sitting/functions/fnc_sit.sqf b/addons/sitting/functions/fnc_sit.sqf index 0c6825ed58..e0692af951 100644 --- a/addons/sitting/functions/fnc_sit.sqf +++ b/addons/sitting/functions/fnc_sit.sqf @@ -16,7 +16,7 @@ */ #include "script_component.hpp" -private ["_configFile", "_sitDirection", "_sitPosition", "_sitRotation", "_sitDirectionVisual"]; +private ["_actionID", "_configFile", "_sitDirection", "_sitPosition", "_sitRotation", "_sitDirectionVisual"]; params ["_seat", "_player"]; @@ -26,6 +26,26 @@ GVAR(seat) = _seat; // Overwrite weird position, because Arma decides to set it differently based on current animation/stance... _player switchMove "amovpknlmstpsraswrfldnon"; +// add scrollwheel action to release object +_actionID = _player getVariable [QGVAR(StandUpActionID), -1]; + +if (_actionID != -1) then { + _player removeAction _actionID; +}; + +_actionID = _player addAction [ + format ["%1", localize LSTRING(Stand)], + QUOTE((_this select 0) call FUNC(stand)), + nil, + 20, + false, + true, + "GetOut", + QUOTE(_this call FUNC(canStand)) +]; + +_player setVariable [QGVAR(StandUpActionID), _actionID]; + // Read config _configFile = configFile >> "CfgVehicles" >> typeOf _seat; _sitDirection = (getDir _seat) + getNumber (_configFile >> QGVAR(sitDirection)); diff --git a/addons/sitting/functions/fnc_stand.sqf b/addons/sitting/functions/fnc_stand.sqf index 978bcaf279..ef19d5f586 100644 --- a/addons/sitting/functions/fnc_stand.sqf +++ b/addons/sitting/functions/fnc_stand.sqf @@ -17,8 +17,19 @@ params ["_player"]; +// remove scroll wheel action +_player removeAction (_player getVariable [QGVAR(StandUpActionID), -1]); + // Restore animation -[_player, "", 2] call EFUNC(common,doAnimation); +private "_animation"; +_animation = switch (currentWeapon _player) do { + case "": {"amovpercmstpsnonwnondnon"}; + case (primaryWeapon _player): {"amovpercmstpslowwrfldnon"}; + case (handgunWeapon _player): {"amovpercmstpslowwpstdnon"}; + default {"amovpercmstpsnonwnondnon"}; +}; + +[_player, _animation, 2] call EFUNC(common,doAnimation); // Set variables to nil _player setVariable [QGVAR(isSitting), nil]; From 471d54f6748905e57303800305322808d59dd0ac Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 21:48:40 +0200 Subject: [PATCH 121/137] better saling for tracer sizes, fix #1008 --- addons/ballistics/CfgAmmo.hpp | 68 ++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 5ffe94ac45..eeb64fec47 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -6,23 +6,11 @@ class CfgAmmo { timeToLive=6; }; - class B_20mm : BulletBase { - timeToLive=30; - }; - class B_25mm : BulletBase { - timeToLive=30; - }; - class B_35mm_AA : BulletBase { - timeToLive=30; - }; - class B_30mm_AP : BulletBase { - timeToLive=30; - }; - class B_556x45_Ball : BulletBase { airFriction=-0.00126466; hit=8; typicalSpeed=750; + tracerScale = 1; tracerStartTime=0.073; // M856 tracer burns out to 800m tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator ACE_caliber=5.69; @@ -128,9 +116,13 @@ class CfgAmmo { ACE_muzzleVelocities[]={785, 883, 925}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; + class B_56x15_dual: BulletBase { + tracerScale = 0.5; + }; class B_65x39_Caseless : BulletBase { airFriction=-0.00075308; typicalSpeed=800; + tracerScale = 1.1; //1.0; ACE_caliber=6.706; ACE_bulletLength=32.893; ACE_bulletMass=7.9704; @@ -180,10 +172,15 @@ class CfgAmmo { ACE_muzzleVelocities[]={750, 820, 840, 852, 860}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; }; + class SubmunitionBullet; + class B_65x39_Minigun_Caseless: SubmunitionBullet { + tracerScale = 1.1; //1.0; + }; class B_762x51_Ball : BulletBase { airFriction=-0.00100957; typicalSpeed=833; hit=9; + tracerScale = 1.2; //0.6; tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator ACE_caliber=7.823; @@ -479,6 +476,7 @@ class CfgAmmo { class B_9x21_Ball : BulletBase { airFriction=-0.00226847; typicalSpeed=390; + tracerScale = 0.5; hit=6; ACE_caliber=9.042; ACE_bulletLength=15.494; @@ -491,6 +489,9 @@ class CfgAmmo { ACE_muzzleVelocities[]={440, 460, 480}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; + class B_9x21_Ball_Tracer_Green: B_9x21_Ball { + tracerScale = 0.5; + }; class ACE_9x18_Ball_57N181S : B_9x21_Ball { hit=5; airFriction=-0.00190333; @@ -584,6 +585,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00038944; typicalSpeed=910; + tracerScale = 1.3; //1.2; ACE_caliber=10.363; ACE_bulletLength=54.0; ACE_bulletMass=26.568; @@ -670,9 +672,13 @@ class CfgAmmo { ACE_muzzleVelocities[]={880, 915, 925}; ACE_barrelLengths[]={508.0, 660.4, 711.2}; }; + class B_127x33_Ball: BulletBase { + tracerScale = 1.3; //1.2; + }; class B_127x54_Ball : BulletBase { airFriction=-0.00019268; typicalSpeed=300; + tracerScale = 1.3;// ACE_caliber=12.954; ACE_bulletLength=64.516; ACE_bulletMass=48.6; @@ -688,6 +694,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00057503; typicalSpeed=900; + tracerScale = 1.3; //1.2; ACE_caliber=12.954; ACE_bulletLength=58.674; ACE_bulletMass=41.9256; @@ -703,6 +710,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00057503; typicalSpeed=900; + tracerScale = 1.3;// hit=25; caliber=4.0; ACE_caliber=12.954; @@ -736,6 +744,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00063800; typicalSpeed=820; + tracerScale = 1.3; //1.5; ACE_caliber=12.979; ACE_bulletLength=64.008; ACE_bulletMass=48.276; @@ -750,6 +759,7 @@ class CfgAmmo { class B_45ACP_Ball : BulletBase { airFriction=-0.00081221; typicalSpeed=250; + tracerScale = 0.6; ACE_caliber=11.481; ACE_bulletLength=17.272; ACE_bulletMass=14.904; @@ -761,4 +771,36 @@ class CfgAmmo { ACE_muzzleVelocities[]={230, 250, 285}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; + class B_19mm_HE: BulletBase { + tracerScale = 1; + }; + class B_30mm_HE: B_19mm_HE { + tracerScale = 2.5; + }; + class B_20mm: BulletBase { + timeToLive=30; + tracerScale = 1.5; //1; + }; + class B_25mm: BulletBase { + timeToLive=30; + tracerScale = 2.0; //1; + }; + class B_30mm_AP: BulletBase { + timeToLive=30; + tracerScale = 2.5; + }; + class B_35mm_AA: BulletBase { + timeToLive=30; + tracerScale = 2.75; //1.85; + }; + class ShellBase; + class Sh_120mm_HE: ShellBase { + tracerScale = 3; + }; + class Sh_120mm_APFSDS: ShellBase { + tracerScale = 3; + }; + class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase { + tracerScale = 2.5; + }; }; From be56fd7d466a85a04e35bdac2d4a3922944597d6 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 23:19:49 +0200 Subject: [PATCH 122/137] scripted approach to hand flares, fix #1079 --- addons/grenades/CfgAmmo.hpp | 66 +++++++++---------- addons/grenades/CfgMagazines.hpp | 19 ++++-- addons/grenades/Effects.hpp | 4 ++ addons/grenades/XEH_preInit.sqf | 1 + addons/grenades/functions/fnc_flare.sqf | 23 +++++++ .../grenades/functions/fnc_throwGrenade.sqf | 45 +++++++++---- 6 files changed, 105 insertions(+), 53 deletions(-) create mode 100644 addons/grenades/functions/fnc_flare.sqf diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 120d3ab5ea..b14a806b4c 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -28,66 +28,66 @@ class CfgAmmo { }; class ACE_F_Hand_White: F_20mm_White { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; timeToLive = 60; }; class F_20mm_Red; class ACE_F_Hand_Red: F_20mm_Red { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; timeToLive = 60; }; class F_20mm_Green; class ACE_F_Hand_Green: F_20mm_Green { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; timeToLive = 60; }; class F_20mm_Yellow; class ACE_F_Hand_Yellow: F_20mm_Yellow { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; timeToLive = 60; }; class SmokeShell; + class ACE_G_Handflare_White: SmokeShell { + GVAR(flare) = 1; + GVAR(color)[] = {0.5,0.5,0.5,0.5}; + model = "\A3\weapons_f\ammo\flare_white"; + dangerRadiusHit = -1; + suppressionRadiusHit = -1; + typicalSpeed = 22; + cost = 100; + deflecting = 30; + explosionTime = 3; + timeToLive = 60; + grenadeFireSound[] = {}; + grenadeBurningSound[] = {}; + aiAmmoUsageFlags = "4 + 2"; + smokeColor[] = {0,0,0,0}; + effectsSmoke = "ACE_HandFlareEffect"; + whistleDist = 0; + }; + class ACE_G_Handflare_Red: ACE_G_Handflare_White { + GVAR(color)[] = {0.5,0.25,0.25,0.5}; + model = "\A3\weapons_f\ammo\flare_red"; + }; + class ACE_G_Handflare_Green: ACE_G_Handflare_White { + GVAR(color)[] = {0.25,0.5,0.25,0.5}; + model = "\A3\weapons_f\ammo\flare_green"; + }; + class ACE_G_Handflare_Yellow: ACE_G_Handflare_White { + GVAR(color)[] = {0.5,0.5,0.25,0.5}; + model = "\A3\weapons_f\ammo\flare_yellow"; + }; + class ACE_G_M84: SmokeShell { + GVAR(flashbang) = 1; model = PATHTOF(models\ACE_m84_thrown.p3d); dangerRadiusHit = -1; suppressionRadiusHit = 20; typicalSpeed = 22; cost = 40; deflecting = 15; + explosionTime = 2.3; timeToLive = 6; - fuseDistance = 2.3; grenadeFireSound[] = {}; grenadeBurningSound[] = {}; aiAmmoUsageFlags = "0"; diff --git a/addons/grenades/CfgMagazines.hpp b/addons/grenades/CfgMagazines.hpp index 31e80dc545..16dd9929ff 100644 --- a/addons/grenades/CfgMagazines.hpp +++ b/addons/grenades/CfgMagazines.hpp @@ -1,3 +1,4 @@ + class CfgMagazines { class HandGrenade; class ACE_HandFlare_Base: HandGrenade { @@ -8,55 +9,60 @@ class CfgMagazines { mass = 4; initSpeed = 22; }; + class ACE_HandFlare_White: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_White"; displayname = CSTRING(M127A1_White_Name); descriptionshort = CSTRING(M127A1_White_Description); displayNameShort = CSTRING(M127A1_White_NameShort); model = "\A3\weapons_f\ammo\flare_white"; picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa"; + ammo = "ACE_G_Handflare_White"; }; + class ACE_HandFlare_Red: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_Red"; displayname = CSTRING(M127A1_Red_Name); descriptionshort = CSTRING(M127A1_Red_Description); displayNameShort = CSTRING(M127A1_Red_NameShort); model = "\A3\weapons_f\ammo\flare_red"; picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa"; + ammo = "ACE_G_Handflare_Red"; }; + class ACE_HandFlare_Green: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_Green"; displayname = CSTRING(M127A1_Green_Name); descriptionshort = CSTRING(M127A1_Green_Description); displayNameShort = CSTRING(M127A1_Green_NameShort); model = "\A3\weapons_f\ammo\flare_green"; picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa"; + ammo = "ACE_G_Handflare_Green"; }; + class ACE_HandFlare_Yellow: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_Yellow"; displayname = CSTRING(M127A1_Yellow_Name); descriptionshort = CSTRING(M127A1_Yellow_Description); displayNameShort = CSTRING(M127A1_Yellow_NameShort); model = "\A3\weapons_f\ammo\flare_yellow"; picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa"; + ammo = "ACE_G_Handflare_Yellow"; }; + class ACE_M84: HandGrenade { author = ECSTRING(common,ACETeam); - ammo = "ACE_G_M84"; displayname = CSTRING(M84_Name); descriptionshort = CSTRING(M84_Description); displayNameShort = "M84"; - mass = 4; model = PATHTOF(models\ACE_m84.p3d); picture = PATHTOF(UI\ACE_m84_x_ca.paa); + ammo = "ACE_G_M84"; + mass = 4; }; class 3Rnd_UGL_FlareGreen_F; @@ -65,6 +71,7 @@ class CfgMagazines { ammo = "F_40mm_Green"; initSpeed = 120; }; + class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F { author = ECSTRING(common,ACETeam); ammo = "F_40mm_Red"; diff --git a/addons/grenades/Effects.hpp b/addons/grenades/Effects.hpp index c9e214de5c..3cbcef9a38 100644 --- a/addons/grenades/Effects.hpp +++ b/addons/grenades/Effects.hpp @@ -2,3 +2,7 @@ class ACE_M84FlashbangEffect { // empty }; + +class ACE_HandFlareEffect { + // empty +}; diff --git a/addons/grenades/XEH_preInit.sqf b/addons/grenades/XEH_preInit.sqf index 0df2e235fd..631cecca85 100644 --- a/addons/grenades/XEH_preInit.sqf +++ b/addons/grenades/XEH_preInit.sqf @@ -2,6 +2,7 @@ ADDON = false; +PREP(flare); PREP(flashbangExplosionEH); PREP(flashbangThrownFuze); PREP(nextMode); diff --git a/addons/grenades/functions/fnc_flare.sqf b/addons/grenades/functions/fnc_flare.sqf new file mode 100644 index 0000000000..d7a8b54f51 --- /dev/null +++ b/addons/grenades/functions/fnc_flare.sqf @@ -0,0 +1,23 @@ +// by commy2 +#include "script_component.hpp" + +params ["_projectile", "_color", "_intensity", "_timeToLive"]; + +private "_light"; +_light = "#lightpoint" createVehicleLocal position _projectile; + +_light setLightColor _color; +_light setLightAmbient _color; +_light setLightIntensity _intensity; +_light setLightBrightness 0.8; + +_light setLightUseFlare true; +_light setLightFlareSize 3.0; +_light setLightFlareMaxDistance 1000; + +_light setLightDayLight true; + +_light lightAttachObject [_projectile, [0,0,0]]; +//_light attachTo [_projectile, [0,0,0]]; + +[{deleteVehicle _this}, _light, _timeToLive, 1] call EFUNC(common,waitAndExecute); diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 03e67a152a..5f8f31994a 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -21,22 +21,45 @@ */ #include "script_component.hpp" -private ["_mode", "_fuzeTime"]; -params ["_unit", "_weapon", "", "", "", "", "_projectile"]; +params ["_unit", "_weapon", "", "", "_ammo", "", "_projectile"]; -if (_unit != ACE_player) exitWith {}; if (_weapon != "Throw") exitWith {}; +// handle speial grenades +if (local _unit) then { + if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flashbang)) == 1) then { + private "_fuzeTime"; + _fuzeTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosionTime"); + + [FUNC(flashbangThrownFuze), [_projectile], _fuzeTime, 0] call EFUNC(common,waitAndExecute); + }; + + if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flare)) == 1) then { + private ["_fuzeTime", "_timeToLive", "_color", "_intensity"]; + + _fuzeTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosionTime"); + _timeToLive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "timeToLive"); + _color = getArray (configFile >> "CfgAmmo" >> _ammo >> QGVAR(color)); + _intensity = _color select 3; + _color resize 3; + + [FUNC(flare), [_projectile, _color, _intensity, _timeToLive], _fuzeTime, 0] call EFUNC(common,waitAndExecute); + }; +}; + +// handle throw modes +if (_unit != ACE_player) exitWith {}; + +private "_mode"; _mode = missionNamespace getVariable [QGVAR(currentThrowMode), 0]; if (_mode != 0) then { private "_velocity"; - _velocity = velocity _projectile; switch (_mode) do { //high throw - case 1 : { + case 1 : { _velocity = [ 0.5 * (_velocity select 0), 0.5 * (_velocity select 1), @@ -44,24 +67,18 @@ if (_mode != 0) then { ]; }; //precise throw - case 2 : { + case 2 : { _velocity = (_unit weaponDirection _weapon) vectorMultiply (vectorMagnitude _velocity); }; //roll grande - case 3 : { + case 3 : { //@todo }; //drop grenade - case 4 : { + case 4 : { _velocity = [0, 0, 0]; }; }; _projectile setVelocity _velocity; }; - -if (typeOf _projectile == "ACE_G_M84") then { - _fuzeTime = getNumber (configFile >> "CfgAmmo" >> typeOf _projectile >> "fuseDistance"); - // _fuzeTime = getNumber (configFile >> "CfgAmmo" >> typeOf _projectile >> "explosionTime"); //@toDo pretty sure this should be explosionTime not fuseDistance - [FUNC(flashbangThrownFuze), [_projectile], _fuzeTime, 0] call EFUNC(common,waitAndExecute); -}; From 7ce606740ca83c259d0f1c7a5ef331316dd6c075 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 23:56:25 +0200 Subject: [PATCH 123/137] make flares work in mp --- .../grenades/functions/fnc_throwGrenade.sqf | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 5f8f31994a..17c0fb78cc 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -25,6 +25,11 @@ params ["_unit", "_weapon", "", "", "_ammo", "", "_projectile"]; if (_weapon != "Throw") exitWith {}; +// http://feedback.arma3.com/view.php?id=12340 +if (isNull _projectile) then { + _projectile = nearestObject [_unit, _ammo]; +}; + // handle speial grenades if (local _unit) then { if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flashbang)) == 1) then { @@ -33,18 +38,18 @@ if (local _unit) then { [FUNC(flashbangThrownFuze), [_projectile], _fuzeTime, 0] call EFUNC(common,waitAndExecute); }; +}; - if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flare)) == 1) then { - private ["_fuzeTime", "_timeToLive", "_color", "_intensity"]; +if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flare)) == 1) then { + private ["_fuzeTime", "_timeToLive", "_color", "_intensity"]; - _fuzeTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosionTime"); - _timeToLive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "timeToLive"); - _color = getArray (configFile >> "CfgAmmo" >> _ammo >> QGVAR(color)); - _intensity = _color select 3; - _color resize 3; + _fuzeTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosionTime"); + _timeToLive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "timeToLive"); + _color = getArray (configFile >> "CfgAmmo" >> _ammo >> QGVAR(color)); + _intensity = _color select 3; + _color resize 3; - [FUNC(flare), [_projectile, _color, _intensity, _timeToLive], _fuzeTime, 0] call EFUNC(common,waitAndExecute); - }; + [FUNC(flare), [_projectile, _color, _intensity, _timeToLive], _fuzeTime, 0] call EFUNC(common,waitAndExecute); }; // handle throw modes From 83424cdcab91b999ea263f855211f30cf18d1b92 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 00:03:16 +0200 Subject: [PATCH 124/137] header for fnc_flare --- addons/grenades/functions/fnc_flare.sqf | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/addons/grenades/functions/fnc_flare.sqf b/addons/grenades/functions/fnc_flare.sqf index d7a8b54f51..bf1d571640 100644 --- a/addons/grenades/functions/fnc_flare.sqf +++ b/addons/grenades/functions/fnc_flare.sqf @@ -1,4 +1,21 @@ -// by commy2 +/* + * Author: commy2 + * Makes flare shine. + * + * Arguments: + * 0: The flare + * 1: Color of flare + * 2: Intensity of flare + * 3: Flare lifetime + * + * Return Value: + * None + * + * Example: + * [_nade, [0.5,0.5,0.5], 0.5, 60] call ace_grenades_fnc_flare + * + * Public: No + */ #include "script_component.hpp" params ["_projectile", "_color", "_intensity", "_timeToLive"]; From 43c54d51e810d78d0eb1902dfcf243e9a0a2c873 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 01:40:38 +0200 Subject: [PATCH 125/137] hide clock on map if no watch in inventory, #414 --- addons/map/functions/fnc_onDrawMap.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index bc147884e4..0c95e903e6 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -2,3 +2,8 @@ #include "script_component.hpp" ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); + +// hide time when no map in inventory +if (!isNull ACE_player) then { + ((_this select 0) displayCtrl 101) ctrlShow ("ItemWatch" in assignedItems ACE_player); +}; From 29efc13556657ba74e00357c09ef789f7c3dd7f2 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 01:59:07 +0200 Subject: [PATCH 126/137] hide clock, use eventhandler --- addons/map/XEH_postInitClient.sqf | 13 ++++++++++++- addons/map/functions/fnc_onDrawMap.sqf | 4 +--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index ef528d5233..b85d91bf16 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -98,4 +98,15 @@ call FUNC(determineZoom); }] call EFUNC(common,addEventHandler); }; }; -}] call EFUNC(common,addEventHandler); \ No newline at end of file +}] call EFUNC(common,addEventHandler); + +// hide clock on map if player has no watch +GVAR(hasWatch) = true; + +["playerInventoryChanged", { + if (isNull (_this select 0)) exitWith { + GVAR(hasWatch) = true; + }; + + GVAR(hasWatch) = "ItemWatch" in (_this select 1 select 17); +}] call ace_common_fnc_addEventhandler diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index 0c95e903e6..cc0824919a 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -4,6 +4,4 @@ ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); // hide time when no map in inventory -if (!isNull ACE_player) then { - ((_this select 0) displayCtrl 101) ctrlShow ("ItemWatch" in assignedItems ACE_player); -}; +((_this select 0) displayCtrl 101) ctrlShow GVAR(hasWatch); From 07ab7d1c35fc9d263a152c7b1816115c408b4dcf Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 02:00:53 +0200 Subject: [PATCH 127/137] correct comment --- addons/map/functions/fnc_onDrawMap.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index cc0824919a..37ec5a7000 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -3,5 +3,5 @@ ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); -// hide time when no map in inventory +// hide clock when no watch in inventory, or whatever never ever ((_this select 0) displayCtrl 101) ctrlShow GVAR(hasWatch); From 0bbf4d41287eff523ba8e09bd260d9d97873b155 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 2 Sep 2015 22:24:46 +0200 Subject: [PATCH 128/137] Prevent Cargo opening if vehicle is locked --- addons/cargo/functions/fnc_initVehicle.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/cargo/functions/fnc_initVehicle.sqf b/addons/cargo/functions/fnc_initVehicle.sqf index b817688336..efb3b9a5cf 100644 --- a/addons/cargo/functions/fnc_initVehicle.sqf +++ b/addons/cargo/functions/fnc_initVehicle.sqf @@ -41,7 +41,7 @@ if (getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) != 1) ex private ["_text", "_condition", "_statement", "_icon", "_action"]; _condition = { params ["_target", "_player"]; - GVAR(enable) && {[_player, _target, []] call EFUNC(common,canInteractWith)} + GVAR(enable) && {locked _target < 2} && {[_player, _target, []] call EFUNC(common,canInteractWith)} }; _text = localize LSTRING(openMenu); _statement = {GVAR(interactionVehicle) = _target; createDialog QGVAR(menu);}; From def2d295012fbc08dbf360f1897428406acaffbc Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 2 Sep 2015 22:51:31 +0200 Subject: [PATCH 129/137] Cleaned up slideshow privates --- addons/slideshow/functions/fnc_addSlideActions.sqf | 1 - addons/slideshow/functions/fnc_autoTransition.sqf | 1 - addons/slideshow/functions/fnc_createSlideshow.sqf | 3 +-- addons/slideshow/functions/fnc_makeList.sqf | 3 +-- addons/slideshow/functions/fnc_moduleInit.sqf | 1 - 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/addons/slideshow/functions/fnc_addSlideActions.sqf b/addons/slideshow/functions/fnc_addSlideActions.sqf index 1ebba306b4..a18249a4f8 100644 --- a/addons/slideshow/functions/fnc_addSlideActions.sqf +++ b/addons/slideshow/functions/fnc_addSlideActions.sqf @@ -20,7 +20,6 @@ #include "script_component.hpp" private "_actions"; - params ["_objects", "_images", "_names", "_controller", "_currentSlideshow"]; _actions = []; diff --git a/addons/slideshow/functions/fnc_autoTransition.sqf b/addons/slideshow/functions/fnc_autoTransition.sqf index c8b03a707a..4c31c4ff6a 100644 --- a/addons/slideshow/functions/fnc_autoTransition.sqf +++ b/addons/slideshow/functions/fnc_autoTransition.sqf @@ -19,7 +19,6 @@ #include "script_component.hpp" private "_currentSlide"; - params ["_objects", "_images", "_varString", "_duration"]; // Get current slide number of this slideshow diff --git a/addons/slideshow/functions/fnc_createSlideshow.sqf b/addons/slideshow/functions/fnc_createSlideshow.sqf index 665b954496..369593dd16 100644 --- a/addons/slideshow/functions/fnc_createSlideshow.sqf +++ b/addons/slideshow/functions/fnc_createSlideshow.sqf @@ -19,8 +19,7 @@ */ #include "script_component.hpp" -private ["_currentSlideshow", "_actionsObject", "_actionsClass", "_mainAction", "_slidesAction", "_varString"]; - +private ["_currentSlideshow", "_slidesAction", "_varString"]; params ["_objects", "_controllers", "_images", "_names", "_duration"]; // Verify data diff --git a/addons/slideshow/functions/fnc_makeList.sqf b/addons/slideshow/functions/fnc_makeList.sqf index 6736fabbdb..e550e462a7 100644 --- a/addons/slideshow/functions/fnc_makeList.sqf +++ b/addons/slideshow/functions/fnc_makeList.sqf @@ -17,9 +17,8 @@ */ #include "script_component.hpp" -params ["_list", "_trimWhitespace", "_checkNil"]; - private ["_splittedList", "_listTrimmedWhitespace", "_nilCheckPassedList"]; +params ["_list", "_trimWhitespace", "_checkNil"]; // Split using comma delimiter _splittedList = [_list, ","] call BIS_fnc_splitString; diff --git a/addons/slideshow/functions/fnc_moduleInit.sqf b/addons/slideshow/functions/fnc_moduleInit.sqf index da1724dfcc..a0b5386f97 100644 --- a/addons/slideshow/functions/fnc_moduleInit.sqf +++ b/addons/slideshow/functions/fnc_moduleInit.sqf @@ -18,7 +18,6 @@ if (!hasInterface && !isDedicated) exitWith {}; private ["_objects", "_controllers", "_images", "_names", "_duration"]; - params [["_logic", objNull, [objNull]], "_units", "_activated"]; if !(_activated) exitWith {}; From fbf00b9aa5e1065ee26c0f99bc7558382d7a7701 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 02:55:40 +0200 Subject: [PATCH 130/137] correct comment --- addons/grenades/functions/fnc_throwGrenade.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 17c0fb78cc..9439aef4bd 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -30,7 +30,7 @@ if (isNull _projectile) then { _projectile = nearestObject [_unit, _ammo]; }; -// handle speial grenades +// handle special grenades if (local _unit) then { if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flashbang)) == 1) then { private "_fuzeTime"; From cbccd898ea312b5fe2f748097b648fdb21d86349 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 2 Sep 2015 23:58:24 -0500 Subject: [PATCH 131/137] Run functions after setting init --- addons/common/XEH_postInit.sqf | 10 +++++++++- addons/common/XEH_preInit.sqf | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index ba014ff182..9fbe84362a 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -150,6 +150,14 @@ call FUNC(checkFiles); //Event that settings are safe to use: ["SettingsInitialized", []] call FUNC(localEvent); + //Set init finished and run all delayed functions: + GVAR(settingsInitFinished) = true; + diag_log text format ["%1 delayed functions", (count GVAR(runAtSettingsInitialized))]; + { + _x params ["_args", "_code"]; + _args call _code; + } forEach GVAR(runAtSettingsInitialized); + }, 0, [false]] call CBA_fnc_addPerFrameHandler; @@ -326,7 +334,7 @@ GVAR(OldIsCamera) = false; if (didJip) then { // We are jipping! Get ready and wait, and throw the event [{ - if(!(isNull player)) then { + if((!(isNull player)) && GVAR(settingsInitFinished)) then { ["PlayerJip", [player] ] call FUNC(localEvent); [(_this select 1)] call cba_fnc_removePerFrameHandler; }; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 6fdf99113c..12fdc5629d 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -303,6 +303,9 @@ GVAR(nextFrameNo) = diag_frameno; GVAR(nextFrameBufferA) = []; GVAR(nextFrameBufferB) = []; +GVAR(settingsInitFinished) = false; +GVAR(runAtSettingsInitialized) = []; + // @TODO: Generic local-managed global-synced objects (createVehicleLocal) //Debug From 789de9d111e7ca1deb5b548364cc879bc9776524 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 3 Sep 2015 00:11:49 -0500 Subject: [PATCH 132/137] runAfterSettingsInit helper func --- addons/common/XEH_postInit.sqf | 6 ++--- addons/common/XEH_preInit.sqf | 1 + .../functions/fnc_runAfterSettingsInit.sqf | 27 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 addons/common/functions/fnc_runAfterSettingsInit.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 9fbe84362a..24a9e4ab6e 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -152,10 +152,10 @@ call FUNC(checkFiles); //Set init finished and run all delayed functions: GVAR(settingsInitFinished) = true; - diag_log text format ["%1 delayed functions", (count GVAR(runAtSettingsInitialized))]; + diag_log text format ["[ACE] %1 delayed functions running", (count GVAR(runAtSettingsInitialized))]; { - _x params ["_args", "_code"]; - _args call _code; + _x params ["_func", "_params"]; + _params call _func; } forEach GVAR(runAtSettingsInitialized); }, 0, [false]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 12fdc5629d..56e3062cd2 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -157,6 +157,7 @@ PREP(requestCallback); PREP(resetAllDefaults); PREP(restoreVariablesJIP); PREP(revertKeyCodeLocalized); +PREP(runAfterSettingsInit); PREP(sanitizeString); PREP(sendRequest); PREP(serverLog); diff --git a/addons/common/functions/fnc_runAfterSettingsInit.sqf b/addons/common/functions/fnc_runAfterSettingsInit.sqf new file mode 100644 index 0000000000..cf3faa1d7e --- /dev/null +++ b/addons/common/functions/fnc_runAfterSettingsInit.sqf @@ -0,0 +1,27 @@ +/* + * Author: PabstMirror + * Executes code after setting are initilized. + * + * Argument: + * 0: Code to execute + * 1: Parameters to run the code with + * + * Return value: + * None + * + * Example: + * [{if (GVAR(setting) then {x} else {y};}, []] call ace_common_fnc_runAfterSettingsInit + * + * Public: No + */ +#include "script_component.hpp" + +params ["_func", "_params"]; + +if (GVAR(settingsInitFinished)) then { + //Setting Already Finished, Direct Run the code + _params call _func; +} else { + //Waiting on settings, throw it on the delayed run array + GVAR(runAtSettingsInitialized) pushBack [_func, _params]; +}; From 024dc3effef60e91532ea832f7b35c16a17a9fe3 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 3 Sep 2015 00:16:48 -0500 Subject: [PATCH 133/137] Cleanup --- addons/common/XEH_postInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 24a9e4ab6e..4a194e0fe9 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -157,6 +157,7 @@ call FUNC(checkFiles); _x params ["_func", "_params"]; _params call _func; } forEach GVAR(runAtSettingsInitialized); + GVAR(runAtSettingsInitialized) = nil; //cleanup }, 0, [false]] call CBA_fnc_addPerFrameHandler; From a187be725540efdfbd03fd2fb7d76b5791442976 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 13:23:15 +0200 Subject: [PATCH 134/137] sort flashbang under explosive grenades --- addons/grenades/CfgAmmo.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 120d3ab5ea..7a3dd0476a 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -85,6 +85,7 @@ class CfgAmmo { suppressionRadiusHit = 20; typicalSpeed = 22; cost = 40; + explosive = 1E-7; deflecting = 15; timeToLive = 6; fuseDistance = 2.3; From 76bb2bd2b8e2942847bfcffcee08964d03c7b213 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 13:37:36 +0200 Subject: [PATCH 135/137] replace function with FUNC macro --- addons/map/XEH_postInitClient.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index b85d91bf16..f832c89c7b 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -107,6 +107,5 @@ GVAR(hasWatch) = true; if (isNull (_this select 0)) exitWith { GVAR(hasWatch) = true; }; - GVAR(hasWatch) = "ItemWatch" in (_this select 1 select 17); -}] call ace_common_fnc_addEventhandler +}] call EFUNC(common,addEventHandler) From 6b7f84b297d9f6af0f1629b74ca5cc2c873efa50 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 13:39:17 +0200 Subject: [PATCH 136/137] add missing ; --- addons/map/XEH_postInitClient.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index f832c89c7b..02800c2540 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -108,4 +108,4 @@ GVAR(hasWatch) = true; GVAR(hasWatch) = true; }; GVAR(hasWatch) = "ItemWatch" in (_this select 1 select 17); -}] call EFUNC(common,addEventHandler) +}] call EFUNC(common,addEventHandler); From 9e1ae58f4f8351a8fd6f945dd7ff749adc7c4ba0 Mon Sep 17 00:00:00 2001 From: bux578 Date: Thu, 3 Sep 2015 18:17:53 +0200 Subject: [PATCH 137/137] fix restore gear --- addons/respawn/functions/fnc_restoreGear.sqf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/respawn/functions/fnc_restoreGear.sqf b/addons/respawn/functions/fnc_restoreGear.sqf index 7e55c1d8e2..fd3f03d7aa 100644 --- a/addons/respawn/functions/fnc_restoreGear.sqf +++ b/addons/respawn/functions/fnc_restoreGear.sqf @@ -182,15 +182,18 @@ _activeWeapon = _activeWeaponAndMuzzle select 0; _activeMuzzle = _activeWeaponAndMuzzle select 1; _activeWeaponMode = _activeWeaponAndMuzzle select 2; -if (_activeMuzzle != "" and _activeMuzzle != _activeWeapon) then { +if (!(_activeMuzzle isEqualTo "") and + !(_activeMuzzle isEqualTo _activeWeapon) and + (_activeMuzzle in getArray (configfile >> "CfgWeapons" >> _activeWeapon >> "muzzles"))) then { + _unit selectWeapon _activeMuzzle; } else { - if (_activeWeapon != "") then { + if (!(_activeWeapon isEqualTo "")) then { _unit selectWeapon _activeWeapon; }; }; -if (currentWeapon _unit != "") then { +if (!(currentWeapon _unit isEqualTo "")) then { private ["_index"]; _index = 0; while {