Merge branch 'master' into medical-rewrite

This commit is contained in:
PabstMirror 2017-02-18 18:17:37 -06:00
commit c7b60d1777
84 changed files with 647 additions and 325 deletions

View File

@ -4,7 +4,7 @@
<p align="center">
<a href="https://github.com/acemod/ACE3/releases/latest">
<img src="https://img.shields.io/badge/Version-3.8.3-blue.svg?style=flat-square" alt="ACE3 Version">
<img src="https://img.shields.io/badge/Version-3.9.0-blue.svg?style=flat-square" alt="ACE3 Version">
</a>
<a href="https://github.com/acemod/ACE3/issues">
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat-square&label=Issues" alt="ACE3 Issues">

View File

@ -32,12 +32,15 @@ if (!hasInterface) exitWith {};
// - GVAR updating and initialization -----------------------------------------
["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler;
private _fnc_showStaminaBar = {
["visibleMap", {
params ["", "_visibleMap"]; // command visibleMap is updated one frame later
private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
_staminaBarContainer ctrlShow ((!_visibleMap) && {(vehicle ACE_player) == ACE_player});
}, true] call CBA_fnc_addPlayerEventHandler;
["vehicle", {
private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
_staminaBarContainer ctrlShow ((!visibleMap) && {(vehicle ACE_player) == ACE_player});
};
["visibleMap", _fnc_showStaminaBar, true] call CBA_fnc_addPlayerEventHandler;
["vehicle", _fnc_showStaminaBar, true] call CBA_fnc_addPlayerEventHandler;
}, true] call CBA_fnc_addPlayerEventHandler;
// - Duty factors -------------------------------------------------------------
if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then {

View File

@ -7,6 +7,7 @@
<Japanese>パフォーマンス要因</Japanese>
<Polish>Współczynnik wydolności</Polish>
<Korean>성능 요인</Korean>
<French>Facteur de performance</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_PerformanceFactor_Description">
<English>Influences the overall performance of all players with no custom factor. Higher means better.</English>
@ -14,6 +15,7 @@
<Japanese>非カスタム要因をもつ全プレイヤーへ全体的に動作を影響させます。高いほど影響がでます。</Japanese>
<Polish>Wpływa na ogólną wydolność organizmu u wszystkich graczy bez ustawionego niestandardowego współczynnika. Więcej znaczy lepiej.</Polish>
<Korean>모든 성능이 임의로 설정된 값 없이 영향받습니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Influence les performances générales de tous les joueurs sans facteurs personalisés. Une valeur plus élevée implique de meilleures performances.</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_PerformanceFactor_EdenDescription">
<English>Influences the overall performance of this unit. Higher means better.</English>
@ -21,6 +23,7 @@
<Japanese>非カスタム要因をもつ全プレイヤーへ全体的に動作を影響させます。高いほど影響がでます。</Japanese>
<Polish>Wpływa na ogólną wydolność tej jednostki. Więcej znaczy lepiej.</Polish>
<Korean>모든 성능이 이 단위로 영향을 받습니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Influence les performances générales de cette unité. Une valeur plus élevée implique de meilleures performances.</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RecoveryFactor">
<English>Recovery Factor</English>
@ -28,6 +31,7 @@
<Japanese>回復要因</Japanese>
<Polish>Współczynnik regeneracji</Polish>
<Korean>회복 요인</Korean>
<French>Facteur de récupération</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RecoveryFactor_Description">
<English>Changes how fast the player recovers when resting. Higher is faster.</English>
@ -35,6 +39,7 @@
<Japanese>休憩時は、プレイヤーが早く回復します。高いほど早くなります。</Japanese>
<Polish>Wpływa na czas regeneracji podczas postoju. Więcej znaczy szybciej.</Polish>
<Korean>얼마나 빨리 회복하는지를 바꿉니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Change la vitesse à laquelle les joueurs récupèrent leur endurance lorsqu'ils se reposent. Une valeur plus élevée implique une récupération plus rapide.</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_LoadFactor">
<English>Load Factor</English>
@ -42,6 +47,7 @@
<Japanese>負荷要因</Japanese>
<Polish>Współczynnik masy ekwipunku</Polish>
<Korean>부담 요인</Korean>
<French>Facteur d'encombrement</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_LoadFactor_Description">
<English>Increases or decreases how much weight influences the players performance. Zero means equipment weight has no performance influence.</English>
@ -49,6 +55,7 @@
<Japanese>重量によりプレイヤーの動作への影響下増加したり、低下します。装備を持っていない場合、影響はしません。</Japanese>
<Polish>Zmniejsza lub zwiększa wpływ ciężaru ekwipunku na wydolność gracza. Zero oznacza kompletny brak wpływu na wydolność.</Polish>
<Korean>플레이어가 무게에 따라 얼마나 영향받는지를 증가시키거나 감소시킵니다. 0의 경우 플레이어가 장비 무게에 영향받지 않습니다.</Korean>
<French>Augmente ou réduit l'influence que le poids à sur les performances des joueurs. Zéro implique que le poids de l'équipement n'a pas d'influence sur les performances.</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_TerrainGradientFactor">
<English>Terrain Gradient Factor</English>
@ -56,6 +63,7 @@
<Japanese>地形の勾配による要因</Japanese>
<Polish>Współczynnik terenu</Polish>
<Korean>지형 경사도 요인</Korean>
<French>Facteur d'inclinaison du terrain</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_TerrainGradientFactor_Description">
<English>Sets how much steep terrain increases stamina loss. Higher means higher stamina loss.</English>
@ -63,6 +71,7 @@
<Japanese>地形によって影響する体力の消費量を決定します。高数値ではより体力を消費します。</Japanese>
<Polish>Wpływa na to w jakim stopniu stromy teren wpływa na utratę wytrzymałości. Więcej oznacza szybszą utratę wytrzymałości.</Polish>
<Korean>경사도에 따라 얼마나 피로해지는지를 정합니다. 값이 클수록 더 많은 피로를 유발합니다.</Korean>
<French>Configure l'influence de l'inclinaison du terrain sur la perte d'endurance. Une valeur plus élevée implique une perte d'endurance plus importante.</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
<English>Enabled</English>
@ -70,6 +79,7 @@
<Japanese>有効化</Japanese>
<Polish>Włączone</Polish>
<Korean>활성화</Korean>
<French>Activé</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled_Description">
<English>Enables/disables Advanced Fatigue.</English>
@ -77,6 +87,7 @@
<Japanese>アドバンスド疲労の有効化と無効化</Japanese>
<Polish>Włącza/wyłącza zaawansowaną wytrzymałość</Polish>
<Korean>고급 피로도 활성화/비활성화</Korean>
<French>Active/désactive la fatigue avancée.</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_EnableStaminaBar">
<English>Show stamina bar</English>
@ -84,6 +95,7 @@
<Japanese>体力バーを表示</Japanese>
<Polish>Pokaż pasek wytrzymałości</Polish>
<Korean>피로도 막대</Korean>
<French>Afficher la barre d'endurance</French>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_EnableStaminaBar_Description">
<English>Shows the stamina bar.</English>
@ -91,6 +103,7 @@
<Japanese>体力バーを表示します。</Japanese>
<Polish>Pokazuje pasek wytrzymałości.</Polish>
<Korean>피로도 막대를 보여줍니다.</Korean>
<French>Affiche la barre d'endurance.</French>
</Key>
</Package>
</Project>

View File

@ -67,7 +67,8 @@ GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
}] call CBA_fnc_addPlayerEventhandler;
["visibleMap", {
if (visibleMap && {ACE_player getVariable [QGVAR(inHand), false]}) then {
params ["", "_visibleMap"]; // command visibleMap is updated one frame later
if (_visibleMap && {ACE_player getVariable [QGVAR(inHand), false]}) then {
[ACE_player, "Opened Map"] call FUNC(exitThrowMode);
};
}] call CBA_fnc_addPlayerEventhandler;

View File

@ -8,6 +8,7 @@
<Polish>Zaawansowane rzucanie</Polish>
<German>Erweitertes Wurfsystem</German>
<Korean>고급 투척</Korean>
<French>Lancé amélioré</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Module_Description">
<English>Allows changing advanced throwing behaviour.</English>
@ -16,6 +17,7 @@
<Polish>Zezwala na zmianę zachowania zaawansowanego trybu rzucania.</Polish>
<German>Erlaubt es, das Verhalten des erweiterten Wurfsystems zu ändern.</German>
<Korean>고급 투척 행위를 허가합니다</Korean>
<French>Permet de changer la configuration du lancé amélioré.</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Enable_DisplayName">
<English>Enable Advanced Throwing</English>
@ -24,6 +26,7 @@
<Polish>Aktywuj zaawansowane rzucanie</Polish>
<German>Aktiviere erweitertes Wurfsystem</German>
<Korean>고급 투척 활성화 </Korean>
<French>Active le lancé amélioré</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Enable_Description">
<English>Enables advanced throwing system.</English>
@ -32,6 +35,7 @@
<Polish>Aktywuje system zaawansowanego rzucania.</Polish>
<German>Aktiviert das erweiterte Wurfsystem.</German>
<Korean>고급 투척을 활성화 합니다</Korean>
<French>Active le système de lancé amélioré.</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowThrowArc_DisplayName">
<English>Show Throw Arc</English>
@ -40,6 +44,7 @@
<Polish>Pokaż trasę lotu</Polish>
<German>Zeige Wurfbogen</German>
<Korean>투척 궤적 표시</Korean>
<French>Afficher l'arc de lancé</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowThrowArc_Description">
<English>Enables visualization of the throw arc (where throwable will fly).</English>
@ -48,6 +53,7 @@
<Polish>Wyświetla wizualizację trasy przelotu granatu.</Polish>
<German>Aktiviert die Visualisierung des Wurfbogens (wohin das Objekt geworfen werden wird).</German>
<Korean>투척 궤도를 시각화 합니다(투척물이 어디로 갈지)</Korean>
<French>Active la visualisation de l'arc de lancé (où l'objet lancé va atterrir).</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowMouseControls_DisplayName">
<English>Show Throwing Mouse Controls</English>
@ -56,6 +62,7 @@
<Polish>Pokaż podpowiedzi sterowania myszą</Polish>
<German>Zeige Maussteuerung beim Werfen</German>
<Korean>마우스 조작 표시</Korean>
<French>Afficher les contrôles à la souris du lancé</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ShowMouseControls_Description">
<English>Enables visual cues for mouse controls when throwable is prepared.</English>
@ -64,6 +71,7 @@
<Polish>Wyświetla podpowiedzi sterowania myszą kiedy obiekt miotany jest w ręku.</Polish>
<German>Aktiviert visuelle Hinweise zur Maussteuerung, wenn ein Objekt zum Werfen vorbereitet wird.</German>
<Korean>투척물을 준비시 마우스 조작을 시각화해서 보여줍니다</Korean>
<French>Active les aides visuels pour les controles à la souris lorsqu'un lancé est préparé.</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUp_DisplayName">
<English>Enable Throwables Pick Up</English>
@ -72,6 +80,7 @@
<Polish>Zezwól na podnoszenie obiektów miotanych</Polish>
<German>Aktiviere Aufheben von Wurfobjekten</German>
<Korean>투척물 줍기 활성화</Korean>
<French>Active la récupération des objets lancés</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUp_Description">
<English>Enables ability to pick up throwables from the ground.</English>
@ -80,6 +89,7 @@
<Polish>Umożliwia podnoszenie obiektów miotanych z ziemi.</Polish>
<German>Aktiviert die Möglichkeit, geworfene Objekte wieder vom Boden aufzuheben.</German>
<Korean>땅에 떨어진 투척물을 주울 수 있게 해줍니다.</Korean>
<French>Active la capacité de récupérer les objets lancés sur le sol.</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUpAttached_DisplayName">
<English>Enable Attached Throwables Pick Up</English>
@ -88,6 +98,7 @@
<Polish>Zezwól na podnoszenie przyczepionych obiektów miotanych</Polish>
<German>Aktiviere erneute Aufnahme befestigter Wurfobjekte</German>
<Korean>부착 투척물 줍기 활성화</Korean>
<French>Active le ramassage d'objets lançables attachés</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnablePickUpAttached_Description">
<English>Enables ability to pick up throwables from attached objects.</English>
@ -96,6 +107,7 @@
<Polish>Umożliwia podnoszenie obiektów miotanych przyczepionych do innych obiektów.</Polish>
<German>Aktiviert die Möglichkeit, befestigte Wurfobjekte erneut aufzunehmen.</German>
<Korean>부착된 투척물을 주울 수 있게 해줍니다.</Korean>
<French>Active la capacité à ramasser les objets lançables attaché à d'autres objets.</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Prepare">
<English>Prepare/Change Throwable</English>
@ -104,6 +116,7 @@
<Polish>Przygotuj/zmień ob. miotany</Polish>
<German>Wurfobjekt vorbereiten/wechseln</German>
<Korean>투척물 준비/변경</Korean>
<French>Préparer/changer d'objet</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_dropModeHold">
<English>Throwable Drop Mode (Hold)</English>
@ -112,6 +125,7 @@
<Polish>Tryb upuszczania ob. miotanego (przytrzymaj)</Polish>
<German>Wurfobjekt Fallmodus (halten)</German>
<Korean>투척물 떨어뜨리기 모드(꾹눌러서)</Korean>
<French>Mode de lancé de l'objet (Tenir)</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_DropModeToggle">
<English>Throwable Drop Mode (Toggle)</English>
@ -120,6 +134,7 @@
<Polish>Tryb upuszczania ob. miotanego (przełącz)</Polish>
<German>Wurfobjekt Fallmodus (umschalten)</German>
<Korean>투척물 떨어뜨리기 모드(토글)</Korean>
<French>Mode de lancé de l'objet (Basculer)</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Primed">
<English>Primed</English>
@ -128,6 +143,7 @@
<Polish>Odbezpieczony</Polish>
<German>Scharf gemacht</German>
<Korean>뇌관 작동</Korean>
<French>Amorcer</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Throw">
<English>Throw</English>
@ -136,6 +152,7 @@
<Polish>Rzuć</Polish>
<German>Werfen</German>
<Korean>던지기</Korean>
<French>Lancer</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_ChangeMode">
<English>(Scroll) Change Mode</English>
@ -144,6 +161,7 @@
<Polish>(Kółko m.) zmień tryb</Polish>
<German>(Scrollen) Modus wechseln</German>
<Korean>(마우스 휠) 모드 변경</Korean>
<French>(Molette souris) Changer de mode</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Extend">
<English>(Scroll) Extend</English>
@ -152,6 +170,7 @@
<Polish>(Kółko m.) przedłuż</Polish>
<German>(Scrollen) Erweitern</German>
<Korean>(마우스 휠) 연장</Korean>
<French>(Molette souris) Etendre</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Cook">
<English>(Click) Cook</English>
@ -160,6 +179,7 @@
<Polish>(Kliknięcie) Odbezpiecz</Polish>
<German>(Klicken) Abkochen</German>
<Korean>(클릭) 예열</Korean>
<French>(Clique) Dégoupiller</French>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_PickUp">
<English>Pick Up</English>
@ -168,6 +188,7 @@
<Polish>Podnieś</Polish>
<German>Aufheben</German>
<Korean>줍기</Korean>
<French>Ramasser</French>
</Key>
</Package>
</Project>

View File

@ -286,11 +286,11 @@ enableCamShake true;
params ["_newPlayer","_oldPlayer"];
if (alive _newPlayer) then {
[_newPlayer] call FUNC(setName);
[FUNC(setName), [_newPlayer]] call CBA_fnc_execNextFrame;
};
if (alive _oldPlayer) then {
[_oldPlayer] call FUNC(setName);
[FUNC(setName), [_oldPlayer]] call CBA_fnc_execNextFrame;
};
}] call CBA_fnc_addPlayerEventHandler;

View File

@ -13,6 +13,7 @@
#include "script_component.hpp"
params ["_unit"];
TRACE_3("setName",_unit,alive _unit,name _unit);
if (isNull _unit || {!alive _unit}) exitWith {};

View File

@ -1,3 +1,3 @@
#include "script_component.hpp"
params ["_wire"];
_wire addEventHandler ["HandleDamage", FUNC(handleDamage)];
_wire addEventHandler ["HandleDamage", {call FUNC(handleDamage)}];

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="CookOff">
<Key ID="STR_ACE_CookOff_enable_name">
@ -9,6 +9,7 @@
<Japanese>誘爆を有効化</Japanese>
<Korean>쿡오프 현상 활성화</Korean>
<Polish>Aktywuj efekty samozapłonu amunicji</Polish>
<French>Activer </French>
</Key>
<Key ID="STR_ACE_CookOff_enable_tooltip">
<English>Enables cook off and related vehicle destruction effects.</English>
@ -65,6 +66,7 @@
</Key>
<Key ID="STR_ACE_CookOff_ammoCookoffDuration_tooltip">
<English>Multiplier for how long cook off lasts [Setting to 0 will disable ammo cookoff]</English>
<French>Active le et les effets de destructions assosicée aux vehicules.</French>
</Key>
</Package>
</Project>

View File

@ -9,6 +9,7 @@
<Japanese>ドッグ タグ</Japanese>
<German>Hundemarke</German>
<Korean>군번줄</Korean>
<French>Plaque d'identification</French>
</Key>
<Key ID="STR_ACE_Dogtags_checkItem">
<English>Check Dog Tag</English>
@ -18,6 +19,7 @@
<Japanese>ドッグ タグを見る</Japanese>
<German>Hundemarke prüfen</German>
<Korean>군번줄 확인</Korean>
<French>Vérifier les plaques d'identification</French>
</Key>
<Key ID="STR_ACE_Dogtags_checkDogtag">
<English>Check</English>
@ -27,6 +29,7 @@
<Japanese>見る</Japanese>
<German>Prüfen</German>
<Korean>확인</Korean>
<French>Vérifier</French>
</Key>
<Key ID="STR_ACE_Dogtags_takeDogtag">
<English>Take</English>
@ -36,6 +39,7 @@
<Japanese>取る</Japanese>
<German>Nehmen</German>
<Korean>회수</Korean>
<French>Prendre</French>
</Key>
<Key ID="STR_ACE_Dogtags_takeDogtagSuccess">
<English>Dogtag taken from %1...</English>
@ -45,6 +49,7 @@
<Japanese>%1からドッグ タグを取っている・・・</Japanese>
<German>Hundemarke von %1 genommen ...</German>
<Korean>%1로부터 군번줄을 회수했습니다...</Korean>
<French>Plaque d'identification pris sur %1...</French>
</Key>
<Key ID="STR_ACE_Dogtags_dogtagAlreadyTaken">
<English>Somebody else has already taken the dogtag...</English>
@ -54,6 +59,8 @@
<Japanese>すでに誰かがドッグ タグを取っているようだ・・・</Japanese>
<German>Jemand anderes hat bereits die Hundemarke genommen ...</German>
<Korean>누군가 이미 군번줄을 회수해갔습니다...</Korean>
<French>Quelqu'un d'autre a déjâ pris les plaques d'identification...</French>
</Key>
</Package>
</Project>

View File

@ -882,6 +882,7 @@
<Polish>Flara na linkę</Polish>
<German>Stolperdraht-Leuchtrakete</German>
<Korean>조명지뢰</Korean>
<French>Fusée éclairante avec fil de détente</French>
</Key>
<Key ID="STR_ACE_Explosives_TripFlare_Description">
<English>Type: Tripwire flare - Ignites a non-lethal flare when triggered.&lt;br /&gt;Rounds: 1&lt;br /&gt;Used on: Ground</English>
@ -890,6 +891,7 @@
<Polish>Typ: Flara na linkę - Wystrzeliwuje nieszkodliwą flarę przy nadepnięciu linki.&lt;br/&gt;Pociski: 1&lt;br/&gt;Używane na: ziemia</Polish>
<German>Typ: Stolperdraht-Leuchtrakete - Schießt bei Auslösung eine nicht-tödliche Leuchtrakete ab.&lt;br /&gt;Ladungen: 1&lt;br /&gt;Benutzt auf: Boden</German>
<Korean>종류: 조명지뢰 - 작동시 무해한 조명을 사출합니다.&lt;br /&gt;장탄수: 1&lt;br /&gt;사용처: 지면</Korean>
<French>Type : Fusée éclairante avec fil de détente - Allume une fusée éclairante lorsque déclenché. &lt;br /&gt;Coups : 1&lt;br /&gt;Utilisé sur : le sol</French>
</Key>
</Package>
</Project>

View File

@ -1,6 +1,6 @@
#include "script_component.hpp"
if (GVAR(EnableDebugTrace) && {!isMultiplayer}) then {
if (GVAR(enableDebugTrace) && {!isMultiplayer}) then {
GVAR(traceFrags) = true;
GVAR(autoTrace) = true;
};
@ -27,4 +27,3 @@ GVAR(cacheRoundsTypesToTrack) = [false] call CBA_fnc_createNamespace;
#ifdef DEBUG_ENABLED_FRAG
[true, true, 30] call FUNC(dev_debugAmmo);
#endif

View File

@ -13,7 +13,7 @@ if (_round in GVAR(blackList)) exitWith {
};
// Exit on max track
if ((count GVAR(objects)) > GVAR(MaxTrack)) exitWith {};
if ((count GVAR(objects)) > GVAR(maxTrack)) exitWith {};
if (
_gun == ACE_player ||

View File

@ -103,6 +103,7 @@ for "_i" from 1 to _spallCount do {
[ACE_player, _fragment, [1, 0.5, 0, 1]] call FUNC(addTrack);
};
};
_spread = 5 + (random 5);
_spallCount = 3 + (random 5);
for "_i" from 1 to _spallCount do {

View File

@ -75,23 +75,18 @@ if (_zIndex < 5) then {
private _explosions = [];
{
private _blist = _x select 1;
private _avgX = 0;
private _avgY = 0;
private _avgZ = 0;
private _avg = [0, 0, 0];
{
ADD(_avgX,_x select 0);
ADD(_avgY,_x select 1);
ADD(_avgZ,_x select 2);
_avg = _avg vectorAdd _x;
} forEach _blist;
_c = count _blist;
private _bpos = [_avgX / _c, _avgY / _c, _avgZ / _c];
private _bpos = _avg vectorMultiply (1 / _c);
private _distance = _pos vectorDistance _bpos;
private _hitFactor = 1 - (((_distance / (_indirectHitRange * 4)) min 1) max 0);
// _hitFactor = 1 / (_distance ^ 2);
private _hit = _indirectHit * _hitFactor;
_hit = (floor (_hit / 4)) min 500;
private _hit = (floor (_indirectHit * _hitFactor / 4)) min 500;
SUB(_hit,_hit % 10);
private _range = (floor (_indirectHitRange - (_distance / 4))) min 100;
SUB(_range,_range % 2);

View File

@ -30,7 +30,7 @@ if (isNil "_shouldAdd") then {
_shouldAdd = false;
};
if (GVAR(SpallEnabled)) exitWith {
if (GVAR(spallEnabled)) exitWith {
//Always want to run whenever spall is enabled?
_shouldAdd = true;
TRACE_2("SettingCache[spallEnabled]",_ammo,_shouldAdd);

View File

@ -59,14 +59,14 @@ if (_warn) then {
INFO_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_shellType);
};
private _fragPower = (((_m / _c) + _k) ^ - (1 / 2)) * _gC;
_fragPower = _fragPower * 0.8; // Gunery equation is for a non-fragmenting metal, imperical value of 80% represents fragmentation
// Gunery equation is for a non-fragmenting metal, imperical value of 80% represents fragmentation
private _fragPower = 0.8 * (((_m / _c) + _k) ^ - (1 / 2)) * _gC;
private _atlPos = ASLtoATL _lastPos;
private _fragPowerRandom = _fragPower * 0.5;
if ((_atlPos select 2) < 0.5) then {
_lastPos set [2, (_lastPos select 2) + 0.5];
_lastPos vectorAdd [0, 0, 0.5];
};
// _manObjects = _atlPos nearEntities ["CaManBase", _fragRange];
@ -96,71 +96,68 @@ _fragArcs set [360, 0];
private _doRandom = true;
if (_isArmed && {!(_objects isEqualTo [])}) then {
if (GVAR(ReflectionsEnabled)) then {
if (GVAR(reflectionsEnabled)) then {
[_lastPos, _shellType] call FUNC(doReflections);
};
{
//if (random(1) > 0.5) then {
private _target = _x;
if (alive _target) then {
private _boundingBox = boundingBox _target;
(boundingBox _target) params ["_boundingBoxA", "_boundingBoxB"];
private _cubic = ((abs (_boundingBoxA select 0)) + (_boundingBoxB select 0)) * ((abs (_boundingBoxA select 1)) + (_boundingBoxB select 1)) * ((abs (_boundingBoxA select 2)) + (_boundingBoxB select 2));
if (_cubic <= 1) exitWith {};
_doRandom = true;
private _targetVel = velocity _target;
private _targetPos = getPosASL _target;
private _distance = _targetPos distance _lastPos;
private _add = (((_boundingBox select 1) select 2) / 2) + ((((_distance - (_fragpower / 8)) max 0) / _fragPower) * 10);
private _bbX = (abs ((_boundingBox select 0) select 0)) + ((_boundingBox select 1) select 0);
private _bbY = (abs ((_boundingBox select 0) select 1)) + ((_boundingBox select 1) select 1);
private _bbZ = (abs ((_boundingBox select 0) select 2)) + ((_boundingBox select 1) select 2);
private _cubic = _bbX * _bbY * _bbZ;
if (_cubic > 1) then {
_doRandom = true;
private _distance = _targetPos vectorDistance _lastPos;
private _add = ((_boundingBoxB select 2) / 2) + ((((_distance - (_fragpower / 8)) max 0) / _fragPower) * 10);
private _targetVel = velocity _target;
_targetPos = _targetPos vectorAdd [
(_targetVel select 0) * (_distance / _fragPower),
(_targetVel select 1) * (_distance / _fragPower),
_add
];
_targetPos = _targetPos vectorAdd [
(_targetVel select 0) * (_distance / _fragPower),
(_targetVel select 1) * (_distance / _fragPower),
_add
];
private _baseVec = _lastPos vectorFromTo _targetPos;
private _baseVec = _lastPos vectorFromTo _targetPos;
private _dir = floor (_baseVec call CBA_fnc_vectDir);
private _currentCount = _fragArcs select _dir;
ISNILS(_currentCount,0);
if (_currentCount < 20) then {
private _count = ceil (random (sqrt (_m / 1000)));
private _vecVar = FRAG_VEC_VAR;
if (!(_target isKindOf "Man")) then {
_vecVar = ((sqrt _cubic) / 2000) + FRAG_VEC_VAR;
if ((crew _target) isEqualTo [] && {_count > 0}) then {
_count = 0 max (_count / 2);
};
private _dir = floor (_baseVec call CBA_fnc_vectDir);
private _currentCount = RETDEF(_fragArcs select _dir,0);
if (_currentCount < 20) then {
private _count = ceil (random (sqrt (_m / 1000)));
private _vecVar = FRAG_VEC_VAR;
if (!(_target isKindOf "Man")) then {
ADD(_vecVar,(sqrt _cubic) / 2000);
if ((crew _target) isEqualTo [] && {_count > 0}) then {
_count = 0 max (_count / 2);
};
for "_i" from 1 to _count do {
private _vec = _baseVec vectorDiff [
(_vecVar / 2) + (random _vecVar),
(_vecVar / 2) + (random _vecVar),
(_vecVar / 2) + (random _vecVar)
];
private _fp = _fragPower - (random (_fragPowerRandom));
private _vel = _vec vectorMultiply _fp;
private _fragType = round (random ((count _fragTypes) - 1));
private _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000];
// diag_log text format ["fp: %1 %2", _fp, typeOf _fragObj];
_fragObj setPosASL _lastPos;
_fragObj setVectorDir _vec;
_fragObj setVelocity _vel;
if (GVAR(traceFrags)) then {
INC(GVAR(totalFrags));
[ACE_player, _fragObj, [1,0,0,1]] call FUNC(addTrack);
};
INC(_fragCount);
INC(_currentCount);
};
_fragArcs set [_dir, _currentCount];
};
for "_i" from 1 to _count do {
private _vec = _baseVec vectorDiff [
(_vecVar / 2) + (random _vecVar),
(_vecVar / 2) + (random _vecVar),
(_vecVar / 2) + (random _vecVar)
];
private _fp = _fragPower - (random (_fragPowerRandom));
private _vel = _vec vectorMultiply _fp;
private _fragType = round (random ((count _fragTypes) - 1));
private _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000];
// diag_log text format ["fp: %1 %2", _fp, typeOf _fragObj];
_fragObj setPosASL _lastPos;
_fragObj setVectorDir _vec;
_fragObj setVelocity _vel;
if (GVAR(traceFrags)) then {
INC(GVAR(totalFrags));
[ACE_player, _fragObj, [1,0,0,1]] call FUNC(addTrack);
};
INC(_fragCount);
INC(_currentCount);
};
_fragArcs set [_dir, _currentCount];
};
};
//};

View File

@ -19,7 +19,7 @@ private _gcIndex = [];
private _iter = 0;
private _objectCount = count GVAR(objects);
while {_objectCount > 0 && {_iter < (GVAR(MaxTrackPerFrame) min _objectCount)}} do {
while {_objectCount > 0 && {_iter < (GVAR(maxTrackPerFrame) min _objectCount)}} do {
if (GVAR(lastIterationIndex) >= _objectCount) then {
GVAR(lastIterationIndex) = 0;

View File

@ -32,8 +32,7 @@ _this set [1, getPosASL _round];
_this set [2, velocity _round];
if (_doSpall) then {
private ["_scale"];
_scale = ((count GVAR(objects)) / GVAR(MaxTrackPerFrame)) max 0.1;
private _scale = ((count GVAR(objects)) / GVAR(maxTrackPerFrame)) max 0.1;
[_round, _scale, _spallTrack, _foundObjectHPIds] call FUNC(spallTrack);
};

View File

@ -2,7 +2,7 @@
// THIS FUNCTION SHOULD NOT BE USED BECAUSE IT CAUSES AN SEARCH AND REBUILD
PARAMS_1(_round);
params ["_round"];
if (_round in GVAR(blackList)) then {
REM(GVAR(blackList),_round);

View File

@ -2,4 +2,4 @@
if (GVAR(tracesStarted)) exitWith {};
GVAR(tracesStarted) = true;
GVAR(traceID) = [FUNC(drawTraces)] call CBA_fnc_addPerFrameHandler;
GVAR(traceID) = [FUNC(drawTraces), 0, []] call CBA_fnc_addPerFrameHandler;

View File

@ -172,7 +172,7 @@
<German>(nur SP) Splitter-/Explosions-Debugging</German>
<Czech>(Pouze SP) Vyžaduje restart mise/editoru. Aktivuje vizuální stopování fragmentace a úlomů pouze v režimu jednoho hráče.</Czech>
<Portuguese>(Somente SP) Requer um reinício de missão / editor. Habilita o rastreamento visual de projéteis de fragmentação e estilhaçamento apenas no modo de jogo SP.</Portuguese>
<French>(SP seulement) Requiert un redémarrage de mission ou de l'éditeur. Active les traceurs visuels de fragmentation et d'éclats en mode solo seulement</French>
<French>(SP seulement) Requiert un redémarrage de mission ou de l'éditeur. Active les traceurs visuels de fragmentation et d'éclats en mode solo seulement.</French>
<Hungarian>(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.</Hungarian>
<Russian>(Только для одиночной игры) Требует перезапуска миссии/редактора. Включает визуальные следы от осколков и обломков в режиме одиночной игры.</Russian>
<Italian>(Solo SP) Richiede un restart editor/missione. Abilita il tracciamento visivo di schegge da frammentazione/spalling in modalità Giocatore Singolo.</Italian>

View File

@ -36,6 +36,7 @@
<Polish>Efekty gogli</Polish>
<German>Brilleneffekt</German>
<Korean>고글 효과</Korean>
<French>Effets des lunettes</French>
</Key>
<Key ID="STR_ACE_Goggles_effects_tintOnly">
<English>Tint</English>
@ -44,6 +45,7 @@
<Polish>Winieta</Polish>
<German>Tönung</German>
<Korean>색조</Korean>
<French>Teinte</French>
</Key>
<Key ID="STR_ACE_Goggles_enabled_tintAndEffects">
<English>Tint + Effects</English>
@ -52,6 +54,8 @@
<Polish>Winieta + Efekty</Polish>
<German>Tönung + Effekte</German>
<Korean>색조+효과</Korean>
<French>Teinte + effets</French>
</Key>
</Package>
</Project>

View File

@ -302,6 +302,7 @@
<Japanese>AN-M14 焼夷手榴弾</Japanese>
<Polish>Granat zapalający AN-M14</Polish>
<Korean>AN-M14 소이 수류탄</Korean>
<French>Grenade incendiaire AN-M14</French>
</Key>
<Key ID="STR_ACE_Grenades_Incendiary_NameShort">
<English>AN-M14</English>
@ -310,6 +311,7 @@
<Japanese>AN-M14</Japanese>
<Polish>AN-M14</Polish>
<Korean>AN-M14</Korean>
<French>AN-M14</French>
</Key>
<Key ID="STR_ACE_Grenades_Incendiary_Description">
<English>Incendiary grenade used to destroy weapons, ammunition and other equipment.</English>
@ -318,6 +320,7 @@
<Japanese>焼夷手榴弾は武器や弾薬箱などの装備を破壊するために使われます。</Japanese>
<Polish>Granat zapalający, używany do niszczenia broni, amunicji i innego sprzętu.</Polish>
<Korean>소이 수류탄은 무기나 탄약 그리고 장비를 파괴할때 쓰입니다.</Korean>
<French>Grenade incendiaire utilisé pour détruire des armes, munitions et autres équipements.</French>
</Key>
</Package>
</Project>

View File

@ -5,7 +5,7 @@ class CfgVehicles {
class ACE_Equipment {
class ACE_PutInEarplugs {
displayName = CSTRING(EarPlugs_On);
condition = QUOTE( !([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarPlugs' in items _player} );
condition = QUOTE(GVAR(EnableCombatDeafness) && {!([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarPlugs' in items _player}});
exceptions[] = {"isNotInside", "isNotSitting"};
statement = QUOTE( [_player] call FUNC(putInEarPlugs) );
showDisabled = 0;
@ -14,7 +14,7 @@ class CfgVehicles {
};
class ACE_RemoveEarplugs {
displayName = CSTRING(EarPlugs_Off);
condition = QUOTE( [_player] call FUNC(hasEarPlugsIn) );
condition = QUOTE( GVAR(EnableCombatDeafness) && {[_player] call FUNC(hasEarPlugsIn)});
exceptions[] = {"isNotInside", "isNotSitting"};
statement = QUOTE( [_player] call FUNC(removeEarPlugs) );
showDisabled = 0;

View File

@ -35,7 +35,7 @@ GVAR(lastPlayerVehicle) = objNull;
TRACE_2("removed veh eh",_firedEH,GVAR(lastPlayerVehicle));
};
if ((!isNull _vehicle) && {_player != _vehicle}) then {
private _firedEH = _vehicle addEventHandler ["FiredNear", LINKFUNC(firedNear)];
private _firedEH = _vehicle addEventHandler ["FiredNear", {call FUNC(firedNear)}];
_vehicle setVariable [QGVAR(firedEH), _firedEH];
GVAR(lastPlayerVehicle) = _vehicle;
TRACE_2("added veh eh",_firedEH,GVAR(lastPlayerVehicle));
@ -60,9 +60,9 @@ GVAR(lastPlayerVehicle) = objNull;
};
// Don't add a new EH if the unit respawned
if ((_player getVariable [QGVAR(firedEH), -1]) == -1) then {
private _firedEH = _player addEventHandler ["FiredNear", LINKFUNC(firedNear)];
private _firedEH = _player addEventHandler ["FiredNear", {call FUNC(firedNear)}];
_player setVariable [QGVAR(firedEH), _firedEH];
private _explosionEH = _player addEventHandler ["Explosion", LINKFUNC(explosionNear)];
private _explosionEH = _player addEventHandler ["Explosion", {call FUNC(explosionNear)}];
_player setVariable [QGVAR(explosionEH), _explosionEH];
TRACE_3("added unit eh",_player,_firedEH,_explosionEH);
};

View File

@ -17,6 +17,8 @@
params ["_player"];
if (!GVAR(EnableCombatDeafness)) exitWith {};
// Plugs in inventory, putting them in
_player removeItem "ACE_EarPlugs";

View File

@ -17,6 +17,8 @@
params ["_player"];
if (!GVAR(EnableCombatDeafness)) exitWith {};
if !(_player canAdd "ACE_EarPlugs") exitWith { // inventory full
[localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured);
};

View File

@ -21,7 +21,7 @@ GVAR(ParsedTextCached) = [];
//Setup text/shadow/size/color settings matrix
[] call FUNC(setupTextColors);
// Install the render EH on the main display
addMissionEventHandler ["Draw3D", DFUNC(render)];
addMissionEventHandler ["Draw3D", {call FUNC(render)}];
}] call CBA_fnc_addEventHandler;
//Add Actions to Houses:

View File

@ -109,6 +109,22 @@ private _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions
TRACE_1("Building ACE_Actions",_objectType);
private _actions = [_actionsCfg, 0] call _recurseFnc;
// ace_interaction_fnc_addPassengerAction expects ACE_MainActions to be first
// Other mods can change the order that configs are added, so we should verify this now and resort if needed
if (_objectType isKindOf "CaManBase") then {
if ((((_actions select 0) select 0) select 0) != "ACE_MainActions") then {
INFO_1("ACE_MainActions not first for man [%1]",_objectType);
private _mainActions = [];
{
if (((_x select 0) select 0) == "ACE_MainActions") then {
_mainActions = _actions deleteAt _forEachIndex;
};
} forEach _actions;
if (_mainActions isEqualTo []) exitWith {ERROR_1("ACE_MainActions not found on man [%1]",_objectType);};
_actions = [_mainActions] + _actions; // resort array with ACE_MainActions first
};
};
_namespace setVariable [_objectType, _actions];
/*

View File

@ -2,6 +2,7 @@
// interaction menu
PREP(addPassengerActions);
PREP(addPassengersActions);
PREP(getInteractionDistance);
PREP(getVehiclePos);
PREP(getVehiclePosComplex);
PREP(getWeaponPos);

View File

@ -0,0 +1,33 @@
/*
* Author: PabstMirror
* Gets effective interaction distance (handles very large vehicles)
*
* Arguments:
* 0: Player <OBJECT>
* 0: Target Vehicle <OBJECT>
*
* Return value:
* Distance to interaction point <NUMBER>
*
* Example:
* [player, cursorObject] call ace_interaction_fnc_getInteractionDistance
*
* Public: No
*/
#include "script_component.hpp"
params ["_unit", "_target"];
TRACE_3("getInteractionDistance",_unit,_target,typeOf _target);
// Handle Man, Crate
if (!((_target isKindOf "Car") || {_target isKindOf "Tank"} || {_target isKindOf "Helicopter"} || {_target isKindOf "Plane"} || {_target isKindOf "Ship_F"})) exitWith {
_unit distance _target
};
private _unitEyeASL = eyePos _unit;
private _targetModelPos = [_target, _unitEyeASL] call FUNC(getVehiclePosComplex);
private _distance = _unitEyeASL distance (AGLtoASL (_target modelToWorld _targetModelPos));
TRACE_2("",_targetModelPos,_distance);
_distance

View File

@ -49,7 +49,7 @@
<Polish>Hełmy</Polish>
<Italian>Copricapi</Italian>
<Spanish>Cascos</Spanish>
<French> Couvre-chefs</French>
<French>Couvre-chefs</French>
<Portuguese>Capacetes</Portuguese>
<Russian>Головные уборы</Russian>
<Japanese>ヘッドギア</Japanese>

View File

@ -1,5 +1,4 @@
PREP(cycleFireMode);
PREP(getTarget);
PREP(mapHelperDraw);
PREP(onOpticDraw);

View File

@ -1,30 +0,0 @@
/*
* Author: jaynus
* Cycles fire mode (top/dir)
*
* Arguments:
* None
*
* Return Value:
* None
*
* Example:
* [] call ace_javelin_fnc_cycleFireMode
*
* Public: No
*/
// #define DEBUG_MODE_FULL
#include "script_component.hpp"
TRACE_1("cycle fire mode", _this);
private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player};
private _currentFireMode = _currentShooter getVariable ["ace_missileguidance_attackProfile", "JAV_TOP"];
if (_currentFireMode == "JAV_DIR") then {
_currentFireMode = "JAV_TOP";
} else {
_currentFireMode = "JAV_DIR";
};
_currentShooter setVariable ["ace_missileguidance_attackProfile", _currentFireMode, false];
TRACE_2("set",_currentFireMode,_currentShooter);

View File

@ -18,11 +18,3 @@
false
},
[15, [false, false, false]], false] call CBA_fnc_addKeybind; //Tab Key
["ACE3 Weapons", QGVAR(cycleFireMode), localize LSTRING(CycleFireMode),
{ false },
{
[ACE_player] call FUNC(cycleFireMode);
false
},
[15, [false, true, false]], false] call CBA_fnc_addKeybind; //Ctrl+Tab Key

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Javelin">
<Key ID="STR_ACE_Javelin_LockTarget">
@ -15,19 +15,5 @@
<Japanese>目標を捕捉 (押しっぱ)</Japanese>
<Korean>표적 획득 (누르기)</Korean>
</Key>
<Key ID="STR_ACE_Javelin_CycleFireMode">
<English>Cycle Fire Mode</English>
<German>Wechsle Feuermodus</German>
<Russian>Переключение режимов огня</Russian>
<Czech>Přepínání režimů palby</Czech>
<Polish>Przełącz tryb ognia</Polish>
<French>Cycle mode de tir</French>
<Hungarian>Tüzelési mód váltása</Hungarian>
<Italian>Alterna le modalità di fuoco</Italian>
<Spanish>Cambiar modo de disparo</Spanish>
<Portuguese>Alterar Modo de Disparo</Portuguese>
<Japanese>発射モード切り替え</Japanese>
<Korean>발사 방식 순환</Korean>
</Key>
</Package>
</Project>

View File

@ -1,4 +1,5 @@
PREP(drawLaserpoint);
PREP(getNearUnits);
PREP(onDraw);
PREP(switchLaserLightMode);

View File

@ -7,32 +7,75 @@
if (!hasInterface) exitWith {};
GVAR(nearUnits) = [];
GVAR(index) = -1;
GVAR(laserClassesCache) = [] call CBA_fnc_createNamespace;
GVAR(redLaserUnits) = [];
GVAR(greenLaserUnits) = [];
#include "initKeybinds.sqf"
["ace_settingsInitialized", {
//If not enabled, dont't add draw eventhandler or PFEH (for performance)
if (!GVAR(enabled)) exitWith {};
// if not enabled, dont't add draw eventhandler or PFEH (for performance)
if !(GVAR(enabled)) exitWith {};
// @todo. Maybe move to common?
[{
// handle RHS / bugged vehicle slots
private _camPosAGL = positionCameraToWorld [0,0,0];
if !((_camPosAGL select 0) isEqualType 0) exitWith {};
private _oldNearUnits = GVAR(nearUnits);
GVAR(nearUnits) = call FUNC(getNearUnits);
private _nearUnits = [];
// remove units that moved away
{
_nearUnits append crew _x;
if (count _nearUnits > 10) exitWith {
_nearUnits resize 10;
GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _x);
GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _x);
} forEach (_oldNearUnits - GVAR(nearUnits));
}, 5, []] call CBA_fnc_addPerFrameHandler;
private _fnc_processUnit = {
params ["_unit"];
private _weapon = currentWeapon _unit;
private _laser = [(_unit weaponAccessories _weapon) select 1] param [0, ""];
if (_laser isEqualTo "") exitWith {};
private _laserID = GVAR(laserClassesCache) getVariable _laser;
if (isNil "_laserID") then {
_laserID = getNumber (configFile >> "CfgWeapons" >> _laser >> "ACE_laserpointer");
GVAR(laserClassesCache) setVariable [_laser, _laserID];
};
if (_unit isFlashlightOn _weapon) then {
if (_laserID isEqualTo 1) exitWith {
GVAR(redLaserUnits) pushBackUnique _unit;
GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit);
};
} forEach nearestObjects [_camPosAGL, ["AllVehicles"], 50]; // when moving this, search also for units inside vehicles. currently breaks the laser in FFV
GVAR(nearUnits) = _nearUnits;
if (_laserID isEqualTo 2) exitWith {
GVAR(greenLaserUnits) pushBackUnique _unit;
GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit);
};
} else {
GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit);
GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit);
};
};
} , 5, []] call CBA_fnc_addPerFrameHandler;
// custom scheduler
[{
params ["_fnc_processUnit"];
addMissionEventHandler ["Draw3D", {
call FUNC(onDraw);
}];
ACE_player call _fnc_processUnit;
GVAR(index) = GVAR(index) + 1;
private _unit = GVAR(nearUnits) param [GVAR(index), objNull];
if (isNull _unit) exitWith {
GVAR(index) = -1;
};
_unit call _fnc_processUnit;
}, 0.1, _fnc_processUnit] call CBA_fnc_addPerFrameHandler;
addMissionEventHandler ["Draw3D", {call FUNC(onDraw)}];
}] call CBA_fnc_addEventHandler;

View File

@ -6,4 +6,11 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
["visionMode", {
params ["", "_visionMode"];
GVAR(isIR) = _visionMode isEqualTo 1;
GVAR(isTI) = _visionMode isEqualTo 2;
}] call CBA_fnc_addPlayerEventHandler;
ADDON = true;

View File

@ -0,0 +1,26 @@
/*
* Author: commy2
* Reports near units.
*
* Arguments:
* None
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
private _camPosAGL = positionCameraToWorld [0, 0, 0];
// handle RHS / bugged vehicle slots
if !((_camPosAGL select 0) isEqualType 0) exitWith {};
private _nearUnits = [];
{
_nearUnits append crew _x;
} forEach nearestObjects [_camPosAGL, ["AllVehicles"], MAX_LASER_RANGE];
_nearUnits

View File

@ -12,30 +12,17 @@
*/
#include "script_component.hpp"
private _isIR = currentVisionMode ACE_player;
// no lasers in thermal mode
if !(GVAR(isTI)) then {
private _brightness = 2 - call EFUNC(common,ambientBrightness);
if (_isIR == 2) exitWith {};
{
// red laser. draw green dot anyway in IR mode
[_x, 100, GVAR(isIR), _brightness] call FUNC(drawLaserpoint);
} count GVAR(redLaserUnits);
_isIR = _isIR == 1;
private _brightness = 2 - call EFUNC(common,ambientBrightness);
{
private _weapon = currentWeapon _x;
private _laser = (_x weaponAccessories _weapon) select 1;
if (_laser != "") then {
private _cacheName = format [QGVAR(laser_%1), _laser];
private _laserID = missionNamespace getVariable [_cacheName, -1];
if (missionNamespace getVariable [_cacheName, -1] == -1) then {
_laserID = getNumber (configFile >> "CfgWeapons" >> _laser >> "ACE_laserpointer");
missionNamespace setVariable [_cacheName, _laserID];
};
if (_laserID > 0 && {_x isFlashlightOn _weapon}) then {
[_x, 100, (_laserID == 2 || _isIR), _brightness] call FUNC(drawLaserpoint);
};
};
false
} count GVAR(nearUnits);
{
// green laser
[_x, 100, true, _brightness] call FUNC(drawLaserpoint);
} count GVAR(greenLaserUnits);
};

View File

@ -15,3 +15,5 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#define MAX_LASER_RANGE 50

View File

@ -10,7 +10,7 @@
// MINIMAL required version for the Mod. Components can specify others..
#define REQUIRED_VERSION 1.64
#define REQUIRED_CBA_VERSION {3,1,1}
#define REQUIRED_CBA_VERSION {3,1,2}
#ifdef COMPONENT_BEAUTIFIED
#define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED)

View File

@ -1,4 +1,4 @@
#define MAJOR 3
#define MINOR 8
#define PATCHLVL 3
#define BUILD 14
#define MINOR 9
#define PATCHLVL 0
#define BUILD 16

View File

@ -4,7 +4,7 @@
<Key ID="STR_ACE_Markers_MarkerDirection">
<English>Direction: %1°</English>
<German>Drehung: %1°</German>
<French>Direction: %1°</French>
<French>Direction : %1°</French>
<Czech>Směr: %1°</Czech>
<Polish>Kierunek: %1°</Polish>
<Spanish>Dirección: %1°</Spanish>
@ -16,4 +16,4 @@
<Korean>방위: %1°</Korean>
</Key>
</Package>
</Project>
</Project>

View File

@ -9,8 +9,8 @@ class Cfg3DEN {
};
};
class GVAR(isMedicControl): Title {
attributeLoad = "(_this controlsGroupCtrl 100) lbsetcursel (((_value + 1) min 3) max 0);";
attributeSave = "(missionnamespace getvariable ['ace_isMedic_temp',0]) - 1;";
attributeLoad = "(_this controlsGroupCtrl 100) lbSetCurSel (((_value + 1) min 3) max 0);";
attributeSave = "(lbCurSel (_this controlsGroupCtrl 100)) - 1";
class Controls: Controls {
class Title: Title{};
class Value: ctrlToolbox {
@ -22,7 +22,6 @@ class Cfg3DEN {
rows = 1;
columns = 4;
strings[] = {"$STR_3DEN_Attributes_Lock_Default_text", CSTRING(AssignMedicRoles_role_none), CSTRING(AssignMedicRoles_role_medic), CSTRING(AssignMedicRoles_role_doctorShort)};
onToolboxSelChanged = "missionnamespace setvariable ['ace_isMedic_temp',_this select 1];";
};
};
};
@ -36,7 +35,7 @@ class Cfg3DEN {
control = QGVAR(isMedicControl);
displayName = CSTRING(AssignMedicRoles_role_DisplayName);
tooltip = CSTRING(Attributes_isMedic_Description);
expression = QUOTE(if (_value != -1) then {_this setVariable [ARR_3(QUOTE(QGVAR(medicClass)),_value, true)];};);
expression = QUOTE(if (_value > -1) then {_this setVariable [ARR_3(QUOTE(QGVAR(medicClass)),_value, true)];};);
typeName = "NUMBER";
condition = "objectBrain";
defaultValue = "-1";

View File

@ -2772,6 +2772,7 @@
<Czech>Kruhový</Czech>
<Italian>Radiale</Italian>
<Japanese>円状</Japanese>
<Korean>다이얼형</Korean>
</Key>
<Key ID="STR_ACE_Medical_TreatmentAction">
<English>Treating...</English>
@ -3445,7 +3446,7 @@
<German>Wo kann das Erste-Hilfe-Set verwendet werden?</German>
<Czech>Kde může být použita osobní lékárnička (PAK)?</Czech>
<Portuguese>Onde o kit de primeiros socorros pode ser utilizado?</Portuguese>
<French>Où le Kit de Premier Secour peut être utilisé</French>
<French>Où le Kit de Premier Secour peut être utilisé ?</French>
<Hungarian>Hol lehet az elsősegélycsomagot használni?</Hungarian>
<Italian>Dove può essere usato il Kit Pronto Soccorso?</Italian>
<Japanese>どこでも応急処置キットをつかえるようにしますか?</Japanese>
@ -3470,7 +3471,7 @@
<German>Wann kann das Erste-Hilfe-Set verwendet werden?</German>
<Czech>Kdy může být použita osobní lékárnička?</Czech>
<Spanish>¿Cuando se puede utilizar el Equipo de primeros auxilios?</Spanish>
<French>Quand peut être utilisé le Kit de Premier Secours</French>
<French>Quand peut être utilisé le Kit de Premier Secours ?</French>
<Polish>Po spełnieniu jakich warunków apteczka osobista może zostać zastosowana na pacjencie?</Polish>
<Hungarian>Mikor lehet az elsősegélycsomagot használni?</Hungarian>
<Portuguese>Onde o kit de primeiros socorros pode ser utilizado?</Portuguese>
@ -3712,7 +3713,7 @@
<German>Aufzählung von Einheiten, die als Sanitäter gelten. Werden durch Kommata getrennt.</German>
<Czech>Seznam osob které budou klasifikovány jako zdravotník, oddělené čárkami.</Czech>
<Portuguese>Lista dos nomes das unidades que se classificam como médicos, separados por vírgulas.</Portuguese>
<French>Liste d'unité qui seront listées comme infirmier, séparation par virgule</French>
<French>Liste d'unité qui seront listées comme infirmier, séparation par virgule.</French>
<Hungarian>Azon egységek nevei, melyek orvosként vannak meghatározva, vesszővel elválasztva.</Hungarian>
<Italian>Lista di nomi unità che verranno classificati come medici, separati da virgole.</Italian>
<Japanese>衛生兵として設定されるユニット名を一覧で指定でき、コンマで区切りを付けられます。</Japanese>
@ -3908,7 +3909,7 @@
<German>Setze medizinische Einrichtung [ACE]</German>
<Czech>Určit zdravotnické zařízení [ACE]</Czech>
<Portuguese>Definir instalação médica [ACE]</Portuguese>
<French>Définir comme équipement médical [ACE]</French>
<French>Définir comme installation médical [ACE]</French>
<Hungarian>Orvosi létesítmény beállítása [ACE]</Hungarian>
<Italian>Imposta Struttura Medica [ACE]</Italian>
<Japanese>医療施設として設定 [ACE]</Japanese>
@ -3922,7 +3923,7 @@
<German>Ist eine medizinische Einrichtung</German>
<Czech>Zdravotnické zařízení</Czech>
<Portuguese>É uma instalação médica</Portuguese>
<French>Est un équipement médical</French>
<French>Est une installation médical</French>
<Hungarian>Orvosi létesítmény-e</Hungarian>
<Italian>E' Struttura Medica</Italian>
<Japanese>医療施設として</Japanese>
@ -3936,7 +3937,7 @@
<German>Definiert ein Objekt als medizinische Einrichtung</German>
<Czech>Registruje objekt jako zdravotnické zařízení</Czech>
<Portuguese>Registra um objeto como instalacão médica</Portuguese>
<French>Enregistrer un objet comme un équipement médical</French>
<French>Enregistrer un objet comme une installation médical</French>
<Hungarian>Egy objektum orvosi létesítményként való regisztrálása</Hungarian>
<Italian>Registra un oggetto come struttura medica</Italian>
<Japanese>オブジェクトを医療施設として割り当てる</Japanese>
@ -3950,7 +3951,7 @@
<German>Definiert ein Objekt als medizinische Einrichtung. Hier werden weitere, tiefgreifende Behandlungen ermöglicht. Kann Fahrzeugen oder Gebäuden zugewiesen werden.</German>
<Czech>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.</Czech>
<Portuguese>Define um objeto como instalação médica. Isso permite tratamentos mais avançados. Pode ser utilizado em edifícios e veículos.</Portuguese>
<French>Définir un objet comme équipement médical. Cela permet les traitements avancés. Peut être utilisé sur les batiments et les véhicules</French>
<French>Définir un objet comme installation médical. Cela permet les traitements avancés. Peut être utilisé sur les batiments et les véhicules</French>
<Hungarian>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.</Hungarian>
<Italian>Definisce un oggetto come struttura medica. Questo permette cure più avanzate. Può essere usato su edifici e veicoli.</Italian>
<Japanese>オブジェクトを医療施設として割り当てます。割り当てられた場合、より高度な治療が可能になり、建物と車両へつかえます。</Japanese>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="medical_ai">
<Key ID="STR_ACE_medical_ai_enabledFor_OnlyServerAndHC">
@ -8,6 +8,7 @@
<Russian>Нур сервера унд HC</Russian>
<Japanese>サーバーと HC のみ</Japanese>
<Polish>Tylko serwer i HC</Polish>
<French>Seulement sur le server ou le HC</French>
</Key>
</Package>
</Project>

View File

@ -318,7 +318,7 @@
<German>Wähle Kopf</German>
<Russian>Выбрать голову</Russian>
<Spanish>Seleccionar Cabeza</Spanish>
<French>Selectioner Tête</French>
<French>Selectioner la tête</French>
<Polish>Wybierz głowę</Polish>
<Portuguese>Selecionar Cabeça</Portuguese>
<Czech>Vybrat Hlavu</Czech>
@ -331,7 +331,7 @@
<German>Wähle Torso</German>
<Russian>Выбрать торс</Russian>
<Spanish>Seleccionar Torso</Spanish>
<French>Selectioner Torse</French>
<French>Selectioner le torse</French>
<Polish>Wybierz tors</Polish>
<Portuguese>Selecionar Torso</Portuguese>
<Czech>Vybrat Trup</Czech>
@ -344,7 +344,7 @@
<German>Wähle linken Arm</German>
<Russian>Выбрать левую руку</Russian>
<Spanish>Seleccionar Brazo Izquierdo</Spanish>
<French>Selectioner Bras Gauche</French>
<French>Selectioner le bras gauche</French>
<Polish>Wybierz lewą rękę</Polish>
<Portuguese>Selecionar Braço Esquerdo</Portuguese>
<Czech>Vybrat Levou ruku</Czech>
@ -357,7 +357,7 @@
<German>Wähle rechten Arm</German>
<Russian>Выбрать правую руку</Russian>
<Spanish>Seleccionar Brazo Derecho</Spanish>
<French>Selectioner Bras Droit</French>
<French>Selectioner le bras droit</French>
<Polish>Wybierz prawą rękę</Polish>
<Portuguese>Selecionar Braço Direito</Portuguese>
<Czech>Vybrat Pravou ruku</Czech>
@ -370,7 +370,7 @@
<German>Wähle linkes Bein</German>
<Russian>Выбрать левую ногу</Russian>
<Spanish>Seleccionar Pierna Izquierda</Spanish>
<French>Selectioner Jambe Gauche</French>
<French>Selectioner la jambe gauche</French>
<Polish>Wybierz lewą nogę</Polish>
<Portuguese>Selecionar Perna Esquerda</Portuguese>
<Czech>Vybrat Levou nohu</Czech>
@ -383,7 +383,7 @@
<German>Wähle rechtes Bein</German>
<Russian>Выбрать правую ногу</Russian>
<Spanish>Seleccionar Pierna Derecha</Spanish>
<French>Selectioner Jambe Droite</French>
<French>Selectioner la jambe droite</French>
<Polish>Wybierz prawą nogę</Polish>
<Portuguese>Selecionar Perna Direita</Portuguese>
<Czech>Vybrat Pravou nohu</Czech>
@ -422,7 +422,7 @@
<German>Linker Arm</German>
<Russian>Левая рука</Russian>
<Spanish>Brazo Izquierdo</Spanish>
<French>Bras Gauche</French>
<French>Bras gauche</French>
<Polish>Lewa ręka</Polish>
<Portuguese>Braço Esquerdo</Portuguese>
<Czech>Levá Ruka</Czech>
@ -435,7 +435,7 @@
<German>Rechter Arm</German>
<Russian>Правая рука</Russian>
<Spanish>Brazo Derecho</Spanish>
<French>Bras Droit</French>
<French>Bras droit</French>
<Polish>Prawa ręka</Polish>
<Portuguese>Braço Direito</Portuguese>
<Czech>Pravá Ruka</Czech>
@ -448,7 +448,7 @@
<German>Linkes Bein</German>
<Russian>Левая нога</Russian>
<Spanish>Pierna Izquierda</Spanish>
<French>Jambe Gauche</French>
<French>Jambe gauche</French>
<Polish>Lewa noga</Polish>
<Portuguese>Perna Esquerda</Portuguese>
<Czech>Levá Noha</Czech>
@ -461,7 +461,7 @@
<German>Rechtes Bein</German>
<Russian>Правая нога</Russian>
<Spanish>Pierna Derecha</Spanish>
<French>Jambe Droite</French>
<French>Jambe droite</French>
<Polish>Prawa noga</Polish>
<Portuguese>Perna Direita</Portuguese>
<Czech>Pravá Noha</Czech>
@ -474,7 +474,7 @@
<German>Körperteil: %1</German>
<Russian>Часть тела: %1</Russian>
<Spanish>Parte del cuerpo: %1</Spanish>
<French>Partie du corps: %1</French>
<French>Partie du corps : %1</French>
<Polish>Część ciała: %1</Polish>
<Portuguese>Parte do corpo: %1</Portuguese>
<Czech>Část těla: %1</Czech>
@ -526,7 +526,7 @@
<German>Er hat %2 offene Wunden (%1)</German>
<Russian>%2 открытые раны %1</Russian>
<Spanish>Hay %2 Heridas Abiertas %1</Spanish>
<French>Il y a %2 %1 Blessure(s) Ouverte(s)</French>
<French>Il y a %2 %1 blessure(s) ouverte(s)</French>
<Polish>Widzisz otwarte rany w ilości %2 o %1 rozmiarze</Polish>
<Portuguese>Existem %2 ferimentos abertos %1</Portuguese>
<Czech>Jsou zde %2 %1 otevřené rány</Czech>
@ -552,7 +552,7 @@
<German>Er hat eine zum Teil offene Wunde (%1)</German>
<Russian>Частично открытая рана %1</Russian>
<Spanish>Hay una herida parcial abierta %1</Spanish>
<French>Il y a une Blessure Patiellement Ouverte %1</French>
<French>Il y a une blessure partiellement ouverte %1</French>
<Polish>Widzisz częściowo otwartą ranę o %1 rozmiarze</Polish>
<Portuguese>Existe um ferimento parcial aberto %1</Portuguese>
<Czech>Je zde částečně %1 otevřená rána</Czech>
@ -565,7 +565,7 @@
<German>Er hat %2 verbundene Wunden (%1)</German>
<Russian>%2 перевязанные раны %1</Russian>
<Spanish>Hay %2 Heridas %1 Vendadas</Spanish>
<French>Il y a %2 %1 Blessure(s) Bandée(s)</French>
<French>Il y a %2 %1 blessure(s) bandée(s)</French>
<Polish>Widzisz %2 zabandażowanych ran o %1 rozmiarze</Polish>
<Portuguese>Existem %2 ferimentos %1 tratados</Portuguese>
<Czech>Jsou zde %2 %1 ovázané rány</Czech>
@ -578,7 +578,7 @@
<German>Er hat 1 verbundene Wunde (%1)</German>
<Russian>1 перевязанная рана %1</Russian>
<Spanish>Hay 1 Herida Vendada %1</Spanish>
<French>Il y a 1 %1 Blessure Bandée</French>
<French>Il y a 1 %1 blessure bandée</French>
<Polish>Widzisz 1 zabandażowaną ranę o %1 rozmiarze</Polish>
<Portuguese>Existe 1 ferimento %1 tratado</Portuguese>
<Czech>Je zde 1 %1 ovázaná rána</Czech>
@ -591,7 +591,7 @@
<German>Er hat eine zum Teil verbundene Wunde (%1)</German>
<Russian>Частично перевязанная рана %1</Russian>
<Spanish>Hay una Herida parcial %1 Vendada</Spanish>
<French>Il y a %1 Blessure Partielment Bandée</French>
<French>Il y a %1 blessure partiellement bandée</French>
<Polish>Widzisz 1 częściowo zabandażowaną ranę o %1 rozmiarze</Polish>
<Portuguese>Existe um ferimento parcial tratado %1</Portuguese>
<Czech>Je zde částěčně %1 ovázaná rána</Czech>
@ -682,7 +682,7 @@
<German>hat sehr viel Blut verloren</German>
<Russian>Большая кровопотеря</Russian>
<Spanish>Mucha Sangre perdida</Spanish>
<French>A Perdu Bcp de Sang</French>
<French>A perdu beaucoup de sang</French>
<Polish>Stracił dużo krwi</Polish>
<Portuguese>Perdeu muito sangue</Portuguese>
<Czech>Ztratil hodně krve</Czech>

View File

@ -49,6 +49,7 @@
<Polish>Podłącz słuchawki</Polish>
<German>Kopfhörer verbinden</German>
<Korean>헤드폰에 연결</Korean>
<French>Connecter les écouteurs</French>
</Key>
<Key ID="STR_ACE_MineDetector_DisconnectHeadphones">
<English>Disconnect Headphones</English>
@ -58,6 +59,7 @@
<Polish>Odłącz słuchawki</Polish>
<German>Kopfhörer trennen</German>
<Korean>헤드폰 연결끊기</Korean>
<French>Déconnecter les écouteurs</French>
</Key>
<Key ID="STR_ACE_MineDetector_HeadphonesConnected">
<English>Headphones Connected</English>
@ -67,6 +69,7 @@
<Polish>Słuchawki podpięte</Polish>
<German>Kopfhörer verbunden</German>
<Korean>헤드폰 연결됨</Korean>
<French>Écouteurs connectés</French>
</Key>
<Key ID="STR_ACE_MineDetector_HeadphonesDisconnected">
<English>Headphones Disconnected</English>
@ -76,6 +79,8 @@
<Polish>Słuchawki odpięte</Polish>
<German>Kopfhörer getrennt</German>
<Korean>헤드폰 연결끊김</Korean>
<French>Écouteurs déconnectés</French>
</Key>
</Package>
</Project>

View File

@ -1,3 +1,5 @@
LOG("prep");
PREP(cycleAttackProfileKeyDown);
PREP(changeMissileDirection);

View File

@ -1,3 +1,13 @@
#include "script_component.hpp"
[QGVAR(handoff), {_this call FUNC(handleHandoff)}] call CBA_fnc_addEventHandler;
["ACE3 Weapons", QGVAR(cycleFireMode), localize LSTRING(CycleFireMode),
{
[] call FUNC(cycleAttackProfileKeyDown);
false
},
{
false
},
[15, [false, true, false]], false] call CBA_fnc_addKeybind; //Ctrl+Tab Key

View File

@ -0,0 +1,67 @@
/*
* Author: PabstMirror
* Cycles fire mode for any missileGuidance enabled ammo that has multiple attack profiles
*
* Arguments:
* None
*
* Return Value:
* None
*
* Example:
* [] call ace_missileguidance_fnc_cycleAttackProfileKeyDown
*
* Public: No
*/
// #define DEBUG_MODE_FULL
#include "script_component.hpp"
TRACE_1("cycle fire mode",_this);
if (!alive ACE_player) exitWith {};
if (!([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith))) exitWith {};
private ["_currentShooter", "_currentMagazine"];
if (((vehicle ACE_player) == ACE_player) || {ACE_player call CBA_fnc_canUseWeapon}) then {
_currentShooter = ACE_player;
_currentMagazine = currentMagazine ACE_player;
} else {
_currentShooter = vehicle ACE_player;
_currentMagazine = _currentShooter currentMagazineTurret (ACE_player call CBA_fnc_turretPath);
};
if (_currentMagazine == "") exitWith {TRACE_1("no magazine",_currentMagazine)};
private _ammo = getText (configFile >> "CfgMagazines" >> _currentMagazine >> "ammo");
TRACE_3("",_currentShooter,_currentMagazine,_ammo);
// Bail if guidance is disabled for this ammo
if ((getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "enabled")) != 1) exitWith {TRACE_1("not enabled",_ammo)};
// Verify ammo has explicity added guidance config (ignore inheritances)
private _configs = configProperties [(configFile >> "CfgAmmo" >> _ammo), QUOTE(configName _x == QUOTE(QUOTE(ADDON))), false];
if ((count _configs) < 1) exitWith {TRACE_2("not explicity enabled",_ammo,_configs)};
private _attackProfiles = getArray (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "attackProfiles");
if ((count _attackProfiles) <= 1) exitWith {TRACE_1("no choices for attack profile",_attackProfiles)};
private _currentFireMode = _currentShooter getVariable [QGVAR(attackProfile), "#undefined"];
// Just like onFired, this is case sensitive!
private _index = _attackProfiles find _currentFireMode;
if (_index == -1) then {
_index = _attackProfiles find (getText (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "defaultAttackProfile"));
};
_index = (_index + 1) % (count _attackProfiles);
private _nextFireMode = _attackProfiles select _index;
TRACE_4("",_currentFireMode,_nextFireMode,_index,_attackProfiles);
_currentShooter setVariable [QGVAR(attackProfile), _nextFireMode, false];
playSound "ACE_Sound_Click";
if ((getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "showHintOnCycle")) == 1) then {
private _localizedName = getText (configFile >> QGVAR(AttackProfiles) >> _nextFireMode >> "name");
[_localizedName] call EFUNC(common,displayTextStructured);
};

View File

@ -154,5 +154,19 @@
<Italian>Giocatore ed IA</Italian>
<Japanese>プレイヤーと AI</Japanese>
</Key>
<Key ID="STR_ACE_MissileGuidance_CycleFireMode">
<English>Cycle Fire Mode</English>
<German>Wechsle Feuermodus</German>
<Russian>Переключение режимов огня</Russian>
<Czech>Přepínání režimů palby</Czech>
<Polish>Przełącz tryb ognia</Polish>
<French>Cycle mode de tir</French>
<Hungarian>Tüzelési mód váltása</Hungarian>
<Italian>Alterna le modalità di fuoco</Italian>
<Spanish>Cambiar modo de disparo</Spanish>
<Portuguese>Alterar Modo de Disparo</Portuguese>
<Japanese>発射モード切り替え</Japanese>
<Korean>발사 방식 순환</Korean>
</Key>
</Package>
</Project>

View File

@ -88,9 +88,9 @@ if (_activated && local _logic) then {
private _newPosASL = if (_followPlayers) then {
// Select a target unit at random.
private _targetUnit = selectRandom _allUnits;
AGLtoASL (_targetUnit getPos [random 360, _minimalDistance + random (_maximalDistance - _minimalDistance)]);
AGLtoASL (_targetUnit getPos [_minimalDistance + random (_maximalDistance - _minimalDistance), random 360]);
} else {
AGLtoASL (_logic getPos [random 360, _minimalDistance + random (_maximalDistance - _minimalDistance)]);
AGLtoASL (_logic getPos [_minimalDistance + random (_maximalDistance - _minimalDistance), random 360]);
};
TRACE_1("",_newPosASL);

View File

@ -19,7 +19,7 @@
<English>Weight:</English>
<German>Gewicht:</German>
<Spanish>Peso:</Spanish>
<French>Poids:</French>
<French>Poids :</French>
<Polish>Waga:</Polish>
<Czech>Váha:</Czech>
<Italian>Peso:</Italian>
@ -57,4 +57,4 @@
<Japanese>ここは登れない</Japanese>
</Key>
</Package>
</Project>
</Project>

View File

@ -2,6 +2,7 @@
PREP(canShow);
PREP(doShow);
PREP(drawNameTagIcon);
PREP(getCachedFlags);
PREP(getVehicleData);
PREP(initIsSpeaking);
PREP(moduleNameTags);

View File

@ -15,7 +15,7 @@ GVAR(showNamesTime) = -10;
// Statement
GVAR(showNamesTime) = CBA_missionTime;
if (call FUNC(canShow)) then{ call FUNC(doShow); };
// if (call FUNC(canShow)) then{ call FUNC(doShow); }; // This code doesn't work (canShow has a nil / has never worked??)
// Return false so it doesn't block other actions
false
},
@ -34,6 +34,13 @@ GVAR(showNamesTime) = -10;
if (_name == QGVAR(showPlayerNames)) then {
call FUNC(updateSettings);
};
// Reset nametag flag cache on setting change:
ACE_player setVariable [QGVAR(flagsCache), nil];
}] call CBA_fnc_addEventHandler;
["cba_events_visionModeEvent", {
// Reset nametag flag cache on vision mode change:
ACE_player setVariable [QGVAR(flagsCache), nil];
}] call CBA_fnc_addEventHandler;
// civilians don't use military ranks

View File

@ -0,0 +1,56 @@
/*
* Author: <N/A>
* Get's flags used for onDraw3D that can be cached
*
* Arguments:
* None
*
* Return Value:
* [_drawName,_drawRank,_enabledTagsNearby,_enabledTagsCursor,_maxDistance]
*
* Example:
* call ace_nametags_fnc_getCachedFlags
*
* Public: No
*/
#include "script_component.hpp"
// Determine flags from current settings
private _drawName = true;
private _enabledTagsNearby = false;
private _enabledTagsCursor = false;
switch (GVAR(showPlayerNames)) do {
case 0: {
// Player names Disabled [Note: this should be unreachable as the drawEH will be removed]
_drawName = false;
_enabledTagsNearby = (GVAR(showSoundWaves) == 2);
};
case 1: {
// Player names Enabled
_enabledTagsNearby = true;
};
case 2: {
// Player names Only cursor
_enabledTagsNearby = (GVAR(showSoundWaves) == 2);
_enabledTagsCursor = true;
};
case 3: {
// Player names Only Keypress
_enabledTagsNearby = GVAR(showSoundWaves) == 2; // non-cached: || _onKeyPressAlphaMax) > 0
};
case 4: {
// Player names Only Cursor and Keypress
_enabledTagsNearby = (GVAR(showSoundWaves) == 2);
// non-cached: _enabledTagsCursor = _onKeyPressAlphaMax > 0;
};
case 5: {
// Fade on border
_enabledTagsNearby = true;
};
};
private _ambientBrightness = ((([] call EFUNC(common,ambientBrightness)) + ([0, 0.4] select ((currentVisionMode ace_player) != 0))) min 1) max 0;
private _maxDistance = _ambientBrightness * GVAR(PlayerNamesViewDistance);
[_drawName, GVAR(showPlayerRanks),_enabledTagsNearby,_enabledTagsCursor,_maxDistance]

View File

@ -15,67 +15,33 @@
*/
#include "script_component.hpp"
private ["_defaultIcon", "_distance", "_alpha", "_icon", "_targets", "_relPos", "_projDist", "_target"];
BEGIN_COUNTER(GVAR(onDraw3d));
// Don't show nametags in spectator or if RscDisplayMPInterrupt is open
if ((isNull ACE_player) || {!alive ACE_player} || {!isNull (findDisplay 49)}) exitWith {};
// Determine flags from current settings
private _drawName = true;
private _drawRank = GVAR(showPlayerRanks);
private _enabledTagsNearby = false;
private _enabledTagsCursor = false;
private _onKeyPressAlphaMax = 1;
switch (GVAR(showPlayerNames)) do {
case 0: {
// Player names Disabled
_drawName = false;
_enabledTagsNearby = (GVAR(showSoundWaves) == 2);
_enabledTagsCursor = false;
};
case 1: {
// Player names Enabled
_enabledTagsNearby = true;
_enabledTagsCursor = false;
};
case 2: {
// Player names Only cursor
_enabledTagsNearby = (GVAR(showSoundWaves) == 2);
_enabledTagsCursor = true;
};
case 3: {
// Player names Only Keypress
_onKeyPressAlphaMax = 2 + (GVAR(showNamesTime) - CBA_missionTime);
_enabledTagsNearby = (_onKeyPressAlphaMax) > 0 || (GVAR(showSoundWaves) == 2);
_enabledTagsCursor = false;
};
case 4: {
// Player names Only Cursor and Keypress
_onKeyPressAlphaMax = 2 + (GVAR(showNamesTime) - CBA_missionTime);
_enabledTagsNearby = (GVAR(showSoundWaves) == 2);
_enabledTagsCursor = _onKeyPressAlphaMax > 0;
};
case 5: {
// Fade on border
_enabledTagsNearby = true;
_enabledTagsCursor = false;
};
};
private _flags = [[], DFUNC(getCachedFlags), ACE_player, QGVAR(flagsCache), 2] call EFUNC(common,cachedCall);
private _ambientBrightness = ((([] call EFUNC(common,ambientBrightness)) + ([0, 0.4] select ((currentVisionMode ace_player) != 0))) min 1) max 0;
private _maxDistance = _ambientBrightness * GVAR(PlayerNamesViewDistance);
_flags params ["_drawName", "_drawRank", "_enabledTagsNearby", "_enabledTagsCursor", "_maxDistance"];
private _onKeyPressAlphaMax = 1;
if (GVAR(showPlayerNames) == 3) then {
_onKeyPressAlphaMax = 2 + (GVAR(showNamesTime) - CBA_missionTime);
_enabledTagsNearby = _enabledTagsNearby || {_onKeyPressAlphaMax > 0}
};
if (GVAR(showPlayerNames) == 4) then {
_onKeyPressAlphaMax = 2 + (GVAR(showNamesTime) - CBA_missionTime);
_enabledTagsCursor = _onKeyPressAlphaMax > 0;
};
private _camPosAGL = positionCameraToWorld [0, 0, 0];
if !((_camPosAGL select 0) isEqualType 0) exitWith {}; // handle RHS / bugged vehicle slots
private _camPosASL = AGLtoASL _camPosAGL;
private _vecy = (AGLtoASL positionCameraToWorld [0, 0, 1]) vectorDiff _camPosASL;
// Show nametag for the unit behind the cursor or its commander
if (_enabledTagsCursor) then {
_target = cursorTarget;
private _target = cursorTarget;
if !(_target isKindOf "CAManBase") then {
// When cursorTarget is on a vehicle show the nametag for the commander.
if !(_target in allUnitsUAV) then {
@ -92,7 +58,7 @@ if (_enabledTagsCursor) then {
{lineIntersectsSurfaces [_camPosASL, eyePos _target, ACE_player, _target] isEqualTo []} &&
{!isObjectHidden _target}) then {
_distance = ACE_player distance _target;
private _distance = ACE_player distance _target;
private _drawSoundwave = (GVAR(showSoundWaves) > 0) && {[_target] call FUNC(isSpeaking)};
// Alpha:
@ -137,6 +103,9 @@ if (_enabledTagsNearby) then {
private _target = _x;
if !(isNull _target) then {
private _drawSoundwave = (GVAR(showSoundWaves) > 0) && {[_target] call FUNC(isSpeaking)};
if (_enabledTagsCursor && {!_drawSoundwave}) exitWith {}; // (Cursor Only && showSoundWaves==2) - quick exit
private _relPos = (visiblePositionASL _target) vectorDiff _camPosASL;
private _distance = vectorMagnitude _relPos;
@ -152,7 +121,6 @@ if (_enabledTagsNearby) then {
};
};
private _drawSoundwave = (GVAR(showSoundWaves) > 0) && {[_target] call FUNC(isSpeaking)};
private _alphaMax = _onKeyPressAlphaMax;
if ((GVAR(showSoundWaves) == 2) && _drawSoundwave) then {
_drawName = _drawSoundwave;

View File

@ -468,6 +468,7 @@
<Japanese>画面端では非表示</Japanese>
<Polish>Ukryj na brzegach ekranu</Polish>
<Korean>화면 가장자리에서 사라짐</Korean>
<French>Estomper sur les bords de l'écran</French>
</Key>
</Package>
</Project>

View File

@ -19,7 +19,7 @@
private ["_dummy","_magazineClass"];
params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]];
if (GVAR(level) == 0 || {isNull _unit} || {!(_unit isKindOf "CAManBase")} || {!local _unit} || {_target distance _unit > REARM_ACTION_DISTANCE} || {_target getVariable [QGVAR(disabled), false]}) exitWith {false};
if (GVAR(level) == 0 || {isNull _unit} || {!(_unit isKindOf "CAManBase")} || {!local _unit} || {([_unit, _target] call EFUNC(interaction,getInteractionDistance)) > REARM_ACTION_DISTANCE} || {_target getVariable [QGVAR(disabled), false]}) exitWith {false};
_dummy = _unit getVariable [QGVAR(dummy), objNull];
if (isNull _dummy) exitwith {false};

View File

@ -22,5 +22,5 @@ params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]]];
{!(_unit isKindOf "CAManBase")} ||
{!local _unit} ||
{!alive _target} ||
{(_target distance _unit) > REFUEL_ACTION_DISTANCE} ||
{([_unit, _target] call EFUNC(interaction,getInteractionDistance)) > REFUEL_ACTION_DISTANCE} ||
{(_target call FUNC(getFuel) == REFUEL_INFINITE_FUEL)})

View File

@ -27,5 +27,5 @@ if (_target isKindOf "AllVehicles") then {
!(isNull _nozzle ||
{_engine} ||
{(_target distance _unit) > REFUEL_ACTION_DISTANCE} ||
{([_unit, _target] call EFUNC(interaction,getInteractionDistance)) > REFUEL_ACTION_DISTANCE} ||
{!isNull (_target getVariable [QGVAR(nozzle), objNull])})

View File

@ -21,5 +21,5 @@ params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]]];
private _nozzle = _unit getVariable [QGVAR(nozzle), objNull];
(!isNull _nozzle) &&
{_target distance _unit < REFUEL_ACTION_DISTANCE} &&
{([_unit, _target] call EFUNC(interaction,getInteractionDistance)) < REFUEL_ACTION_DISTANCE} &&
{_target == (_nozzle getVariable [QGVAR(source), objNull])}

View File

@ -23,6 +23,6 @@ if (isNull _unit ||
{!local _unit} ||
{!alive _target} ||
{!isNull (_unit getVariable [QGVAR(nozzle), objNull])} ||
{(_target distance _unit) > REFUEL_ACTION_DISTANCE}) exitWith {false};
{([_unit, _target] call EFUNC(interaction,getInteractionDistance)) > REFUEL_ACTION_DISTANCE}) exitWith {false};
!(_target getVariable [QGVAR(isConnected), false]) && {!(_unit getVariable [QGVAR(isRefueling), false])}

View File

@ -9,8 +9,8 @@ class Cfg3DEN {
};
};
class GVAR(isEngineerControl): Title {
attributeLoad = "(_this controlsGroupCtrl 100) lbsetcursel (((_value + 1) min 3) max 0);";
attributeSave = "(missionnamespace getvariable ['ace_isEng_temp',0]) - 1;";
attributeLoad = "(_this controlsGroupCtrl 100) lbSetCurSel (((_value + 1) min 3) max 0);";
attributeSave = "(lbCurSel (_this controlsGroupCtrl 100)) - 1";
class Controls: Controls {
class Title: Title{};
class Value: ctrlToolbox {
@ -22,7 +22,6 @@ class Cfg3DEN {
rows = 1;
columns = 4;
strings[] = {"$STR_3DEN_Attributes_Lock_Default_text", CSTRING(AssignEngineerRole_role_none), CSTRING(AssignEngineerRole_role_engineer), CSTRING(AssignEngineerRole_role_specialist)};
onToolboxSelChanged = "missionnamespace setvariable ['ace_isEng_temp',_this select 1];";
};
};
};

View File

@ -34,7 +34,7 @@ switch (toLower _mode) do {
[FUNC(handleUnits), 9, _display] call CBA_fnc_addPerFrameHandler;
// Handle 3D unit icons
GVAR(iconHandler) = addMissionEventHandler ["Draw3D",FUNC(handleIcons)];
GVAR(iconHandler) = addMissionEventHandler ["Draw3D", {call FUNC(handleIcons)}];
// Populate the help window
private _help = (_display displayCtrl IDC_HELP) controlsGroupCtrl IDC_HELP_LIST;

View File

@ -28,9 +28,8 @@ if (_texture == "") exitWith {
false
};
private _tag = "UserTexture1m_F" createVehicle [0,0,0];
private _tag = createSimpleObject ["UserTexture1m_F", _tagPosASL];
_tag setObjectTextureGlobal [0, _texture];
_tag setPosASL _tagPosASL;
_tag setVectorDirAndUp _vectorDirAndUp;
// Throw a global event for mision makers

View File

@ -8,6 +8,7 @@
<Polish>Tagowanie</Polish>
<German>Markierungssystem</German>
<Korean>뿌리기</Korean>
<French>Marquage</French>
</Key>
<Key ID="STR_ACE_Tagging_ModuleDesc">
<English>Configure how the tagging system will operate by default.</English>
@ -16,6 +17,7 @@
<Polish>Skonfiguruj zachowanie systemu tagowania.</Polish>
<German>Konfiguriert, wie das Markierungssystem standardmäßig funktioniert.</German>
<Korean>뿌리기 시스템의 기본사항을 설정합니다.</Korean>
<French>Configure le fonctionnement par défaut du système de marquage.</French>
</Key>
<Key ID="STR_ACE_Tagging_QuickTag">
<English>Quick Tag</English>
@ -24,6 +26,7 @@
<Polish>Szybkie tagowanie</Polish>
<German>Schnelle Markierung</German>
<Korean>빠른 뿌리기</Korean>
<French>Marquage rapide</French>
</Key>
<Key ID="STR_ACE_Tagging_QuickTagDesc">
<English>Action performed on main tag interaction point.</English>
@ -32,6 +35,7 @@
<Polish>Akcja wykonywana na głównym punkcie interakcji tagu.</Polish>
<German>Aktion, die am Haupt-Interaktionspunkt ausgeführt werden soll.</German>
<Korean>이 동작은 상호작용에서 뿌리기를 할 수 있게 해준다</Korean>
<French>Action réalisé au point de marquage principal.</French>
</Key>
<Key ID="STR_ACE_Tagging_LastUsed">
<English>Last Used</English>
@ -40,6 +44,7 @@
<Polish>Ostatnio użyte</Polish>
<German>Zuletzt benutzt</German>
<Korean>최근 사용</Korean>
<French>Dernier utilisé</French>
</Key>
<Key ID="STR_ACE_Tagging_RandomX">
<English>Random X</English>
@ -48,6 +53,7 @@
<Polish>Losowy X</Polish>
<German>Zufällig X</German>
<Korean>무작위 X</Korean>
<French>Aléatoire X</French>
</Key>
<Key ID="STR_ACE_Tagging_Random">
<English>Random</English>
@ -56,6 +62,7 @@
<Polish>Losowy</Polish>
<German>Zufällig</German>
<Korean>무작위</Korean>
<French>Aléatoire</French>
</Key>
<Key ID="STR_ACE_Tagging_Tag">
<English>Tag</English>
@ -63,6 +70,8 @@
<Spanish>Marcar</Spanish>
<Polish>Taguj</Polish>
<French>Tag</French>
<Polish>Oznakuj</Polish>
<French>Marque</French>
<Italian>Marca</Italian>
<Czech>Označit</Czech>
<Portuguese>Marcar</Portuguese>
@ -179,7 +188,7 @@
<German>Eine Farbsprühdose um Wände zu markieren.</German>
<Spanish>Lata de pintura en aerosol para marcar.</Spanish>
<Polish>Farba w sprayu, służy do oznakowywania terenu.</Polish>
<French>Un spray de peinture pour taguer les murs.</French>
<French>Un spray de peinture pour marquer les murs.</French>
<Italian>Una bomboletta di spay per contrassegnare i muri.</Italian>
<Czech>Plechovka se sprejem k vytváření značek.</Czech>
<Portuguese>Uma lata de tinta spray para marcar paredes.</Portuguese>
@ -189,3 +198,4 @@
</Key>
</Package>
</Project>

View File

@ -443,7 +443,7 @@
<Key ID="STR_ACE_UI_Disabled">
<English>Cannot modify a forced User Interface element.</English>
<Portuguese>Não é possível modificar um elemento forçado da interface do usuário.</Portuguese>
<French>Impossible de modifier un élément de l'interface utilisateur forcé</French>
<French>Impossible de modifier un élément de l'interface utilisateur forcé.</French>
<Russian>Невозможно изменить зафиксированный элемент пользовательского интерфейса.</Russian>
<Japanese>ユーザー インタフェイス要素は変更できません。</Japanese>
<Polish>Nie można modyfikować wymuszonego elementu interfejsu użytkownika.</Polish>

View File

@ -22,7 +22,7 @@
<Czech>Poskytuje kontrolu na různými aspekty Zeuse.</Czech>
<German>Bietet die Steuerung verschiedener Zeus-Optionen an.</German>
<Portuguese>Proporciona controle sobre diversos aspectos do Zeus.</Portuguese>
<French>Fourni le contrôle des différents aspects de Zeus</French>
<French>Fourni le contrôle des différents aspects de Zeus.</French>
<Hungarian>Különböző beállítási lehetőségeket biztosít a Zeus részeihez.</Hungarian>
<Russian>Позволяет контролировать различные аспекты Зевса.</Russian>
<Italian>Fornisce controllo su vari aspetti di Zeus.</Italian>
@ -50,7 +50,7 @@
<Czech>Zobrazit globální zprávu když je hráč přiřazen jako Zeus.</Czech>
<German>Zeige globale Popup-Nachrichten wenn ein Spieler zu Zeus wird.</German>
<Portuguese>Mostra uma mensagem popup quando um jogador é atribuido ao Zeus.</Portuguese>
<French>Affiche un message global quand un joueur est assigné en tant que Zeus</French>
<French>Affiche un message global quand un joueur est assigné en tant que Zeus.</French>
<Hungarian>Globális üzeneteket jelez ki, ha egy játékos Zeus-nak lesz beosztva.</Hungarian>
<Russian>Отображает глобальное всплывающее сообщение, когда один из игроков становится Зевсом.</Russian>
<Italian>Mostra messaggi popup globali quando un giocatore viene assegnato come Zeus.</Italian>
@ -106,7 +106,7 @@
<Czech>Přehrát varování (vítr) když Zeus převezmě kontrolu nad jednotkou.</Czech>
<German>Spiele Windgeräusche ab, wenn Zeus eine Einheit steuert.</German>
<Portuguese>Reproduz sons de vento quando uma unidade é remotamente controlada pelo Zeus.</Portuguese>
<French>Joue des bruits de vent quand Zeus controle une unité</French>
<French>Joue des bruits de vent quand Zeus controle une unité.</French>
<Hungarian>Szélhangokat játszik le, ha a Zeus távvezérel egy egységet.</Hungarian>
<Russian>Проигрывает звук ветра каждый раз, когда Зевс вселяется в юнита.</Russian>
<Italian>Esegui rumori di vento quando Zeus controlla un'unità in remoto.</Italian>
@ -134,7 +134,7 @@
<Czech>Přehrát varování (rádio) když Zeus použije dělostřelectvo.</Czech>
<German>Spiele eine Radiowarnung ab, wenn Zeus Artillerie verwendet.</German>
<Portuguese>Reproduz uma aviso via rádio quando o Zeus usa um explosivo.</Portuguese>
<French>Joue un son radio quand le Zeus utilise du matériel militaire</French>
<French>Joue un son radio quand le Zeus utilise du matériel militaire.</French>
<Hungarian>Rádiós figyelmeztetés kiadása, ha a Zeus tüzérséget használ.</Hungarian>
<Russian>Проигрывает звук радио каждый раз, когда Зевс использует артиллерию.</Russian>
<Italian>Esegui un messaggio radio quando Zeus usa esplosivi.</Italian>
@ -162,7 +162,7 @@
<Czech>Odhalí miny pro spojence a umístnit jejich značku na mapu.</Czech>
<German>Melde Minen gegenüber Verbündeten und platziere entsprechende Kartenmarkierungen.</German>
<Portuguese>Revelar minas para aliados e colocar marcadores no mapa.</Portuguese>
<French>Révéler les mines et placer un marqueur sur la carte</French>
<French>Révéler les mines et placer un marqueur sur la carte.</French>
<Hungarian>Feltárja az aknákat a szövetségeseknek, és jelölőket helyez el a térképen.</Hungarian>
<Russian>Показывает мины союзникам и отмечает их маркерами на карте.</Russian>
<Italian>Rivela mine ad alleati e piazza marcatori in mappa.</Italian>
@ -293,7 +293,7 @@
</Key>
<Key ID="STR_ACE_Zeus_ModuleGlobalSetSkill_accuracy_desc">
<English>Changes: aimingAccuracy</English>
<French>Change: aimingAccuracy</French>
<French>Change : aimingAccuracy</French>
<Russian>Изменяет: aimingAccuracy</Russian>
<Czech>Upravuje: aimingAccuracy</Czech>
<Japanese>変更aimingAccuracy</Japanese>
@ -313,7 +313,7 @@
</Key>
<Key ID="STR_ACE_Zeus_ModuleGlobalSetSkill_handling_desc">
<English>Changes: aimingShake, aimingSpeed, reloadSpeed</English>
<French>Change: aimingShake, aimingSpeed, reloadSpeed</French>
<French>Change : aimingShake, aimingSpeed, reloadSpeed</French>
<Russian>Изменяет: aimingShake, aimingSpeed, reloadSpeed</Russian>
<Czech>Upravuje: aimingShake, aimingSpeed, reloadSpeed</Czech>
<Japanese>変更aimingShake, aimingSpeed, reloadSpeed</Japanese>
@ -323,7 +323,7 @@
</Key>
<Key ID="STR_ACE_Zeus_ModuleGlobalSetSkill_spotting">
<English>Spotting</English>
<French>repérage</French>
<French>Repérage</French>
<Russian>Обнаружение</Russian>
<Czech>Vnímavost</Czech>
<Japanese>索敵</Japanese>
@ -333,7 +333,7 @@
</Key>
<Key ID="STR_ACE_Zeus_ModuleGlobalSetSkill_spotting_desc">
<English>Changes: spotDistance, spotTime</English>
<French>Change: spotDistance, spotTime</French>
<French>Change : spotDistance, spotTime</French>
<Russian>Изменяет: spotDistance, spotTime</Russian>
<Czech>Upravuje: spotDistance, spotTime</Czech>
<Japanese>変更spotDistance, spotTime</Japanese>
@ -343,7 +343,7 @@
</Key>
<Key ID="STR_ACE_Zeus_ModuleGlobalSetSkill_cover">
<English>Seek Cover</English>
<French>Chercher couverture</French>
<French>Chercher des couvertures</French>
<Russian>Поиск укрытий</Russian>
<Czech>Vyhledávat krytí</Czech>
<Japanese>遮蔽</Japanese>
@ -353,7 +353,7 @@
</Key>
<Key ID="STR_ACE_Zeus_ModuleGlobalSetSkill_cover_desc">
<English>Should AI seek cover</English>
<French>L'IA devrait elle chercher couverture</French>
<French>L'IA devrait elle chercher des couvertures</French>
<Russian>Должны ли боты искать укрытия</Russian>
<Czech>AI se bude snažit vyhledávat krytí</Czech>
<Japanese>AI は遮蔽を取るようになります</Japanese>
@ -758,7 +758,7 @@
</Key>
<Key ID="STR_ACE_Zeus_AttributeCargo">
<English>Cargo:</English>
<French>Cargo:</French>
<French>Cargo :</French>
<Russian>Груз:</Russian>
<Czech>Náklad:</Czech>
<Japanese>カーゴ:</Japanese>
@ -805,7 +805,7 @@
</Key>
<Key ID="STR_ACE_Zeus_AttributeRadiusInvalid">
<English>Invalid radius entered</English>
<French>rayon invalide entré</French>
<French>Rayon invalide entré</French>
<Russian>Введен неправильный радиус</Russian>
<Czech>Vložen neplatný parametr</Czech>
<Japanese>無効な半径が入力されました</Japanese>

View File

@ -4,7 +4,7 @@
<p align="center">
<a href="https://github.com/acemod/ACE3/releases">
<img src="https://img.shields.io/badge/Version-3.8.3-blue.svg?style=flat-square" alt="ACE3 Version">
<img src="https://img.shields.io/badge/Version-3.9.0-blue.svg?style=flat-square" alt="ACE3 Version">
</a>
<a href="https://github.com/acemod/ACE3/issues">
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat-square&label=Issues" alt="ACE3 Fehlermeldungen">

View File

@ -3,7 +3,7 @@
</p>
<p align="center">
<a href="https://github.com/acemod/ACE3/releases">
<img src="https://img.shields.io/badge/Wersja-3.8.3-blue.svg?style=flat-square" alt="ACE3 Wersja">
<img src="https://img.shields.io/badge/Wersja-3.9.0-blue.svg?style=flat-square" alt="ACE3 Wersja">
</a>
<a href="https://github.com/acemod/ACE3/issues">
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Zagadnienia&style=flat-square" alt="ACE3 Zagadnienia">

View File

@ -8,9 +8,9 @@ ace:
githubUrl: https://github.com/acemod/ACE3
version:
major: 3
minor: 8
patch: 3
build: 14
minor: 9
patch: 0
build: 16
acex:
githubUrl: https://github.com/acemod/ACEX

View File

@ -10,9 +10,9 @@ ace:
githubUrl: https://github.com/acemod/ACE3
version:
major: 3
minor: 8
patch: 3
build: 14
minor: 9
patch: 0
build: 16
acex:
githubUrl: https://github.com/acemod/ACEX

View File

@ -590,6 +590,15 @@ Event handlers in ACE3 are implemented through the CBA event system (ACE3's own
More information on the [CBA Events System](https://github.com/CBATeam/CBA_A3/wiki/Custom-Events-System){:target="_blank"} and [CBA Player Events](https://github.com/CBATeam/CBA_A3/wiki/Player-Events){:target="_blank"} pages.
<div class="panel info">
<h5>Warning about BIS event handlers:</h5>
<p>BIS's event handlers (`addEventHandler`, `addMissionEventHandler`) are slow when passing a large code variable. Use a short code block that calls the function you want.</p>
```js
player addEventHandler ["Fired", FUNC(handleFired)]; // bad
player addEventHandler ["Fired", {call FUNC(handleFired)}]; // good
```
</div>
### 7.4 Hashes
When a key value pair is required, make use of the hash implementation from ACE3.

View File

@ -1,8 +1,8 @@
name = "Advanced Combat Environment 3.8.3";
name = "Advanced Combat Environment 3.9.0";
picture = "logo_ace3_ca.paa";
actionName = "GitHub";
action = "https://github.com/acemod/ACE3";
description = "ACE3 - Version 3.8.3";
description = "ACE3 - Version 3.9.0";
logo = "logo_ace3_ca.paa";
logoOver = "logo_ace3_ca.paa";
tooltip = "ACE3";

View File

@ -226,7 +226,7 @@
<English>Caliber: 5.7mm&lt;br /&gt;Rounds: 50&lt;br /&gt;Used in: P90</English>
<German>Kaliber: 5,7mm&lt;br /&gt;Patronen: 50&lt;br /&gt;Eingesetzt von: P90</German>
<Polish>Kaliber: 5,7mm&lt;br /&gt;Pociski: 50&lt;br /&gt;Używany w: P90</Polish>
<French>Calibre: 5.7mm&lt;br /&gt;Cartouches: 50&lt;br /&gt;Utilisé avec: P90</French>
<French>Calibre : 5,7mm&lt;br /&gt;Cartouches : 50&lt;br /&gt;Utilisé avec : P90</French>
<Spanish>Calibre: 5.7mm&lt;br /&gt;Balas: 50&lt;br /&gt;Se usa en: P90</Spanish>
<Russian>Калибр: 5,7 мм&lt;br /&gt;Патронов: 50&lt;br /&gt;Используются с: P90</Russian>
<Italian>Calibro: 5.7mm&lt;br /&gt;Munizioni: 50&lt;br /&gt;In uso su: P90</Italian>

View File

@ -46,21 +46,42 @@ class CfgWeapons {
ACE_barrelTwist = 195.072;
ACE_barrelLength = 589.28;
};
class rhs_weap_orsis_Base_F;
class rhs_weap_t5000: rhs_weap_orsis_Base_F { // http://en.orsis.com/production/catalog/19046/
ACE_barrelTwist = 254.0; // 1:10"
ACE_barrelLength = 698.5; // 27.5"
ACE_RailHeightAboveBore = 2.4;
};
class rhs_acc_sniper_base;
class rhs_acc_pso1m2: rhs_acc_sniper_base {
ACE_ScopeAdjust_Vertical[] = { 0, 0 };
ACE_ScopeAdjust_Horizontal[] = { -10, 10 };
ACE_ScopeAdjust_Vertical[] = {0, 0};
ACE_ScopeAdjust_Horizontal[] = {-10, 10};
ACE_ScopeAdjust_VerticalIncrement = 0.5;
ACE_ScopeAdjust_HorizontalIncrement = 0.5;
};
class rhs_acc_pso1m21: rhs_acc_sniper_base {
ACE_ScopeAdjust_Vertical[] = { 0, 0 };
ACE_ScopeAdjust_Horizontal[] = { -10, 10 };
ACE_ScopeAdjust_Vertical[] = {0, 0};
ACE_ScopeAdjust_Horizontal[] = {-10, 10};
ACE_ScopeAdjust_VerticalIncrement = 0.5;
ACE_ScopeAdjust_HorizontalIncrement = 0.5;
};
class ItemCore;
class InventoryOpticsItem_Base_F;
class rhs_acc_dh520x56: ItemCore { // http://nightvision.ru/catalog/4/item/35
ACE_ScopeHeightAboveRail = 4.6;
ACE_ScopeAdjust_Vertical[] = {0, 33};
ACE_ScopeAdjust_Horizontal[] = {-9, 9};
ACE_ScopeAdjust_VerticalIncrement = 0.1;
ACE_ScopeAdjust_HorizontalIncrement = 0.1;
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
class dedal_520 {
discreteDistance[] = {100};
discreteDistanceInitIndex = 0;
};
};
};
};
class Launcher_Base_F;
class rhs_weap_rpg7: Launcher_Base_F {
ace_reloadlaunchers_enabled = 1;

View File

@ -31,7 +31,7 @@ class CfgAmmo {
ACE_caliber = 7.823;
ACE_bulletLength = 37.821;
ACE_bulletMass = 14.256;
ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ammoTempMuzzleVelocityShifts[] = {-5.3, -5.1, -4.6, -4.2, -3.4, -2.6, -1.4, -0.3, 1.4, 3.0, 5.2};
ACE_ballisticCoefficients[] = {0.310};
ACE_velocityBoundaries[] = {};
ACE_standardAtmosphere = "ICAO";

View File

@ -358,7 +358,7 @@ class CfgVehicles {
};
class APC_Tracked_02_base_F: Tank_F {};
class rhsusf_m113_tank_base: APC_Tracked_02_base_F {
class rhsusf_m113tank_base: APC_Tracked_02_base_F {
EGVAR(refuel,fuelCapacity) = 360;
class Turrets: Turrets {
class MainTurret: MainTurret {
@ -367,7 +367,6 @@ class CfgVehicles {
};
};
class rhsusf_m113tank_base: APC_Tracked_02_base_F {};
class rhsusf_m113_usarmy: rhsusf_m113tank_base {};
class rhsusf_m113_usarmy_supply: rhsusf_m113_usarmy {
transportAmmo = 0;

View File

@ -13,16 +13,24 @@ class CfgWeapons {
class rhs_weap_M107_Base_F: GM6_base_F {
ACE_barrelTwist = 381.0;
ACE_barrelLength = 736.6;
ACE_RailHeightAboveBore = 3.8;
};
class rhs_weap_XM2010_Base_F: Rifle_Base_F {
ACE_barrelTwist = 254.0;
ACE_barrelLength = 609.6;
ACE_Overheating_dispersion = 0.75;
ACE_RailHeightAboveBore = 3.6;
};
class rhs_weap_m24sws: rhs_weap_XM2010_Base_F {
ACE_barrelTwist = 285.75;
ACE_barrelLength = 609.6;
ACE_RailHeightAboveBore = 1.8;
};
class rhs_weap_m40a5: rhs_weap_XM2010_Base_F {
ACE_barrelTwist = 304.8; // 1:12"
ACE_barrelLength = 635.0; // 25"
ACE_RailHeightAboveBore = 2.6;
};
class arifle_MX_Base_F;
class rhs_weap_m4_Base: arifle_MX_Base_F {
ACE_barrelTwist = 177.8;
@ -75,14 +83,17 @@ class CfgWeapons {
ACE_barrelTwist = 304.8;
ACE_barrelLength = 558.8;
ACE_Overheating_dispersion = 0.75;
ACE_RailHeightAboveBore = 3.3;
};
class rhs_weap_sr25: rhs_weap_m14ebrri {
ACE_barrelTwist = 285.75;
ACE_barrelLength = 609.6;
ACE_RailHeightAboveBore = 3.4;
};
class rhs_weap_sr25_ec: rhs_weap_sr25 {
ACE_barrelTwist = 285.75;
ACE_barrelLength = 508.0;
ACE_RailHeightAboveBore = 3.4;
};
class rhs_weap_M590_5RD: Rifle_Base_F {
ACE_barrelTwist = 0.0;
@ -131,8 +142,11 @@ class CfgWeapons {
};
};
};
class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base {};
class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base {
ACE_ScopeHeightAboveRail = 2.4;
};
class rhsusf_acc_LEUPOLDMK4_2: rhsusf_acc_sniper_base {
ACE_ScopeHeightAboveRail = 3.8;
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
class pso1_scope {
@ -142,8 +156,11 @@ class CfgWeapons {
};
};
};
class rhsusf_acc_LEUPOLDMK4_2_d: rhsusf_acc_LEUPOLDMK4_2 {};
class rhsusf_acc_LEUPOLDMK4_2_d: rhsusf_acc_LEUPOLDMK4_2 {
ACE_ScopeHeightAboveRail = 3.8;
};
class rhsusf_acc_premier: rhsusf_acc_LEUPOLDMK4_2 {
ACE_ScopeHeightAboveRail = 5.4;
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
class pso1_scope {
@ -153,8 +170,11 @@ class CfgWeapons {
};
};
};
class rhsusf_acc_premier_low: rhsusf_acc_premier {};
class rhsusf_acc_premier_low: rhsusf_acc_premier {
ACE_ScopeHeightAboveRail = 4.0;
};
class rhsusf_acc_premier_anpvs27: rhsusf_acc_premier {
ACE_ScopeHeightAboveRail = 5.4;
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
class pso1_nvg {
@ -164,6 +184,24 @@ class CfgWeapons {
};
};
};
class rhsusf_acc_M8541: rhsusf_acc_premier { // http://www.schmidtundbender.de/en/products/police-and-military-forces/3-12x50-pm-iilpmtc.html
ACE_ScopeHeightAboveRail = 4.0;
ACE_ScopeAdjust_Vertical[] = {0, 22};
ACE_ScopeAdjust_Horizontal[] = {-6, 6};
ACE_ScopeAdjust_VerticalIncrement = 0.1;
ACE_ScopeAdjust_HorizontalIncrement = 0.1;
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
class Snip {
discreteDistance[] = {100};
discreteDistanceInitIndex = 0;
};
};
};
};
class rhsusf_acc_M8541_low: rhsusf_acc_M8541 {
ACE_ScopeHeightAboveRail = 3.0;
};
// RHS lauchers
class rhs_weap_fgm148: launch_O_Titan_F {
ace_javelin_enabled = 1;