diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 08c731127a..af6ab70854 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -34,11 +34,11 @@ We welcome anyone to contribute to this repository. Issues that we are actively ## Pull Request process -When contributing to this repository, please first discuss the change you wish to make via issue or [Slack](https://slackin.ace3mod.com/) with the [ACE3 project maintainers](https://ace3mod.com/team.html) before making a change. This may not be necessary if you are contributing for something which has an existing issue in our repository already. +When contributing to this repository, please first discuss the change you wish to make via issue or [Discord](https://acemod.org/discord) with the [ACE3 project maintainers](https://ace3.acemod.org/team.html) before making a change. This may not be necessary if you are contributing for something which has an existing issue in our repository already. 1. Please make a pull request (PR) as early as possible. This lets use help you in the proces of developing it. When opening a work in progress pull request, mark your PR with a `WIP:` prefix. 2. Describe what this pull request will do and how it solves this in the description of your PR. A clear intent and description of the way the issue is resolved will help us to review the PR more efficiently. -3. Please follow our [Development Guidelines](https://ace3mod.com/wiki/development/). +3. Please follow our [Development Guidelines](https://ace3.acemod.org/wiki/development/). ### Notes @@ -47,4 +47,4 @@ Please note that all contributors to this project are volunteers and do this in ## Assistance with contributing -If you require assistance with contributing, check out the #dev channel on our [Slack](https://slackin.ace3mod.com/). Additional documentation can be found on our [Development wiki](https://ace3mod.com/wiki/development/). +If you require assistance with contributing, check out the #dev channel on our [Discord](https://acemod.org/discord). Additional documentation can be found on our [Development wiki](https://ace3.acemod.org/wiki/development/). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2dd93748a3..c71190ce39 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -30,7 +30,7 @@ All good? Then proceed and fill out the items below. A clear and concise description of what the bug is. **Steps to reproduce:** -_Follow [https://ace3mod.com/img/wiki/user/issue_flowchart.png](this flowchart)!_ +_Follow [https://ace3.acemod.org/img/wiki/user/issue_flowchart.webp](this flowchart)!_ 1. _Go to ..._ 2. _Click ..._ diff --git a/.github/ISSUE_TEMPLATE/enhancement-request.md b/.github/ISSUE_TEMPLATE/enhancement-request.md deleted file mode 100644 index e4f5abcb54..0000000000 --- a/.github/ISSUE_TEMPLATE/enhancement-request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Enhancement request -about: Suggest an improvement for this project -title: '' -labels: kind/enhancement -assignees: '' - ---- - -**Is your enhancement related to a problem?** -A clear and concise description of what the enhancement entails. Ex. [...] would improve user experience. - -**Solution you'd like:** -A clear and concise description of what you want to happen. - -**Alternatives you've considered:** -A clear and concise description of any alternative solutions or ideas you've considered. - -**Additional context:** -Add any other context or screenshots about the enhancement here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 45e10cf0cb..2bba1a5dd1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -9,4 +9,4 @@ assignees: '' ### Do not post feature requests here! -Learn how to make a feature request [here](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html). +Learn how to make a feature request [here](https://ace3.acemod.org/wiki/user/how-to-make-a-feature-request.html). diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ea83a609e3..5f42f937fe 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,9 @@ **When merged this pull request will:** -- Describe what this pull request will do -- Each change in a separate line -- Include documentation if applicable -- Respect the [Development Guidelines](https://ace3mod.com/wiki/development/) -- Follow title standard `Component - Add|Fix|Improve|Change|Make|Remove bananas` +- _Describe what this pull request will do_ +- _Each change in a separate line_ + +### IMPORTANT + +- [ ] If the contribution affects [the documentation](https://github.com/acemod/ACE3/tree/master/docs), please include your changes in this pull request so the documentation will appear on the [website](https://ace3.acemod.org/). +- [ ] [Development Guidelines](https://ace3.acemod.org/wiki/development/) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. diff --git a/.github/workflows/pboproject.yml b/.github/workflows/pboproject.yml index 4aea0e7c18..7b03e65077 100644 --- a/.github/workflows/pboproject.yml +++ b/.github/workflows/pboproject.yml @@ -15,7 +15,7 @@ jobs: with: toolsUrl: ${{ secrets.ARMA3_TOOLS_URL }} - name: Install Mikero Tools - uses: arma-actions/mikero-tools@2021-04-10 + uses: arma-actions/mikero-tools@2021-11-06 - name: Download game data run: | Invoke-WebRequest "$env:ARMA3_DATA_URL" -OutFile arma3.zip @@ -56,8 +56,10 @@ jobs: run: | rm -r z\ace\addons\ rm -r z\ace\optionals\ + rm -r z\ace\tools\pDummies\ xcopy /e /h /q pullrequest\addons z\ace\addons\ xcopy /e /h /q pullrequest\optionals z\ace\optionals\ + xcopy /e /h /q pullrequest\tools\pDummies z\ace\tools\pDummies\ - name: Setup build environment run: | subst P: . diff --git a/AUTHORS.txt b/AUTHORS.txt index 11f7094d44..544a7d36b6 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -6,10 +6,10 @@ # request, preferably including an email address. # CORE TEAM -Brandon (TCVM) bux578 commy2 Dahlgren +Dani (TCVM) esteldunedain Felix Wiegand Garth "L-H" de Wet @@ -35,7 +35,7 @@ Walter Pearce 11RDP-LoupVert 654wak654 [BIG]Bull -ACCtomeek +ACCtomeek adam3adam Adanteh aeroson @@ -68,6 +68,7 @@ Clon1998 Codingboy Coren Crusty +Cyruz143 dabako dgibso29 Dharma Bellamkonda @@ -130,6 +131,7 @@ meat Michail Nikolaev MikeMatrix mjc4wilton +Mysteryjuju nic547 nikolauska nomisum @@ -147,12 +149,14 @@ QuickDagger rakowozz ramius86 Raspu86 +RcINS Riccardo Petricca Robert Boklahánics ruPaladin Rutger "RedBery" Meijering sancron Schwaggot +Seb shukari simon84 Skengman2 @@ -161,6 +165,7 @@ Sniperwolf572 System98 SzwedzikPL Tachi +tbeswick96 Tessa Elieff Timi007 Toaster @@ -174,6 +179,7 @@ VyMajoris(W-Cephei) Walthzer Winter wizpig64 +YetheSamartaka xrufix Zakant zGuba diff --git a/README.md b/README.md index 48b83610f1..27255aa7b8 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues @@ -18,8 +18,8 @@ ACE3 License - - ACE3 Slack + + ACE3 Discord ACE3 Build Status @@ -78,8 +78,8 @@ The mod is **built modularly**, so almost any included PBO can be easily removed ACE3 requires Arma 3 and the latest version of CBA A3. See the following pages for help and information on how to get started with ACE3: -- [Installation guide](https://ace3mod.com/wiki/user/installation-guide.html) -- [Information center](https://ace3mod.com/wiki/user/information-center.html) +- [Installation guide](https://ace3.acemod.org/wiki/user/installation-guide.html) +- [Information center](https://ace3.acemod.org/wiki/user/information-center.html) ## Contributing @@ -87,26 +87,26 @@ You can help out with the ongoing development by looking for potential bugs in o ### Contribution guidelines -To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. See [the pull request guidelines](https://ace3mod.com/wiki/development/merging-pull-requests.html) for further information on this process. +To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. See [the pull request guidelines](https://ace3.acemod.org/wiki/development/merging-pull-requests.html) for further information on this process. ### Submitting issues and requesting features 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](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [How to make a feature request](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [How to report an issue](https://ace3.acemod.org/wiki/user/how-to-report-an-issue.html) +- [How to make a feature request](https://ace3.acemod.org/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](https://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](https://ace3.acemod.org/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. ### Get in touch - - + + diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index 43299a0e38..9ff22efe95 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -28,7 +28,7 @@ if (!hasInterface) exitWith {}; //Add warnings for missing compat PBOs (only if AB is on) { _x params ["_modPBO", "_compatPBO"]; - if ((isClass (configFile >> "CfgPatches" >> _modPBO)) && {!isClass (configFile >> "CfgPatches" >> _compatPBO)}) then { + if ([_modPBO] call EFUNC(common,isModLoaded) && {!([_compatPBO] call EFUNC(common,isModLoaded))}) then { WARNING_2("Weapon Mod [%1] missing ace compat pbo [%2] (from @ace\optionals)",_modPBO,_compatPBO); }; } forEach [ diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 843f508ea1..eb9d865c79 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -49,7 +49,7 @@ アドバンスド バリスティックス고급 탄도학先進彈道系統 - 先进弹道系统 + 进阶弹道系统Gelişmiş Balistik @@ -66,7 +66,7 @@ アドバンスド バリスティックスを有効化 고급 탄도학 先進彈道系統 - 先进弹道系统 + 进阶弹道系统 Gelişmiş Balistik @@ -83,7 +83,7 @@ アドバンスド バリスティックスを有効化します。 고급 탄도학을 적용합니다 啟用先進彈道系統 - 启用先进弹道系统 + 启用进阶弹道系统 Gelişmiş balistiği etkinleştir @@ -200,7 +200,7 @@ 弾丸の軌跡エフェクトを有効化 예광탄 효과 적용 啟用曳光彈效果 - 启用曳光弹效果 + 启用子弹尾迹效果 İzli Mermi Etkisini Etkinleştir @@ -217,7 +217,7 @@ 大口径弾の軌跡エフェクトを有効化します。 (高性能光学機器を介してのみ見ることができます) 대구경 탄환에 예광탄 효과를 적용합니다(오직 고성능 조준경 사용시에만 보입니다) 啟用曳光彈效果給大口徑子彈 (只有透過高倍率光學瞄鏡才能看到) - 启用曳光弹效果给大口径子弹 (只有透过高倍率光学瞄镜才能看到) + 给大口径子弹启用子弹尾迹效果(只有透过高倍率光学瞄镜才能看到) Yüksek kalibreli mermilere mermi izleme efekti sağlar (yalnızca yüksek güçlü optiklerden bakıldığında görülebilir) @@ -250,7 +250,7 @@ 各シミュレーション毎の間隔を定義します。 각 계산 단위의 간격을 정의합니다 定義每個模擬計算之間的時間間隔 - 定义每个模拟计算之间的时间间隔 + 定义每个计算步骤之间的间隔 Simulation Radius @@ -283,7 +283,7 @@ アドバンスド バリスティックスの適用半径範囲 (プレイヤー中心、メートル単位) を定義します。 플레이어 주위의 발사체를 고급 탄도학으로 정의하는 범위를 정합니다(미터) 以玩家的半徑距離(公尺)定義先進彈道系統啟用範圍 - 以玩家的半径距离(公尺)定义先进弹道系统启用范围 + 定义玩家周围的半径(米),在这个半径内,进阶弹道系统会被启用 Mermilere gelişmiş balistik uygulandığı oyuncunun etrafındaki yarıçapı (metre cinsinden) tanımlar @@ -300,7 +300,7 @@ アドバンスド バリスティックスのシミュレーションを有効化します。 弾道は気温・気圧・湿度・重力・弾薬の種類・発射する武器などの変化による影響を受けるようになります。 이 모듈은 고급 탄도학을 적용시킵니다 - 이는 발사체의 궤적이 기온, 대기압, 습도, 중력, 탄환의 종류와 어느 무기에서 발사되는지에 따라 영향을 받습니다. 該模塊實現先進的彈道仿真 - 這意味著子彈的軌跡是由空氣溫度、大氣壓力、濕度、重力、彈藥類型以及射擊的武器所影響 - 该模块实现先进的弹道仿真 - 这意味着子弹的轨迹是由空气温度、大气压力、湿度、重力、弹药类型以及射击的武器所影响 + 该模块实现增强的弹道模拟—子弹的轨迹由空气温度、大气压力、湿度、重力、弹药类型和射击的武器等变量所影响 Bu modül gelişmiş balistik simülasyonunu etkinleştirir - yani mermilerin gidişatını hava sıcaklığı, atmosfer basıncı, nem, yerçekimi, mühimmat türü ve ateşlendiği silah gibi durumlar etkiler. diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index 5a8b2d4efe..0072bd3ccc 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -30,7 +30,7 @@ if (!hasInterface) exitWith {}; GVAR(ppeBlackout) ppEffectCommit 0.4; // - GVAR updating and initialization ----------------------------------------- - ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; + ["unit", LINKFUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; ["visibleMap", { params ["", "_visibleMap"]; // command visibleMap is updated one frame later @@ -56,7 +56,8 @@ if (!hasInterface) exitWith {}; [1, 3] select (_this getVariable [QEGVAR(dragging,isCarrying), false]); }] call FUNC(addDutyFactor); }; - if (["ACE_Weather"] call EFUNC(common,isModLoaded)) then { + // Weather has an off switch, Dragging & Medical don't. + if (missionNamespace getVariable [QEGVAR(weather,enabled), false]) then { [QEGVAR(weather,temperature), { // 35->1, 45->2 linearConversion [35, 45, (missionNamespace getVariable [QEGVAR(weather,currentTemperature), 25]), 1, 2, true]; }] call FUNC(addDutyFactor); diff --git a/addons/advanced_fatigue/XEH_preInit.sqf b/addons/advanced_fatigue/XEH_preInit.sqf index 12f007ccf6..01b71996db 100644 --- a/addons/advanced_fatigue/XEH_preInit.sqf +++ b/addons/advanced_fatigue/XEH_preInit.sqf @@ -9,7 +9,7 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40); -GVAR(dutyList) = [[], []]; +GVAR(dutyList) = createHashMap; GVAR(setAnimExclusions) = []; ADDON = true; diff --git a/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf b/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf index e2f87f3080..f9c8b19889 100644 --- a/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf +++ b/addons/advanced_fatigue/functions/fnc_addDutyFactor.sqf @@ -18,6 +18,4 @@ params [["_id", "", [""]], ["_factor", 1, [0, {}]]]; if (_id == "" || {_factor isEqualTo 1}) exitWith {}; -GVAR(dutyList) params ["_idList", "_factorList"]; -_idList pushBack _id; -_factorList pushBack _factor, +GVAR(dutyList) set [_id, _factor]; diff --git a/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf b/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf index 0e0ce7de04..1ac10fc26c 100644 --- a/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf +++ b/addons/advanced_fatigue/functions/fnc_getMetabolicCosts.sqf @@ -30,7 +30,7 @@ private _duty = GVAR(animDuty); } else { _duty = _duty * (_unit call _x); }; -} forEach (GVAR(dutyList) select 1); +} forEach (values GVAR(dutyList)); if (GVAR(isSwimming)) then { _terrainGradient = 0; diff --git a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf index 0f4c5d0fa6..f699377f59 100644 --- a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf @@ -31,6 +31,8 @@ if (GVAR(fadeStaminaBar)) then { } else { _staminaBarContainer ctrlSetFade (0.9 * _stamina / 0.8); }; +} else { + _staminaBarContainer ctrlSetFade 0; }; // - Color -------------------------------------------------------------------- diff --git a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf index 1d3b215b54..ef47d939d0 100644 --- a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf +++ b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf @@ -14,7 +14,9 @@ * * Public: No */ -if (!alive ACE_player) exitWith { // Dead people don't breath, Will also handle null (Map intros) + +// Dead people don't breathe, will also handle null (map intros) +if (!alive ACE_player) exitWith { [FUNC(mainLoop), [], 1] call CBA_fnc_waitAndExecute; private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; _staminaBarContainer ctrlSetFade 1; diff --git a/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf b/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf index aacba72dd8..030a0a43d0 100644 --- a/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf +++ b/addons/advanced_fatigue/functions/fnc_removeDutyFactor.sqf @@ -16,10 +16,4 @@ */ params [["_id", "", [""]]]; -GVAR(dutyList) params ["_idList", "_factorList"]; -private _index = _idList find _id; - -if (_index != -1) then { - _idList deleteAt _index; - _factorList deleteAt _index; -}; +GVAR(dutyList) deleteAt _id; diff --git a/addons/advanced_fatigue/stringtable.xml b/addons/advanced_fatigue/stringtable.xml index d93490ae85..5737e1fca2 100644 --- a/addons/advanced_fatigue/stringtable.xml +++ b/addons/advanced_fatigue/stringtable.xml @@ -6,7 +6,7 @@ ACE Fatiga AvanzadaACE Erweiterte AusdauerACE 進階疲勞 - ACE 进阶疲劳 + ACE 进阶体力ACE アドバンスド ファティーグACE Fatica AvanzataACE 고급 피로도 @@ -73,7 +73,7 @@ Facteur de récupérationFattore Recupero回復值 - 回复值 + 恢复系数Фактор восстановленияFator de RecuperaçãoFaktor zotavení @@ -89,7 +89,7 @@ Modifie la vitesse à laquelle le joueur récupère lorsqu'il se repose.\nPlus la valeur est élevée, plus la récupération est rapide.Determina in quanto tempo il giocatore recupera quando rilassato. Maggiore significa migliore.決定玩家休息多久就能回復體力,值越高恢復越快 - 决定玩家休息多久就能回复体力,值越高恢复越快 + 决定玩家休息多久就能恢复体力,值越高恢复越快Изменяет скорость восстановления игрока во время отдыха. Чем выше, тем быстрее.Altera o quão rápido um jogador recupera quando descansando. Quanto maior, mais rápido.Mění, jak rychle se hráč zotaví, když odpočívá. Vyšší je rychlejší. @@ -104,7 +104,7 @@ Facteur de chargeFattore Caricamento負重量 - 负重量 + 重量系数Фактор нагрузкиFator de CargaFaktor zatížení @@ -119,7 +119,7 @@ Augmente ou diminue l'influence du poids sur les performances du joueur.\nUne valeur nulle indique que le poids de l'équipement n'a aucun impact sur les performances.Incrementa o decrementa quanto il peso influenza le prestazioni dei giocatori. Zero significa che il peso dell'equipaggiamento non ha alcuna influenza nelle prestazioni.增加或降低玩家所能承受的負重量. 如設定值為0, 代表裝備的重量將不會影響到玩家的體力表現 - 增加或降低玩家所能承受的负重量. 如设定值为0, 代表装备的重量将不会影响到玩家的体力表现 + 增加或降低玩家所能承受的负重量。如设定值为0,代表装备的重量将不会影响到玩家的体力表现Увеличивает или уменьшает вес, влияющий на производительность игроков. Ноль означает, что вес снаряжения не влияет на производительностьAumenta ou diminui o quanto o peso influencia a performance do jogador. Zero significa que o peso não tem impacto algum na performance.Zvyšuje nebo snižuje, jak velká váha ovlivňuje výkon hráče. Nulová hodnota znamená, že hmotnost zařízení nemá žádný vliv na výkon. @@ -134,7 +134,7 @@ Facteur d'inclinaison du terrainFattore Pendenza Terreno地形陡峭影響值 - 地形陡峭影响值 + 地形陡峭系数Фактор местностиFator de Inclinação do TerrenoFaktor stoupání terénu @@ -149,7 +149,7 @@ Définit à quel point un terrain escarpé réduit l'endurance du joueur.\nPlus la valeur est élevée, moins le joueur est endurant.Stabilisce quanto la pendenza del terreno incrementa la perdita della stamina. Maggiore significa più stamina persa.設定陡峭的地形將會影響多少體力的流失,值越高代表體力流失越快 - 设定陡峭的地形将会影响多少体力的流,失值越高代表体力流失越快 + 设定陡峭的地形将会影响多少体力的流失速度,值越高代表体力流失越快Устанавливает, насколько крутая местность увеличивает потерю выносливости. Чем выше, тем быстрее теряется выносливость.Define o quanto que um terreno íngrime aumenta na perda de estamina. Quanto maior, maior a perda de estamina.Nastavuje, o kolik strmý terén zvyšuje ztrátu výdrže. Vyšší znamená vyšší ztrátu výdrže. @@ -159,7 +159,7 @@ Factor de balanceo de miraVerwacklungsfaktor手ぶれ因数 - 抖动因数 + 抖动系数抖動因素Facteur de tremblementFattore di oscillazione @@ -167,13 +167,14 @@ Фактор колебания прицелаFator de Balanço de MiraFaktor kývání + 손떨림 정도 Influences the amount of weapon sway. Higher means more sway. Afecta al la estabilidad de la mira. Más alto significa más balanceo Beeinflusst den Faktor, wie ruhig man eine Waffe halten kann. Ein höherer Wert bedeutet weniger Stabilisierung 武器を持つ手のぶれ度合いを設定します。 値が高ければ高いほど、手ぶれが強くなります。 - 影响手持武器的晃动程度,数值越高,抖动的越厉害. + 影响手持武器的晃动程度,数值越高,抖动的越厉害。 影響手持武器晃動程度,數值越高抖動越厲害 Influe sur l'amplitude du tremblement de l'arme. Une valeur plus élevée signifie plus de tremblement. Influenza l'ammontare di oscillazione dell'arma. Maggiore significa più oscillazione. @@ -181,6 +182,7 @@ Влияет на колебания прицела оружия. Чем выше - тем больше. Influencia a quantidade de balanço da mira da arma. Quanto maior, mais balanço. Ovlivňuje množství kývání zbraní. Vyšší znamená více kývání. + 손떨림의 정도를 정합니다. 높을 수록 많이 휘적입니다. Enabled @@ -207,7 +209,7 @@ Active/Désactive la fatigue avancée. Abilita/disabilita la Fatica Avanzata. 啟用/關閉進階體力. - 启用/关闭进阶体力. + 启用/关闭进阶体力。 Включает / Отключает Продвинутую усталость Ativa/Desativa Fadiga Avançada. Aktivuje / deaktivuje Pokročilou únavu. @@ -248,6 +250,7 @@ Скрыть шкалу усталости автоматически Blende Ausdauerleiste automatisch aus 體力條自動淡去 + 自动淡化体力条 Dissolvenza automatica della barra della stamina Automaticky schovat lištu výdrže Fondu automatique de la barre d'endurance @@ -255,6 +258,7 @@ Chowaj pasek wytrzymałości automatycznie Barra de stamina some automaticamente Dayanıklılık çubuğunu otomatik olarak soldur + 자동으로 피로도 막대 숨기기 Adjusts transparency of the bar based on stamina status. @@ -262,12 +266,14 @@ Регулирует прозрачность шкалы в зависимости от статуса выносливости. Passt die Transparenz der Ausdauerleiste abhängig vom Ausdauerstatus an. 依照目前的體力程度調整體力條之透明度 + 根据体力状况调整体力条的透明度 Regola la trasparenza della barra in base allo stato di affaticamento. Upravuje průhlednost lišty v závislosti na současném stavu výdrže Règle la transparence de la barre en fonction de l'état d'endurance. スタミナの状態に応じて、自動的にバーの透明度を調整します。 Dostosowuje przezroczystość paska na podstawie stanu wytrzymałości. Ajusta a transparência da barra baseado no status da stamina + 피로도에 따라 피로도 막대의 투명도를 조절합니다. diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml index b10fae3f52..735051da99 100644 --- a/addons/advanced_throwing/stringtable.xml +++ b/addons/advanced_throwing/stringtable.xml @@ -75,7 +75,7 @@ Afficher l'arc de lancéMostra Arco di Tiro顯示投擲軌道 - 显示投掷轨道 + 显示投掷弧线Mostrar o Arco de ArremessoZobrazit oblouk vrhu Atış Yayını Göster @@ -91,7 +91,7 @@ Active la visualisation de l'arc de lancé (la trajectoire de vol de l'objet).Abilita la visualizzazione dell'arco del tiro (dove l'oggetto lanciabile volerà).顯示投擲軌道幫助投擲 - 显示投掷轨道帮助投掷 + 显示投掷弧线帮助投掷Permite a visualização do Arco de Arremesso por onde o objeto será jogado.Zapíná vizualizaci oblouku vrhu (kam bude předmět hozen). @@ -106,7 +106,7 @@ Afficher les contrôles à la souris du lancéMostra Comandi Mouse Lancio顯示滑鼠投擲控制提示 - 显示滑鼠投掷控制提示 + 显示鼠标投掷控制提示Mostrar os controles de mouse para ArremessoZobrazit ovládání házení myší @@ -121,7 +121,7 @@ Active les aides visuelles pour les contrôles à la souris lorsqu'un lancé est préparé.Abilita la visualizzazione dei controlli del mouse quando l'oggetto lanciabile è pronto.開啟後會在準備投擲時, 顯示滑鼠相關操作 - 开启后会在准备投掷时, 显示滑鼠相关操作 + 开启后会在准备投掷时,显示鼠标相关操作Ativa as dicas visuais dos controles do mouse quando um arremessável é preparado.Zapíná popisky pro ovládání myší, když je házený předmět připraven. @@ -136,7 +136,7 @@ Permettre le ramassage d'objets lançablesAbilita Raccogli Oggetti啟用可撿取地面投擲物 - 启用可捡取地面投掷物 + 启用捡取地面投掷物Permitir pegar arremessáveisZapnout zdvihání házených předmětů @@ -151,7 +151,7 @@ Active la possibilité de ramasser des objets lançables du sol.Abilita la possibilità di raccogliere un oggetto lanciabile da terra.啟用後, 可撿取地面上的投擲物 - 启用后, 可捡取地面上的投掷物 + 启用后,可捡取地面上的投掷物Permite que objetos arremessados sejam pegos do chão. (ACE Menu de Interação)Zapíná schopnost zvednutí házených předmětů ze země. @@ -166,7 +166,7 @@ Activer le ramassage d'objets lançables attachésAbilita Raccogli Oggetti Lanciabili da altri Oggetti啟用可撿取附著投擲物 - 启用可捡取附着投掷物 + 启用捡取附着投掷物Permitir pegar arremessáveis fixadosZapnout zdvihání připnutých předmětů. @@ -181,7 +181,7 @@ Active la possibilité de ramasser des objets lançables attachés à d'autres objets.Abilita la possibilità di raccogliere gli oggetti lanciabili dagli altri oggetti. 啟用後, 可撿取附著在物件上的投擲物 - 启用后, 可捡取附着在物件上的投掷物 + 启用后,可捡取附着在物体上的投掷物Permite que arremessáveis fixados em objetos sejam pegos.Zapíná schopnost zvednutí předmětů z objektů ke kterým jsou připnuté. @@ -211,7 +211,7 @@ Mode de lancé de l'objet (Tenir)Modalità Oggetto Gettabile (Mantenere)投擲模式 (按住) - 投掷模式 (按住) + 投掷模式(按住)Modo de Arremesso (Segurar)Mód puštění (Držet) @@ -226,7 +226,7 @@ Mode de lancé de l'objet (Basculer)Modalità Oggetto lanciabile Gettabile (Interruttore)投擲模式 (切換) - 投掷模式 (切换) + 投掷模式(切换)Modo de Arremesso (Alternar)Mód puštění (Přepnout) @@ -241,7 +241,7 @@ amorcéeArmato引信開始燃燒 - 引信开始燃烧 + 已开引信PreparadoOdjištěný @@ -272,7 +272,7 @@ (Défilement) Changer de mode(Scorrere) Cambio Modalità(滾輪) 變更模式 - (滚轮) 变更模式 + (滚轮)变更模式(Roda do Mouse) Alternar modo(Scrollovat) Změnit mód(Tekerlek) Modu Değiştir @@ -288,7 +288,7 @@ (Défilement) Étendre(Scorrere) Estendere(滾輪) 延長 - (滚轮) 延长 + (滚轮)延长(Roda do Mouse) Extender(Scrollovat) Oddálit(Tekerlek) Uzat @@ -304,7 +304,7 @@ (Clique) Dégoupiller(Click) Arma(點擊) 提早拉開引信 - (点击) 提早拉开引信 + (点击)提早拉开引信(Clique) Cozinhar(Klik) Odjistit(Tıkla) Cook diff --git a/addons/aircraft/CfgEventHandlers.hpp b/addons/aircraft/CfgEventHandlers.hpp index 865276cfba..66a525846a 100644 --- a/addons/aircraft/CfgEventHandlers.hpp +++ b/addons/aircraft/CfgEventHandlers.hpp @@ -9,3 +9,9 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); }; }; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/aircraft/XEH_PREP.hpp b/addons/aircraft/XEH_PREP.hpp index 65407a32f0..a0338e8e4a 100644 --- a/addons/aircraft/XEH_PREP.hpp +++ b/addons/aircraft/XEH_PREP.hpp @@ -1,2 +1,6 @@ -PREP(initEjectAction); PREP(canShowEject); +PREP(droneAddActions); +PREP(droneGetTurretTargetPos); +PREP(droneModifyWaypoint); +PREP(droneSetWaypoint); +PREP(initEjectAction); diff --git a/addons/aircraft/XEH_postInit.sqf b/addons/aircraft/XEH_postInit.sqf new file mode 100644 index 0000000000..169a4d2d94 --- /dev/null +++ b/addons/aircraft/XEH_postInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +[QGVAR(droneModifyWaypoint), LINKFUNC(droneModifyWaypoint)] call CBA_fnc_addEventHandler; +[QGVAR(droneSetWaypoint), LINKFUNC(droneSetWaypoint)] call CBA_fnc_addEventHandler; + +if (hasInterface) then { + ["ACE_controlledUAV", LINKFUNC(droneAddActions)] call CBA_fnc_addEventHandler; +}; diff --git a/addons/aircraft/functions/fnc_droneAddActions.sqf b/addons/aircraft/functions/fnc_droneAddActions.sqf new file mode 100644 index 0000000000..8a44b1393e --- /dev/null +++ b/addons/aircraft/functions/fnc_droneAddActions.sqf @@ -0,0 +1,121 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Adds actions to a drone + * + * Arguments: + * 0: vehicle + * + * Return Value: + * None + * + * Example: + * [v] call ace_aircraft_fnc_droneAddActions + * + * Public: No + */ + +params ["_vehicle"]; +TRACE_1("droneAddActions",_vehicle); + +if (!alive _vehicle) exitWith {}; +if (_vehicle getVariable [QGVAR(droneActionsAdded), false]) exitWith {}; +_vehicle setVariable [QGVAR(droneActionsAdded), true]; + +// move to location +private _condition = { + params ["_vehicle"]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} +}; +private _statement = { + params ["_vehicle"]; + private _group = group driver _vehicle; + private _pos = ([_vehicle, [0]] call FUNC(droneGetTurretTargetPos)) select 0; + [QGVAR(droneSetWaypoint), [_vehicle, _group, _pos, "MOVE"], _group] call CBA_fnc_targetEvent; +}; +private _action = [QGVAR(droneSetWaypointMove), localize "$STR_AC_MOVE", + "\a3\3DEN\Data\CfgWaypoints\Move_ca.paa", _statement, _condition] call EFUNC(interact_menu,createAction); +[_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + + +if (_vehicle isKindOf "Air") then { + // loiter at location + _condition = { + params ["_vehicle"]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + }; + _statement = { + params ["_vehicle"]; + private _group = group driver _vehicle; + private _pos = ([_vehicle, [0]] call FUNC(droneGetTurretTargetPos)) select 0; + [QGVAR(droneSetWaypoint), [_vehicle, _group, _pos, "LOITER"], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(droneSetWaypointLoiter), localize "$STR_AC_LOITER", + "\a3\3DEN\Data\CfgWaypoints\Loiter_ca.paa", _statement, _condition] call EFUNC(interact_menu,createAction); + [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + + + // set height + _condition = { + params ["_vehicle"]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + }; + _statement = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + [QGVAR(droneModifyWaypoint), [_vehicle, _group, "height", _args], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(setAltitude), localize "$STR_3den_waypoint_attribute_loiteraltitude_displayname", + "", {}, _condition] call EFUNC(interact_menu,createAction); + private _base = [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + { + _action = [str _x, str _x, "", _statement, { true }, {}, _x] call EFUNC(interact_menu,createAction); + [_vehicle, 1, _base, _action] call EFUNC(interact_menu,addActionToObject); + } forEach [20, 50, 200, 500, 2000]; + + + // set loiter radius + _condition = { + params ["_vehicle"]; + private _group = group driver _vehicle; + private _index = (currentWaypoint _group) min count waypoints _group; + private _waypoint = [_group, _index]; + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + && {(waypointType _waypoint) == "LOITER"} + }; + _statement = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + [QGVAR(droneModifyWaypoint), [_vehicle, _group, "radius", _args], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(lotierRadius), localize "$STR_3den_waypoint_attribute_loiterradius_displayname", + "", {}, _condition] call EFUNC(interact_menu,createAction); + _base = [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + { + _action = [str _x, str _x, "", _statement, { true }, {}, _x] call EFUNC(interact_menu,createAction); + [_vehicle, 1, _base, _action] call EFUNC(interact_menu,addActionToObject); + } forEach [500, 750, 1000, 1250, 1500]; + + + // set loiter direction + _condition = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + private _index = (currentWaypoint _group) min count waypoints _group; + private _waypoint = [_group, _index]; + + (missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]} + && {(waypointType _waypoint) == "LOITER"} && {(waypointLoiterType _waypoint) != _args} + }; + _statement = { + params ["_vehicle", "", "_args"]; + private _group = group driver _vehicle; + [QGVAR(droneModifyWaypoint), [_vehicle, _group, "dir", _args], _group] call CBA_fnc_targetEvent; + }; + _action = [QGVAR(lotierTypeR), localize "$STR_3den_waypoint_attribute_loiterdirection_displayname", + "\a3\3DEN\Data\Attributes\LoiterDirection\cw_ca.paa", _statement, _condition, {}, "CIRCLE"] call EFUNC(interact_menu,createAction); + [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); + _action = [QGVAR(lotierTypeR), localize "$STR_3den_waypoint_attribute_loiterdirection_displayname", + "\a3\3DEN\Data\Attributes\LoiterDirection\ccw_ca.paa", _statement, _condition, {}, "CIRCLE_L"] call EFUNC(interact_menu,createAction); + [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject); +}; diff --git a/addons/aircraft/functions/fnc_droneGetTurretTargetPos.sqf b/addons/aircraft/functions/fnc_droneGetTurretTargetPos.sqf new file mode 100644 index 0000000000..a1f0c04707 --- /dev/null +++ b/addons/aircraft/functions/fnc_droneGetTurretTargetPos.sqf @@ -0,0 +1,46 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Get drone's target location, if aimed at infinity it will return a virtual point + * + * Arguments: + * 0: vehicle + * + * Return Value: + * [PosASL , Real ] + * + * Example: + * [v] call ace_aircraft_fnc_droneGetTurretTargetPos + * + * Public: No + */ + +params ["_vehicle"]; +private _turret = [0]; +TRACE_2("droneGetTurretTargetPos",_vehicle,_turret); + +private _turretConfig = [_vehicle, _turret] call CBA_fnc_getTurret; + +private _gunBeg = _vehicle selectionPosition getText (_turretConfig >> "gunBeg"); +private _gunEnd = _vehicle selectionPosition getText (_turretConfig >> "gunEnd"); + +if (_gunEnd isEqualTo _gunBeg) then { + // e.g. Darter doesn't have valid gunBeg/gunEnd + private _vehicleConfig = configOf _vehicle; + _gunBeg = _vehicle selectionPosition getText (_vehicleConfig >> "uavCameraGunnerDir"); + _gunEnd = _vehicle selectionPosition getText (_vehicleConfig >> "uavCameraGunnerPos"); +}; + +_gunBeg = AGLToASL (_vehicle modelToWorld _gunBeg); +_gunEnd = AGLToASL (_vehicle modelToWorld _gunEnd); +private _turretDir = _gunEnd vectorFromTo _gunBeg; +private _farPoint = _gunEnd vectorAdd (_turretDir vectorMultiply 4999); + +private _intersections = lineIntersectsSurfaces [_gunEnd, _farPoint, _vehicle, objNull, true, 1]; +if (_intersections isNotEqualTo []) then { + [_intersections select 0 select 0, true] +} else { + // Not looking at anything, just get a virtual point where the camera is pointing + _farPoint set [2, 0 max getTerrainHeightASL _farPoint]; + [_farPoint, false] +}; diff --git a/addons/aircraft/functions/fnc_droneModifyWaypoint.sqf b/addons/aircraft/functions/fnc_droneModifyWaypoint.sqf new file mode 100644 index 0000000000..eb5d21875e --- /dev/null +++ b/addons/aircraft/functions/fnc_droneModifyWaypoint.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Modify the current waypoint of a drone + * + * Arguments: + * 0: Vehicle + * 1: Group + * 2: Type + * 3: Value + * + * Return Value: + * None + * + * Example: + * [v, group v, "height", 2000] call ace_aircraft_fnc_droneModifyWaypoint + * + * Public: No + */ + +params ["_vehicle", "_group", "_type", "_value"]; +TRACE_4("droneModifyWaypoint",_vehicle,_group,_type,_value); + +private _index = (currentWaypoint _group) min count waypoints _group; +private _waypoint = [_group, _index]; +switch (toLower _type) do { + case ("height"): { + private _pos = waypointPosition _waypoint; + _pos set [2, _value]; + _waypoint setWaypointPosition [_pos, 0]; + _vehicle flyInHeight _value; + }; + case ("radius"): { _waypoint setWaypointLoiterRadius _value; }; + case ("dir"): { _waypoint setWaypointLoiterType _value; }; +}; +_group setCurrentWaypoint _waypoint; diff --git a/addons/aircraft/functions/fnc_droneSetWaypoint.sqf b/addons/aircraft/functions/fnc_droneSetWaypoint.sqf new file mode 100644 index 0000000000..0685988c68 --- /dev/null +++ b/addons/aircraft/functions/fnc_droneSetWaypoint.sqf @@ -0,0 +1,43 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Set new waypoint of a drone + * + * Arguments: + * 0: Vehicle + * 1: Group + * 2: Pos 2D + * 3: Type + * + * Return Value: + * None + * + * Example: + * [v, group v, [2000,5000], "LOITER"] call ace_aircraft_fnc_droneSetWaypoint + * + * Public: No + */ + +params ["_vehicle", "_group", "_pos", "_type"]; +TRACE_4("droneSetWaypoint",_vehicle,_group,_pos,_type); + +private _index = (currentWaypoint _group) min count waypoints _group; +private _waypoint = [_group, _index]; +// Try to save attributes from existing waypoint +private _currentHeight = round ((waypointPosition _waypoint) select 2); +private _currentLoiterRadius = waypointLoiterRadius _waypoint; +private _currentLoiterType = waypointLoiterType _waypoint; + +// Set pos to ATL +_pos set [2, if (_currentHeight >= 50) then { _currentHeight } else { 0 }]; + +// [_group] call CBA_fnc_clearWaypoints; +_waypoint = _group addWaypoint [_pos, 0]; +_waypoint setWaypointType _type; + +TRACE_3("",_currentHeight,_currentLoiterRadius,_currentLoiterType); +if (_currentHeight > 1) then { _vehicle flyInHeight _currentHeight; }; +if (_currentLoiterRadius > 1) then { _waypoint setWaypointLoiterRadius _currentLoiterRadius; }; +if (_currentLoiterType != "") then { _waypoint setWaypointLoiterType _currentLoiterType; }; + +_group setCurrentWaypoint _waypoint; diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml index 668d71963f..6cd3700c73 100644 --- a/addons/aircraft/stringtable.xml +++ b/addons/aircraft/stringtable.xml @@ -56,6 +56,7 @@ 30mm High-Explosive Incendiary 30mm Alto Explosivo Incendiaria 30毫米高爆燃燒彈 + 30 mm 高爆燃烧 30 mm High-Explosive Incendiary 30mm Odłamkowo-Burzące - Zapalające 30mm Yüksek Patlayıcı @@ -63,11 +64,13 @@ 30mm 焼夷りゅう弾 30mm Tříštivo-trhavá zápalná střela 30мм Осколочно-Фугасный Зажигательный + 30mm 고폭소이탄 30mm HEI 30mm AEI 30毫米高爆燃燒 + 30mm 高爆燃烧 30 mm HEI 30mm OB-Z 30mm HEI @@ -75,11 +78,13 @@ 30mm HEI 30mm HEI 30мм ОФЗ + 30mm HEI 30mm DU Armor Piercing 30mm UE Perforante de Blindaje 30毫米貧化鈾穿甲彈 + 30 mm 贫铀穿甲 30 mm UA Armor Piercing 30mm Zubożony Uran - Przebijające 30mm DU Zırh Delici @@ -87,11 +92,13 @@ 30mm DU 徹甲弾 30mm Protipancéřová střela z ochuzeného Uranu 30мм ОУ Бронебойный Снаряд + 30mm 열화우라늄 철갑탄 30mm DU AP 30mm UE AP 30毫米貧鈾穿甲 + 30mm 贫铀穿甲 30 mm UA AP 30mm ZU-P 30mm DU AP @@ -99,11 +106,13 @@ 30mm DU AP 30 mm DU AP 30мм ОУ БС + 30mm DU AP 30mm Combat Mix 4:1 DU:HEI 30mm Mezcla de Combate 4:1 UE:AEI 30毫米戰鬥混合彈4:1 穿甲:高爆 + 30mm 战斗混合 穿甲/高爆 4:1 30 mm Mix de Combat 4:1 UA:HEI 30mm Mieszanka bojowa 4:1 ZU:OB-Z 30mm Combat Mix 4:1 DU:HEI @@ -111,11 +120,13 @@ 30mm コンバット ミックス 4:1 DU:HEI 30mm Bojový Mix 4:1 DU:HEI 30мм Смешанное боепитание 4:1 ОУ:ОФЗ + 30mm 4:1 열화:고폭소이 30mm CM 4:1 30mm MC 4:1 30毫米 穿高混合 4:1 + 30mm 穿爆混合 4:1 30 mm MdC 4:1 30mm MB 4:1 30mm CM 4:1 @@ -123,11 +134,13 @@ 30mm CM 4:1 30mm BM 4:1 30мм СБ 4:1 + 30mm CM 4:1 30mm Combat Mix 5:1 DU:HEI 30mm Mezcla de Combate 5:1 UE:AEI 30毫米戰鬥混合彈5:1 穿甲:高爆 + 30 mm 战斗混合 穿甲/高爆 5:1 30 mm Mix de Combat 5:1 UA:HEI 30mm Mieszanka bojowa 5:1 ZU:OB-Z 30mm Combat Mix 5:1 DU:HEI @@ -135,11 +148,13 @@ 30mm コンバット ミックス 5:1 DU:HEI 30mm Bojový Mix 5:1 DU:HEI 30мм Смешанное боепитание 5:1 ОУ:ОФЗ + 30mm 5:1 열화:고폭소이 30mm CM 5:1 30mm MC 5:1 30毫米 穿高混合 5:1 + 30mm 穿爆混合 5:1 30 mm MdC 5:1 30mm MB 5:1 30mm CM 5:1 @@ -147,6 +162,7 @@ 30mm CM 5:1 30mm BM 5:1 30мм СБ 5:1 + 30mm CM 5:1 diff --git a/addons/apl/ace_envelope_small.p3d b/addons/apl/ace_envelope_small.p3d index 9bc35d7b4a..8b4c0e5f5e 100644 Binary files a/addons/apl/ace_envelope_small.p3d and b/addons/apl/ace_envelope_small.p3d differ diff --git a/addons/apl/ace_envelope_small4.p3d b/addons/apl/ace_envelope_small4.p3d index d139f6bbca..8cd6bc3325 100644 Binary files a/addons/apl/ace_envelope_small4.p3d and b/addons/apl/ace_envelope_small4.p3d differ diff --git a/addons/apl/ace_envelope_small4_nogeo.p3d b/addons/apl/ace_envelope_small4_nogeo.p3d index a39195505c..b3a261918f 100644 Binary files a/addons/apl/ace_envelope_small4_nogeo.p3d and b/addons/apl/ace_envelope_small4_nogeo.p3d differ diff --git a/addons/apl/model.cfg b/addons/apl/model.cfg index 7ed0ad7378..9d9a99a7d4 100644 --- a/addons/apl/model.cfg +++ b/addons/apl/model.cfg @@ -18,11 +18,14 @@ class CfgModels { skeletonName = ""; }; class ace_entrchtool: Default {}; - class ace_envelope_big: Default {}; - class ace_envelope_big4: Default {}; - class ace_envelope_big4_nogeo: Default {}; - class ace_envelope_small: Default {}; - class ace_envelope_small4: Default {}; - class ace_envelope_small4_nogeo: Default {}; + class ace_envelope: Default { + sections[] = {"velka"}; + }; + class ace_envelope_big: ace_envelope {}; + class ace_envelope_big4: ace_envelope {}; + class ace_envelope_big4_nogeo: ace_envelope {}; + class ace_envelope_small: ace_envelope {}; + class ace_envelope_small4: ace_envelope {}; + class ace_envelope_small4_nogeo: ace_envelope {}; class LWTS_optic: Default {}; -}; \ No newline at end of file +}; diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp index 18128f8cc9..9334900789 100644 --- a/addons/arsenal/XEH_PREP.hpp +++ b/addons/arsenal/XEH_PREP.hpp @@ -34,6 +34,7 @@ PREP(fillLeftPanel); PREP(fillLoadoutsList); PREP(fillRightPanel); PREP(fillSort); +PREP(getLoadout); PREP(handleLoadoutsSearchbar); PREP(handleMouse); PREP(handleScrollWheel); diff --git a/addons/arsenal/XEH_postInit.sqf b/addons/arsenal/XEH_postInit.sqf index 65b8045562..ea1b59c6ae 100644 --- a/addons/arsenal/XEH_postInit.sqf +++ b/addons/arsenal/XEH_postInit.sqf @@ -59,10 +59,11 @@ GVAR(lastSortRight) = ""; if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then { private _curSelData =_contentPanelCtrl lnbData [(lnbCurSelRow _contentPanelCtrl), 1]; - ([_loadoutData] call FUNC(verifyLoadout)) params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount"]; + ([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"]; private _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName]; + _extendedLoadout params ["_loadout"]; ADD_LOADOUTS_LIST_PICTURES _contentPanelCtrl lnbSetData [[_newRow, 1], _playerName + _loadoutName]; @@ -85,3 +86,20 @@ GVAR(lastSortRight) = ""; }; }; }] call CBA_fnc_addEventHandler; + +["CBA_loadoutSet", { + params ["_unit", "_loadout", "_extendedInfo"]; + private _face = _extendedInfo getOrDefault [QGVAR(face), ""]; + if (_face != "") then { + _unit setFace _face; + }; + private _voice = _extendedInfo getOrDefault [QGVAR(voice), ""]; + if (_voice != "") then { + _unit setSpeaker _voice; + }; + private _insignia = _extendedInfo getOrDefault [QGVAR(insignia), ""]; + if (_insignia != "") then { + _unit setVariable ["BIS_fnc_setUnitInsignia_class", nil]; + [_unit, _insignia] call bis_fnc_setUnitInsignia; + }; +}] call CBA_fnc_addEventHandler; diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf index 3fb6a7817c..36c8adb46f 100644 --- a/addons/arsenal/XEH_preInit.sqf +++ b/addons/arsenal/XEH_preInit.sqf @@ -14,9 +14,13 @@ PREP_RECOMPILE_END; [QGVAR(enableIdentityTabs), "CHECKBOX", localize LSTRING(enableIdentityTabsSettings), localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; // Arsenal loadouts -[QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; -[QGVAR(allowSharedLoadouts), "CHECKBOX", localize LSTRING(allowSharingSetting), localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; -[QGVAR(EnableRPTLog), "CHECKBOX", [LSTRING(printToRPTSetting), LSTRING(printToRPTTooltip)], localize LSTRING(settingCategory), false, false] call CBA_fnc_addSetting; +[QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], [localize LSTRING(settingCategory), localize LSTRING(loadoutSubcategory)], true, true] call CBA_fnc_addSetting; +[QGVAR(allowSharedLoadouts), "CHECKBOX", localize LSTRING(allowSharingSetting), [localize LSTRING(settingCategory), localize LSTRING(loadoutSubcategory)], true, true] call CBA_fnc_addSetting; +[QGVAR(EnableRPTLog), "CHECKBOX", [LSTRING(printToRPTSetting), LSTRING(printToRPTTooltip)], [localize LSTRING(settingCategory), localize LSTRING(loadoutSubcategory)], false, false] call CBA_fnc_addSetting; + +[QGVAR(loadoutsSaveFace), "CHECKBOX", localize LSTRING(loadoutsSaveFaceSetting), [localize LSTRING(settingCategory), localize LSTRING(loadoutSubcategory)], false] call CBA_fnc_addSetting; +[QGVAR(loadoutsSaveVoice), "CHECKBOX", localize LSTRING(loadoutsSaveVoiceSetting), [localize LSTRING(settingCategory), localize LSTRING(loadoutSubcategory)], false] call CBA_fnc_addSetting; +[QGVAR(loadoutsSaveInsignia), "CHECKBOX", localize LSTRING(loadoutsSaveInsigniaSetting), [localize LSTRING(settingCategory), localize LSTRING(loadoutSubcategory)], true] call CBA_fnc_addSetting; [QGVAR(statsToggle), { params ["_display", "_showStats"]; diff --git a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf index 2ec3b9c80d..648a131a43 100644 --- a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf +++ b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf @@ -6,7 +6,7 @@ * * Arguments: * 0: Name of loadout - * 1: getUnitLoadout array + * 1: CBA extended loadout or getUnitLoadout array * * Return Value: * None @@ -17,7 +17,15 @@ * Public: Yes */ -params [["_name", "", [""]], ["_loadout", [], [[]], 10]]; +params [["_name", "", [""]], ["_loadout", [], [[]]]]; + +private _extendedInfo = createHashMap; +if (count _loadout == 2) then { + _extendedInfo = _loadout select 1; + _loadout = _loadout select 0; +}; + +if (count _loadout != 10) exitWith {}; if (isNil QGVAR(defaultLoadoutsList)) then { GVAR(defaultLoadoutsList) = []; @@ -36,7 +44,7 @@ for "_dataIndex" from 0 to 10 do { if (_weapon != "") then { private _baseWeapon = _weapon call BIS_fnc_baseWeapon; - if (_weapon != _baseWeapon) then { + if (_weapon != _baseWeapon) then { (_loadout select _dataIndex) set [0, _baseWeapon]; }; }; @@ -71,7 +79,7 @@ for "_dataIndex" from 0 to 10 do { private _baseWeapon = _weapon call BIS_fnc_baseWeapon; if (_weapon != _baseWeapon) then { - (_x select 0)set [0, _baseWeapon]; + (_x select 0) set [0, _baseWeapon]; }; }; }; @@ -100,7 +108,7 @@ for "_dataIndex" from 0 to 10 do { private _loadoutIndex = (+(GVAR(defaultLoadoutsList))) findIf {(_x select 0) == _name}; if (_loadoutIndex == -1) then { - GVAR(defaultLoadoutsList) pushBack [_name, _loadout]; + GVAR(defaultLoadoutsList) pushBack [_name, [_loadout, _extendedInfo]]; } else { - GVAR(defaultLoadoutsList) set [_loadoutIndex, [_name, _loadout]]; + GVAR(defaultLoadoutsList) set [_loadoutIndex, [_name, [_loadout, _extendedInfo]]]; }; diff --git a/addons/arsenal/functions/fnc_addRightPanelButton.sqf b/addons/arsenal/functions/fnc_addRightPanelButton.sqf index e09aef4c9e..7d4ecd0d98 100644 --- a/addons/arsenal/functions/fnc_addRightPanelButton.sqf +++ b/addons/arsenal/functions/fnc_addRightPanelButton.sqf @@ -9,10 +9,10 @@ * 0: items only misc items * 1: tooltip (Optional) * 2: picture path (Optional) - * 3: override a spezific button (0-9) (Optional) + * 3: override a specific button (0-9) (Optional) * * Return Value: - * successful: number of the slot; error: -1 + * successful: number of the slot (0-9); error: -1 * * Example: * [["ACE_bloodIV_500", "ACE_Banana"], "MedicalStuff", "\z\ace\addons\arsenal\data\iconCustom.paa", 5] call ace_arsenal_fnc_addRightPanelButton diff --git a/addons/arsenal/functions/fnc_buttonExport.sqf b/addons/arsenal/functions/fnc_buttonExport.sqf index 86caf418e3..3ff75be824 100644 --- a/addons/arsenal/functions/fnc_buttonExport.sqf +++ b/addons/arsenal/functions/fnc_buttonExport.sqf @@ -43,7 +43,7 @@ if (GVAR(shiftState)) then { [_display, localize LSTRING(exportDefault)] call FUNC(message); } else { - private _export = str getUnitLoadout GVAR(center); + private _export = str ([GVAR(center)] call FUNC(getLoadout)); "ace_clipboard" callExtension (_export + ";"); "ace_clipboard" callExtension "--COMPLETE--"; diff --git a/addons/arsenal/functions/fnc_buttonImport.sqf b/addons/arsenal/functions/fnc_buttonImport.sqf index 4a06f3edeb..4bc633874c 100644 --- a/addons/arsenal/functions/fnc_buttonImport.sqf +++ b/addons/arsenal/functions/fnc_buttonImport.sqf @@ -39,8 +39,9 @@ if (GVAR(shiftState) && {is3DEN}) then { set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; } else { - if (count _data == 10) then { - GVAR(center) setUnitLoadout _data; + private _count = count _data; + if (_count == 10 || { _count == 2 }) then { + [GVAR(center), _data] call CBA_fnc_setLoadout; GVAR(currentItems) = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", [], [], [], [], [], []]; for "_index" from 0 to 15 do { @@ -92,8 +93,19 @@ if (GVAR(shiftState) && {is3DEN}) then { call FUNC(updateUniqueItemsList); // Reapply insignia - [GVAR(center), ""] call bis_fnc_setUnitInsignia; - [GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia; + if (QGVAR(insignia) in _loadout#1) then { + GVAR(currentInsignia) = _loadout#1 getOrDefault [QGVAR(insignia), ""]; + } else { + [GVAR(center), ""] call bis_fnc_setUnitInsignia; + [GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia; + }; + + if (QGVAR(face) in _loadout#1) then { + GVAR(currentFace) = _loadout#1 getOrDefault [QGVAR(face), GVAR(currentFace)]; + }; + if (QGVAR(voice) in _loadout#1) then { + GVAR(currentVoice) = _loadout#1 getOrDefault [QGVAR(voice), GVAR(currentVoice)]; + }; [_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf index 0a2faccc54..40e84b01f0 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf @@ -34,7 +34,7 @@ private _loadout = switch GVAR(currentLoadoutsTab) do { }; }; -GVAR(center) setUnitLoadout [_loadout, true]; +[GVAR(center), _loadout, true] call CBA_fnc_setLoadout; GVAR(currentItems) = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", [], [], [], [], [], []]; for "_index" from 0 to 15 do { @@ -91,9 +91,21 @@ for "_index" from 0 to 15 do { call FUNC(updateUniqueItemsList); // Reapply insignia -[GVAR(center), ""] call bis_fnc_setUnitInsignia; -[GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia; +if (QGVAR(insignia) in _loadout#1) then { + GVAR(currentInsignia) = _loadout#1 getOrDefault [QGVAR(insignia), ""]; +} else { + [GVAR(center), ""] call bis_fnc_setUnitInsignia; + [GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia; +}; + +if (QGVAR(face) in _loadout#1) then { + GVAR(currentFace) = _loadout#1 getOrDefault [QGVAR(face), GVAR(currentFace)]; +}; +if (QGVAR(voice) in _loadout#1) then { + GVAR(currentVoice) = _loadout#1 getOrDefault [QGVAR(voice), GVAR(currentVoice)]; +}; [(findDisplay IDD_ace_arsenal), [localize LSTRING(loadoutLoaded), _loadoutName] joinString " "] call FUNC(message); -[QGVAR(onLoadoutLoad), [_loadout, _loadoutName]] call CBA_fnc_localEvent; +[QGVAR(onLoadoutLoad), [_loadout#0, _loadoutName]] call CBA_fnc_localEvent; +[QGVAR(onLoadoutLoadExtended), [_loadout, _loadoutName]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf index a1f9294669..bcb230d3ae 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf @@ -35,16 +35,17 @@ if (count _similarLoadouts > 0) exitWith { // Update loadout info in profile / 3DEN and list namespaces private _loadoutToRename = (_data select {_x select 0 == _loadoutName}) select 0; -(_contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab))) params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"]; +(_contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab))) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"]; _data set [_data find _loadoutToRename, [_editBoxContent, (_loadoutToRename select 1)]]; _contentPanelCtrl setVariable [_loadoutName + str GVAR(currentLoadoutsTab), nil]; -_contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_loadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]]; +_contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_extendedLoadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]]; // Add new row _contentPanelCtrl lnbDeleteRow _curSelRow; private _newRow = _contentPanelCtrl lnbAddRow ["",_editBoxContent]; +_extendedLoadout params ["_loadout"]; ADD_LOADOUTS_LIST_PICTURES if (_nullItemsAmount > 0) then { diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf index 0827ec2c31..d4d5b00a4b 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf @@ -31,7 +31,8 @@ private _cursSelRow = lnbCurSelRow _contentPanelCtrl; private _loadoutName = _contentPanelCtrl lnbText [_cursSelRow, 1]; private _curSelLoadout = (_contentPanelCtrl getVariable (_loadoutName + str GVAR(currentLoadoutsTab))) select 0; -private _loadout = getUnitLoadout GVAR(center); +private _extendedLoadout = GVAR(center) call FUNC(getLoadout); +private _loadout = _loadout select 0; private _loadoutIndex = _data findIf {(_x select 0) == _editBoxContent}; private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars); @@ -62,7 +63,7 @@ switch (GVAR(currentLoadoutsTab)) do { if (_weapon != "") then { private _baseWeapon = _weapon call BIS_fnc_baseWeapon; - if (_weapon != _baseWeapon) then { + if (_weapon != _baseWeapon) then { (_loadout select _dataIndex) set [0, _baseWeapon]; }; }; @@ -135,9 +136,9 @@ switch (GVAR(currentLoadoutsTab)) do { }; if (_loadoutIndex isEqualto -1) then { - _data pushBack [_editBoxContent, _loadout]; + _data pushBack [_editBoxContent, _extendedLoadout]; } else { - _data set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _loadout]]; + _data set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _extendedLoadout]]; }; // Delete "old" loadout row @@ -149,7 +150,7 @@ switch (GVAR(currentLoadoutsTab)) do { ADD_LOADOUTS_LIST_PICTURES - _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_loadout] call FUNC(verifyLoadout)]; + _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_extendedLoadout] call FUNC(verifyLoadout)]; _contentPanelCtrl lnbSort [1, false]; @@ -243,9 +244,9 @@ switch (GVAR(currentLoadoutsTab)) do { }; if (_loadoutIndex == -1) then { - GVAR(defaultLoadoutsList) pushBack [_editBoxContent, _loadout]; + GVAR(defaultLoadoutsList) pushBack [_editBoxContent, _extendedLoadout]; } else { - GVAR(defaultLoadoutsList) set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _loadout]]; + GVAR(defaultLoadoutsList) set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _extendedLoadout]]; }; for '_i' from 0 to (((lnbsize _contentPanelCtrl) select 0) - 1) do { @@ -256,7 +257,7 @@ switch (GVAR(currentLoadoutsTab)) do { ADD_LOADOUTS_LIST_PICTURES - _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_loadout] call FUNC(verifyLoadout)]; + _contentPanelCtrl setVariable [_editBoxContent + str GVAR(currentLoadoutsTab), [_extendedLoadout] call FUNC(verifyLoadout)]; _contentPanelCtrl lnbSort [1, false]; @@ -295,4 +296,5 @@ switch (GVAR(currentLoadoutsTab)) do { }; [(findDisplay IDD_ace_arsenal), [localize LSTRING(loadoutSaved), _editBoxContent] joinString " "] call FUNC(message); private _savedLoadout = (_data select {_x select 0 == _editBoxContent}) select 0; -[QGVAR(onLoadoutSave), [_data find _savedLoadout, _savedLoadout]] call CBA_fnc_localEvent; +[QGVAR(onLoadoutSave), [_data find _savedLoadout, _savedLoadout#0]] call CBA_fnc_localEvent; +[QGVAR(onLoadoutSaveExtended), [_data find _savedLoadout, _savedLoadout]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_fillLoadoutsList.sqf b/addons/arsenal/functions/fnc_fillLoadoutsList.sqf index 7cdec585e7..ba47cc54fc 100644 --- a/addons/arsenal/functions/fnc_fillLoadoutsList.sqf +++ b/addons/arsenal/functions/fnc_fillLoadoutsList.sqf @@ -44,7 +44,7 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then { [_loadoutData] call FUNC(verifyLoadout) } else { _loadoutCachedInfo - } params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"]; + } params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"]; // Log missing / nil items to RPT if (GVAR(EnableRPTLog) && {isNil "_loadoutCachedInfo"} && {(_nullItemsAmount > 0) || {_unavailableItemsAmount > 0}}) then { @@ -64,6 +64,7 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then { private _newRow = _contentPanelCtrl lnbAddRow ["",_loadoutName]; + _extendedLoadout params ["_loadout"]; ADD_LOADOUTS_LIST_PICTURES if (_nullItemsAmount > 0) then { @@ -76,7 +77,7 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then { }; }; - _contentPanelCtrl setVariable [_loadoutName + str GVAR(currentLoadoutsTab), [_loadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]]; + _contentPanelCtrl setVariable [_loadoutName + str GVAR(currentLoadoutsTab), [_extendedLoadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]]; if ((profileName + _loadoutName) in _sharedLoadoutsVars && {GVAR(currentLoadoutsTab) == IDC_buttonMyLoadouts}) then { _contentPanelCtrl lnbSetPicture [[_newRow, 0], QPATHTOF(data\iconPublic.paa)]; @@ -99,11 +100,12 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then { [QGVAR(loadoutUnshared), [_contentPanelCtrl, profileName, _loadoutName]] call CBA_fnc_remoteEvent; } else { - ([_loadoutData] call FUNC(verifyLoadout)) params ["_loadout", "_nullItemsAmount", "_unavailableItemsAmount"]; + ([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"]; _contentPanelCtrl lnbSetColumnsPos [0, 0.15, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90]; private _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName]; + _extendedLoadout params ["_loadout"]; ADD_LOADOUTS_LIST_PICTURES _contentPanelCtrl lnbSetData [[_newRow, 1], _playerName + _loadoutName]; diff --git a/addons/arsenal/functions/fnc_fillRightPanel.sqf b/addons/arsenal/functions/fnc_fillRightPanel.sqf index 436c448300..281662ec0c 100644 --- a/addons/arsenal/functions/fnc_fillRightPanel.sqf +++ b/addons/arsenal/functions/fnc_fillRightPanel.sqf @@ -89,7 +89,7 @@ private _compatibleMagazines = [[[], []], [[], []], [[], []]]; // Magazine groups { - private _magazineGroups = uiNamespace getVariable [QGVAR(magazineGroups),["#CBA_HASH#",[],[],[]]]; + private _magazineGroups = uiNamespace getVariable [QGVAR(magazineGroups), createHashMap]; private _magArray = _magazineGroups get (toLower _x); {((_compatibleMagazines select _index) select _subIndex) pushBackUnique _x} forEach _magArray; } foreach ([getArray (_weaponConfig >> _x >> "magazineWell"), getArray (_weaponConfig >> "magazineWell")] select (_x == "this")); diff --git a/addons/arsenal/functions/fnc_getLoadout.sqf b/addons/arsenal/functions/fnc_getLoadout.sqf new file mode 100644 index 0000000000..017ef29618 --- /dev/null +++ b/addons/arsenal/functions/fnc_getLoadout.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: Brett Mayson + * Get the extended loadout of a unit, including identity options if enabled + * + * Arguments: + * 0: Unit + * + * Return Value: + * CBA Extended Loadout + * + * Example: + * [_unit] call ace_arsenal_fnc_getLoadout + * + * Public: Yes +*/ + +params [["_unit", objNull, [objNull]]]; + +if (isNull _unit) exitWith {}; + +([_unit] call CBA_fnc_getLoadout) params ["_loadout", "_extendedInfo"]; + +if (GVAR(loadoutsSaveFace)) then { + _extendedInfo set [QGVAR(face), face _unit]; +}; +if (GVAR(loadoutsSaveVoice)) then { + _extendedInfo set [QGVAR(voice), speaker _unit]; +}; +if (GVAR(loadoutsSaveInsignia)) then { + private _insignia = _unit getVariable ["BIS_fnc_setUnitInsignia_class", ""]; + if (_insignia != "") then { + _extendedInfo set [QGVAR(insignia), _insignia]; + }; +}; + +[_loadout, _extendedInfo] diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf index 328c1da1f2..754512f5d4 100644 --- a/addons/arsenal/functions/fnc_onArsenalClose.sqf +++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf @@ -32,7 +32,7 @@ if (is3DEN) then { // Apply the loadout from the dummy to all selected units if (_exitCode == 1) then { { - _x setUnitLoadout (getUnitLoadout GVAR(center)); + [_x, GVAR(center) call FUNC(getLoadout)] call CBA_fnc_setLoadout; } foreach (get3DENSelected "object"); save3DENInventory (get3DENSelected "object"); diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf index 34243a49f6..c69c7fbb17 100644 --- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf +++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf @@ -79,7 +79,7 @@ for "_index" from 0 to 14 do { }; if ((_array select 2) isNotEqualTo "") then { - ((GVAR(virtualItems) select _index) select 2) pushBackUnique (_array select 2); + ((GVAR(virtualItems) select _index) select 2) pushBackUnique (_array select 2); }; }; diff --git a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf index 3f1ca14b87..be93fec83e 100644 --- a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf @@ -29,10 +29,15 @@ private _containerDefaultRightPanel = _display displayCtrl IDC_buttonMisc; private _selectCorrectPanelContainer = [_containerDefaultRightPanel, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ITEMS_IDCS]}); private _fnc_clearPreviousWepMags = { - private _compatibleMags = getArray (configfile >> "cfgweapons" >> _baseWeapon >> "magazines"); + private _compatibleMagsBaseWeapon = [_baseWeapon, true] call CBA_fnc_compatibleMagazines; + + if (_item != "") then { + _compatibleMagsBaseWeapon = _compatibleMagsBaseWeapon select {!(_x in _compatibleMags)}; + }; + { GVAR(center) removeMagazines _x; - } foreach _compatibleMags; + } foreach _compatibleMagsBaseWeapon; GVAR(currentItems) set [15, uniformItems GVAR(center)]; GVAR(currentItems) set [16, vestItems GVAR(center)]; @@ -54,14 +59,15 @@ switch (GVAR(currentLeftPanel)) do { TOGGLE_RIGHT_PANEL_HIDE } else { if ((GVAR(currentItems) select 0) != _item && {_baseWeapon != _item}) then { - call _fnc_clearPreviousWepMags; - private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; private _cfgMags = configFile >> "CfgMagazines"; private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; - GVAR(center) addWeapon _item; + + call _fnc_clearPreviousWepMags; + + [GVAR(center), _item] call CBA_fnc_addWeaponWithoutItems; if (_compatibleMags isNotEqualTo []) then { - GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + GVAR(center) addWeaponItem [_item, [_compatibleMags select 0], true]; }; { @@ -96,14 +102,15 @@ switch (GVAR(currentLeftPanel)) do { TOGGLE_RIGHT_PANEL_HIDE } else { if ((GVAR(currentItems) select 2) != _item && {_baseWeapon != _item}) then { - call _fnc_clearPreviousWepMags; - private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; private _cfgMags = configFile >> "CfgMagazines"; private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; - GVAR(center) addWeapon _item; + + call _fnc_clearPreviousWepMags; + + [GVAR(center), _item] call CBA_fnc_addWeaponWithoutItems; if (_compatibleMags isNotEqualTo []) then { - GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + GVAR(center) addWeaponItem [_item, [_compatibleMags select 0], true]; }; { @@ -137,14 +144,15 @@ switch (GVAR(currentLeftPanel)) do { TOGGLE_RIGHT_PANEL_HIDE } else { if ((GVAR(currentItems) select 1) != _item && {_baseWeapon != _item}) then { - call _fnc_clearPreviousWepMags; - private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x}; private _cfgMags = configFile >> "CfgMagazines"; private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; - GVAR(center) addWeapon _item; + + call _fnc_clearPreviousWepMags; + + [GVAR(center), _item] call CBA_fnc_addWeaponWithoutItems; if (_compatibleMags isNotEqualTo []) then { - GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; + GVAR(center) addWeaponItem [_item, [_compatibleMags select 0], true]; }; { diff --git a/addons/arsenal/functions/fnc_onSelChangedRight.sqf b/addons/arsenal/functions/fnc_onSelChangedRight.sqf index 38e051b4e2..7c1cb813e0 100644 --- a/addons/arsenal/functions/fnc_onSelChangedRight.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedRight.sqf @@ -33,7 +33,7 @@ private _fnc_selectItem = { private _primaryMags = primaryWeaponMagazine GVAR(center); GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + ([_primaryMags + [""], _primaryMags] select (count _primaryMags > 1))]; } else { - GVAR(center) addPrimaryWeaponItem _item; + GVAR(center) addWeaponItem [primaryWeapon GVAR(center), _item, true]; private _primaryMags = primaryWeaponMagazine GVAR(center); GVAR(currentItems) set [18, (primaryWeaponItems GVAR(center)) + ([_primaryMags + [""], _primaryMags] select (count _primaryMags > 1))]; }; @@ -47,7 +47,7 @@ private _fnc_selectItem = { private _secondaryMags = secondaryWeaponMagazine GVAR(center); GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + ([_secondaryMags + [""], _secondaryMags] select (count _secondaryMags > 1))]; } else { - GVAR(center) addSecondaryWeaponItem _item; + GVAR(center) addWeaponItem [secondaryWeapon GVAR(center), _item, true]; private _secondaryMags = secondaryWeaponMagazine GVAR(center); GVAR(currentItems) set [19, (secondaryWeaponItems GVAR(center)) + ([_secondaryMags + [""], _secondaryMags] select (count _secondaryMags > 1))]; }; @@ -60,7 +60,7 @@ private _fnc_selectItem = { private _handgunMags = handgunMagazine GVAR(center); GVAR(currentItems) set [20, (handgunItems GVAR(center)) + ([_handgunMags + [""], _handgunMags] select (count _handgunMags > 1))]; } else { - GVAR(center) addHandgunItem _item; + GVAR(center) addWeaponItem [handgunWeapon GVAR(center), _item, true]; private _handgunMags = handgunMagazine GVAR(center); GVAR(currentItems) set [20, (handgunItems GVAR(center)) + ([_handgunMags + [""], _handgunMags] select (count _handgunMags > 1))]; }; diff --git a/addons/arsenal/functions/fnc_verifyLoadout.sqf b/addons/arsenal/functions/fnc_verifyLoadout.sqf index bacd6a11b3..e50a583a75 100644 --- a/addons/arsenal/functions/fnc_verifyLoadout.sqf +++ b/addons/arsenal/functions/fnc_verifyLoadout.sqf @@ -5,7 +5,7 @@ * Verify the provided loadout. * * Arguments: - * 0: Loadout (getUnitLoadout format) + * 0: Loadout (CBA Extended Loadout or getUnitLoadout format) * * Return Value: * Verified loadout and missing / unavailable items list and count @@ -15,6 +15,14 @@ params ["_loadout"]; +private _extendedInfo = createHashMap; + +// Check if the provided loadout is a CBA extended loadout +if (count _loadout == 2) then { + _extendedInfo = _loadout select 1; + _loadout = _loadout select 0; +}; + private _weaponCfg = configFile >> "CfgWeapons"; private _magCfg = configFile >> "CfgMagazines"; private _vehcCfg = configFile >> "CfgVehicles"; @@ -236,4 +244,4 @@ for "_dataIndex" from 0 to 9 do { }; }; -[_loadout, _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList] +[[_loadout, _extendedInfo], _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList] diff --git a/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf b/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf index 5b24421c20..8b5f85fba6 100644 --- a/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf +++ b/addons/arsenal/missions/Arsenal.VR/XEH_postInit.sqf @@ -54,7 +54,7 @@ cba_diagnostic_projectileMaxLines = 10; ] call BIS_fnc_GUImessage; if (_return) then { - profileNamespace setVariable [QGVAR(missionLastLoadout), getUnitLoadout player]; + profileNamespace setVariable [QGVAR(missionLastLoadout), [player] call CBA_fnc_getLoadout]; _display closeDisplay 2; findDisplay 46 closeDisplay 0; }; diff --git a/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf b/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf index 111202d04e..7e03a58b08 100644 --- a/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf +++ b/addons/arsenal/missions/Arsenal.VR/initPlayerLocal.sqf @@ -5,7 +5,7 @@ params ["_unit"]; private _loadout = profileNamespace getVariable QGVAR(missionLastLoadout); if (!isNil "_loadout") then { - _unit setUnitLoadout _loadout; + [_unit, _loadout] call CBA_fnc_setLoadout; }; _unit allowDamage false; diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index edcf637ce2..ddb2313c8e 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -27,7 +27,7 @@ Nascondi interfaccia 인터페이스 숨기기 隱藏介面 - 隐藏介面 + 隐藏界面 Скрыть интерфейс Oculta a Interface Skrýt rozhraní @@ -43,7 +43,7 @@ Equipaggiamenti 로드아웃 裝備 - 装备 + 负载 Комплекты Loadouts Sady vybavení @@ -59,7 +59,7 @@ Esporta 내보내기 匯出 - 汇出 + 导出 Экспорт Exportar Export @@ -75,7 +75,7 @@ Importa 가져오기 匯入 - 汇入 + 导入 Импорт Importar Import @@ -139,7 +139,7 @@ Salva l'equipaggiamento corrente 현재 로드아웃 저장 保存當前的裝備 - 保存当前的装备 + 保存当前的负载 Сохранить текущий комплект экипировки Salva o loadout atual Uložit současnou sadu vybavení @@ -155,9 +155,11 @@ [Shift+Clique para salvar nos padrões da missão] [Shift+Clic pour enregistrer en tant qu'équipement prédéfini.] [Shift+左鍵來保存至任務預設] + [Shift+左鍵 以保存至任务默认值] [Shift+Click per salvare la missione con gli equipaggiamenti predefiniti] [Shift+Klik pro uložení jako standardního vybavení pro misi] [Shift+Click varsayılan kıyafetlere kaydet] + [쉬프트+클릭 하여 임무 기본으로 설정] Rename the selected loadout @@ -169,7 +171,7 @@ Rinomina l'equipaggiamento selezionato 선택한 로드아웃의 이름 바꾸기 重新命名當前選擇的裝備 - 重新命名当前选择的装备 + 重命名当前选择的负载 Переименовать выбранный комплект экипировки Renomeia o loadout selecionado Přejmenovat vybranou sadu vybavení @@ -201,7 +203,7 @@ Carica l'equipaggiamento selezionato 선택한 로드아웃 불러오기 載入當前選擇的裝備 - 载入当前选择的装备 + 载入当前选择的负载 Загрузить выбранный комплект экипировки Carrega o loadout selecionado Nahrát vybranou sadu vybavení @@ -233,7 +235,7 @@ Elimina l'equipaggiamento selezionato 선택한 로드아웃 삭제하기 刪除當前選擇的裝備 - 删除当前选择的装备 + 删除当前选择的负载 Удалить выбранный комплект экипировки Apaga o loadout selecionado Smazat vybranou sadu vybavení @@ -249,7 +251,7 @@ I miei equipaggiamenti 내 로드아웃 我的裝備 - 我的装备 + 我的负载 Мои комплекты Meus loadouts Moje sady vybavení @@ -265,7 +267,7 @@ Gli equipaggiamenti salvati nel tuo profilo 프로필에 저장된 로드아웃 裝備已保存到你的設定檔中 - 装备已保存到你的设定档中 + 负载已保存到你的档案中 Комплекты экипировки, сохраненные в вашем профиле Loadouts salvos em seu perfil Sadz vybavení uložené ve vašem profilu @@ -281,7 +283,7 @@ Equipaggiamenti standard 기본 로드아웃 預設裝備 - 预设装备 + 默认负载 По умолчанию Loadouts padrões Standardní sady vybavení @@ -297,7 +299,7 @@ Equipaggiamenti resi disponibili dal creatore della missione 미션메이커가 허용한 로드아웃 任務作者提供的預設裝備 - 任务作者提供的预设装备 + 任务作者提供的负载 Комплекты экипировки, предоставляемые создателем миссии Loadouts definidos pelo criador da missão Sady vybavení od autora mise @@ -313,7 +315,7 @@ Equipaggiamenti pubblici 공용 로드아웃 公用裝備 - 公用装备 + 公用负载 Публичные комплекты Loadouts públicos Veřejné sady vybavení @@ -329,7 +331,7 @@ Equipaggiamenti condivisi da te e da altri giocatori 플레이어들이 공유하는 로드아웃 由你與其他玩家分享的裝備配置 - 由你与其他玩家分享的装备配置 + 你和其他玩家分享的负载配置 Комплекты экипировки, опубликованные вами и другими игроками Loadouts compartilhados por você ou outros jogadores Sady vybavení sdílené vámi a ostatními hráči @@ -343,7 +345,7 @@ Sortuj wg wagi 重量で並び替え Ordina per peso - 무게로 정렬 + 무게 순서로 정렬 以重量排序 以重量排序 Сортировка по весу @@ -359,7 +361,7 @@ Sortuj wg ilości 量で並び替え Ordina per quantitativo - 갯수로 정렬 + 갯수 순서로 정렬 以數量排序 以数量排序 Сортировка по количеству @@ -375,6 +377,8 @@ Ordenar por capacidad Сортировка по вместимости Sortuj po rozmiarze + 공간 순서로 정렬 + 以容量排序 Sort by accuracy @@ -385,6 +389,8 @@ Ordenar por precisión Сортировка по точности Sortuj po celności + 정확도 순서로 정렬 + 以精度排序 Sort by rate of fire @@ -395,6 +401,8 @@ Ordenar por cadencia de tiro Сортировка по темпу стрельбы Sortuj po szybkostrzelności + 발사속도 순서로 정렬 + 以射速排序 Sort by magnification @@ -404,6 +412,8 @@ Ordenar por magnificación Сортировка по кратности приближения Sortuj po przybliżeniu + 배율 순서로 정렬 + 以放大倍数排序 Sort by ammo count @@ -414,6 +424,8 @@ Ordenar por cantidad de munición Сортировка по количеству боеприпасов Sortuj po ilości amunicji + 총알 갯수 순서롤 정렬 + 以弹量排序 Sort by ballistic protection @@ -423,6 +435,8 @@ Сортировка по баллистической защите Sortuj po ochronie balistycznej Nach ballistischem Schutz sortieren + 방탄 성능 순서로 정렬 + 以防弹性能排序 Sort by explosive protection @@ -432,6 +446,8 @@ Сортировка по защите от взрывов Sortuj po ochronie przeciw wybuchom Nach Explosionsschutz sortieren + 방폭 성능 순서로 정렬 + 以防爆性能排序 Share or stop sharing the selected loadout @@ -441,9 +457,9 @@ Udostępnij lub przestań udostępniać wybrany zestaw 選択した装備の共有設定 Condividi o smetti di condividere l'equipaggiamento selezionato - 선택한 로드아웃 공유 혹은 공유중지 + 선택한 로드아웃 공유 혹은 공유 중지 開始/停止分享當前選擇的裝備 - 开始/停止分享当前选择的装备 + 开始/停止分享当前选择的负载 Открыть или закрыть общий доступ к комплекту экипировки Compartilhar ou parar de compartilhar o loadout selecionado Sdílet nebo přestat sdílet vybranou sadu vybavení @@ -491,7 +507,7 @@ La lista degli equipaggiamenti standard è vuota! 기본 로드아웃 목록이 비어있습니다! 沒有預設的裝備清單! - 没有预设的装备清单! + 没有默认负载清单! Список комплекта экипировки пуст! A lista de loadouts padrões está vazia! Seznam standardních sad vybavení je prázdný! @@ -507,7 +523,7 @@ La lista degli equipaggiamenti standard è stata esportata negli appunti 클립보드에 기본 로드아웃 목록 내보내기 預設的裝備清單已匯出到剪貼簿中 - 预设的装备清单已汇出到剪贴簿中 + 默认负载清单已导出到剪贴板 Список комплекта экипировки по умолчанию экспортирован в буфер A lista de loadouts padrões foi exportada pra área de transferência Seznam standardních sad vybavení byl exportován do schránky @@ -523,7 +539,7 @@ Equipaggiamento corrente esportato negli appunti 현재 로드아웃을 클립보드로 내보냈습니다. 當前的裝備已匯出到剪貼簿中 - 当前的装备已汇出到剪贴簿中 + 当前负载已导出到剪贴板 Текущий список комплекта экипировки экспортирован в буфер Loadout atual foi exportado pra área de transferência Současná sada vybavení byla exportována do schránky @@ -555,7 +571,7 @@ La lista degli equipaggiamenti standard è stata importata dagli appunti 클립보드에서 기본 로드아웃 가져오기 預設的裝備清單已從剪貼簿中匯入 - 预设的装备清单已从剪贴簿中汇入 + 默认负载已从剪贴板导入 Список комплекта экипировки по умолчанию импортирован из буфера A lista de loadouts padrões foi importada da área de transferência Seznam standardních sad vybavení byl importován ze schránky @@ -571,7 +587,7 @@ Equipaggiamento importato dagli appunti 클립보드에서 로드아웃을 가져왔습니다. 裝備已從剪貼簿中匯入 - 装备已从剪贴簿中汇入 + 负载已从剪贴板中导入 Список комплекта экипировки импортирован из буфера Loadout importado da área de transferência Sada vybavení byla importována ze schránky @@ -587,7 +603,7 @@ Il seguente equipaggiamento è stato eliminato: 다음 로드아웃이 삭제됨 : 以下的裝備已被刪除: - 以下的装备已被删除: + 以下的负载已被删除: Удален комплект экипировки: O seguinte loadout foi apagado: Tato sada vybavení byla smazána: @@ -603,7 +619,7 @@ Il seguente equipaggiamento non è più pubblico: 다음 로드아웃이 더이상 공용이 아님: 以下的裝備已不再被分享: - 以下的装备已不再被分享: + 以下的负载已不再被分享: Этот комплект экипировки больше не публичный: O seguinte loadout não é mais público: Tato sada vybavení již není veřejná: @@ -619,7 +635,7 @@ Il campo del nome è vuoto! 이름칸이 비었습니다! 名稱欄位為空! - 名称栏位为空! + 名称栏位为空! Поле имени пустое! O nome não pode estar vazio! Pole "Jméno" je prázdné! @@ -635,7 +651,7 @@ Sei l'autore di questo equipaggiamento 이 로드아웃의 제작자입니다. 你是這個裝備的作者 - 你是这个装备的作者 + 你是这个负载的作者 Вы автор этого комплекта экипировки Você é o autor desse loadout Jste autorem této sady vybavení @@ -651,7 +667,7 @@ Un tuo equipaggiamento con lo stesso nome è pubblico 같은 이름의 로드아웃이 공용에 있습니다. 已有相同名稱的裝備在公用分享區 - 已有相同名称的装备在公用分享区 + 已有相同名称的负载在公用分享区 Ваш комплект экипировки с таким же именем является публичным Um loadout seu com o mesmo nome é público Vaše sada vybavení se stejným jménem je veřejná @@ -667,7 +683,7 @@ Il seguente equipaggiamento è stato salvato: 다음 로드아웃이 저장됨: 以下的裝備已被保存: - 以下的装备已被保存: + 以下的负载已被保存: Сохранен комплект экипировки: O seguinte loadout foi salvo: Tato sada vybavení byla uložena: @@ -683,7 +699,7 @@ Il seguente equipaggiamento è stato caricato: 다음 로드아웃을 불러옴: 以下的裝備已被載入: - 以下的装备已被载入: + 以下的负载已被载入: Загружен комплект экипировки: O seguinte loadout foi carregado: Tato sada vybavení byla načtena: @@ -699,7 +715,7 @@ Un equipaggiamento con lo stesso nome è gia esistente! 같은 이름의 로드아웃이 이미 존재합니다! 已有相同名稱的裝備! - 已有相同名称的装备! + 已有相同名称的负载! Комплект с таким именем уже существует! Um loadout com o mesmo nome já existe! Již existuje sada vybavení se stejným jménem! @@ -779,7 +795,7 @@ Consenti equipaggiamenti standard 기본 로드아웃 허용 允許預設裝備 - 允许预设装备 + 允许默认负载 Разрешить комплекты по умолчанию Permitir loadouts padrões Povolit standardní sady vybavení @@ -795,7 +811,7 @@ Consenti condivisione equipaggiamenti 로드아웃 공유 허용 允許分享裝備 - 允许分享装备 + 允许分享负载 Разрешить публикацию комплектов Permitir compartilhar loadouts Povolit sdílení sad vybavení @@ -827,7 +843,7 @@ 주무기 탄약 Primärmagazin 主要武器彈匣 - 主要武器弹匣 + 主武器弹匣 Основной магазин Carregador Primário Hlavní zásobník @@ -843,7 +859,7 @@ 보조무기 탄약 Sekundärmagazin 次要武器彈匣 - 次要武器弹匣 + 副武器弹匣 Вторичный магазин Carregador Secundário Vedlejší zásobník @@ -857,14 +873,30 @@ ACE Arsenał ACE 武器庫 ACE Arsenale - ACE 아스날 + ACE 무기고 ACE虛擬軍火庫 - ACE虚拟军火库 + ACE 虚拟军火库 ACE Арсенал ACE Arsenal ACE Arzenál ACE Arsenal + + Loadouts + Equipamiento + Sets d'équipement + Ausrüstungen + Zestawy wyposażenia + 装備 + Equipaggiamenti + 로드아웃 + 裝備 + 负载 + Комплекты + Loadouts + Sady vybavení + Kıyafetler + Allow the use of the default loadouts tab Permitir el uso de la pestaña de equipamientos por defecto @@ -875,7 +907,7 @@ 기본 로드아웃 탭 사용 허가 Erlaube die Nutzung des Standardausrüstungsreiters 允許使用預設的裝備 - 允许使用预设的装备 + 允许使用默认的负载 Разрешить использование вкладки комплектов экипировки по умолчанию Permite o uso da aba de loadouts padrões Povolit používání záložky standardních sad vybavení @@ -923,7 +955,7 @@ RPT에 누락 된 항목 / 사용할 수없는 항목 기록 Fehlende Gegenstände werden in der RPT aufgezeichnet 記錄遺失/無法使用的項目到RPT檔案中 - 记录遗失/无法使用的项目到RPT档案中 + 记录遗失/无法使用的项目到 RPT Вести журнал отсутствующих / недоступных предметов в RPT Registrar em log itens indisponíveis no RPT Zalogovat chybějící/nedostupné předměty do RPT logu @@ -938,7 +970,7 @@ ACE 武器庫を開けません ACE 아스날을 열 수 없음 無法開啟ACE虛擬軍火庫 - 无法开启ACE虚拟军火库 + 无法开启 ACE 虚拟军火库 Nie można otworzyć arsenału ACE Невозможно открыть ACE Арсенал Não foi possível abrir o ACE Arsenal @@ -951,9 +983,9 @@ Importer les sets BI VA dans l'arsenal ACE Importiert die BI-VA-Ausrüstungen in das ACE-Arsenal 標準の VA 装備から ACE 武器庫へ取り込み - 바닐라 로드아웃을 ace 아스날로 가져오기 + 바닐라 로드아웃을 ACE 아스날로 가져오기 匯入BI原廠虛擬軍火庫的裝備到ACE虛擬軍火庫中 - 汇入BI原厂虚拟军火库的装备到ACE虚拟军火库中 + 导入 BI 原版虚拟军火库的负载到 ACE 虚拟军火库中 Importa l'arsenale virtuale BI nell'arsenale ACE Importuj zestawy wyposażenia z wirtualnego arsenału BI do arsenału ACE Импорт комплектов из Арсенала BI в Арсенал ACE @@ -968,7 +1000,7 @@ プレイヤー ユニットがありません!ユニットを設置し"Player"と名付けてください。 플레이어 유닛을 사용할 수 없습니다! 유닛을 놓고 "플레이어"라고 표시하십시오. 沒有可用的玩家單位!請擺放一個單位並設定成"玩家" - 没有可用的玩家单位!请摆放一个单位并设定成"玩家"。 + 没有可用的玩家单位!请摆放一个单位并设定成“玩家”。 Non ci sono giocatori! Poisziona una unità e impostala come "Giocatore". Brak dostępnych jednostek gracza! Postaw jednostkę i oznacz ją jako "Gracz". Нет доступных игроков! Разместите юнит и отметьте его как «Игрок» @@ -981,9 +1013,9 @@ Aucun équipement à importer. Keine Ausrüstungen zum Importieren インポートする装備がありません。 - 가져올 로드 아웃이 없습니다. + 가져올 로드아웃이 없습니다. 沒有裝備被匯入 - 没有装备被汇入。 + 没有负载被导入。 Non ci sono equipaggiamenti da importare. Brak zestawów wyposażenia do zaimportowania. Нет комплектов для импорта @@ -996,9 +1028,9 @@ ACE Arsenal ACE-Arsenal ACE 武器庫 - ACE 아스날 + ACE 무기고 ACE虛擬軍火庫 - ACE虚拟军火库 + ACE 虚拟军火库 Arsenale ACE Arsenał ACE ACE Арсенал @@ -1012,9 +1044,9 @@ Volver al arsenal de ACE Zurück zum ACE-Arsenal. ACE 武器庫へ戻ります。 - ACE 아스날로 돌아가기 + ACE 무기고로 돌아가기 返回到ACE虛擬軍火庫 - 返回到ACE虚拟军火库。 + 返回到 ACE 虚拟军火库。 Torna all'arsenale ACE Wróć do arsenału ACE. Вернуться в ACE Арсенал @@ -1028,9 +1060,9 @@ Usar el arsenal de ACE para probar diferentes armas y equipamiento. Verwende ACE-Arsenal und sieh dir verschiedene Waffen und Ausrüstung an und probiere sie aus. 様々な武器と装備を試せるよう ACE 武器庫を使用します。 - ACE Arsenal을 사용하여 다른 무기와 장비를 시험해보십시오. + ACE 무기고를 사용하여 다른 무기와 장비를 시험해보십시오. 使用ACE虛擬軍火庫來嘗試不同的武器與裝備 - 使用ACE虚拟军火库来尝试不同的武器与装备。 + 使用 ACE 虚拟军火库来尝试不同的武器与装备。 Usa l'arsenale ACE per provare armi ed equipaggiamenti vari. Skorzystaj z arsenału ACE by wypróbować broń i ekwipunek. Используйте ACE Arsenal, чтобы опробовать различное оружие и снаряжение. @@ -1045,7 +1077,7 @@ 様々な武器と装備を試して、あなただけの装備を作成してください。 무기와 장비를 사용해보고 자신의 로드아웃을 만듭니다. 嘗試不同的武器與裝備來組合你個人的裝備配置 - 尝试不同的武器与装备来组合你个人的装备配置。 + 尝试不同的武器与装备来组合你个人的负载配置。 Prova armi ed equipaggiamenti e creai i tuoi equipaggiamenti personalizzati. Wypróbuj broń i ekwipunek i stwórz swoje własne zestawy wyposażenia. Опробуйте оружие и снаряжение, создавайте собственные комплекты экипировки. @@ -1059,7 +1091,7 @@ Öffnet das Ausrüstungsmenü Affiche les sets d'équipement. 開啟裝備選單 - 开启装备选单 + 开启负载菜单 装備画面を開く Apri la pagina degli equipaggiamenti Otwórz ekran zestawów @@ -1067,6 +1099,7 @@ Abre a tela de loadouts Otevřít obrazovku se sadami vybavení Kıyafetler ekranını aç + 로드아웃 화면 열기 Export current / default loadouts @@ -1074,13 +1107,14 @@ Exportiert aktuelles / standard Loadout Exporte le set d'équipement actuel/les sets prédéfinis. 匯出當前/預設的裝備 - 汇出当前/预设的装备 + 导出当前/预设的装备 現在/標準装備をエクスポートします Esporta l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base Eksportuj obecne / domyślne zestawy wyposażenia Экспорт комплектов экипировки Exporta loadout atual / loadouts padrões Exportovat současný/standardní sady vybavení + 현재/기본 로드아웃을 내보냅니다 Import current / default loadouts @@ -1088,13 +1122,14 @@ Importiert aktuelles / standard Loadout Importe le set d'équipement actuel/les sets prédéfinis. 匯入當前/預設的裝備 - 汇入当前/预设的装备 + 导入当前/预设的负载 現在/標準装備をインポートします Importa l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base Importuj obecne / domyślne zestawy wyposażenia Импорт комплектов экипировки Importa loadout atual / loadouts padrões Importovat současný/standardní sady vybavení + 현재/기본 로드아웃 을 불러옵니다 Potassium levels @@ -1110,6 +1145,7 @@ Úrovně draslíku Potasyum seviyeleri カリウム含有量 + 칼륨 레벨 Magnification @@ -1138,8 +1174,10 @@ Suporte de Visão Noturna Support JVN 夜視鏡支援 + 支持夜视仪 Podpora nočního vidění Gece Görüş Desteği + 야간투시 지원여부 Primary supported @@ -1152,7 +1190,9 @@ Primária suportada Primaire supportée 主武器支援 + 主镜支持 Hlavní část hledí podporuje + 주무기 지원여부 Secondary supported @@ -1165,7 +1205,9 @@ Secundária suportada Secondaire supportée 次要武器支援 + 副镜支持 Vedlejší část hledí podporuje + 보조무기 지원여부 Primary integrated @@ -1178,7 +1220,9 @@ Primária integrada Primaire intégrée 整合主武器 + 主镜内置 Integrováno do hlavní části hledí + 주무기 내장여부 Not Supported @@ -1191,8 +1235,10 @@ Não suportado Non supporté 不支援 + 不支持 Není podporováno Desteklenmiyor + 지원되지 않음 Page @@ -1208,6 +1254,7 @@ Página Stránka Sayfa + 페이지 Enable the faces / voices / insignias tabs @@ -1215,7 +1262,7 @@ Aktiviere die Gesichter-, Stimmen- und Abzeichenübersicht Activer les onglets visages/voix/insignes 顔 / 声 / 記章タブを有効化 - 启用脸谱/声音/徽章/选项 + 启用脸谱/语音/徽章选项 啟用臉譜/聲音/徽章選項 Abilita volti, voci e insegne Aktywuj zakładki twarz / głos / insygnia @@ -1223,6 +1270,7 @@ Ativar as abas de rostos / vozes / insígnias Povolit záložky s tvářemi, hlasy a insigniemi Yüzler/sesler/peçler bölmelerini etkinleştir + 얼굴/음성/부대마크 탭 활성화 Empty the selected container @@ -1230,13 +1278,14 @@ Aktuellen Container leeren Vider le conteneur selectionné 選択されたコンテナは空です - 选择的箱子是空的 + 选择的容器是空的 清空選擇的箱子 Svuota il contenitore selezionato Opróżnij wybrany pojemnik Очистить контейнер Esvaziar o cointâiner selecionado Vyprázdnit vybraný nosič + 선택한 보관함 비우기 Exported class name to clipboard @@ -1244,13 +1293,14 @@ Der Klassenname wurde in die Zwischenablage exportiert Nom de classe exporté dans le presse papier. クリップボードへクラスネームをエクスポート - 将种类复制到剪贴板 + 将类名复制到剪贴板 輸出 class name 到剪貼簿上 Copiato il nome della classe negli appunti Wyeksportowano nazwę klasy do schowka Имя класса, экспортированного в буфер O nome da classe foi exportado para a área de transferência Jméno třídy exportováno do schránky + 클래스 이름 복사하기 Mode @@ -1296,8 +1346,10 @@ Lista Negra Liste noire 黑名單 + 黑名单 Seznam zakázaných Kara Liste + 블랙리스트 Items @@ -1326,7 +1378,9 @@ Экспорт текущего списка предметов в виде массива для использования в скриптах Exporte l'équipement actuel dans le presse-papier, sous la forme d'un tableau à utiliser dans les scripts. 匯出目前的物品列表為陣列用於腳本編寫 + 导出目前的物品列表为排列以用于脚本编写 Exportovat současný seznam předmětů jako pole pro použití ve skriptech + 스크립트에서 사용을 위해 현재 항목 목록을 배열로 내보내기 Import items list array from clipboard (should be the same format as export) @@ -1338,8 +1392,10 @@ Importar lista de itens da área de transferência (deve estar no mesmo formato que uma lista exportada) Importe un tableau d'équipements depuis le presse-papier (le format doit être identique à celui de l'exportation). 從剪貼簿匯入物品列表之陣列(應該與匯出的格式一樣) + 从剪贴板导入物品列表排列(应与导出的格式一样) Importa elenco appunti (deve essere nello stesso formato di un elenco esportato) Importovat pole se seznamem předmětů ze schránky (měl by být ve stejném formátu jako export) + 클립보드에서 항목 목록을 배열로 가져옵니다(내보내기와 동일한 형식이어야 함). Add Compatible Items @@ -1351,8 +1407,10 @@ Adicionar itens compatíveis Ajouter des objets compatibles 增加相容的物品 + 添加兼容物品 Aggiungi Oggetti Compatibili Přidat kompatibilní předměty + 호환 아이템 추가 Will automatically add compatible attachments or magazines (based on selected category) for all weapons in current items list @@ -1364,8 +1422,10 @@ Irá automaticamente adicionar acessórios ou carregadores (baseado na categoria selecionada) para todas as armas na lista de itens atual Ajoute automatiquement des accessoires ou des chargeurs compatibles (en fonction de la catégorie sélectionnée), pour toutes les armes de la liste actuelle. 將會自動增加相容的配件以及彈匣(基於選擇的類型)至妳目前物品列表中的全部武器 + 将自动为当前物品列表中的所有武器添加兼容的配件或弹匣(基于选定的类别) Aggiungerà automaticamente accessori o caricatori (in base alla categoria selezionata) per tutte le armi nell'elenco degli oggetti correnti Automaticky přídá kompatibilní zásobníky (na základě vybrané kategorie) ro všechny zbraně v současném seznamu předmětů + 현재 아이템 목록에 있는 모든 무기에 해당하는부착물과 탄창(선택한 카테고리에 따라)을 자동으로 추가합니다. Time to live @@ -1378,8 +1438,10 @@ Время действия Time to live 有效時間 + 有效时间 Time to live Bitme Süresi + 유효 시간 Fuse Time @@ -1389,6 +1451,8 @@ 信管設定時間 Tiempo de espoleta Detonationsverzögerung + 引信时间 + 신관 시간 Detonates on impact @@ -1398,6 +1462,17 @@ Detonuj przy uderzeniu 着発信管 Detona mediante impacto + 碰炸引信 + 충격 신관 + + + Save Face + + + Save Voice + + + Save Insignia diff --git a/addons/artillerytables/functions/fnc_turretChanged.sqf b/addons/artillerytables/functions/fnc_turretChanged.sqf index 1975f65c73..2467764499 100644 --- a/addons/artillerytables/functions/fnc_turretChanged.sqf +++ b/addons/artillerytables/functions/fnc_turretChanged.sqf @@ -19,7 +19,7 @@ params ["_player", "_turret"]; private _vehicle = vehicle _player; private _typeOf = typeOf _vehicle; -private _vehicleCfg = configFile >> "CfgVehicles" >> _typeOf; +private _vehicleCfg = configOf _vehicle; // config "ace_artillerytables_showGunLaying" [0 disabled, 1 enabled, 2 enabled w/ alt elevationMode] falls back to artilleryScanner private _showGunLaying = if (isNumber (_vehicleCfg >> QGVAR(showGunLaying))) then { diff --git a/addons/artillerytables/stringtable.xml b/addons/artillerytables/stringtable.xml index d1d4ab23ef..8b26e420ce 100644 --- a/addons/artillerytables/stringtable.xml +++ b/addons/artillerytables/stringtable.xml @@ -5,6 +5,7 @@ Artillery Rangetable Artillerieschusstafel 火炮射程表 + 火炮射表 Tavola balistica per artigliria Dělostřelecké tabulky střelby 火砲射表 @@ -14,11 +15,13 @@ Tabla de distancias de artillería Topçu Menzil Tablosu Артиллерийская баллистическая таблица + 포병 사격거리표 Universal Artillery Rangetable Universale Artillerieschusstafel 通用的火炮射程表 + 通用火炮射表 Tavola balistica universale per artiglieria Univerzální dělostřelecká tabulka střelby 汎用の火砲用射程表 @@ -28,6 +31,7 @@ Tabla de distancias universal de artillería Uluslar arası Topçu Menzil Tablosu Универсальная артиллерийская баллистическая таблица + 범용 포병 사격거리표 Air Resistance @@ -59,7 +63,7 @@ Per Proiettili dei Giocatori, simula la Resistenza dell'Aria e gli Effetti del Vento プレイヤが射撃すると、空気抵抗モデルと風による影響を与えます。 플레이어 사격시 공기저항과 바람에 영향을 받습니다 - 设定由玩家射击的迫击炮,将会受到空气阻力与风力的影响 + 设定由玩家射击的炮弹是否受到空气阻力与风力的影响 設定由玩家射擊的迫擊砲,將會受到空氣阻力與風力的影響 Oyuncu atışları, hava direnci ve rüzgar efektleri için @@ -67,6 +71,7 @@ Artillery Computer Disabled Artilleriecomputer ausgeschaltet 停用火炮電腦 + 停用弹道计算机 Computer artiglieria disattivato Zakázat používání dělostřeleckého počítače 砲撃コンピュータ無効化 @@ -76,11 +81,13 @@ Computadora de artillería deshabilitada Topçu Bilgisayarı Devre Dışı Артиллерийский Компьютер Отключён + 탄도계산컴퓨터 비활성화 Disable the vanilla artillery computers Deaktiviert die Vanilla-Artilleriecomputer 停用原本的火炮控制電腦 + 禁用游戏自带的弹道计算机 Disattiva il computer artiglieria vanilla Zakázat používání dělostřeleckého počítače základní hry ゲームの砲撃コンピュータを無効化します。 @@ -90,6 +97,7 @@ Deshabilita la computadora de artillería por defecto de Arma 3 Topçu bilgisayarını devre dışı bırak Отключить ванильный артиллерийский компьютер + 바닐라 탄도계산컴퓨터를 비활성화 합니다. diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index d76ccec087..04f678ec21 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -32,7 +32,7 @@ ATragMX を開く ATragMX 열기 開啟ATragMX - 开启ATragMX + 开启 ATragMX ATragMX'i aç @@ -49,7 +49,7 @@ ATragMX 付きの携行型端末 ATragMX가 달린 PDA 裝有軍用PDA的ATragMX - 装有军用PDA的ATragMX + 装有 ATragMX 的军用 PDA Rugged PDA with ATragMX @@ -66,7 +66,7 @@ ATragMX を開く ATragMX 열기 開啟ATragMX - 开启ATragMX + 开启 ATragMX ATragMX'i aç diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 831c4384e4..f7c01c5f61 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -13,7 +13,7 @@ Tárgy hozzácsatolása Прикрепить предмет アイテムを取り付ける - 물건 부착 + 아이템 부착 附掛裝備>> 附挂装备>> Eşyayı bağla @@ -47,7 +47,7 @@ Tárgy lecsatolása Отсоединить アイテムを外す - 분리 + 떼내기 取下裝備 取下装备 Eşyayı sök @@ -66,7 +66,7 @@ 赤外線ストロボを取り付けました 적외선 스트로브 부착됨 已附掛紅外線頻閃器 - 已附挂红外线频闪器 + 已附挂红外频闪器 IR Strobe Bağlandı @@ -81,9 +81,9 @@ Infravörös jeladó lecsatolva ИК-маяк отсоединён 赤外線ストロボを外しました - 적외선 스트로브 분리됨 + 적외선 스트로브 떼어냄 已取下紅外線頻閃器 - 已取下红外线频闪器 + 已取下红外频闪器 IR Strobe Söküldü @@ -100,7 +100,7 @@ 赤外線グレネードを取り付けました 적외선 수류탄 부착됨 已附掛紅外線手榴彈 - 已附挂红外线手榴弹 + 已附挂红外手雷 IR Bombası Bağlandı @@ -115,9 +115,9 @@ Infravörös gránát lecsatolva ИК-граната отсоединена 赤外線グレネードを外しました - 적외선 수류탄 분리됨 + 적외선 수류탄 떼어냄 已取下紅外線手榴彈 - 已取下红外线手榴弹 + 已取下红外手雷 IR Bombası Söküldü @@ -134,7 +134,7 @@ ケミライトを取り付けました 켐라이트 부착됨 已附掛螢光棒 - 已附挂萤光棒 + 已附挂荧光棒 Işık Çubuğu Bağlandı @@ -149,9 +149,9 @@ Chemlight hozzácsatolva Химсвет отсоединён ケミライトを外しました - 켐라이트 분리됨 + 켐라이트 떼어냄 已取下螢光棒 - 已取下萤光棒 + 已取下荧光棒 Işık Çubuğu Söküldü @@ -168,7 +168,7 @@ 赤外線ストロボ 적외선 스트로브 紅外線頻閃器 - 红外线频闪器 + 红外频闪器 IR Stroboskop @@ -185,7 +185,7 @@ 赤外線ストロボはあなたの位置を知らせますが、夜間暗視装置を介してでしか見れません。 적외선 스트로브는 자신의 위치를 반짝이면서 표시합니다. 이는 야간투시경으로 밖에 보지 못합니다. 紅外線閃頻器,藉由紅外線閃頻信號來辨識你的位置,僅能使用夜視系統來辨識紅外線信號 - 红外线闪频器,藉由红外线闪频信号来辨识你的位置,仅能使用夜视系统来辨识红外线信号 + 红外频闪器制造只有用夜视仪才能看到的频闪信标,发出一个位置信号。 IR Stroboskop, yalnızca gece görüşlerinden gözükebilen titreşimli bir ışık aracılığıyla konumunuzu gösterir. @@ -200,7 +200,7 @@ Elhelyez Установить 置く - 두기 + 놓기 放置 放置 Yerleştir @@ -268,7 +268,7 @@ %1<br/>lecsatolva %1<br/>отсоединен(-а) %1<br/>を外しました - %1<br/>분리됨 + %1<br/>떼어냄 %1<br/>已取下 %1<br/>已取下 %1<br/>Söküldü diff --git a/addons/backpacks/functions/fnc_isBackpack.sqf b/addons/backpacks/functions/fnc_isBackpack.sqf index a101a514e9..e57b9c4ed1 100644 --- a/addons/backpacks/functions/fnc_isBackpack.sqf +++ b/addons/backpacks/functions/fnc_isBackpack.sqf @@ -17,10 +17,10 @@ params [["_backpack", objNull, [objNull, ""]]]; -if (_backpack isEqualType objNull) then { - _backpack = typeOf _backpack; +private _config = if (_backpack isEqualType objNull) then { + configOf _backpack +} else { + configFile >> "CfgVehicles" >> _backpack }; -private _config = configFile >> "CfgVehicles" >> _backpack; - getText (_config >> "vehicleClass") == "backpacks" && {getNumber (_config >> "maximumLoad") > 0} // return diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 2dfc62b754..4f23852f2a 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -101,7 +101,7 @@ class CfgWeapons { // Rifle_Long_Base_F MG // Stoner 99 LMG class LMG_Mk200_F: Rifle_Long_Base_F { - ACE_barrelLength = 317.5; + ACE_barrelLength = 381; ACE_barrelTwist = 177.8; initSpeed = -0.999327; }; diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 9a5c92f582..a859ae7735 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -7,6 +7,7 @@ Postas #00 #00 Schrotmunition #00 鹿彈 + #00 鹿弹 #00 Buckshot #00 バックショット Chevrotine #00 @@ -15,12 +16,14 @@ #00 Chumbo #00 Irisaçma #00 Картечь + #00 벅샷 #00 Buckshot Postas #00 #00 Schrotmunition - #00 鹿彈 + #00 鹿彈(8.38 mm) + #00 鹿弹(8.38 mm) #00 Buckshot #00 バックショット Chevrotine #00 @@ -29,12 +32,14 @@ #00 Chumbo #00 Irisaçma #00 Картечь + #00 벅샷 #0 Buckshot Postas #0 #0 Schrotmunition #0 鹿彈 + #0 鹿弹 #0 Buckshot #0 バックショット Chevrotine #0 @@ -43,12 +48,14 @@ #0 Chumbo #0 Irisaçma #0 Картечь + #0 벅샷 #0 Buckshot Postas #0 #0 Schrotmunition #0 鹿彈 + #0 鹿弹(8.1 mm) #0 Buckshot #0 バックショット Chevrotine #0 @@ -57,12 +64,14 @@ #0 Chumbo #0 Irisaçma #0 Картечь + #0 벅샷 #1 Buckshot Postas #1 #1 Schrotmunition #1 鹿彈 + #1 鹿弹 #1 Buckshot #1 バックショット Chevrotine #1 @@ -71,12 +80,14 @@ #1 Chumbo #1 Irisaçma #1 Картечь + #1 벅샷 #1 Buckshot Postas #1 #1 Schrotmunition #1 鹿彈 + #1 鹿弹(7.6 mm) #1 Buckshot #1 バックショット Chevrotine #1 @@ -85,12 +96,14 @@ #1 Chumbo #1 Irisaçma #1 Картечь + #1 벅샷 #2 Buckshot Postas #2 #2 Schrotmunition #2 鹿彈 + #2 鹿弹 #2 Buckshot #2 バックショット Chevrotine #2 @@ -99,12 +112,14 @@ #2 Chumbo #2 Irisaçma #2 Картечь + #2 벅샷 #2 Buckshot Postas #2 #2 Schrotmunition #2 鹿彈 + #2 鹿弹(6.9 mm) #2 Buckshot #2 バックショット Chevrotine #2 @@ -113,12 +128,14 @@ #2 Chumbo #2 Irisaçma #2 Картечь + #2 벅샷 #3 Buckshot Postas #3 #3 Schrotmunition #3 鹿彈 + #3 鹿弹 #3 Buckshot #3 バックショット Chevrotine #3 @@ -127,12 +144,14 @@ #3 Chumbo #3 Irisaçma #3 Картечь + #3 벅샷 #3 Buckshot Postas #3 #3 Schrotmunition #3 鹿彈 + #3 鹿弹(6.4 mm) #3 Buckshot #3 バックショット Chevrotine #3 @@ -141,12 +160,14 @@ #3 Chumbo #3 Irisaçma #3 Картечь + #3 벅샷 #4 Buckshot Postas #4 #4 Schrotmunition #4 鹿彈 + #4 鹿弹 #4 Buckshot #4 バックショット Chevrotine #4 @@ -155,12 +176,14 @@ #4 Chumbo #4 Irisaçma #4 Картечь + #4 벅샷 #4 Buckshot Postas #4 #4 Schrotmunition #4 鹿彈 + #4 鹿弹(6.10 mm) #4 Buckshot #4 バックショット Chevrotine #4 @@ -169,12 +192,14 @@ #4 Chumbo #4 Irisaçma #4 Картечь + #4 벅샷 #4 Birdshot Perdigones #4 #4 Vogelschrot - #4 鹿彈 + #4 鳥彈 + #4 鸟弹 #4 Birdshot #4 バックショット Grenaille No.4 @@ -182,12 +207,14 @@ #4 Śrut Drobny #4 Küçük saçma #4 Дробь + #4 버드샷 #4 Birdshot Perdigones #4 #4 Vogelschrot - #4 鹿彈 + #4 鳥彈 + #4 鸟弹(3.30 mm) #4 Birdshot #4 バックショット Grenaille No.4 @@ -195,12 +222,14 @@ #4 Śrut Drobny (Birdshot) #4 Küçük saçma #4 Дробь + #4 버드샷 12 Gauge 2Rnd #00 Buckshot 2 Cartuchos de Postas Calibre 12 #00 12 Gauge 2Schuss #00 Schrotmunition 12鉛徑 2發 #00 鹿彈 + 12铅径 2发 #00 鹿弹 12 Gauge 2Rnd #00 Buckshot 12 ゲージ 2 発入り #00 バックショット 2 balles cal. 12 Chevrotine #00 @@ -209,12 +238,14 @@ Chumbo #00 Calibre Doze 2 Tiros 12 Калибр 2 патр. #00 Картечь 12 kalibre 2 mermi #00 İrisaçma + 12게이지 2발 #00 벅샷 12 Gauge 2Rnd #0 Buckshot 2 Cartuchos de Postas Calibre 12 #0 12 Gauge 2Schuss #0 Schrotmunition 12鉛徑 2發 #0 鹿彈 + 12铅径 2发 #0 鹿弹 12 Gauge 2Rnd #0 Buckshot 12 ゲージ 2 発入り #0 バックショット 2 balles cal. 12 Chevrotine #0 @@ -223,12 +254,14 @@ Chumbo #0 Calibre Doze 2 Tiros 12 Калибр 2 патр. #0 Картечь 12 kalibre 2 mermi #0 İrisaçma + 12게이지 2발 #00 벅샷 12 Gauge 2Rnd #1 Buckshot 2 Cartuchos de Postas Calibre 12 #1 12 Gauge 2Schuss #1 Schrotmunition 12鉛徑 2發 #1 鹿彈 + 12铅径 2发 #1 鹿弹 12 Gauge 2Rnd #1 Buckshot 12 ゲージ 2 発入り #1 バックショット 2 balles cal. 12 Chevrotine #1 @@ -237,12 +270,14 @@ Chumbo #1 Calibre Doze 2 Tiros 12 Калибр 2 патр. #1 Картечь 12 kalibre 2 mermi #1 İrisaçma + 12게이지 2발 #1 벅샷 12 Gauge 2Rnd #2 Buckshot 2 Cartuchos de Postas Calibre 12 #2 12 Gauge 2Schuss #2 Schrotmunition 12鉛徑 2發 #2 鹿彈 + 12铅径 2发 #2 鹿弹 12 Gauge 2Rnd #2 Buckshot 12 ゲージ 2 発入り #2 バックショット 2 balles cal. 12 Chevrotine #2 @@ -251,12 +286,14 @@ Chumbo #2 Calibre Doze 2 Tiros 12 Калибр 2 патр. #2 Картечь 12 kalibre 2 mermi #2 İrisaçma + 12게이지 2발 #2 벅샷 12 Gauge 2Rnd #3 Buckshot 2 Cartuchos de Postas Calibre 12 #3 12 Gauge 2Schuss #3 Schrotmunition 12鉛徑 2發 #3 鹿彈 + 12铅径 2发 #3 鹿弹 12 Gauge 2Rnd #3 Buckshot 12 ゲージ 2 発入り #3 バックショット 2 balles cal. 12 Chevrotine #3 @@ -265,12 +302,14 @@ Chumbo #3 Calibre Doze 2 Tiros 12 Калибр 2 патр. #3 Картечь 12 kalibre 2 mermi #3 İrisaçma + 12게이지 2발 #3 벅샷 12 Gauge 2Rnd #4 Buckshot 2 Cartuchos de Postas Calibre 12 #4 12 Gauge 2Schuss #4 Schrotmunition 12鉛徑 2發 #4 鹿彈 + 12铅径 2发 #4 鹿弹 12 Gauge 2Rnd #4 Buckshot 12 ゲージ 2 発入り #4 バックショット 2 balles cal. 12 Chevrotine #4 @@ -279,12 +318,14 @@ Chumbo #4 Calibre Doze 2 Tiros 12 Калибр 2 патр. #4 Картечь 12 kalibre 2 mermi #4 İrisaçma + 12게이지 2발 #4 벅샷 12 Gauge 2Rnd #4 Birdshot 2 Cartuchos de Perdigones Calibre 12 #4 12 Gauge 2Schuss #4 Schrotmunition - 12鉛徑 2發 #4 鹿彈 + 12鉛徑 2發 #4 鳥彈 + 12铅径 2发 #4 鸟弹 12 Gauge 2Rnd #4 Birdshot 12 ゲージ 2 発入り #4 バックショット 2 balles cal. 12 Grenaille No.4 @@ -293,12 +334,14 @@ Chumbo #4 Calibre Doze 2 Tiros 12 Калибр 2 патр. #4 Дробь 12 kalibre 2 mermi #4 İrisaçma + 12게이지 2발 #4 버드샷 12 Gauge 6Rnd #00 Buckshot 6 Cartuchos de Postas Calibre 12 #00 12 Gauge 6Schuss #00 Schrotmunition 12鉛徑 6發 #00 鹿彈 + 12铅径 6发 #00 鹿弹 12 Gauge 6Rnd #00 Buckshot 12 ゲージ 6 発入り #00 バックショット 6 balles cal. 12 Chevrotine #00 @@ -307,12 +350,14 @@ Chumbo #00 Calibre Doze 6 Tiros 12 Калибр 6 патр. #00 Картечь 12 kalibre 6 mermi #00 İrisaçma + 12게이지 6발 #00 벅샷 12 Gauge 6Rnd #0 Buckshot 6 Cartuchos de Postas Calibre 12 #0 12 Gauge 6Schuss #0 Schrotmunition 12鉛徑 6發 #0 鹿彈 + 12铅径 6发 #0 鹿弹 12 Gauge 6Rnd #0 Buckshot 12 ゲージ 6 発入り #0 バックショット 6 balles cal. 12 Chevrotine #0 @@ -321,12 +366,14 @@ Chumbo #0 Calibre Doze 6 Tiros 12 Калибр 6 патр. #0 Картечь 12 kalibre 6 mermi #0 İrisaçma + 12게이지 6발 #0 벅샷 12 Gauge 6Rnd #1 Buckshot 6 Cartuchos de Postas Calibre 12 #1 12 Gauge 6Schuss #1 Schrotmunition 12鉛徑 6發 #1 鹿彈 + 12铅径 6发 #1 鹿弹 12 Gauge 6Rnd #1 Buckshot 12 ゲージ 6 発入り #1 バックショット 6 balles cal. 12 Chevrotine #1 @@ -335,12 +382,14 @@ Chumbo #1 Calibre Doze 6 Tiros 12 Калибр 6 патр. #1 Картечь 12 kalibre 6 mermi #1 İrisaçma + 12게이지 6발 #1 벅샷 12 Gauge 6Rnd #2 Buckshot 6 Cartuchos de Postas Calibre 12 #2 12 Gauge 6Schuss #2 Schrotmunition 12鉛徑 6發 #2 鹿彈 + 12铅径 6发 #2 鹿弹 12 Gauge 6Rnd #2 Buckshot 12 ゲージ 6 発入り #2 バックショット 6 balles cal. 12 Chevrotine #2 @@ -349,12 +398,14 @@ Chumbo #2 Calibre Doze 6 Tiros 12 Калибр 6 патр. #2 Картечь 12 kalibre 6 mermi #2 İrisaçma + 12게이지 6발 #2 벅샷 12 Gauge 6Rnd #3 Buckshot 6 Cartuchos de Postas Calibre 12 #3 12 Gauge 6Schuss #3 Schrotmunition 12鉛徑 6發 #3 鹿彈 + 12铅径 6发 #3 鹿弹 12 Gauge 6Rnd #3 Buckshot 12 ゲージ 6 発入り #3 バックショット 6 balles cal. 12 Chevrotine #3 @@ -363,12 +414,14 @@ Chumbo #3 Calibre Doze 6 Tiros 12 Калибр 6 патр. #3 Картечь 12 kalibre 6 mermi #3 İrisaçma + 12게이지 6발 #3 벅샷 12 Gauge 6Rnd #4 Buckshot 6 Cartuchos de Postas Calibre 12 #4 12 Gauge 6Schuss #4 Schrotmunition 12鉛徑 6發 #4 鹿彈 + 12铅径 6发 #4 鹿弹 12 Gauge 6Rnd #4 Buckshot 12 ゲージ 6 発入り #4 バックショット 6 balles cal. 12 Chevrotine #4 @@ -377,12 +430,14 @@ Chumbo #4 Calibre Doze 6 Tiros 12 Калибр 6 патр. #4 Картечь 12 kalibre 6 mermi #4 İrisaçma + 12게이지 6발 #4 벅샷 12 Gauge 6Rnd #4 Birdshot 6 Cartuchos de Perdigones Calibre 12 #4 12 Gauge 6Schuss #4 Schrotmunition - 12鉛徑 6發 #4 鹿彈 + 12鉛徑 6發 #4 鳥彈 + 12铅径 6发 #4 鸟弹 12 Gauge 6Rnd #4 Birdshot 12 ゲージ 6 発入り #4 バックショット 6 balles cal. 12 Grenaille No.4 @@ -390,12 +445,14 @@ 12 Gauge 6 naboi #4 Śrut 12 Калибр 6 патр. #4 Дробь 12 kalibre 6 mermi #4 İrisaçma + 12게이지 6발 #4 버드샷 12 Gauge 15Rnd #00 Buckshot 15 Cartuchos de Postas Calibre 12 #00 12 Gauge 15Schuss #00 Schrotmunition 12鉛徑 15發 #00 鹿彈 + 12铅径 15发 #00 鹿弹 12 Gauge 15Rnd #00 Buckshot 12 ゲージ 15 発入り #00 バックショット 15 balles cal. 12 Chevrotine #00 @@ -404,6 +461,7 @@ Chumbo #00 Calibre Doze 15 Tiros 12 Калибр 15 патр. #00 Картечь 12 kalibre 15 mermi #00 İrisaçma + 12게이지 15발 #00 벅샷 @@ -420,7 +478,7 @@ 6.5x47 mm 20発入り 弾倉 (HPBT Scenar) 20발들이 6.5x47 mm (HPBT Scenar) 6.5x47毫米 20發 彈匣 (拉普 空尖艇尾狙擊專用彈) - 6.5x47 mm 20发 弹匣 (Lapua 空尖艇尾狙击专用弹) + 6.5x47 mm 20发 弹匣(HPBT Scenar) 6.5x47 mm 20Rnd Mag (HPBT Scenar) @@ -437,7 +495,7 @@ 6.5 mm Lapua 6.5 mm Lapua 6.5毫米 拉普 空尖艇尾狙擊專用彈 - 6.5 mm Lapua 空尖艇尾狙击专用弹 + 6.5 mm Lapua 6.5 mm Lapua @@ -454,7 +512,7 @@ 口径: 6.5x47 mm (HPBT Scenar)<br />装填数: 20<br />次で使用: QBU-88 구경: 6.5x47 mm (HPBT Scenar)<br />장탄수: 20<br />사용처: QBU-88 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 20<br />使用於: QBU-88 - 口径: 6.5x47 mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 20<br />使用于: QBU-88 + 口径:6.5x47 mm(HPBT Scenar)<br />发数:20<br />使用于:QBU-88 Kalibre: 6.5x47 mm (HPBT Scenar)<br />Mermi: 20<br />Kullanıyor: QBU-88 @@ -471,7 +529,7 @@ 6.5 mm Creedmor 20発入り 弾倉 20발들이 6.5 mm Creedmor 탄창 6.5毫米 20發 彈匣 (克里德莫爾(CM) 狙擊專用彈) - 6.5 mm 20发 弹匣 (Creedmor 狙击专用弹) + 6.5 mm 20发 弹匣(Creedmor) 6.5 mm Creedmor 20Rnd Mag @@ -488,7 +546,7 @@ 6.5 mm CM 6.5 mm CM 6.5毫米 CM 狙擊專用彈 - 6.5 mm CM 狙击专用弹 + 6.5 mm CM 6.5 mm CM @@ -505,7 +563,7 @@ 口径: 6.5x47 mm Creedmor<br />装填数: 20<br />次で使用: QBU-88 구경: 6.5x47 mm Creedmor<br />장탄수: 20<br />사용처: QBU-88 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 20<br />使用於: QBU-88 - 口径: 6.5x47 mm Creedmor 狙击专用弹<br />发数: 20<br />使用于: QBU-88 + 口径:6.5x47 mm Creedmor 狙击专用弹<br />发数:20<br />使用于:QBU-88 Kalibre: 6.5x47 mm Creedmor<br />Mermi: 20<br />Kullanıyor: QBU-88 @@ -522,7 +580,7 @@ 5.8 mm DBP88 10発入り 弾倉 10발들이 5.8 mm DBP88 탄창 5.8毫米 10發 彈匣 (DBP88) - 5.8 mm 10发 弹匣 (DBP88) + 5.8 mm 10发 弹匣(DBP88) 5.8 mm DBP88 10Rnd Mag @@ -556,7 +614,7 @@ 口径: 5.8x42 mm DBP88<br />装填数: 10<br />次で使用: QBU-88 구경: 5.8x42 mm DBP88<br />장탄수: 10<br />사용처: QBU-88 口徑: 5.8x42毫米 DBP88<br />發數: 10<br />使用於: QBU-88 - 口径: 5.8x42 mm DBP88<br />发数: 10<br />使用于: QBU-88 + 口径:5.8x42 mm DBP88<br />发数:10<br />使用于:QBU-88 Kalibre: 5.8x42 mm DBP88<br />Mermi: 10<br />Kullanıyor: QBU-88 @@ -574,7 +632,7 @@ 6.5 mm 30発入り IR-DIM曳光弾 弾倉 30발들이 6.5 mm IR-DIM 예광탄 탄창 6.5毫米 30發 低視度紅外線曳光彈 彈匣 - 6.5 mm 30发 低视度红外线曳光弹 弹匣 + 6.5 mm 30发 弹匣(红外曳光) 6.5 mm 30Rnd Tracer IR-DIM Mag @@ -591,7 +649,7 @@ 6.5 mm IR-DIM曳光弾 6.5 mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -608,7 +666,7 @@ 口径: 6.5x39 mm 曳光弾 IR-DIM<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 구경: 6.5x39 mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: MX/C/M/SW/3GL 口徑: 6.5x39毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL - 口径: 6.5x39 mm 低视度红外线曳光弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL + 口径:6.5x39 mm 红外曳光<br />发数:30<br />使用于:MX/C/M/SW/3GL Kalibre: 6.5x39 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: MX/C/M/SW/3GL @@ -625,7 +683,7 @@ 6.5 mm 30発入り 亜音速弾 弾倉 30발들이 6.5 mm 아음속탄 탄창 6.5毫米 30發 消音彈 彈匣 - 6.5 mm 30发 消音弹 弹匣 + 6.5 mm 30发 弹匣(亚音速) 6.5 mm 30Rnd SD Mag @@ -642,7 +700,7 @@ 6.5 mm 亜音速弾 6.5 mm 아음속탄 6.5毫米 消音彈 - 6.5 mm 消音弹 + 6.5 mm 亚音速 6.5 mm SD @@ -659,7 +717,7 @@ 口径: 6.5x39 mm 亜音速弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 구경: 6.5x39 mm SD<br />장탄수: 30<br />사용처: MX/C/M/SW/3GL 口徑: 6.5x39毫米 消音彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL - 口径: 6.5x39 mm 消音弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL + 口径:6.5x39 mm 亚音速<br />发数:30<br />使用于:MX/C/M/SW/3GL Kalibre: 6.5x39 mm SD<br />Mermi: 30<br />Kullanıyor: MX/C/M/SW/3GL @@ -676,7 +734,7 @@ 6.5 mm 30 発入り徹甲弾 弾倉 30발들이 6.5 mm 철갑탄 탄창 6.5毫米30發 穿甲彈 彈匣 - 6.5 mm 30发 穿甲弹 弹匣 + 6.5 mm 30发 弹匣(穿甲) 6.5 mm 30Rnd AP Mag @@ -693,7 +751,7 @@ 6.5 mm 徹甲弾 6.5 mm 철갑탄 6.5毫米 穿甲彈 - 6.5 mm 穿甲弹 + 6.5 mm 穿甲 6.5 mm AP @@ -710,7 +768,7 @@ 口径: 6.5x39 mm 徹甲弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 구경: 6.5x39 mm 철갑탄<br />장탄수: 30<br />사용처: MX/C/M/SW/3GL 口徑: 6.5x39毫米 穿甲彈<br />發數: 30<br />使用於: MX/C/M/SW/3GL - 口径: 6.5x39 mm 穿甲弹<br />发数: 30<br />使用于: MX/C/M/SW/3GL + 口径:6.5x39 mm 穿甲<br />发数:30<br />使用于:MX/C/M/SW/3GL Kalibre: 6.5x39 mm AP<br />Mermi: 30<br />Kullanıyor: MX/C/M/SW/3GL @@ -728,7 +786,7 @@ 6.5 mm 30発入り IR-DIM曳光弾 弾倉 30발들이 6.5 mm IR-DIM 예광탄 탄창 6.5毫米 30發 低視度紅外線曳光彈 彈匣 - 6.5 mm 30发 低视度红外线曳光弹 弹匣 + 6.5 mm 30发 弹匣(红外曳光) 6.5 mm 30Rnd Tracer IR-DIM Mag @@ -745,7 +803,7 @@ 6.5 mm IR-DIM曳光弾 6.5 mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -762,7 +820,7 @@ 口径: 6.5x39 mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: Katiba 구경: 6.5x39 mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: Katiba 口徑: 6.5x39毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: Katiba - 口径: 6.5x39 mm 低视度红外线曳光弹<br />发数: 30<br />使用于: Katiba + 口径:6.5x39 mm 红外曳光<br />发数:30<br />使用于:Katiba Kalibre: 6.5x39 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: Katiba @@ -779,7 +837,7 @@ 6.5 mm 30発入り 亜音速弾 弾倉 30발들이 6.5 mm 아음속탄 탄창 6.5毫米 30發 消音彈 彈匣 - 6.5 mm 30发 消音弹 弹匣 + 6.5 mm 30发 弹匣(亚音速) 6.5 mm 30Rnd SD Mag @@ -796,7 +854,7 @@ 6.5 mm 亜音速弾 6.5 mm 아음속탄 6.5毫米 消音彈 - 6.5 mm 消音弹 + 6.5 mm 亚音速 6.5 mm SD @@ -813,7 +871,7 @@ 口径: 6.5x39 mm 亜音速弾<br />装填数: 30<br />次で使用: Katiba 구경: 6.5x39 mm 아음속탄<br />장탄수: 30<br />사용처: Katiba 口徑: 6.5x39毫米 消音彈<br />發數: 30<br />使用於: Katiba - 口径: 6.5x39 mm 消音弹<br />发数: 30<br />使用于: Katiba + 口径:6.5x39 mm 亚音速<br />发数:30<br />使用于:Katiba Kalibre: 6.5x39 mm SD<br />Mermi: 30<br />Kullanıyor: Katiba @@ -830,7 +888,7 @@ 6.5 mm 30 発入り徹甲弾 弾倉 30발들이 6.5 mm 철갑탄 탄창 6.5毫米 30發 穿甲彈 彈匣 - 6.5 mm 30发 穿甲弹 弹匣 + 6.5 mm 30发 弹匣(穿甲) 6.5 mm 30Rnd AP Mag @@ -847,7 +905,7 @@ 6.5 mm 徹甲弾 6.5 mm 철갑탄 6.5毫米 穿甲彈 - 6.5 mm 穿甲弹 + 6.5 mm 穿甲 6.5 mm AP @@ -864,7 +922,7 @@ 口径: 6.5x39 mm 徹甲弾<br />装填数: 30<br />次で使用: Katiba 구경: 6.5x39 mm 철갑탄<br />장탄수: 30<br />사용처: Katiba 口徑: 6.5x39m毫米 穿甲彈<br />發數: 30<br />使用於: Katiba - 口径: 6.5x39 mm 穿甲弹<br />发数: 30<br />使用于: Katiba + 口径:6.5x39 mm 穿甲<br />发数:30<br />使用于:Katiba Kalibre: 6.5x39 mm AP<br />Mermi: 30<br />Kullanıyor: Katiba @@ -882,7 +940,7 @@ 5.56 mm 30発入り IR-DIM曳光弾 弾倉 30발 들이 5.56 mm IR-DIM 예광탄 탄창 5.56毫米 30發 低視度紅外線曳光彈 彈匣 - 5.56 mm 30发 低视度红外线曳光弹 弹匣 + 5.56 mm 30发 弹匣(红外曳光) 5.56 mm 30rnd Tracer IR-DIM Mag @@ -899,7 +957,7 @@ 5.56 mm IR-DIM曳光弾 5.56 mm IR-DIM 예광탄 5.56毫米 低視紅外曳光彈 - 5.56 mm 低视红外曳光弹 + 5.56 mm 红外曳光 5.56 mm IR-DIM @@ -916,7 +974,7 @@ 口径: 5.56x45 mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 구경: 5.56x45 mm IR-DIM 예광탄<br />장탄수: 30<br />사용처: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 口徑: 5.56x45毫米 低視度紅外線曳光彈<br />發數: 30<br />使用於: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - 口径: 5.56x45 mm 低视度红外线曳光弹<br />发数: 30<br />使用于: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + 口径:5.56x45 mm 红外曳光<br />发数:30<br />使用于:TRG-20,TRG-21/EGLM, Mk20/C/EGLM, SDAR Kalibre: 5.56x45 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -934,7 +992,7 @@ 7.62 mm 20発入り 曳光弾 20발들이 7.62 mm 예광탄 탄창 7.62毫米 20發 曳光彈 彈匣 - 7.62 mm 20发 曳光弹 弹匣 + 7.62 mm 20发 弹匣(曳光) 7.62 mm 20Rnd Mag (Tracer) @@ -951,7 +1009,7 @@ 7.62 mm 曳光弾 7.62 mm 예광탄 7.62毫米 曳光彈 - 7.62 mm 曳光弹 + 7.62 mm 曳光 7.62 mm İzli @@ -968,7 +1026,7 @@ 口径: 7.62x51 mm 曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR 구경: 7.62x51 mm 예광탄<br />장탄수: 20<br />사용처: Mk18 ABR 口徑: 7.62x51毫米 曳光彈<br />發數: 20<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 曳光弹<br />发数: 20<br />使用于: Mk18 ABR + 口径:7.62x51 mm 曳光<br />发数:20<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer<br />Mermi: 20<br />Kullanıyor: Mk18 ABR @@ -985,7 +1043,7 @@ 7.62 mm 20発入り IR-DIM曳光弾 20발들이 7.62 mm IR-DIM 예광탄 탄창 7.62毫米 20發 低視度紅外線曳光彈 彈匣 - 7.62 mm 20发 低视度红外线曳光弹 弹匣 + 7.62 mm 20发 弹匣(红外曳光) 7.62 mm 20Rnd Mag (IR-DIM) @@ -1002,7 +1060,7 @@ 7.62 mm IR-DIM曳光弾 7.62 mm IR-DIM 예광탄 7.62毫米 低視紅外曳光彈 - 7.62 mm 低视红外曳光弹 + 7.62 mm 红外曳光 7.62 mm IR-DIM @@ -1019,7 +1077,7 @@ 口径: 7.62x51 mm IR-DIM曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR 구경: 7.62x51 mm IR-DIM 예광탄<br />장탄수: 20<br />사용처: Mk18 ABR 口徑: 7.62x51毫米 低視度紅外線曳光彈<br />發數: 20<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 低视度红外线曳光弹<br />发数: 20<br />使用于: Mk18 ABR + 口径:7.62x51 mm 红外曳光<br />发数:20<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer IR-DIM<br />Mermi: 20<br />Kullanıyor: Mk18 ABR @@ -1036,7 +1094,7 @@ 7.62 mm 20発入り 亜音速弾 弾倉 20발들이 7.62 mm 아음속탄 탄창 7.62毫米 20發 消音彈 彈匣 - 7.62 mm 20发 消音弹 弹匣 + 7.62 mm 20发 弹匣(亚音速) 7.62 mm 20Rnd Mag (SD) @@ -1053,7 +1111,7 @@ 7.62 mm 亜音速弾 7.62 mm 아음속탄 7.62毫米 消音彈 - 7.62 mm 消音弹 + 7.62 mm 亚音速 7.62 mm SD @@ -1070,7 +1128,7 @@ 口径: 7.62x51 mm 亜音速弾<br />装填数: 20<br />次で使用: Mk18 ABR 구경: 7.62x51 mm SD<br />장탄수: 20<br />사용처: Mk18 ABR 口徑: 7.62x51毫米 消音彈<br />發數: 20<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 消音弹<br />发数: 20<br />使用于: Mk18 ABR + 口径:7.62x51 mm 亚音速<br />发数:20<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm SD<br />Mermi: 20<br />Kullanıyor: Mk18 ABR @@ -1087,7 +1145,7 @@ 7.62 mm 10発入り 曳光弾 10발들이 7.62 mm 예광탄 탄창 7.62毫米 10發 曳光彈 彈匣 - 7.62 mm 10发 曳光弹 弹匣 + 7.62 mm 10发 弹匣(曳光) 7.62 mm 10Rnd Mag (Tracer) @@ -1104,7 +1162,7 @@ 7.62 mm 曳光弾 7.62 mm 예광탄 7.62毫米 曳光彈 - 7.62 mm 曳光弹 + 7.62 mm 曳光 7.62 mm İzli @@ -1121,7 +1179,7 @@ 口径: 7.62x51 mm 曳光弾<br />装填数: 10<br />次で使用: Mk18 ABR 구경: 7.62x51 mm 예광탄<br />장탄수: 10<br />사용처: Mk18 ABR 口徑: 7.62x51毫米 曳光彈<br />發數: 10<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 曳光弹<br />发数: 10<br />使用于: Mk18 ABR + 口径:7.62x51 mm 曳光<br />发数:10<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer<br />Mermi: 10<br />Kullanıyor: Mk18 ABR @@ -1138,7 +1196,7 @@ 7.62 mm 10発入り IR-DIM曳光弾 10발들이 7.62 mm IR-DIM 예광탄 탄창 7.62毫米 10發 低視度紅外線曳光彈 彈匣 - 7.62 mm 10发 低视度红外线曳光弹 弹匣 + 7.62 mm 10发 弹匣(红外曳光) 7.62 mm 10Rnd Mag (IR-DIM) @@ -1155,7 +1213,7 @@ 7.62 mm IR-DIM曳光弾 7.62 mm IR-DIM 예광탄 7.62毫米 低視紅外曳光彈 - 7.62 mm 低视红外曳光弹 + 7.62 mm 红外曳光 7.62 mm IR-DIM @@ -1172,7 +1230,7 @@ 口径: 7.62x51 mm IR-DIM曳光弾<br />装填数: 10<br />次で使用: Mk18 ABR 구경: 7.62x51 mm IR-DIM 예광탄<br />장탄수: 10<br />사용처: Mk18 ABR 口徑: 7.62x51毫米 低視度紅外線曳光彈<br />發數: 10<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 低视度红外线曳光弹<br />发数: 10<br />使用于: Mk18 ABR + 口径:7.62x51 mm 红外曳光<br />发数:10<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm Tracer IR-DIM<br />Mermi: 10<br />Kullanıyor: Mk18 ABR @@ -1189,7 +1247,7 @@ 7.62 mm 10発入り 亜音速弾 弾倉 10발들이 7.62 mm 아음속탄 탄창 7.62毫米 10發 消音彈 彈匣 - 7.62 mm 10发 消音弹 弹匣 + 7.62 mm 10发 弹匣(亚音速) 7.62 mm 10Rnd Mag (SD) @@ -1206,7 +1264,7 @@ 7.62 mm 亜音速弾 7.62 mm 아음속탄 7.62毫米 消音彈 - 7.62 mm 消音弹 + 7.62 mm 亚音速 7.62 mm SD @@ -1223,7 +1281,7 @@ 口径: 7.62x51 mm 亜音速弾<br />装填数: 10<br />次で使用: Mk18 ABR 구경: 7.62x51 mm SD<br />장탄수: 10<br />사용처: Mk18 ABR 口徑: 7.62x51毫米 消音彈<br />發數: 10<br />使用於: Mk18 ABR - 口径: 7.62x51 mm 消音弹<br />发数: 10<br />使用于: Mk18 ABR + 口径:7.62x51 mm 亚音速<br />发数:10<br />使用于:Mk18 ABR Kalibre: 7.62x51 mm SD<br />Mermi: 10<br />Kullanıyor: Mk18 ABR @@ -1241,7 +1299,7 @@ .338 NM 130発入り 曳光弾ベルト 130발들이 .338 NM 예광탄 벨트 .338 拉普麥格農(NM) 130發 曳光彈 彈鏈 - .338 NM 130发 曳光弹 弹链 + .338 NM 130发 弹链(曳光) .338 NM 130Rnd Tracer Belt @@ -1258,7 +1316,7 @@ .338 NM 曳光弾 .338 NM 예광탄 .338 NM 曳光彈 - .338 NM 曳光弹 + .338 NM 曳光 .338 NM İzli @@ -1275,7 +1333,7 @@ 口径: .338 Norma Magnum 曳光弾<br />装填数: 130<br />次で使用: SPMG 구경: .338 Norma 매그넘 예광탄<br />장탄수: 130<br />사용처: SPMG 口徑: .338 拉普麥格農 曳光彈<br />發數: 130<br />使用於: SPMG - 口径: .338 Norma Magnum 曳光弹<br />发数: 130<br />使用于: SPMG + 口径:.338 Norma Magnum 曳光<br />发数:130<br />使用于:SPMG Kalibre: .338 Norma Magnum Tracer<br />Mermi: 130<br />Kullanıyor: SPMG @@ -1292,7 +1350,7 @@ .338 NM 130発入り IR-DIM曳光弾ベルト 130발들이 .338 NM IR-DIM 예광탄 벨트 .338 拉普麥格農(NM) 130發 低視度紅外線曳光彈 彈鏈 - .338 NM 130发 低视度红外线曳光弹 弹链 + .338 NM 130发 弹链(红外曳光) .338 NM 130Rnd IR-DIM Belt @@ -1309,7 +1367,7 @@ .338 NM IR-DIM曳光弾 .338 NM IR-DIM 예광탄 .338 NM 低視紅外曳光彈 - .338 NM 低视红外曳光弹 + .338 NM 红外曳光 .338 NM IR-DIM @@ -1326,7 +1384,7 @@ 口径: .338 Norma Magnum IR-DIM曳光弾<br />装填数: 130<br />次で使用: SPMG 구경: .338 Norma 매그넘 IR-DIM 예광탄<br />장탄수: 130<br />사용처: SPMG 口徑: .338 拉普麥格農 低視度紅外線曳光彈<br />發數: 130<br />使用於: SPMG - 口径: .338 Norma Magnum 低视度红外线曳光弹<br />发数: 130<br />使用于: SPMG + 口径:.338 Norma Magnum 红外曳光<br />发数:130<br />使用于:SPMG Kalibre: .338 Norma Magnum Tracer IR-DIM<br />Mermi: 130<br />Kullanıyor: SPMG @@ -1343,7 +1401,7 @@ .338 NM 130発入り 徹甲弾ベルト 130발들이 .338 NM 철갑탄 벨트 .338 拉普麥格農(NM) 130發 穿甲彈 彈鏈 - .338 NM 130发 穿甲弹 弹链 + .338 NM 130发 弹链(穿甲) .338 NM 130Rnd AP Belt @@ -1360,7 +1418,7 @@ .338 NM 徹甲弾 .338 NM 철갑탄 .338 NM 穿甲彈 - .338 NM 穿甲弹 + .338 NM 穿甲 .338 NM AP @@ -1377,7 +1435,7 @@ 口径: .338 Norma Magnum 徹甲弾<br />装填数: 130<br />次で使用: SPMG 구경: .338 Norma 매그넘 철갑탄<br />장탄수: 130<br />사용처: SPMG 口徑: .338 拉普麥格農 穿甲彈<br />發數: 130<br />使用於: SPMG - 口径: .338 Norma Magnum 穿甲弹<br />发数: 130<br />使用于: SPMG + 口径:.338 Norma Magnum 穿甲<br />发数:130<br />使用于:SPMG Kalibre: .338 Norma Magnum AP<br />Mermi: 130<br />Kullanıyor: SPMG @@ -1395,7 +1453,7 @@ 9.3 mm 10発入り 曳光弾 弾倉 10발들이 9.3 mm 예광탄 탄창 9.3毫米 10發 曳光彈 彈匣 - 9.3 mm 10发 曳光弹 弹匣 + 9.3 mm 10发 弹匣(曳光) 9.3 mm 10Rnd Tracer Mag @@ -1412,7 +1470,7 @@ 9.3 mm 曳光弾 9.3 mm 예광탄 9.3毫米 曳光彈 - 9.3 mm 曳光弹 + 9.3 mm 曳光 9.3 mm Tracer @@ -1429,7 +1487,7 @@ 口径: 9.3x64 mm 曳光弾<br />装填数: 10<br />次で使用: Cyrus 구경: 9.3x64 mm 예광탄<br />장탄수: 10<br />사용처: Cyrus 口徑: 9.3x64毫米 曳光彈<br />發數: 10<br />使用於: Cyrus - 口径: 9.3x64 mm 曳光弹<br />发数: 10<br />使用于: Cyrus + 口径:9.3x64 mm 曳光<br />发数:10<br />使用于:"居鲁士" Kalibre: 9.3x64 mm Tracer<br />Mermi: 10<br />Kullanıyor: Cyrus @@ -1446,7 +1504,7 @@ 9.3 mm 10発入り IR-DIM曳光弾 弾倉 10발들이 9.3 mm IR-DIM 예광탄 탄창 9.3毫米 10發 低視度紅外線曳光彈 彈匣 - 9.3 mm 10发 低视度红外线曳光弹 弹匣 + 9.3 mm 10发 弹匣(红外曳光) 9.3 mm 10Rnd Tracer IR-DIM Mag @@ -1463,7 +1521,7 @@ 9.3 mm IR-DIM曳光弾 9.3 mm IR-DIM 예광탄 9.3毫米 低視紅外曳光彈 - 9.3 mm 低视红外曳光弹 + 9.3 mm 红外曳光 9.3 mm IR-DIM @@ -1480,7 +1538,7 @@ 口径: 9.3x64 mm IR-DIM曳光弾<br />装填数: 10<br />次で使用: Cyrus 구경: 9.3x64 mm IR-DIM 예광탄<br />장탄수: 10<br />사용처: Cyrus 口徑: 9.3x64毫米 低視度紅外線曳光彈<br />發數: 10<br />使用於: Cyrus - 口径: 9.3x64 mm 低视度红外线曳光弹<br />发数: 10<br />使用于: Cyrus + 口径:9.3x64 mm 红外曳光<br />发数:10<br />使用于:"居鲁士" Kalibre: 9.3x64 mm Tracer IR-DIM<br />Mermi: 10<br />Kullanıyor: Cyrus @@ -1498,7 +1556,7 @@ 9.3 mm 150発入り 曳光弾ベルト 150발들이 9.3 mm 예광탄 벨트 9.3毫米 150發 曳光彈 彈鏈 - 9.3 mm 150发 曳光弹 弹链 + 9.3 mm 150发 弹链(曳光) 9.3 mm 150Rnd Tracer Belt @@ -1515,7 +1573,7 @@ 9.3 mm 曳光弾 9.3 mm 예광탄 9.3毫米 曳光彈 - 9.3 mm 曳光弹 + 9.3 mm 曳光 9.3 mm Tracer @@ -1532,7 +1590,7 @@ 口径: 9.3x64 mm 曳光弾<br />装填数: 150<br />次で使用: Navid 구경: 9.3x64 mm 예광탄<br />장탄수: 150<br />사용처: Navid 口徑: 9.3x64m毫米 曳光彈<br />發數: 150<br />使用於: Navid - 口径: 9.3x64 mm 曳光弹<br />发数: 150<br />使用于: Navid + 口径:9.3x64 mm 曳光<br />发数:150<br />使用于:Navid Kalibre: 9.3x64 mm Tracer<br />Mermi: 150<br />Kullanıyor: Navid @@ -1549,7 +1607,7 @@ 9.3 mm 150発入り IR-DIM曳光弾ベルト 150발들이 9.3 mm IR-DIM 예광탄 벨트 9.3毫米 150發 低視度紅外線曳光彈 彈鏈 - 9.3 mm 150发 低视度红外线曳光弹 弹链 + 9.3 mm 150发 弹链(红外曳光) 9.3 mm 150Rnd Tracer IR-DIM Belt @@ -1566,7 +1624,7 @@ 9.3 mm IR-DIM曳光弾 9.3 mm IR-DIM 예광탄 9.3毫米 低視紅外曳光彈 - 9.3 mm 低视红外曳光弹 + 9.3 mm 红外曳光 9.3 mm IR-DIM @@ -1583,7 +1641,7 @@ 口径: 9.3x64 mm IR-DIM曳光弾<br />装填数: 150<br />次で使用: Navid 구경: 9.3x64 mm IR-DIM 예광탄<br />장탄수: 150<br />사용처: Navid 口徑: 9.3x64毫米 低視度紅外線曳光彈<br />發數: 150<br />使用於: Navid - 口径: 9.3x64 mm 低视度红外线曳光弹<br />发数: 150<br />使用于: Navid + 口径:9.3x64 mm 红外曳光<br />发数:150<br />使用于:Navid Kalibre: 9.3x64 mm Tracer IR-DIM<br />Mermi: 150<br />Kullanıyor: Navid @@ -1600,7 +1658,7 @@ 9.3 mm 150発入り 徹甲弾ベルト 150발들이 9.3 mm 철갑탄 벨트 9.3毫米 150發 穿甲彈 彈鏈 - 9.3 mm 150发 穿甲弹 弹链 + 9.3 mm 150发 弹链(穿甲) 9.3 mm 150Rnd AP Belt @@ -1617,7 +1675,7 @@ 9.3 mm 徹甲弾 9.3 mm 철갑탄 9.3毫米 穿甲彈 - 9.3 mm 穿甲弹 + 9.3 mm 穿甲 9.3 mm AP @@ -1634,7 +1692,7 @@ 口径: 9.3x64 mm 徹甲弾<br />装填数: 150<br />次で使用: Navid 구경: 9.3x64 mm 철갑탄<br />장탄수: 150<br />사용처: Navid 口徑: 9.3x64毫米 穿甲彈<br />發數: 150<br />使用於: Navid - 口径: 9.3x64 mm 穿甲弹<br />发数: 150<br />使用于: Navid + 口径:9.3x64 mm 穿甲<br />发数:150<br />使用于:Navid Kalibre: 9.3x64 mm AP<br />Mermi: 150<br />Kullanıyor: Navid @@ -1753,7 +1811,7 @@ 7.62x54 mm 10発入り 曳光弾 弾倉 10발들이 7.62x54 mm 예광탄 탄창 7.62x54毫米 10發 曳光彈 彈匣 - 7.62x54 mm 10发 曳光弹 弹匣 + 7.62x54 mm 10发 弹匣(曳光) 7.62x54 mm 10Rnd Tracer Mag @@ -1787,7 +1845,7 @@ 7.62x54 mm 10発入り 曳光弾 弾倉 10발들이 7.62x54 mm 예광탄 탄창 7.62x54毫米 10發 曳光彈 彈匣 - 7.62x54 mm 10发 曳光弹 弹匣 + 7.62x54 mm 10发 弹匣(曳光) 7.62x54 mm 10Rnd Tracer Mag @@ -1804,7 +1862,7 @@ 6.5 mm 100発入り IR-DIM曳光弾 弾倉 100발들이 6.5 mm IR-DIM 예광탄 탄창 6.5毫米 100發 低視度紅外線曳光彈 彈匣 - 6.5 mm 100发 低视度红外线曳光弹 弹匣 + 6.5 mm 100发 弹匣(红外曳光) 6.5 mm 100Rnd Tracer IR-DIM Mag @@ -1821,7 +1879,7 @@ 6.5 mm IR-DIM曳光弾 6.5 mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -1838,7 +1896,7 @@ 6.5 mm 100発入り IR-DIM曳光弾 弾倉<br />装填数: 100<br />次で使用: MX LSW 100발들이 6.5 mm IR-DIM 예광탄 탄창<br />장탄수: 100<br />사용처: MX LSW 6.5毫米 100發 低視度紅外線曳光彈<br />發數: 100<br />使用於: MX LSW - 6.5 mm 100发 低视度红外线曳光弹<br />发数: 100<br />使用于: MX LSW + 口径:6.5 mm 100发 红外曳光<br />发数:100<br />使用于:MX LSW 6.5 mm 100Rnd Tracer IR-DIM Mag<br />Mermi: 100<br />Kullanıyor: MX LSW @@ -1855,7 +1913,7 @@ 6.5 mm 200発入り IR-DIM曳光弾ベルト 200발들이 6.5 mm IR-DIM 예광탄 탄창 6.5毫米 200發 低視度紅外線曳光彈 彈鏈 - 6.5 mm 200发 低视度红外线曳光弹 弹链 + 6.5 mm 200发 弹链(红外曳光) 6.5 mm 200Rnd Belt Tracer (IR-DIM) @@ -1872,7 +1930,7 @@ 6.5 mm IR-DIM曳光弾 6.5 mm IR-DIM 예광탄 6.5毫米 低視紅外曳光彈 - 6.5 mm 低视红外曳光弹 + 6.5 mm 红外曳光 6.5 mm IR-DIM @@ -1889,7 +1947,7 @@ 6.5 mm 200発入り IR-DIM曳光弾ベルト<br />装填数: 200<br />次で使用: Stoner 99 LMG 200발들이 6.5 mm IR-DIM 예광탄 벨트<br />장탄수: 200<br />사용처: Stoner 99 LMG 6.5毫米 200發 低視度紅外線曳光彈<br />發數: 200<br />使用於: Stoner 99 重機槍 - 6.5 mm 200发 低视度红外线曳光弹<br />发数: 200<br />使用于: Stoner 99 LMG + 口径:6.5 mm 200发 红外曳光<br />发数:200<br />使用于:Stoner 99 LMG 6.5 mm 200Rnd Belt Tracer (IR-DIM)<br />Mermi: 200<br />Kullanıyor: Stoner 99 LMG @@ -1906,7 +1964,7 @@ 5.56 mm 30発入り 弾倉 (Mk262) 30발들이 5.56 mm 탄창 (Mk262) 5.56毫米 30發 彈匣 (Mk262 狙擊專用彈) - 5.56 mm 30发 弹匣 (Mk262 狙击专用弹) + 5.56 mm 30发 弹匣(Mk262) 5.56 mm 30Rnd Mag (Mk262) @@ -1923,7 +1981,7 @@ 5.56 mm Mk262 5.56 mm Mk262 5.56毫米 Mk262 狙擊專用彈 - 5.56 mm Mk262 狙击专用弹 + 5.56 mm Mk262 5.56 mm Mk262 @@ -1940,7 +1998,7 @@ 口径: 5.56x45 mm NATO (Mk262)<br />装填数: 30 구경: 5.56x45 mm NATO (Mk262)<br />장탄수: 30 口徑: 5.56x45毫米 NATO標準 (Mk262 狙擊專用彈)<br />發數: 30 - 口径: 5.56x45 mm NATO标准 (Mk262 狙击专用弹)<br />发数: 30 + 口径:5.56x45 mm 北约(Mk262 狙击专用弹)<br />发数:30 Kalibre: 5.56x45 mm NATO (Mk262)<br />Mermi: 30 @@ -1957,7 +2015,7 @@ 5.56 mm 30発入り 弾倉 (Mk318) 30발들이 5.56 mm 탄창 (Mk318) 5.56毫米 30發 彈匣 (Mk318 特戰專用彈) - 5.56 mm 30发 弹匣 (Mk318 特战专用弹) + 5.56 mm 30发 弹匣(Mk318) 5.56 mm 30Rnd Mag (Mk318) @@ -1974,7 +2032,7 @@ 5.56 mm Mk318 5.56 mm Mk318 5.56毫米 Mk318 特戰專用彈 - 5.56 mm Mk318 特战专用弹 + 5.56 mm Mk318 5.56 mm Mk318 @@ -1991,7 +2049,7 @@ 口径: 5.56x45 mm NATO (Mk318)<br />装填数: 30 구경: 5.56x45 mm NATO (Mk318)<br />장탄수: 30 口徑: 5.56x45毫米 NATO標準 (Mk318 特戰專用彈)<br />發數: 30 - 口径: 5.56x45 mm NATO标准 (Mk318 特战专用弹)<br />发数: 30 + 口径:5.56x45 mm 北约(Mk318 特战专用弹)<br />发数:30 Kalibre: 5.56x45 mm NATO (Mk318)<br />Mermi: 30 @@ -2008,7 +2066,7 @@ 5.56 mm 30発入り 弾倉 (M995 徹甲弾) 30발들이 5.56 mm 탄창 (Mk995 철갑탄) 5.56毫米 30發 彈匣 (M995 穿甲彈) - 5.56 mm 30发 弹匣 (M995 穿甲弹) + 5.56 mm 30发 弹匣(M995 穿甲) 5.56 mm 30Rnd Mag (M995 AP) @@ -2025,7 +2083,7 @@ 5.56 mm 徹甲弾 5.56 mm 철갑탄 5.56毫米 M995 穿甲彈 - 5.56 mm M995 穿甲弹 + 5.56 mm 穿甲 5.56 mm AP @@ -2042,7 +2100,7 @@ 口径: 5.56x45 mm NATO (M995 徹甲弾)<br />装填数: 30 구경: 5.56x45 mm NATO (Mk995 철갑탄)<br />장탄수: 30 口徑: 5.56x45毫米 NATO標準 (M995 穿甲彈)<br />發數: 30 - 口径: 5.56x45 mm NATO标准 (M995 穿甲弹)<br />发数: 30 + 口径:5.56x45 mm 北约(M995 穿甲)<br />发数:30 Kalibre: 5.56x45 mm NATO (M995 AP)<br />Mermi: 30 @@ -2059,7 +2117,7 @@ 7.62 mm 10発入り 弾倉 (M118LR) 10발들이 7.62 mm 탄창 (M118LR) 7.62毫米 10發 彈匣 (M118LR 狙擊專用彈) - 7.62 mm 10发 弹匣 (M118LR 狙击专用弹) + 7.62 mm 10发 弹匣(M118LR) 7.62 mm 10Rnd Mag (M118LR) @@ -2076,7 +2134,7 @@ 7.62 mm M118LR 7.62 mm M118LR 7.62m毫米 M118LR 狙擊專用彈 - 7.62 mm M118LR 狙击专用弹 + 7.62 mm M118LR 7.62 mm M118LR @@ -2093,7 +2151,7 @@ 口径: 7.62x51 mm NATO (M118LR)<br />装填数: 10 구경: 7.62x51 mm NATO (M118LR)<br />장탄수: 10 口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (M118LR 狙击专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(M118LR 狙击专用弹)<br />发数:10 Kalibre: 7.62x51 mm NATO (M118LR)<br />Mermi: 10 @@ -2110,7 +2168,7 @@ 7.62 mm 20発入り 弾倉 (M118LR) 20발들이 7.62 mm 탄창 (M118LR) 7.62毫米 20發 彈匣 (M118LR 狙擊專用彈) - 7.62 mm 20发 弹匣 (M118LR 狙击专用弹) + 7.62 mm 20发 弹匣(M118LR) 7.62 mm 20Rnd Mag (M118LR) @@ -2127,7 +2185,7 @@ 7.62 mm M118LR 7.62 mm M118LR 7.62毫米 M118LR 狙擊專用彈 - 7.62 mm M118LR 狙击专用弹 + 7.62 mm M118LR 7.62 mm M118LR @@ -2144,7 +2202,7 @@ 口径: 7.62x51 mm NATO (M118LR)<br />装填数: 20 구경: 7.62x51 mm NATO (M118LR)<br />장탄수: 20 口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (M118LR 狙击专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(M118LR 狙击专用弹)<br />发数:20 Kalibre: 7.62x51 mm NATO (M118LR)<br />Mermi: 20 @@ -2161,7 +2219,7 @@ 7.62 mm 10発入り 弾倉 (Mk316 Mod 0) 10발들이 7.62 mm 탄창 (Mk316 Mod 0) 7.62毫米 10發 彈匣 (Mk316 Mod 0 狙擊專用彈) - 7.62 mm 10发 弹匣 (Mk316 Mod 0 狙击专用弹) + 7.62 mm 10发 弹匣(Mk316 Mod 0) 7.62 mm 10Rnd Mag (Mk316 Mod 0) @@ -2178,7 +2236,7 @@ 7.62 mm Mk316 7.62 mm Mk316 7.62毫米 Mk316 狙擊專用彈 - 7.62 mm Mk316 狙击专用弹 + 7.62 mm Mk316 7.62 mm Mk316 @@ -2195,7 +2253,7 @@ 口径: 7.62x51 mm NATO (Mk316 Mod 0)<br />装填数: 10 구경: 7.62x51 mm NATO (Mk316 Mod 0)<br />장탄수: 10 口徑: 7.62x51毫米 NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (Mk316 Mod 0 狙击专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(Mk316 Mod 0 狙击专用弹)<br />发数:10 Kalibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Mermi: 10 @@ -2212,7 +2270,7 @@ 7.62 mm 20発入り 弾倉 (Mk316 Mod 0) 20발들이 7.62 mm 탄창 (Mk316 Mod 0) 7.62毫米 20發 彈匣 (Mk316 Mod 0 狙擊專用彈) - 7.62 mm 20发 弹匣 (Mk316 Mod 0 狙击专用弹) + 7.62 mm 20发 弹匣(Mk316 Mod 0) 7.62 mm 20Rnd Mag (Mk316 Mod 0) @@ -2229,7 +2287,7 @@ 7.62 mm Mk316 7.62 mm Mk316 7.62毫米 Mk316 狙擊專用彈 - 7.62 mm Mk316 狙击专用弹 + 7.62 mm Mk316 7.62 mm Mk316 @@ -2246,7 +2304,7 @@ 口径: 7.62x51 mm NATO (Mk316 Mod 0)<br />装填数: 20 구경: 7.62x51 mm NATO (Mk316 Mod 0)<br />장탄수: 20 口徑: 7.62x51毫米 NATO標準 (Mk316 Mod 0 狙擊專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (Mk316 Mod 0 狙击专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(Mk316 Mod 0 狙击专用弹)<br />发数:20 Kalibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Mermi: 20 @@ -2263,7 +2321,7 @@ 7.62 mm 10発入り 弾倉 (Mk319 Mod 0) 10발들이 7.62 mm 탄창 (Mk319 Mod 0) 7.62毫米 10發 彈匣 (Mk319 Mod 0 特戰專用彈) - 7.62 mm 10发 弹匣 (Mk319 Mod 0 特战专用弹) + 7.62 mm 10发 弹匣(Mk319 Mod 0) 7.62 mm 10Rnd Mag (Mk319 Mod 0) @@ -2280,7 +2338,7 @@ 7.62 mm Mk319 7.62 mm Mk319 7.62毫米 Mk319 特戰專用彈 - 7.62 mm Mk319 特战专用弹 + 7.62 mm Mk319 7.62 mm Mk319 @@ -2297,7 +2355,7 @@ 口径: 7.62x51 mm NATO (Mk319 Mod 0)<br />装填数: 10 구경: 7.62x51 mm NATO (Mk319 Mod 0)<br />장탄수: 10 口徑: 7.62x51毫米 NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (Mk319 Mod 0 特战专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(Mk319 Mod 0 特战专用弹)<br />发数:10 Kalibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Mermi: 20 @@ -2314,7 +2372,7 @@ 7.62 mm 20発入り 弾倉 (Mk319 Mod 0) 20발들이 7.62 mm 탄창 (Mk319 Mod 0) 7.62毫米 20發 彈匣 (Mk319 Mod 0 特戰專用彈) - 7.62 mm 20发 弹匣 (Mk319 Mod 0 特战专用弹) + 7.62 mm 20发 弹匣(Mk319 Mod 0) 7.62 mm 20Rnd Mag (Mk319 Mod 0) @@ -2331,7 +2389,7 @@ 7.62 mm Mk319 7.62 mm Mk319 7.62毫米 Mk319 特戰專用彈 - 7.62 mm Mk319 特战专用弹 + 7.62 mm Mk319 7.62 mm Mk319 @@ -2348,7 +2406,7 @@ 口径: 7.62x51 mm NATO (Mk319 Mod 0)<br />装填数: 20 구경: 7.62x51 mm NATO (Mk319 Mod 0)<br />장탄수: 20 口徑: 7.62x51毫米 NATO標準 (Mk319 Mod 0 特戰專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (Mk319 Mod 0 特战专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(Mk319 Mod 0)<br />发数:20 Kalibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Mermi: 20 @@ -2365,7 +2423,7 @@ 7.62 mm 10発入り 弾倉 (M993 徹甲弾) 10발들이 7.62 mm 탄창 (M993 철갑탄) 7.62毫米 10發 彈匣 (M993 穿甲專用彈) - 7.62 mm 10发 弹匣 (M993 穿甲专用弹) + 7.62 mm 10发 弹匣(M993 穿甲) 7.62 mm 10Rnd Mag (M993 AP) @@ -2382,7 +2440,7 @@ 7.62 mm 徹甲弾 7.62 mm 철갑탄 7.62毫米 M993 穿甲專用彈 - 7.62 mm M993 穿甲专用弹 + 7.62 mm M993 7.62 mm AP @@ -2399,7 +2457,7 @@ 口径: 7.62x51 mm NATO (Mk319 Mod 0)<br />装填数: 10 구경: 7.62x51 mm NATO (M993 철갑탄)<br />장탄수: 10 口徑: 7.62x51毫米 NATO標準 (M993 穿甲專用彈)<br />發數: 10 - 口径: 7.62x51 mm NATO标准 (M993 穿甲专用弹)<br />发数: 10 + 口径:7.62x51 mm 北约(M993 穿甲)<br />发数:10 Kalibre: 7.62x51 mm NATO (M993 AP)<br />Mermi: 10 @@ -2416,7 +2474,7 @@ 7.62 mm 20発入り 弾倉 (M993 徹甲弾) 20발들이 7.62 mm 탄창 (M993 철갑탄) 7.62毫米 20發 彈匣 (M993 穿甲專用彈) - 7.62 mm 20发 弹匣 (M993 穿甲专用弹) + 7.62 mm 20发 弹匣(M993 穿甲) 7.62 mm 20Rnd Mag (M993 AP) @@ -2433,7 +2491,7 @@ 7.62 mm 徹甲弾 7.62 mm 철갑탄 7.62毫米 M993 穿甲專用彈 - 7.62 mm M993 穿甲专用弹 + 7.62 mm M993 7.62 mm AP @@ -2450,7 +2508,7 @@ 口径: 7.62x51 mm NATO (M993 徹甲弾)<br />装填数: 20 구경: 7.62x51 mm NATO (M993 철갑탄)<br />장탄수: 20 口徑: 7.62x51毫米 NATO標準 (M993 穿甲專用彈)<br />發數: 20 - 口径: 7.62x51 mm NATO标准 (M993 穿甲专用弹)<br />发数: 20 + 口径:7.62x51 mm 北约(M993 穿甲)<br />发数:20 Kalibre: 7.62x51 mm NATO (M993 AP)<br />Mermi: 20 @@ -2467,7 +2525,7 @@ .300 WM 20発入り 弾倉 (Mk248 Mod 0) 20발들이 .300 WM 탄창 (Mk248 Mod 0) .300 萬能(WM) 20發 彈匣 (Mk248 Mod 0 狙擊專用彈) - .300 WM 20发 弹匣 (Mk248 Mod 0 狙击专用弹) + .300 WM 20发 弹匣(Mk248 Mod 0) .300 WM 20Rnd Mag (Mk248 Mod 0) @@ -2484,7 +2542,7 @@ .300 WM Mk248 .300 WM Mk248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2501,7 +2559,7 @@ 口径: .300 WM NATO (Mk248 Mod 0)<br />装填数: 20 구경: .300 WM NATO (Mk248 Mod 0)<br />장탄수: 20 口徑: .300 西米 NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 20 - 口径: .300 WM NATO标准 (Mk248 Mod 0 狙击专用弹)<br />发数: 20 + 口径:.300 WM 北约(Mk248 Mod 0 狙击专用弹)<br />发数:20 Kalibre: .300 WM NATO (Mk248 Mod 0)<br />Mermi: 20 @@ -2518,7 +2576,7 @@ .300 WM 20発入り 弾倉 (Mk248 Mod 1) 20발들이 .300 WM 탄창 (Mk248 Mod 1) .300 西米 20發 彈匣 (Mk248 Mod 1 狙擊專用彈) - .300 WM 20发 弹匣 (Mk248 Mod 1 狙击专用弹) + .300 WM 20发 弹匣(Mk248 Mod 1) .300 WM 20Rnd Mag (Mk248 Mod 1) @@ -2535,7 +2593,7 @@ .300 WM Mk248 .300 WM Mk248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2552,7 +2610,7 @@ 口径: .300 WM NATO (Mk248 Mod 1)<br />装填数: 20 구경: .300 WM NATO (Mk248 Mod 1)<br />장탄수: 20 口徑: .300 西米 NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 20 - 口径: .300 WM NATO标准 (Mk248 Mod 1 狙击专用弹)<br />发数: 20 + 口径:.300 WM 北约(Mk248 Mod 1 狙击专用弹)<br />发数:20 Kalibre: .300 WM NATO (Mk248 Mod 1)<br />Mermi: 20 @@ -2569,7 +2627,7 @@ .300 WM 20発入り 弾倉 (Berger Hybrid OTM) 20발들이 .300 WM 탄창 (Berger Hybrid OTM) .300 西米 20發 彈匣 (Berger Hybrid 空尖比賽專用彈) - .300 WM 20发 弹匣 (Berger Hybrid 空尖比赛专用弹) + .300 WM 20发 弹匣(Berger Hybrid 空尖) .300 WM 20Rnd Mag (Berger Hybrid OTM) @@ -2586,7 +2644,7 @@ .300 WM OTM .300 WM OTM .300 西米 空尖比賽專用彈 - .300 WM 空尖比赛专用弹 + .300 WM 空尖 .300 WM OTM @@ -2603,7 +2661,7 @@ 口径: .300 WM NATO (Berger Hybrid OTM)<br />装填数: 20 구경: .300 WM NATO (Berger Hybrid OTM)<br />장탄수: 20 口徑: .300 西米 NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 20 - 口径: .300 WM NATO标准 (Berger Hybrid 空尖比赛专用弹)<br />发数: 20 + 口径:.300 WM 北约(Berger Hybrid 空尖)<br />发数:20 Kalibre: .300 WM NATO (Berger Hybrid OTM)<br />Mermi: 20 @@ -2620,7 +2678,7 @@ .300 WM 10発入り 弾倉 (Mk248 Mod 0) 10발들이 .300 WM 탄창 (Mk248 Mod 0) .300 萬能(WM) 10發 彈匣 (Mk248 Mod 0 狙擊專用彈) - .300 WM 10发 弹匣 (Mk248 Mod 0 狙击专用弹) + .300 WM 10发 弹匣(Mk248 Mod 0) .300 WM 10Rnd Mag (Mk248 Mod 0) @@ -2637,7 +2695,7 @@ .300 WM Mk248 .300 WM Mk248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2654,7 +2712,7 @@ 口径: .300 WM NATO (Mk248 Mod 0)<br />装填数: 10 구경: .300 WM NATO (Mk248 Mod 0)<br />장탄수: 10 口徑: .300 西米 NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 10 - 口径: .300 WM NATO标准 (Mk248 Mod 0 狙击专用弹)<br />发数: 10 + 口径:.300 WM 北约(Mk248 Mod 0 狙击专用弹)<br />发数:10 Kalibre: .300 WM NATO (Mk248 Mod 0)<br />Mermi: 10 @@ -2671,7 +2729,7 @@ .300 WM 10発入り 弾倉 (Mk248 Mod 1) 10발들이 .300 WM 탄창 (Mk248 Mod 1) .300 西米 10發 彈匣 (Mk248 Mod 1 狙擊專用彈) - .300 WM 10发 弹匣 (Mk248 Mod 1 狙击专用弹) + .300 WM 10发 弹匣(Mk248 Mod 1) .300 WM 10Rnd Mag (Mk248 Mod 1) @@ -2688,7 +2746,7 @@ .300 WM Mk248 .300 WM Mk248 .300 西米 Mk248 狙擊專用彈 - .300 WM Mk248 狙击专用弹 + .300 WM Mk248 .300 WM Mk248 @@ -2705,7 +2763,7 @@ 口径: .300 WM NATO (Mk248 Mod 1)<br />装填数: 10 구경: .300 WM NATO (Mk248 Mod 1)<br />장탄수: 10 口徑: .300 西米 NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 10 - 口径: .300 WM NATO标准 (Mk248 Mod 1 狙击专用弹)<br />发数: 10 + 口径:.300 WM 北约(Mk248 Mod 1 狙击专用弹)<br />发数:10 Kalibre: .300 WM NATO (Mk248 Mod 1)<br />Mermi: 10 @@ -2722,7 +2780,7 @@ .300 WM 10発入り 弾倉 (Berger Hybrid OTM) 10발들이 .300 WM 탄창 (Berger Hybrid OTM) .300 西米 10發 彈匣 (Berger Hybrid 空尖比賽專用彈) - .300 WM 10发 弹匣 (Berger Hybrid 空尖比赛专用弹) + .300 WM 10发 弹匣(Berger Hybrid 空尖) .300 WM 10Rnd Mag (Berger Hybrid OTM) @@ -2739,7 +2797,7 @@ .300 WM OTM .300 WM OTM .300 西米 空尖比賽專用彈 - .300 WM 空尖比赛专用弹 + .300 WM 空尖 .300 WM OTM @@ -2756,7 +2814,7 @@ 口径: .300 WM NATO (Berger Hybrid OTM)<br />装填数: 10 구경: .300 WM NATO (Berger Hybrid OTM)<br />장탄수: 10 口徑: .300 西米 NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 10 - 口径: .300 WM NATO标准 (Berger Hybrid 空尖比赛专用弹)<br />发数: 10 + 口径:.300 WM 北约(Berger Hybrid 空尖)<br />发数:10 Kalibre: .300 WM NATO (Berger Hybrid OTM)<br />Mermi: 10 @@ -2765,6 +2823,8 @@ Ch. 6,5x47 mm 30Cps Sable (HPBT Scenar) 6.5x47 mm 30-Patronen-Magazin Sandfarben (HPBT Scenar) Magazynek 6.5x47 mm 30rd Piaskowy (HPBT Scenar) + 6.5x47 mm 30发 沙色弹匣(HPBT Scenar) + 6.5x47 mm 30발 사막 탄창 (HPBT Scenar) 6.5x47 mm 30Rnd Promet Mag (HPBT Scenar) @@ -2772,6 +2832,8 @@ Ch. 6,5x47 mm 30Cps Promet (HPBT Scenar) 6.5x47 mm 30-Patronen-Magazin für Promet (HPBT Scenar) Magazynek 6.5x47 mm 30rd Promet (HPBT Scenar) + 6.5x47 mm 30发 Promet 弹匣(HPBT Scenar) + 6.5x47 mm 30발 프로멧 탄창 (HPBT Scenar) 6.5x47 mm 30Rnd Black Mag (HPBT Scenar) @@ -2779,6 +2841,8 @@ Ch. 6,5x47 mm 30Cps Noir (HPBT Scenar) 6.5x47 mm 30-Patronen-Magazin Schwarz (HPBT Scenar) Magazynek 6.5x47 mm 30rd Czarny (HPBT Scenar) + 6.5x47 mm 30发 黑色弹匣(HPBT Scenar) + 6.5x47 mm 30발 검정 탄창 (HPBT Scenar) 6.5x47 mm 30Rnd Khaki Mag (HPBT Scenar) @@ -2786,6 +2850,8 @@ Ch. 6,5x47 mm 30Cps Kaki (HPBT Scenar) 6.5x47 mm 30-Patronen-Magazin Khaki (HPBT Scenar) Magazynek 6.5x47 mm 30rd Khaki (HPBT Scenar) + 6.5x47 mm 30发 卡其色弹匣(HPBT Scenar) + 6.5x47 mm 30발 카키 탄창 (HPBT Scenar) 6.5 mm Lapua @@ -2801,7 +2867,7 @@ 6.5 mm Lapua 6.5 mm Lapua 6.5毫米 拉普 空尖艇尾狙擊專用彈 - 6.5 mm Lapua 空尖艇尾狙击专用弹 + 6.5 mm Lapua 6.5 mm Lapua @@ -2818,7 +2884,7 @@ 口径: 6.5x47 mm (HPBT Scenar)<br />装填数: 30<br />次で使用: MXM 구경: 6.5x47 mm (HPBT Scenar)<br />장탄수: 30<br />사용처: MXM 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 30<br />使用於: MXM - 口径: 6.5x47 mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 30<br />使用于: MXM + 口径:6.5x47 mm(HPBT Scenar 狙击专用弹)<br />发数:30<br />使用于:MXM Kalibre: 6.5x47 mm (HPBT Scenar)<br />Mermi: 30<br />Kullanıyor: MXM @@ -2835,7 +2901,7 @@ 口径: 6.5x47 mm (HPBT Scenar)<br />装填数: 30<br />次で使用: Promet MR 구경: 6.5x47 mm (HPBT Scenar)<br />장탄수: 30<br />사용처: Promet MR 口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<br />發數: 30<br />使用於: Promet MR - 口径: 6.5x47 mm (Lapua 空尖艇尾狙击专用弹)<br />发数: 30<br />使用于: Promet MR + 口径:6.5x47 mm(HPBT Scenar 狙击专用弹)<br />发数:30<br />使用于:Promet MR Kalibre: 6.5x47 mm (HPBT Scenar)<br />Mermi: 30<br />Kullanıyor: Promet MR @@ -2844,6 +2910,8 @@ Ch. 6,5 mm Creedmor 30Cps Sable 6.5 mm Creedmor 30-Patronen-Magazin Sandfarben Magazynek 6.5 mm Creedmor 30Rnd Piaskowy + 6.5 mm 30发 沙色弹匣(Creedmor) + 6.5 mm 크리드무어 30발 사막 탄창 6.5 mm Creedmor 30Rnd Promet Mag @@ -2851,6 +2919,8 @@ Ch. 6,5 mm Creedmor 30Cps Promet 6.5 mm Creedmor 30-Patronen-Magazin für Promet Magazynek 6.5 mm Creedmor 30Rnd Promet + 6.5 mm 30发 Promet 弹匣(Creedmor) + 6.5 mm 크리드무어 30발 프로멧 탄창 6.5 mm Creedmor 30Rnd Black Mag @@ -2858,6 +2928,8 @@ Ch. 6,5 mm Creedmor 30Cps Noir 6.5 mm Creedmor 30-Patronen-Magazin Schwarz Magazynek 6.5 mm Creedmor 30Rnd Czarny + 6.5 mm 30发 黑色弹匣(Creedmor) + 6.5 mm 크리드무어 30발 검정 탄창 6.5 mm Creedmor 30Rnd Khaki Mag @@ -2865,6 +2937,8 @@ Ch. 6,5 mm Creedmor 30Cps Kaki 6.5 mm Creedmor 30-Patronen-Magazin Khaki Magazynek 6.5 mm Creedmor 30Rnd Khaki + 6.5 mm 30发 卡其色弹匣(Creedmor) + 6.5 mm 크리드무어 30발 카키 탄창 6.5 mm CM @@ -2880,7 +2954,7 @@ 6.5 mm CM 6.5 mm CM 6.5毫米 CM狙擊專用彈 - 6.5 mm CM 狙击专用弹 + 6.5 mm CM 6.5 mm CM @@ -2897,7 +2971,7 @@ 口径: 6.5x47 mm Creedmor<br />装填数: 30<br />次で使用: MXM 구경: 6.5x47 mm Creedmor<br />장탄수: 30<br />사용처: MXM 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 30<br />使用於: MXM - 口径: 6.5x47 mm Creedmor 狙击专用弹<br />发数: 30<br />使用于: MXM + 口径:6.5x47 mm Creedmor 狙击专用弹<br />发数:30<br />使用于:MXM Kalibre: 6.5x47 mm Creedmor<br />Mermi: 30<br />Kullanıyor: MXM @@ -2914,7 +2988,7 @@ 口径: 6.5x47 mm Creedmor<br />装填数: 30<br />次で使用: Promet MR 구경: 6.5x47 mm Creedmor<br />장탄수: 30<br />사용처: Promet MR 口徑: 6.5x47毫米 克里德莫爾 狙擊專用彈<br />發數: 30<br />使用於: Promet MR - 口径: 6.5x47 mm Creedmor 狙击专用弹<br />发数: 30<br />使用于: Promet MR + 口径:6.5x47 mm Creedmor 狙击专用弹<br />发数:30<br />使用于:Promet MR Kalibre: 6.5x47 mm Creedmor<br />Mermi: 30<br />Kullanıyor: Promet MR @@ -2931,7 +3005,7 @@ .338 LM 10発入り 弾倉 (300gr Lapua Scenar) 10발들이 .338 탄창 (300gr Lapua Scenar) .338 10發 彈匣 (300公克 Lapua Scenar) - .338 LM 10发 弹匣 (300公克 Lapua Scenar) + .338 LM 10发 弹匣(300gr Lapua Scenar) .338 LM 10Rnd Mag (300gr Lapua Scenar) @@ -2965,7 +3039,7 @@ 口径: 8.6x70mm (300gr Lapua Scenar)<br />装填数: 10 구경: 8.6x70mm (300gr Lapua Scenar)<br />장탄수: 10 口徑: 8.6x70毫米 (300公克 Lapua Scenar)<br />發數: 10 - 口径: 8.6x70mm (300公克 Lapua Scenar)<br />发数: 10 + 口径:8.6x70 mm(300gr Lapua Scenar)<br />发数:10 Kalibre: 8.6x70mm (300gr Lapua Scenar)<br />Mermi: 10 @@ -2982,7 +3056,7 @@ .338 LM 10発入り 弾倉 (API526) 10발들이 .338 LM 탄창 (API526) .338 10發 彈匣 (API526 穿甲燃燒彈) - .338 LM 10发 弹匣 (API526 穿甲燃烧弹) + .338 LM 10发 弹匣(API526 穿燃) .338 LM 10Rnd Mag (API526) @@ -2999,7 +3073,7 @@ .338 徹甲弾 .338 철갑탄 .338 API526 穿甲燃燒彈 - .338 API526 穿甲燃烧弹 + .338 穿燃 .338 AP @@ -3016,7 +3090,7 @@ 口径: 8.6x70mm (API526)<br />装填数: 10 구경: 8.6x70mm (API526)<br />장탄수: 10 口徑: 8.6x70毫米 (API526 穿甲燃燒彈)<br />發數: 10 - 口径: 8.6x70mm (API526 穿甲燃烧弹)<br />发数: 10 + 口径:8.6x70 mm(API526 穿燃)<br />发数:10 Kalibre: 8.6x70mm (API526)<br />Mermi: 10 @@ -3033,7 +3107,7 @@ .408 7発入り 弾倉 (305gr) 7발들이 .408 탄창 (305gr) .408 7發 彈匣 (305公克) - .408 7发 弹匣 (305公克) + .408 7发 弹匣(305gr) .408 7Rnd Mag (305gr) @@ -3067,7 +3141,7 @@ 口径: .408 CheyTac (305gr)<br />装填数: 7 구경: .408 CheyTac (305gr)<br />장탄수: 7 口徑: .408 夏伊戰術狙擊彈 (305公克)<br />發數: 7 - 口径: .408 夏伊战术狙击弹 (305公克)<br />发数: 7 + 口径:.408 夏伊(305gr)<br />发数:7 Kalibre: .408 CheyTac (305gr)<br />Mermi: 7 @@ -3101,7 +3175,7 @@ 口径: 12.7x99 mm<br />装填数: 5 구경: 12.7x99 mm<br />장탄수: 5 口徑: 12.7x99毫米<br />發數: 5 - 口径: 12.7x99 mm<br />发数: 5 + 口径:12.7x99 mm<br />发数:5 Kalibre: 12.7x99 mm<br />Mermi: 5 @@ -3135,7 +3209,7 @@ 口径: 12.7x99 mm<br />装填数: 10 구경: 12.7x99 mm<br />장탄수: 10 口徑: 12.7x99毫米<br />發數: 10 - 口径: 12.7x99 mm<br />发数: 10 + 口径:12.7x99 mm<br />发数:10 Kalibre: 12.7x99 mm<br />Mermi: 10 @@ -3169,7 +3243,7 @@ 12.7x99 mm 5発入り焼夷徹甲弾 弾倉 5발들이 12.7x99 mm 철갑소이탄 탄창 12.7x99毫米 穿甲燃燒彈 5發 彈匣 - 12.7x99 mm 穿甲燃烧弹 5发 弹匣 + 12.7x99 mm 穿燃 5发 弹匣 12.7x99 mm API 5Rnd Mag @@ -3186,7 +3260,7 @@ 口径: 12.7x99 mm 焼夷徹甲弾<br />装填数: 5 구경: 12.7x99 mm 철갑소이탄<br />장탄수: 5 口徑: 12.7x99毫米 穿甲燃燒彈<br />發數: 5 - 口径: 12.7x99 mm 穿甲燃烧弹<br />发数: 5 + 口径:12.7x99 mm 穿燃<br />发数:5 Kalibre: 12.7x99 mm API<br />Mermi: 5 @@ -3203,7 +3277,7 @@ 12.7x99 mm 10発入り焼夷徹甲弾 弾倉 10발들이 12.7x99 mm 철갑소이탄 탄창 12.7x99毫米 穿甲燃燒彈 10發 彈匣 - 12.7x99 mm 穿甲燃烧弹 10发 弹匣 + 12.7x99 mm 穿燃 10发 弹匣 12.7x99 mm API 10Rnd Mag @@ -3220,7 +3294,7 @@ 口径: 12.7x99 mm 焼夷徹甲弾<br />装填数: 10 구경: 12.7x99 mm 철갑소이탄<br />장탄수: 10 口徑: 12.7x99毫米 穿甲燃燒彈<br />發數: 10 - 口径: 12.7x99 mm 穿甲燃烧弹<br />发数: 10 + 口径:12.7x99 mm 穿燃<br />发数:10 Kalibre: 12.7x99 mm API<br />Mermi: 10 @@ -3237,7 +3311,7 @@ 12.7x99 mm 5発入り 弾倉 (AMAX) 5발들이 12.7x99 mm 탄창 (AMAX) 12.7x99毫米 5發 彈匣 (AMAX 比賽專用彈) - 12.7x99 mm 5发 弹匣 (AMAX 比赛专用弹) + 12.7x99 mm 5发 弹匣(AMAX) 12.7x99 mm 5Rnd Şarjör (AMAX) @@ -3254,7 +3328,7 @@ 口径: 12.7x99 mm (AMAX)<br />装填数: 5 구경: 12.7x99 mm (AMAX)<br />장탄수: 5 口徑: 12.7x99毫米 (AMAX 比賽專用彈)<br />發數: 5 - 口径: 12.7x99 mm (AMAX 比赛专用弹)<br />发数: 5 + 口径:12.7x99 mm(AMAX)<br />发数:5 Kalibre: 12.7x99 mm (AMAX)<br />Mermi: 5 @@ -3271,7 +3345,7 @@ 12.7x99 mm 10発入り 弾倉 (AMAX) 10발들이 12.7x99 mm 탄창 (AMAX) 12.7x99毫米 10發 彈匣 (AMAX 比賽專用彈) - 12.7x99 mm 10发 弹匣 (AMAX 比赛专用弹) + 12.7x99 mm 10发 弹匣(AMAX) 12.7x99 mm 10Rnd Şarjör (AMAX) @@ -3288,7 +3362,7 @@ 口径: 12.7x99 mm (AMAX)<br />装填数: 10 구경: 12.7x99 mm (AMAX)<br />장탄수: 10 口徑: 12.7x99毫米 (AMAX 比賽專用彈)<br />發數: 10 - 口径: 12.7x99 mm (AMAX 比赛专用弹)<br />发数: 10 + 口径:12.7x99 mm(AMAX)<br />发数:10 Kalibre: 12.7x99 mm (AMAX)<br />Mermi: 10 @@ -3305,7 +3379,7 @@ 12.7 mm 12.7 mm 12.7毫米 AMAX 比賽專用彈 - 12.7 mm AMAX 比赛专用弹 + 12.7 mm 12.7 mm @@ -3322,7 +3396,7 @@ 12.7 mm 焼夷徹甲弾 12.7 mm 철갑소이탄 12.7毫米 穿甲燃燒彈 - 12.7 mm 穿甲燃烧弹 + 12.7 mm 穿燃 12.7 mm API @@ -3355,13 +3429,14 @@ Pas du canon Stoupání vývrtu hlavně Estriado del cañón + 강선 회전율 Barrel length Lauflänge Longueur du canon 銃身長 - 身管长度 + 枪管长度 槍管長度 Lunghezza della canna Długość lufy @@ -3370,6 +3445,7 @@ Délka hlavně Longitud del cañón Namlu Uzunluğu + 총열 길이 Ballistic coefficient @@ -3385,6 +3461,7 @@ Balistický koeficient Coheficiente de balística Balistik Katsayısı + 탄도 계수 Bullet mass @@ -3400,6 +3477,7 @@ Váha projektilu Masa de la bala Mermi Ağırlığı + 탄두 질량 Muzzle velocity @@ -3415,6 +3493,7 @@ Úsťová rychlost Velocidad inicial Namlu çıkış hızı + 총구 속도 diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index d000ad6083..8fe0596338 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { class ACE_ApplyHandcuffs { displayName = CSTRING(SetCaptive); selection = "righthand"; - distance = 2; + distance = HANDCUFFS_DISTANCE; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); exceptions[] = {"isNotSwimming", "isNotInside"}; @@ -16,7 +16,7 @@ class CfgVehicles { class ACE_RemoveHandcuffs { displayName = CSTRING(ReleaseCaptive); selection = "righthand"; - distance = 2; + distance = HANDCUFFS_DISTANCE; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); exceptions[] = {"isNotSwimming", "isNotInside"}; diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index fc0880b794..8d34c4fb40 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -41,7 +41,7 @@ if (!hasInterface) exitWith {}; private _target = cursorObject; if !([ACE_player, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; if !(_target isKindOf "CAManBase") exitWith {false}; - if ((_target distance ACE_player) > getNumber (configFile >> "CfgVehicles" >> "CAManBase" >> "ACE_Actions" >> "ACE_ApplyHandcuffs" >> "distance")) exitWith {false}; + if ((_target distance ACE_player) > getNumber (configOf ACE_player >> "ACE_Actions" >> "ACE_ApplyHandcuffs" >> "distance")) exitWith {false}; if ([ACE_player, _target] call FUNC(canApplyHandcuffs)) exitWith { [ACE_player, _target] call FUNC(doApplyHandcuffs); diff --git a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf index 7c9daf1080..5ed3cb5871 100644 --- a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf +++ b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf @@ -20,18 +20,21 @@ TRACE_1("params", _vehicle); scopeName "main"; +private _seats = fullCrew [_vehicle, "", true]; +reverse _seats; + { _x params ["_unit", "_role", "_cargoIndex", "_turretPath", "_isPersonTurret"]; if (isNull _unit && {_role == "cargo"} && {_cargoIndex > -1} && {!_isPersonTurret}) then { [_cargoIndex, false] breakOut "main"; }; -} forEach (fullCrew [_vehicle, "", true]); +} forEach _seats; { _x params ["_unit", "_role", "_cargoIndex", "_turretPath", "_isPersonTurret"]; if (isNull _unit && {_cargoIndex > -1}) then { [_cargoIndex, true] breakOut "main"; }; -} forEach (fullCrew [_vehicle, "", true]); +} forEach _seats; [-1, false] diff --git a/addons/captives/script_component.hpp b/addons/captives/script_component.hpp index c0cbefe5b2..76094f990d 100644 --- a/addons/captives/script_component.hpp +++ b/addons/captives/script_component.hpp @@ -15,3 +15,5 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define HANDCUFFS_DISTANCE 2 diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index d9cf15bf71..95a19aedb9 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -8,7 +8,7 @@ 俘虜 俘虏 捕虜 - 포로설정 + 포로 Jeńcy Пленные Prisioneiros @@ -31,7 +31,7 @@ 捕虜にする 포박하기 逮捕俘虜 - 逮捕俘虏 + 俘获 Kelepçele @@ -99,7 +99,7 @@ 捕虜を取っている必要があります! 먼저 포로로 만들어야합니다! 你必須先逮捕他! - 你必须先逮捕他! + 你必须先俘获他! Önce onu tutuklamalısın! @@ -362,7 +362,7 @@ プレイヤーは拘束される前に、投降する必要があります。 체포하기 전에 먼저 플레이어가 투항을 해야만 합니다 玩家須先要求目標投降,才可以進行逮捕 - 玩家须先要求目标投降,才可以进行逮捕 + 玩家须先要求目标投降,才可以进行俘获 Surrendering only @@ -432,7 +432,7 @@ Necessita arresa AI AI の投降を必要とする 需要AI先行投降 - 需要AI先行投降 + 需要 AI 先行投降 AI 항복 필요 Wymaga poddania się przez SI Требовать ИИ сдаться для ареста @@ -447,7 +447,7 @@ Necessita che le AI si arrendano prima di essere arrestate AI の拘束は AI が投降している場合に限り可能にします。 在逮捕AI之前該AI必須先進入投降狀態 - 在逮捕AI之前该AI必须先进入投降状态。 + 在俘获 AI 之前该 AI 必须先进入投降状态。 포박하기 전에 먼저 AI가 투항해야만 합니다. Wymaga poddania się przez SI zanim aresztowanie będzie możliwe Требовать для ареста, чтобы ИИ вначале сдавались @@ -462,7 +462,7 @@ カーソル先のユニットを拘束 Imposta l'unità nello stato di prigioniero. 設置在游標下的單位成俘虜狀態 - 设置在游标下的单位成俘虏状态。 + 设置在光标下的单位成俘虏状态。 커서의 병력을 포박합니다. Ustawia jednostkę pod kursorem jako jeniec. Арестовывает указанный курсором юнит diff --git a/addons/cargo/CfgVehicles.hpp b/addons/cargo/CfgVehicles.hpp index bd31a9c659..20685e411b 100644 --- a/addons/cargo/CfgVehicles.hpp +++ b/addons/cargo/CfgVehicles.hpp @@ -322,6 +322,11 @@ class CfgVehicles { GVAR(canLoad) = 1; }; + // Invisible Target Soldier + class TargetSoldierBase: StaticWeapon { + GVAR(canLoad) = 0; + }; + class StaticMortar; class Mortar_01_base_F: StaticMortar { GVAR(size) = 2; // 1 = small, 2 = large @@ -426,41 +431,43 @@ class CfgVehicles { class Land_CanisterFuel_F: Items_base_F { GVAR(size) = 1; GVAR(canLoad) = 1; - EGVAR(cargo,noRename) = 1; + GVAR(noRename) = 1; }; // Flexible Fuel tanks, 300L class FlexibleTank_base_F: ThingX { GVAR(size) = 3; GVAR(canLoad) = 1; + GVAR(noRename) = 1; }; // objects class RoadCone_F: ThingX { GVAR(size) = 1; GVAR(canLoad) = 1; - EGVAR(cargo,noRename) = 1; + GVAR(noRename) = 1; }; class RoadBarrier_F: RoadCone_F { GVAR(size) = 2; + GVAR(noRename) = 1; }; class Lamps_base_F; class Land_PortableLight_single_F: Lamps_base_F { GVAR(size) = 2; GVAR(canLoad) = 1; - EGVAR(cargo,noRename) = 1; + GVAR(noRename) = 1; }; class FloatingStructure_F; class Land_Camping_Light_F: FloatingStructure_F { GVAR(size) = 0.2; GVAR(canLoad) = 1; - EGVAR(cargo,noRename) = 1; + GVAR(noRename) = 1; }; class Land_Camping_Light_off_F: ThingX { GVAR(size) = 0.2; GVAR(canLoad) = 1; - EGVAR(cargo,noRename) = 1; + GVAR(noRename) = 1; }; diff --git a/addons/cargo/XEH_PREP.hpp b/addons/cargo/XEH_PREP.hpp index 1620a59657..3b5544dbc6 100644 --- a/addons/cargo/XEH_PREP.hpp +++ b/addons/cargo/XEH_PREP.hpp @@ -25,5 +25,6 @@ PREP(startLoadIn); PREP(startUnload); PREP(unload); PREP(unloadAllVehicles); +PREP(unloadCarryItem); PREP(unloadItem); PREP(validateCargoSpace); diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf index d7db77b99c..34379ced6f 100644 --- a/addons/cargo/XEH_postInit.sqf +++ b/addons/cargo/XEH_postInit.sqf @@ -50,8 +50,6 @@ GVAR(interactionParadrop) = false; createDialog QGVAR(menu); }; - - // TOOO maybe drag/carry the unloaded item? }] call CBA_fnc_addEventHandler; [QGVAR(serverUnload), { @@ -101,7 +99,7 @@ GVAR(objectActions) = [ {(_target getVariable [QGVAR(canLoad), getNumber (configOf _target >> QGVAR(canLoad))]) in [true, 1]} && {alive _target} && {[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)} && - {(getNumber ((configOf _target) >> QGVAR(noRename))) == 0} + {(_target getVariable [QGVAR(noRename), getNumber (configOf _target >> QGVAR(noRename))]) in [false, 0]} } ] call EFUNC(interact_menu,createAction), [QGVAR(load), localize LSTRING(loadObject), "a3\ui_f\data\IGUI\Cfg\Actions\loadVehicle_ca.paa", diff --git a/addons/cargo/functions/fnc_canLoadItemIn.sqf b/addons/cargo/functions/fnc_canLoadItemIn.sqf index 469dc45c9d..906bcc8868 100644 --- a/addons/cargo/functions/fnc_canLoadItemIn.sqf +++ b/addons/cargo/functions/fnc_canLoadItemIn.sqf @@ -35,7 +35,8 @@ if (_item isEqualType "") then { } else { _validItem = (alive _item) && - {_ignoreInteraction || {([_item, _vehicle] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}}; + {_ignoreInteraction || {([_item, _vehicle] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}} && + {!(_item getVariable [QEGVAR(cookoff,isCookingOff), false])}; }; _validItem && diff --git a/addons/cargo/functions/fnc_getNameItem.sqf b/addons/cargo/functions/fnc_getNameItem.sqf index ac97dd51dc..60f76fc3c9 100644 --- a/addons/cargo/functions/fnc_getNameItem.sqf +++ b/addons/cargo/functions/fnc_getNameItem.sqf @@ -18,8 +18,11 @@ params ["_object", ["_addCustomPart", false]]; -private _class = if (_object isEqualType "") then {_object} else {typeOf _object}; -private _displayName = getText (configFile >> "CfgVehicles" >> _class >> "displayName"); +private _displayName = if (_object isEqualType "") then { + getText (configFile >> "CfgVehicles" >> _object >> "displayName") +} else { + getText ((configOf _object) >> "displayName") +}; if (_addCustomPart && {!(_object isEqualType "")}) then { private _customPart = _object getVariable [QGVAR(customName), ""]; diff --git a/addons/cargo/functions/fnc_initObject.sqf b/addons/cargo/functions/fnc_initObject.sqf index 0df277c520..c2158443be 100644 --- a/addons/cargo/functions/fnc_initObject.sqf +++ b/addons/cargo/functions/fnc_initObject.sqf @@ -17,6 +17,7 @@ params ["_object"]; private _type = typeOf _object; +private _config = configOf _object; TRACE_2("params",_object,_type); // If object had size given to it via eden/public then override config canLoad setting @@ -24,7 +25,7 @@ private _canLoadPublic = _object getVariable [QGVAR(canLoad), false]; if (!(_canLoadPublic isEqualType false)) then { WARNING_4("%1[%2] - Variable %3 is %4 - Should be bool",_object,_type,QGVAR(canLoad),_canLoadPublic); }; -private _canLoadConfig = getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(canLoad)) == 1; +private _canLoadConfig = getNumber (_config >> QGVAR(canLoad)) == 1; // Nothing to do here if object can't be loaded if !(_canLoadConfig || {_canLoadPublic in [true, 1]}) exitWith {}; diff --git a/addons/cargo/functions/fnc_initVehicle.sqf b/addons/cargo/functions/fnc_initVehicle.sqf index dac28a5ac9..885131c534 100644 --- a/addons/cargo/functions/fnc_initVehicle.sqf +++ b/addons/cargo/functions/fnc_initVehicle.sqf @@ -19,10 +19,11 @@ params ["_vehicle"]; TRACE_1("params", _vehicle); private _type = typeOf _vehicle; +private _config = configOf _vehicle; // If vehicle had space given to it via eden/public then override config hasCargo setting private _hasCargoPublic = _vehicle getVariable [QGVAR(hasCargo), false]; -private _hasCargoConfig = getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) == 1; +private _hasCargoConfig = getNumber (_config >> QGVAR(hasCargo)) == 1; // Nothing to do here if vehicle has no cargo space if !(_hasCargoConfig || _hasCargoPublic) exitWith {}; @@ -40,13 +41,11 @@ if (_addCargoType) then { // Vehicle can have default ace cargo in its config if (isServer) then { { - if (isClass _x) then { - private _cargoClassname = getText (_x >> "type"); - private _cargoCount = getNumber (_x >> "amount"); - TRACE_3("adding ACE_Cargo", (configName _x), _cargoClassname, _cargoCount); - ["ace_addCargo", [_cargoClassname, _vehicle, _cargoCount]] call CBA_fnc_localEvent; - }; - } count ("true" configClasses (configFile >> "CfgVehicles" >> _type >> "ACE_Cargo" >> "Cargo")); + private _cargoClassname = getText (_x >> "type"); + private _cargoCount = getNumber (_x >> "amount"); + TRACE_3("adding ACE_Cargo", (configName _x), _cargoClassname, _cargoCount); + ["ace_addCargo", [_cargoClassname, _vehicle, _cargoCount]] call CBA_fnc_localEvent; + } forEach ("true" configClasses (_config >> QUOTE(ADDON) >> "Cargo")); }; // Servers and HCs do not require action menus (beyond this point) diff --git a/addons/cargo/functions/fnc_renameObject.sqf b/addons/cargo/functions/fnc_renameObject.sqf index e935620048..48e9b09b70 100644 --- a/addons/cargo/functions/fnc_renameObject.sqf +++ b/addons/cargo/functions/fnc_renameObject.sqf @@ -19,6 +19,7 @@ private _display = uiNamespace getVariable QGVAR(menuDisplay); if (isNil "_display") exitWith {}; private _ctrlEditText = ctrlText 100; +_ctrlEditText = _ctrlEditText select [0,32]; if (_ctrlEditText isEqualTo "") then { // custom name has been removed [LSTRING(clearedCustomName), 3] call EFUNC(common,displayTextStructured); } else { diff --git a/addons/cargo/functions/fnc_unloadCarryItem.sqf b/addons/cargo/functions/fnc_unloadCarryItem.sqf new file mode 100644 index 0000000000..c12f12cb52 --- /dev/null +++ b/addons/cargo/functions/fnc_unloadCarryItem.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + * Author: GhostIsSpooky + * Dragging integration. Unloader starts carrying unloaded object. + * + * Arguments: + * 0: Unloader + * 1: Item + * + * Return Value: + * None + * + * Example: + * [player, object] call ace_cargo_fnc_unloadCarryItem + * + * Public: No + */ +params ["_unloader", "_object"]; +TRACE_2("unloadCarryItem-start",_unloader,_object); + +if !(["ace_dragging"] call EFUNC(common,isModLoaded)) exitWith {}; +if (!GVAR(carryAfterUnload) || {getNumber (configOf _object >> QGVAR(blockUnloadCarry)) > 0}) exitWith {}; + +// When unloading attached objects, this code will run before server has finished moving object to the safe position +[{ + params ["_unloader", "_object"]; + (_unloader distance _object) < 10 +}, { + params ["_unloader", "_object"]; + TRACE_2("unloadCarryItem-unloaded",_unloader,_object); + if ([_unloader, _object] call EFUNC(dragging,canCarry)) exitWith { + [_unloader, _object] call EFUNC(dragging,startCarry); + }; + if ([_unloader, _object] call EFUNC(dragging,canDrag)) exitWith { + [_unloader, _object] call EFUNC(dragging,startDrag); + }; +}, _this, 1.0, { // delay is based on how long it will take server event to trigger and take effect + // not a hard error if this fails, could have just unloaded to other side of vehicle because of findSafePos + TRACE_1("unloadCarryItem-failed to unload nearby player",_this); +}] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/cargo/functions/fnc_unloadItem.sqf b/addons/cargo/functions/fnc_unloadItem.sqf index 277923a088..89463cab38 100644 --- a/addons/cargo/functions/fnc_unloadItem.sqf +++ b/addons/cargo/functions/fnc_unloadItem.sqf @@ -42,6 +42,9 @@ if !(_item in _loaded) exitWith { private _object = [_item, _emptyPosAGL, _loaded, _vehicle] call FUNC(unload); +// Dragging integration +[_unloader, _object] call FUNC(unloadCarryItem); + // Invoke listenable event ["ace_cargoUnloaded", [_object, _vehicle, "unload"]] call CBA_fnc_globalEvent; true diff --git a/addons/cargo/initSettings.sqf b/addons/cargo/initSettings.sqf index c6e307a94a..8b399276c9 100644 --- a/addons/cargo/initSettings.sqf +++ b/addons/cargo/initSettings.sqf @@ -43,6 +43,15 @@ {[QGVAR(enableRename), _this, true] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; +[ + QGVAR(carryAfterUnload), "CHECKBOX", + [LSTRING(carryAfterUnload), LSTRING(carryAfterUnload_description)], + [LELSTRING(OptionsMenu,CategoryLogistics), LLSTRING(openMenu)], + true, + false, + {[QGVAR(carryAfterUnload), _this] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_fnc_addSetting; + [ QGVAR(cargoNetType), "LIST", [LSTRING(cargoNetType), LSTRING(cargoNetType_description)], diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml index 50c63315a5..3d9f14b864 100644 --- a/addons/cargo/stringtable.xml +++ b/addons/cargo/stringtable.xml @@ -40,6 +40,8 @@ Переименовано в: Neu Bewaffnet: <br/>%1 Nazwa zmieniona na:<br/>%1 + 重命名为:<br/>%1 + %1<br/>으로 명칭을 바꿈 Custom name has been cleared. @@ -48,6 +50,8 @@ Пользовательское название удалено. Eigener Name wurde gelöscht. Własna nazwa została usunięta + 自定义名称已被清除。 + 임의로 지은 명칭을 지웠습니다. Set New Name: @@ -56,6 +60,8 @@ Задать новое название: Neuen Namen setzen: Ustaw nową nazwę: + 设定新名称: + 새로운 명칭 설정: Enable Rename Action @@ -64,6 +70,8 @@ Включить возможность переименования Aktiviere Umbenennungs-Aktion Włącz możliwość zmiany nazwy + 启用重命名动作 + 새로 명칭짓기 행동 활성화 Enables the rename action for renamable objects. @@ -72,6 +80,8 @@ Включает переименование для объектов, допускающих переименование. Aktiviert die Umbenennungs-Aktion für neu benennbare Objekte. Włącza akcję zmiany nazwy dla obiektów z możliwością zmiany nazwy. + 启用可重命名物体的重命名动作。 + 개체의 명칭을 새로 짓는 것을 허가합니다. Cargo @@ -102,7 +112,7 @@ カーゴ メニュー 화물 메뉴 貨物選單 - 货物选单 + 货物菜单 Kargo Menüsü @@ -118,7 +128,7 @@ カーゴの空き容量: %1 선적 공간 남음: %1 貨物剩餘空間: %1 - 货物剩余空间: %1 + 货物剩余空间:%1 Kargo Alanı Kaldı: %1 @@ -148,7 +158,7 @@ Abilita il modulo di caricamento in cargo Active la possibilité de charger du matériel dans un module de fret (véhicule/container). カーゴ モジュールで積み込みを有効化 - 화물 모듈에 싣기를 활성화합니다 + 화물 모듈을 활성화합니다 啟用貨物裝載功能 启用货物装载功能 @@ -285,6 +295,8 @@ Nom personnalisé Eigener Name Własna nazwa + 自定义名称 + 임의 명칭 Set a custom cargo name used in the cargo interface. @@ -293,6 +305,8 @@ Установить пользовательское имя груза, используемое в интерфейсе погрузки. Definiere eigenen Frachtnamen, welcher im Frachtraum genutzt wird. Ustaw własną nazwę ładunku, używaną w menu ładunku. + 设置货物界面中使用的一个自定义货物名称。 + 화물 인터페이스에 쓰일 화물의 명칭을 설정합니다. Cargo Space @@ -347,7 +361,7 @@ Lo spazio del cargo necessita di mantenere questo oggetto (-1 per scaricabile) オブジェクトを積載するのに必要なカーゴ スペース (-1 で積載不可) 此貨物會佔掉多少空間(設定-1的話此貨物就不能被裝載) - 此货物会占掉多少空间(设定-1的话此货物就不能被装载) + 此货物会占掉多少空间(设定 -1 的话此货物就不能被装载) Wymagana przestrzeń ładunkowa dla tego obiektu (-1 dla niemożliwych do załadowania) 이 화물을 적재하는데 필요한 공간 (-1=무조건 적재가능) Грузовое пространство, необходимое для размещения этого объекта (-1 для незагружаемого) @@ -408,9 +422,9 @@ Modificato per quanto tempo ci impiega a paracadutare un oggetto cargo. Modifie le temps nécessaire au paralargage d'une cargaison. 設定空投所需消耗的時間 - 设定空投所需消耗的时间. + 设定空投所需消耗的时间。 Modyfikator wskazujący jak dużo czasu potrzeba by zrzucić przedmiot na spadochronie. - 화물을 공중 투하 하는데 얼마나 걸리는 시간 설정 + 화물을 공중 투하 하는데 걸리는 시간을 설정합니다 Модификатор времени, необходимого для десантирования груза Coeficiente de quanto tempo leva para soltar uma carga de paraquedas Upravuje jak dlouho výsadek trvá pro náklad. @@ -428,6 +442,8 @@ 裝載時間係數 Koeficient času nákládání Coeficiente de tiempo para cargar + 装载时间系数 + 적재 시간 계수 Modifies how long it takes to load/unload items.\nTime, in seconds, is the size of the item multiplied by this value. @@ -441,6 +457,8 @@ 修改要花多長時間來裝載/卸載物品。\n時間,以秒為單位,而物品的大小數值與這個係數成比。 Upravuje jak dlouho nakládají/vykládání trvá.\nVýsledkem je čas v sekundách - velikost objektu vynásobená touto hodnotou. Modifica el tiempo de carga/descarga de objetos.\n El Tiempo en segundos, es el tamño del objeto multiplicado por este valor. + 修改装载/卸载物体所需的时间。\n时间,单位:秒,物体的大小乘以该系数值。 + 화물의 적재/하역 시 걸리는 시간을 설정합니다.\n초 단위로 물건의 크기에 곱셈하여 계산합니다. Reopen Cargo Menu @@ -450,6 +468,8 @@ Переоткрыть меню погрузки Frachtmenü erneut öffnen Ponownie otwórz menu załadunku + 重新打开货物菜单 + 화물 메뉴 다시 열기 Reopen the Cargo Menu after successful unload. @@ -459,6 +479,14 @@ Переоткрыть меню погрузки после успешной выгрузки. Frachtmenü erneut öffnen, nach erfolgreichen Entladen. Ponownie otwórz menu załadunku po udanym wyładowaniu. + 成功卸货后,重新打开货物菜单。 + 화물을 성공적으로 내리고 난 다음 화물 메뉴를 열지 결정합니다. + + + Carry After Unload + + + Controls whether cargo items are carried or dragged after unloading. Type of cargo diff --git a/addons/casings/$PBOPREFIX$ b/addons/casings/$PBOPREFIX$ new file mode 100644 index 0000000000..622c48c2bb --- /dev/null +++ b/addons/casings/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\casings diff --git a/addons/casings/CfgEventHandlers.hpp b/addons/casings/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f6503c2479 --- /dev/null +++ b/addons/casings/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/casings/README.md b/addons/casings/README.md new file mode 100644 index 0000000000..7c1ac9b2a0 --- /dev/null +++ b/addons/casings/README.md @@ -0,0 +1,4 @@ +ace_casings +=============== + +Create persistent empty casing when bullets are fired by infantry weapons. diff --git a/addons/casings/XEH_PREP.hpp b/addons/casings/XEH_PREP.hpp new file mode 100644 index 0000000000..8a0738b272 --- /dev/null +++ b/addons/casings/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(createCasing); diff --git a/addons/casings/XEH_postInit.sqf b/addons/casings/XEH_postInit.sqf new file mode 100644 index 0000000000..e91ab96c0d --- /dev/null +++ b/addons/casings/XEH_postInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +if (!hasInterface || !GVAR(enabled)) exitWith {}; + +GVAR(cachedCasings) = createHashMap; +GVAR(casings) = []; +["CAManBase", "FiredMan", {call FUNC(createCasing)}] call CBA_fnc_addClassEventHandler; diff --git a/addons/casings/XEH_preInit.sqf b/addons/casings/XEH_preInit.sqf new file mode 100644 index 0000000000..9361d05015 --- /dev/null +++ b/addons/casings/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +ADDON = true; diff --git a/addons/casings/XEH_preStart.sqf b/addons/casings/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/casings/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/casings/config.cpp b/addons/casings/config.cpp new file mode 100644 index 0000000000..815048a082 --- /dev/null +++ b/addons/casings/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"esteldunedain","Cyruz","diwako"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/addons/casings/functions/fnc_createCasing.sqf b/addons/casings/functions/fnc_createCasing.sqf new file mode 100644 index 0000000000..6d56e5f2bc --- /dev/null +++ b/addons/casings/functions/fnc_createCasing.sqf @@ -0,0 +1,68 @@ +#include "script_component.hpp" +/* + * Author: esteldunedain / Cyruz / diwako + * Produces a casing matching the fired weapons caliber on the ground around the unit + * + * Arguments: + * 0: unit - Object the event handler is assigned to + * 1: ammo - Ammo used + * + * Return Value: + * None + * + * Example: + * [player, "", "","", "B_556x45_Ball"] call ace_casings_fnc_createCasing + * + * Public: No + */ + +params ["_unit", "", "", "", "_ammo"]; + +if (!isNull objectParent _unit) exitWith {}; + +private _modelPath = GVAR(cachedCasings) get _ammo; + +if (isNil "_modelPath") then { + private _cartridge = getText (configFile >> "CfgAmmo" >> _ammo >> "cartridge"); + //Default cartridge is a 5.56mm model + _modelPath = switch (_cartridge) do { + case "FxCartridge_9mm": { "A3\Weapons_f\ammo\cartridge_small.p3d" }; + case "FxCartridge_65": { "A3\weapons_f\ammo\cartridge_65.p3d" }; + case "FxCartridge_762": { "A3\weapons_f\ammo\cartridge_762.p3d" }; + case "FxCartridge_127": { "A3\weapons_f\ammo\cartridge_127.p3d" }; + case "FxCartridge_slug": { "A3\weapons_f\ammo\cartridge_slug.p3d" }; + case "": { "" }; + default { "A3\Weapons_f\ammo\cartridge.p3d" }; + }; + GVAR(cachedCasings) set [_ammo, _modelPath]; +}; + +if (_modelPath isEqualTo "") exitWith {}; + +private _unitPos = getposASL _unit; +// Distant shooters don't produce as many cases +if ((AGLToASL positionCameraToWorld [0,0,0]) vectorDistance _unitPos > 100 && {random 1 < 0.9}) exitWith {}; + +private _weapDir = _unit weaponDirection currentWeapon _unit; +private _ejectDir = _weapDir vectorCrossProduct [0, 0, 1]; +private _pos = _unitPos + vectorAdd (_weapDir vectorMultiply (-0.5 + random 2)) + vectorAdd (_ejectDir vectorMultiply (0.2 + random 2)); + +[ + { + params ["_modelPath", "_pos"]; + + private _lisPos = (lineIntersectsSurfaces [_pos, _pos vectorAdd [0,0,-1e11], objNull, objNull, true, 1, "ROADWAY", "FIRE"]) #0; + private _casing = createSimpleObject [_modelPath, (_lisPos #0 vectorAdd [0,0,0.005]), true]; + _casing setDir (random 360); + _casing setVectorUp _lisPos #1; + private _idx = GVAR(casings) pushBack _casing; + + for "_" from 0 to (_idx - GVAR(maxCasings)) do { + deleteVehicle (GVAR(casings) deleteAt 0); + }; + }, + [_modelPath,_pos], + 0.4 +] call CBA_fnc_waitAndExecute; diff --git a/addons/casings/functions/script_component.hpp b/addons/casings/functions/script_component.hpp new file mode 100644 index 0000000000..88b44122b5 --- /dev/null +++ b/addons/casings/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\casings\script_component.hpp" diff --git a/addons/casings/initSettings.sqf b/addons/casings/initSettings.sqf new file mode 100644 index 0000000000..3dea180e2d --- /dev/null +++ b/addons/casings/initSettings.sqf @@ -0,0 +1,17 @@ +[ + QGVAR(enabled), "CHECKBOX", + [LSTRING(displayName), LSTRING(description)], + LSTRING(Settings_DisplayName), + true, + false, + {}, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(maxCasings), "SLIDER", + [LSTRING(maxCasings_displayName), LSTRING(maxCasings_description)], + LSTRING(Settings_DisplayName), + [100, 500, 250, -1], + false +] call CBA_fnc_addSetting; diff --git a/addons/casings/script_component.hpp b/addons/casings/script_component.hpp new file mode 100644 index 0000000000..c734aca4e3 --- /dev/null +++ b/addons/casings/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT casings +#define COMPONENT_BEAUTIFIED Casings +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_CASINGS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_CASINGS + #define DEBUG_SETTINGS DEBUG_SETTINGS_CASINGS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/casings/stringtable.xml b/addons/casings/stringtable.xml new file mode 100644 index 0000000000..8f6213f8b5 --- /dev/null +++ b/addons/casings/stringtable.xml @@ -0,0 +1,40 @@ + + + + + ACE Casings + ACE 薬莢 + ACE Łuski + ACE 탄피 + ACE 弹壳 + + + Casings Enabled + 薬莢の有効化 + Łuski włączone + 탄피 활성화 + 开启弹壳生成 + + + Enable persistent casings (POTENTIAL performance impact on old/weak systems) + 永続的な薬莢を有効にする (古い/弱いシステムに対する潜在的なパフォーマンスの影響) + Włącz pozostawanie łusek (MOŻLIWY wpływ na wydajność na starych/słabych komputerach) + 영구적으로 남는 탄피를 활성화합니다(오래되고 취약한 시스템에 잠재적인 성능에 영향을 미칩니다.) + 开启生成持续存在的弹壳(可能对较老和性能不行的系统有影响) + + + Maximum casings + 薬莢の最大量 + Maksymalna liczba łusek + 탄피 최대 갯수 + 最大弹壳量 + + + Maximum amount of casings to display + 表示される薬莢の最大の数 + Maksymalna liczba wyświetlanych łusek + 표시할 최대 탄피 갯수 + 显示的最大弹壳数量 + + + diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index c1c6c930d8..eb937fe68e 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -6,11 +6,11 @@ ケミライト Świetliki Knicklichter - 켐라이트 + 화학조명 Cyalumes Luce chimica 螢光棒 - 萤光棒 + 荧光棒 Химсвет Bastões de Luz Chemická světla @@ -54,11 +54,11 @@ [ACE] ケミライト [ACE] Świetliki [ACE] Knicklichter - [ACE] 켐라이트 + [ACE] 화학조명 [ACE] Cyalumes [ACE] Luci chimiche [ACE] 螢光棒 - [ACE] 萤光棒 + [ACE] 荧光棒 [ACE] Химсвет [ACE] Bastões de Luz [ACE] Chemická světla @@ -74,7 +74,7 @@ Cyalume (orange) Luce chimica (Arancione) 螢光棒 (橘色) - 萤光棒 (橘色) + 荧光棒(橘色) Химсвет (Оранжевый) Bastão de Luz (Laranja) Chemické světlo (Oranžové) @@ -106,7 +106,7 @@ Type : lumière - Orange<br />Munitions : 1<br />Application : main Tipo: Luce - Arancione<br/>Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 橘色<br />發數: 1<br />使用於: 手 - 类型: 光 - 橘色<br />发数: 1<br />使用于: 手 + 类型:光—橘色<br />发数:1<br />使用于:手 Тип: Свет - Оранжевый<br />1 штука<br />В руках Tipo: Luz - Laranja<br/>Usos: 1<br/>Usado em: Mão Typ: Světlo - Oranžové<br/>Počet použití: 1<br/>Použít v ruce @@ -118,11 +118,11 @@ ケミライト (白) Świetlik (biały) Knicklicht (weiß) - 켐라이트 (하양) + 화학조명 (하양) Cyalume (blanc) Luce chimica (Bianca) 螢光棒 (白色) - 萤光棒 (白色) + 荧光棒(白色) Химсвет (Белый) Bastão de Luz (Branco) Chemické světlo (Bílé) @@ -154,7 +154,7 @@ Type : lumière - Blanche<br />Munitions : 1<br />Application : main Tipo: Luce - Bianca<br/>Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 白色<br />發數: 1<br />使用於: 手 - 类型: 光 - 白色<br />发数: 1<br />使用于: 手 + 类型:光—白色<br />发数:1<br />使用于:手 Тип: Свет - Белый<br />1 штука<br />В руках Tipo: Luz - Branco<br/>Usos: 1<br/>Usado em: Mão Typ: Světlo - Bílé<br/>Počet použití: 1<br/>Použít v ruce @@ -166,11 +166,11 @@ ケミライト (高輝度 赤) Świetlik (jaskrawy czerwony) Knicklicht (rot, hell) - 켐라이트 (밝은 빨간색) + 화학조명 (밝은 빨간색) Cyalume HL (rouge) Luce chimica (Hi Rossa) 螢光棒 (超亮紅色) - 萤光棒 (超亮红色) + 荧光棒(高亮红色) Химсвет (Ярко-Красный) Bastão de Luz (Vermelho Forte) Chemické světlo (Červené jasné) @@ -186,7 +186,7 @@ Lum. rouge HL Luce Hi Rossa 超亮紅色光 - 超亮红色光 + 高亮红色光 Яркий Красный свет Luz forte vermelha Červené jasné světlo @@ -202,7 +202,7 @@ Type : lumière HL (30 minutes) - Rouge<br />Munitions : 1<br />Application : main Tipo: Luce - Rossa Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮紅色 (30分鐘)<br />發數: 1<br />使用於: 手 - 类型: 光 - 超亮红色 (30分钟)<br />发数: 1<br />使用于: 手 + 类型:光—高亮红色(30分钟)<br />发数:1<br />使用于:手 Тип: Свет - Ярко-Красный (30 минут)<br />1 штука<br />В руках Tipo: Luz - Vermelho Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão Typ: Světlo - Červené jasné<br/>Počet použití: 1<br/>Použít v ruce @@ -214,11 +214,11 @@ ケミライト (高輝度 黄) Świetlik (jaskrawy żółty) Knicklicht (gelb, hell) - 켐라이트 (밝은 노란색) + 화학조명 (밝은 노란색) Cyalume HL (jaune) Luce chimica (Hi Gialla) 螢光棒 (超亮黃色) - 萤光棒 (超亮黄色) + 荧光棒(高亮黄色) Химсвет (Ярко-Желтый) Bastão de Luz (Amarelo Forte) Chemické světlo (Žluté jasné) @@ -234,7 +234,7 @@ Lum. jaune HL Luce Hi Gialla 超亮黃色光 - 超亮黄色光 + 高亮黄色光 Яркий Желтый свет Luz forte amarela Žluté jasné světlo @@ -250,7 +250,7 @@ Type : lumière HL (30 minutes) - Jaune<br />Munitions : 1<br />Application : main Tipo: Luce - Gialla Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮黃色 (30分鐘)<br />發數: 1<br />使用於: 手 - 类型: 光 - 超亮黄色 (30分钟)<br />发数: 1<br />使用于: 手 + 类型:光—高亮黄色(30分钟)<br />发数:1<br />使用于:手 Тип: Свет - Ярко-Желтый (30 минут)<br />1 штука<br />В руках Tipo: Luz - Amarelo Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão Typ: Světlo - Žluté jasné<br/>Počet použití: 1<br/>Použít v ruce @@ -262,11 +262,11 @@ ケミライト (高輝度 白) Świetlik (jaskrawy biały) Knicklicht (weiß, hell) - 켐라이트 (밝은 하얀색) + 화학조명 (밝은 하얀색) Cyalume HL (blanc) Luce chimica (Hi Bianca) 螢光棒 (超亮白色) - 萤光棒 (超亮白色) + 荧光棒(高亮白色) Химсвет (Ярко-Белый) Bastão de Luz (Branco Forte) Chemické světlo (Bílé jasné) @@ -282,7 +282,7 @@ Lum. blanche HL Luce Hi Bianca 超亮白色光 - 超亮白色光 + 高亮白色光 Яркий Белый свет Luz forte branca Bílé jasné světlo @@ -298,7 +298,7 @@ Type : lumière HL (30 minutes) - Blanche<br />Munitions : 1<br />Application : main Tipo: Luce - Bianca Hi (30 minuti)<br />Rimanenti: 1<br/>Usata in: Mano 類型: 光 - 超亮白色 (30分鐘)<br />發數: 1<br />使用於: 手 - 类型: 光 - 超亮白色 (30分钟)<br />发数: 1<br />使用于: 手 + 类型:光—高亮白色(30分钟)<br />发数:1<br />使用于:手 Тип: Свет - Ярко-Белый (30 минут)<br />1 штука<br />В руках Tipo: Luz - Branco Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão Typ: Světlo - Bílé jasné<br/>Počet použití: 1<br/>Použít v ruce @@ -315,9 +315,11 @@ Химсвет (Ярко-Синий) Bastão de Luz (Azul Forte) 螢光棒(超亮藍色) + 荧光棒(高亮蓝色) Chemické světlo (Modré jasné) Luz química (Azul Hi) Işık Çubuğu (Mavi) + 화학조명 (밝은 파란색) Blue Hi Light @@ -329,9 +331,11 @@ Яркий Синий свет Luz forte azul 超亮藍色光 + 高亮蓝色光 Modré jasné světlo Luz azul Hi Mavi Yüksek Işık + 밝은 파란색 Type: Light - Blue Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -343,9 +347,11 @@ Тип: Свет - Ярко-Синий (30 минут)<br />1 штука<br />В руках Tipo: Luz - Azul Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão 類型: 光 - 超亮藍色 (30分鐘)<br />發數: 1<br />使用於: 手 + 类型:光—高亮蓝色(30分钟)<br />发数:1<br />使用于:手 Typ: Světlo - Modré jasné<br/>Počet použití: 1<br/>Použít v ruce Tipo: Luz - Azul Hi (30 minutos)<br />Cantidad: 1<br />Usado en: Mano Type: Light - Blue Hi (30 minute)<br />Rounds: 1<br />Used in: Hand + 종류: 밝은 파란색 (30분)<br />수량: 1<br />사용처: 손 Chemlight (Hi Green) @@ -357,9 +363,11 @@ Химсвет (Ярко-Зеленый) Bastão de Luz (Verde Forte) 螢光棒(超亮綠色) + 荧光棒(高亮绿色) Chemické světlo (Zelené jasné) Luz química (Verde Hi) Işık Çubuğu (Yeşil) + 화학조명 (밝은 초록색) Green Hi Light @@ -371,9 +379,11 @@ Яркий Зеленый свет Luz forte verde 超亮綠色光 + 高亮绿色光 Zelené jasné světlo Luz verde Hi Yeşil Yüksek Işık + 밝은 초록색 Type: Light - Green Hi (30 minute)<br />Rounds: 1<br />Used in: Hand @@ -385,9 +395,11 @@ Тип: Свет - Ярко-Зеленый (30 минут)<br />1 штука<br />В руках Tipo: Luz - Verde Forte (30 minutos)<br/>Usos: 1<br/>Usado em: Mão 類型: 光 - 超亮綠色 (30分鐘)<br />發數: 1<br />使用於: 手 + 类型:光—高亮绿色(30分钟)<br />发数:1<br />使用于:手 Typ: Světlo - Zelené jasné<br/>Počet použití: 1<br/>Použít v ruce Tipo: Luz - Verde Hi (30 minutos)<br />Cantidad: 1<br />Usado en: Mano Type: Light - Green Hi (30 minute)<br />Rounds: 1<br />Used in: Hand + 종류: 밝은 초록색 (30분)<br />수량: 1<br />사용처: 손 Chemlight (Ultra-Hi Orange) @@ -399,9 +411,11 @@ Химсвет (Ультраяркий Оранжевый) Bastão de Luz (Laranja Ultra Forte) 螢光棒(極亮橘色) + 荧光棒(高亮橘色) Chemické světlo (Oranžové velmi jasné) Luz química (Naranja Ultra-Hi) Işık Çubuğu (Turuncu) + 화학조명 (밝은 주황색) Orange Ultra-Hi Light @@ -413,9 +427,11 @@ Ультраяркий Оранжевый свет Luz ultra forte laranja 極亮橘色光 + 高亮橘色光 Oranžové velmi jasné světlo Luz naranja Ultra-Hi Turuncu Yüksek Işık + 밝은 주황색 Type: Light - Orange Ultra-Hi (5 minute)<br />Rounds: 1<br />Used in: Hand @@ -427,20 +443,22 @@ Тип: Свет - Ультраяркий Оранжевый (5 минут)<br />1 штука<br />В руках Tipo: Luz - Laranja Ultra Forte (5 minutos)<br/>Usos: 1<br/>Usado em: Mão 類型: 光 - 極亮橘色 (5分鐘)<br />發數: 1<br />使用於: 手 + 类型:光—高亮橘色(5分钟)<br />发数:1<br />使用于:手 Typ: Světlo - Oranžové velmi jasné<br/>Počet použití: 1<br/>Použít v ruce Tipo: Luz - Naranja Ultra-Hi (5 minutos)<br />Cantidad: 1<br />Usado en: Mano Type: Light - Orange Ultra-Hi (5 minute)<br />Rounds: 1<br />Used in: Hand + 종류: 밝은 주황색 (5분)<br />수량: 1<br />사용처: 손 Chemlight (IR) ケミライト (IR) Świetlik (podczerwony) Knicklicht (IR) - 켐라이트 (적외선) + 화학조명 (적외선) Cyalume (IR) Luce chimica (IR) 螢光棒 (紅外線) - 萤光棒 (红外线) + 荧光棒(红外线) Химсвет (Инфракрасный) Bastão de Luz (IV) Chemické světlo (Infračervené) @@ -452,7 +470,7 @@ 赤外線光 Światło podczerwone IR-Knicklicht - 적외선 켐라이트 + 적외선 화학조명 Lum. IR Luce IR 紅外線光 @@ -472,7 +490,7 @@ Type: lumière - Infrarouge<br />Munitions : 1<br />Application : main Tipo: Luce - Infrarossi<br />Usata in: Mano 類型: 光 - 紅外線<br />發數: 1<br />使用於: 手 - 类型: 光 - 红外线<br />发数: 1<br />使用于: 手 + 类型:光—红外线<br />发数:1<br />使用于:手 Тип: Свет - Инфракрасный<br />1 штука<br />В руках Tipo: Luz - Infravermelho<br/>Usos: 1<br/>Usado em: Mão Typ: Světlo - Infračervené<br/>Počet použití: 1<br/>Použít v ruce @@ -484,11 +502,11 @@ ケミライト シールド (空) Osłona na świetlik (pusta) Knicklicht-Abschirmung (leer) - 켐라이트 쉴드 (비어있음) + 화학조명 가림막 (비어있음) Etui cyalume (vide) Scudo Luce chimica (Vuoto) 螢光棒保護殼 (空) - 萤光棒保护壳 (空) + 荧光棒保护壳(空) Контейнер для Химсвета (Пуст) Estojo de Luz (Vazio) Clona na chemické světlo @@ -500,11 +518,11 @@ ケミライトを入れられます。シールドとケミライトを組み合わせることで、照明にもなりえます。 Osłona na świetliki. Połącz ją ze świetlikiem by stworzyć lampkę do czytania. Abschirmung für Knicklichter. Mit Knicklicht kombinieren, um Leselicht zu erhalten. - 켐라이트를 위한 가림막입니다. 켐라이트와 같이 사용하여 읽을 때 씁니다. + 화학조명을 위한 가림막입니다. 화학조명과 같이 사용하여 읽을 때 씁니다. Étui pour cyalume. Le combiner avec un cyalume pour obtenir une lampe de lecture. Scudo per luci chimiche. Combina con una luce chimica per una luce da lettura. 螢光棒的保護殼. 與螢光棒結合後可充當閱讀燈 - 萤光棒的保护壳. 与萤光棒结合后可充当阅读灯. + 荧光棒的保护壳。与萤光棒结合后可充当阅读灯。 Защитный контейнер для Химсвета. Объедините с Химсветом, чтобы подготовить Свет для чтения Estojo para os bastões de luz. Combine com o bastão de luz para preparar luz de leitura. Clona na chemické světlo. Při vložení chemického světla vznikne praktické světlo na čtení. @@ -516,11 +534,11 @@ ケミライト シールド (緑) Osłona na świetlik (zielona) Knicklicht-Abschirmung (grün) - 켐라이트 쉴드 (초록) + 화학조명 가림막 (초록) Etui avec cyalume (vert) Scudo Luce Chimica (Verde) 螢光棒保護殼 (綠色) - 萤光棒保护壳 (绿色) + 荧光棒保护壳(绿色) Контейнер для Химсвета (Зел) Estojo de Luz (Verde) Clona s vloženým chemickým světlem (Zelené) @@ -548,11 +566,11 @@ ケミライト シールド (赤) Osłona na świetlik (czerwona) Knicklicht-Abschirmung (rot) - 켐라이트 쉴드 (빨강) + 화학조명 가림막 (빨강) Etui avec cyalume (rouge) Scudo Luce Chimica (Rossa) 螢光棒保護殼 (紅色) - 萤光棒保护壳 (红色) + 荧光棒保护壳(红色) Контейнер для Химсвета (Красн) Estojo de Luz (Vermelho) Clona s vloženým chemickým světlem (Červené) @@ -580,11 +598,11 @@ ケミライト シールド (青) Osłona na świetlik (niebieska) Knicklicht-Abschirmung (blau) - 켐라이트 쉴드 (파랑) + 화학조명 가림막 (파랑) Etui avec cyalume (bleu) Scudo Luce Chimica (Blu) 螢光棒保護殼 (藍色) - 萤光棒保护壳 (蓝色) + 荧光棒保护壳(蓝色) Контейнер для Химсвета (Син) Estojo de Luz (Azul) Clona s vloženým chemickým světlem (Modré) @@ -612,11 +630,11 @@ ケミライト シールド (黄) Osłona na świetlik (żółta) Knicklicht-Abschirmung (gelb) - 켐라이트 쉴드 (노랑) + 화학조명 가림막 (노랑) Etui avec cyalume (jaune) Scudo Luce Chimica (Gialla) 螢光棒保護殼 (黃色) - 萤光棒保护壳 (黄色) + 荧光棒保护壳(黄色) Контейнер для Химсвета (Желт) Estojo de Luz (Amarelo) Clona s vloženým chemickým světlem (Žluté) @@ -644,11 +662,11 @@ ケミライト シールド (オレンジ) Osłona na świetlik (pomarańczowa) Knicklicht-Abschirmung (orange) - 켐라이트 쉴드 (주황) + 화학조명 가림막 (주황) Etui avec cyalume (orange) Scudo Luce Chimica (Arancione) 螢光棒保護殼 (橘色) - 萤光棒保护壳 (橘色) + 荧光棒保护壳(橘色) Контейнер для Химсвета (Оранж) Estojo de Luz (Laranja) Clona s vloženým chemickým světlem (Oranžové) @@ -676,11 +694,11 @@ ケミライト シールド (白) Osłona na świetlik (biała) Knicklicht-Abschirmung (weiß) - 켐라이트 쉴드 (하양) + 화학조명 가림막 (하양) Etui avec cyalume (blanc) Scudo Luce Chimica (Bianca) 螢光棒保護殼 (白色) - 萤光棒保护壳 (白色) + 荧光棒保护壳(白色) Контейнер для Химсвета (Белый) Estojo de Luz (Branco) Clona s vloženým chemickým světlem (Bílé) diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index 4b54765539..02eca6d441 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -111,7 +111,6 @@ PREP(inTransitionAnim); PREP(isAwake); PREP(isEngineer); PREP(isEOD); -PREP(isFeatureCameraActive); PREP(isInBuilding); PREP(isMedic); PREP(isModLoaded); @@ -127,7 +126,6 @@ PREP(muteUnitHandleInitPost); PREP(muteUnitHandleRespawn); PREP(nearestVehiclesFreeSeat); PREP(numberToDigits); -PREP(numberToDigitsString); PREP(numberToString); PREP(onAnswerRequest); PREP(owned); @@ -145,6 +143,7 @@ PREP(removeSpecificMagazine); PREP(requestCallback); PREP(resetAllDefaults); PREP(restoreVariablesJIP); +PREP(rscObjectHelper); PREP(runAfterSettingsInit); PREP(runTests); PREP(sanitizeString); @@ -187,6 +186,7 @@ PREP(uniqueElements); PREP(uniqueItems); PREP(unloadPerson); PREP(unloadPersonLocal); +PREP(unloadUnitWeapon); PREP(unmuteUnit); PREP(useItem); PREP(useMagazine); diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 78a5091369..09e0cf309d 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -27,6 +27,7 @@ ["blockThrow", false, ["ACE_Attach", "ACE_concertina_wire", "ACE_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_rearm", "ACE_refuel", "ACE_Sandbag", "ACE_Trenches", "ACE_tripod"]] call FUNC(statusEffect_addType); ["setHidden", true, ["ace_unconscious"]] call FUNC(statusEffect_addType); ["blockRadio", false, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered), "ace_unconscious"]] call FUNC(statusEffect_addType); +["blockSpeaking", false, ["ace_unconscious"]] call FUNC(statusEffect_addType); [QGVAR(forceWalk), { params ["_object", "_set"]; @@ -78,12 +79,23 @@ if (_object isEqualTo ACE_Player && {_set > 0}) then { call FUNC(endRadioTransmission); }; - if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { + if (["task_force_radio"] call FUNC(isModLoaded)) then { _object setVariable ["tf_unable_to_use_radio", _set > 0, true]; }; - if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { + if (["acre_main"] call FUNC(isModLoaded)) then { + _object setVariable ["acre_sys_core_isDisabledRadio", _set > 0, true]; + }; +}] call CBA_fnc_addEventHandler; + +[QGVAR(blockSpeaking), { + params ["_object", "_set"]; + TRACE_2("blockSpeaking EH",_object,_set); + if (["acre_main"] call FUNC(isModLoaded)) then { _object setVariable ["acre_sys_core_isDisabled", _set > 0, true]; }; + if (["task_force_radio"] call FUNC(isModLoaded)) then { + _object setVariable ["tf_voiceVolume", [1, 0] select (_set > 0), true]; + }; }] call CBA_fnc_addEventHandler; [QGVAR(blockDamage), { //Name reversed from `allowDamage` because we want NOR logic @@ -527,4 +539,34 @@ GVAR(deviceKeyCurrentIndex) = -1; {false}, [0xC7, [true, false, false]], false] call CBA_fnc_addKeybind; //SHIFT + Home Key + +["ACE3 Weapons", QGVAR(unloadWeapon), localize LSTRING(unloadWeapon), { + // Conditions: + if !([ACE_player, objNull, ["isNotInside"]] call FUNC(canInteractWith)) exitWith {false}; + + private _currentWeapon = currentWeapon ACE_player; + if !(_currentWeapon != primaryWeapon _unit && {_currentWeapon != handgunWeapon _unit} && {_currentWeapon != secondaryWeapon _unit}) exitWith {false}; + + private _currentMuzzle = currentMuzzle ACE_player; + private _currentAmmoCount = ACE_player ammo _currentMuzzle; + if (_currentAmmoCount < 1) exitWith {false}; + + // Statement: + [ACE_player, _currentWeapon, _currentMuzzle, _currentAmmoCount, false] call FUNC(unloadUnitWeapon); + true +}, {false}, [19, [false, false, true]], false] call CBA_fnc_addKeybind; //ALT + R Key + +["CBA_loadoutSet", { + params ["_unit", "_loadout"]; + // remove if with https://github.com/CBATeam/CBA_A3/pull/1548 + if (count _loadout == 2) then { + _loadout = _loadout select 0; + }; + _loadout params ["_primaryWeaponArray"]; + if ((_primaryWeaponArray param [0, ""]) == "ACE_FakePrimaryWeapon") then { + TRACE_1("Ignoring fake gun",_primaryWeaponArray); + _loadout set [0, []]; + }; +}] call CBA_fnc_addEventHandler; + GVAR(commonPostInited) = true; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 536b6431d5..fb42193cef 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -11,6 +11,9 @@ GVAR(syncedEvents) = createHashMap; GVAR(showHudHash) = createHashMap; GVAR(vehicleIconCache) = createHashMap; // for getVehicleIcon +// Cache for FUNC(isModLoaded) +GVAR(isModLoadedCache) = createHashMap; + GVAR(settingsInitFinished) = false; GVAR(runAtSettingsInitialized) = []; diff --git a/addons/common/functions/fnc_assignedItemFix.sqf b/addons/common/functions/fnc_assignedItemFix.sqf index 3f523f4a59..444286eee3 100644 --- a/addons/common/functions/fnc_assignedItemFix.sqf +++ b/addons/common/functions/fnc_assignedItemFix.sqf @@ -37,11 +37,11 @@ GVAR(AssignedItemsShownItems) = [ private _assignedItems = getUnitLoadout _unit param [9, ["","","","","",""]]; // ["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch","NVGoggles"] GVAR(AssignedItemsShownItems) = [ - !((_assignedItems select 0) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 0 >> "ACE_hideItemType") != "map"}, - !((_assignedItems select 3) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 3 >> "ACE_hideItemType") != "compass"}, - !((_assignedItems select 4) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 4 >> "ACE_hideItemType") != "watch"}, - !((_assignedItems select 2) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 2 >> "ACE_hideItemType") != "radio"}, - !((_assignedItems select 1) isEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 1 >> "ACE_hideItemType") != "gps"} + ((_assignedItems select 0) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 0 >> "ACE_hideItemType") != "map"}, + ((_assignedItems select 3) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 3 >> "ACE_hideItemType") != "compass"}, + ((_assignedItems select 4) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 4 >> "ACE_hideItemType") != "watch"}, + ((_assignedItems select 2) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 2 >> "ACE_hideItemType") != "radio"}, + ((_assignedItems select 1) isNotEqualTo "") && {getText (configFile >> "CfgWeapons" >> _assignedItems select 1 >> "ACE_hideItemType") != "gps"} ]; GVAR(AssignedItemsShownItems) params ["_showMap", "_showCompass", "_showWatch", "_showRadio", "_showGPS"]; diff --git a/addons/common/functions/fnc_deprecateComponent.sqf b/addons/common/functions/fnc_deprecateComponent.sqf index a723b733ec..834803bd45 100644 --- a/addons/common/functions/fnc_deprecateComponent.sqf +++ b/addons/common/functions/fnc_deprecateComponent.sqf @@ -22,7 +22,7 @@ params ["_oldComponent", "_newComponent", "_version"]; _oldComponent params ["_oldComponentName", "_oldSettingName"]; _newComponent params ["_newComponentName", "_newSettingName"]; -private _isReplacementAvailable = isClass (configFile >> "CfgPatches" >> _newComponentName); +private _isReplacementAvailable = [_newComponentName] call FUNC(isModLoaded); private _isDeprecatedLoaded = missionNamespace getvariable [_oldSettingName, false]; private _isReplacementLoaded = missionNamespace getvariable [_newSettingName, false]; diff --git a/addons/common/functions/fnc_disableUserInput.sqf b/addons/common/functions/fnc_disableUserInput.sqf index 514fa3601c..006f097266 100644 --- a/addons/common/functions/fnc_disableUserInput.sqf +++ b/addons/common/functions/fnc_disableUserInput.sqf @@ -66,9 +66,13 @@ if (_state) then { _ctrl ctrlSetTooltip "Abort."; _ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer); - _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)]; - _ctrl ctrlEnable (call {private _config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}}); - _ctrl ctrlSetText "RESPAWN"; + if (["ace_medical"] call FUNC(isModLoaded)) then { + _ctrl ctrlSetEventHandler ["buttonClick", 'closeDialog 0; [player, "respawn_button"] call EFUNC(medical_status,setDead); [false] call DFUNC(disableUserInput);']; + } else { + _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)]; + }; + _ctrl ctrlEnable ((getMissionConfigValue ["respawnButton", -1]) != 0); // handles 3den attribute or description.ext + _ctrl ctrlSetText localize "$str_3den_multiplayer_attributecategory_respawn_displayname"; _ctrl ctrlSetTooltip "Respawn."; }; diff --git a/addons/common/functions/fnc_endRadioTransmission.sqf b/addons/common/functions/fnc_endRadioTransmission.sqf index 196d0f4d4a..443bf3c9de 100644 --- a/addons/common/functions/fnc_endRadioTransmission.sqf +++ b/addons/common/functions/fnc_endRadioTransmission.sqf @@ -19,7 +19,7 @@ ["ace_endRadioTransmissions"] call CBA_fnc_localEvent; // ACRE -if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { +if (["acre_main"] call FUNC(isModLoaded)) then { [-1] call acre_sys_core_fnc_handleMultiPttKeyPressUp; [0] call acre_sys_core_fnc_handleMultiPttKeyPressUp; [1] call acre_sys_core_fnc_handleMultiPttKeyPressUp; @@ -27,8 +27,8 @@ if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { }; // TFAR -if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { - if (isClass (configFile >> "CfgPatches" >> "tfar_core")) exitWith { // Beta TFAR, exit to avoid script errors from legacy functions not existing +if (["task_force_radio"] call FUNC(isModLoaded)) then { + if (["tfar_core"] call FUNC(isModLoaded)) exitWith { // Beta TFAR, exit to avoid script errors from legacy functions not existing ACE_Player call TFAR_fnc_releaseAllTangents; }; call TFAR_fnc_onSwTangentReleased; diff --git a/addons/common/functions/fnc_findUnloadPosition.sqf b/addons/common/functions/fnc_findUnloadPosition.sqf index 50727b438f..c0605c477d 100644 --- a/addons/common/functions/fnc_findUnloadPosition.sqf +++ b/addons/common/functions/fnc_findUnloadPosition.sqf @@ -43,9 +43,13 @@ if (_cargo isKindOf "CAManBase") then { _radiusOfItem = 1.1; } else { //`sizeOf` is unreliable, and does not work with object types that don't exist on map, so estimate size based on cargo size - private _typeOfCargo = if (_cargo isEqualType "") then {_cargo} else {typeOf _cargo}; - private _itemSize = if (isNumber (configFile >> "CfgVehicles" >> _typeOfCargo >> QEGVAR(cargo,size)) && {getNumber (configFile >> "CfgVehicles" >> _typeOfCargo >> QEGVAR(cargo,size)) != -1}) then { - getNumber (configFile >> "CfgVehicles" >> _typeOfCargo >> QEGVAR(cargo,size)); + private _configOfCargo = if (_cargo isEqualType objNull) then { + configOf _cargo + } else { + configFile >> "CfgVehicles" >> _cargo + }; + private _itemSize = if (isNumber (_configOfCargo >> QEGVAR(cargo,size)) && {getNumber (_configOfCargo >> QEGVAR(cargo,size)) != -1}) then { + getNumber (_configOfCargo >> QEGVAR(cargo,size)); } else { if (["ace_cargo"] call FUNC(isModLoaded)) then { [_cargo] call EFUNC(cargo,getSizeItem); diff --git a/addons/common/functions/fnc_getVehicleCargo.sqf b/addons/common/functions/fnc_getVehicleCargo.sqf index 82442700a2..37bd04c27b 100644 --- a/addons/common/functions/fnc_getVehicleCargo.sqf +++ b/addons/common/functions/fnc_getVehicleCargo.sqf @@ -17,7 +17,7 @@ params [["_vehicle", objNull, [objNull]]]; -private _config = configFile >> "CfgVehicles" >> _vehicle; +private _config = configOf _vehicle; private _cargo = []; private _codrivers = getArray (_config >> "cargoIsCoDriver"); diff --git a/addons/common/functions/fnc_getVehicleCodriver.sqf b/addons/common/functions/fnc_getVehicleCodriver.sqf index 8deef3f9cd..1e97cc2e02 100644 --- a/addons/common/functions/fnc_getVehicleCodriver.sqf +++ b/addons/common/functions/fnc_getVehicleCodriver.sqf @@ -17,7 +17,7 @@ params [["_vehicle", objNull, [objNull]]]; -private _config = configFile >> "CfgVehicles" >> _vehicle; +private _config = configOf _vehicle; private _cargo = []; private _codrivers = getArray (_config >> "cargoIsCoDriver"); diff --git a/addons/common/functions/fnc_getVehicleIcon.sqf b/addons/common/functions/fnc_getVehicleIcon.sqf index 3c3e4aa727..7a4daba9c6 100644 --- a/addons/common/functions/fnc_getVehicleIcon.sqf +++ b/addons/common/functions/fnc_getVehicleIcon.sqf @@ -18,7 +18,7 @@ params [["_object", objNull, [objNull, ""]]]; -if ((_object isEqualType objNull && {isNull _object}) || {_object isEqualType "" && {_object == ""}}) exitWith { DEFAULT_TEXTURE }; +if (_object isEqualTo objNull || {_object isEqualTo ""}) exitWith { DEFAULT_TEXTURE }; private _objectType = if (_object isEqualType objNull) then { typeOf _object diff --git a/addons/common/functions/fnc_isFeatureCameraActive.sqf b/addons/common/functions/fnc_isFeatureCameraActive.sqf deleted file mode 100644 index 24ea0667be..0000000000 --- a/addons/common/functions/fnc_isFeatureCameraActive.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Sniperwolf572 - * Checks if one of the following common feature cameras is active: - * - * - Curator - * - ACE Spectator - * - Arsenal camera (BIS_fnc_arsenal) - * - Nexus Spectator (BIS_fnc_EGSpectator) - * - Establishing shot (BIS_fnc_establishingShot) - * - Splendid camera (BIS_fnc_camera) - * - Animation viewer (BIS_fnc_animViewer) - * - Classic camera (BIS_fnc_cameraOld) - * - * Arguments: - * 0: None - * - * Return Value: - * A feature camera is active - * - * Example: - * [] call ace_common_fnc_isFeatureCameraActive - * - * Public: Yes - */ - -ACE_DEPRECATED(QFUNC(isFeatureCameraActive),"3.14.0","CBA_fnc_getActiveFeatureCamera"); - -!( - isNull curatorCamera && // Curator - {!GETMVAR(EGVAR(spectator,isSet),false)} && // ACE Spectator - {GETMVAR(EGVAR(huntir,stop),true)} && // ACE Hunt IR - {isNull GETMVAR(BIS_EGSpectatorCamera_camera, objNull)} && // BIS Nexus Spectator - {isNull GETUVAR(BIS_fnc_arsenal_cam, objNull)} && // Arsenal camera - {isNull GETMVAR(BIS_fnc_establishingShot_fakeUAV, objNull)} && // Establishing shot camera - {isNull GETMVAR(BIS_fnc_camera_cam, objNull)} && // Splendid camera - {isNull GETUVAR(BIS_fnc_animViewer_cam, objNull)} && // Animation viewer camera - {isNull GETMVAR(BIS_DEBUG_CAM, objNull)} // Classic camera -) // return diff --git a/addons/common/functions/fnc_isModLoaded.sqf b/addons/common/functions/fnc_isModLoaded.sqf index b69086e39d..7692050257 100644 --- a/addons/common/functions/fnc_isModLoaded.sqf +++ b/addons/common/functions/fnc_isModLoaded.sqf @@ -1,10 +1,10 @@ #include "script_component.hpp" /* - * Author: Glowbal - * Check in cfgPatches if modification is loaded + * Author: Glowbal, GhostIsSpooky + * Check in CfgPatches if modification is loaded * * Arguments: - * 0: Mod Name or Classname of the mod in cfgPatches + * 0: Mod Name or Classname of the mod in CfgPatches * * Return Value: * if modification is loaded @@ -17,4 +17,11 @@ params [["_modName", "", [""]]]; -isClass (configFile >> "CfgPatches" >> _modName) // return +private _return = GVAR(isModLoadedCache) get _modName; + +if (isNil "_return") then { + _return = isClass (configFile >> "CfgPatches" >> _modName); + GVAR(isModLoadedCache) set [_modName, _return]; +}; + +_return diff --git a/addons/common/functions/fnc_loadPerson.sqf b/addons/common/functions/fnc_loadPerson.sqf index 160344258b..5e872768d3 100644 --- a/addons/common/functions/fnc_loadPerson.sqf +++ b/addons/common/functions/fnc_loadPerson.sqf @@ -7,6 +7,8 @@ * 0: Unit that will load * 1: Unit to be loaded * 2: Vehicle that the unit will be loaded in (default: objNull) + * 3: Preferred seats + * 4: Reverse fill * * Return Value: * Vehicle that the unitToBeloaded has been loaded in. Returns objNull if function failed @@ -19,8 +21,8 @@ #define GROUP_SWITCH_ID QFUNC(loadPerson) -params ["_caller", "_unit", ["_vehicle", objNull]]; -TRACE_3("loadPerson",_caller,_unit,_vehicle); +params ["_caller", "_unit", ["_vehicle", objNull], ["_preferredSeats", []], ["_reverseFill", false]]; +TRACE_5("loadPerson",_caller,_unit,_vehicle,_preferredSeats,_reverseFill); if (!([_caller, _unit, ["isNotDragging", "isNotCarrying", "isNotSwimming"]] call FUNC(canInteractWith)) || {_caller == _unit}) exitWith { objNull }; @@ -39,8 +41,8 @@ if (!isNull _vehicle) then { }; }; - TRACE_3("sending ace_loadPersonEvent",_unit,_vehicle,_caller); - ["ace_loadPersonEvent", [_unit, _vehicle, _caller], _unit] call CBA_fnc_targetEvent; + TRACE_5("sending ace_loadPersonEvent",_unit,_vehicle,_caller,_preferredSeats,_reverseFill); + ["ace_loadPersonEvent", [_unit, _vehicle, _caller, _preferredSeats, _reverseFill], _unit] call CBA_fnc_targetEvent; }; _vehicle diff --git a/addons/common/functions/fnc_loadPersonLocal.sqf b/addons/common/functions/fnc_loadPersonLocal.sqf index 8490bf70e9..0c0fdab22c 100644 --- a/addons/common/functions/fnc_loadPersonLocal.sqf +++ b/addons/common/functions/fnc_loadPersonLocal.sqf @@ -7,6 +7,8 @@ * 0: unit to be loaded * 1: vehicle that will beloaded * 2: caller that will load + * 3: preferred seats + * 4: reverse fill * * Return Value: * None @@ -17,14 +19,33 @@ * Public: Yes */ -params ["_unit", "_vehicle", ["_caller", objNull]]; -TRACE_3("loadPersonLocal",_unit,_vehicle,_caller); +params ["_unit", "_vehicle", ["_caller", objNull], ["_preferredSeats", []], ["_reverseFill", false]]; +TRACE_5("loadPersonLocal",_unit,_vehicle,_caller,_preferredSeats,_reverseFill); private _slotsOpen = false; if ((_vehicle emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false]) || {(getNumber (configOf _vehicle >> "ejectDeadCargo")) == 0}}) then { - _unit moveInCargo _vehicle; - TRACE_1("moveInCargo",_vehicle); - _slotsOpen = true; + if (_preferredSeats isNotEqualTo []) then { + private _taken = []; + { + _taken pushBackUnique (_vehicle getCargoIndex _x); + } forEach crew _vehicle; + private _preferredSeats = _preferredSeats - _taken; + if (count _preferredSeats > 0) then { + _unit moveInCargo [_vehicle, _preferredSeats select 0]; + TRACE_2("moveInCargo",_vehicle,_preferredSeats select 0); + _slotsOpen = true; + }; + }; + if (!_slotsOpen) then { + private _cargoSeats = fullCrew [_vehicle, "cargo", true]; + if (_reverseFill) then { + reverse _cargoSeats; + }; + private _index = _cargoSeats findIf {isNull (_x select 0)}; + _unit moveInCargo [_vehicle, (_cargoSeats select _index) select 2]; + TRACE_2("moveInCargo",_vehicle,_index); + _slotsOpen = true; + }; } else { // Check if an empty turret is available // This already excludes FFV seats, which count as cargo positions diff --git a/addons/common/functions/fnc_numberToDigitsString.sqf b/addons/common/functions/fnc_numberToDigitsString.sqf deleted file mode 100644 index 35b0d0fd9b..0000000000 --- a/addons/common/functions/fnc_numberToDigitsString.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: commy2 - * Transforms a number to an string of the correspondending digits. - * - * Arguments: - * 0: Number to 'digitize' - * 1: Set the minimal length of the returned string. Useful for getting left hand zeroes. (Optional) - * - * Return Value: - * Digits. The maximum length is six digits. - * - * Example: - * [5, 5] call ace_common_fnc_numberToDigitsString - * - * Public: Yes - */ - -ACE_DEPRECATED(QFUNC(numberToDigitsString),"3.14.0","CBA_fnc_formatNumber"); - -_this call CBA_fnc_formatNumber diff --git a/addons/common/functions/fnc_removeSpecificMagazine.sqf b/addons/common/functions/fnc_removeSpecificMagazine.sqf index 8da754ce32..98eee7ba5a 100644 --- a/addons/common/functions/fnc_removeSpecificMagazine.sqf +++ b/addons/common/functions/fnc_removeSpecificMagazine.sqf @@ -31,9 +31,8 @@ private _fnc_removeMagazine = { if (_specificMagazineIndex > -1) exitWith { clearMagazineCargoGlobal _container; - private _containerType = typeOf _container; - if (_containerType in ["GroundWeaponHolder", "WeaponHolderSimulated"]) then { - _container = createVehicle [_containerType, getPosATL _container, [], 0, "CAN_COLLIDE"]; + if (_container isKindOf "WeaponHolder" && {_allMagazines isNotEqualTo []}) then { + _container = createVehicle [typeOf _container, getPosATL _container, [], 0, "CAN_COLLIDE"]; }; { _container addMagazineAmmoCargo [_x select 0, 1, _x select 1]; diff --git a/addons/common/functions/fnc_rscObjectHelper.sqf b/addons/common/functions/fnc_rscObjectHelper.sqf new file mode 100644 index 0000000000..81eb707b3a --- /dev/null +++ b/addons/common/functions/fnc_rscObjectHelper.sqf @@ -0,0 +1,64 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Convert between screen and 3d object coordinates + * + * Arguments: + * 0: Function + * 1: Input array + * 2: Scale (optional: 1) + * + * Return Value: + * Value + * + * Example: + * ["2d", [0,0,0], 1] call ace_common_fnc_rscObjectHelper + * + * Public: Maybe + */ + +params ["_func", "_array", ["_scale", 1]]; + +private _adjustCam = 1; +private _topFOV = getResolution # 6; +private _leftFOV = getResolution # 7; + +private _topLeftX = (_leftFOV-1)*0.5/_leftFOV; +private _bottomRightX = 1-_topLeftX; +private _topLeftY = 0; +private _bottomRightY = 1; + +private _return = []; + +switch (toLower _func) do { + case ("2d"): { + _array params ["_pointX", "_z", "_pointY"]; + + private _scrX = _pointX * (_bottomRightX - _topLeftX) + _topLeftX; + private _vX = _leftFOV * (_scrX - 0.5) * _adjustCam * _z; + + private _scrY = _pointY * (_bottomRightY - _topLeftY) + _topLeftY; + private _vY = _topFOV * (0.5 - _scrY) * _adjustCam * _z; + + _vX = _vX / _scale; + _vY = _vY / _scale; + + _return = [_vX, _vY, _z]; + }; + case ("3d"): { + _array params ["_vX", "_vY", "_z"]; // z is distance from screen + + _vX = _vX * _scale; + _vY = _vY * _scale; + + private _scrX = _vX / (_leftFOV * _adjustCam * _z) + 0.5; + private _pointX = (_scrX - _topLeftX) / (_bottomRightX - _topLeftX); + + private _scrY = 0.5 - _vY / (_topFOV * _adjustCam * _z); + private _pointY = (_scrY - _topLeftY) / (_bottomRightY - _topLeftY); + + _return = [_pointX, _z, _pointY]; + }; +}; + +_return diff --git a/addons/common/functions/fnc_setVolume.sqf b/addons/common/functions/fnc_setVolume.sqf index b4d0423d0e..667735d775 100644 --- a/addons/common/functions/fnc_setVolume.sqf +++ b/addons/common/functions/fnc_setVolume.sqf @@ -31,7 +31,6 @@ if (_setVolume) then { 2 fadeSound NORMAL_LEVEL; // TFAR - _unit setVariable ["tf_voiceVolume", NORMAL_LEVEL, true]; _unit setVariable ["tf_globalVolume", NORMAL_LEVEL]; // ACRE2 @@ -42,7 +41,6 @@ if (_setVolume) then { 2 fadeSound MUTED_LEVEL; // TFAR - _unit setVariable ["tf_voiceVolume", NO_SOUND, true]; _unit setVariable ["tf_globalVolume", MUTED_LEVEL]; // ACRE2 diff --git a/addons/common/functions/fnc_unloadUnitWeapon.sqf b/addons/common/functions/fnc_unloadUnitWeapon.sqf new file mode 100644 index 0000000000..6998370e36 --- /dev/null +++ b/addons/common/functions/fnc_unloadUnitWeapon.sqf @@ -0,0 +1,87 @@ +#include "script_component.hpp" +/* + * Author: drofseh & Commy2 + * Unload the magazine from the unit's weapon and attempt to put it in a sensible place. + * + * Arguments: + * 0: Player + * 1: Weapon + * 2: Muzzle (optional, default: Weapon) + * 3: Ammo count (optional, default: ammo currentMuzzle Player) + * 4: Skip animation? (optional, default: false) + * + * Return Value: + * None + * + * Example: +* [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player, 23, false] call ace_common_fnc_unloadUnitWeapon + * + * Public: No + */ + +params ["_unit", "_weapon", ["_muzzle", _weapon], ["_ammoCount", _unit ammo _muzzle ], ["_skipAnim", false]]; +TRACE_5("params",_unit,_weapon,_muzzle,_ammoCount,_skipAnim); + +// audiovisual effects +private _delay = 0; +if !(_skipAnim) then { + _delay = 1.5; + private _config = configFile >> "CfgWeapons" >> _weapon; + if (_weapon != _muzzle) then { + _config = _config >> _muzzle; + }; + + // get and play animation + private _unloadAction = getText (_config >> "ACE_unloadAction"); + + if (_unloadAction == "") then { + _unloadAction = getText (_config >> "reloadAction"); + }; + + [_unit, _unloadAction, 1] call FUNC(doGesture); + + // get and play sound + private _unloadSound = getText (_config >> "ACE_unloadSound"); + + if (_unloadSound == "") then { + _unloadSound = "A3\Sounds_F\arsenal\weapons\Rifles\Katiba\reload_Katiba.wss"; + private _unloadSoundArray = getArray (_config >> "reloadMagazineSound"); + + // file extention is required for playSound3D + if (_unloadSoundArray isNotEqualTo []) then { + private _wssTest = format ["%1.wss", _unloadSoundArray select 0]; + if (fileExists _wssTest) then { + _unloadSound = _wssTest; + } else { + private _wavTest = format ["%1.wav", _unloadSoundArray select 0]; + if (fileExists _wavTest) then { + _unloadSound = _wavTest; + }; + }; + }; + }; + + playSound3D [_unloadSound, _unit]; +}; + +// remove magazine from weapon and add it to inventory +[{ + params ["_unit", "_weapon", "_ammoCount"]; + + // remove weapon item + private _magazineClass = currentMagazine _unit; + + switch true do { + case (_weapon == primaryWeapon _unit): { + _unit removePrimaryWeaponItem _magazineClass; + }; + case (_weapon == handgunWeapon _unit): { + _unit removeHandgunItem _magazineClass; + }; + case (_weapon == secondaryWeapon _unit): { + _unit removeSecondaryWeaponItem _magazineClass; + }; + }; + + [_unit, _magazineClass, _ammoCount, true] call CBA_fnc_addMagazine; +}, [_unit, _weapon, _ammoCount], _delay] call CBA_fnc_waitAndExecute; diff --git a/addons/common/initSettings.sqf b/addons/common/initSettings.sqf index 0358bffa76..b0329732ff 100644 --- a/addons/common/initSettings.sqf +++ b/addons/common/initSettings.sqf @@ -1,5 +1,5 @@ -private _category = LLSTRING(ACEKeybindCategoryCommon); -private _categoryColors = [_category, format ["| %1 |", LELSTRING(common,subcategory_colors)]]; +private _category = format ["ACE %1", LLSTRING(DisplayName)]; +private _categoryColors = [_category, format ["| %1 |", LLSTRING(subcategory_colors)]]; [ QGVAR(checkPBOsAction), diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 5f36164548..dde0787a0a 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -28,9 +28,9 @@ ACE-Team ACE-Team ACE チーム - ACE-Team + ACE-팀 ACE-製作團隊 - ACE-制作团队 + ACE—制作团队 ACE-Takımı @@ -47,6 +47,7 @@ アドバンスド 고급 進階 + 进阶 Gelişmiş @@ -97,7 +98,7 @@ ACE オプション ACE 옵션 ACE設定選項 - ACE设定选项 + ACE 设定选项 ACE Ayarları @@ -132,7 +133,7 @@ 北北東 북북동 北北東 - 北北东 + 东北偏北 KKD @@ -166,7 +167,7 @@ 東北東 동북동 東北東 - 东北东 + 东北偏东 DKD @@ -200,7 +201,7 @@ 東南東 동남동 東南東 - 东南东 + 东南偏东 DGD @@ -234,7 +235,7 @@ 南南東 남남동 南南東 - 南南东 + 东南偏南 GGD @@ -268,7 +269,7 @@ 南南西 남남서 南南西 - 南南西 + 西南偏南 GGB @@ -302,7 +303,7 @@ 西南西 서남서 西南西 - 西南西 + 西南偏西 BGB @@ -336,7 +337,7 @@ 北北西 서북서 西北西 - 西北西 + 西北偏西 BKB @@ -370,7 +371,7 @@ 北北西 북북서 北北西 - 北北西 + 西北偏北 KKB @@ -419,9 +420,9 @@ Disabilita menù di comando Desabilitar menu de comando 指揮メニューを無効化 - 지휘 메뉴 종료 + 지휘 메뉴 비활성화 關閉命令選單 - 关闭命令选单 + 关闭命令菜单 Komut Menüsünü Devre Dışı Bırak @@ -455,6 +456,7 @@ 通常 보통 普通 + 正常 Normal @@ -471,7 +473,7 @@ 音声なし 무음 無語音 - 没声音 + 无语音 Ses yok @@ -479,7 +481,7 @@ PBO Überprüfung Controlla Azioni PBO 檢查PBO動作 - 检查PBO动作 + 检查 PBO 动作 PBO 検査の挙動 PBO 검사 Sprawdź akcję PBO @@ -493,19 +495,21 @@ Defines the action to be taken if a player does not have the correct PBOs. Définit l'action à effectuer si un joueur n'a pas les bons PBOs. 設定當玩家有錯誤的PBO檔案時要如何處置。 + 设定当玩家有错误的 PBO 时要如何处理。 Nastavuje jakou akci provést pokud hráč nemá správné PBO. Określa akcję, która ma być podjęta, jeśli gracz nie ma właściwych PBO. プレイヤーが不正規の PBO を所持している場合の動作を決定します。 Define la accion a tomar si un jugador no tiene el PBO correcto Определяет, какое действие будет предпринято, если игрок не имеет корректные PBO. Definiert, was passieren soll, wenn ein Spieler nicht die korrekten PBOs nutzt. + 플레이어가 같은 PBO를 가지고 있지 않을 시 취할 행동을 정합니다. Check PBO All Alle PBOs überprüfen Controlla Tutti i PBO 檢查所有PBO - 检查所有PBO + 检查所有 PBO PBO 全てを検査 모든 PBO 검사 Sprawdź wszystkie PBO @@ -519,21 +523,23 @@ Check all addons, not only those of ACE. Vérifie tous les addons, même ceux qui ne sont pas liés à ACE. 檢查全部的插件而非只有ACE。 + 检查全部插件而非只有 ACE。 Zkontrolovat všechny addony a ne jenom ACE. Sprawdź wszystkie dodatki, nie tylko ACE. ACE のみならず、全てのアドオンを検査します。 Comprueba todos los complementos, no sólo los de ACE Проверять все аддоны, а не только ACE. Überprüft alle Erweiterungen, nicht nur die von ACE. + ACE뿐만이 아닌 다른 PBO 모두 검사합니다. Check PBO Whitelist PBO Whitelist Controlla Whitelist PBO 檢查PBO白名單 - 检查PBO白名单 + 检查 PBO 白名单 許可リスト内の PBO を検査 - 검사 제외 PBO + 화이트리스트 PBO Sprawdź białą listę PBO Белый список для проверки PBO Lista Branca de PBO @@ -545,12 +551,14 @@ Define a list of regardless allowed addons. Permet de définir une liste d'addons autorisés systématiquement. 定義哪些插件是允許使用的。 + 定义哪些插件是允许使用的。 Nastavte seznam addonů, které jsou povolené. Zdefiniuj listę niezależnie od dozwolonych dodatków. 許可するアドオンを定義します。 Comprueba la lista de PBOs permitidos Задать список непроверяемых аддонов. Ermöglicht das Erstellen einer Liste von immer erlaubten Erweiterungen. + 허용할 애드온의 목록입니다. Feedback icons @@ -582,7 +590,7 @@ 画面上に表示するフィードバック アイコンの位置や無効化を選択できます。このアイコンは自キャラクター状態や動作の状況をフィードバックするために表示されています。 피드백 아이콘의 위치를 설정하거나 비활성화합니다. 피드백 아이콘은 캐릭터의 상세정보와 행동을 보여줍니다. 選擇位置或取消回饋圖標顯示在螢幕上。這些圖標將顯示出你角色額外的狀態與行動等資訊 - 选择位置或取消回馈图标显示在荧幕上。这些图标将显示出你角色额外的状态与行动等资讯。 + 选择位置或取消回馈图标显示在屏幕上。这些图标将显示出你角色额外的状态与行动等信息。 Progress bar location @@ -646,7 +654,7 @@ ACE によるヒントの背景色を指定します。 ACE힌트의 배경색을 정합니다. 設定ACE提示的背景顏色. - 设定ACE提示的背景颜色. + 设定 ACE 提示的背景颜色。 Hint text font color @@ -678,7 +686,7 @@ ACE によるヒントの文章へ、色を設定できます。この色は ACE ヒント システムを介して表示される全文章の色と標準でなっており、特定の色を設定していても、標準色になります。 ACE 힌트에 쓰이는 글씨 색입니다. 힌트 글씨의 색이 정해지지 않을경우 모든 힌트의 색은 기본으로 설정됩니다. 設定ACE提示文字的顏色。若提示字體並無指定其他顏色,將會自動選用ACE系統的預設顏色 - 设定ACE提示文字的颜色。若提示字体并无指定其他颜色,将会自动选用ACE系统的预设颜色。 + 设定 ACE 提示文字的颜色。若提示字体并无指定其他颜色,将会自动选用 ACE 的预设颜色。 Colors @@ -691,6 +699,8 @@ Цвета Colores + 颜色 + 색상 Persistent weapon laserpointer/flashlight @@ -700,7 +710,7 @@ 무기 레이저 포인터 / 손전등 지속 Kontinuität des Laserpointers/Taktischen Lichts 保持武器雷射/手電筒的狀態 - 保持武器雷射/手电筒的状态 + 保持武器激光/手电筒的状态 Trwały znacznik laserowy/latarka Luz da lanterna/laser da arma persistente Rémanence du pointeur laser/de la lampe torche @@ -714,8 +724,8 @@ Abilita la torcia/laser dopo il cambio dell'arma o l'entrata/uscita del veicolo se precedentemente attiva. 무기를 바꾸거나 차량에 승하차 할 때 이전에 스위치 켜고 끔을 유지합니다. Aktiviert Laserpointer/Taktisches Licht nach einem Waffenwechsel oder dem Auf-/Absitzen, falls es zuvor aktiv war. - 保存武器雷射/手電筒的開關狀態,使玩家切換武器或進出載具時能保持之前的的狀態 - 保存武器雷射/手电筒的开关状态,使玩家切换武器或进出载具时能保持之前的的状态。 + 保存武器雷射/手電筒的開關狀態,使玩家切換武器或進出載具時能保持之前的狀態 + 保持武器激光/手电筒的开关状态,使玩家切换武器或进出载具时能保持之前的状态。 Aktywuj znacznik laserowy/latarkę po zmianie broni lub wejściu/wyjściu z pojazdu, jeśli był on poprzednio włączony. Ativa a luz da arma ao trocar de arma, entrar/sair de um veículo. Caso tenha sido acesa anteriormente. Si le pointeur laser/la lampe torche est allumé(e), cette option permet de le/la réallumer automatiquement après un changement d'arme, ou après une entrée/sortie d'un véhicule. @@ -733,7 +743,7 @@ Banane Banán Banana - 甘蕉 + バナナ 바나나 香蕉 香蕉 @@ -749,10 +759,10 @@ Rodzaj roślin z rodziny bananowatych, obejmujący około 80 gatunków.<br />Przedstawiciele są typowymi przedstawicielami flory międzyzwrotnikowej Azji, Afryki i Australii.<br />Część gatunków dostarcza jadalnych owoców. Słowo banan pochodzi prawdopodobnie od arabskiego słowa banan, co oznacza palec, lub afrykańskiego języka wolof, w którym rośliny te określa się mianem banaana. Une banane est un fruit comestible qui, d'un point de vue botanique, fait partie du groupe des baies.\nProduite par plusieurs espèces de grandes plantes à fleurs herbacées du genre Musa. A banana é uma fruta comestível, botanicamente uma baga, produzida por vários tipos de plantas herbáceas grandes do genero Musa. - 甘蕉は食べられる果物でバショウ科バショウ属のうち、果実を食用とする品種群の総称。また、その果実のこと。いくつかの原種から育種された多年草。種によっては熟すまでは毒を持つものもある。 + バナナは、バショウ科バショウ属のうち、果実を食用とする品種群の総称である。また、その果実のこと。いくつかの原種から育種された多年性植物。熱帯~亜熱帯の地域で栽培されるトロピカルフルーツ。種によっては熟すまでは毒を持つものもある。 바나나는 식용 과일로써 식물학적으로 열매류이며 여러 종류의 개화가능한 초본의 파초과로 부터 생산됩니다. 香蕉(學名: Musa × paradisiaca),為芭蕉科芭蕉屬小果野蕉及野蕉的人工栽培雜交種,為多年生草本植物。果實長有棱; 果皮黃色,果肉白色,味道香甜。主要生長在熱帶、亞熱帶地區。原產於亞洲東南部熱帶、亞熱帶地區 - 香蕉(学名: Musa × paradisiaca),为芭蕉科芭蕉属小果野蕉及野蕉的人工栽培杂交种,为多年生草本植物。果实长有棱; 果皮黄色,果肉白色,味道香甜。主要生长在热带、亚热带地区。原产于亚洲东南部热带、亚热带地区。 + 香蕉(学名:Musa paradisiaca),为芭蕉科芭蕉属小果野蕉及野蕉的人工栽培杂交种,为多年生草本植物。果实长有棱; 果皮黄色,果肉白色,味道香甜。主要生长在热带、亚热带地区。原产于亚洲东南部热带、亚热带地区。 Check PBOs @@ -768,7 +778,7 @@ PBO を検査 PBO 검사 檢查PBO檔 - 检查PBO档 + 检查 PBO Check addon integrity with server and do selected action if an addon is missing. @@ -781,9 +791,9 @@ /!\ Module obsolète /!\ - Vérifie l'intégrité des addons avec le serveur, et effectue l'action sélectionnée si un addon est manquant. Controlla l'integrità degli addon con il server ed esegui l'azione selezionata se un addon è mancante サーバがアドオンの整合性を検査し、もし不備があれば実行する動作を選択できます。 - 서버 에드온의 무결성을 검사하고 사라진 에드온이 있을경우 행동을 선택합니다. + 서버 애드온의 무결성을 검사하고 사라진 애드온이 있을 경우 행동을 선택합니다. 檢查客戶端與伺服器端的模組清單是否一致且完整,並提供訊息表示遺失的模組 - 检查客户端与伺服器端的模组清单是否一致且完整,并提供讯息表示遗失的模组。 + 检查客户端与服务器端的模组清单是否一致且完整,并提供信息表示遗失的模组。 Action @@ -813,9 +823,9 @@ Что делать с игроками с неправильными аддонами? Cosa fare con giocatori che non hanno i PBO corretti? プレイヤーが正しい PBO を持っていない場合は? - 올바르지 않는 PBO를 가진 사람을 어떻게 할까요? + 올바르지 않은 PBO를 가진 사람을 어떻게 할까요? 若玩家沒有正確的PBO檔時,將採取何種動作? - 若玩家没有正确的PBO档时,将采取何种动作? + 若玩家没有正确的 PBO 档时,将采取何种动作? Warn once @@ -831,7 +841,7 @@ 一度の警告 경고 한 번 警告 (一次) - 警告 (一次) + 警告(一次) UYAR @@ -848,7 +858,7 @@ 警告 (永久的) 경고 (영구적) 警告 (持續) - 警告 (持续) + 警告(持续) UYAR (KALICI) @@ -880,7 +890,7 @@ Проверять все аддоны Controlla tutti gli addon 全アドオンを検査 - 모든 에드온 검사 + 모든 애드온 검사 檢查所有模組 检查所有模组 @@ -898,7 +908,7 @@ ACE MOD の代わりに全アドオンを検査しますか? ACE를 제외한 모든 모드를 검사할까요? 檢查包含ACE之外的其他模組? - 检查包含ACE之外的其他模组? + 检查包含 ACE 之外的其他模组? Whitelist @@ -929,9 +939,9 @@ Какие аддоны дополнительно разрешены? Quali addon sono permessi in ogni caso? どのようなアドオンを許可しますか? - 허가되는 에드온은 어느것입니까? + 허가되는 애드온은 어느 것입니까? 哪些模組是可被允許/忽略的? - 哪些模组是可被允许/忽略的? + 无论如何都允许的附加组件 LSD Vehicles @@ -961,9 +971,9 @@ Добавляет эффект LSD (мигание всеми цветами радуги) синхронизированным транспортным средствам Aggiunge effetti LSD ai veicoli sincronizzati 同期されたオブジェクトに LSD の効果を追加します - 동기화된 차량에 LSD효과를 추가합니다. + 동기화된 차량에 LSD 효과를 추가합니다. 使被同步的載具產生瘋狂的迷幻效果。(後果自負) - 使被同步的载具产生疯狂的迷幻效果。(后果自负) + 使被同步的载具产生疯狂的迷幻效果。(后果自负) Toggle Handheld Device @@ -1058,6 +1068,8 @@ Vždy Zawsze Her Zaman + 总是 + 항상 Anywhere @@ -1073,6 +1085,7 @@ どこでも 어디서나 任何地方 + 任何地方 Herhangi bir yer @@ -1089,6 +1102,7 @@ ベーシック 기본 基礎 + 基础 Basit @@ -1105,6 +1119,7 @@ 医療車両のみ 의료차량 醫療載具 + 医疗载具 Medikal Araçlar @@ -1150,10 +1165,12 @@ Confirmar Confirmer 確認 + 确认 Conferma Potvrdit Potwierdź Onayla + 확인 Never @@ -1164,10 +1181,12 @@ Nunca Jamais 從不 + 从不 Mai Nikdy Nigdy Hiçbir zaman + 안함 Vehicles only @@ -1196,7 +1215,7 @@ Non forzare Ne pas forcer 強制しない - 강제하지 말것 + 강제하지 말 것 不要強行 不要强行 Zorlama @@ -1214,7 +1233,7 @@ ACE 装備 ACE 장비 ACE 裝備按鍵 - ACE 装备按键 + ACE 装备 ACE Ekipmanlar @@ -1230,7 +1249,7 @@ ACE 全般 ACE 일반 ACE 通用按鍵 - ACE 通用按键 + ACE 通用 ACE Common @@ -1246,7 +1265,7 @@ ACE 武器 ACE 무기 ACE 武器按鍵 - ACE 武器按键 + ACE 武器 ACE Silahlar @@ -1262,7 +1281,7 @@ ACE 移動 ACE 움직임 ACE 動作按鍵 - ACE 动作按键 + ACE 移动 ACE Hareket @@ -1278,7 +1297,7 @@ ACE スコープ調節 ACE 조준경 조정 ACE 瞄準鏡調節按鍵 - ACE 瞄准镜调节按键 + ACE 瞄准镜调节 ACE Vehicles @@ -1293,11 +1312,16 @@ ACE 車両 ACE 차량 ACE 載具按鍵 - ACE 载具按键 + ACE 载具 ACE Araçlar ACE Uncategorized + ACE 未分类 + ACE 무분류 + ACE Unkategorisiert + ACE Nieskategoryzowane + ACE 無区分 No Room to unload @@ -1312,7 +1336,7 @@ 降ろすための空間がありません 沒有空間可卸載 没有空间可卸载 - 언로드 할 공간이 없습니다. + 내릴 공간이 없습니다. No inventory space @@ -1326,7 +1350,7 @@ Nincs több hely В инвентаре нет места インベントリに空きがない - 넣을 공간이 없음 + 넣을 공간이 없습니다 無可用空間 无可用空间 Envanter de alan yok @@ -1361,7 +1385,7 @@ Вес: 重量: 무게: - 重量: + 重量: 重量: Ağırlık: @@ -1386,7 +1410,7 @@ Erlaube ACE-Skripten, die Musik leiser zu stellen. ACE 스크립트가 음악을 끌 수 있습니다. 允許ACE腳本去控制音樂的音量 - 允许ACE脚本去控制音乐的音量。 + 允许 ACE 脚本去控制音乐的音量。 ACE スプリントへ音量低下を許可します。 Permetti agli script di ACEdi abbassare la musica. Zezwól skrypty ACE na przyciszanie muzyki. @@ -1403,6 +1427,8 @@ けいれん回避モード Tryb dla epileptyków Mode adapté à l'épilepsie + 癫痫病友好模式 + 광과민 친화적 모드 Disables some flashing light effects to reduce seizure risk. @@ -1410,11 +1436,13 @@ 点滅する光エフェクトを無効化し、けいれんする恐れを低下させます。 Wyłącz część migających efektów w celu zredukowania ryzyka napadu epilepsji Désactive certains effets de lumière clignotante afin de réduire les risques de crise d'épilepsie. + 禁用一些闪烁的灯光效果,以降低癫痫发作的风险。 + 반짝거리는 빛으로 인해 일어날 발작 상황을 줄여줍니다. Flag (ACE - Black) Flagge (Ace - Schwarz) - 旗帜(ACE-黑色): + 旗帜(ACE-黑色): 旗幟(ACE-黑色) Bandiera (ACE - Nera) 旗 (ACE - 黒) @@ -1425,11 +1453,12 @@ Vlajka (ACE - Černá) Bayrak (ACE- Siyah) Bandera (ACE - Negra) + 깃발 (ACE 검정) Flag (ACE - White) Flagge (Ace - Weiß) - 旗帜(ACE-白色): + 旗帜(ACE-白色): 旗幟(ACE-白色) Bandiera (ACE - Bianca) 旗 (ACE - 白) @@ -1440,6 +1469,7 @@ Vlajka (ACE - Bílá) Bayrak (ACE - Beyaz) Bandera (ACE - Blanca) + 깃발 (ACE 하양) Players only @@ -1461,6 +1491,10 @@ AI only Tylko dla AI + 인공지능만 + Nur KI + 仅 AI + AIのみ Players and AI @@ -1475,7 +1509,7 @@ Giocatori ed IA プレイヤーと AI 플레이어 및 인공지능 - 玩家与AI + 玩家与 AI 玩家與AI Oyuncular ve AI @@ -1483,6 +1517,7 @@ Show the action in the self-interaction menu Affiche l'action dans le menu d'interaction personnel. 在自我互動選單內顯示動作 + 在自我互动菜单内显示动作 Pokaż akcje w menu interakcji własnej Mostra a ação no menu de auto-interação セルフ インタラクションに動作を表示 @@ -1492,6 +1527,7 @@ Показывать действие в меню взаимодействия с собой. Kendi etkileşimim menüsünde animasyonları göster Zeigt die Aktion im Selbstinteraktionsmenü + 자기 상호작용 메뉴에서 행동을 보여줍니다 Both @@ -1501,6 +1537,8 @@ Оба Beide Oba + 两方 + 둘 다 Additional progress bar information @@ -1509,6 +1547,8 @@ Дополнительная информация прогресс-бара Zusätzliche Informationen beim Fortschrittsbalken Dodatkowe informacje na pasku postępu + 额外的进度条信息 + 추가 진행 막대 정보 Controls extra information shown in progress bar. @@ -1517,6 +1557,8 @@ Устанавливает дополнительную информацию в прогресс-баре. Kontrolliert zusätzliche Informationen beim Fortschrittsbalkens Kontroluje dodatkowe informacje na pasku postępu. + 控制进度条中显示的额外信息。 + 진행 막대에 추가적인 정보를 보여주는걸 결정합니다. Percentage @@ -1525,6 +1567,8 @@ Процент выполнения Prozent Procent + 百分比 + 백분율 Time remaining @@ -1533,6 +1577,8 @@ Времени осталось Zeit verbleibend Pozostały czas + 剩余时间 + 남은 시간 None @@ -1558,7 +1604,7 @@ Zmień nazwę 改名 Rinomina - 이름바꾸기 + 이름 바꾸기 重新命名 重新命名 Переименовать @@ -1573,6 +1619,8 @@ Оставшееся время: %1s Zeit übrig %1s Pozostały czas: %1s + 剩余时间:%1秒 + 남은 시간: %1초 Locations Boost Training @@ -1586,9 +1634,16 @@ Места ускоренного обучения 衛生能力の上昇位置 교육 증가 지역 - 受所在位置影响提升医疗能力 + 位置提升能力 受所在位置影響提升醫療能力 Konumlar Tedaviyi Hızlandırır + + Unload Weapon + Wyładuj Broń + 武器からマガジンを抜く + 탄창 빼기 + 卸掉武器弹匣 + diff --git a/addons/concertina_wire/stringtable.xml b/addons/concertina_wire/stringtable.xml index d427cf8541..069c74ffa5 100644 --- a/addons/concertina_wire/stringtable.xml +++ b/addons/concertina_wire/stringtable.xml @@ -66,7 +66,7 @@ 鉄条網を置く 철조망 배치 佈署鐵絲網 - 布署铁丝网 + 部署铁丝网 Bıçaklı Telleri Yerleştir diff --git a/addons/cookoff/CfgVehicles.hpp b/addons/cookoff/CfgVehicles.hpp index d2da771b01..78cbd0c623 100644 --- a/addons/cookoff/CfgVehicles.hpp +++ b/addons/cookoff/CfgVehicles.hpp @@ -35,13 +35,6 @@ class CfgVehicles { explosionEffect = "FuelExplosionBig"; }; - class APC_Wheeled_02_base_F: Wheeled_APC_F { // Otokar ARMA - RCWS Turret - GVAR(ignoreTurret) = 1; - }; - class APC_Tracked_01_base_F: Tank_F { // Namera, Nemmera - RCWS Turret - GVAR(ignoreTurret) = 1; - }; - class MRAP_01_base_F: Car_F { GVAR(engineSmokeOffset)[] = {0,-2,0}; diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index f143273d04..b9c8101595 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -11,17 +11,31 @@ [QGVAR(smoke), FUNC(smoke)] call CBA_fnc_addEventHandler; [QGVAR(cookOffBox), FUNC(cookOffBox)] call CBA_fnc_addEventHandler; +// handle cleaning up effects when vehicle is deleted mid-cookoff +[QGVAR(addCleanupHandlers), { + params ["_vehicle"]; + + // Don't add a new EH if cookoff is run multiple times + if ((_vehicle getVariable [QGVAR(deletedEH), -1]) == -1) then { + private _deletedEH = _vehicle addEventHandler ["Deleted", { + params ["_vehicle"]; + + [QGVAR(cleanupEffects), [_vehicle]] call CBA_fnc_localEvent; + }]; + + _vehicle setVariable [QGVAR(deletedEH), _deletedEH]; + }; +}] call CBA_fnc_addEventHandler; + [QGVAR(cleanupEffects), { params ["_vehicle", ["_effects", []]]; _effects = _effects + (_vehicle getVariable [QGVAR(effects), []]); - if !(_effects isEqualTo []) then { + if (_effects isNotEqualTo []) then { { deleteVehicle _x } count _effects; }; }] call CBA_fnc_addEventHandler; -GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; - ["ReammoBox_F", "init", { (_this select 0) addEventHandler ["HandleDamage", { if ((_this select 0) getVariable [QGVAR(enableAmmoCookoff), GVAR(enableAmmobox)]) then { @@ -39,6 +53,8 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; ) then { if (GVAR(ammoCookoffDuration) == 0) exitWith {}; ([_vehicle] call FUNC(getVehicleAmmo)) params ["_mags", "_total"]; - [_vehicle, _mags, _total] call FUNC(detonateAmmunition); + + private _delay = (random MAX_AMMO_DETONATION_START_DELAY) max MIN_AMMO_DETONATION_START_DELAY; + [FUNC(detonateAmmunition), [_vehicle, _mags, _total], _delay] call CBA_fnc_waitAndExecute; }; }, nil, ["Man","StaticWeapon"]] call CBA_fnc_addClassEventHandler; diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf index 7b8168d7f4..5b57b872ad 100644 --- a/addons/cookoff/functions/fnc_cookOff.sqf +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Start a cook-off in the given vehicle. * * Arguments: @@ -16,7 +16,7 @@ * Public: No */ -params ["_vehicle", "_intensity", ["_instigator", objNull], ["_smokeDelayEnabled", true], ["_ammoDetonationChance", 0], ["_detonateAfterCookoff", false], ["_fireSource", ""], ["_canRing", true]]; +params ["_vehicle", "_intensity", ["_instigator", objNull], ["_smokeDelayEnabled", true], ["_ammoDetonationChance", 0], ["_detonateAfterCookoff", false], ["_fireSource", ""], ["_canRing", true], ["_maxIntensity", MAX_COOKOFF_INTENSITY, [0]]]; if (GVAR(enable) == 0) exitWith {}; if !(GVAR(enableFire)) exitWith {}; @@ -25,13 +25,18 @@ if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith { if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} == -1}) exitWith {}; -TRACE_8("cooking off",_vehicle,_intensity,_instigator,_smokeDelayEnabled,_ammoDetonationChance,_detonateAfterCookoff,_fireSource,_canRing); +TRACE_9("cooking off",_vehicle,_intensity,_instigator,_smokeDelayEnabled,_ammoDetonationChance,_detonateAfterCookoff,_fireSource,_canRing,_maxIntensity); if (_vehicle getVariable [QGVAR(isCookingOff), false]) exitWith {}; _vehicle setVariable [QGVAR(isCookingOff), true, true]; +[QGVAR(addCleanupHandlers), [_vehicle]] call CBA_fnc_globalEvent; + +// limit maximum value of intensity to prevent very long cook-off times +_intensity = _intensity min _maxIntensity; + private _config = _vehicle call CBA_fnc_getObjectConfig; -private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {!((_vehicle selectionPosition _x) isEqualTo [0,0,0])}; +private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {(_vehicle selectionPosition _x) isNotEqualTo [0,0,0]}; if (_positions isEqualTo []) then { WARNING_1("no valid selection for cookoff found. %1",typeOf _vehicle); @@ -46,6 +51,9 @@ if (_positions isEqualTo []) then { }; }; +// default fire jet to enabled when not set in configs +private _canJet = ([_config >> QGVAR(canHaveFireJet), "number", 1] call CBA_fnc_getConfigEntry) == 1; + private _delay = 0; if (_smokeDelayEnabled) then { _delay = SMOKE_TIME + random SMOKE_TIME; @@ -53,21 +61,21 @@ if (_smokeDelayEnabled) then { [QGVAR(smoke), [_vehicle, _positions]] call CBA_fnc_globalEvent; [{ - params ["_vehicle", "_positions", "_intensity", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing"]; + params ["_vehicle", "_positions", "_intensity", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_canJet"]; _vehicle setVariable [QGVAR(intensity), _intensity]; private _smokeEffects = _vehicle getVariable [QGVAR(effects), []]; [{ params ["_args", "_pfh"]; - _args params ["_vehicle", "_positions", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_smokeEffects"]; + _args params ["_vehicle", "_positions", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_canJet", "_smokeEffects"]; private _intensity = _vehicle getVariable [QGVAR(intensity), 0]; if (isNull _vehicle || {_intensity <= 1}) exitWith { [QGVAR(cleanupEffects), [_vehicle, _smokeEffects]] call CBA_fnc_globalEvent; _vehicle setVariable [QGVAR(isCookingOff), false, true]; [_pfh] call CBA_fnc_removePerFrameHandler; - if (_detonateAfterCookoff) then { - _vehicle setDamage 1; + if (GVAR(destroyVehicleAfterCookoff) || _detonateAfterCookoff) then { + _vehicle setDamage [1, _detonateAfterCookoff]; }; }; @@ -93,7 +101,7 @@ if (_smokeDelayEnabled) then { _fireSource = selectRandom _positions; }; - [QGVAR(cookOffEffect), [_vehicle, true, _ring, _time, _fireSource]] call CBA_fnc_globalEvent; + [QGVAR(cookOffEffect), [_vehicle, _canJet, _ring, _time, _fireSource, _intensity]] call CBA_fnc_globalEvent; _intensity = _intensity - (0.5 max random 1); _vehicle setVariable [QGVAR(intensity), _intensity]; @@ -119,5 +127,5 @@ if (_smokeDelayEnabled) then { _vehicle setVariable [QGVAR(nextExplosiveDetonation), random 60]; }; }; - }, 0.25, [_vehicle, _positions, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _smokeEffects]] call CBA_fnc_addPerFrameHandler -}, [_vehicle, _positions, _intensity, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing], _delay] call CBA_fnc_waitAndExecute; + }, 0.25, [_vehicle, _positions, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _canJet, _smokeEffects]] call CBA_fnc_addPerFrameHandler +}, [_vehicle, _positions, _intensity, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _canJet], _delay] call CBA_fnc_waitAndExecute; diff --git a/addons/cookoff/functions/fnc_cookOffEffect.sqf b/addons/cookoff/functions/fnc_cookOffEffect.sqf index 96db943592..2634d0ceb3 100644 --- a/addons/cookoff/functions/fnc_cookOffEffect.sqf +++ b/addons/cookoff/functions/fnc_cookOffEffect.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Spawn cook-off effects * * Arguments: @@ -9,6 +9,7 @@ * 2: Spawn fire ring * 3: How long effect will last (Max 20 seconds) * 4: What selection will fire originate from + * 5: Cookoff intensity value * * Return Value: * None @@ -19,7 +20,7 @@ * Public: No */ -params ["_obj", "_jet", "_ring", "_time", "_fireSelection"]; +params ["_obj", "_jet", "_ring", "_time", "_fireSelection", "_intensity"]; private _light = "#lightpoint" createVehicleLocal [0,0,0]; _light setLightBrightness 5; _light setLightAmbient [0.8, 0.6, 0.2]; @@ -31,8 +32,10 @@ private _sound = objNull; if (isServer) then { // ironically biggest performance hit is this. Creating a new sound source takes up aprox 400 milliseconds. // I dont think there is an alternative that takes into effect distance and whatever, but if you find one please fix! - private _soundName = selectRandomWeighted [QGVAR(Sound_low), 0.1, QGVAR(Sound_mid), 0.25, QGVAR(Sound_high), 0.65]; - _sound = createSoundSource [_soundName, position _obj, [], 0]; + if (_jet || _ring) then { + private _soundName = selectRandomWeighted [QGVAR(Sound_low), 0.1, QGVAR(Sound_mid), 0.25, QGVAR(Sound_high), 0.65]; + _sound = createSoundSource [_soundName, position _obj, [], 0]; + }; if (_ring) then { private _intensity = 6; @@ -43,12 +46,14 @@ if (isServer) then { [{ params ["_args", "_pfh"]; - _args params ["_obj", "_jet", "_ring", "_time", "_startTime", "_light", "_fireSelection", "_sound"]; + _args params ["_obj", "_jet", "_ring", "_time", "_startTime", "_light", "_fireSelection", "_sound", "_intensity"]; private _elapsedTime = CBA_missionTime - _startTime; if (_elapsedTime >= _time) exitWith { deleteVehicle _light; deleteVehicle _sound; - [QEGVAR(fire,removeFireSource), [_obj]] call CBA_fnc_globalEvent; + if (isServer) then { + [QEGVAR(fire,removeFireSource), [_obj]] call CBA_fnc_localEvent; + }; [_pfh] call CBA_fnc_removePerFrameHandler; }; private _factor = (1 + (_elapsedTime / 2) min 2); @@ -183,5 +188,14 @@ if (isServer) then { [2 + random 1], 1, 0, "", "", _obj ]; }; -}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound]] call cba_fnc_addPerFrameHandler; + + (getVehicleTIPars _obj) params ["_tiEngine", "_tiWheels", "_tiWeapon"]; + _obj setVehicleTIPars [ + // formula is designed to have the temperature ramp up quickly and then level out + (_tiEngine + (_intensity * 0.01))/1.005, + (_tiWheels + (_intensity * 0.004))/1.002, // wheels//tracks are further away from burning parts + (_tiWeapon + (_intensity * 0.01))/1.005 + ]; + +}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound, _intensity]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf index 62015cadae..295d54a54f 100644 --- a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf +++ b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf @@ -24,21 +24,18 @@ TRACE_1("getVehicleAmmo",_vehicle); private _ammoToDetonate = []; private _totalAmmo = 0; -// from ace_common, tweaked becasue command is busted -private _ffvTurrets = fullCrew [_vehicle, "", true] select {_x select 4} apply {_x select 3}; - // Get ammo from turrets { _x params ["_mag", "_turret", "_count"]; // if the turret is an FFV seat, it takes magazines from the soldier - if (!(_turret in _ffvTurrets) && {_count > 0}) then { + if (_count > 0) then { private _ammo = getText (configFile >> "CfgMagazines" >> _mag >> "ammo"); private _model = getText (configFile >> "CfgAmmo" >> _ammo >> "model"); if (_model == "\A3\weapons_f\empty") exitWith {TRACE_3("skipping",_mag,_ammo,_model);}; _ammoToDetonate pushBack [_mag, _count]; _totalAmmo = _totalAmmo + _count; }; -} forEach (magazinesAllTurrets _vehicle); +} forEach (magazinesAllTurrets [_vehicle, true]); // Get ammo from cargo space { diff --git a/addons/cookoff/functions/fnc_smoke.sqf b/addons/cookoff/functions/fnc_smoke.sqf index de9e4c5d37..fa8968f884 100644 --- a/addons/cookoff/functions/fnc_smoke.sqf +++ b/addons/cookoff/functions/fnc_smoke.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Starts vehicle barrel smoke effect. * * Arguments: @@ -11,7 +11,7 @@ * None * * Example: - * [vehicle player, ["commander_turret"]] call ace_cookoff_fnc_barrelSmoke + * [vehicle player, ["commander_turret"]] call ace_cookoff_fnc_smoke * * Public: No */ @@ -31,7 +31,7 @@ private _effects = [_smokeBarrel]; { private _position = [0, -2, 0]; - if !(_x isEqualTo "#noselection") then { + if (_x isNotEqualTo "#noselection") then { _position = _vehicle selectionPosition _x; }; diff --git a/addons/cookoff/initSettings.sqf b/addons/cookoff/initSettings.sqf index cbba7c1719..8912636fd6 100644 --- a/addons/cookoff/initSettings.sqf +++ b/addons/cookoff/initSettings.sqf @@ -18,6 +18,16 @@ false // Needs mission restart ] call CBA_fnc_addSetting; +[ + QGVAR(destroyVehicleAfterCookoff), "CHECKBOX", + [LSTRING(destroyVehicleAfterCookoff_name), LSTRING(destroyVehicleAfterCookoff_tooltip)], + LSTRING(category_displayName), + false, // default value + true, // isGlobal + {[QGVAR(destroyVehicleAfterCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)}, + false // Needs mission restart +] call CBA_fnc_addSetting; + [ QGVAR(enableAmmoCookoff), "CHECKBOX", [LSTRING(enableAmmoCookoff_name), LSTRING(enableAmmoCookoff_tooltip)], diff --git a/addons/cookoff/script_component.hpp b/addons/cookoff/script_component.hpp index 1bf61761b4..03b3e5c5f5 100644 --- a/addons/cookoff/script_component.hpp +++ b/addons/cookoff/script_component.hpp @@ -27,6 +27,10 @@ #define MIN_TIME_BETWEEN_FLAMES 5 #define MAX_TIME_BETWEEN_FLAMES 15 #define MAX_TIME_BETWEEN_AMMO_DET 25 +#define MAX_COOKOFF_INTENSITY 10 + +#define MIN_AMMO_DETONATION_START_DELAY 1 // Min time to wait before a vehicle's ammo starts to cookoff +#define MAX_AMMO_DETONATION_START_DELAY 6 // Max time to wait before a vehicle's ammo starts to cookoff // Delay between flame effect for players in a cooking off vehicle #define FLAME_EFFECT_DELAY 0.4 diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index d237193c77..d6d71a0f50 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -25,9 +25,11 @@ Manipulação de dano e efeitos de torre Dégâts et effets de tourelle 傷害控制及炮塔效果 + 损坏处理和炮塔效果 Manovrabilità danneggiata ed effetti torretta Poškodit ovládání a efekty věže Obsługa obrażeń i efekty wieży + 피해량 조절 및 터렛에 효과 부여 Changes damage handling for cook off and turret explosion effects @@ -38,9 +40,11 @@ Modifica a manipulação de dano para o cozinhamento de munição e efeitos de explosão da torre Modifie la gestion des dégâts pour l'auto-inflammation et les effets d'explosion de tourelle. 更改殉爆以及炮塔爆炸之傷害控制 + 改变殉爆和炮塔爆炸的损坏处理效果 Modifica la gestione dei danni per gli effetti di esplosione della torretta e danneggiamenti Změní poškození ovládání a efekty výbuchu veže Zmienia obsługę obrażeń podczas samozapłonu i eksplozji wieży + 쿡오프로 인해 피해량의 변화와 터렛 터짐현상을 결정합니다. Enable ammo box cook off @@ -96,8 +100,8 @@ Permet l'auto-inflammation des munitions. Tire des projectiles tant que le véhicule est en feu et contient des munitions. Abilita l'esplosione delle munizioni. Spara munizioni di proiettili quando il veicolo va a fuoco e contiene munizioni. 開啟彈藥殉爆效果。當一台載有彈藥的載具起火時, 將會有殉爆的效果 - 开启弹药殉爆效果。当一台载有弹药的载具起火时, 将会有殉爆的效果。 - 쿡오프 현상을 활성화 합니다. 이것은 탄약에 불이 붙어있는 동안 주변에 발사체를 발사합니다. + 开启弹药殉爆效果。当一台载有弹药的载具起火时,将会有殉爆的效果。 + 쿡오프 현상을 활성화 합니다. 이것은 탄약에 불이 붙어 있는 동안 주변에 발사체를 발사합니다. Активирует возгорание и детонацию боекомплекта в горящей технике Permite que a munição cozinhe. Dispara projéteis de munição enquanto o veículo está em chamas e tem munição. Zapíná vznícení munice. Vystřeluje projektily po dobu kdy vozidlo hoří a má munici. @@ -145,6 +149,7 @@ Коэффициент вероятности возгорания Probabilidade de Cozinhar Koeficient pravděpodobnosti vznícení munice + 쿡오프 발생 확률 계수 Multiplier for cook-off probability. Higher value results in higher cook-off probability @@ -159,6 +164,17 @@ Множитель коэффициента вероятности возгорания. Чем выше значение, тем выше вероятность. Multiplicador para a chance de cozinhamento. Valores mais altos aumentam as chances de ocorrer. Multiplikátor pro pravděpodobnost vznícení munice. Vyšší hodnota znamená vyšší šanci vznícení munice. + 쿡오프가 일어날 확률에 계수를 곱합니다. 더 큰 숫자는 더 높은 확률의 쿡오프를 일으킵니다. + + + Destroy Vehicles After Cook-off + 쿡오프 후 차량 파괴 + 殉爆发生后摧毁载具 + + + Controls whether vehicles will always be destroyed after cooking off. Depending on the cookoff, the vehicle may explode or may simply be killed without effects. + 차량이 쿡오프된 후 파괴할 지에 대한 여부를 제어합니다. 쿡오프에 따라 차량이 폭발하거나 아무런 효과 없이 파괴될 수 있습니다. + 控制载具是否总是会在殉爆结束后被摧毁。根据殉爆的剧烈程度,载具可能会爆炸,也可能只是被没有效果地摧毁。 Enable Cook-Off Vehicle Fire @@ -167,6 +183,8 @@ Включить возгорание поеприпасов Aktiviert das in Brand setzen des Fahrzeugs während des Durchzündens der Munition Włącz pożar pojazdu podczas samozapłonu + 启用殉爆载具火灾 + 차량 쿡오프 화재 활성화 Whether or not vehicles will catch on fire during cook-off @@ -175,6 +193,8 @@ Будет ли техника возгораться при подрыве боеприпасов Ob Fahrzeuge in Brand gesetzt werden, während deren Munition durchzündet. Określa, czy pojazdy zapalą się podczas samozapłonu ich amunicji. + 车辆在殉爆过程中是否会起火 + 쿡오프가 일어나면 차량에 불이 붙습니다. diff --git a/addons/csw/CfgVehicles.hpp b/addons/csw/CfgVehicles.hpp index 4a1d63eb0c..dd5537f645 100644 --- a/addons/csw/CfgVehicles.hpp +++ b/addons/csw/CfgVehicles.hpp @@ -272,5 +272,15 @@ class CfgVehicles { ammoUnloadTime = 3; }; }; + // Ammo holder for returning ammo + class ReammoBox_F; + class GVAR(ammo_holder): ReammoBox_F { + EGVAR(cargo,canLoad) = 0; + EGVAR(cargo,noRename) = 1; + EGVAR(dragging,canCarry) = 1; // Allow this to be moved alongside the weapon + EGVAR(dragging,canDrag) = 1; + scope = 1; + maximumLoad = 0; // don't allow anything to be placed inside, only removed + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + }; }; - diff --git a/addons/csw/XEH_PREP.hpp b/addons/csw/XEH_PREP.hpp index 7bde8c3c0f..5966578aca 100644 --- a/addons/csw/XEH_PREP.hpp +++ b/addons/csw/XEH_PREP.hpp @@ -3,6 +3,8 @@ TRACE_1("",QUOTE(ADDON)); PREP(aceRearmGetCarryMagazines); PREP(ai_handleFired); +PREP(ai_handleGetIn); +PREP(ai_reload); PREP(assemble_canDeployTripod); PREP(assemble_canDeployWeapon); @@ -17,6 +19,7 @@ PREP(assemble_pickupWeapon); PREP(canGetIn); PREP(getIn); +PREP(getCarryMagazine); PREP(proxyWeapon); PREP(reload_actionsLoad); diff --git a/addons/csw/XEH_postInit.sqf b/addons/csw/XEH_postInit.sqf index d2dda6b0d1..fddac69385 100644 --- a/addons/csw/XEH_postInit.sqf +++ b/addons/csw/XEH_postInit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" -GVAR(vehicleMagCache) = call CBA_fnc_createNamespace; +GVAR(vehicleMagCache) = createHashMap; ["CBA_settingsInitialized", { TRACE_3("settingsInit",GVAR(defaultAssemblyMode),GVAR(handleExtraMagazines),GVAR(ammoHandling)); diff --git a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf index 09ea4be8f8..ac51d03347 100644 --- a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf +++ b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf @@ -31,13 +31,7 @@ private _allCarryMags = []; private _weapon = _x; { private _xMag = _x; - private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; - if (isNil "_carryMag") then { - private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); - _carryMag = configName (_groups param [0, configNull]); - GVAR(vehicleMagCache) setVariable [_x, _carryMag]; - TRACE_2("setting cache",_xMag,_carryMag); - }; + private _carryMag = _xMag call FUNC(getCarryMagazine); if (_carryMag != "") then { _turretMagsCSW pushBackUnique _xMag; _allCarryMags pushBackUnique _carryMag; diff --git a/addons/csw/functions/fnc_ai_handleFired.sqf b/addons/csw/functions/fnc_ai_handleFired.sqf index eb41ed3831..668a425b50 100644 --- a/addons/csw/functions/fnc_ai_handleFired.sqf +++ b/addons/csw/functions/fnc_ai_handleFired.sqf @@ -1,92 +1,23 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Initializes weapon to disable weapon disassembling + * Handles AI Fired EH * * Arguments: - * 0: Weapon + * Fired EH * * Return Value: * None * - * Example: - * [weapon] call ace_csw_fnc_ai_handleFired - * * Public: No */ params ["_staticWeapon", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"]; -TRACE_8("firedEH:",_staticWeapon, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _gunner); +TRACE_8("firedEH:",_staticWeapon,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile,_gunner); if ((!local _gunner) || {[_gunner] call EFUNC(common,isPlayer)}) exitWith {}; if (someAmmo _staticWeapon) exitWith {}; TRACE_2("need ammo",someAmmo _staticWeapon,magazinesAllTurrets _staticWeapon); -private _turretPath = [_gunner] call EFUNC(common,getTurretIndex); -private _reloadSource = objNull; -private _reloadMag = ""; -private _reloadNeededAmmo = -1; - -// Find if there is anything we can reload with -{ - scopeName "findSource"; - private _xSource = _x; - - private _cswMagazines = []; - { - if (isClass (configFile >> QGVAR(groups) >> _x)) then { _cswMagazines pushBackUnique _x; }; - } forEach (if (_xSource isKindOf "CaManBase") then {magazines _x} else {magazineCargo _x}); - TRACE_2("",_xSource,_cswMagazines); - - private _compatibleMags = [_magazine] + ([_weapon] call CBA_fnc_compatibleMagazines); // Check current mag first - - { - private _xWeaponMag = _x; - { - if ((getNumber (configFile >> QGVAR(groups) >> _x >> _xWeaponMag)) == 1) then { - private _loadInfo = [_staticWeapon, _turretPath, _reloadMag, objNull] call FUNC(reload_canLoadMagazine); - if (_loadInfo select 0) then { - _reloadMag = _x; - _reloadSource = _xSource; - _reloadNeededAmmo = _loadInfo select 2; - TRACE_3("found mag",_reloadMag,_reloadSource,_x); - breakOut "findSource"; - }; - }; - } forEach _cswMagazines; - } forEach _compatibleMags; -} forEach ([_gunner] + (_staticWeapon nearSupplies 10)); -if (_reloadMag == "") exitWith {TRACE_1("could not find mag",_reloadMag);}; - -// Figure out what we can add from the magazines we have -private _bestAmmoToSend = -1; -{ - _x params ["_xMag", "_xAmmo"]; - TRACE_2("",_xMag,_xAmmo); - if (_xMag == _reloadMag) then { - if ((_bestAmmoToSend == -1) || {(_xAmmo > _bestAmmoToSend) && {_xAmmo <= _reloadNeededAmmo}}) then { - _bestAmmoToSend = _xAmmo; - }; - }; -} forEach (if (_reloadSource isKindOf "CaManBase") then {magazinesAmmo _reloadSource} else {magazinesAmmoCargo _reloadSource}); -TRACE_4("",_reloadSource,_reloadMag,_reloadNeededAmmo,_bestAmmoToSend); -if (_bestAmmoToSend == -1) exitWith {ERROR("No ammo");}; - -// Remove the mag from the source -[_reloadSource, _reloadMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); - -private _timeToLoad = 1; -if (!isNull(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime")) then { - _timeToLoad = getNumber(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime"); -}; - -TRACE_1("Reloading in progress",_timeToLoad); -[{ - params ["_staticWeapon", "_turretPath", "_gunner", "_reloadMag", "_bestAmmoToSend"]; - if ((!alive _staticWeapon) || {!alive _gunner} || {(_staticWeapon distance _gunner) > 10}) exitWith {TRACE_1("invalid state",_this);}; - - // Reload the static weapon - TRACE_5("calling addTurretMag event",_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend); - [QGVAR(addTurretMag), _this] call CBA_fnc_globalEvent; -}, [_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend], _timeToLoad] call CBA_fnc_waitAndExecute; +[_staticWeapon, _gunner, _weapon, _magazine] call FUNC(ai_reload); diff --git a/addons/csw/functions/fnc_ai_handleGetIn.sqf b/addons/csw/functions/fnc_ai_handleGetIn.sqf new file mode 100644 index 0000000000..3184e95956 --- /dev/null +++ b/addons/csw/functions/fnc_ai_handleGetIn.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: GhostIsSpooky + * Handles AI GetIn on an empty weapon + * + * Arguments: + * GetIn EH + * + * Return Value: + * None + * + * Public: No + */ +params ["_staticWeapon", "_role", "_gunner"]; +TRACE_3("getInEH:",_staticWeapon,_role,_gunner); + +if ((!local _gunner) || {[_gunner] call EFUNC(common,isPlayer)}) exitWith {}; +if (someAmmo _staticWeapon) exitWith {}; + +TRACE_2("need ammo",someAmmo _staticWeapon,magazinesAllTurrets _staticWeapon); + +[_staticWeapon, _gunner, currentWeapon _staticWeapon] call FUNC(ai_reload); diff --git a/addons/csw/functions/fnc_ai_reload.sqf b/addons/csw/functions/fnc_ai_reload.sqf new file mode 100644 index 0000000000..f4d69b03c4 --- /dev/null +++ b/addons/csw/functions/fnc_ai_reload.sqf @@ -0,0 +1,95 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror, modified by GhostIsSpooky + * Handles AI reloading + * + * Arguments: + * 0: Static Weapon + * 1: Gunner + * 2: Weapon + * 3: Magazine (default: "") + * + * Return Value: + * None + * + * Public: No + */ +params ["_staticWeapon", "_gunner", "_weapon", ["_magazine", ""]]; + +private _turretPath = [_gunner] call EFUNC(common,getTurretIndex); +private _reloadSource = objNull; +private _reloadMag = ""; +private _reloadNeededAmmo = -1; + +private _cfgMagGroups = configFile >> QGVAR(groups); + +private _nearSupplies = [_gunner] + ((_staticWeapon nearSupplies 10) select { + isNull (group _x) || + {!([_x] call EFUNC(common,isPlayer)) && {[side group _gunner, side group _x] call BIS_fnc_sideIsFriendly}} +}); + +// Find if there is anything we can reload with +{ + scopeName "findSource"; + private _xSource = _x; + + private _cswMagazines = []; + { + _cswMagazines pushBackUnique _x; + } forEach ((magazineCargo _xSource) select {isClass (_cfgMagGroups >> _x)}); + TRACE_2("",_xSource,_cswMagazines); + + private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; + if (_magazine != "") then { + _compatibleMags insert [0, [_magazine]]; + }; + + { + private _xWeaponMag = _x; + { + if ((getNumber (_cfgMagGroups >> _x >> _xWeaponMag)) == 1) then { + private _loadInfo = [_staticWeapon, _turretPath, _x, _xSource] call FUNC(reload_canLoadMagazine); + if (_loadInfo select 0) then { + _reloadMag = _x; + _reloadSource = _xSource; + _reloadNeededAmmo = _loadInfo select 2; + TRACE_3("found mag",_reloadMag,_reloadSource,_x); + breakOut "findSource"; + }; + }; + } forEach _cswMagazines; + } forEach _compatibleMags; +} forEach _nearSupplies; +if (_reloadMag == "") exitWith {TRACE_1("could not find mag",_reloadMag);}; + +// Figure out what we can add from the magazines we have +private _bestAmmoToSend = -1; +{ + _x params ["_xMag", "_xAmmo"]; + TRACE_2("",_xMag,_xAmmo); + if (_xMag == _reloadMag) then { + if ((_bestAmmoToSend == -1) || {(_xAmmo > _bestAmmoToSend) && {_xAmmo <= _reloadNeededAmmo}}) then { + _bestAmmoToSend = _xAmmo; + }; + }; +} forEach (if (_reloadSource isKindOf "CAManBase") then {magazinesAmmo _reloadSource} else {magazinesAmmoCargo _reloadSource}); +TRACE_4("",_reloadSource,_reloadMag,_reloadNeededAmmo,_bestAmmoToSend); +if (_bestAmmoToSend == -1) exitWith {ERROR("No ammo");}; + +// Remove the mag from the source +[_reloadSource, _reloadMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); + +private _timeToLoad = 1; +if (!isNull(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime")) then { + _timeToLoad = getNumber(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime"); +}; + +TRACE_1("Reloading in progress",_timeToLoad); +[{ + params ["_staticWeapon", "_turretPath", "_gunner", "_reloadMag", "_bestAmmoToSend"]; + if ((!alive _staticWeapon) || {!alive _gunner} || {(_staticWeapon distance _gunner) > 10}) exitWith {TRACE_1("invalid state",_this);}; + + // Reload the static weapon + TRACE_5("calling addTurretMag event",_staticWeapon,_turretPath,_gunner,_reloadMag,_bestAmmoToSend); + [QGVAR(addTurretMag), _this] call CBA_fnc_globalEvent; +}, [_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend], _timeToLoad] call CBA_fnc_waitAndExecute; diff --git a/addons/csw/functions/fnc_assemble_canDeployTripod.sqf b/addons/csw/functions/fnc_assemble_canDeployTripod.sqf index 0701d049b2..e06b68ec19 100644 --- a/addons/csw/functions/fnc_assemble_canDeployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_canDeployTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Checks if the player can deploy the tripod. * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf index b0659e2f01..b139de392e 100644 --- a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Checks if you can deploy a weapon on the tripod * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canPickupTripod.sqf b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf index a5cd0d5c0c..6850a3cb09 100644 --- a/addons/csw/functions/fnc_assemble_canPickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Checks if the player can pick-up the tripod. * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf index ef40e03b3c..9736fb97dd 100644 --- a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * If the CSW is mounted or in use this will not allow you to dismount the weapon * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf index d1392f5bac..35c3fb70c2 100644 --- a/addons/csw/functions/fnc_assemble_deployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Deploys the tripod * * Arguments: @@ -21,12 +21,14 @@ // Remove the tripod from the launcher slot private _secondaryWeaponClassname = secondaryWeapon _player; + // handle loaded launchers which can become csw like CUP Metis + private _secondaryWeaponMagazine = secondaryWeaponMagazine _player param [0, ""]; _player removeWeaponGlobal (secondaryWeapon _player); private _onFinish = { params ["_args"]; - _args params ["_player", "_secondaryWeaponClassname"]; - TRACE_2("deployTripod finish",_player,_secondaryWeaponClassname); + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; + TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy"); @@ -34,6 +36,9 @@ private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"]; // Because the tripod can be a "full weapon" we disable any data that will allow it to be loaded _cswTripod setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set enabled&unload assembly mode and broadcast + if (_secondaryWeaponMagazine isNotEqualTo "") then { + _cswTripod setVariable [QGVAR(secondaryWeaponMagazine), _secondaryWeaponMagazine]; + }; if (!GVAR(defaultAssemblyMode)) then { TRACE_1("global disableVanillaAssembly event",_cswTripod); // handles it being assembled when setting is disabled [QGVAR(disableVanillaAssembly), [_cswTripod]] call CBA_fnc_globalEvent; @@ -61,12 +66,15 @@ private _onFailure = { params ["_args"]; - _args params ["_player", "_secondaryWeaponClassname"]; - TRACE_2("deployTripod failure",_player,_secondaryWeaponClassname); + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; + TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); _player addWeaponGlobal _secondaryWeaponClassname; + if (_secondaryWeaponMagazine isNotEqualTo "") then { + _player addWeaponItem [_secondaryWeaponClassname, _secondaryWeaponMagazine, true]; + }; }; private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); - [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname], _onFinish, _onFailure, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); + [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponMagazine], _onFinish, _onFailure, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); }, _this] call CBA_fnc_execNextFrame; diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf index 12091b81ba..0e5c0b27f8 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Deploys the current CSW * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf index 4f06b6e406..d74af7f1c1 100644 --- a/addons/csw/functions/fnc_assemble_pickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Picks up the tripod and adds it to the player launcher slot * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index 4763f646ad..9b17fcaf73 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Dismounts the weapon from the tripod and drops its backpack beside * * Arguments: @@ -37,16 +37,18 @@ _weaponPos set [2, (_weaponPos select 2) + 0.1]; private _weaponDir = getDir _staticWeapon; + private _carryWeaponMag = ""; + private _carryWeaponMags = getArray (configFile >> "CfgWeapons" >> _carryWeaponClassname >> "magazines") apply {toLower _x}; LOG("remove ammo"); { _x params ["_xMag", "", "_xAmmo"]; + if (_xAmmo == 0) then {continue}; - private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; - if (isNil "_carryMag") then { - private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); - _carryMag = configName (_groups param [0, configNull]); - GVAR(vehicleMagCache) setVariable [_xMag, _carryMag]; - TRACE_2("setting cache",_xMag,_carryMag); + private _carryMag = _xMag call FUNC(getCarryMagazine); + if (_carryWeaponMag isEqualTo "" && {toLower _carryMag in _carryWeaponMags}) then { + TRACE_3("Adding mag to secondary weapon",_xMag,_xAmmo,_carryMag); + _carryWeaponMag = _carryMag; + DEC(_xAmmo); }; if ((_xAmmo > 0) && {_carryMag != ""}) then { TRACE_2("Removing ammo",_xMag,_carryMag); @@ -68,16 +70,23 @@ }; [{ - params ["_player", "_weaponPos", "_carryWeaponClassname"]; + params ["_player", "_weaponPos", "_carryWeaponClassname", "_carryWeaponMag"]; if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith { _player addWeapon _carryWeaponClassname; + if (_carryWeaponMag isNotEqualTo "") then { + _player addWeaponItem [_carryWeaponClassname, _carryWeaponMag, true]; + }; }; private _weaponRelPos = _weaponPos getPos RELATIVE_DIRECTION(90); private _weaponHolder = createVehicle ["groundWeaponHolder", [0, 0, 0], [], 0, "NONE"]; _weaponHolder setDir random [0, 180, 360]; _weaponHolder setPosATL [_weaponRelPos select 0, _weaponRelPos select 1, _weaponPos select 2]; - _weaponHolder addWeaponCargoGlobal [_carryWeaponClassname, 1]; - }, [_player, _weaponPos, _carryWeaponClassname]] call CBA_fnc_execNextFrame; + if (_carryWeaponMag isEqualTo "") then { + _weaponHolder addWeaponCargoGlobal [_carryWeaponClassname, 1]; + } else { + _weaponHolder addWeaponWithAttachmentsCargoGlobal [[_carryWeaponClassname, "", "", "", [_carryWeaponMag, 1], [], ""], 1]; + }; + }, [_player, _weaponPos, _carryWeaponClassname, _carryWeaponMag]] call CBA_fnc_execNextFrame; LOG("delete weapon"); deleteVehicle _staticWeapon; @@ -93,4 +102,3 @@ [TIME_PROGRESSBAR(_pickupTime), [_staticWeapon, _player, _carryWeaponClassname, _turretClassname, _onDisassembleFunc], _onFinish, {}, localize LSTRING(DisassembleCSW_progressBar), _condition] call EFUNC(common,progressBar); }, _this] call CBA_fnc_execNextFrame; - diff --git a/addons/csw/functions/fnc_canGetIn.sqf b/addons/csw/functions/fnc_canGetIn.sqf index 92b05b1c2c..052f48f8b0 100644 --- a/addons/csw/functions/fnc_canGetIn.sqf +++ b/addons/csw/functions/fnc_canGetIn.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Checks if the player can get in the weapon * * Arguments: diff --git a/addons/csw/functions/fnc_getCarryMagazine.sqf b/addons/csw/functions/fnc_getCarryMagazine.sqf new file mode 100644 index 0000000000..4535512e2d --- /dev/null +++ b/addons/csw/functions/fnc_getCarryMagazine.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror, Dystopian + * Gets magazine that the player can carry, suitable to vehicle magazine + * + * Arguments: + * 0: Vehicle Magazine + * + * Return Value: + * Carry Magazine + * + * Example: + * "1Rnd_GAT_missiles" call ace_csw_fnc_getCarryMagazine + * + * Public: No + */ + +params ["_vehicleMag"]; + +private _carryMag = GVAR(vehicleMagCache) get _vehicleMag; +if (isNil "_carryMag") then { + private _groups = "getNumber (_x >> _vehicleMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); + _carryMag = configName (_groups param [0, configNull]); + GVAR(vehicleMagCache) set [_vehicleMag, _carryMag]; + TRACE_2("setting cache",_vehicleMag,_carryMag); +}; + +_carryMag diff --git a/addons/csw/functions/fnc_getIn.sqf b/addons/csw/functions/fnc_getIn.sqf index 338d17e03e..9a11553ce9 100644 --- a/addons/csw/functions/fnc_getIn.sqf +++ b/addons/csw/functions/fnc_getIn.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * An action for the player to get in the CSW * Due to the fact that the default static weapons "Get In" memory point is at the front of * the gun and can't be acssesed from the back, I am implementing this to get around that issue. diff --git a/addons/csw/functions/fnc_proxyWeapon.sqf b/addons/csw/functions/fnc_proxyWeapon.sqf index 3e47fddadd..e4449bbbce 100644 --- a/addons/csw/functions/fnc_proxyWeapon.sqf +++ b/addons/csw/functions/fnc_proxyWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM), PabstMirror + * Author: Dani (TCVM), PabstMirror * Handles the use of proxy weapons to fix engine-reload times * * Arguments: @@ -23,10 +23,9 @@ TRACE_4("proxyWeapon",_staticWeapon,_turret,_needed,_emptyWeapon); if (_staticWeapon getVariable [format [QGVAR(proxyHandled_%1), _turret], false]) exitWith { TRACE_1("already handled",typeOf _staticWeapon); }; -private _typeOf = typeOf _staticWeapon; -private _proxyWeapon = getText(configFile >> "CfgVehicles" >> _typeOf >> "ace_csw" >> "proxyWeapon"); +private _proxyWeapon = getText (configOf _staticWeapon >> "ace_csw" >> "proxyWeapon"); -TRACE_2("",_typeOf,_proxyWeapon); +TRACE_2("",typeOf _staticWeapon,_proxyWeapon); if (_proxyWeapon == "") exitWith {}; private _currentWeapon = (_staticWeapon weaponsTurret [0]) param [0, "#none"]; diff --git a/addons/csw/functions/fnc_reload_actionsLoad.sqf b/addons/csw/functions/fnc_reload_actionsLoad.sqf index c5e7a3b574..d141da3d93 100644 --- a/addons/csw/functions/fnc_reload_actionsLoad.sqf +++ b/addons/csw/functions/fnc_reload_actionsLoad.sqf @@ -23,24 +23,26 @@ private _loadableMagazines = [_vehicle, _player] call FUNC(reload_getLoadableMag private _statement = { params ["_target", "_player", "_params"]; - _params params ["_carryMag", "_turretPath"]; + _params params ["_carryMag", "_turretPath", "", "_magSource"]; - [_target, _turretPath, _carryMag, _player] call FUNC(reload_loadMagazine); + [_target, _turretPath, _carryMag, _magSource, _player] call FUNC(reload_loadMagazine); }; private _condition = { params ["_target", "_player", "_params"]; - _params params ["_carryMag", "_turretPath"]; + _params params ["_carryMag", "_turretPath", "", "_magSource"]; - ([_target, _turretPath, _carryMag, _player] call FUNC(reload_canLoadMagazine)) select 0 + ([_target, _turretPath, _carryMag, _magSource] call FUNC(reload_canLoadMagazine)) select 0 }; +private _cfgMagazines = configFile >> "CfgMagazines"; // micro-optimization + { - _x params ["_carryMag", "_turretPath", "_loadInfo"]; + _x params ["_carryMag", "", "_loadInfo"]; _loadInfo params ["", "", "", "_isBeltLinking"]; - private _displayName = getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName"); - private _picture = getText (configFile >> "CfgMagazines" >> _carryMag >> "picture"); + private _displayName = getText (_cfgMagazines >> _carryMag >> "displayName"); + private _picture = getText (_cfgMagazines >> _carryMag >> "picture"); private _text = if (_isBeltLinking) then { format [localize LSTRING(actionLink), _displayName]; } else { @@ -53,4 +55,3 @@ private _condition = { TRACE_1("loadActions",count _actions); _actions - diff --git a/addons/csw/functions/fnc_reload_actionsUnload.sqf b/addons/csw/functions/fnc_reload_actionsUnload.sqf index 24e60b1a38..0f4e9cb7de 100644 --- a/addons/csw/functions/fnc_reload_actionsUnload.sqf +++ b/addons/csw/functions/fnc_reload_actionsUnload.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Gets sub actions for what the player can load into the static weapon + * Gets sub actions for what the player can unload from the static weapon * * Arguments: * 0: Target @@ -52,25 +52,20 @@ private _condition = { private _actions = []; private _handeledMagTypes = []; +private _cfgMagazines = configFile >> "CfgMagazines"; + // Go through magazines on static weapon and check if any are unloadable { _x params ["_xMag", "_xTurret", "_xAmmo"]; if ((_xAmmo > 0) && {!(_xMag in _handeledMagTypes)}) then { _handeledMagTypes pushBack _xMag; - private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; - - if (isNil "_carryMag") then { - private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); - _carryMag = configName (_groups param [0, configNull]); - GVAR(vehicleMagCache) setVariable [_xMag, _carryMag]; - TRACE_2("setting cache",_xMag,_carryMag); - }; + private _carryMag = _xMag call FUNC(getCarryMagazine); if (_carryMag == "") exitWith {}; - private _displayName = getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName"); + private _displayName = getText (_cfgMagazines >> _carryMag >> "displayName"); private _text = format [LLSTRING(unloadX), _displayName]; - private _picture = getText (configFile >> "CfgMagazines" >> _carryMag >> "picture"); + private _picture = getText (_cfgMagazines >> _carryMag >> "picture"); private _action = [format ["unload_%1", _forEachIndex], _text, _picture, _statement, _condition, {}, [_xMag, _xTurret, _carryMag]] call EFUNC(interact_menu,createAction); _actions pushBack [_action, [], _vehicle]; }; @@ -78,4 +73,3 @@ private _handeledMagTypes = []; TRACE_1("unloadActions",count _actions); _actions - diff --git a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf index 69f8e6c93a..d026586eb0 100644 --- a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf @@ -1,13 +1,13 @@ #include "script_component.hpp" /* - * Author: PabstMirror & TCVM + * Author: PabstMirror &Dani (TCVM) * Tests if unit can load a magazine into a static weapon. * * Arguments: * 0: Static Weapon * 1: Turret Path * 2: Carryable Magazine - * 3: Player + * 3: Supplier * * Return Value: * [CanLoad, LoadedMag, AmmoNeeded, IsBeltLinking] @@ -18,17 +18,30 @@ * Public: No */ -params ["_vehicle", "_turret", "_carryMag", ["_unit", objNull]]; -// TRACE_4("reload_canLoadMagazine",_vehicle,_turret,_carryMag,_unit); +params ["_vehicle", "_turret", "_carryMag", ["_magSource", objNull]]; +// TRACE_4("reload_canLoadMagazine",_vehicle,_turret,_carryMag,_magSource); + +private _return = [false, "", -2, false]; // Handle disassembled or deleted -if (!alive _vehicle) exitWith { [false, "", -1, false] }; -// Verify unit has carry magazine -if ((!isNull _unit) && {((_vehicle distance _unit) > 5) || {((magazines _unit) findIf {_x == _carryMag}) == -1}}) exitWith { [false, "", -2, false] }; +if (!alive _vehicle) exitWith { _return }; +// Verify holder has carry magazine +if ( + (!isNull _magSource) && + {!((_magSource isKindOf "Bag_Base") || {_magSource isKindOf "ContainerSupply"})} && // hacky workaround for magazines within dropped backpacks + { + ((_vehicle distance _magSource) > 10) || + {((magazineCargo _magSource) findIf {_x == _carryMag}) == -1} + } +) exitWith { _return }; + +// solve config lookups +private _cfgMagazines = configFile >> "CfgMagazines"; +private _cfgMagazinesCarryMag = _cfgMagazines >> _carryMag; private _desiredAmmo = getNumber (configOf _vehicle >> QUOTE(ADDON) >> "desiredAmmo"); if (_desiredAmmo == 0) then { _desiredAmmo = 100; }; -private _ammoNeeded = _desiredAmmo min getNumber (configFile >> "CfgMagazines" >> _carryMag >> "count"); // assume it needs full carry mag +private _ammoNeeded = _desiredAmmo min getNumber (_cfgMagazinesCarryMag >> "count"); // assume it needs full carry mag private _loadedMag = ""; private _isBeltLinking = false; @@ -40,13 +53,13 @@ scopeName "main"; _loadedMag = _xMag; if (_xAmmo > 0) then { // There is a magazine with ammo loaded in the turret (are there any multi-muzzle static weapons??), see if we can add to this mag - if (getNumber (configFile >> QGVAR(groups) >> _carryMag >> _xMag) != 1) exitWith { + if (getNumber (_cfgMagazinesCarryMag >> _xMag) != 1) exitWith { [false, _loadedMag, -4, false] breakOut "main"; // Carry mag cannot be added to existing vehicle mag (e.g. red to green tracers) }; - if (getNumber (configFile >> "CfgMagazines" >> _carryMag >> "ACE_isBelt") == 0) exitWith { + if (getNumber (_cfgMagazinesCarryMag >> "ACE_isBelt") == 0) exitWith { [false, _loadedMag, -5, false] breakOut "main"; // Non-linkable mag loaded, can't add any more }; - private _maxMagazineAmmo = _desiredAmmo min getNumber (configFile >> "CfgMagazines" >> _xMag >> "count"); + private _maxMagazineAmmo = _desiredAmmo min getNumber (_cfgMagazines >> _xMag >> "count"); if (_xAmmo >= _maxMagazineAmmo) exitWith { [false, _loadedMag, -6, false] breakOut "main"; // Already at capicity }; diff --git a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf index 8e6f3ce500..1419e7b16e 100644 --- a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf +++ b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf @@ -9,7 +9,7 @@ * * Return Value: * Mags - * [Carry Magazine , Turret Path , Ammo Needed ] + * [Carry Magazine , Turret Path , Load Info , Magazine Source ] * * Example: * [cursorObject, player] call ace_csw_fnc_reload_getLoadableMagazines @@ -19,15 +19,37 @@ params ["_vehicle", "_player"]; -private _carriedMagazines = []; +private _magGroupsConfig = configFile >> QGVAR(groups); // so we don't solve in loop every time +private _availableMagazines = createHashMap; // slower than array, still needed for setting source of magazine + +// filter enemy & player units while allowing pulling from friendly AI, crates, etc +private _nearSupplies = ((_vehicle nearSupplies 10) select { + isNull (group _x) || + {!([_x] call EFUNC(common,isPlayer)) && {[side group _player, side group _x] call BIS_fnc_sideIsFriendly}} +}); + +// backpacks/uniforms/etc need to be added manually. +// array can't be modified while iterating, use copy +{ + { + _x params ["_classname", "_container"]; + _nearSupplies pushBack _container; + } forEach (everyContainer _x); +} forEach ((+_nearSupplies) select {(everyContainer _x) isNotEqualTo []}); + +// add caller to list of sources +_nearSupplies = [_player] + _nearSupplies; { - if (isClass (configFile >> QGVAR(groups) >> _x)) then { - _carriedMagazines pushBackUnique _x; - }; -} forEach (magazines _player); + private _xSource = _x; + private _mags = magazineCargo _xSource; -if (_carriedMagazines isEqualTo []) exitWith { [] }; // fast exit if no carry mags + { + _availableMagazines set [_x, _xSource]; + } forEach (_mags select {isClass (_magGroupsConfig >> _x)}); +} forEach _nearSupplies; + +if (_availableMagazines isEqualTo createHashMap) exitWith { [] }; // fast exit if no available mags private _loadInfo = []; private _return = []; @@ -37,14 +59,19 @@ private _return = []; { private _weapon = _x; { + //IGNORE_PRIVATE_WARNING ["_x", "_y"]; private _carryMag = _x; - private _carryGroup = configFile >> QGVAR(groups) >> _carryMag; + private _magSource = _y; + private _carryGroup = _magGroupsConfig >> _carryMag; { - if (((getNumber (_carryGroup >> _x)) == 1) && {_loadInfo = [_vehicle, _turretPath, _carryMag, _player] call FUNC(reload_canLoadMagazine); _loadInfo select 0}) exitWith { - _return pushBack [_carryMag, _turretPath, _loadInfo]; + if ( + ((getNumber (_carryGroup >> _x)) == 1) && + {_loadInfo = [_vehicle, _turretPath, _carryMag, _magSource] call FUNC(reload_canLoadMagazine); _loadInfo select 0} + ) exitWith { + _return pushBack [_carryMag, _turretPath, _loadInfo, _magSource]; }; } forEach ([_weapon] call CBA_fnc_compatibleMagazines); - } forEach _carriedMagazines; + } forEach _availableMagazines; } forEach (_vehicle weaponsTurret _turretPath); } forEach (allTurrets _vehicle); // Note: these nested forEach's looks terrible, but most only have one element diff --git a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf index 2b28535f0a..f8053df3b9 100644 --- a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf +++ b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf @@ -4,8 +4,9 @@ * Finds the best vehicle magazines to create from a carryable magazine for a given weapon. * * Arguments: - * 0: Weapon - * 1: Magazine that is carryable + * 0: Vehicle + * 1: Turret + * 2: Magazine that is carryable * * Return Value: * Vehicle Magazine diff --git a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf index 841192864a..8cdd9d29fe 100644 --- a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf +++ b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf @@ -1,15 +1,16 @@ #include "script_component.hpp" /* - * Author: TCVM, PabstMirror + * Author:Dani (TCVM), PabstMirror * Handles adding ammo to a turret * Called from a global event but only runs where turret is local * * Arguments: * 0: Static Weapon * 1: Turret Path - * 2: Unit doing action + * 2: Source of magazine * 3: Vehicle Magazine * 4: Ammo in magazine + * 5: Unit or object to return ammo to * * Return Value: * None @@ -20,8 +21,8 @@ * Public: No */ -params ["_vehicle", "_turret", "_unit", "_carryMag" ,"_ammoRecieved"]; -TRACE_5("reload_handleAddTurretMag",_vehicle,_turret,_unit,_carryMag,_ammoRecieved); +params ["_vehicle", "_turret", "_magSource", "_carryMag", "_ammoReceived", ["_returnTo", _magSource]]; +TRACE_6("reload_handleAddTurretMag",_vehicle,_turret,_magSource,_carryMag,_ammoReceived,_returnTo); TRACE_2("",local _vehicle, _vehicle turretLocal _turret); if (!(_vehicle turretLocal _turret)) exitWith {}; @@ -29,9 +30,9 @@ if (!(_vehicle turretLocal _turret)) exitWith {}; ([_vehicle, _turret, _carryMag] call FUNC(reload_canLoadMagazine)) params ["_canAdd", "_loadedMag", "_neededAmmo", "_isBeltLinking"]; TRACE_4("canLoad",_canAdd,_loadedMag,_neededAmmo,_isBeltLinking); -private _ammoRemaining = _ammoRecieved; +private _ammoRemaining = _ammoReceived; if (_canAdd) then { - private _ammoUsed = _neededAmmo min _ammoRecieved; + private _ammoUsed = _neededAmmo min _ammoReceived; _ammoRemaining = _ammoRemaining - _ammoUsed; if (_isBeltLinking) then { @@ -46,7 +47,6 @@ if (_canAdd) then { _vehicle setAmmo [_weapon, _currentAmmo]; private _currentAmmo = _vehicle magazineTurretAmmo [_loadedMag, _turret]; if ((_weapon == "") || {_currentAmmo != _currentAmmo}) then { ERROR_1("failed to setAmmo - %1", _this); }; - } else { if (_loadedMag != "") then { TRACE_1("Removing emtpy mag",_loadedMag); @@ -60,7 +60,6 @@ if (_canAdd) then { }; if (_ammoRemaining > 0) then { - TRACE_3("Returning ammo",_unit,_carryMag,_ammoRemaining); - [QGVAR(returnAmmo), [_unit, _carryMag, _ammoRemaining], _unit] call CBA_fnc_targetEvent; + TRACE_3("Returning ammo",_returnTo,_carryMag,_ammoRemaining); + [QGVAR(returnAmmo), [_returnTo, _carryMag, _ammoRemaining], _returnTo] call CBA_fnc_targetEvent; }; - diff --git a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf index 313e65dc9b..c78c141449 100644 --- a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf +++ b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM + * Author:Dani (TCVM) * Handles removing ammo from a turret * Called from a global event but only runs where turret is local * @@ -9,7 +9,7 @@ * 1: Turret Path * 2: Magainze Unit Can Carry * 3: Magazine To Remove From Static - * 4: Unit to unload to + * 4: Unit or container to unload to * * Return Value: * None @@ -20,10 +20,10 @@ * Public: No */ -params ["_vehicle", "_turretPath", "_carryMag", "_vehMag", "_unit"]; -TRACE_5("removeTurretMag EH",_vehicle,_turretPath,_carryMag,_vehMag,_unit); +params ["_vehicle", "_turretPath", "_carryMag", "_vehMag", "_unloadTo"]; +TRACE_5("removeTurretMag EH",_vehicle,_turretPath,_carryMag,_vehMag,_unloadTo); -TRACE_3("",local _vehicle, _vehicle turretLocal _turretPath,local _unit); +TRACE_3("",local _vehicle, _vehicle turretLocal _turretPath,local _unloadTo); if (!(_vehicle turretLocal _turretPath)) exitWith {}; private _magsInWeapon = []; // Check how much ammo it has now: @@ -75,5 +75,5 @@ if ((_magsInWeapon isEqualTo []) && {_ammoInFirstMag > _ammoRemoved}) then { } forEach _magsInWeapon; }; -TRACE_3("Returning ammo",_unit,_carryMag,_ammoRemoved); -[QGVAR(returnAmmo), [_unit, _carryMag, _ammoRemoved], _unit] call CBA_fnc_targetEvent; +TRACE_3("Returning ammo",_unloadTo,_carryMag,_ammoRemoved); +[QGVAR(returnAmmo), [_unloadTo, _carryMag, _ammoRemoved], _unloadTo] call CBA_fnc_targetEvent; diff --git a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf index 464a7fc65d..52a1490320 100644 --- a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf +++ b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: TCVM and PabstMirror + * Author: Dani (TCVM) and PabstMirror * Handles returned ammo (either from unloading or leftovers from linking) * * Arguments: @@ -39,18 +39,17 @@ if ((_fullMagazines == 0) && {_bulletsRemaining == 0}) exitWith {}; // Try to use existing container private _container = _unloadTo getVariable [QGVAR(container), objNull]; -if ((_container distance _unloadTo) > 4) then { _container = objNull; }; +if ((_container distance _unloadTo) > 10) then { _container = objNull; }; if (isNull _container) then { - _container = (nearestObjects [_unloadTo, ["groundWeaponHolder"], 4]) param [0, objNull]; + _container = (nearestObjects [_unloadTo, [QGVAR(ammo_holder), "GroundWeaponHolder"], 10]) param [0, objNull]; }; if (isNull _container) then { - // Create ground weapon holder container + // Create ammo storage container private _weaponRelPos = _unloadTo getRelPos RELATIVE_DIRECTION(270); _weaponRelPos set [2, ((getPosATL _unloadTo) select 2) + 0.05]; - _container = createVehicle ["groundWeaponHolder", [0, 0, 0], [], 0, "NONE"]; - // ToDo: Unload to ammo box?? + _container = createVehicle [["GroundWeaponHolder", QGVAR(ammo_holder)] select GVAR(handleExtraMagazinesType), [0, 0, 0], [], 0, "NONE"]; _unloadTo setVariable [QGVAR(container), _container, true]; _container setDir random [0, 180, 360]; _container setPosATL _weaponRelPos; diff --git a/addons/csw/functions/fnc_reload_loadMagazine.sqf b/addons/csw/functions/fnc_reload_loadMagazine.sqf index 2b34d38a24..5cceb55113 100644 --- a/addons/csw/functions/fnc_reload_loadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_loadMagazine.sqf @@ -1,25 +1,26 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Loads a magazine into a static weapon from a magazine carried by the player. + * Loads a magazine into a static weapon from a magazine carried by or next to the player. * * Arguments: * 0: Vehicle * 1: Turret * 2: Unit Carried Magazine - * 3: Player + * 3: Magazine source + * 4: Unit doing the action * * Return Value: * None * * Example: - * [cursorTarget, [0], "ACE_csw_100Rnd_127x99_mag_red", player] call ace_csw_fnc_reload_loadMagazine + * [cursorTarget, [0], "ACE_csw_100Rnd_127x99_mag_red", player, player] call ace_csw_fnc_reload_loadMagazine * * Public: No */ -params ["_vehicle", "_turret", "_carryMag", "_unit"]; -TRACE_4("loadMagazine",_vehicle,_turret,_carryMag,_unit); +params ["_vehicle", "_turret", "_carryMag", "_magSource", "_unit"]; +TRACE_5("loadMagazine",_vehicle,_turret,_carryMag,_magSource,_unit); private _timeToLoad = 1; if (!isNull(configOf _vehicle >> QUOTE(ADDON) >> "ammoLoadTime")) then { @@ -29,10 +30,10 @@ if (!isNull(configOf _vehicle >> QUOTE(ADDON) >> "ammoLoadTime")) then { private _displayName = format [localize LSTRING(loadX), getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName")]; private _onFinish = { - (_this select 0) params ["_vehicle", "_turret", "_carryMag", "_unit"]; - TRACE_4("load progressBar finish",_vehicle,_turret,_carryMag,_unit); + (_this select 0) params ["_vehicle", "_turret", "_carryMag", "_magSource", "_unit"]; + TRACE_5("load progressBar finish",_vehicle,_turret,_carryMag,_magSource,_unit); - ([_vehicle, _turret, _carryMag, _unit] call FUNC(reload_canLoadMagazine)) params ["", "", "_neededAmmo", ""]; + ([_vehicle, _turret, _carryMag, _magSource] call FUNC(reload_canLoadMagazine)) params ["", "", "_neededAmmo", ""]; if (_neededAmmo <= 0) exitWith { ERROR_1("Can't load ammo - %1",_this); }; // Figure out what we can add from the magazines we have @@ -44,23 +45,23 @@ private _onFinish = { _bestAmmoToSend = _xAmmo; }; }; - } forEach (magazinesAmmo _unit); + } forEach (if (_magSource isKindOf "CAManBase") then {magazinesAmmo _magSource} else {magazinesAmmoCargo _magSource}); if (_bestAmmoToSend == -1) exitWith {ERROR_2("No ammo [%1 - %2]?",_xMag,_bestAmmoToSend);}; - [_unit, _carryMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); + [_magSource, _carryMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine); if (_bestAmmoToSend == 0) exitWith {}; - TRACE_5("calling addTurretMag event",_vehicle,_turret,_unit,_carryMag,_bestAmmoToSend); - [QGVAR(addTurretMag), [_vehicle, _turret, _unit, _carryMag, _bestAmmoToSend]] call CBA_fnc_globalEvent; + TRACE_6("calling addTurretMag event",_vehicle,_turret,_magSource,_carryMag,_bestAmmoToSend, _unit); + [QGVAR(addTurretMag), [_vehicle, _turret, _magSource, _carryMag, _bestAmmoToSend, _unit]] call CBA_fnc_globalEvent; }; [ -TIME_PROGRESSBAR(_timeToLoad), -[_vehicle, _turret, _carryMag, _unit], -_onFinish, -{TRACE_1("load progressBar fail",_this);}, -_displayName, -{((_this select 0) call FUNC(reload_canLoadMagazine)) select 0}, -["isNotInside"] + TIME_PROGRESSBAR(_timeToLoad), + [_vehicle, _turret, _carryMag, _magSource], + _onFinish, + {TRACE_1("load progressBar fail",_this);}, + _displayName, + {((_this select 0) call FUNC(reload_canLoadMagazine)) select 0}, + ["isNotInside"] ] call EFUNC(common,progressBar); diff --git a/addons/csw/functions/fnc_staticWeaponInit.sqf b/addons/csw/functions/fnc_staticWeaponInit.sqf index 4ce86f3c49..6ddaa9d36a 100644 --- a/addons/csw/functions/fnc_staticWeaponInit.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Initializes weapon to disable weapon disassembling * * Arguments: @@ -17,13 +17,15 @@ params ["_staticWeapon"]; private _typeOf = typeOf _staticWeapon; -private _configEnabled = (getNumber (configFile >> "CfgVehicles" >> _typeOf >> "ace_csw" >> "enabled")) == 1; -private _assemblyConfig = _configEnabled && {(getText (configFile >> "CfgVehicles" >> _typeOf >> "ace_csw" >> "disassembleWeapon")) != ""}; +private _configOf = configOf _staticWeapon; +private _configEnabled = (getNumber (_configOf >> "ace_csw" >> "enabled")) == 1; +private _assemblyConfig = _configEnabled && {(getText (_configOf >> "ace_csw" >> "disassembleWeapon")) != ""}; TRACE_4("staticWeaponInit",_staticWeapon,_typeOf,_configEnabled,_assemblyConfig); if (_configEnabled && {GVAR(ammoHandling) == 2}) then { TRACE_1("adding AI fired handler",_staticWeapon); _staticWeapon addEventHandler ["Fired", LINKFUNC(ai_handleFired)]; + _staticWeapon addEventHandler ["GetIn", LINKFUNC(ai_handleGetIn)]; // handle AI getting inside weapon with no ammo }; TRACE_2("",local _staticWeapon,_staticWeapon turretLocal [0]); @@ -65,7 +67,7 @@ if (hasInterface && {!(_typeOf in GVAR(initializedStaticTypes))}) then { private _ammoActionPath = []; - private _magazineLocation = getText (configFile >> "CfgVehicles" >> _typeOf >> QUOTE(ADDON) >> "magazineLocation"); + private _magazineLocation = getText (_configOf >> QUOTE(ADDON) >> "magazineLocation"); private _condition = { //IGNORE_PRIVATE_WARNING ["_target", "_player"]; // If magazine handling is enabled or weapon assembly/disassembly is enabled we enable ammo handling if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_target getVariable [QGVAR(assemblyMode), 3]))}) exitWith { false }; diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf index e1cba376f4..41845c0eb3 100644 --- a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM), PabstMirror + * Author: Dani (TCVM), PabstMirror * Dumps ammo to container * * Arguments: @@ -36,13 +36,7 @@ private _containerMagazineCount = []; { _x params ["_xMag", "_xTurret", "_xAmmo"]; - private _carryMag = GVAR(vehicleMagCache) getVariable _xMag; - if (isNil "_carryMag") then { - private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); - _carryMag = configName (_groups param [0, configNull]); - GVAR(vehicleMagCache) setVariable [_xMag, _carryMag]; - TRACE_2("setting cache",_xMag,_carryMag); - }; + private _carryMag = _xMag call FUNC(getCarryMagazine); if (_carryMag != "") then { if ((_desiredAmmo > 0) && {_loadedMagazineInfo isEqualTo []}) then { private _loadedMagAmmo = _desiredAmmo min _xAmmo; @@ -74,6 +68,15 @@ TRACE_1("Remove all loaded magazines",_magsToRemove); }; } forEach _magsToRemove; +if (_staticWeapon getVariable [QGVAR(secondaryWeaponMagazine), ""] isNotEqualTo "") then { + private _secondaryWeaponMagazine = _staticWeapon getVariable QGVAR(secondaryWeaponMagazine); + private _turret = allTurrets _staticWeapon param [0, []]; + private _vehicleMag = [_staticWeapon, _turret, _secondaryWeaponMagazine] call FUNC(reload_getVehicleMagazine); + TRACE_3("Re-add previous mag",_secondaryWeaponMagazine,_turret,_vehicleMag); + if (!isClass (configFile >> "CfgMagazines" >> _vehicleMag)) exitWith {}; + _staticWeapon addMagazineTurret [_vehicleMag, _turret, 1]; + _staticWeapon setVariable [QGVAR(secondaryWeaponMagazine), nil]; +}; if (_storeExtraMagazines) then { TRACE_1("saving extra mags to container",_containerMagazineCount); diff --git a/addons/csw/initSettings.sqf b/addons/csw/initSettings.sqf index d4ea6dc13a..de3976896b 100644 --- a/addons/csw/initSettings.sqf +++ b/addons/csw/initSettings.sqf @@ -20,6 +20,16 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; true // Needs mission restart ] call CBA_fnc_addSetting; +[ + QGVAR(handleExtraMagazinesType), "LIST", + [LSTRING(handleExtraMagazinesType_displayName), LSTRING(handleExtraMagazinesType_description)], + _categoryArray, + [[0, 1], [LSTRING(handleExtraMagazinesType_weaponHolder), LSTRING(handleExtraMagazinesType_ammoBox)], 0], + true, // isGlobal + {[QGVAR(handleExtraMagazinesType), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_fnc_addSetting; + [ QGVAR(ammoHandling), "LIST", [LSTRING(ammoHandling_displayName), LSTRING(ammoHandling_description)], diff --git a/addons/csw/stringtable.xml b/addons/csw/stringtable.xml index d3593a29f4..27cdb43b9f 100644 --- a/addons/csw/stringtable.xml +++ b/addons/csw/stringtable.xml @@ -8,11 +8,13 @@ Armes statiques 共用火器 (CSW) 班組支援武器 + 班组支援武器 Armi servite dall'equipaggio Posádkou obsluhované zbraně (CSW) Broń ciężka (CSW) Armas provistas por la tripulación Групповое вооружение (CSW) + 공용화기(CSW) Place Tripod @@ -21,12 +23,14 @@ Placer le trépied 三脚を設置 設置三腳架 + 安放三脚架 Piazza treppiede Položit trojnožku Rozłóż Trójnóg Colocar trípode Üçayağı Yerleştir Разложить треногу + 삼각대 설치하기 Disassemble @@ -40,7 +44,9 @@ Desmonta 解体 拆解 + 拆解 Sök + 분해하기 Get In @@ -54,7 +60,9 @@ Entrar 乗る 進入 + 进入 Bin + 탑승하기 Load %1 @@ -69,7 +77,9 @@ Carregar %1 %1 を装填 裝填 %1 + 装填 %1 Yükle %1 + %1 싣는중 Unload %1 @@ -84,7 +94,9 @@ Descarregar %1 %1 を除去 卸載 %1 + 卸载 %1 Boşalt %1 + %1 내리는중 Link %1 @@ -93,50 +105,58 @@ Connecter %1 %1 を接続 聯結至 %1 + 连接 %1 Collega %1 Spojit %1 Połącz %1 Conectar %1 Соединить %1 + %1 연결 - Advanced assembly + Advanced Assembly Erweiterter Zusammenbau Montagem Avançada Assemblage avancé アドバンスド設置 進階組裝 + 高级组装 Montaggio avanzato Pokročilé skládání Zaawansowane składanie Ensamblado avanzado Продвинутая сборка + 고급 조립 - Use ace for Assemble/Disassemble of supported static weapons. Loaded ammo is reduced to a single magazine. + Use ACE for Assemble/Disassemble of supported static weapons. Loaded ammo is reduced to a single magazine. Benutze ACE um unterstützte statische Waffen zu montieren/demontieren. Geladene Munition ist auf ein einzelnes Magazin reduziert. Usar o ACE para Montar/Desmontar armas estáticas suportadas. Munição carregada é reduzida para um único carregador. Utilise ACE pour l'assemblage/le désassemblage des armes statiques supportées.\nLes munitions chargées sont réduites à un seul chargeur. 対応している設置型火器に ACE3 の設置と解体を使用します。装填済みの弾倉は 1 つの弾倉に減少します。 使用ACE來組裝/拆解固定型武器。上膛的限制為單個彈匣。 + 使用 ACE 来组装/拆解固定式武器。限制弹药为一个弹匣。 Utilizzare ace per l'Assemblaggio/smontaggio di armi statiche supportate. Le munizioni cariche sono ridotte ad un solo caricatore. Použít ACE pro složení/rozložení podporovaných statických zbraní. Nabitá munice je snížená na jeden zásobník. Użyj ACE do składania/rozkładania broni statycznych. Załadowana amunicja zostaje zredukowana do jednego magazynku. Usar el ACE para el ensamblado/desamblado de armas estáticas soportadas. La munición cargada es reducida a un sólo cargador Использовать ACE для сборки/разборки поддерживаемого статического оружия. Заряженные боеприпасы будут сокращены в единственный магазин. + ACE의 조립/분해 기능을 사용하여 공용화기를 다룹니다. 장전된 탄은 한 탄창으로 제한됩니다. - Save extra ammo + Save Extra Ammo Spare extra Munition Economizar munição extra Conserver le surplus de munitions 過剰弾薬を保持 保存額外彈藥 + 保存额外弹药 Risparmiare munizioni extra Uložit munici navíc. Zapisz dodatkową amunicje Guardar munición extra Сохранить дополнительные боеприпасы + 남은 탄약 저장 Store extra magazines next to static weapon @@ -145,11 +165,45 @@ Range les chargeurs en surplus auprès de l'arme statique. 次の設置型火器用に過剰弾薬を保持します。 在固定型武器旁存放額外彈匣 + 在固定式武器旁边存放额外的弹匣 Conservare i caricatori extra accanto all'arma statica Ukládat munici navíc vedle statické zbraně. Dodatkowe magazynki przechowuj obok broni statycznej Almacenar cargadores extra junto al arma estática Хранить дополнительные магазины рядом со статическим оружием + 공용화기 옆에 남은 탄들을 저장합니다. + + + Ammo Storage + Munitionslager + 탄약 보관 + Magazyn amunicji + 弾薬の格納 + 弹药存储 + + + Determines whether extra magazines are stored on the ground or inside an ammo box + Legt fest, ob zusätzliche Magazine auf dem Boden oder in einer Munitionskiste aufbewahrt werden + 여분의 탄약을 지면 또는 탄약 상자에 넣을지 결정합니다. + Decyduje, czy dodatkowe magazynki przechowywane są na ziemi, czy w skrzynce z amunicją. + 追加のマガジンを地面に設置するか、弾薬箱の中に保管するかを決定します + 设置多余的弹夹是存放在地面上还是弹药箱内 + + + Ground + Boden + 지면 + Ziemia + 地面 + 地面 + + + Ammo Box + Munitionskiste + 탄약 상자 + Skrzynka amunicyjna + 弾薬箱 + 弹药箱 Ammo handling @@ -158,11 +212,13 @@ Manipulation des munitions 弾薬の処理 彈藥處理 + 弹药处置 Gestione delle munizioni Manipulace s municí Obsługa amunicji Manejo de munición Обслуживание боеприпасов + 탄약 취급 Allow loading and unloading magazines @@ -171,11 +227,13 @@ Définit qui peut charger et décharger les chargeurs. 弾薬の装填と除去を許可します。 允許裝填或卸載彈匣 + 允许装卸弹匣 Permettere il carico e lo scarico dei caricatori Povolit nabíjení a vybíjení zásobníků. Zezwalaj na ładowanie i rozładowywanie magazynków Permitir la carga y descarga de cargadores Разрешить загрузку и разгрузку магазинов + 탄을 장전하고 빼는걸 가능하게 합니다. Interaction Time Coefficent @@ -184,11 +242,13 @@ Coefficient du temps d'interaction インタラクション時間係数 互動時間係數 + 交互时间系数 Coefficente per il tempo di interazione Koeficient času interakce Współczynnik czasu interakcji Coeficiente de tiempo de interacción Коэффициент времени взаимодействия + 상호작용 시간 계수 Scales time required to assemble and reload static weapons @@ -197,24 +257,28 @@ Définit l'échelle de temps nécessaire à l'assemblage et au rechargement des armes statiques. 設置型火器の設置と再装填時間を管理できます。 設置組裝及裝填組裝固定型武器 + 衡量组装和重新装填固定式武器所需的时间 Tempo necessario per assemblare e ricaricare le armi statiche Škáluje čas potřebný ke skládání a přebíjení statických zbraní. Definiuje czas potrzebny do złożenia i przeładowania broni statycznej Escala el tiempo requerida para ensamblar y recargar el arma estática Изменяет время, необходимое для сборки и перезарядки статического оружия + 공용화기의 조립 및 재장전 속도를에 관여하는 계수입니다. - Drag tripods after deploying + Drag Tripods after Deploying Ziehe Dreibeine nach Aufbau Arrastar tripés após montar Glisser le trépied après déploiement 設置後に三脚を引きずる 在佈置三腳架後拖拉 + 部署后拖动三脚架 Trascinare i treppiedi dopo lo schieramento Tahat trojnožku po položení Przeciągnij statyw po rozmieszczeniu Arrastrar trípodes despues de desplegarlos Тащить треногу после развертывания + 조립 후 삼각대 끌기 After deploying a tripod, start dragging it to a precise location @@ -223,11 +287,13 @@ Aussitôt après avoir déployé un trépied, le joueur commence automatiquement à le glisser pour le positionner plus précisément. 三脚を設置後、動かせるよう三脚を引きずるようにします。 在部署三腳架後,開始拖動它使其在你所要的精準位置 + 部署好三脚架后,开始拖动它到一个精确的位置 Dopo aver posizionato un treppiede, iniziate a trascinarlo in una posizione precisa Po položení trojnožky začít automaticky tahání pro lepší polohu. Po rozłożeniu trójnogu zacznij od przeciągania go w określone miejsce Después de desplegar un trípode, comenzar a arrastrarlo hacia la ubicación precisa После развертывания начать тащить треногу на другое место + 조립 후 위치선정을 위해 배치하지 않고 끌고다닙니다. Pickup Tripod @@ -236,11 +302,13 @@ Récupérer le trépied 三脚を拾う 撿起三腳架 + 捡起三脚架 Recupero treppiede Složit trojnožku Podnieś Trójnóg Recoger trípode Подобрать треногу + 삼각대 줍기 Mount Weapon @@ -249,11 +317,13 @@ Monter l'arme 火器を乗せる 裝載武器 + 装载武器 Montare l'arma Připevnit zbraň Zamontuj Broń Montar arma Установить оружие + 무기 거치하기 Disassembling Gun... @@ -262,11 +332,13 @@ Désassemblage de l'arme... 火器を解体中です・・・ 拆裝武器中... + 正在拆卸武器... Smontaggio arma... Rozkládám zbraň... Rozkładanie Broni... Desensamblando arma... Разборка оружия... + 공용화기 분해 중... Assembling Gun... @@ -275,11 +347,13 @@ Assemblage de l'arme... 火器を設置中です・・・ 組裝武器中... + 正在组装武器... Montaggio arma... Skládám zbraň... Składanie Broni... Ensamblando arma... Сборка оружия... + 공용화기 조립 중... Picking Up Tripod... @@ -288,11 +362,13 @@ Récupération du trépied... 三脚を取得中です・・・ 撿起三腳架... + 捡起三脚架... Recupero treppiede... Zvedám trojnožku... Podnoszenie Trójnogu... Recogiendo trípode... Поднятие треноги... + 삼각대 줍는 중... Placing Tripod... @@ -301,11 +377,13 @@ Installation du trépied... 三脚を設置中です・・・ 部署三腳架... + 部署三脚架... Piazzare treppiede... Pokládám trojnožku... Rozmieszczanie Trójnogu... Ubicando trípode... Размещение треноги... + 삼각대 설치 중... Enable CSW @@ -314,11 +392,13 @@ Activer CSW CSW 有効化 啟用CSW(班用支援武器) + 启用班组支援武器 Attiva CSW Povolit posádkou obsluhované zbraně (CSW) Włącz CSW Habilitar CSW Включить CSW + 공용화기 활성화 Enables Crew Served ability on this weapon @@ -327,11 +407,13 @@ Active les fonctions CSW sur cette arme. この火器で共用火器を有効化します。 對此武器啟用班組支援能力 + 在该武器上启用班组支援能力 Abilita l'abilità dell'equipaggio su quest'arma Zapne CSW funkce na této zbrani Włącza opcje systemu CSW na tej broni Habilitar el manejo de uso colectivo para esta arma Включает CSW на этом оружии + 이 무기에 공용화기 특성을 적용합니다. Enabled and Leave Weapon Empty @@ -340,11 +422,13 @@ Activer et laisser l'arme vide 火器有効化し空を維持 啟用並不裝填武器 + 启用并不装填武器 Abilitato e lascia l'arma vuota Povolit a nechat zbraň prázdnou Włącz i pozostaw broń pustą Habilitar y dejar el arma vacía Включено и оставить оружие пустым + 활성화 및 자리 비우기 Tripod @@ -357,8 +441,10 @@ Tripé 三脚 三腳架 + 三脚架 Trojnožka Тренога + 삼각대 [CSW] Static Mini-Spike Launcher (AT) @@ -368,11 +454,13 @@ [CSW] Lanceur statique Mini-Spike (AT) [CSW] 設置型ミニ スパイク ランチャー (AT) [CSW] 固定型 "迷你長釘"導彈發射器(對地) + [班组] 固定式"迷你长钉"导弹发射器(反坦) [CSW] Static Mini-Spike Launcher (AT) [CSW] Statický raketomet Mini-Spike (protitankový) [CSW] Static Mini-Spike Launcher (AT) [CSW] Mini-Spike Przeciwpancerny pocisk rakietowy [CSW] Станковый Mini-Spike ПТРК + [CSW] 거치형 Mini-Spike 발사기 (대전차) [CSW] Static Mini-Spike Launcher (AA) @@ -382,11 +470,13 @@ [CSW] Lanceur statique Mini-Spike (AA) [CSW] 設置型ミニ スパイク ランチャー (AA) [CSW] 固定型 "迷你長釘"導彈發射器(對空) + [班组] 固定式"迷你长钉"导弹发射器(防空) [CSW] Static Mini-Spike Launcher (AA) [CSW] Statický raketomet Mini-Spike (protiletadlový) [CSW] Static Mini-Spike Launcher (AA) [CSW] Mini-Spike Przeciwlotniczy pocisk rakietowy [CSW] Станковый Mini-Spike ЗРК + [CSW] 거치형 Mini-Spike 발사기 (대공) [CSW] Static XM312 Gun @@ -396,11 +486,13 @@ [CSW] Mitrailleuse statique XM312 [CSW] 設置型 XM312 [CSW] 固定型 XM312重機槍 + [班组] 固定式 XM312 重机枪 [CSW] Static XM312 Gun [CSW] Statická zbraň XM312 [CSW] Static XM312 Gun [CSW] Statyczny karabin maszynowy XM312 [CSW] Станковый XM312 пулемёт + [CSW] 거치형 XM312 [CSW] Static M2 w/ Shield @@ -411,6 +503,8 @@ [CSW] Станковый M2 со щитом [CSW] 設置型 防盾付き M2 [CSW] Statisches M2 mit Schild + [班组] 固定式防盾型 M2 重机枪 + [CSW] 거치형 M2 (방패) [CSW] Static XM312 Gun (Autonomous) @@ -420,11 +514,13 @@ [CSW] Mitrailleuse statique XM312 (Autonome) [CSW] 設置型 XM312 (自律型) [CSW] 固定型 XM312重機槍(自主型) + [班组] 固定式 XM312 重机枪(自主) [CSW] Static XM312 Gun (Autonomo) [CSW] Statická zbraň XM312 (autonomická) [CSW] Static XM312 Gun (Autonomous) [CSW] Statyczny karabin maszynowy XM312 (Dron) [CSW] Станковый XM312 пулемёт (автономный) + [CSW] 거치형 XM312 (자동화) [CSW] Static XM307 Gun @@ -434,11 +530,13 @@ [CSW] Lance-grenades statique XM307 [CSW] 設置型 XM307 [CSW] 固定型XM307榴彈機槍 + [班组] 固定式 XM307 榴弹发射器 [CSW] Static XM307 Gun [CSW] Statická zbraň XM307 [CSW] Static XM307 Gun [CSW] Statyczny granatnik automatyczny XM307 [CSW] Станковый XM307 гранатомёт + [CSW] 거치형 XM307 [CSW] Static XM307 Gun (Autonomous) @@ -448,11 +546,13 @@ [CSW] Lance-grenades statique XM307 (Autonome) [CSW] 設置型 XM307 (自律型) [CSW] 固定型 XM307榴彈機槍(自主型) + [班组] 固定式 XM307 榴弹发射器(自主) [CSW] Static XM307 Gun (Autonomo) [CSW] Statická zbraň XM307 (autonomická) [CSW] Static XM307 Gun (Autonomous) [CSW] Statyczny granatnik automatyczny XM307 (Dron) [CSW] Станковый XM307 гранатомёт (автономный) + [CSW] 거치형 XM307 (자동화) [CSW] 12.7x108mm HMG Belt @@ -462,11 +562,13 @@ [CSW] Bande 12,7x108 mm HMG [CSW] 12.7x108 mm HMG ベルト [CSW]12.7x108毫米 重機槍彈鏈 + [班组] 12.7x108 mm 重机枪弹链 [CSW] 12.7x108mm HMG Belt [CSW] Pás 12.7×108mm pro těžký kulomet [CSW] 12.7x108mm HMG Belt [CSW] Taśma 12.7x108mm CKM [CSW] 12.7x108 мм пулемётная лента + [CSW] 12.7x108mm 중기관총 탄띠 [CSW] 12.7x99mm HMG Belt @@ -476,11 +578,13 @@ [CSW] Bande 12,7x99 mm HMG [CSW] 12.7x99 mm HMG ベルト [CSW]12.7x99毫米 重機槍彈鏈 + [班组] 12.7x99 mm 重机枪弹链 [CSW] 12.7x99mm HMG Belt [CSW] Pás 12.7×99mm pro těžký kulomet [CSW] 12.7x99mm HMG Belt [CSW] Taśma 12.7x99mm CKM [CSW] 12.7x99 мм пулемётная лента + [CSW] 12.7x99mm 중기관총 탄띠 [CSW] 12.7x99mm Tracer HMG Belt (Red) @@ -490,11 +594,13 @@ [CSW] Bande 12,7x99 mm HMG traçantes (Rouges) [CSW] 12.7x99 mm HMG 曳光弾ベルト (赤) [CSW] 12.7x99毫米 重機槍曳光彈鏈(紅色) + [班组] 12.7x99 mm 重机枪弹链(曳光,红) [CSW] 12.7x99mm Tracer HMG Belt (Red) [CSW] Pás 12.7×99mm pro těžký kulomet (červená stopovka) [CSW] 12.7x99mm Tracer HMG Belt (Red) [CSW] Taśma 12.7x99mm CKM Smugowa (Czerwona) [CSW] 12.7x99 мм трасс. пулемётная лента (Красный) + [CSW] 12.7x99mm 예광탄 중기관총 탄띠 (빨강) [CSW] 12.7x99mm Tracer HMG Belt (Green) @@ -504,11 +610,13 @@ [CSW] Bande 12,7x99 mm HMG traçantes (Vertes) [CSW] 12.7x99 mm HMG 曳光弾ベルト (緑) [CSW] 12.7x99毫米 重機槍曳光彈鏈(綠色) + [班组] 12.7x99 mm 重机枪弹链(曳光,绿) [CSW] 12.7x99mm Tracer HMG Belt (Green) [CSW] Pás 12.7×99mm pro těžký kulomet (zelená stopovka) [CSW] 12.7x99mm Tracer HMG Belt (Green) [CSW] Taśma 12.7x99mm CKM Smugowa (Zielona) [CSW] 12.7x99 мм трасс. пулемётная лента (Зелёный) + [CSW] 12.7x99mm 예광탄 중기관총 탄띠 (초록) [CSW] 12.7x99mm Tracer HMG Belt (Yellow) @@ -518,11 +626,13 @@ [CSW] Bande 12,7x99 mm HMG traçantes (Jaunes) [CSW] 12.7x99 mm HMG 曳光弾ベルト (黄) [CSW] 12.7x99毫米 重機槍曳光彈鏈(黃色) + [班组] 12.7x99 mm 重机枪弹链(曳光,黄) [CSW] 12.7x99mm Tracer HMG Belt (Yellow) [CSW] Pás 12.7×99mm pro těžký kulomet (žlutá stopovka) [CSW] 12.7x99mm Tracer HMG Belt (Yellow) [CSW] Taśma 12.7x99mm CKM Smugowa (Żółta) [CSW] 12.7x99 мм трасс. пулемётная лента (Жёлтый) + [CSW] 12.7x99mm 예광탄 중기관총 탄띠 (노랑) [CSW] 20mm Grenade GMG Belt @@ -532,25 +642,29 @@ [CSW] Bande grenades 20 mm GMG [CSW] 20 mm てき弾 GMG ベルト [CSW]20毫米 榴彈 榴彈機槍彈鏈 + [班组] 20 mm 榴弹发射器弹链 [CSW] 20mm Grenade GMG Belt [CSW] Pás 20mm granátů pro granátomet [CSW] 20mm Grenade GMG Belt [CSW] Taśma 20mm do granatnika [CSW] Лента 20-мм гранат для ст. гранатомёта + [CSW] 20mm 고속유탄발사기 탄띠 M3 Tripod Trípode M3 M3 Dreibein - M3 Tripé + Tripé M3 Trépied M3 M3 三脚 M3 三腳架 + M3 三脚架 M3 Tripod M3 trojnožka M3 Tripod Trójnóg M3 Станок M3 + M3 삼각대 [CSW] 6P57 Deployable Tripod @@ -560,11 +674,13 @@ [CSW] 6P57 Trépied déployable [CSW] 6P57 設置型三脚 [CSW] 6P57 部署型三腳架 + [班组] 6P57 部署型三脚架 [CSW] 6P57 Deployable Tripod [CSW] 6P57 trojnožka [CSW] 6P57 Deployable Tripod [CSW] Trójnóg Rozkładany 6P57 [CSW] 6P67 Развертываемая тренога + [CSW] 6P57 배치형 삼각대 [CSW] 6P57 Deployable Tripod (Low) @@ -574,11 +690,13 @@ [CSW] 6P57 Trépied déployable (Bas) [CSW] 6P57 設置型三脚 (低座) [CSW] 6P57 部署型(低位) + [班组] 6P57 部署型(低) [CSW] 6P57 Deployable Tripod (Low) [CSW] 6P57 trojnožka (nízká) [CSW] 6P57 Deployable Tripod (Low) [CSW] Trójnóg Rozkładany 6P57 (Niski) [CSW] 6P67 Развертываемая тренога (Низкая) + [CSW] 6P57 배치형 삼각대 (낮음) [CSW] M220 Deployable Tripod @@ -588,11 +706,13 @@ [CSW] M220 Trépied déployable [CSW] M220 設置型三脚 [CSW] M220 部署型三腳架 + [班组] M220 部署型三脚架 [CSW] M220 Deployable Tripod [CSW] M220 trojnožka [CSW] M220 Deployable Tripod [CSW] Trójnóg Rozkładany M220 [CSW] M220 Развертываемая тренога + [CSW] M220 배치형 삼각대 [CSW] SAG-30 Deployable Tripod @@ -602,11 +722,13 @@ [CSW] SAG-30 Trépied déployable [CSW] SAG-30 設置型三脚 [CSW] SAG-30 部署型三腳架 + [班组] SAG-30 部署型三脚架 [CSW] SAG-30 Deployable Tripod [CSW] SAG-30 trojnožka [CSW] SAG-30 Deployable Tripod [CSW] Trójnóg Rozkładany SAG-30 [CSW] SAG-30 Развертываемая тренога + [CSW] SAG-30 배치형 삼각대 6P57 Tripod @@ -616,11 +738,13 @@ Trépied 6P57 6P57 三脚 6P57 三腳架 + 6P57 三脚架 6P57 Tripod 6P57 trojnožka 6P57 Tripod Trójnóg 6P57 6P67 Тренога + 6P57 삼각대 SAG-30 Tripod @@ -630,11 +754,13 @@ Trépied SAG-30 SAG-30 三脚 SAG-30 三腳架 + SAG-30 三脚架 SAG-30 Tripod SAG-30 trojnožka SAG-30 Tripod Trójnóg SAG-30 SAG-30 Тренога + SAG-30 삼각대 M220 Tripod @@ -644,25 +770,29 @@ Trépied M220 M220 三脚 M220 三腳架 + M220 三脚架 M220 Tripod M220 trojnožka M220 Tripod Trójnóg M220 M220 Тренога + M220 삼각대 [CSW] M3 Deployable Tripod [CSW] Trípode desplegable M3 [CSW] M3 aufstellbares Dreibein - [CSW] M3 Tripe Ajustável + [CSW] Tripe Ajustável M3 [CSW] M3 Trépied déployable [CSW] M3 設置型三脚 [CSW] M3 部屬型三腳架 + [班组] M3 部属型三脚架 [CSW] M3 Deployable Tripod [CSW] M3 trojnožka [CSW] M3 Deployable Tripod [CSW] Trójnóg Rozkładany M3 [CSW] M3 Развертываемая тренога + [CSW] M3 배치형 삼각대 [CSW] M3 Deployable Tripod (Low) @@ -672,11 +802,13 @@ [CSW] M3 Trépied déployable (Bas) [CSW] M3 設置型三脚 (低座) [CSW] M3 部署型三腳架(低位) + [班组] M3 部署型三脚架(低) [CSW] M3 Deployable Tripod (Low) [CSW] M3 trojnožka (nízká) [CSW] M3 Deployable Tripod (Low) [CSW] Trójnóg Rozkładany M3 (Niski) [CSW] M3 Развертываемая тренога (Низкая) + [CSW] M3 배치형 삼각대 (낮음) [CSW] Mortar Baseplate @@ -686,11 +818,13 @@ [CSW] Plaque de base pour mortier [CSW] 迫撃砲基盤 [CSW] 迫擊炮基座 + [班组] 迫击炮底座 [CSW] Mortar Baseplate [CSW] Podstavec pro minomet [CSW] Mortar Baseplate [CSW] Podstawa Moździerza [CSW] Миномётная плита + [CSW] 포판 Mortar Baseplate @@ -700,11 +834,13 @@ Plaque de base pour mortier 迫撃砲基盤 迫擊炮基座 + 迫击炮底座 Mortar Baseplate Podstavec pro minomet Mortar Baseplate Podstawa Moździerza Миномётная плита + 포판 [CSW] Mk6 Mortar Tube @@ -714,11 +850,13 @@ [CSW] Tube mortier Mk6 [CSW] Mk6 迫撃砲発射筒 [CSW] Mk6 迫擊炮炮管 + [班组] Mk6 迫击炮管 [CSW] Mk6 Mortar Tube [CSW] Minomet Mk6 hlaveň [CSW] Mk6 Mortar Tube [CSW] Rura Moździerza Mk6 [CSW] Сумка с Mk6 трубой + [CSW] Mk6 박격포 포신 [CSW] M252 Tube Bag @@ -728,11 +866,13 @@ [CSW] Sac tube M252 [CSW] M252 発射筒バッグ [CSW] M252 炮管袋 + [班组] M252 炮管包 [CSW] M252 Tube Bag [CSW] M252 minometná hlaveň v pouzdře [CSW] M252 Tube Bag [CSW] Torba na M252 [CSW] Сумка с M252 орудием + [CSW] M252 박격포 포신 [CSW] M2 Gun Bag @@ -742,11 +882,13 @@ [CSW] Sac M2 [CSW] M2 ガン バッグ [CSW] M2槍械袋 + [班组] M2 枪械包 [CSW] M2 Gun Bag [CSW] M2 zbraň v pouzdře [CSW] M2 Gun Bag [CSW] Torba na M2 [CSW] Сумка с M2 орудием + [CSW] M2 총가방 [CSW] MK19 Gun Bag @@ -756,11 +898,13 @@ [CSW] Sac MK19 [CSW] Mk19 ガン バッグ [CSW] Mk19槍械袋 + [班组] Mk19 枪械包 [CSW] MK19 Gun Bag [CSW] MK19 zbraň v pouzdře [CSW] MK19 Gun Bag [CSW] Torba na MK19 [CSW] Сумка с MK19 орудием + [CSW] MK19 총가방 [CSW] BGM-71 TOW Launcher Bag @@ -770,11 +914,13 @@ [CSW] Sac lanceur BGM-71 TOW [CSW] BGM-71 TOW ランチャー バッグ [CSW] BGM-71 拖式飛彈發射器袋 + [班组] BGM-71 陶式导弹发射器包 [CSW] BGM-71 TOW Launcher Bag [CSW] BGM-71 TOW raketomet v pouzdře [CSW] BGM-71 TOW Launcher Bag [CSW] Torba na BGM-71 TOW [CSW] Сумка с BGM-71 TOW установкой + [CSW] BGM-71 토우 발사기 가방 [CSW] DSHK Gun Bag @@ -784,11 +930,13 @@ [CSW] Sac DSHK [CSW] DShK ガン バッグ [CSW]DShK 槍械袋 + [班组] DShK 枪械包 [CSW] DSHK Gun Bag [CSW] DSHK zbraň v pouzdře [CSW] DSHK Gun Bag [CSW] Torba na DSzK [CSW] Сумка с ДШК орудием + [CSW] DSHK 총가방 [CSW] 2B14 Tube Bag @@ -798,11 +946,13 @@ [CSW] Sac tube 2B14 [CSW] 2B14 発射筒バッグ [CSW] 2B14 炮管袋 + [班组] 2B14 炮管包 [CSW] 2B14 Tube Bag [CSW] 2B14 minometná hlaveň v pouzdře [CSW] 2B14 Tube Bag [CSW] Torba na 2B14 [CSW] Сумка с 2Б14 трубой + [CSW] 2B14 박격포 가방 [CSW] NSV Gun Bag @@ -812,11 +962,13 @@ [CSW] Sac NSV [CSW] NSV ガン バッグ [CSW] NSV 槍械袋 + [班组] NSV 枪械包 [CSW] NSV Gun Bag [CSW] NSV zbraň v pouzdře [CSW] NSV Gun Bag [CSW] Torba na NSV [CSW] Сумка с НСВ орудием + [CSW] NSV 총가방 [CSW] KORD Gun Bag @@ -826,11 +978,13 @@ [CSW] Sac KORD [CSW] KORD ガン バッグ [CSW] KORD 槍械袋 + [班组] KORD 枪械包 [CSW] KORD Gun Bag [CSW] KORD zbraň v pouzdře [CSW] KORD Gun Bag [CSW] Torba na KORD [CSW] Сумка с Корд орудием + [CSW] KORD 총가방 [CSW] AGS-30 Gun Bag @@ -840,11 +994,13 @@ [CSW] Sac AGS-30 [CSW] AGS-30 バッグ [CSW] AGS-30 槍械袋 + [班组] AGS-30 枪械包 [CSW] AGS-30 Gun Bag [CSW] ASG-30 zbraň v pouzdře [CSW] AGS-30 Gun Bag [CSW] Torba na AGS-30 [CSW] Сумка с АГС-30 орудием + [CSW] AGS-30 총가방 [CSW] 9K115 Metis Launcher Bag @@ -854,11 +1010,13 @@ [CSW] Sac lanceur 9K115 Metis [CSW] 9K115 メティス ランチャー バッグ [CSW] 9K115 麥士蒂索人發射器袋 + [班组] 9K115 麦士蒂索人反坦克发射器包 [CSW] 9K115 Metis Launcher Bag [CSW] 9K115 Metis raketomet v pouzdře [CSW] Torba na 9K115 Metis [CSW] 9k115 Metis Launcher Bag [CSW] Сумка с 9К115 Метис установкой + [CSW] 9K115 메티스 발사기 가방 [CSW] 9M113 Kornet Launcher @@ -868,11 +1026,13 @@ [CSW] Sac lanceur 9M113 Kornet [CSW] 9M113 コルネット ランチャー バッグ [CSW] 9M113 短號發射器 + [班组] 9M113 短号发射器 [CSW] 9M113 Kornet Launcher [CSW] 9M113 Kornet raketomet [CSW] Wyrzutnia 9M113 Kornet [CSW] 9m113 Kornet Launcher [CSW] Сумка с 9К135 Корнет установкой + [CSW] 9M113 코넷 발사기 가방 SPG-9 Tripod @@ -882,11 +1042,13 @@ Trépied SPG-9 SPG-9 三脚 SPG-9 三腳架 + SPG-9 三脚架 SPG-9 Tripod SPG-9 trojnožka SPG-9 Tripod Trójnóg SPG-9 СПГ-9 Тренога + SPG-9 삼각대 [CSW] SPG-9 Deployable Tripod @@ -896,11 +1058,13 @@ [CSW] SPG-9 Trépied déployable [CSW] SPG-9 設置型三脚 [CSW] SPG-9 部署型三腳架 + [班组] SPG-9 部署型三脚架 [CSW] SPG-9 Deployable Tripod [CSW] SPG-9 trojnožka [CSW] SPG-9 Deployable Tripod [CSW] Trójnóg rozkładany SPG-9 [CSW] СПГ-9 Развертываемая тренога + [CSW] SPG-9 배치형 삼각대 [CSW] SPG-9 Launcher Bag @@ -910,11 +1074,13 @@ [CSW] Sac lanceur SPG-9 [CSW] SPG-9 ランチャー バッグ [CSW] SPG-9 發射器袋 + [班组] SPG-9 发射器包 [CSW] SPG-9 Launcher Bag [CSW] SPG-9 raketomet v pouzdře [CSW] SPG-9 Launcher Bag [CSW] Torba na SPG-9 [CSW] Сумка с СПГ-9 орудием + [CSW] SPG-9 발사기 가방 [CSW] SPG-9M Launcher Bag @@ -924,11 +1090,13 @@ [CSW] Sac lanceur SPG-9M [CSW] SPG-9M ランチャー バッグ [CSW] SPG-9M 發射器袋 + [班组] SPG-9M 发射器包 [CSW] SPG-9M Launcher Bag [CSW] SPG-9M raketomet v pouzdře [CSW] SPG-9M Launcher Bag [CSW] Torba na SPG-9M [CSW] Сумка с СПГ-9М орудием + [CSW] SPG-9M 발사기 가방 diff --git a/addons/dagr/stringtable.xml b/addons/dagr/stringtable.xml index d062e2ffaa..19af8d3f54 100644 --- a/addons/dagr/stringtable.xml +++ b/addons/dagr/stringtable.xml @@ -14,7 +14,7 @@ DAGR DAGR 軍用GPS接收器 - 军用GPS接收器 + 军用 GPS 接收器 DAGR @@ -30,7 +30,7 @@ DAGR を設定 DAGR 설정 設定軍用GPS接收器 - 设定军用GPS接收器 + 设定军用 GPS 接收器 DAGR'ı yapılandır @@ -46,7 +46,7 @@ DAGR を常に表示 DAGR 토글 切換軍用GPS接收器 - 切换军用GPS接收器 + 切换军用 GPS 接收器 DAGR'yi aç / kapat @@ -62,7 +62,7 @@ アドバンスド DAGR の受信を定義します 국방 고급위성항법시스템 수신기 軍用高級防禦GPS接收器 - 军用高级防御GPS接收器 + 军用高级防御 GPS 接收器 Gelişmiş Savunma GPS Alıcısı diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml index 9cc9dca680..0ae879fd60 100644 --- a/addons/disarming/stringtable.xml +++ b/addons/disarming/stringtable.xml @@ -15,7 +15,7 @@ インベントリを開く 소지품 열기 開啟裝備 - 开启装备 + 开启物品栏 Envanteri Aç diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index b0148a47a6..0e11c9a5d6 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -13,7 +13,7 @@ Lanciatore usato Tubo utilizado 使用済み - 사용함 + 사용한 발사관 使用過的火箭筒 使用过的火箭筒 Kullanılmış Tüp diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml index c2fc066b3d..fcf2d1451a 100644 --- a/addons/dogtags/stringtable.xml +++ b/addons/dogtags/stringtable.xml @@ -101,6 +101,7 @@ Onscreen display for checking dogtags Anzeige um Erkennungsmarke zu überprüfen 在畫面中顯示檢查兵籍牌 + 在画面中显示检查兵籍牌 確認中のドッグタグを画面上で表示します Display su schermo per il controllo delle piastrine Wyświetlacz ekranowy dla sprawdzania nieśmiertelników @@ -110,6 +111,7 @@ Affichage à l'écran pour le contrôle des plaques. Okno na obrazovce pro kontrolu známek Künye gösteriliyor + 군번줄 확인 시 화면에 보여줍니다 diff --git a/addons/dragging/CfgVehicles.hpp b/addons/dragging/CfgVehicles.hpp index 42a7d4c3d8..cea1675565 100644 --- a/addons/dragging/CfgVehicles.hpp +++ b/addons/dragging/CfgVehicles.hpp @@ -18,6 +18,12 @@ class CfgVehicles { GVAR(canDrag) = 0; }; + // Invisible Target Soldier + class TargetSoldierBase: StaticWeapon { + GVAR(canCarry) = 0; + GVAR(canDrag) = 0; + }; + class StaticMortar; class Mortar_01_base_F: StaticMortar { GVAR(canCarry) = 1; diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index b166d3dfaa..bfa4ccffe6 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -15,7 +15,7 @@ 引きずる 끌기 拖拉 - 拖拉 + 拖动 Sürükle @@ -49,7 +49,7 @@ オブジェクトを引きずる/離す 물건 끌기/놓기 拖拉/放開物品 - 拖拉/放开物品 + 拖动/放开物品 Objeyi Sürükle/Bırak @@ -61,6 +61,8 @@ Objeyi Taşı/Bırak Arrastrar/Soltar Objeto Objekt tragen/loslassen + 背负/释放物体 + 물건 업기/놓기 Item too heavy @@ -106,6 +108,8 @@ Wyżej/niżej | (Ctrl + Kółko myszy) obracanie Yükselt/Alçalt | (Ctrl + Tekerlek) Döndür Subir/Bajar | (Ctrl + Scroll) Rotar + 抬起/放低 |(Ctrl + 鼠标滚轮)旋转 + 높이기/내리기 | (컨트롤 + 스크롤) 회전 ACE Dragging @@ -116,6 +120,8 @@ ACE Arrastrar ACE Przeciąganie ACE ドラッグ + ACE 拖曳 + ACE 끌기 Allow firing while dragging @@ -126,6 +132,8 @@ Permitir disparar mientras se arrastra Pozwól na strzelanie podczas przeciągania 搬送中に射撃許可 + 允许在拖动时开火 + 사격 중 끌기 가능하게 하기 Allow the player to fire their gun while dragging. @@ -136,6 +144,8 @@ Permite al jugador disparar mientras está arrastrando. Pozwala graczom strzelać z broni podczas przeciągania obiektów. プレイヤーが引きずっている最中でも射撃できるようにします。 + 允许玩家在拖动时开火。 + 플레이어가 무기를 끄는 동안에 무기를 사용할 수 있게합니다. diff --git a/addons/dragon/config.cpp b/addons/dragon/config.cpp index 9d329f6be7..d43bf90184 100644 --- a/addons/dragon/config.cpp +++ b/addons/dragon/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_hot","ace_csw"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"Dani (TCVM)"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf index f8420fa114..99627a632f 100644 --- a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf +++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) (Code inspired by NouberNou's Dragon Guidance) + * Author: Dani (TCVM) (Code inspired by NouberNou's Dragon Guidance) * Attack profile: Dragon Guidance * * Arguments: diff --git a/addons/dragon/functions/fnc_canPickupTripod.sqf b/addons/dragon/functions/fnc_canPickupTripod.sqf index c328c66bd6..936282048b 100644 --- a/addons/dragon/functions/fnc_canPickupTripod.sqf +++ b/addons/dragon/functions/fnc_canPickupTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Determines if you can pick-up the Dragon missile. If the missile was fired you will not be able to pick up the tripod. * * Arguments: diff --git a/addons/dragon/functions/fnc_onFired.sqf b/addons/dragon/functions/fnc_onFired.sqf index 1fa24c1925..5f3dc8d87f 100644 --- a/addons/dragon/functions/fnc_onFired.sqf +++ b/addons/dragon/functions/fnc_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Runs when Dragon is fired * * Arguments: diff --git a/addons/dragon/functions/fnc_sightAttach.sqf b/addons/dragon/functions/fnc_sightAttach.sqf index 6ad5df2077..3b93d83fc2 100644 --- a/addons/dragon/functions/fnc_sightAttach.sqf +++ b/addons/dragon/functions/fnc_sightAttach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Attaches the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightCanAttach.sqf b/addons/dragon/functions/fnc_sightCanAttach.sqf index 9ec742d19b..3695dc3670 100644 --- a/addons/dragon/functions/fnc_sightCanAttach.sqf +++ b/addons/dragon/functions/fnc_sightCanAttach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Determines if you can attach the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightCanDetach.sqf b/addons/dragon/functions/fnc_sightCanDetach.sqf index 92c4a9a913..d5f1d7b9b8 100644 --- a/addons/dragon/functions/fnc_sightCanDetach.sqf +++ b/addons/dragon/functions/fnc_sightCanDetach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Determines if you can attach the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightDetach.sqf b/addons/dragon/functions/fnc_sightDetach.sqf index 161a13ba64..444ce19bb7 100644 --- a/addons/dragon/functions/fnc_sightDetach.sqf +++ b/addons/dragon/functions/fnc_sightDetach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Attaches the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/stringtable.xml b/addons/dragon/stringtable.xml index a99e3fb49c..64692c8dc9 100644 --- a/addons/dragon/stringtable.xml +++ b/addons/dragon/stringtable.xml @@ -8,12 +8,14 @@ [CSW] M47 Super-Dragon [CSW] M47 スーパー ドラゴン [CSW] M47龍式 + [班组] M47 龙式反坦克导弹 [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon [CSW] M47 Super-Dragon + [CSW] M47 슈퍼 드래곤 M47 Super-Dragon @@ -22,12 +24,14 @@ M47 Super-Dragon M47 スーパー ドラゴン M47 龍式 + M47 龙式反坦克导弹 M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon M47 Super-Dragon + M47 슈퍼 드래곤 Attach Sight @@ -36,11 +40,13 @@ Monter le viseur 照準器を取り付ける 裝上瞄具 + 装上瞄具 Monta mirino Připojit puškohled Dołącz Optykę Прикрепить прицел Acoplar visor + 조준경 부착 Detach Sight @@ -49,11 +55,13 @@ Démonter le viseur 照準器を外す 拆下瞄具 + 卸下瞄具 Smonta mirino Odpojit puškohled Odczep Optykę Открепить прицел Desacoplar visor + 조준경 분리 SU-36/P Daysight @@ -62,12 +70,14 @@ SU-36/P Daysight SU-36/P デイサイト SU-36/P 日間瞄具 + SU-36/P 常规瞄具 SU-36/P Daysight SU-36/P denní puškohled SU-36/P Celownik dzienny SU-36/P Daysight SU-36/P Дневной Visor diurno SU-36/P + SU-36/P 주간조준기 A light, cheap sight used for daytime operations. Contains the guidance computer for the whole system @@ -76,11 +86,13 @@ Un viseur léger et bon marché utilisé pour les opérations de jour.\nContient l'ordinateur de guidage pour tout le système. 昼間時に使用される軽量で、低価格の照準器です。システム全体の誘導コンピュータを備えています。 一個輕量,便宜適合日間行動使用的廉價瞄具。內含全套制導電腦系統 + 一种用于日间作战的轻型廉价瞄准具。包含整个系统的制导计算机 Una luce,un mirino usato per le operazioni diurne.Contiene il computer di guida per l'intero sistema Lehký a levný puškohled pro použití za denního světla. Obsahuje navigační počítač pro celý systém. Lekki, tani celownik używany do działania w trakcie dnia. Zawiera komputer naprowadząjący dla całego systemu Легкий дешёвый прицел, используемый для дневных операций. Содержит компьютер для всей системы Un visor ligero y barato utilizado en operaciones diurnas. Contiene el ordenador de guiado para todo el sistema. + 싸고 가벼운 주간조준기입니다. 사격을 하기 위한 통제컴퓨터가 포함되있습니다. A Wire-Guided SACLOS missile with a unique flight characteristic @@ -89,11 +101,13 @@ Un missile filoguidé SACLOS, présentant une caractéristique de vol exceptionnelle. 特徴的な飛行特性を持つ、ワイヤ誘導の SACLOS ミサイルです。 一個有線制導半自動指令型飛彈並有著獨特的飛航動作 + 具有独特飞行特性的线导半自动指令型导弹 Un missile SACLOS filo-guidato con uniche caratterische di volo Drátem naváděná SACLOS raketa s unikátními letovými vlastnostmi Naprowadzany przewodowo rakietowy pocisk SACLOS o unikalnej charakterystyce lotu Ракета SACLOS с проводным наведением с уникальной характеристикой полета Misil SACLOS guiado por hilo con una característica de vuelo única. + 특이한 비행 성질을 가진 반자동 가시선지령 유도미사일입니다. diff --git a/addons/explosives/ACE_Triggers.hpp b/addons/explosives/ACE_Triggers.hpp index e9c717504e..aab36121a0 100644 --- a/addons/explosives/ACE_Triggers.hpp +++ b/addons/explosives/ACE_Triggers.hpp @@ -56,7 +56,7 @@ class ACE_Triggers { isAttachable = 1; displayName = CSTRING(timerName); picture = QPATHTOF(data\UI\Timer.paa); - onPlace = QUOTE([ARR_2(_this select 1, _this select 3 select 0)] call FUNC(startTimer); false); + onPlace = QUOTE([ARR_4(_this select 1, _this select 3 select 0, nil, _this select 0)] call FUNC(startTimer); false); onSetup = QUOTE(_this call FUNC(openTimerUI)); }; class Tripwire { diff --git a/addons/explosives/functions/fnc_addDetonateHandler.sqf b/addons/explosives/functions/fnc_addDetonateHandler.sqf index b227b96d07..1345a73370 100644 --- a/addons/explosives/functions/fnc_addDetonateHandler.sqf +++ b/addons/explosives/functions/fnc_addDetonateHandler.sqf @@ -4,7 +4,7 @@ * Add a explosive detonation handler. * Should be called on all machines. * Code needs to return BOOL: true(allowed) / false(blocked) - * See https://ace3mod.com/wiki/framework/explosives-framework.html for an example. + * See https://ace3.acemod.org/wiki/framework/explosives-framework.html for an example. * * Arguments: * 0: Code diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index c7b5848e52..e4292f60b3 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -38,6 +38,6 @@ if (_unit == ace_player) then { playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; (_this select 0) setVariable [QGVAR(Dialing), false, true]; }, [_unit,_explosive select 0], 0.25 * (count _arr - 4)] call CBA_fnc_waitAndExecute; - [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2), "ACE_Cellphone"] call FUNC(startTimer); + [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2), "ACE_Cellphone", _unit] call FUNC(startTimer); }; }; diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf index 2961c8d101..2e0c6ca426 100644 --- a/addons/explosives/functions/fnc_setupExplosive.sqf +++ b/addons/explosives/functions/fnc_setupExplosive.sqf @@ -24,7 +24,7 @@ params ["_vehicle", "_unit", "_magClassname"]; TRACE_3("params",_vehicle,_unit,_magClassname); //Get setup object vehicle and model: -private _setupObjectClass = getText(ConfigFile >> "CfgMagazines" >> _magClassname >> QGVAR(SetupObject)); +private _setupObjectClass = getText (configFile >> "CfgMagazines" >> _magClassname >> QGVAR(SetupObject)); if (!isClass (configFile >> "CfgVehicles" >> _setupObjectClass)) exitWith {ERROR("Bad Vehicle");}; private _p3dModel = getText (configFile >> "CfgVehicles" >> _setupObjectClass >> "model"); if (_p3dModel == "") exitWith {ERROR("No Model");}; //"" - will crash game! diff --git a/addons/explosives/functions/fnc_startTimer.sqf b/addons/explosives/functions/fnc_startTimer.sqf index 484171ec6e..2b0a395b35 100644 --- a/addons/explosives/functions/fnc_startTimer.sqf +++ b/addons/explosives/functions/fnc_startTimer.sqf @@ -7,6 +7,7 @@ * 0: Explosive * 1: Time till detonate * 2: Trigger classname (default: "#timer") + * 3: Unit * * Return Value: * None @@ -17,13 +18,13 @@ * Public: Yes */ -params ["_explosive", "_delay", ["_trigger", "#timer", [""]]]; -TRACE_3("Starting timer",_explosive,_delay,_trigger); +params ["_explosive", "_delay", ["_trigger", "#timer", [""]], ["_unit", objNull, [objNull]]]; +TRACE_4("Starting timer",_explosive,_delay,_trigger,_unit); [{ - params ["_explosive", "_trigger"]; + params ["_explosive", "_trigger", "_unit"]; TRACE_1("Explosive detonating from timer",_explosive); if (!isNull _explosive) then { - [_explosive, -1, [_explosive, 0], _trigger] call FUNC(detonateExplosive); + [_unit, -1, [_explosive, 0], _trigger] call FUNC(detonateExplosive); }; -}, [_explosive, _trigger], _delay] call CBA_fnc_waitAndExecute; +}, [_explosive, _trigger, _unit], _delay] call CBA_fnc_waitAndExecute; diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 4143426314..f04be845d6 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -81,7 +81,7 @@ Codice esplosivo: %1 爆破コード: %1 폭파 코드: %1 - 炸药代码: %1 + 炸药代码:%1 炸藥代號: %1 Patlayıcı Kodu: %1 @@ -233,7 +233,7 @@ Используется для удаленной детонации СВУ 爆発物を遠隔で起爆させるのに使います 원격으로 폭발물을 폭파시킬때 씁니다. - 用于远端引爆炸药 + 用于远程引爆炸药 用於遠端引爆炸藥 Bombaları uzaktan patlatmak için kullanılır @@ -267,7 +267,7 @@ Используется для удаленной детонации зарядов 爆発物を遠隔で起爆させるのに使います 원격으로 폭발물을 폭파시킬때 씁니다. - 用于远端引爆炸药 + 用于远程引爆炸药 用於遠端引爆炸藥 Patlayıcıları uzaktan tetiklemek için kullanılır @@ -301,7 +301,7 @@ M152 RAMS M152 RAMS M152 RAMS - M152 远端炸药引爆系统 + M152 远程炸药引爆系统 M152 遠端炸藥引爆系統 M152 RAMS @@ -335,7 +335,7 @@ Позволяет обезвреживать взрывчатку 爆発物を無力化できます 폭발물을 해체할 수 있게 해줍니다 - 可以用来拆除炸弹 + 可以用来拆除爆炸物 可以用來拆除炸彈 Patlayıcıların etkisiz hale gelmesini sağlar. @@ -454,7 +454,7 @@ Меню подрыва 点火メニュー 폭파 메뉴 - 引爆选单 + 引爆菜单 引爆選單 Patlatma Menüsü @@ -471,7 +471,7 @@ Меню установки 設置メニュー 설치 메뉴 - 放置选单 + 放置菜单 放置選單 Yerleştirme Menüsü @@ -505,7 +505,7 @@ Обезвреживание... 爆発物を無力化しています・・・ 폭발물 해체중... - 正在拆除炸弹... + 正在拆除爆炸物... 炸彈拆除中... Patlayıcı Imha Ediliyor... @@ -539,7 +539,7 @@ Время: %1m %2c 設定時間: %1分 %2秒 시간: %1분 %2초 - 时间: %1分%2秒 + 时间:%1分%2秒 時間: %1分%2秒 Süre: %1m %2s @@ -675,7 +675,7 @@ ИК сенсор (детонация вбок) 赤外線感知式 (側面攻撃) 적외선 센서 (측면 공격) - 红外线感应器 (侧边攻击) + 红外线感应器(侧边攻击) 紅外線感應器 (側邊攻擊) @@ -691,7 +691,7 @@ Магнитный сенсор (детонация вверх) 磁気感知式 (底面攻撃) 자기장 감지센서 (바닥 공격) - 磁性感应器 (底部攻击) + 磁性感应器(底部攻击) 磁性感應器 (底部攻擊) @@ -724,7 +724,7 @@ Detonatore a rilascio 自爆装置 자폭 장치 - 自杀炸弹客引爆器 + 自杀炸弹手引爆器 自殺炸彈客引爆器 @@ -740,7 +740,7 @@ Usato per attivare a distanza esplosivi al momento del rilascio 点火装置から遠隔から起爆したい時に使います。 압력이 해제될때 원격으로 폭발시킵니다. - 当放开按钮时, 将会引爆炸弹. + 当放开按钮时,将会引爆炸弹。 當放開按鈕時, 將會引爆炸彈. Patlayıcıları serbest bırakıldığında uzaktan tetiklemek için kullanılır. @@ -791,7 +791,7 @@ Richiedi specialisti? 特技兵を必須 전문가가 필요합니까? - 需要专家? + 需要专家? 需要專家? Uzmanlara ihtiyaç var mı? @@ -808,7 +808,7 @@ Richiedi specialisti esplosivi per disabilitare esplosivi? Default: No 爆発物を無効化するには特技兵である必要かどうかを設定できます。標準: 無効化 폭발물을 해제하기 위해서는 전문가가 필요합니까? 기본설정: 아니요 - 需要炸弹专家才能拆除炸弹? 预设: 否 + 需要爆破专业兵才能拆除爆炸物? 预设:否 需要炸彈專家才能拆除炸彈? 預設: 否 Patlayıcı uzmanlarının patlayıcıları etkisiz hale getirmesini ister misiniz? Varsayılan: Hayır @@ -824,8 +824,8 @@ Штраф не-специалистам? Punisci non-specialisti? 非特技兵へ足かせ - 비-전문가에 불이익을 줍니까? - 折磨非专业人员? + 비전문가에게 불이익을 줍니까? + 惩罚非专业人士? 折磨非專業人員? @@ -840,8 +840,8 @@ Увеличивать время завершения действий для не-специалистов? По-умолчанию: Нет Aumenta il tempo richiesto per completare azioni per non-specialisti? Default: Si 非特技兵は動作完了までの時間を増加させますか? 標準: 有効化 - 비-전문가가 폭발물을 해제시 더욱 많은 시간을 소요합니까? 기본설정: 예 - 增加非专业人员相关操作的时间? 预设: 是 + 비전문가가 폭발물을 해제시 더욱 많은 시간을 소요합니까? 기본설정: 예 + 增加非专业人员相关操作的时间? 预设:是 增加非專業人員相關操作的時間? 預設: 是 @@ -856,8 +856,8 @@ Взрыв при разминир.? Fai esplodere quando disarmato? 解除中に爆発 - 해제시 폭발합니까? - 拆除时引爆? + 해제 시 폭발합니까? + 拆除时引爆? 拆除時引爆? @@ -872,8 +872,8 @@ Разрешить определенным взрывным устройствам взрываться при разминировании? По-умолчанию: Да Abilita alcuni esplosivi per esplosione al disarmo? Default: Si 特定の爆発物を解除中に爆発させるかどうかを設定できます。? 標準: 有効化 - 특정 폭발물이 해제시 폭발하게 합니까? 기본설정: 예 - 启用后, 某些炸弹会在拆除时引爆? 预设: 是 + 특정 폭발물이 해제 시 폭발하게 합니까? 기본설정: 예 + 启用后,某些爆炸物会在拆除时引爆? 预设:是 啟用後, 某些炸彈會在拆除時引爆? 預設: 是 @@ -904,7 +904,7 @@ Мина M6 SLAM (направлена вверх) M6 SLAM 地雷 (底面攻撃) M6 SLAM 지뢰 (바닥 공격) - M6指向性反装甲地雷 (底部攻击) + M6指向性反装甲地雷(底部攻击) M6指向性反裝甲地雷 (底部攻擊) @@ -919,7 +919,7 @@ Мина M6 SLAM (направлена вбок) M6 SLAM 地雷 (側面攻撃) M6 SLAM 지뢰 (측면 공격) - M6指向性反装甲地雷 (侧边攻击) + M6指向性反装甲地雷(侧边攻击) M6指向性反裝甲地雷 (側邊攻擊) @@ -934,7 +934,7 @@ Большое СВУ (городское, нажимного действия) 大きな IED (市街地用、圧力感知) 대형 급조폭발물 (시가지, 압력식) - 大型简易爆炸装置 (地表上, 压力盘) + 大型 IED(地表上,压力盘) 大型簡易爆炸裝置 (地表上, 壓力盤) @@ -949,7 +949,7 @@ Большое СВУ (закопанное, нажимного действия) 大きな IED (埋め込み型、圧力感知) 대형 급조폭발물 (묻힘, 압력식) - 大型简易爆炸装置 (地表下, 压力盘) + 大型 IED(地表下,压力盘) 大型簡易爆炸裝置 (地表下, 壓力盤) @@ -964,7 +964,7 @@ Малое СВУ (городское, нажимного действия) 小さな IED (市街地用、圧力感知) 소형 급조폭발물 (시가지, 압력식) - 小型简易爆炸装置 (地表上, 压力盘) + 小型 IED(地表上,压力盘) 小型簡易爆炸裝置 (地表上, 壓力盤) @@ -979,7 +979,7 @@ Малое СВУ (закопанное, нажимного действия) 小さな IED (埋め込み型、圧力感知) 소형 급조폭발물 (묻힘, 압력식) - 小型简易爆炸装置 (地表下, 压力盘) + 小型 IED(地表下,压力盘) 小型簡易爆炸裝置 (地表下, 壓力盤) @@ -1008,7 +1008,7 @@ 조명지뢰 Fusée éclairante avec fil piège Cavo d'innesco - 绊线闪光地雷 + 绊线信号弹 絆線閃光地雷 Tripwire (Sinalizador) Světlice na nástražném drátu @@ -1023,7 +1023,7 @@ 종류: 조명지뢰 - 작동시 무해한 조명을 사출합니다.<br />장탄수: 1<br />사용처: 지면 Type : Fusée éclairante avec fil piège - Allume une fusée éclairante lorsque déclenchée.<br />Coups : 1<br />Utilisé sur : le sol Tipo: Cavo d'innesco - Sfocio un abbaglio non letale quanto attivato. <br />Rimanenti: 1<br />Usato: A terra - 类型: 绊线闪光地雷 - 触发后产生非致命性的强光.<br />发数: 1<br />使用于: 地面 + 类型:绊线信号弹—触发后产生非致命性的强光。<br />发数:1<br />使用于:地面 類型: 絆線閃光地雷 - 觸發後產生非致命性的強光.<br />發數: 1<br />使用於: 地面 Tipo: Flare de Tripwire - Acende um sinalizador não letal quando acionado.<br/>Usos: 1<br/>Usado em: Chão Typ: Světlice na nástražném drátu - Zapálí světlici při aktivaci.<br/>Pouze 1 použití<br/>Použít na zem @@ -1043,6 +1043,7 @@ Dosah exploze Patlayıcı menzili Alcance explosivo + 폭발 범위 Explosive Timer @@ -1054,9 +1055,11 @@ Timer de explosão Minuteur pour explosifs 引爆倒數 + 定时爆炸 Časovač exploze Patlayıcı Zamanlayıcı Temporizador de explosivo + 폭발 타이머 Is EOD @@ -1064,11 +1067,13 @@ EOD に Spécialiste en explosifs 是EOD + 爆破专家 è EOD Je specilista na výbušniny (EOD) Jest EOD Сапёр ¿Es EOD? + 폭발물 처리반 Controls whether the unit is an explosive specialist. @@ -1076,11 +1081,13 @@ ユニットが何であれ爆発物専門家にします。 Définit si l'unité est un spécialiste en explosifs. 控制該單位是否是爆裂物處置專家 + 控制该单位是否是爆破专家 Controlla se l'unità è uno specialista di esplosivi. Určuje jestli je jednotka specialista na výbušniny. Kontroluje, czy jednostka jest specjalistą od materiałów wybuchowych. Определяет, является ли юнит сапёром. Controla si la unidad es un especialista en explosivos + 유닛이 폭발물 처리반인지 결정합니다 Minimum Time @@ -1090,6 +1097,8 @@ Tiempo mínimo Minimalny czas Minimale Zeit + 最短时间 + 최소 시간 Maximum Time @@ -1099,6 +1108,8 @@ Tiempo máximo Maksymalny czas Maximale Zeit + 最长时间 + 최대 시간 Default Time @@ -1108,6 +1119,8 @@ Tiempo por defecto Domyślny czas Standardmäßige Zeit + 默认时间 + 기본 시간 Minimum time value (in seconds) for the explosive timer. @@ -1117,6 +1130,8 @@ Tiempo mínimo (en segundos) para el temporizador del explosivo. Minimalna wartość czasomierza dla ładunku (w sekundach). Minimale Zeit (in Sekunden) für den Zeitzünder. + 定时爆炸的最短时间(单位:秒) + 초 단위로, 폭발 타이머의 최소 시간을 정합니다 Maximum time value (in seconds) for the explosive timer. @@ -1126,6 +1141,8 @@ Tiempo máximo (en segundos) para el temporizador del explosivo. Maksymalna wartość czasomierza dla ładunku (w sekundach). Maximale Zeit (in Sekunden) für den Zeitzünder. + 定时爆炸的最长时间(单位:秒) + 초 단위로, 폭발 타이머의 최대 시간을 정합니다 Default time value (in seconds) for the explosive timer. @@ -1135,6 +1152,8 @@ Tiempo por defecto (en segundos) para el temporizador del explosivo. Domyślna wartość czasomierza dla ładunku (w sekundach). Standardmäßige Zeit (in Sekunden) für den Zeitzünder. + 定时爆炸的默认时间(单位:秒) + 초 단위로, 기본 폭발 타이머 시간을 정합니다 diff --git a/addons/fastroping/CfgVehicles.hpp b/addons/fastroping/CfgVehicles.hpp index fc4aed6ae4..95e6ab1696 100644 --- a/addons/fastroping/CfgVehicles.hpp +++ b/addons/fastroping/CfgVehicles.hpp @@ -1,16 +1,3 @@ -#define EQUIP_FRIES_ATTRIBUTE class Attributes { \ - class GVAR(equipFRIES) { \ - property = QGVAR(equipFRIES); \ - control = "Checkbox"; \ - displayName = CSTRING(Eden_equipFRIES); \ - tooltip = CSTRING(Eden_equipFRIES_Tooltip); \ - expression = QUOTE(if (_value) then {[_this] call FUNC(equipFRIES)}); \ - typeName = "BOOL"; \ - condition = "objectVehicle"; \ - defaultValue = "(false)"; \ - }; \ -} - class CfgVehicles { class Logic; class Module_F: Logic { @@ -221,7 +208,9 @@ class CfgVehicles { GVAR(friesAttachmentPoint)[] = {0.035, 2.2, -0.15}; GVAR(onPrepare) = QFUNC(onPrepareCommon); GVAR(onCut) = QFUNC(onCutCommon); - EQUIP_FRIES_ATTRIBUTE; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; }; class Heli_Transport_02_base_F: Helicopter_Base_H { GVAR(enabled) = 1; @@ -254,14 +243,19 @@ class CfgVehicles { GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"}; GVAR(friesType) = "ACE_friesGantryReverse"; GVAR(friesAttachmentPoint)[] = {-1.04, 2.5, -0.34}; - EQUIP_FRIES_ATTRIBUTE; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; }; class Heli_light_03_unarmed_base_F: Heli_light_03_base_F { GVAR(enabled) = 2; GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"}; GVAR(friesType) = "ACE_friesGantry"; GVAR(friesAttachmentPoint)[] = {1.07, 2.5, -0.5}; - EQUIP_FRIES_ATTRIBUTE; + + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; }; class Heli_Transport_04_base_F: Helicopter_Base_H { class UserActions; diff --git a/addons/fastroping/script_component.hpp b/addons/fastroping/script_component.hpp index 5bd19a1db2..a9a07e2f02 100644 --- a/addons/fastroping/script_component.hpp +++ b/addons/fastroping/script_component.hpp @@ -16,6 +16,7 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" +#include "script_macros.hpp" #define DEFAULT_ROPE_LENGTH 34.5 diff --git a/addons/fastroping/script_macros.hpp b/addons/fastroping/script_macros.hpp new file mode 100644 index 0000000000..2ea5d961c8 --- /dev/null +++ b/addons/fastroping/script_macros.hpp @@ -0,0 +1,10 @@ +#define EQUIP_FRIES_ATTRIBUTE class EGVAR(fastroping,equipFRIES) { \ + property = QEGVAR(fastroping,equipFRIES); \ + control = "Checkbox"; \ + displayName = ECSTRING(fastroping,Eden_equipFRIES); \ + tooltip = ECSTRING(fastroping,Eden_equipFRIES_Tooltip); \ + expression = QUOTE(if (_value) then {[_this] call EFUNC(fastroping,equipFRIES)}); \ + typeName = "BOOL"; \ + condition = "objectVehicle"; \ + defaultValue = false; \ +} diff --git a/addons/fastroping/stringtable.xml b/addons/fastroping/stringtable.xml index 839bbc5e2a..acee249496 100644 --- a/addons/fastroping/stringtable.xml +++ b/addons/fastroping/stringtable.xml @@ -12,7 +12,7 @@ Equipar FRIES Десантирование по канатам FRIES を装備 - FRIES 장착 + 패스트로프 시스템 장착 启用快速绳降及撤离系统 啟用快速繩降及撤離系統 @@ -54,7 +54,7 @@ ファスト ロープのシステムを収容 收起快速繩降系統 收起快速绳降系统 - 패스트 로프 시스템 보관 + 패스트로프 시스템 보관 Schowaj system zjazdu na linach Спрятать систему спуска Recolher o sistema de descida rápida @@ -74,7 +74,7 @@ Jogar cordas Зацепить канаты ロープを展開 - 줄 배치 + 줄 내리기 部属绳索 部屬繩索 Halatları sal @@ -90,7 +90,7 @@ Descida rápida Спуститься по канату ファスト ロープをする - 강하하기 + 패스트로프 快速绳降 快速繩降 Halatla in @@ -122,7 +122,7 @@ Equipar helicóptero com FRIES Снарядить вертолет канатами для спуска ヘリコプターへ FRIES を装備 - 헬리콥터에 FRIES 장착 + 헬리콥터에 패스트로프 시스템 장착 启用快速绳降及撤离系统给指定的直升机 啟用快速繩降及撤離系統給指定的直升機 @@ -152,7 +152,7 @@ ZJAZD NA LINACH 让单位快速绳降 讓單位快速繩降 - 패스트 로프를 놓음 + 유닛 패스트로프 시키기 UMOŽNIT JEDNOTKÁM SLAŇOVAT INDICAR A LAS UNIDADES DESCENDER POR LA CUERDA @@ -168,6 +168,9 @@ 3m halat sal Desplegar cuerdas de 3m 3m ロープを展開 + 部屬3公尺長之繩索 + 部署3米长的绳索 + 3m 줄 내리기 Deploy 6m ropes @@ -181,6 +184,9 @@ 6m halat sal Desplegar cuerdas de 6m 6m ロープを展開 + 部屬6公尺長之繩索 + 部署6米长的绳索 + 6m 줄 내리기 Deploy 12m ropes @@ -191,10 +197,12 @@ Выпустить 12 м канат Jogar cordar (12m) 部屬12公尺長之繩索 + 部署12米长的绳索 Dispiegamento corde 12m Připravit 12m lana 12m halat sal Desplegar cuerdas de 12m + 12m 줄 내리기 Deploy 15m ropes @@ -205,10 +213,12 @@ Выпустить 15 м канат Jogar cordar (15m) 部屬15公尺長之繩索 + 部署15米长的绳索 Dispiegamento corde 15m Připravit 15m lana 15m halat sal Desplegar cuerdas de 15m + 15m 줄 내리기 Deploy 18m ropes @@ -219,10 +229,12 @@ Выпустить 18 м канат Jogar cordar (18m) 部屬18公尺長之繩索 + 部署18米长的绳索 Dispiegamento corde 18m Připravit 18m lana 18m halat sal Desplegar cuerdas de 18m + 18m 줄 내리기 Deploy 27m ropes @@ -233,10 +245,12 @@ Выпустить 27 м канат Jogar cordar (27m) 部屬27公尺長之繩索 + 部署27米长的绳索 Dispiegamento corde 27m Připravit 27m lana 27m halat sal Desplegar cuerdas de 27m + 27m 줄 내리기 Deploy 36m ropes @@ -247,10 +261,12 @@ Выпустить 36 м канат Jogar cordar (36m) 部屬36公尺長之繩索 + 部署36米长的绳索 Dispiegamento corde 36m Připravit 36m lana 36m halat sal Desplegar cuerdas de 36m + 36m 줄 내리기 [ACE] Ropes Supply crate @@ -261,15 +277,18 @@ [ACE] Ящик с канатами [ACE] Suprimento de cordas [ACE] 繩索補充箱 + [ACE] 绳索补给箱 [ACE] Cassa Corde [ACE] Bedna s lany [ACE] Halat Sandığı [ACE] Caja de suministros - cuerdas + [ACE] 하강줄 보급 상자 Fast-roping Hélicordage 快速繩降 + 快速索降 ファスト ロープ Cuerdas rápidas Zjazd na linach @@ -277,6 +296,7 @@ Slaňování Спуск по канату Schnelles-Abseilen + 패스트로프 Require rope item to deploy @@ -287,10 +307,12 @@ Требуется канат Requer uma corda para jogar 需要繩索來部屬 + 需要绳索来部署 Richiede una corda per il dispigamento Požadovat předmět lana pro slaňování Requiere una cuerda para desplegar Halatla kaymak için halat gerekli + 줄이 필요합니다 diff --git a/addons/fcs/stringtable.xml b/addons/fcs/stringtable.xml index 6fff1a45c6..f8fe5f00e9 100644 --- a/addons/fcs/stringtable.xml +++ b/addons/fcs/stringtable.xml @@ -14,7 +14,7 @@ Marcar com laser / Medir Distância レーザー ターゲット / 計測距離 목표까지 거리를 레이저로 취득 - 雷射指示目标 / 测量距离 + 激光照射目标/测量距离 雷射指示目標 / 測量距離 @@ -30,7 +30,7 @@ Azzeramento a 次にゼロイン 영점 조절 - 归零到 + 已归零到 歸零到 @@ -46,7 +46,7 @@ Диапазон СУО (Выше) FCS による距離を調節 (上げ) 사통장치 거리 조정 (위로) - 调整火控系统距离 (上) + 调整火控系统距离(上调) 調整火控系統距離 (上) @@ -62,7 +62,7 @@ Диапазон СУО (Ниже) FCS による距離を調節 (下げ) 사통장치 거리 조정 (아래로) - 调整火控系统距离 (下) + 调整火控系统距离(下调) 調整火控系統距離 (下) diff --git a/addons/field_rations/CfgVehicles.hpp b/addons/field_rations/CfgVehicles.hpp index 0b0d3828cc..89ca951032 100644 --- a/addons/field_rations/CfgVehicles.hpp +++ b/addons/field_rations/CfgVehicles.hpp @@ -277,4 +277,14 @@ class CfgVehicles { MACRO_ADDITEM(ACE_Humanitarian_Ration,1); }; }; + class ACE_Sunflower_Seeds_Item: Item_Base_F { + author = ECSTRING(common,ACETeam); + scope = 2; + scopeCurator = 2; + displayName = CSTRING(SunflowerSeeds_DisplayName); + vehicleClass = "Items"; + class TransportItems { + MACRO_ADDITEM(ACE_Sunflower_Seeds,1); + }; + }; }; diff --git a/addons/field_rations/CfgWeapons.hpp b/addons/field_rations/CfgWeapons.hpp index 5e397760ed..760d41290f 100644 --- a/addons/field_rations/CfgWeapons.hpp +++ b/addons/field_rations/CfgWeapons.hpp @@ -225,4 +225,20 @@ class CfgWeapons { model = QPATHTOF(data\mre_human.p3d); picture = QPATHTOF(ui\item_mre_human_co.paa); }; + + // - Misc Food ------------------------------------------------------------ + class ACE_Sunflower_Seeds: ACE_ItemCore { + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(SunflowerSeeds_DisplayName); + descriptionShort = CSTRING(SunflowerSeeds_Description); + model = QPATHTOF(data\sunflower_seeds.p3d); + picture = QPATHTOF(ui\item_sunflowerseeds_co.paa); + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 3; + }; + XGVAR(consumeTime) = 10; + XGVAR(hungerSatiated) = 10; + XGVAR(consumeText) = CSTRING(EatingX); + }; }; diff --git a/addons/field_rations/config.cpp b/addons/field_rations/config.cpp index d7acbb66b1..d4d8674b80 100644 --- a/addons/field_rations/config.cpp +++ b/addons/field_rations/config.cpp @@ -21,7 +21,8 @@ class CfgPatches { "ACE_MRE_SteakVegetables_Item", "ACE_MRE_MeatballsPasta_Item", "ACE_MRE_ChickenHerbDumplings_Item", - "ACE_Humanitarian_Ration_Item" + "ACE_Humanitarian_Ration_Item", + "ACE_Sunflower_Seeds_Item" }; weapons[] = { "ACE_WaterBottle", @@ -41,7 +42,8 @@ class CfgPatches { "ACE_MRE_SteakVegetables", "ACE_MRE_MeatballsPasta", "ACE_MRE_ChickenHerbDumplings", - "ACE_Humanitarian_Ration" + "ACE_Humanitarian_Ration", + "ACE_Sunflower_Seeds" }; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interact_menu"}; diff --git a/addons/field_rations/data/sunflower_seeds.p3d b/addons/field_rations/data/sunflower_seeds.p3d new file mode 100644 index 0000000000..9febd9bba1 Binary files /dev/null and b/addons/field_rations/data/sunflower_seeds.p3d differ diff --git a/addons/field_rations/data/sunflower_seeds_co.paa b/addons/field_rations/data/sunflower_seeds_co.paa new file mode 100644 index 0000000000..d0d1c0421e Binary files /dev/null and b/addons/field_rations/data/sunflower_seeds_co.paa differ diff --git a/addons/field_rations/functions/fnc_drinkFromSource.sqf b/addons/field_rations/functions/fnc_drinkFromSource.sqf index e4a2c3ff67..1fee598ac6 100644 --- a/addons/field_rations/functions/fnc_drinkFromSource.sqf +++ b/addons/field_rations/functions/fnc_drinkFromSource.sqf @@ -63,11 +63,11 @@ private _fnc_condition = { [_player, _source] call FUNC(canDrinkFromSource) }; -private _sourceType = typeOf _source; -private _progressText = if (_sourceType == "") then { +private _sourceConfig = configOf _source; +private _progressText = if (isNull _sourceConfig) then { LLSTRING(DrinkingFromSource) } else { - format [LLSTRING(DrinkingFromX), getText (configFile >> "CfgVehicles" >> _sourceType >> "displayName")] + format [LLSTRING(DrinkingFromX), getText (_sourceConfig >> "displayName")] }; [ diff --git a/addons/field_rations/functions/fnc_getActionOffset.sqf b/addons/field_rations/functions/fnc_getActionOffset.sqf index f8cc392660..e0f11354c3 100644 --- a/addons/field_rations/functions/fnc_getActionOffset.sqf +++ b/addons/field_rations/functions/fnc_getActionOffset.sqf @@ -17,10 +17,10 @@ params ["_object"]; -private _typeOf = typeOf _object; -if (_typeOf != "") then { +private _configOf = configOf _object; +if !(isNull _configOf) then { // Check for offset in config since we have valid typeOf - private _offset = getArray (configFile >> "CfgVehicles" >> _typeOf >> QXGVAR(offset)); + private _offset = getArray (_configOf >> QXGVAR(offset)); if (_offset isEqualTo []) then {[0, 0, 0]} else {_offset}; } else { // Check for offset corresponding to p3d list diff --git a/addons/field_rations/functions/fnc_getRemainingWater.sqf b/addons/field_rations/functions/fnc_getRemainingWater.sqf index e2b2d56ed5..d5c8b3f85d 100644 --- a/addons/field_rations/functions/fnc_getRemainingWater.sqf +++ b/addons/field_rations/functions/fnc_getRemainingWater.sqf @@ -22,10 +22,10 @@ if (!alive _source) exitWith {0}; private _water = _source getVariable QGVAR(currentWaterSupply); if (isNil "_water") then { - private _typeOf = typeOf _source; - if (_typeOf != "") then { + private _configOf = configOf _source; + if !(isNull _configOf) then { // Check for waterSupply entry since we have valid typeOf - _water = getNumber (configFile >> "CfgVehicles" >> _typeOf >> QXGVAR(waterSupply)); + _water = getNumber (_configOf >> QXGVAR(waterSupply)); if (_water == 0) then {_water = REFILL_WATER_DISABLED}; if (_water != REFILL_WATER_DISABLED) then { diff --git a/addons/field_rations/stringtable.xml b/addons/field_rations/stringtable.xml index 373a16444c..ad5fea0e5c 100644 --- a/addons/field_rations/stringtable.xml +++ b/addons/field_rations/stringtable.xml @@ -4,14 +4,14 @@ ACE Field Rations ACE 戰地口糧 - ACE 干粮 + ACE 野战军粮 ACE Poměrové pole ACE Rations sur le terrain ACE Feld Rationen ACE Terepi adagok ACE Razioni di campo ACE フィールド レーション - ACE 필드 식량 + ACE 전투식량 ACE Racje polowe ACE Rações de campo ACE Полевые рационы @@ -22,22 +22,24 @@ ACE Field Rations HUD ACE Feldrationen HUD ACE 戰地口糧界面 + ACE 野战军粮界面 ACE フィールド レーション HUD ACE HUD Racji Polowych Индикаторы жажды и голода ACE Gıda Göstergesi + ACE 전투식량 HUD Indicates current hunger and thirst status. 顯示目前的飲食需求程度。 - 指示当前的饥饿和渴望状态。 + 显示当前的饮食需求状态。 Označuje aktuální stav hladovění a žízní. Indique l'état actuel de la faim et de la soif. Zeigt den aktuellen Hunger- und Durststatus an. Jelzi az éhínség és a szomjúság állapotát. Indica lo stato attuale di fame e sete. 現在の空腹感と渇きの状態を示します。 - 현재의 굶주림과 갈증 상태를 나타냅니다. + 굶주림과 갈증 정도를 표시합니다. Wskazuje bieżący status głodu i pragnienia. Indica o status atual de fome e sede. Указывают на текущий статус жажды и голода. @@ -54,7 +56,7 @@ Túlélés Sopravvivenza サバイバル - 활착 + 생존 Przetrwanie Sobrevivência Выживание @@ -68,18 +70,20 @@ Есть/Пить Yeme / Içme 食べる/飲む + 吃/喝 + 먹기/마시기 Enable/Disable Field Rations 啟用/禁用戰地口糧。 - 启用/禁用字段口粮 + 启用/禁用野战军粮 Povolit / zakázat příděly v polích Activer / désactiver les rations de champ Feldrationen aktivieren / deaktivieren Terepi adagok engedélyezése / letiltása Abilita / disabilita le razioni di campo フィールド レーションを有効/無効化します - 필드 배급량 활성화 / 비활성화 + 전투식량 활성화/비활성화 Włącz / wyłącz racje polowe Ativar / Desativar rações de campo Включение/отключение жажды и голода @@ -89,14 +93,14 @@ Time Without Water 水份需時 - 没有水的时候 + 脱水时间 Czas bez wody Temps sans eau Zeit ohne Wasser Víz nélküli idő Tempo senza acqua 水なしの時間 - 물없는 시간 + 물 없이 생존 가능 시간 Czas bez wody Tempo sem água Время без воды @@ -106,14 +110,14 @@ How long should a person be able to go without water (hours). 一個單位脫水之前能支撐多久(單位為小時)。 - 一个单位能够没有水的时间多少(小时) + 一个单位在脱水的情况下能够支撑多久(小时) Jak dlouho by měla jednotka jít bez vody (hodiny) Combien de temps une unité devrait-elle pouvoir se passer d'eau (heures)? Wie lange sollte eine Einheit ohne Wasser auskommen (Stunden)? Mennyi ideig kell egy egység víz nélkül (óra) Mennyi ideig kell egy egység víz nélkül (óra) ユニットが水なしでどれくらい時間を過ごすことができるか (一時間単位) - 한 유닛이 물없이 얼마나 오래 갈 수 있어야 하는가? (시간) + 물을 안 마시고 얼마나 생존할 수 있는지 정합니다 (시간) Jak długo jednostka powinna przetrwać bez wody (godziny) Quanto tempo uma unidade pode passar sem água (horas) Как долго персонаж может обходиться без воды (часы) @@ -123,14 +127,14 @@ Time Without Food 飢餓需時 - 没有食物的时间 + 饥饿时间 Čas bez jídla Temps sans nourriture Zeit ohne Essen Élelmiszer nélkül Tempo senza cibo 食べ物なしの時間 - 음식없는 시간 + 밥 없이 생존 가능 시간 Czas bez jedzenia Tempo sem comida Время без еды @@ -140,14 +144,14 @@ How long should a person be able to go without food (hours). 一個單位挨餓之前能支撐多久(單位為小時)。 - 一个单位能够没有食物的时间多少(小时) + 一个单位挨饿的情况下能够支撑多久(小时) Jak dlouho by měla jednotka jít bez jídla (hodiny) Combien de temps une unité doit-elle pouvoir se passer de nourriture (heures)? Wie lange sollte eine Einheit ohne Essen gehen können (Stunden)? Mennyi ideig kell egy egység élni nélkül (óra) Per quanto tempo un'unità dovrebbe essere in grado di andare senza cibo (ore) ユニットが食糧なしでどれくらい時間を過ごすことができるか (一時間単位) - 한 음식물이 음식 없이도 갈 수있는 시간 (시간) + 밥을 안 먹고 얼마나 생존할 수 있는지 정합니다 (시간) Jak długo jednostka powinna przetrwać bez jedzenia (godziny) Quanto tempo uma unidade pode ir sem alimentos (horas) Как долго персонаж может обходиться без пищи (часы) @@ -158,37 +162,45 @@ Thirst Quenched Durst gestillt 止渴程度 + 解渴程度 乾きの満たし Утоление жажды Pragnienie zaspokojone Susuzluk Giderme Katsayısı + 갈증 해소 Coefficient for the amount of thirst quenched from drinking. Koeffizient für die Menge des Dursts, der durch Trinken gestillt wird. 從飲用中能夠攝取多少水份。 + 通过喝水能够补充多少水份。 飲むことによって得られる乾きの満たし量の係数を設定します Коэффициент утоления жажды от питья Współczynnik ilości zaspokojnego pragnienia od picia Bir şey içince, susuzluğunun ne kadar giderileceğini belirler. + 마심으로써 갈증이 얼마나 해소되는지를 정합니다 Hunger Satiated Hunger gesättigt 飽足感 + 饱腹感 満腹感 Утоление голода Głód Zaspokojony Açlık Giderme Katsayısı + 배부름 Coefficient for the amount of hunger satiated from eating. Koeffizient für die Menge des Hungers, der durch essen gesättigt wird. 從飲食中獲取多少飽食感。 + 通过饮食能够补充多少能量。 食べることによって得られる満腹感の量の係数を設定します Коэффициент утоления голода от принятия пищи Współczynnik ilosci zaspokojnego głodu od jedzenia Bir şey yiyince, açlığın ne kadar giderileceğini belirler. + 밥을 먹어서 배고픔이 얼마나 해결되는지를 정합니다 Water Source Actions @@ -197,6 +209,8 @@ Su Içme Animasyonu 水源動作 Wasserquellen-Aktionen + 水源动作 + 물 근처 행동 Controls what actions are available on water sources. @@ -205,6 +219,8 @@ Su içerken hangi animasyonu yapacağını belirler 水源で可能な動作を設定します。 Bestimmt, welche Aktionen an Wasserquellen verfügbar sind. + 控制对水源可用的动作。 + 물가에서 어떤 행동을 취할지 정합니다 Refill Only @@ -213,6 +229,8 @@ Sadece içeceği iç 汲むだけ Nur Befüllen + 仅限取水 + 다시 채우기만 가능 Terrain Object Actions @@ -221,6 +239,8 @@ Varsayılan Nesne Animasyonu マップ オブジェクト動作 Geländeobjekt-Aktionen + 地形物体动作 + 지형 물체 상호작용 Enables water source actions for terrain objects. @@ -229,78 +249,96 @@ Varsayılan nesneler için animasyonu etkinleştir マップに存在するオブジェクトを水源として動作するよう設定できます。 Aktiviert Wasserquellen-Aktionen für Geländeobjekte. + 为地形物体启用水源动作。 + 지형 물체에서 물을 얻는 게 가능해집니다. Affect Advanced Fatigue Beeinflusst die erweiterte Ausdauer 與進階疲勞聯動 + 与进阶疲劳联动 アドバンスド ファティーグへの影響 Влияние на продвинутую усталость Wpływ na zaawansowane zmęczenie Gelişmiş Yorgunluk + 고급 피로도에 영향을 끼침 Controls if thirst and hunger should affect ACE Advanced Fatigue. Bestimmt, ob Durst und Hunger ACE Erweiterte Ausdauer beeinflussen sollen. 是否讓飲食影響到ACE的進階疲勞。 + 是否让饮食影响到 ACE 的进阶疲劳。 喉の渇きと空腹感が ACE アドバンスド ファティーグへ与える影響を決定します Определяет, будет ли жажда и голод влиять на продвинутую усталость ACE. Kontroluje czy pragnienie i głód mają wpływ na zaawansowane zmęczenie ACE. Acıkınca veya susayınca kişinin yorulup yorulmayacağını belirler. + 배고픔과 목마름이 고급 피로도에 영향을 끼칠지를 정합니다 HUD Type HUD Typ 界面類型 + 界面类型 HUD タイプ Typ HUD Тип индикаторов HUD Tipi + HUD 종류 Selects which HUD style will be used. Wählt, welcher HUD Stil benutzt wird. 選擇妳想使用的界面類型。 + 选择你想使用的界面类型。 使用する HUD のタイプを選択できます Wybierz który styl HUD będzie używany Выберите какой стиль индикаторов будет использован. Hangi HUD sitilini kullanılacağını seçer. + 사용될 HUD 스타일을 고르십시오. Colored Icons Farbige Icons 顏色化圖示 + 彩色图标 色付きアイコン Kolorowe ikony Цветные иконки Renkli Ikonlar + 색깔 아이콘 Draining Icons Farblose Icons 增減化圖示 + 渐化图标 ドレイン アイコン Ubywające ikony Исчезающие иконки Içi Boşalan Ikonlar + 빠지는 아이콘 HUD Show Level HUD zeigen Level 界面顯示程度 + 界面显示程度 HUD 表示レベル Widok HUD Уровень для отображения иконок HUD Gösterilme Seviyesi + HUD 표시 Automatically show the HUD when either thirst or hunger are above this level. Zeigt automatisch das HUD an, sobald Durst oder Hunger über diesem Level sind. 在飲食低於多少程度時顯示界面。 + 在饮食能量低于多少程度时显示界面。 この値以上に空腹感か乾きを感じると自動的に HUD を表示します Automatycznie pokaż HUD kiedy pragnienie albo głód przekroczy ten poziom Автоматически отображает иконки при достижении определенных уровней голода и жажды. Susuzluk veya açlık belli bir seviyenin altına inince otomatik olarak HUD u göster. + 정한 퍼센트 이하로 내려가면 HUD가 나타나게 합니다. Always @@ -323,19 +361,23 @@ Colored Icons - Transparency Farbige Icons - Transparenz 顏色化圖示 - 透明度 + 彩色图标—透明度 色付きアイコン - 透明度 Kolorowe ikony - transparentność Прозрачность цветных иконок Renkli Ikonlar - Şeffaflaşan + 색깔 아이콘 - 투명도 Controls the transparency of the Colored Icons HUD. Dynamic setting makes the HUD less transparent as thirst or hunger increase. Bestimmt die Tranzparenz der farbigen HUD Icons. Die Dynamische Einstellung macht das HUD weniger transparent, wenn Hunger oder Durst steigen. 控制顏色化圖示的透明度。設定為動態使其界面透明度與飲食需求一樣,越透明越需要。 + 控制彩色图标 HUD 的透明度。动态设置使 HUD 的透明度随着口渴或饥饿的增加而减弱。 Kontroluje transparentność kolorowych ikon HUD. Dynamiczne ustawienie zmniejsza przejrzystość wraz z zwiększeniem głodu czy pragnienia. 色付きアイコンの透明度を決定できます。動的に設定されると、喉の渇きや空腹感が増すにつれて、アイコンの透明度を下げます。 Настраивает прозрачность цветных иконок. «Динамическая» делает иконки менее прозрачными при увеличении жажды и голода. Renkli Simgeler Gösterge Paneli'nin şeffaflığını kontrol eder. Dinamik ayar, susuzluk veya açlık arttıkça HUD'yi daha az şeffaf hale getirir. + 색깔 아이콘의 투명도를 조절합니다. 동적 설정의 경우 배고픔이나 목마름이 해결되면 덜 투명하게 바뀝니다. Dynamic @@ -358,62 +400,76 @@ Water Supply Wasservorrat 飲用水補給 + 饮用水补给 水資源 Водные ресурсы Źródło wody + 식수 보급량 The amount of water available for ACE Field Rations water source actions (-1 disabled, -10 infinite) Die Menge des für ACE Feldrationen Wasserquellenaktionen verfügbaren Wassers (-1 ausgeschaltet, -10 unendlich) 水源可供補充飲用水的次數(-1為關閉,-10為無限次)。 + 水源可供取水的次数(-1为关闭,-10为无限次)。 ACE フィールド レーションで利用できる水源の量を設定できます。(-1で無効化、-10で無限) Количество воды, доступной для использования в ACE Полевые рационы. (-1 - отключено, -10 - бесконечно) Ilość wody dostępnej dla Akcji ACE Źródła wody (-1 wyłączone, -10 nieskończone) + ACE 전투식량 물 근처 행동에서 얼마나 물을 얻어 갈 수 있는지를 정합니다 (-1은 비활성화, -10은 무한대) Water Source Wasserquelle 水源 + 水源 水源 Źródło wody Источник воды Matara + 수원지 Check Remaining Water Überprüfe verbleibendes Wasser 檢查剩餘飲用水 + 检查剩余饮用水 残っている水を確認 Sprawdź ilość wody Проверить остаток воды Kalan Suyu Kontrol Et + 남은 물 확인 Checking remaining water... Überprüfe verbleibendes Wasser... 檢查剩下的飲用水... + 检查剩余饮用水中... 残っている水量を確認中です・・・ Sprawdzanie ilości wody Проверяется остаток воды... Kalan Su Kontrol Ediliyor... + 남은 물 확인 중... There are %1 litres left. Es sind %1 Liter übrig. 那還有 %1 公升 + 还剩下 %1 升 残り %1 リットル残っています。 Pozostało %1 litrów. Осталось %1 л воды %1 Litre kaldı. + %1 리터의 물이 남아있습니다. There is no water left. Es ist kein Wasser mehr übrig. 水已經用完了 + 水已经喝完了。 水はもうありません。 Nie ma wody Воды больше не осталось Hiç su kalmadı. + 물이 한 방울도 없습니다. Drink From Source @@ -422,18 +478,20 @@ Pij z źródła wody Mataradan Iç 水源から飲む + 从水源处喝水 + 수원에서 물 마시기 Refill 重新補充 - 笔芯 + 重新取水 Doplňte Recharge Nachfüllung Utántöltés Ricarica 汲む - 다시 채우다 + 다시 채우기 Uzupełnij Recarga Наполнить ёмкость @@ -443,14 +501,14 @@ Refilling... 補充中... - 加... + 取水中... Doplňování... Remplissage ... Nachfüllen... Utántöltés ... Ricarica ... 汲んでいます・・・ - 리필 중 ... + 채우는 중... Uzupełnianie ... Recarga ... Наполнение... @@ -460,14 +518,14 @@ Item Refilled 物品重新補充 - 项目重新填充 + 物品已重新补充 Položka je vyplněna Article rechargé Artikel nachgefüllt Újratöltött tétel Articolo riempito 中身がいっぱいになりました - 리필 품목 + 아이템 채워짐 Przedmiot uzupełniony Item Recarregado Ёмкость наполнена @@ -478,28 +536,34 @@ Eating %1... Esse %1... 食用 %1... + 食用 %1... %1を食べています・・・ Jedzenie %1... Поедание %1... %1 Yeniyor... + %1 먹는 중... Drinking %1... Trinke %1... 飲用自 %1... + 饮用 %1... %1を飲んでいます・・・ Picie %1... Выпивание %1... %1 Içiliyor... + %1 마시는 중... Drinking from %1... Trinke von %1... 飲用%1的水中... + 从%1饮用中... %1から飲んでいます・・・ Picie z %1... Выпивание из %1... %1 den içiliyor... + %1 으로 부터 마시는 중... Drinking from source... @@ -508,18 +572,20 @@ Mataradan Içiliyor... 水源から飲んでいます・・・ Trinke von Quelle... + 从水源处喝水中... + 수원에서 마시는 중... Water Bottle 飲用水 - 水瓶 + 矿泉水 Láhev na vodu Bouteille d'eau Wasserflasche Vizesüveg Bottiglia d'acqua ウォーターボトル - 물 병 + 물병 Butelka wody Garrafa de agua Бутылка воды (полная) @@ -529,7 +595,7 @@ A water bottle 一罐裝滿水的寶特瓶 - 一个水瓶 + 一罐装满水的矿泉水瓶 Láhev s vodou Une bouteille d'eau Eine Wasserflasche @@ -546,14 +612,14 @@ Water Bottle (Half) 飲用水(半罐) - 水瓶(一半) + 矿泉水(半瓶) Vodní láhev (poloviční) Bouteille d'eau (la moitié) Wasserflasche (Hälfte) Vízpalack (fél) Bottiglia d'acqua (metà) ウォーター ボトル (半分) - Garrafa de água (meio) + 물병 (절반) Butelka wody (połowa) Garrafa de água (meio) Бутылка воды (половина) @@ -563,14 +629,14 @@ A half full water bottle 一罐裝滿半罐水的寶特瓶 - 半满水瓶 + 半瓶矿泉水 Polní plná láhev s vodou Une bouteille d'eau à moitié pleine Eine halbvolle Wasserflasche Fél-teljes vizes palack Una mezza bottiglia piena d'acqua 半分入っているウォーター ボトル - 반만 물병 + 절반만 차 있는 물병입니다. Pół butelki z wodą Uma garrafa de água meia cheia Половина бутылки с водой @@ -580,7 +646,7 @@ Water Bottle (Empty) 空寶特瓶 - 水瓶(空) + 矿泉水(空) Láhev s vodou (prázdné) Bouteille d'eau (vide) Wasserflasche (leer) @@ -597,14 +663,14 @@ An empty water bottle 一個空寶特瓶 - 一个空的水瓶 + 一个空的矿泉水瓶 Prázdná láhev s vodou Une bouteille d'eau vide Eine leere Wasserflasche Egy üres palack Una bottiglia d'acqua vuota 空のウォーター ボトル - 빈 물병 + 빈 물병입니다 Pusta butelka wody Uma garrafa de água vazia Пустая бутылка @@ -614,14 +680,14 @@ Canteen 水壺 - 食堂 + 水壶 Jídelna Cantine Feldflasche Kantin Mensa 水筒 - 반합 + 수통 Manierka Cantina Фляга (полная) @@ -631,14 +697,14 @@ A canteen filled with water 一個裝滿水的水壺 - 一个装满水的食堂 + 一个装满水的水壶 Jídelna naplněná vodou Une cantine remplie d'eau Eine Feldflasche mit Wasser gefüllt Vízzel töltött kantin Una mensa piena d'acqua 水で一杯の水筒 - 물이 채워진 식당 + 물이 가득찬 수통입니다 Manierka wypełniona wodą Uma cantina cheia de água Фляга с водой @@ -648,14 +714,14 @@ Canteen (Half) 水壺(半罐) - 食堂(一半) + 水壶(半壶) Jídelna (poloviční) Cantine (Demi) Feldflasche (halb) Étkezés (fél) Mensa (metà) 水筒 (半分) - 캔틴 (하프) + 수통 (절반) Manierka (połowa) Cantina (meio) Фляга (половина) @@ -665,14 +731,14 @@ A canteen half filled with water 剩下一半水的水壺 - 食堂一半装满了水 + 剩一半水的水壶 Jídelna naplněná vodou Une cantine à moitié remplie d'eau Eine Feldflasche zur Hälfte mit Wasser gefüllt A vízzel töltött kantin Una mensa riempita per metà di acqua 半分入っている水筒 - 물이 담긴 식당 절반 + 반이 차 있는 수통입니다 Manierka w połowie wypełniona wodą Uma meia cantina cheia de água Наполовину заполненая водой фляга @@ -682,14 +748,14 @@ Canteen (Empty) 水壺(空) - 食堂(空) + 水壶(空) Jídelna (prázdné) Cantine (Vide) Feldflasche (leer) Étkezde (üres) Mensa (vuota) 水筒 (空) - 캔틴 (비어 있음) + 수통 (비어 있음) Manierka (pusta) Cantina (vazia) Фляга (пустая) @@ -699,14 +765,14 @@ An empty canteen 一個空的水壺 - 一个空的食堂 + 一个空的水壶 Prázdná jídelna Une cantine vide Eine leere Feldflasche Egy üres kantin Una mensa vuota 空の水筒 - 빈 수통 + 빈 수통입니다 Pusta manierka Uma cantina vazia Пустая фляга @@ -717,39 +783,45 @@ Refreshing lemon and lime flavored soft drink Ein erfrischender Softdrink mit Zitronen- und Limettengeschmack. 清新檸檬以及有著酸橙味的汽水 - 新鮮なレモンとライムの風味を味わえるソフト ドリンク + 清爽的柠檬和青柠味汽水 + 新鮮なレモンとライムの風味を味わえるソフトドリンク Odświeżający napój cytronowo-limonkowy Освежающий напиток со вкусом лимона и лайма Limon Ve Yeşil Limondan Yapılmış Gazlı Bir Içecek + 상쾌한 레몬라임향의 탄산음료 Orange flavored soft drink with a tingly, fruity taste Ein nach Orange schmeckender Softdrink mit einem prickelndem und fruchtigem Geschmack 有著微微的橘子水果味的汽水 - 口いっぱいに果物を感じるオレンジ風味のソフト ドリンク + 橙子味汽水,有刺鼻的水果味 + 口いっぱいに果物を感じるオレンジ風味のソフトドリンク Napój pomarańczowy Напиток с апельсиновым вкусом Gazlı Portakallı Bir Içecek + 오렌지 향의 톡쏘는 탄산음료 Red Gull gives you wings Red Gull verleiht Flügel 紅鷹讓你猛虎添翼 - レッドガルは翼をさずける + 红鹰让你猛虎添翼 + レッドガル 翼をさずける Red Gull doda ci skrzydeł Рэд Гулл окрыляет! Red Gull kanatlandırrrrr + 레드굴은 날개를 달아줘요 MRE Lamb Curry 軍糧 羊肉咖哩 - MRE羊肉咖喱 + 军粮羊肉咖喱饭 MRE jehněčí kari MRE Curry d'agneau EPA Lamm Curry MRE bárány Curry MRE Curry di agnello - MRE 羊カレー + MRE ラムカレー MRE 양고기 카레 MRE jagnięcina Curry MRE cordeiro ao Curry @@ -760,14 +832,14 @@ An MRE containing Lamb Curry. Heat for best effect 含有羊肉咖哩的軍用口糧。加熱以達到最佳效果 - 含有羊肉咖喱的MRE。加热以达到最佳效果 + 含有羊肉咖喱饭的军粮。加热以达到最佳效果 MRE obsahující Lamb Curry. Teplo pro nejlepší efekt Un MRE contenant du Curry d'agneau. Chaleur pour le meilleur effet Eine EPA mit Lamm Curry. Für den besten Geschmack erhitzen. Egy MRE, amely Lamb Curry-t tartalmaz. Hő a legjobb hatás érdekében Un MRE contenente Lamb Curry. Calore per il miglior effetto - 羊カレーの MRE。温めるとなお美味しい - 램 카레가 들어있는 MRE. 효과를 극대화하기위한 열기 + ラム(羊肉)カレーの MRE。温めるとなお美味しい + 양고기 카레가 들어있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające jagnięcine Curry. Podgrzej dla najlepszego efektu Um MRE contendo Lamb Curry. Calor para melhor efeito Сухой паёк, содержащий ягнятину карри. Перед употреблением рекомендуется разогреть @@ -778,30 +850,34 @@ MRE Beef Stew EPA Rindereintopf 軍糧 牛肉燉湯 - MRE ビーフ シチュー + 军粮炖牛肉汤 + MRE ビーフシチュー MRE Gulasz wołowy ИРП Тушеная говядина MRE Dana Yahni + MRE 비프스튜 An MRE containing Beef Stew. Heat for best effect Eine EPA, welche Rindereintopf beeinhaltet. Für den besten Geschmack erhitzen. 含有牛肉燉湯的軍用口糧。加熱以達到最佳效果 + 含有牛肉炖汤的军粮。加热以达到最佳效果 ビーフ シチューの MRE。温めるとなお美味しい MRE zawierające gulasz wołowy. Podgrzej dla najlepszego efektu Сухой паёк, содержащий тушеную говядину. Перед употреблением рекомендуется разогреть Sığır Yahni içeren bir MRE. + 비프스튜가 들어있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE Cream Tomato Soup 軍糧 奶油番茄湯 - MRE奶油西红柿汤 + 军粮奶油西红柿汤 MRE krémová rajská polévka MRE Soupe de tomate crème EPA Cremige Tomatensuppe MRE krémes paradicsomleves MRE Crema di pomodoro - MRE クリーム トマト スープ + MRE クリームトマトスープ MRE 크림 토마토 수프 MRE Kremowa Zupa Pomidorowa MRE Sopa de creme de tomate @@ -812,14 +888,14 @@ An MRE containing Cream Tomato Soup. Mix with water and heat for best effect 含有奶油番茄湯的軍用口糧。 用水和熱混合以獲得最佳效果 - 含有奶油番茄汤的MRE。 用水和热混合以获得最佳效果 + 含有奶油番茄汤的军粮。添水加热以获得最佳效果 MRE obsahující krémovou rajčatovou polévku. Směs s vodou a teplem pro nejlepší efekt Un MRE contenant de la soupe à la tomate et à la crème. Mélanger avec de l'eau et chauffer pour obtenir le meilleur effet Eine EPA mit Creme Tomatensuppe. Für beste Wirkung mit Wasser und Hitze mischen. Egy krémes paradicsomleveset tartalmazó MRE. Keverjük össze vízzel és hővel a legjobb hatás érdekében Un MRE contenente zuppa di pomodoro crema. Mescolare con acqua e calore per ottenere il massimo effetto - クリーム トマト スープの MRE。水と混ぜて温めるとなお美味しい - 크림 토마토 수프가 들어있는 MRE. 최상의 효과를 위해 물과 열을 함께 섞으십시오. + クリームトマトスープの MRE。水と混ぜて温めるとなお美味しい + 크림 토마토 수프가 들어 있는 MRE입니다. 물과 섞어 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające śmietanową zupę pomidorową. Wymieszaj z wodą i podgrzej, aby uzyskać najlepszy efekt Uma MRE contendo Cream Tomato Soup. Misture com água e calor para melhor efeito Сухой паёк, содержащий сублимированный томатный крем-суп. Перед употреблением растворить в воде и разогреть @@ -829,14 +905,14 @@ MRE Cream Chicken Soup 軍糧 奶油雞湯 - MRE奶油鸡汤 + 军粮奶油鸡汤 MRE krémová kuřecí polévka MRE Soupe à la crème au poulet EPA Cream Hühnersuppe MRE krémes csirke leves MRE Zuppa di pollo crema - MRE クリーム チキン スープ - MRE 크림 치킨 스프 + MRE クリームチキンスープ + MRE 크림 치킨 수프 MRE Kremowy Rosół MRE Sopa de creme de galinha ИРП Куриный крем-суп @@ -846,14 +922,14 @@ An MRE containing Chicken Soup. Mix with water and heat for best effect 含有雞湯的軍用口糧。 用水和熱混合以獲得最佳效果 - 含有鸡汤的MRE。 用水和热混合以获得最佳效果 + 含有鸡汤的军粮。添水加热以获得最佳效果 MRE obsahující kuřecí polévku. Směs s vodou a teplem pro nejlepší efekt Un MRE contenant une soupe au poulet. Mélanger avec de l'eau et chauffer pour obtenir le meilleur effet Eine EPA mit Hühnersuppe. Für beste Wirkung mit Wasser und Hitze mischen. A csirke leves tartalmú MRE. Keverjük össze vízzel és hővel a legjobb hatás érdekében Un MRE contenente zuppa di pollo. Mescolare con acqua e calore per ottenere il massimo effetto - チキン スープの MRE。水と混ぜて温めるとなお美味しい - 치킨 수프를 포함한 MRE. 최상의 효과를 위해 물과 열을 섞으십시오. + クリームチキンスープの MRE。水と混ぜて温めるとなお美味しい + 치킨 수프가 들어 있는 MRE입니다. 물과 섞어 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające rosół. Wymieszaj z wodą i podgrzej, aby uzyskać najlepszy efekt Um MRE contendo Sopa de Frango. Misture com água e calor para melhor efeito Сухой паёк, содержащий сублимированный куриный крем-суп. Перед употреблением растворить в воде и разогреть @@ -863,14 +939,14 @@ MRE Chicken Tikka Masala 軍糧 瑪撒拉雞 - MRE鸡蒂卡Masala + 军粮鸡蒂卡 Masala MRE Kuře Tikka Masala MRE Poulet Tikka Masala EPA Huhn Tikka Masala MRE csirke Tikka Masala MRE pollo Tikka Masala MRE チキン ティッカ マサラ - MRE 치킨 티카 마샬 라 + MRE 치킨 티카 마살라 MRE kurczak Tikka Masala MRE frango Tikka Masala ИРП Курица Тикка Масала @@ -880,14 +956,14 @@ An MRE with Chicken Tikka Masala. Heat for best effect 含有瑪撒拉雞的軍用口糧。 用水和熱混合以獲得最佳效果 - 与鸡Tikka马萨拉MRE。 加热以达到最佳效果 + 与鸡 Tikka 马萨拉军粮。加热以达到最佳效果 MRE s kuřecím masem Tikka Masala. Teplo pro nejlepší efekt Un MRE avec du poulet Tikka Masala. Chaleur pour le meilleur effet Eine EPA mit Hühnchen Tikka Masala. Für den besten Geschmack erhitzen. Egy MRE csirkével Tikka Masala. Hő a legjobb hatás érdekében Un MRE con pollo Tikka Masala. Calore per effetto migliore チキン ティッカ マサラの MRE。温めるとなお美味しい - 치킨 티 카 Masala와 MRE입니다. 최고의 효과 대 한 열 + 치킨 티카 마살라 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE z kurczakiem Tikka Masala. Podgrzej dla najlepszego efektu Um MRE com Frango Tikka Masala. Calor para melhor efeito Сухой паёк, содержащий Курицу Тикка Масала. Перед употреблением рекомендуется разогреть @@ -897,7 +973,7 @@ MRE Steak Vegetables 軍糧 牛排蔬菜 - MRE牛排蔬菜 + 军粮牛排蔬菜 MRE Steak zelenina MRE Steak légumes EPA Steak Gemüse @@ -914,14 +990,14 @@ An MRE containing Steak and Vegetables. Heat for best effect 包含牛排和蔬菜的軍用口糧。 加熱以達到最佳效果 - 包含牛排和蔬菜的MRE。 加热以达到最佳效果 + 包含牛排和蔬菜的军粮。加热以达到最佳效果 MRE obsahující steak a zeleninu. Teplo pro nejlepší efekt Un MRE contenant du bifteck et des légumes. Chaleur pour le meilleur effet Eine EPA mit Steak und Gemüse. Für den besten Geschmack erhitzen. Egy MRE, amely Steak és Zöldségeket tartalmaz. Hő a legjobb hatás érdekében Un MRE contenente bistecche e verdure. Calore per il miglior effetto 野菜とステーキの MRE。温めるとなお美味しい - 스테이크와 채소가 들어있는 MRE. 효과를 극대화하기위한 열기 + 스테이크와 채소가 들어 있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE zawierający stek i warzywa. Podgrzej dla najlepszego efektu Um MRE contendo Bife e Legumes. Calor para melhor efeito Сухой паёк, содержащий стейк с овощами. Перед употреблением рекомендуется разогреть @@ -931,14 +1007,14 @@ MRE Meatballs and Pasta 軍糧 肉丸和意大利麵 - MRE肉丸和意大利面 + 军粮肉丸和意大利面 MRE karbanátky a těstoviny MRE Pâtes aux boulettes de viande EPA Frikadellen und Pasta MRE húsgombóc és tészta MRE Pasta e polpette MRE ミートボールとパスタ - MRE 미트볼과 파스타 + MRE 미트볼 파스타 MRE Klopsiki i makaron MRE Macarrão com almôndegas ИРП Макароны с фрикадельками @@ -948,14 +1024,14 @@ An MRE containing Meatballs and Pasta. Heat for best effect 含有肉丸和意大利麵的軍用口糧。 加熱以達到最佳效果 - 含有肉丸和意大利面的MRE。 加热以达到最佳效果 + 含有肉丸和意大利面的军粮。加热以达到最佳效果 MRE obsahující maso a těstoviny. Teplo pro nejlepší efekt Un MRE contenant des boulettes de viande et des pâtes. Chaleur pour le meilleur effet Eine EPA mit Fleischbällchen und Pasta. Für den besten Geschmack erhitzen. Húsgombócokat és tésztát tartalmazó MRE. Hő a legjobb hatás érdekében Un MRE contenente polpette e pasta. Calore per il miglior effetto ミートボールとパスタの MRE。温めるとなお美味しい - 미트볼과 파스타를 포함한 MRE. 효과를 극대화하기위한 열기 + 미트볼과 파스타가 들어 있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE zawierające klopsiki i makaron. Podgrzej dla najlepszego efektu Um MRE contendo Meatballs e Pasta. Calor para melhor efeito Сухой паёк, содержащий макароны с фрикадельками. Перед употреблением рекомендуется разогреть @@ -965,14 +1041,14 @@ MRE Chicken with Herb Dumplings 軍糧 雞肉香草餃子 - MRE鸡肉香草饺子 + 军粮鸡肉香草饺子 MRE kuře s bylinkovým knedlíkem MRE de poulet avec des boulettes aux herbes EPA Huhn mit Kraut Knödel MRE csirke Herb galuskával MRE pollo con gnocchi alle erbe - MRE 鶏肉団子 - MRE 치킨 약초만 두 + MRE チキンとハーブ団子 + MRE 허브 치킨 만두 MRE kurczak z pierogami ziołowymi. MRE Frango com Dumplings de ervas ИРП Курица с клёцками @@ -982,14 +1058,14 @@ An MRE containing Chicken with Herb Dumplings. Heat for best effect 含有雞肉和香草餃子的軍用口糧。 加熱以達到最佳效果 - 含有鸡肉和香草饺子的MRE。 加热以达到最佳效果 + 含有鸡肉和香草饺子的军粮。加热以达到最佳效果 MRE obsahující kuře s bylinkovými knedlíky. Teplo pro nejlepší efekt Un MRE contenant du poulet et des dumplings aux fines herbes. Chaleur pour le meilleur effet Eine EPA mit Hühnchen mit Kräuterknödeln. Für den besten Geschmack erhitzen. Egy MRE, amely csirkét és fűszeres gombócokat tartalmaz. Hő a legjobb hatás érdekében Un MRE contenente pollo con gnocchi alle erbe. Calore per il miglior effetto - 鶏肉を団子で包んだ MRE。温めるとなお美味しい - 치킨과 허브 만두가 포함 된 MRE. 효과를 극대화하기위한 열기 + チキンとハーブ団子のMRE。温めるとなお美味しい + 허브 치킨 만두 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다 MRE z kurczakiem i pierogamii ziołowymi. Podgrzej dla najlepszego efektu Uma MRE que contém Bolinhos De Frango Com Erva. Calor para melhor efeito Сухой паёк, содержащий курицу с клёцками. Перед употреблением рекомендуется разогреть @@ -999,14 +1075,14 @@ Humanitarian Ration 人道主義口糧 - 人道主义配给 + 人道主义口粮 Humanitární poměr Ration humanitaire Humanitäre Ration Humanitárius értelemben Razione umanitaria 人道支援配給レーション - 인도주의 배급 + 난민배급식량 Racja humanitarna Ração Humanitária Гуманитарный сухой паёк @@ -1015,18 +1091,34 @@ A Humanitarian Ration intended to serve as a person's food supply during crises 人道主義口糧意圖在危機期間充當人的食物供應 - 人道主义配额意图在危机期间充当人的食物供应 + 用于危机期间个人食物供应的人道主义口粮。 Humanitární rada, která má sloužit jako zásobování potravinami během krizí Une ration humanitaire destinée à servir d'approvisionnement alimentaire en cas de crise Eine humanitäre Ration, die dazu bestimmt ist, in Krisenzeiten als Nahrung für eine Person zu dienen Humanitárius eloszlás, amelynek célja az ember élelmezési ellátottsága a válság idején Una razione umanitaria destinata a servire come riserva di cibo di una persona durante le crisi 人道危機を救う為に配布された食料品 - 위기 상황에서 식량 공급을위한 인도 주의적 식량 배급 + 재난 상황에 식량으로 쓸 수 있는 인도주의 차원의 배급식량입니다 Racja humanitarna, która ma służyć jako żywność dla danej osoby podczas kryzysów Uma Ração Humanitária destinada a servir como alimento alimentar de uma pessoa durante as crises Суточный рацион питания для обеспечения населения районов, охваченных гуманитарной катастрофой или стоящих на ее грани Una ración humanitaria destinada a servir como el suministro de alimentos de una persona durante las crisis + + Sunflower Seeds + Sonnenblumenkerne + 해바라기씨 + Nasiona Słonecznika + ヒマワリの種 + 葵花籽 + + + Roasted And Salted + Geröstet und Gesalzen + 굽고 간을 했습니다 + Pieczone i Solone + 炒って塩で味付け済 + 焙烤盐焗 + diff --git a/addons/field_rations/ui/item_sunflowerseeds_co.paa b/addons/field_rations/ui/item_sunflowerseeds_co.paa new file mode 100644 index 0000000000..178cea9964 Binary files /dev/null and b/addons/field_rations/ui/item_sunflowerseeds_co.paa differ diff --git a/addons/finger/functions/fnc_incomingFinger.sqf b/addons/finger/functions/fnc_incomingFinger.sqf index 24afac3c34..3980e1715d 100644 --- a/addons/finger/functions/fnc_incomingFinger.sqf +++ b/addons/finger/functions/fnc_incomingFinger.sqf @@ -27,7 +27,7 @@ private _fingerPos = if (_sourceUnit == ACE_player) then { TRACE_3("incoming finger:", _sourceUnit, _fingerPosPrecise, _fingerPos); -private _data = [diag_tickTime, _fingerPos, ([_sourceUnit, false, true] call EFUNC(common,getName))]; +private _data = [diag_tickTime, _fingerPos, ([_sourceUnit, false, true] call EFUNC(common,getName)), _sourceUnit]; GVAR(fingersHash) set [hashValue _sourceUnit, _data]; if (GVAR(pfeh_id) == -1) then { diff --git a/addons/finger/functions/fnc_perFrameEH.sqf b/addons/finger/functions/fnc_perFrameEH.sqf index e6056393b0..ece6d441d2 100644 --- a/addons/finger/functions/fnc_perFrameEH.sqf +++ b/addons/finger/functions/fnc_perFrameEH.sqf @@ -21,11 +21,11 @@ if !([ACE_player, ACE_player, ["isNotInside", "isNotSwimming"]] call EFUNC(commo // Make sure player is dismounted or in a static weapon: if ((ACE_player != vehicle ACE_player) && {!((vehicle ACE_player) isKindOf "StaticWeapon")}) then {GVAR(fingersHash) = createHashMap}; -private _iconSize = BASE_SIZE * 0.10713 * (call EFUNC(common,getZoom)); +private _iconBaseSize = GVAR(sizeCoef) * BASE_SIZE * 0.10713 * (call EFUNC(common,getZoom)); { //IGNORE_PRIVATE_WARNING ["_x", "_y"]; - _y params ["_lastTime", "_pos", "_name"]; + _y params ["_lastTime", "_pos", "_name", "_sourceUnit"]; private _timeLeftToShow = _lastTime + FP_TIMEOUT - diag_tickTime; if (_timeLeftToShow <= 0) then { GVAR(fingersHash) deleteAt _x; @@ -34,6 +34,11 @@ private _iconSize = BASE_SIZE * 0.10713 * (call EFUNC(common,getZoom)); // Fade out: _drawColor set [3, ((_drawColor select 3) * ((_timeLeftToShow min 0.5) / 0.5))]; + private _iconSize = _iconBaseSize; + if (GVAR(proximityScaling)) then { + _iconSize = _iconSize * linearConversion [0, GVAR(maxRange), (getPosASL ACE_player) vectorDistance (getPosASL _sourceUnit), 0.25, 2, true]; + }; + drawIcon3D [QPATHTOF(UI\fp_icon2.paa), _drawColor, ASLtoAGL _pos, _iconSize, _iconSize, 0, _name, 1, 0.03, "RobotoCondensed"]; }; } forEach GVAR(fingersHash); diff --git a/addons/finger/initSettings.sqf b/addons/finger/initSettings.sqf index 592b045629..79c129bc46 100644 --- a/addons/finger/initSettings.sqf +++ b/addons/finger/initSettings.sqf @@ -16,6 +16,22 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)]; 1 ] call CBA_fnc_addSetting; +[ + QGVAR(sizeCoef), "SLIDER", + [LSTRING(sizeCoef_displayName), LSTRING(sizeCoef_description)], + _category, + [0.1, 5, 1, 2], + 1 +] call CBA_fnc_addSetting; + +[ + QGVAR(proximityScaling), "CHECKBOX", + [LSTRING(proximityScaling_displayName), LSTRING(proximityScaling_description)], + _category, + false, + 1 +] call CBA_fnc_addSetting; + [ QGVAR(indicatorForSelf), "CHECKBOX", [LSTRING(indicatorForSelf_name), LSTRING(indicatorForSelf_description)], diff --git a/addons/finger/stringtable.xml b/addons/finger/stringtable.xml index e6e99803cc..780e1dfefa 100644 --- a/addons/finger/stringtable.xml +++ b/addons/finger/stringtable.xml @@ -6,7 +6,7 @@ Fingerzeig Puntamento 指向指示器 - 指向标记器 + 指向标记 指差し 가리키기 Pointage du doigt @@ -29,7 +29,7 @@ Puntamento abilitato 指差しを有効 가리키기 활성화 - 指向系统启动 + 启用指向系统 指向系統啟動 Señalado permitido Işaretleme Etkin @@ -38,7 +38,7 @@ Points, and shows a virtual marker of where you are looking to nearby units. Can be held down. Zeigt in der Nähe befindlichen Spielern die eigene Blickrichtung mit Hilfe eines Kreissymbols an. Permet d'effectuer un pointage du doigt, ce qui a pour effet d'afficher sur l'écran des joueurs alliés proches un marqueur virtuel, indiquant la direction dans laquelle vous regardez. Peut être maintenu. - Wskazuje a także wyświetla wirtualny marker-okrąg w miejscu, w które patrzysz, dla wszystkich pobliskich jednostek. Może być przytrzymywany. + Wskazuje a także wyświetla wirtualny znacznik - okrąg w miejscu, w które patrzysz, dla wszystkich pobliskich jednostek. Może być przytrzymywany. Mutat, és elhelyez egy virtuális jelölőt a nézett területhez közeli egységekhez. Lenyomva tartható. Aponta e mostra um marcador virtual para onde você está olhando para unidades próximas. Pode ser utilizado para baixo. Показывает пальцем и рисует виртуальный маркер в направлении взгляда ближайшим игрокам. Можно удерживать. @@ -46,7 +46,7 @@ Ukazuje virtuální značku kruhu ve směru, kterým se díváte pro všechny blízké jednotky. Punta e mostra un marker virtuale di dove stai guardando alle unità vicine. Può essere tenuto premuto. 指差し表記は自ユニットの近くにいる人のみに表記されます。また押しっぱなしにできます。 - 당신이 보는것을 가상의 마커로 표시함으로서 다른 인원이 볼 수 있게 합니다. 누른채로 유지할 수 있습니다. + 당신이 보는 것을 가상의 마커로 표시함으로서 다른 인원이 볼 수 있게 합니다. 누른 채로 유지할 수 있습니다. 当按下此按键后,你附近的单位即可看见一个虚拟图示,标明你正在指向的位置。此按键可以被按住来持续显示。 當按下此按鍵後,你附近的單位即可看見一個虛擬圖示,標明你正在指向的位置。此按鍵可以被按住來持續顯示。 Işaretleyince nereye baktığınıza dair sanal bir daire gösterir. Basılı da tutulabilir. @@ -81,10 +81,42 @@ Distanza massima tra giocatori per mostrare l'indicatore di puntamento [default: 4 metri] 指差し表記が他のプレイヤーに表示される範囲を決定できます。(標準 4 メートル) 플레이어 사이에서 가리키기 표시를 보이게 하는 최대거리를 설정합니다[기본설정: 4 미터] - 设定指向标记最大显示距离。[预设: 4公尺] + 设定指向标记最大显示距离。[预设:4米] 設定指向指示器最大顯示距離。[預設: 4公尺] Hangi uzaklıktakilerin sanal daireyi görmesini seçin. [Varsayılan : 4 metre] + + Visual Marker Size Coefficient + Visueller Markergrößenkoeffizient + 보이는 마커 크기 계수 + Współczynnik wielkości wirtualnego znacznika + 指さし表記大きさ係数 + 屏幕标记大小系数 + + + Adjusts the size of the visual marker. + Passt die Größe der visuellen Markierung an. + 눈에 보이는 마커의 크기를 조정합니다. + Dostosowuje rozmiar wirtualnego znacznika. + 指さし表記の大きさを調整します。 + 调整屏幕上显示的标记大小 + + + Proximity Scaling + Näherungsskalierung + 근접 스케일링 + Skalowanie odległościowe + 近接性スケーリング + 根据距离缩放 + + + Scales the size of the visual marker based on the distance between the player observing and the player pointing. + Skaliert die Größe der visuellen Markierung basierend auf der Entfernung zwischen dem beobachtenden Spieler und dem zeigenden Spieler. + 관찰하는 플레이어와 가리키는 플레이어 사이의 거리에 따라 보이는 마커의 크기를 조정합니다. + Skaluje rozmiar wirtualnego znacznika, na podstawie odległości między graczem obserwującym a graczem wskazującym. + 見ているプレーヤーと指さししたプレーヤーの距離に基づいて、指さし表記の大きさを調整します。 + 根据观察的玩家和在指出方向的的玩家之间的距离调整视觉标记的大小。 + Show pointing indicator to self Zeigersymbol einem selbst anzeigen @@ -165,7 +197,7 @@ Akce "ukázat prstem na" Azione "punta il dito a" "指差し"キー - "손가락으로 가리키기"행동 + "손가락으로 가리키기" 행동 使"手指指向在" 使"手指指向在" Animasyon "Parmakla Gösterme" @@ -182,7 +214,7 @@ Ukazuje virtuální značku kruhu ve směru, kterým se díváte pro všechny blízké jednotky. Punta e mostra un marker virtuale di dove stai guardando alle unità vicine. Può essere tenuto premuto. 指差し表記は自ユニットの近くにいる人のみに表記されます。また押しっぱなしにできます。 - 당신이 보는것을 가상의 마커로 표시함으로서 다른 인원이 볼 수 있게 합니다. 누른채로 유지할 수 있습니다. + 당신이 보는 것을 가상의 마커로 표시함으로서 다른 인원이 볼 수 있게 합니다. 누른 채로 유지할 수 있습니다. 当按下此按键后,你附近的单位即可看见一个虚拟图示,标明你正在指向的位置。此按键可以被按住来持续显示。 當按下此按鍵後,你附近的單位即可看見一個虛擬圖示,標明你正在指向的位置。此按鍵可以被按住來持續顯示。 Işaretleyince nereye baktığınıza dair sanal bir daire gösterir. Basılı da tutulabilir. diff --git a/addons/fire/XEH_postInit.sqf b/addons/fire/XEH_postInit.sqf index abda6c6578..655b55af19 100644 --- a/addons/fire/XEH_postInit.sqf +++ b/addons/fire/XEH_postInit.sqf @@ -3,7 +3,10 @@ [QGVAR(burn), FUNC(burn)] call CBA_fnc_addEventHandler; [QGVAR(playScream), { params ["_scream", "_source"]; - _source say3D _scream; + // only play sound if enabled in settings + if (GVAR(enableScreams)) then { + _source say3D _scream; + }; }] call CBA_fnc_addEventHandler; ["ace_settingsInitialized", { diff --git a/addons/fire/config.cpp b/addons/fire/config.cpp index ad67f9beab..3a8307de72 100644 --- a/addons/fire/config.cpp +++ b/addons/fire/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_medical_engine"}; author = ECSTRING(common,ACETeam); - authors[] = {"commy2", "Brandon (TCVM)"}; + authors[] = {"commy2", "Dani (TCVM)"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/fire/functions/fnc_burn.sqf b/addons/fire/functions/fnc_burn.sqf index 98f87fbcf9..15f38435ab 100644 --- a/addons/fire/functions/fnc_burn.sqf +++ b/addons/fire/functions/fnc_burn.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Makes object catch fire. Only call from events. Local effects only. * Arbitrary values to ignite people. Assumed maximum is "10". * @@ -137,7 +137,7 @@ if (_isBurning) exitWith {}; }; // always keep flare visible to perceiving unit as long as it isnt the player - if !(_unit isEqualTo ace_player) then { + if (_unit isNotEqualTo ace_player) then { private _relativeAttachPoint = [0, 0, 0.3]; if (_distanceToUnit > 1.5) then { _relativeAttachPoint = (vectorNormalized (_unit worldToModelVisual (getPos ace_player))) vectorMultiply linearConversion [5, 30, _distanceToUnit, 0.5, 1.5]; @@ -162,7 +162,7 @@ if (_isBurning) exitWith {}; [QGVAR(burn), [ace_player, _intensity * (7 / 8), _instigator]] call CBA_fnc_globalEvent; }; } else { - if ((ace_player isKindOf "Man") && { !(_unit isEqualTo ace_player) }) then { + if ((ace_player isKindOf "Man") && {_unit isNotEqualTo ace_player}) then { private _burnCounter = ace_player getVariable [QGVAR(burnCounter), 0]; if (_distanceToUnit < BURN_PROPOGATE_DISTANCE) then { if (_burnCounter < BURN_PROPOGATE_COUNTER_MAX) then { @@ -223,8 +223,8 @@ if (_isBurning) exitWith {}; }; } else { if ((animationState _unit) in PRONE_ROLLING_ANIMS) then { - // decrease intensity of burn, but if its too high this wont do anything substantial - _intensity = _intensity - (1 / _intensity); + // decrease intensity of burn + _intensity = _intensity * INTENSITY_DECREASE_MULT_ROLLING; }; }; @@ -237,7 +237,7 @@ if (_isBurning) exitWith {}; // keep pain around unconciousness limit to allow for more fun interactions [_unit, _intensity / MAX_INTENSITY, _woundSelection, "burn", _instigator] call EFUNC(medical,addDamageToUnit); } else { - [_unit, 0.15, _woundSelection, "unknown", _instigator] call EFUNC(medical,addDamageToUnit); + [_unit, 0.15, _woundSelection, "burn", _instigator] call EFUNC(medical,addDamageToUnit); }; }; _unit setVariable [QGVAR(intensity), _intensity, true]; // globally sync intensity across all clients to make sure simulation is deterministic @@ -279,7 +279,7 @@ if (_isBurning) exitWith {}; _lightFlare setLightFlareMaxDistance 100; _lightFlare setLightFlareSize 0; - if !(_unit isEqualTo ace_player) then { + if (_unit isNotEqualTo ace_player) then { private _relativeAttachPoint = (vectorNormalized (_unit worldToModelVisual (getPos ace_player))) vectorMultiply 1; _relativeAttachPoint set [2, 0.5]; _lightFlare attachTo [_unit, _relativeAttachPoint]; @@ -289,7 +289,7 @@ if (_isBurning) exitWith {}; if (isServer) then { _fireSound = createSoundSource ["Sound_Fire", _unitPos, [], 0]; - _fireSound attachTo [_unit, [0, 0, 0], "destructionEffect1"]; + _fireSound attachTo [_unit, [0, 0, 0], "Head"]; }; _unit setVariable [QGVAR(burning), true]; @@ -302,9 +302,7 @@ if (_isBurning) exitWith {}; _unit setVariable [QGVAR(burnUIPFH), _burnIndicatorPFH]; }; - private _soundID = floor (1 + random 15); - private _sound = format [QGVAR(scream_%1), _soundID]; - [QGVAR(playScream), [_sound, _unit]] call CBA_fnc_globalEvent; + [_unit, false] call FUNC(burnReaction); }; _lastIntensityUpdate = 0; diff --git a/addons/fire/functions/fnc_burnIndicator.sqf b/addons/fire/functions/fnc_burnIndicator.sqf index d5c9de25f3..6da7a83892 100644 --- a/addons/fire/functions/fnc_burnIndicator.sqf +++ b/addons/fire/functions/fnc_burnIndicator.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Run once per second in a PFH. Update screen effects with burn indicator. * * Arguments: diff --git a/addons/fire/functions/fnc_burnReaction.sqf b/addons/fire/functions/fnc_burnReaction.sqf index 3d21c091b9..87f6c2dbb3 100644 --- a/addons/fire/functions/fnc_burnReaction.sqf +++ b/addons/fire/functions/fnc_burnReaction.sqf @@ -1,10 +1,11 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM), veteran29 + * Author: Dani (TCVM), veteran29 * Handles burning reactions of an unit, like screaming or throwing the weapons away due to pain. * * Arguments: * 0: Unit + * 1: Should unit throw its current weapon * * Return Value: * None @@ -12,16 +13,19 @@ * Public: No */ -params ["_unit"]; +params ["_unit", ["_throwWeapon", true]]; if ( - GVAR(dropWeapon) > 0 - && {_unit in _unit && { !(currentWeapon _unit isEqualTo "") }} + _throwWeapon + && {GVAR(dropWeapon) > 0} + && {_unit in _unit && {(currentWeapon _unit) isNotEqualTo ""}} && {!isPlayer _unit || GVAR(dropWeapon >= 2)} ) then { [_unit] call EFUNC(hitreactions,throwWeapon); }; -private _soundID = floor (1 + random 15); -private _sound = format [QGVAR(scream_%1), _soundID]; -[QGVAR(playScream), [_sound, _unit]] call CBA_fnc_globalEvent; +if (_unit isKindOf "CAManBase") then { + private _soundID = floor (1 + random 15); + private _sound = format [QGVAR(scream_%1), _soundID]; + [QGVAR(playScream), [_sound, _unit]] call CBA_fnc_globalEvent; +}; diff --git a/addons/fire/functions/fnc_fireManagerPFH.sqf b/addons/fire/functions/fnc_fireManagerPFH.sqf index f52d5f31d5..ea5705c4e2 100644 --- a/addons/fire/functions/fnc_fireManagerPFH.sqf +++ b/addons/fire/functions/fnc_fireManagerPFH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Handles various fire objects and determines if local units deserves to get burned. * Used to handle external burning objects, not used internally because internal methods are more performant. * @@ -28,7 +28,7 @@ params ["_args", "_handle"]; _value params ["_source", "_radius", "_intensity"]; private _attachedObject = attachedTo _source; private _sourcePos = getPosATL _source; - if !(_attachedObject isEqualTo objNull) then { + if (_attachedObject isNotEqualTo objNull) then { _sourcePos = getPosATL _attachedObject; }; diff --git a/addons/fire/functions/fnc_medical_canPatDown.sqf b/addons/fire/functions/fnc_medical_canPatDown.sqf index 3bf959330f..b7f56e8bf2 100644 --- a/addons/fire/functions/fnc_medical_canPatDown.sqf +++ b/addons/fire/functions/fnc_medical_canPatDown.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Returns if unit can pat down fire or not. * * Arguments: diff --git a/addons/fire/functions/fnc_medical_progress.sqf b/addons/fire/functions/fnc_medical_progress.sqf index fc78befea0..67bca9b55d 100644 --- a/addons/fire/functions/fnc_medical_progress.sqf +++ b/addons/fire/functions/fnc_medical_progress.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Checks if patient is still burning for medical progress to continue. * * Arguments: diff --git a/addons/fire/functions/fnc_medical_success.sqf b/addons/fire/functions/fnc_medical_success.sqf index 8a37ebd76d..a47d4eb4f0 100644 --- a/addons/fire/functions/fnc_medical_success.sqf +++ b/addons/fire/functions/fnc_medical_success.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Decreases burning intensity on successful medical action. * * Arguments: @@ -19,5 +19,5 @@ params ["_medic", "_patient"]; private _intensity = _patient getVariable [QGVAR(intensity), 0]; -_intensity = _intensity * (4/5); +_intensity = _intensity * INTENSITY_DECREASE_MULT_PAT_DOWN; _patient setVariable [QGVAR(intensity), _intensity, true]; diff --git a/addons/fire/initSettings.sqf b/addons/fire/initSettings.sqf index c6855e9ae8..ff21b75ae4 100644 --- a/addons/fire/initSettings.sqf +++ b/addons/fire/initSettings.sqf @@ -29,3 +29,12 @@ ], true // isGlobal ] call CBA_fnc_addSetting; + +[ + QGVAR(enableScreams), "CHECKBOX", + [LSTRING(Setting_EnableScreams), LSTRING(Setting_EnableScreams_Description)], + LSTRING(Category_DisplayName), + true, + false // isGlobal +] call CBA_fnc_addSetting; + diff --git a/addons/fire/script_component.hpp b/addons/fire/script_component.hpp index 289e3d13f1..1bf14ca083 100644 --- a/addons/fire/script_component.hpp +++ b/addons/fire/script_component.hpp @@ -30,3 +30,6 @@ "amovppnemstpsoptwbindnon_amovppnemevasoptwbindl",\ "amovppnemstpsoptwbindnon_amovppnemevasoptwbindr"\ ] + +#define INTENSITY_DECREASE_MULT_PAT_DOWN 0.8 +#define INTENSITY_DECREASE_MULT_ROLLING INTENSITY_DECREASE_MULT_PAT_DOWN diff --git a/addons/fire/stringtable.xml b/addons/fire/stringtable.xml index fa383721bf..0f59b88693 100644 --- a/addons/fire/stringtable.xml +++ b/addons/fire/stringtable.xml @@ -8,6 +8,9 @@ ACE Возгорание ACE Feuer ACE Ogień + ACE Fuego + ACE 火 + ACE 불 Pat Down Fire @@ -16,14 +19,20 @@ Потушить Feuer löschen Zgaś ogień + Extingir el fuego + 灭火 + 불 끄기 - Patting Down Fire - 火を叩き消しています + Patting down fire... + 火を叩き消しています・・・ Feu en cours d'extinction... - Тушение + Тушение... Feuer wird gelöscht... - Gaszenie ognia + Gaszenie ognia... + Extinguiendo el fuego... + 正在灭火... + 불 끄는 중... Allow units to catch fire @@ -32,6 +41,9 @@ Включает возгорание Erlaubt, dass Einheiten Feuer fangen können Zezwól jednostkom na zapalenie się + Permitir que las unidades se incendien + 允许单位着火 + 유닛이 불에 붙게합니다 Enable fire-flare at night @@ -40,6 +52,9 @@ Включает сверкание пламени Aktiviert Feuerschein bei Nacht. Włącza efekt flary od ognia w nocy + Habilitar bengalas de fuego por la noche + 在夜间启用耀斑效果 + 밤에 불로 인한 조명 활성화 Uses a flare effect to increase fire intensity at night @@ -48,14 +63,45 @@ Включает ореол пламени для большей интенсивности ночью Benutzt einen Feuerschein-Effekt um die Intensität des Feuers bei Nacht zu verstärken. Używa efektu flary, aby zwiększyć jasność w nocy + Utiliza un efecto de bengala para aumentar la intensidad del fuego por la noche + 启用耀斑效果,增加夜间火焰的强度。 + 야간에 불로 인한 조명을 극대화 시킵니다 + + + Enable screams by units on fire + Habilitar los gritos de las unidades en llamas + 启用着火单位发出惨叫声 + 불 붙은 유닛 비명 + Schreie von brennenden Einheiten aktivieren + Włącz krzyki podpalonych jednostek + 炎上中の悲鳴を有効 + + + Enables if units on fire will play the screaming sound + Habilita si las unidades en llamas reproducirán el sonido de los gritos + 启用着火的单位是否会发出惨叫声。 + 불이 붙은 유닛이 소리를 지르게 합니다 + Aktiviert, ob brennende Einheiten den Schrei-Ton abspielen + Włącza, czy płonące jednostki będą odtwarzać dźwięk krzyku + 有効化すると炎上しているユニットが悲鳴を上げます Drop Weapons When on Fire + Soltar armas cuando esté en llamas Włącz wyrzucanie broni podczas płonięcia + 着火时扔掉武器 + 불 붙을 경우 무기 내려놓음 + Waffen fallen lassen, wenn in Brand geraten. + 炎上時に武器を落とす Controls whether units drop their weapons when on fire. + Controla si las unidades dejan caer sus armas cuando están en llamas Powoduje że jednostki wyrzucają swoją broń gdy płoną. + 控制单位在着火时是否丢掉武器。 + 유닛이 불에 붙이면 무기를 떨굴지를 결정합니다. + Steuert, ob Einheiten ihre Waffen fallen lassen, wenn sie brennen. + ユニットが炎上時に武器を落とすかどうかを定義します。 diff --git a/addons/flashlights/stringtable.xml b/addons/flashlights/stringtable.xml index 16aaea33e4..a212d17592 100644 --- a/addons/flashlights/stringtable.xml +++ b/addons/flashlights/stringtable.xml @@ -13,7 +13,7 @@ Fulton MX-991 フルトン MX-991 Fulton MX-991 - Fulton MX-991手电筒 + Fulton MX-991 手电筒 Fulton MX-991 Fulton MX-991 @@ -28,7 +28,7 @@ Torcia con filtro rosso. Da usare in mappa. Lampe torche avec un filtre rouge. Pour utilisation sur carte. 赤色フィルタ付きのフラッシュライト。地図上でつかいます。 - 빨간색 필터가 달린 손전등입니다. 지도를 비출때 씁니다. + 빨간색 필터가 달린 손전등입니다. 지도를 비출 때 씁니다. 拥有红色滤光片的手电筒。用来照亮地图。 擁有紅色濾光片的手電筒。用來照亮地圖。 Kırmızı filtreli el feneri. Harita üzerin de kullanım için. @@ -45,7 +45,7 @@ Maglite XL50 マグライト XL50 Maglite XL50 - Maglite XL50手电筒 + Maglite XL50 手电筒 Maglite XL50 Maglite XL50 @@ -60,7 +60,7 @@ Mini-torcia bianca. Da usare in mappa. Mini lampe torche blanche. Pour utilisation sur carte. 白色光の小さなフラッシュライト。地図上で使用します。 - 하얀색 조그마한 손전등. 지도를 비출때 씁니다. + 조그마한 하얀색 손전등. 지도를 비출때 씁니다. 白色的迷你手电筒。用来照亮地图。 白色的迷你手電筒。用來照亮地圖。 Beyaz küçük el feneri. Harita üzerin de kullanım için. @@ -77,7 +77,7 @@ KSF-1 KSF-1 KSF-1 - KSF-1手电筒 + KSF-1 手电筒 KSF-1 KSF-1 @@ -92,7 +92,7 @@ Torcia con filtro rosso. Da usare in mappa. Lampe torche avec un filtre rouge. Pour utilisation sur carte. 赤色フィルタ付きのフラッシュライト。地図上で使用します。 - 빨간색 필터가 달린 손전등입니다. 지도를 비출때 씁니다. + 빨간색 필터가 달린 손전등입니다. 지도를 비출 때 씁니다. 拥有红色滤光片的手电筒。用来照亮地图。 擁有紅色濾光片的手電筒。用來照亮地圖。 Kırmızı filtreli el feneri. Harita üzerin de kullanım için. @@ -102,7 +102,7 @@ Farbe des Kartenlichts Couleur de la lampe sur carte 光の色 - 地图上手电的颜色 + 手电在地图上光的颜色 地圖上使用手電筒的顏色 Colore della luce sulla mappa Kolor światła na mapie @@ -111,12 +111,14 @@ Barva svítilny na mapě Harita ışık rengi Color de luz sobre el mapa + 지도상 색상 Maglite ML300L Maglite ML300L Maglite ML300L Maglite ML300L + Maglite ML300L 强光手电筒 Maglite ML300L Maglite ML300L Maglite ML300L @@ -124,12 +126,14 @@ Maglite ML300L Maglite ML300L Maglite ML300L + Maglite ML300L Powerful LED flashlight. Leistungsstarke LED-Taschenlampe. Mocna latarka LED. 強大的LED手電筒 + 强光 LED 手电筒。 Torcia a LED ad alta potenza Silná LED svítilna. Puissante lampe torche à LED. @@ -137,6 +141,7 @@ Güçlü LED el feneri Linterna LED potente Мощный светодиодный фонарь. + 고휘도 LED 손전등. diff --git a/addons/flashsuppressors/stringtable.xml b/addons/flashsuppressors/stringtable.xml index 03b30aeeba..51db6008f2 100644 --- a/addons/flashsuppressors/stringtable.xml +++ b/addons/flashsuppressors/stringtable.xml @@ -13,9 +13,9 @@ Пламегаситель (6,5 мм) Bocacha (6,5 mm) 消炎器 (6.5 mm) - 소염기 (6.5 mm) - 消光器 (6.5 mm) - 消光器 (6.5 毫米) + 소염기 (6.5mm) + 消焰器(6.5 mm) + 消光器 (6.5 mm) Flash Suppressor (6.5 mm) @@ -30,8 +30,8 @@ Пламегаситель (7,62 мм) Bocacha (7,62 mm) 消炎器 (7.62 mm) - 소염기 (7.62 mm) - 消光器 (7.62 mm) + 소염기 (7.62mm) + 消焰器(7.62 mm) 消光器 (7.62 毫米) Flash Suppressor (7.62 mm) @@ -47,9 +47,9 @@ Пламегаситель (5,56 мм) Bocacha (5,56 mm) 消炎器 (5.56 mm) - 소염기 (5.56 mm) - 消光器 (5.56 mm) - 消光器 (5.56 毫米) + 소염기 (5.56mm) + 消焰器(5.56 mm) + 消光器 (5.56 mm) Flash Suppressor (5.56 mm) @@ -65,7 +65,7 @@ Bocacha (.45 ACP) 消炎器 (.45 ACP) 소염기 (.45 ACP) - 消光器 (.45 ACP) + 消焰器(.45 ACP) 消光器 (.45 ACP) Flash Suppressor (.45 ACP) @@ -81,8 +81,8 @@ Пламегаситель (9 мм) Bocacha (9 mm) 消炎器 (9 mm) - 소염기 (9 mm) - 消光器 (9 mm) + 소염기 (9mm) + 消焰器(9 mm) 消光器 (9 毫米) Flash Suppressor (9 mm) @@ -99,7 +99,7 @@ Bocacha (.338) 消炎器 (.338) 소염기 (.338) - 消光器 (.338) + 消焰器(.338) 消光器 (.338) Flash Suppressor (.338) @@ -115,8 +115,8 @@ Пламегаситель (9,3 мм) Bocacha (9,3 mm) 消炎器 (9.3 mm) - 소염기 (9.3 mm) - 消光器 (9.3 mm) + 소염기 (9.3mm) + 消焰器(9.3 mm) 消光器 (9.3 毫米) Flash Suppressor (9.3 mm) diff --git a/addons/fortify/XEH_PREP.hpp b/addons/fortify/XEH_PREP.hpp index b2feda35fa..785ba0a49f 100644 --- a/addons/fortify/XEH_PREP.hpp +++ b/addons/fortify/XEH_PREP.hpp @@ -15,3 +15,4 @@ ACEX_PREP(getPlaceableSet); ACEX_PREP(modifyAction); ACEX_PREP(setupModule); ACEX_PREP(buildLocationModule); +ACEX_PREP(createObjectMarker); diff --git a/addons/fortify/XEH_postInit.sqf b/addons/fortify/XEH_postInit.sqf index f14c4cb8f7..ed13a116c7 100644 --- a/addons/fortify/XEH_postInit.sqf +++ b/addons/fortify/XEH_postInit.sqf @@ -7,6 +7,15 @@ if (isServer) then { TRACE_3("objectPlaced",_unit,_side,_object); private _jipID = [QGVAR(addActionToObject), [_side, _object]] call CBA_fnc_globalEventJIP; [_jipID, _object] call CBA_fnc_removeGlobalEventJIP; // idealy this function should be called on the server + + if (GVAR(markObjectsOnMap) isNotEqualTo 0 && {_object isKindOf "Static"}) then { + // Wait ensures correct marker pos/rot as object is moved into position after creation + [ + FUNC(createObjectMarker), + [_unit, _object], + 1 + ] call CBA_fnc_waitAndExecute; + }; }] call CBA_fnc_addEventHandler; }; @@ -63,3 +72,35 @@ GVAR(objectRotationZ) = 0; [_object, 0, ["ACE_MainActions"], _removeAction] call EFUNC(interact_menu,addActionToObject); }; }] call CBA_fnc_addEventHandler; + +// Place object event handler +[QGVAR(deployFinished), { + params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; + _args params ["_unit", "_side", "_typeOf", "_posASL", "_vectorDir", "_vectorUp", "_cost"]; + + private _newObject = _typeOf createVehicle _posASL; + _newObject setPosASL _posASL; + _newObject setVectorDirAndUp [_vectorDir, _vectorUp]; + + // Server will use this event to run the jip compatible QGVAR(addActionToObject) event and create the related map marker + [QXGVAR(objectPlaced), [_unit, _side, _newObject]] call CBA_fnc_globalEvent; + + if (cba_events_control) then { + // Re-run if ctrl key held + [_unit, _unit, [_side, _typeOf, [GVAR(objectRotationX), GVAR(objectRotationY), GVAR(objectRotationZ)]]] call FUNC(deployObject); + }; + + // Reset animation + [_unit, "", 1] call EFUNC(common,doAnimation); +}] call CBA_fnc_addEventHandler; + +[QGVAR(deployCanceled), { + params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; + _args params ["_unit", "_side", "_typeOf", "_posASL", "_vectorDir", "_vectorUp", "_cost"]; + + // Refund if deploy was canceled + [_side, _cost] call FUNC(updateBudget); + + // Reset animation + [_unit, "", 1] call EFUNC(common,doAnimation); +}] call CBA_fnc_addEventHandler; diff --git a/addons/fortify/functions/fnc_createObjectMarker.sqf b/addons/fortify/functions/fnc_createObjectMarker.sqf new file mode 100644 index 0000000000..45c79e7dca --- /dev/null +++ b/addons/fortify/functions/fnc_createObjectMarker.sqf @@ -0,0 +1,48 @@ +#include "script_component.hpp" +/* + * Author: Seb + * Creates a map marker for a created static object but only for sides friendly to the creator side. + * + * Arguments: + * 0: Unit placing + * 1: Created fortify object + * + * Return Value: + * None + * + * Example: + * [player, cursorObject] call ace_fortify_fnc_createObjectMarker + * + * Public: No + */ + +params ["_unit", "_object"]; +TRACE_2("createObjectMarker",_unit,_object); + +// Get Object size and direction +private _bbr = 0 boundingBoxReal _object; +private _p1 = _bbr select 0; +private _p2 = _bbr select 1; +private _maxWidth = abs ((_p2 select 0) - (_p1 select 0)); +private _maxLength = abs ((_p2 select 1) - (_p1 select 1)); +private _direction = getDir _object; + +// Marker name unique to this object +private _markerNameStr = format [QGVAR(marker_%1), hashValue _object]; +private _channel = if (GVAR(markObjectsOnMap) == 2) then { 0 } else { 1 }; + +private _marker = createMarkerLocal [_markerNameStr, _object, _channel, _unit]; +TRACE_2("created",_marker,_channel); +_marker setMarkerShapeLocal "RECTANGLE"; +_marker setMarkerBrushLocal "SolidFull"; +_marker setMarkerSizeLocal [(_maxWidth / 2),(_maxLength / 2)]; +_marker setMarkerDirLocal _direction; +_marker setMarkerColor "ColorGrey"; +_object setVariable [QGVAR(mapMarker), _marker, false]; + +_object addEventHandler ["Deleted", { + params ["_object"]; + private _marker = _object getVariable QGVAR(mapMarker); + TRACE_2("cleaning up marker",_object,_marker); + deleteMarker _marker +}]; diff --git a/addons/fortify/functions/fnc_deployConfirm.sqf b/addons/fortify/functions/fnc_deployConfirm.sqf index d04124fd93..7e7570b705 100644 --- a/addons/fortify/functions/fnc_deployConfirm.sqf +++ b/addons/fortify/functions/fnc_deployConfirm.sqf @@ -20,24 +20,39 @@ params ["_unit", "_object"]; TRACE_2("deployConfirm",_unit,_object); private _side = side group _unit; -private _cost = [_side, typeOf _object] call FUNC(getCost); +private _typeOf = typeOf _object; +private _cost = [_side, _typeOf] call FUNC(getCost); [_side, -_cost] call FUNC(updateBudget); -private _typeOf = typeOf _object; private _posASL = getPosASL _object; private _vectorUp = vectorUp _object; private _vectorDir = vectorDir _object; deleteVehicle _object; -private _newObject = _typeOf createVehicle _posASL; -_newObject setPosASL _posASL; -_newObject setVectorDirAndUp [_vectorDir, _vectorUp]; +// Create progress bar to place object +private _totalTime = _cost * GVAR(timeCostCoefficient) + GVAR(timeMin); // time = Ax + b -// Server will use this event to run the jip compatible QGVAR(addActionToObject) event -[QXGVAR(objectPlaced), [_unit, _side, _newObject]] call CBA_fnc_globalEvent; +private _perframeCheck = { + params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; + _args params ["_unit", "_side", "_typeOf", "_posASL", "_vectorDir", "_vectorUp", "_cost"]; -if (cba_events_control) then { - // Re-run if ctrl key held - [_unit, _unit, [_side, _typeOf, [GVAR(objectRotationX), GVAR(objectRotationY), GVAR(objectRotationZ)]]] call FUNC(deployObject); + // Animation loop (required for longer constructions) + if (animationState _unit isNotEqualTo "AinvPknlMstpSnonWnonDnon_medic4") then { + // Perform animation + [_unit, "AinvPknlMstpSnonWnonDnon_medic4"] call EFUNC(common,doAnimation); + }; + + // Return true always + true }; + +[ + _totalTime, + [_unit, _side, _typeOf, _posASL, _vectorDir, _vectorUp, _cost], + QGVAR(deployFinished), + QGVAR(deployCanceled), + LLSTRING(progressBarTitle), + _perframeCheck +] call EFUNC(common,progressBar); + diff --git a/addons/fortify/initSettings.sqf b/addons/fortify/initSettings.sqf index 6ecb47444a..aa8d62f5c4 100644 --- a/addons/fortify/initSettings.sqf +++ b/addons/fortify/initSettings.sqf @@ -9,3 +9,36 @@ 2 ] ] call CBA_fnc_addSetting; + +[ + QGVAR(timeCostCoefficient), + "SLIDER", + [LLSTRING(settingHint_timeCostCoefficient), LLSTRING(settingHintDesc_timeCostCoefficient)], + LLSTRING(settingsCategory), + [0, 10, 1, 2], // Min, Max, Default, Trailing Decimals, is Percentage + true //isGlobal +] call CBA_fnc_addSetting; + +[ + QGVAR(timeMin), + "SLIDER", + [LLSTRING(settingHint_timeMin), LLSTRING(settingHintDesc_timeMin)], + LLSTRING(settingsCategory), + [0, 25, 1.5, 2], // Min, Max, Default, Trailing Decimals, is Percentage + true //isGlobal +] call CBA_fnc_addSetting; + +[ + QGVAR(markObjectsOnMap), + "LIST", + [LLSTRING(markObjectsOnMap), LLSTRING(markObjectsOnMapDesc)], + LLSTRING(settingsCategory), + [ + [0, 1, 2], + [LLSTRING(markObjectsOnMapNone), LLSTRING(markObjectsOnMapFriendly), LLSTRING(markObjectsOnMapEveryone)], + 1 + ], + true, + {}, + true +] call CBA_fnc_addSetting; diff --git a/addons/fortify/stringtable.xml b/addons/fortify/stringtable.xml index 3461791084..8e59c5dd76 100644 --- a/addons/fortify/stringtable.xml +++ b/addons/fortify/stringtable.xml @@ -7,7 +7,7 @@ 要塞 요새화 要塞 - 要塞 + 设防 Fortyfikowanie Фортификация Inşa Etme @@ -18,7 +18,7 @@ 要塞ツール 요새화 도구 要塞工具 - 要塞工具 + 设防工具 Narzędzie do fortyfikowania Инструмент строителя Inşa Etme Aleti @@ -40,7 +40,7 @@ 自動的に要塞ツールを追加 자동 추가 요새 항목 自動增加要塞物品 - 自动增加要塞物品 + 自动增加设防物品 Automatycznie dodaj narzędzie do fortyfikowania Автоматически добавлять Инструмент строителя Otomatik olarak inşa etme aletini ekle @@ -52,6 +52,8 @@ Inşa etme sistemini bazı temel parametrelerle başlatır. <br/> Ön ayarlar configFile ve missionConfigFile'dan alınır, format için wiki'ye bakın. 要塞システムを初期設定に戻します。<br/>プリセットは configfile と missionConfigFile から参照されます。詳細は wiki を参照してください。 Initialisiert das Verstärken-System, mit grundlegenden Einstellungen <br/>Vorseinstellungen werden aus der configFile und der missionConfigFile gezogen, für mehr Informationen: siehe das ACE Wiki. + 使用一些基本参数初始化设防系统。<br/>预设从 configFile 和 missionConfigFile 中提取,参见 wiki 的格式。 + 기본 파라미터와 함께 요새화 시스템을 활성화합니다<br/>configFile 과 missionConfigFile에서 프리셋을 뽑아옵니다, 포맷은 위키를 참조하십시오. Rotate @@ -83,7 +85,7 @@ Confirmar implantação ここで作る 설치 확인 - 确认布署 + 确认部署 確認佈署 Yerleştirmeyi Onayla @@ -92,20 +94,22 @@ Verstärken: Beschränke Baubereich 要塞: 構築制限エリア 要塞: 限制建造區 - 要塞: 限制建造区 + 设防:限制建造区 Fortyfikowanie: Limituj strefe budowania Фортификация: ограничить зону постройки Inşa Etme : Bölgede Inşa Etmeyi Limitle + 요새화: 건설 영역 제한 ACE Fortify ACE Verstärken ACE 要塞 - ACE 要塞 + ACE 设防 ACE 要塞 ACE Fortyfikowanie ACE Фортификация ACE Inşa Etme + ACE 요새화 Show budget updates @@ -116,6 +120,7 @@ Pokaż aktualizacje budżetu Показывать обновления бюджета Bütçe güncellenmelerini göster + 비용 업데이트 표시 Controls when budget update hints are shown @@ -126,6 +131,7 @@ Kontroluje kiedy aktualizacje budżetu są wyświetlane Настраивает сообщения об обновлении бюджета Bütçe güncellenince bilgi verilip verilmeyeceğini kontrol eder. + 어떤 행동을 취할 때 비용이 표시되는지를 결정합니다 Never show @@ -136,16 +142,18 @@ Nigdy Не показывать никогда Asla Gösterme + 안 보여줌 Has fortify tool Hat Bauewerkzeug 有要塞工具 - 有要塞工具 + 有设防工具 要塞ツール所持の時 Posiada narzędzie do fortyfikowania Если имеется Инструмент Insa Etme Aleti Olanlara Göster + 요새화 도구를 들고 있을 때 Always show @@ -156,6 +164,95 @@ Zawsze Показывать всегда Her Zaman Göster + 항상 보여줌 + + + Time-Cost Coefficient + 时间—成本系数 + 시간-가격 계수 + Zeit-Kosten-Koeffizient + 時間コスト係数 + + + Coefficient used to determine time to build structure.<br/>A in Ax + b where x is cost of object + 用于确定建造建筑所需时间的系数。<br/>A是 Ax+b中的一个参数,其中x是物体的成本 + 건축물을 지을 때 걸리는 시간을 계수를 적용하여 계산합니다. + Koeffizient zur Bestimmung der Bauzeit <br/>A in Ax + b, wobei x die Kosten des Objekts sind. + 建造する時間を決定するために使用される係数。<br/>計算式はAx + bです。この係数はAであり、xは建造物のコストです。 + + + Minimum Build Time + 最短建造时间 + 최소 건축 시간 + Minimale Bauzeit + 建造に掛かる最小の時間 + + + Minimum time to build any structure.<br/>b in Ax + b where x is cost of object + 建造任何建筑的最短时间。<br/>b是 Ax+b中的一个参数,其中x是物体的成本 + 건축물을 지을 때 걸리는 최소 시간을 계수를 적용하여 계산합니다. + Mindestzeit für den Bau eines beliebigen Bauwerks.<br/>b in Ax + b, wobei x die Kosten des Objekts sind. + 建造に掛かる最小の時間。<br/>計算式はAx + bです。この時間はbであり、xは建造物のコストです。 + + + Building + 建造 + 건설 중 + Bauwerk + 建造 + + + Create map markers + 创建地图标记 + 지도에 마커 생성 + Kartenmarkierungen erstellen + マップマーカーを生成する + + + Create map markers that look like terrain buildings when static fortifications are placed + 在放置静态防御工事时,创建看起来像地形建筑的地图标记 + 건축물을 건설하고 나서 지도에 마커를 생성합니다 + Erstellen von Kartenmarkierungen, die wie Gebäude im Gelände aussehen, wenn statische Befestigungen platziert werden + 静的な建築物が配置されたときに地形の建物のように見えるマップマーカーを生成します + + + Never + Nikdy + Nie + Никогда + Nigdy + Mai + Nunca + Jamais + 永不 + なし + 안 함 + Nunca + 永不 + Asla + + + For units friendly to the placer + 对放置者友军单位 + 아군 유닛이 지은 건물만 + Für, zum Erbauer, verbündete Einheiten. + 設置者の友軍に + + + For everyone + 所有人 + Pour tous + Para todos + Per tutti + Dla wszystkich + Для всех + Für alle + Pro všechny + Para todos + 모든 사람 + 针对每一个人 + 全員に + Herkes için Small @@ -164,6 +261,8 @@ Küçük 小型 Klein + 小型 + 소형 Small (Green) @@ -172,6 +271,8 @@ Küçük (Yeşil) 小型 (グリーン) Klein (Grün) + 小型(绿色) + 소형 (초목) Medium @@ -180,6 +281,8 @@ Orta 中型 Mittel + 中型 + 중형 Medium (Green) @@ -188,6 +291,8 @@ Orta (Yeşil) 中型 (グリーン) Mittel (Grün) + 中型(绿色) + 중형 (초목) Big @@ -196,6 +301,8 @@ Büyük 大型 Groß + 大型 + 대형 Big (Green) @@ -204,6 +311,8 @@ Büyük (Yeşil) 大型 (グリーン) Groß (Grün) + 大型(绿色) + 대형 (초목) diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf index 35b927e687..0fa693753e 100644 --- a/addons/frag/functions/fnc_addPfhRound.sqf +++ b/addons/frag/functions/fnc_addPfhRound.sqf @@ -60,7 +60,7 @@ if (alive _round) then { private _spallTrackID = []; private _args = [ - _round, getPosASL _round, velocity _round, _type, diag_frameno, _gun, _doSpall, _spallTrack, _spallTrackID, + _round, getPosASL _round, velocity _round, _type, diag_frameno, getPosASL _round, _doSpall, _spallTrack, _spallTrackID, getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip)), getNumber (configFile >> "CfgAmmo" >> _type >> "explosive"), getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"), diff --git a/addons/frag/functions/fnc_pfhRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf index 4d5e9b2e99..de7dcadfc9 100644 --- a/addons/frag/functions/fnc_pfhRound.sqf +++ b/addons/frag/functions/fnc_pfhRound.sqf @@ -15,7 +15,7 @@ * Public: No */ -params ["_round", "_lastPos", "_lastVel", "_shellType", "_firedFrame", "_gun", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; +params ["_round", "_lastPos", "_lastVel", "_shellType", "_firedFrame", "_firedPos", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; if (_round in GVAR(blackList)) exitWith { false @@ -26,13 +26,10 @@ if (!alive _round) exitWith { if (_skip == 0) then { if ((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1}) then { // shotbullet, shotShell don't seem to explode when touching water, so don't create frags - if (((_lastPos select 2) < 0) && {(toLower getText (configFile >> "CfgAmmo" >> _shellType >> "simulation")) in ["shotbullet", "shotshell"]}) exitWith {}; - private _isArmed = true; - if (!isNil "_gun") then { - private _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); - _isArmed = ((getPosASL _gun) distance _lastPos > _fuseDist); - TRACE_2("",_fuseDist,_isArmed); - }; + if ((surfaceIsWater _lastPos) && {(toLower getText (configFile >> "CfgAmmo" >> _shellType >> "simulation")) in ["shotbullet", "shotshell"]}) exitWith {}; + private _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); + private _isArmed = _firedPos vectorDistance _lastPos >= _fuseDist; // rounds explode at exactly fuseDistance, so check inclusive + TRACE_2("",_fuseDist,_isArmed); if (!_isArmed) exitWith {TRACE_1("round not armed",_this);}; TRACE_3("Sending frag event to server",_lastPos,_lastVel,_shellType); [QGVAR(frag_eh), [_lastPos,_lastVel,_shellType]] call CBA_fnc_serverEvent; diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 34a755f87e..1ece6a973e 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -13,8 +13,8 @@ Симуляция осколков Simulazione Frammentazione 破片シミュレーション - 조각 시뮬레이션 - 模拟碎片 + 파편화 시뮬레이션 + 破片模拟 模擬碎片 @@ -29,8 +29,8 @@ Симуляция осколков Simulazione Frammentazione 破片シミュレーション - 조각 시뮬레이션 - 模拟碎片 + 파편화 시뮬레이션 + 破片模拟 模擬碎片 @@ -45,8 +45,8 @@ Включить симуляцию осколков ACE Abilita la Simulazione Frammentazione di ACE ACE 破片シミュレーションを有効化 - ACE 조각 시뮬레이션을 적용합니다. - 启用ACE模拟碎片 + ACE 파편화 시뮬레이션을 적용합니다. + 启用 ACE 破片模拟 啟用ACE模擬碎片 @@ -61,7 +61,7 @@ Симуляция обломков Simulazione Spalling 剥離シミュレーション - 파편 시뮬레이션 + 탄환파편 시뮬레이션 模拟剥落 模擬剝落 @@ -77,8 +77,8 @@ Включить симуляцию обломков ACE Abilita la Simulazione Spalling di ACE ACE 剥離シミュレーションを有効化 - ACE 파편 시뮬레이션을 적용합니다. - 启用ACE模拟剥落 + ACE 탄환파편 시뮬레이션을 적용합니다. + 启用 ACE 模拟剥落 啟用ACE模擬剝落 @@ -107,7 +107,7 @@ Включить симуляцию отражения взрывов ACE 爆発による飛翔シミュレーションを有効化 ACE 폭발 반사 시뮬레이션을 적용합니다. - 启用ACE模拟爆炸反射 + 启用 ACE 模拟爆炸反射 啟用ACE模擬爆炸反射 Povolit ACE simulaci odrazu exploze @@ -124,7 +124,7 @@ Numero massimo di Proiettili Tracciati 最大弾頭追跡数 최대 발사체 추적수 - 最大碎片粒子追踪数量 + 最大破片粒子追踪数量 最大碎片/剝落粒子追蹤數量 @@ -139,8 +139,8 @@ Эта настройка контролирует максимальное количество снарядов, которок отслеживает система осколков и обломков в каждый момент времени. Снаряды, выстреленные сверх этого числа, отслеживаться не будут. Уменьшите это значение, если вы не хотите падения FPS при большом количестве снарядов в одной перестрелке (> 200 одновременно летящих снарядов) Questo parametro controlla il numero massimo di proiettili che la frammentazione e il sistema di spalling tracciano in ogni momento. Se più proiettili sono sparati, non verranno tracciati. Abbassa questo parametro se non vuoi cali di FPS in scenari con molti proiettili (>200 proiettili in aria contemporaneamente) 時間が許すかぎり、破片と剥離システムの最大数を設定できます。設定数以上の弾丸が発射された場合、それは対象になりません。もし多い弾数による FPS の低下を望まない場合は、低い数へ設定にします。( &gt;一度に空中内で200発) - 이 설정은 조각 및 파편 시스템으로 인해 생긴 발사체의 수를 결정합니다. 만약 더 많은 발사체가 나올경우 정해진 수 이외에는 추적하지 않습니다. 이 설정을 낮춤으로써 파편이 많은 시나리오를 실행할때 더욱 원활히 진행할 수 있습니다 (한 번에 200개 이하) - 设定在指定时间内,系统最大可追踪的碎片粒子数量。如有更多的碎片在这之后产生,这些粒子将不会被追踪。如果你想要维持好的帧数,此设定勿调的过高。( >一次200颗粒子) + 이 설정은 탄환파편 및 파편 시스템으로 인해 생긴 발사체의 수를 결정합니다. 만약 더 많은 발사체가 나올 경우 정해진 수 이외에는 추적하지 않습니다. 이 설정을 낮춤으로써 파편이 많은 시나리오를 실행할때 더욱 원활히 진행할 수 있습니다 (한 번에 200개 이하) + 设定在指定时间内,系统最大可追踪的破片粒子数量。如有更多的碎片在这之后产生,这些粒子将不会被追踪。如果你想要维持好的帧数,此设定勿调的过高。( >一次200颗粒子) 設定在指定時間內,系統最大可追蹤的碎片/剝落粒子數量。如有更多的碎片在這之後產生,這些粒子將不會被追蹤。如果你想要維持好的幀數,此設定勿調的過高。( >一次200顆粒子) @@ -155,8 +155,8 @@ Макс. количество снарядов за кадр Numero massimo di proiettili per Frame フレームごとの最大弾頭数 - 프레임당 최대 발사체 수 - 每一帧数(FPS)最大碎片粒子数量 + 프레임 당 최대 발사체 수 + 每帧最大破片粒子数量 每一幀數(FPS)最大碎片/剝落粒子數量 @@ -172,7 +172,7 @@ Il numero di calcoli per tracciamento di spalling ad ogni frame. Questo aiuta a distribuire l'impatto del tracciamento dello spalling su più frame, limitando ancora di più l'impatto. 与えられたフレームごとに追跡する剥離の数を決定します。FPS に影響をあたえないよう、剥離を複数のフレームで追跡し、分散させています。 가능한 프레임마다 파편을 추적 및 계산합니다. 여러 프레임에 걸쳐 파편난 발사체를 추적하여 FPS에 도움을 줍니다. 이를 제한함으로써 더욱 큰 효과를 볼 수 있습니다. - 设定在每一帧数内,系统最大可追踪的碎片粒子数量。此设定可有效帮助系统减低计算压力。 + 设定在每一帧数内,系统最大可追踪的破片粒子数量。此设定可有效帮助系统减低计算压力。 設定在每一幀數內,系統最大可追蹤的碎片/剝落粒子數量。此設定可有效幫助系統減低計算壓力 @@ -187,8 +187,8 @@ (Только для одиночной игры) Отслеживаение/отладка осколков (Solo SP) Debug Tracciamento Frag/Spall (SP のみ) 破片/剥離のデバッグ用表示 - (싱글플레이 전용) 조각/파편 디버그 추적화 - (仅在单人模式) 追踪显示碎片粒子 + (싱글플레이 전용) 탄환파편/파편 디버그 추적화 + (仅单人)追踪显示破片粒子 (僅在單人模式) 碎片/剝落除錯追蹤 @@ -203,9 +203,9 @@ (Только для одиночной игры) Требует перезапуска миссии/редактора. Включает визуальные следы от осколков и обломков в режиме одиночной игры. (Solo SP) Richiede un restart editor/missione. Abilita il tracciamento visivo di schegge da frammentazione/spalling in modalità Giocatore Singolo. (SP のみ) ミッションとエディタの再起動が必要です。有効化すると、シングルプレイでのみ破片と剥離の弾頭が見えるようになります。 - (仅在单人模式) 激活后,只有在单人模式下才可观察到碎片粒子的移动轨迹。 + (仅单人)激活后,只有在单人模式下才可观察到破片粒子的移动轨迹。 (僅在單人模式) 讓你在單人模式下可觀察到碎片/剝落粒子的移動軌跡 - (SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 조각화 및 스 폴링 라운드의 시각적 추적을 가능하게합니다. + (SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 파편화 및 탄환파편의 시각적 추적을 가능하게 합니다. diff --git a/addons/gestures/stringtable.xml b/addons/gestures/stringtable.xml index a9db468cdb..8d77e28a83 100644 --- a/addons/gestures/stringtable.xml +++ b/addons/gestures/stringtable.xml @@ -98,7 +98,7 @@ Seguir Seguire ついて来い - 따라올것 + 따라와 跟进 跟進 Takip Et @@ -230,7 +230,7 @@ Ingaggiare Atacar 交戦しろ - 교전할것 + 교전 交战 交戰 Tut @@ -295,7 +295,7 @@ Показать жесты в меню взаимодействия インタラクション メニュー上でジェスチャー表示 수신호를 상호작용 메뉴에서 보여줍니다 - 显示手势互动选单 + 显示手势互动菜单 顯示手勢互動選單 Hareketleri Etkileşim Menüsünde Göster @@ -311,7 +311,7 @@ Показать жесты в меню взамиодейтсвия с собой или только использовать горячие клавиши, или полностью отключить キー操作や同時使用を無効化している場合はセルフ インタラクション メニュ上でジェスチャーを表示します 수신호를 상호작용 메뉴에서 보여주거나 혹은 단축키를 지정하거나 아니면 아예 사용하지 않습니다. - 显示手势选项在自己的互动选单上,或只利用键盘来使用手势,或完全禁用 + 显示手势选项在自己的互动菜单上,或只利用键盘来使用手势,或完全禁用 顯示手勢選項在自己的互動選單上,或只利用鍵盤來使用手勢,或完全禁用 Kendi kendine etkileşim menüsünde hareketleri göster veya sadece tuş atamaları kullan veya tamamen devre dışı bırak. @@ -342,8 +342,8 @@ Atalhos + Menu de Interação Клавиши + Меню взаимодействия キー操作とインタラクション メニュ - 단축키및 상호작용 메뉴 - 键盘 + 互动选单 + 단축키 및 상호작용 메뉴 + 键盘 + 互动菜单 鍵盤 + 互動選單 Tuş Atamaları + Etkileşim Menüsü diff --git a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf index 77f144e2f7..990d754f54 100644 --- a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf +++ b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf @@ -61,7 +61,7 @@ if (_count > 0) then { }; private _classCoef = (ACE_player getVariable ["ACE_GForceCoef", - getNumber (configFile >> "CfgVehicles" >> (typeOf ACE_player) >> "ACE_GForceCoef")]) max 0.001; + getNumber ((configOf ACE_player) >> "ACE_GForceCoef")]) max 0.001; private _suitCoef = if ((uniform ACE_player) != "") then { (getNumber (configFile >> "CfgWeapons" >> (uniform ACE_player) >> "ACE_GForceCoef")) max 0.001 } else { @@ -71,7 +71,7 @@ private _suitCoef = if ((uniform ACE_player) != "") then { private _gBlackOut = MAXVIRTUALG / _classCoef + MAXVIRTUALG / _suitCoef - MAXVIRTUALG; // Unconsciousness -if ((_average > _gBlackOut) and {isClass (configFile >> "CfgPatches" >> "ACE_Medical") and {!(ACE_player getVariable ["ACE_isUnconscious", false])}}) then { +if ((_average > _gBlackOut) && {["ACE_Medical"] call EFUNC(common,isModLoaded) && {!(ACE_player getVariable ["ACE_isUnconscious", false])}}) then { [ACE_player, true, (10 + floor(random 5)), true] call EFUNC(medical,setUnconscious); }; diff --git a/addons/gforces/stringtable.xml b/addons/gforces/stringtable.xml index 3831ec8739..5628d3d197 100644 --- a/addons/gforces/stringtable.xml +++ b/addons/gforces/stringtable.xml @@ -10,6 +10,8 @@ ACE G-Kuvveti ACE Fuerza G ACE G-Kräfte + ACE G力 + ACE 중력가속도 Gforces Effects @@ -39,7 +41,7 @@ Tylko samoloty 비행기에만 적용 Solo Aerei - 只有战斗机 + 仅飞行器 只有戰鬥機 Sadece Uçaklar @@ -57,6 +59,7 @@ Redukce G Force Reducción de fuerzas G G-Kuvvetinde azalma + 중력가속도 감소 G-Force Coefficient @@ -67,6 +70,8 @@ G-Kuvvet Katsayısı Coeficiente de Fuerza G G-Kräfte-Koeffizient + G力系数 + 중력가속도 계수 Controls strength of G-Force affecting players. @@ -77,6 +82,8 @@ Oyuncuları etkileyen G-Force'un gücünü kontrol eder. Controla la intensidad de fuerza G que afecta a los jugadores. Bestimmt, wie stark G-Kräfte Spieler beeinflussen. + 控制影响玩家的G力的强度。 + 플레이어에게 영향을 끼칠 중력가속도의 계수를 조절합니다. diff --git a/addons/goggles/config.cpp b/addons/goggles/config.cpp index 4718662e62..5d33d5ea19 100644 --- a/addons/goggles/config.cpp +++ b/addons/goggles/config.cpp @@ -235,12 +235,15 @@ class CfgGlasses { ACE_OverlayCracked = ""; ACE_Resistance = 2; ACE_Protection = 1; + ACE_Overlay_Angle = 180; }; class G_AirPurifyingRespirator_02_base_F: G_AirPurifyingRespirator_01_base_F { ACE_Overlay = "a3\ui_f_enoch\data\objects\data\optics_APR_02_CA.paa"; }; class G_RegulatorMask_base_F: None { ACE_Overlay = "a3\ui_f_enoch\data\objects\data\optics_regulator_ca.paa"; + ACE_OverlayCracked = ""; + ACE_Overlay_Angle = 180; }; }; diff --git a/addons/goggles/functions/fnc_applyGlassesEffect.sqf b/addons/goggles/functions/fnc_applyGlassesEffect.sqf index 4c0b8dd1df..cc9c69681d 100644 --- a/addons/goggles/functions/fnc_applyGlassesEffect.sqf +++ b/addons/goggles/functions/fnc_applyGlassesEffect.sqf @@ -44,10 +44,16 @@ if (_postProcessTintAmount != 0 && {GVAR(UsePP)} && GVAR(effects) in [1, 2]) the }; private _imagePath = getText (_config >> ["ACE_Overlay", "ACE_OverlayCracked"] select GETBROKEN); +private _angle = getNumber (_config >> "ACE_Overlay_Angle"); if (_imagePath != "") then { GVAR(GogglesLayer) cutRsc ["RscACE_Goggles", "PLAIN", 1, false]; - (GLASSDISPLAY displayCtrl 10650) ctrlSetText _imagePath; + private _overlay = (GLASSDISPLAY displayCtrl 10650); + _overlay ctrlSetText _imagePath; + + if ((_angle != 0) && {((ctrlAngle _overlay) # 0) != _angle}) then { + _overlay ctrlSetAngle [_angle, 0.5, 0.5, true]; + }; }; if (GVAR(effects) in [2, 3]) then { diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml index 8d5005660e..062238106b 100644 --- a/addons/goggles/stringtable.xml +++ b/addons/goggles/stringtable.xml @@ -45,7 +45,7 @@ Mostrar efeitos de óculos em Terceira Pessoa Attiva l'effetto degli occhiali in terza persona 三人称視点でもゴーグルによる効果を表示 - 3인칭시에도 고글 효과를 보이게 합니다 + 3인칭 시에도 고글 효과를 보이게 합니다 在第三人称视角显示护目镜效果 在第三人稱視角顯示護目鏡效果 Gözlük efektlerini 3. şahıs görünümün de göster @@ -92,7 +92,7 @@ 색조 Teinte Colore - 染色 + 着色 染色 Cor Zabarvení @@ -124,7 +124,7 @@ 색조+효과 Teinte + effets Colore + Effetti - 染色 + 影响 + 着色 + 效果 染色 + 影響 Cor + Efeitos Zabarvení + Efekty @@ -139,11 +139,13 @@ Ukaž Vyčistit brýle v menu Interakce (vlastní) ゴーグル拭き取りをセルフ インタラクションに表示 在自我互動中顯示擦拭護目鏡的動作 + 在自我互动中显示擦拭护目镜的动作 Afficher l'interaction "Essuyer les lunettes" Mostra a auto-interação de limpar os óculos Mostrar limpiar gafas en menú de auto-interacción Kendi etkileşim menüsün de gözlük camlarını silmeyi göster Показывать Протереть очки в меню взаимодействия с собой + 자기상호작용에 고글 닦기 선택 보이기 diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 07b74b7bcc..ecf8ade5be 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -47,28 +47,42 @@ private _affected = (ASLtoAGL _grenadePosASL) nearEntities ["CAManBase", 20]; _affected = _affected - [ACE_player]; { if (local _x && {alive _x}) then { - private _strength = 1 - (((eyePos _x) vectorDistance _grenadePosASL) min 20) / 20; + private _unit = _x; + private _strength = 1 - (((eyePos _unit) vectorDistance _grenadePosASL) min 20) / 20; - TRACE_3("FlashBangEffect Start",_x,((getPosASL _x) vectorDistance _grenadePosASL),_strength); + TRACE_3("FlashBangEffect Start",_unit,((getPosASL _unit) vectorDistance _grenadePosASL),_strength); - [_x, true] call EFUNC(common,disableAI); - - _x setSkill (skill _x / 50); + [_unit, true] call EFUNC(common,disableAI); // Make AI try to look away - private _dirToFlash = _x getDir _grenadePosASL; - _x setDir (_dirToFlash + linearConversion [0.2, 1, _strength, 40, 135] * selectRandom [-1, 1]); + private _dirToFlash = _unit getDir _grenadePosASL; + _unit setDir (_dirToFlash + linearConversion [0.2, 1, _strength, 40, 135] * selectRandom [-1, 1]); - [{ - params ["_unit"]; + private _flashReactionDebounce = _unit getVariable [QGVAR(flashReactionDebounce), 0]; + _unit setVariable [QGVAR(flashReactionDebounce), _flashReactionDebounce max (CBA_missionTime + (7 * _strength))]; + if (_flashReactionDebounce < CBA_missionTime) then { + // Not used interally but could be useful for other mods + _unit setVariable [QGVAR(flashStrength), _strength, true]; + { + _unit setSkill [_x, (_unit skill _x) / 50]; + } forEach SUBSKILLS; + [{ + params ["_unit"]; + CBA_missiontime >= _unit getVariable [QGVAR(flashReactionDebounce), 0] + },{ + params ["_unit"]; - //Make sure we don't enable AI for unconscious units - if !(_unit getVariable ["ace_isUnconscious", false]) then { - [_unit, false] call EFUNC(common,disableAI); - }; + _unit setVariable [QGVAR(flashStrength), 0, true]; - _unit setSkill (skill _unit * 50); - }, [_x], 7 * _strength] call CBA_fnc_waitAndExecute; + // Make sure we don't enable AI for unconscious units + if !(_unit getVariable ["ace_isUnconscious", false]) then { + [_unit, false] call EFUNC(common,disableAI); + }; + { + _unit setSkill [_x, (_unit skill _x) * 50]; + } forEach SUBSKILLS; + }, [_unit]] call CBA_fnc_waitUntilAndExecute; + }; }; } count _affected; @@ -96,14 +110,14 @@ if (hasInterface && {!isNull ACE_player} && {alive ACE_player}) then { _strength = _strength * _losCoefficient; // Add ace_hearing ear ringing sound effect - if (isClass (configFile >> "CfgPatches" >> "ACE_Hearing") && {_strength > 0 && {EGVAR(hearing,damageCoefficent) > 0.25}}) then { + if (["ACE_Hearing"] call EFUNC(common,isModLoaded) && {_strength > 0 && {EGVAR(hearing,damageCoefficent) > 0.25}}) then { private _earringingStrength = 40 * _strength; [_earringingStrength] call EFUNC(hearing,earRinging); TRACE_1("Earringing Strength",_earringingStrength); }; // add ace_medical pain effect: - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical") && {_strength > 0.1}) then { + if (["ACE_Medical"] call EFUNC(common,isModLoaded) && {_strength > 0.1}) then { [ACE_player, _strength / 2] call EFUNC(medical,adjustPainLevel); }; diff --git a/addons/grenades/functions/fnc_incendiary.sqf b/addons/grenades/functions/fnc_incendiary.sqf index d6f689e4f2..9bfb7bb639 100644 --- a/addons/grenades/functions/fnc_incendiary.sqf +++ b/addons/grenades/functions/fnc_incendiary.sqf @@ -155,6 +155,9 @@ private _sound = objNull; if (isServer) then { _sound = createSoundSource ["Sound_Fire", _position, [], 0]; + private _radius = 1.5 * getNumber (configOf _projectile >> "indirectHitRange"); + private _intensity = getNumber (configOf _projectile >> "hit"); + [QEGVAR(fire,addFireSource), [_projectile, _radius, _intensity, _projectile, {CBA_missionTime < _this}, CBA_missionTime + _timeToLive]] call CBA_fnc_serverEvent; }; [{ diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml index 0cd8a020bc..1b5d2a2871 100644 --- a/addons/grenades/stringtable.xml +++ b/addons/grenades/stringtable.xml @@ -13,7 +13,7 @@ Cambia tipo di granata Alternar Modo de Granada 投てき方法を切り替え - 투척 종류 전환 + 투척 방법 전환 切换投掷模式 切換投擲模式 Bomba fırlatma modunu değiştir @@ -149,7 +149,7 @@ Anche conosciuta come flashbang. Causa accecamento immediato, sensazioni di sposatezza, mancanza d'equilibrio e disturbi al timpano. Também conhecida como flashbang. Causa uma clarão imediato, cegueira, surdez, zumbido e distúrbio no tímpano. フラッシュバンとも知られています。即時に失明と難聴、耳鳴り、内耳障害を引き起こします。 - 플래시뱅이라고도 알려져있습니다. 사용즉시 섬광으로 인한 시력장애, 청각장애, 이명, 내이기관방해를 유발합니다. + 플래시뱅이라고도 알려져있습니다. 사용 즉시 섬광으로 인한 시력장애, 청각장애, 이명, 내이기관방해를 유발합니다. 也被称为闪光弹,会造成暂时性失明,耳聋,耳鸣等效果。 也被稱為閃光彈,會造成暫時性失明,耳聾,耳鳴等效果 Flashbang olarak da bilinir. Ani flaş körlüğü, sağırlık, kulak çınlaması ve iç kulak rahatsızlığına neden olur. @@ -158,6 +158,7 @@ CTS 7290 9-bang Flash Grenade CTS 7290 9-fach Blendgranate CTS 7290-9 9閃 閃光彈 + CTS 7290 9闪 闪光弹 CTS 7290 9- Flash bang Grenade CTS 7290 9 ranný oslepující granát CTS 7290 9-bang 閃光手榴弾 @@ -167,6 +168,7 @@ CTS 7290 9- Flaş Bombası CTS 7290-9 Светошумовая граната Granada aturdidora CTS 7290 9-explosiones + CTS 7290 9-bang 섬광 수류탄 CTS 7290-9 @@ -197,8 +199,8 @@ Bengala M127A1 (Blanca) M127A1 Feu à main (Blanc) M127A1 信号弾 (白) - M127A1 신호탄 (하얀색) - M127A1 手持式信号弹 (白色) + M127A1 수타식 신호탄 (하얀색) + M127A1 手持式信号弹(白色) M127A1 手持式信號彈 (白色) M127A1 El Sinyali (Beyaz) @@ -214,8 +216,8 @@ Bengala M127A1 (Roja) M127A1 Feu à main (Rouge) M127A1 信号弾 (赤) - M127A1 신호탄 (빨간색) - M127A1 手持式信号弹 (红色) + M127A1 수타식 신호탄 (빨간색) + M127A1 手持式信号弹(红色) M127A1 手持式信號彈 (紅色) M127A1 El Sinyali (Kırmızı) @@ -231,8 +233,8 @@ Bengala M127A1 (Verde) M127A1 Feu à main (Vert) M127A1 信号弾 (緑) - M127A1 신호탄 (초록색) - M127A1 手持式信号弹 (绿色) + M127A1 수타식 신호탄 (초록색) + M127A1 手持式信号弹(绿色) M127A1 手持式信號彈 (綠色) M127A1 El Sinyali (Yeşil) @@ -248,8 +250,8 @@ Bengala M127A1 (Amarilla) M127A1 Feu à main (Jaune) M127A1 信号弾 (黄) - M127A1 신호탄 (노란색) - M127A1 手持式信号弹 (黄色) + M127A1 수타식 신호탄 (노란색) + M127A1 手持式信号弹(黄色) M127A1 手持式信號彈 (黃色) M127A1 El Sinyali (Sarı) @@ -334,7 +336,7 @@ M127A1 (Blanca) M127A1 (白) M127A1 (하양) - M127A1 (白色) + M127A1(白色) M127A1 (白色) M127A1 (Beyaz) @@ -351,7 +353,7 @@ M127A1 (Roja) M127A1 (赤) M127A1 (빨강) - M127A1 (红色) + M127A1(红色) M127A1 (紅色) M127A1 (Kırmızı) @@ -368,7 +370,7 @@ M127A1 (Verde) M127A1 (緑) M127A1 (초록) - M127A1 (绿色) + M127A1(绿色) M127A1 (綠色) M127A1 (Yeşil) @@ -385,7 +387,7 @@ M127A1 (Amarilla) M127A1 (黄) M127A1 (노랑) - M127A1 (黄色) + M127A1(黄色) M127A1 (黃色) M127A1 (Sarı) @@ -427,7 +429,7 @@ Зажигательная граната используется для уничтожения оружия, боеприпасов и прочего оборудования. 焼夷手榴弾は武器や弾薬箱などの装備を破壊する為に使われます。 Granat zapalający, używany do niszczenia broni, amunicji i innego sprzętu. - 소이 수류탄은 무기나 탄약 그리고 장비를 파괴할때 쓰입니다. + 소이 수류탄은 무기나 탄약 그리고 장비를 파괴할 때 쓰입니다. Grenade incendiaire utilisée pour détruire des armes, des munitions et d'autres équipements. Granata incendiaria usata per distruggere armi, munizioni e altri equipaggiamenti. 燃烧手榴弹是用来摧毁武器,弹药以及其他装备的好帮手。 @@ -446,10 +448,12 @@ Тип: Осветительная ракета - звезда на парашюте Tipo: Sinalizador de pára-quedas estrela 類型:星式帶傘照明彈 + 类型:星式带伞照明弹 Type : Fusée éclairante à parachute Typ: Světlice s padákem Tür: Yıldız Paraşüt Fişeği Tipo: Bengala de paracaidas + 종류: 낙하식 조명탄 M583 Illumination Flare (White) @@ -460,10 +464,12 @@ M583 Осветит. ракета (Белая) M583 Sinalizador de Iluminação (Branco) M583 照明彈(白色) + M583 照明弹(白色) M583 Fusée éclairante (Blanche) M583 Světlice (Bílá) M583 Aydınlatma Fişeği (Beyaz) M583 Bengala de iluminación (Blanca) + M583 조명탄 (하양) M662 Illumination Flare (Red) @@ -474,10 +480,12 @@ M662 Осветит. ракета (Красная) M662 Sinalizador de Iluminação (Vermelho) M662 照明彈(紅色) + M662 照明弹(红色) M662 Fusée éclairante (Rouge) M662 Světlice (Červená) M662 Aydınlatma Fişeği (Kırmızı) M662 Bengala de iluminación (Roja) + M662 조명탄 (빨강) M661 Illumination Flare (Green) @@ -488,10 +496,12 @@ M661 Осветит. ракета (Зеленая) M661 Sinalizador de Iluminação (Verde) M661 照明彈(綠色) + M661 照明弹(绿色) M661 Fusée éclairante (Verte) M661 Světlice (Zelená) M661 Aydınlatma Fişeği (Yeşil) M661 Bengala de iluminación (Verde) + M661 조명탄 (초록) Type: Parachute IR Flare @@ -502,10 +512,12 @@ Тип: ИК-осветительная ракета на парашюте Tipo: Sinalizador Infravermelho de Pára-quedas 類型:帶傘型紅外線照明彈 + 类型:带伞型红外照明弹 Type : Fusée IR à parachute Typ: Infračervená světlice s padákem Tip : Paraşüt IR Flare Tipo: Bengala infrarroja de paracaidas + 종류: 낙하식 적외선 조명탄 M992 Illumination IR Flare @@ -516,10 +528,12 @@ M992 ИК-осветительная ракета M992 Sinalizador de Iluminação Infravermelho M992 紅外線照明彈 + M992 红外照明弹 M992 Fusée IR M992 Infračervená světlice M992 Illumination IR Flare M992 Bengala de iluminación infrarroja + M992 적외선 조명탄 Explosive Satchel (Throwable) @@ -529,6 +543,8 @@ Carga de mochila explosiva (Lanzable) Pakiet ładunków wybuchowych (Rzucany) Rucksackladung (Werfbar) + 炸药包(可投掷) + 폭파 장약 (투척) Type: Charge<br />Rounds: 1<br />Used on: Things that need to die @@ -538,6 +554,8 @@ Tipo: Carga<br />Unidades: 1<br />Usada: Cosas que necesitan morir Typ: Ładunek<br/>Naboje: 1<br/>Użycie: Na rzeczach które mają zginąć Typ: Ladung <br/>Patronen:1<br/>Benutzt für: Dinge die Sterben müssen + 类型:炸药<br />数量:1<br />用于:需要死亡的事物 + 종류: 장약<br />갯수: 1<br />사용처: 죽여야 할 곳에 An explosive satchel that is throwable. 7 second fixed fuse @@ -547,6 +565,8 @@ Carga de mochila explosiva que se puede lanzar. Espoleta fija de 7 segundos Rzucany pakiet ładunków wybuchowych. 7 sekundowy zapalnik Werfbare Rucksackladung. 7 Sekunden Zeitzünder + 一个可投掷的炸药包。7秒定时引信 + 던질 수 있는 폭파 장약입니다. 던지고 7초 후에 터집니다 Explosive Charge (Throwable) @@ -556,6 +576,8 @@ Carga explosiva (Lanzable) Ładunek wybuchowy (Rzucany) Sprengladung (Werfbar) + 炸药块(可投掷) + 폭파 블럭 (투척) An explosive charge that is throwable. 7 second fixed fuse @@ -565,6 +587,8 @@ Carga explosiva que se puede lanzar. Espoleta fija de 7 segundos Rzucany ładunkek wybuchowy. 7 sekundowy zapalnik Werfbare Sprengladung. 7 Sekunden Zeitzünder + 一个可投掷的炸药块。7秒定时引信 + 던질 수 있는 폭파 블럭입니다. 던지고 7초 후에 터집니다 Convert to short fuse @@ -574,6 +598,8 @@ Convertir a espoleta corta Konwertuj na krótki zapalnik Zündschnur verkürzen + 切换为短引信 + 단축 신관으로 바꾸기 Remove short fuse @@ -583,6 +609,8 @@ Quitar espoleta corta Usuń krótki zapalnik Kurze Zündschnur entfernen + 去除短引信 + 단축 신관 제거하기 ACE Grenades @@ -608,6 +636,8 @@ Permitir conversión de explosivos Pozwól na konwersję ładunków wybuchowych Erlaube die Umwandlung von Sprengstoffen + 允许转换炸药 + 폭발물 변경 가능여부 Allow converting explosives to throwables @@ -617,6 +647,8 @@ Permitir convertir explosivos a lanzables Zezwala na konwersje ładunków wybuchowych na rzucane wersje Erlaube die Umwandlung von Sprengstoffen in werfbare Ladungen + 允许将炸药转换为可投掷物 + 폭발물을 던질 수 있게 개조를 허락합니다 diff --git a/addons/gunbag/XEH_preInit.sqf b/addons/gunbag/XEH_preInit.sqf index 63968a30f8..78c6741dbb 100644 --- a/addons/gunbag/XEH_preInit.sqf +++ b/addons/gunbag/XEH_preInit.sqf @@ -44,4 +44,20 @@ PREP_RECOMPILE_END; GVAR(arsenalCache) = nil; }] call CBA_fnc_addEventHandler; +["CBA_loadoutSet", { + params ["_unit", "_loadout", "_extendedInfo"]; + private _gunbagWeapon = _extendedInfo getOrDefault [QGVAR(gunbagWeapon), []]; + if (_gunbagWeapon isNotEqualTo []) then { + (backpackContainer _unit) setVariable [QGVAR(gunbagWeapon), _gunbagWeapon, true]; + }; +}] call CBA_fnc_addEventHandler; + +["CBA_loadoutGet", { + params ["_unit", "_loadout", "_extendedInfo"]; + private _gunbagWeapon = (backpackContainer _unit) getVariable [QGVAR(gunbagWeapon), []]; + if (_gunbagWeapon isNotEqualTo []) then { + _extendedInfo set [QGVAR(gunbagWeapon), _gunbagWeapon]; + }; +}] call CBA_fnc_addEventHandler; + ADDON = true; diff --git a/addons/gunbag/functions/fnc_hasGunbag.sqf b/addons/gunbag/functions/fnc_hasGunbag.sqf index 7f9c7135e0..587a8afae4 100644 --- a/addons/gunbag/functions/fnc_hasGunbag.sqf +++ b/addons/gunbag/functions/fnc_hasGunbag.sqf @@ -17,4 +17,4 @@ params ["_unit"]; -getNumber (configFile >> "CfgVehicles" >> (backpack _unit) >> QUOTE(ADDON)) == 1 +getNumber ((configOf (backpackContainer _unit)) >> QUOTE(ADDON)) == 1 diff --git a/addons/gunbag/stringtable.xml b/addons/gunbag/stringtable.xml index fbcc3d1fb8..ae87dda329 100644 --- a/addons/gunbag/stringtable.xml +++ b/addons/gunbag/stringtable.xml @@ -27,7 +27,7 @@ Torba na broń (jasnobrązowa) 총가방 (황갈색) Borsa per Armi (Tan) - 枪袋 (黄褐色) + 枪袋(黄褐色) 槍袋 (黃褐色) Bolsa de Arma (Bege) Silah Çantası (Tan) @@ -74,6 +74,8 @@ Silah çantasında silah değişimi Intercambiar arma en funda de arma Waffe in Waffentasche tauschen + 交换枪袋中的武器 + 총가방 안에 있는 무기랑 교환하기 Enable Weapon Swap @@ -84,6 +86,8 @@ Silah Değiştirmeyi Etkinleştir Habilitar cambio de arma Aktiviere Tauschen von Waffen + 启用武器互换 + 무기 교환 활성화 Allows interaction to directly swap the primary weapon and stored weapon. @@ -94,6 +98,8 @@ Etkileşimin doğrudan birincil silahı ve depolanan silahı değiştirmesine izin verir. Permitir interacción para intercambiar el arma principal y el arma guardada. Erlaube den direkten Wechsel von Primärer und verstauter Waffe über das Interaktionsmenü. + 允许互动直接切换主武器和存储武器。 + 보관 중인 무기와 주무기와 바로 바꾸는 것을 허용합니다. Get weapon out of gunbag diff --git a/addons/headless/XEH_postInit.sqf b/addons/headless/XEH_postInit.sqf index 2237c629e3..103d5c1834 100644 --- a/addons/headless/XEH_postInit.sqf +++ b/addons/headless/XEH_postInit.sqf @@ -22,14 +22,18 @@ // Check if naked unit bug happened if (_local && {uniform _unit == ""}) then { + scopeName QGVAR(applyLoadout); INFO_1("Unit [%1] became local with broken loadout - attempting to fix",_unit); if (XGVAR(transferLoadout) == 1) then { // Transferred loadout, if unavailable reset to config default (still better than naked) - _unit setUnitLoadout (_unit getVariable [QGVAR(loadout), typeOf _unit]); - } else { - // Config default loadout - _unit setUnitLoadout (typeOf _unit); + private _loadout = _unit getVariable [QGVAR(loadout), []]; + if (_loadout isNotEqualTo []) then { + [_unit, _loadout] call CBA_fnc_setLoadout; + breakOut QGVAR(applyLoadout); + }; }; + // Config default loadout + _unit setUnitLoadout (typeOf _unit); }; }] call CBA_fnc_addClassEventHandler; }; diff --git a/addons/headless/functions/fnc_transferGroups.sqf b/addons/headless/functions/fnc_transferGroups.sqf index 94cd2627d4..fa39af4d1b 100644 --- a/addons/headless/functions/fnc_transferGroups.sqf +++ b/addons/headless/functions/fnc_transferGroups.sqf @@ -65,11 +65,11 @@ private _numTransferredHC3 = 0; // Transfer AI groups { // No transfer if empty group - private _transfer = !(units _x isEqualTo []) && {!(_x getVariable [QXGVAR(blacklist), false])}; + private _transfer = ((units _x) isNotEqualTo []) && {!(_x getVariable [QXGVAR(blacklist), false])}; if (_transfer) then { // No transfer if waypoints with synchronized triggers exist for the group - private _allWaypointsWithTriggers = (waypoints _x) select {!((synchronizedTriggers _x) isEqualTo [])}; - if !(_allWaypointsWithTriggers isEqualTo []) exitWith { + private _allWaypointsWithTriggers = (waypoints _x) select {(synchronizedTriggers _x) isNotEqualTo []}; + if (_allWaypointsWithTriggers isNotEqualTo []) exitWith { _transfer = false; }; @@ -96,7 +96,7 @@ private _numTransferredHC3 = 0; // Save gear if unit about to be transferred with current loadout (naked unit work-around) if (XGVAR(transferLoadout) == 1) then { - _x setVariable [QGVAR(loadout), getUnitLoadout _x, true]; + _x setVariable [QGVAR(loadout), [_x] call CBA_fnc_getLoadout, true]; }; } forEach (units _x); }; diff --git a/addons/headless/stringtable.xml b/addons/headless/stringtable.xml index 660067a293..ee9131a3eb 100644 --- a/addons/headless/stringtable.xml +++ b/addons/headless/stringtable.xml @@ -8,7 +8,7 @@ 헤드리스 ヘッドレス Headless - 无头客户端 + Headless 客户端 無頭客戶端 Headless Headless клиент @@ -20,7 +20,7 @@ 이 모듈을 사용하면 헤드리스 클라이언트에 AI 자동 전송을 설정할 수 있습니다. (기본값 : No) モジュールは AI を自動的にヘッドレス クライアントへ移行します。(標準: 無効) Ce module permet de mettre en place un transfert aotmatique de l'IA vers le Headless Clients. (Défaut: Non) - 此模块能让你自动转换AI的控制权给其他无头客户端。(预设:关闭) + 此模块能让你自动转换 AI 的控制权给其他 Headless 客户端。(预设:关闭) 此模塊能讓你自動轉換AI的控制權給其他無頭客戶端。(預設:關閉) Questo modulo ti consente di impostare il trasferimento automatico delle AI su dei Client Headless. (Default: No) Этот модуль позволяет настроить автоматическую передачу управления ИИ Headless клиентам. (По умолчанию: Откл) @@ -32,7 +32,7 @@ AI를 헤드리스 클라이언트로 전송할 수 있습니다. AI をヘッドレス クライアントへ移行を有効化 Permet le transfert des IA au Headless Clients. - 开启转换AI控制权给无头客户端。 + 开启转换 AI 控制权给 Headless 客户端。 開啟轉換AI控制權給無頭客戶端。 Abilita il trasferimento delle AI sugli Headless Client. Передает управление ИИ Headless клиентам. @@ -56,7 +56,7 @@ 전송 간 최소 지연 시간, 초당. (기본값: 15) 移行する際の最低遅延を秒数で設定します。(標準: 15) Délai minimum entres les transferts, en secondes. (Défaut: 15) - 设定每次转换间隔多少秒。(预设:15秒) + 设定每次转换间隔多少秒。(预设:15秒) 設定每次轉換間隔多少秒。(預設:15秒) Latenza minima tra i trasferimenti, in secondi. (Default: 15) Минимальная задержка в секундах между передачами. (По умолчанию: 15) @@ -79,7 +79,7 @@ 연결된 플레이어가 없을 때 임무 종료. (서버 구성에서는 'persistent = 0'과 같지만 Headless Client는 지원함) プレイヤーが接続していない場合はミッション終了します。(サーバ設定の'presistent =0'と同じですが、ヘッドレス クライアントは適用されます) Termine la mission lorsqu'il n'y a plus de joueur connecté (idem que 'persistent = 0' dans la config serveur mais avec la gestion du Headless Client). - 当伺服器里没有任何玩家还连线时自动结束任务(效果同于伺服器设定的'persistent = 0',但支援无头客户端)。 + 当服务器里没有任何玩家还连线时自动结束任务(效果同于伺服器设定的'persistent = 0',但支援 Headless 客户端)。 當伺服器裡沒有任何玩家還連線時自動結束任務(效果同於伺服器設定的'persistent = 0',但支援無頭客戶端)。 Termina la missione quando non ci sono più giocatori connessi (come 'persistent = 0' nella configurazione dei server ma con il supporto dell'Headless Client). Kończy misje kiedy nie ma połączonych graczy(tak samo jak 'persistent = 0' w konfiguracji serwer ale z wsparciem Headless Client @@ -103,7 +103,7 @@ 지연 (60초) 遅延 (60秒) Retardé (60s) - 延迟 (60秒) + 延迟(60秒) 延遲 (60秒) Ritardato (60s) Opóźniony (60s) @@ -125,10 +125,10 @@ Log transfer statistics and Headless Client (dis)connections to RPT. (Default: No) Zeichnet Transferstatistiken, Verbindungen und Verbindungsabbrüche in einer RPT-Datei auf. (Standard: Nein) Zapisz statystyki transferu i status połączenia Headless Clienta do RPT. (Domyślnie: Tak) - 전송 통계 및 헤드리스 클라이언트 연결(해제) 로그 RPT. (기본값: No) + 전송 통계 및 헤드리스 클라이언트 연결(해제)를 RPT파일에 로그함. (기본값: No) 統計とヘッドレス クライアントの接続有無を PRT へ記録します。(標準: 無効) Archive les statistiques de transfert et de (dé)connections du Headless Client dans le RPT. (Défaut: Non) - 记录无头客户端间的转换数量与连线/断线等记录到RPT报告档中。(预设:关闭) + 记录 Headless 客户端间的转换数量与连线/断线等记录到 RPT 报告档中。(预设:关闭) 記錄無頭客戶端間的轉換數量與連線/斷線等記錄到RPT報告檔中。(預設:關閉) Registra le statistiche del trasferimento e delle (dis)connessioni dell'Headless Clienti su RPT. (Default: No) Вести журнал передач и подключений Headless клиентов в файл RPT. (По умолчанию: Откл) @@ -138,8 +138,10 @@ Transferiere Ausrüstung 装備の移送 裝備傳輸 + 装备转移 Передавать снаряжение Transfer Wyposażenia + 로드아웃 전송 Transfer loadout of units attempts to work around an issue where units appear naked after transferring to a Headless Client. @@ -147,30 +149,36 @@ 装備の移送はヘッドレス クライアントへの移行後にユニットが裸で出現する問題の回避を試みます。 Передача снаряжения юнитов позволяет обходить проблему, при которой юниты оказываются без снаряжения после передачи управления Headless клиенту. 裝備傳輸用於試著暫時應付單位透過無頭客戶端傳輸時所導致裸裝之問題。 + 装备转移用于试着暂时应付单位透过 Headless 客户端传输时所导致裸装之问题。 Transfer Wyposażenia jednostek usiłuje uniknąć problemu z nagimi jednostkami po transferze do Headless Clienta + 헤드리스 클라이언트로 넘어갈 때 유닛이 벌거벗고 있는 상황을 해결하기 위해 로드아웃을 유닛에 전송합니다. Current Loadout Derzeitige Ausrüstung 現在の装備 目前裝備 + 当前装备 Текущее снаряжение Obecne wyposażenie + 현재 로드아웃 Config Loadout Konfiguriere Ausrüstung コンフィグの装備 設置裝備 + 设置装备 Снаряжение из настроек Konfiguracja Wyposażenia + 로드아웃 설정 Headless Blacklist Headless Blacklist ヘッドレス ブラックリスト Liste noire Headless - 无头客户端黑名单 + Headless 客户端黑名单 無頭客戶端黑名單 Lista Nera Headless 헤드리스 블랙리스트 @@ -182,10 +190,10 @@ Schaltet das Übertragen dieser KI Einheit/Gruppe zu einem Headless Client aus. Hat keinen Effekt auf Spielereinheiten. ヘッドレス クライアントへ移行させない AI ユニット/グループを指定します。プレイヤー ユニットへ効果はありません。 Désactive le transfert de ce(tte) unité/groupe au Headless Clients. Sans effet sur les unités des joueurs. - 禁止转换黑名单中的AI单位/群组到无头客户端上。此功能对玩家单位无用。 + 禁止转换黑名单中的 AI 单位/群组到 Headless 客户端上。此功能对玩家单位无用。 禁止轉換黑名單中的AI單位/群組到無頭客戶端上。此功能對玩家單位無用。 Disabilita il trasferimento di questa unità/gruppo di AI negli Headless Client. Non ha effetto sui giocatori. - 이 AI 유닛 / 그룹을 헤드리스 클라이언트로 전송하지 못하도록합니다. 플레이어 유닛에는 영향을주지 않습니다. + 이 AI 유닛/그룹을 헤드리스 클라이언트로 전송하지 못하도록 합니다. 플레이어 유닛에는 영향을 주지 않습니다. Wyłącza transfer tych jednostek/grup AI do Headless Clients. Bez efektu na jednostkach gracza. Отключает передачу управления этого юнита/группы Headless клиентам. Не влияет на юниты игроков. diff --git a/addons/hearing/XEH_postInit.sqf b/addons/hearing/XEH_postInit.sqf index d8b21f214a..b80ae51818 100644 --- a/addons/hearing/XEH_postInit.sqf +++ b/addons/hearing/XEH_postInit.sqf @@ -79,3 +79,18 @@ GVAR(lastPlayerVehicle) = objNull; // Update protection on possible helmet change ["loadout", LINKFUNC(updateHearingProtection), false] call CBA_fnc_addPlayerEventHandler; }] call CBA_fnc_addEventHandler; + +["CBA_loadoutSet", { + params ["_unit", "_loadout", "_extendedInfo"]; + if (_extendedInfo getOrDefault ["ace_earplugs", false]) then { + _unit setVariable ["ACE_hasEarPlugsIn", true, true]; + [[true]] remoteExec [QFUNC(updateVolume), _unit]; + }; +}] call CBA_fnc_addEventHandler; + +["CBA_loadoutGet", { + params ["_unit", "_loadout", "_extendedInfo"]; + if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { + _extendedInfo set ["ace_earplugs", true] + }; +}] call CBA_fnc_addEventHandler; diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 3d77dd879d..80e487f0dd 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -145,8 +145,8 @@ Remove o efeito de zunido quando o jogador recebe dano na audição Убирает эффект звона в ушах, когда игрок получает повреждение слуха プレイヤーの聴覚が損傷したら耳鳴りの効果を削除します - 플레이어가 청력손실을 입을때 생기는 이명현상을 제거합니다. - 关闭耳鸣效果时,就算玩家受到相当程度的听力伤害, 也不会造成耳鸣效果 + 플레이어가 청력손실을 입을 때 생기는 이명현상을 제거합니다. + 关闭耳鸣效果时,就算玩家受到相当程度的听力伤害,也不会造成耳鸣效果 關閉耳鳴效果時,就算玩家受到相當程度的聽力傷害, 也不會造成耳鳴效果 Odstranit tinitus když hráč utrpí poškození sluchu @@ -179,7 +179,7 @@ Sordità da combattimento 戦闘による難聴を有効化 전투 난청 켜기 - 启用战斗性耳聋? + 启用战斗性耳聋? 啟用戰鬥性耳聾? @@ -194,7 +194,7 @@ Réduit la capacité auditive du joueur lorsqu'il subit des dommages auditifs. 音による損傷をうけ、聴覚が減る可能性があります 청력에 손상을 입으면 듣는 소리가 감소합니다. - 当玩家听力受损时降低听力能力? + 当玩家听力受损时降低听力能力? 當玩家聽力受損時降低聽力能力? @@ -269,7 +269,7 @@ Agregar el item `ACE_EarPlugs` a todas las unidades equipadas con armas muy ruidosas. Desactivar si quieren utilizarse equipamientos personalizados. Ajoute l'objet `Ace_EarPlugs` à toutes les unités ayant des armes bruyantes. Peut être désactivé si de l'équipement personnalisé est utilisé. 全ユニットへ`ACE_EarPlugs`アイテムを持たせます。これは変更された武装で無効化できます。 - 무기를 가지고 있는 모든 인원에게 'ACE_EarPlugs'를 지급합니다. 임의의 장비를 사용시 비활성화 할 수 있습니다. + 무기를 가지고 있는 모든 인원에게 'ACE_EarPlugs'를 지급합니다. 임의의 장비를 사용시 비활성화할 수 있습니다. 增加`ACE_EarPlugs`物品给拥有巨大噪音武器的单位。当你想自定装备时,此功能可被关闭。 增加`ACE_EarPlugs`物品給擁有巨大噪音武器的單位。當你想自定裝備時,此功能可被關閉。 @@ -286,6 +286,7 @@ Proteção Auditiva Ochrana sluchu Protección auditiva + 청력 보호 Volume muffling @@ -300,6 +301,7 @@ Abafamento de Volume Snížení hlasitosti Atenuación de volumen + 소리 차음도 Earplugs Volume @@ -314,6 +316,7 @@ Volume bouchons anti bruit Hlasitost se špunty Volumen de protectores auditivos + 귀마개 볼륨 Volume when using earplugs. @@ -328,6 +331,7 @@ Volume audio perçu par les joueurs portant des bouchons anti bruit. Hlasitost při používání špuntů do uší. Volumen cuando se utilizan protectores auditivos. + 귀마개 사용 시의 볼륨입니다. Unconscious Volume @@ -342,6 +346,7 @@ Volume inconscience Hlasitost při ztrátě vědomí Volumen inconsciente + 기절 볼륨 Volume when unconscious. @@ -356,6 +361,7 @@ Volume perçu par les joueurs inconscients. Hlasitost během ztráty vědomí. Volumen durante la inconsciencia. + 기절 시 볼륨입니다. diff --git a/addons/hellfire/stringtable.xml b/addons/hellfire/stringtable.xml index be74f29c08..df16c00c9f 100644 --- a/addons/hellfire/stringtable.xml +++ b/addons/hellfire/stringtable.xml @@ -25,6 +25,8 @@ セミ アクティブ レーダー誘導の対戦車弾頭 Rakieta naprowadzana laserowo z głowicą przeciwpancerną Halbaktive Laser-Zielsuchrakete mit HEAT-Gefechtskopf + 高爆反坦克弹头半主动激光制导导弹 + 반능동 레이저 유도미사일로 대전차 고폭 탄두를 탑재하고 있습니다. Millimeter-wave radar guided missile with high explosive anti-tank warhead @@ -34,6 +36,8 @@ ミリ波レーダー誘導の対戦車弾頭 Rakieta namierzana radarowo z głowicą przeciwpancerną Millimeterwellenradar-Lenkflugkörper mit HEAT-Gefechtskopf + 高爆反坦克弹头毫米波雷达制导导弹 + 밀리미터파 레이더 유도 미사일로 대전차 고폭 탄두를 탑재하고 있습니다. Semi-active laser homing missile with metal augmented charge anti-personnel warhead @@ -43,6 +47,8 @@ セミ アクティブ レーダー誘導の対人弾 Rakieta naprowadzana laserowo z głowicą odłamkową Halbaktive Laser-Zielsuchrakete mit metallverstärktem Antipersonen-Gefechtskopf + 金属增强人员杀伤弹头半主动激光制导导弹 + 반능동 레이저 유도 미사일로 대인 금속 강화 탄두가 탑재하고 있습니다. diff --git a/addons/hitreactions/stringtable.xml b/addons/hitreactions/stringtable.xml index 4abcd17cac..85cba14c8b 100644 --- a/addons/hitreactions/stringtable.xml +++ b/addons/hitreactions/stringtable.xml @@ -7,7 +7,7 @@ 觸發倒下前最低需受到多少傷害 触发倒下前最低需受到多少伤害 崩れ落ちるまでの最低損傷値 - 방아쇠를 당기는 최소한의 피해 + 넘어질 때 발생하는 최소 피해량 Mindestschaden, um Sturz auszulösen Minimalne obrażenie, żeby aktywować spadanie Минимальный урон для активации падения diff --git a/addons/hot/config.cpp b/addons/hot/config.cpp index c61886cd26..d285b08cfc 100644 --- a/addons/hot/config.cpp +++ b/addons/hot/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common","ace_missileguidance"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"Dani (TCVM)"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/hot/stringtable.xml b/addons/hot/stringtable.xml index 816c2e9b01..1c0a745a89 100644 --- a/addons/hot/stringtable.xml +++ b/addons/hot/stringtable.xml @@ -10,10 +10,12 @@ Проводное управление Guiado por Fio 有線制導 + 有线制导 Filoguidé Drátem naváděné Tel-Güdümlü Guiado por cable + 유선 유도 Semi-automatic command to line of sight @@ -24,10 +26,12 @@ Полуавтоматическое командное наведение по линии визирования (SACLOS) Comando semi-automático para a linha de visão (SACLOS) 視線內半自動指令 + 半自动指令到视线(SACLOS) Contrôle semi-automatique par contact visuel (SACLOS) Poloautomatický povelový systém dalkového navedení pro záměrné cíle (SACLOS) Control semi-automático por línea de visión Görüş alanına yarı otomatik komut + 반자동 가시선 지령 유도방식 Wire-Guided Missile @@ -38,10 +42,12 @@ Ракета с проводным управлением Míssil Guiado por Fio 有線制導飛彈 + 线导导弹 Missile filoguidé Drátem naváděná střela Tel Güdümlü Füze Misil guiado por cable + 유선 유도 미사일 HOT Missile @@ -52,10 +58,12 @@ Ракета HOT Míssil HOT 高次音速(HOT)飛彈 + 高次音速(HOT)导弹 Missile HOT HOT Střela HOT Missile Misil HOT + HOT 미사일 HOT 1 @@ -67,9 +75,11 @@ HOT 1 HOT 1 HOT 1 + HOT 1 HOT 1 HOT 1 HOT 1 + HOT 1 HOT 2 @@ -81,9 +91,11 @@ HOT 2 HOT 2 HOT 2 + HOT 2 HOT 2 HOT 2 HOT 2 + HOT 2 HOT 2MP @@ -95,9 +107,11 @@ HOT 2MP HOT 2MP HOT 2MP + HOT 2MP HOT 2MP HOT 2MP HOT 2MP + HOT 2MP HOT 3 @@ -109,9 +123,11 @@ HOT 3 HOT 3 HOT 3 + HOT 3 HOT 3 HOT 3 HOT 3 + HOT 3 Wire-Guided Missile (Anti-Personnel) @@ -122,10 +138,12 @@ Ракета с проводным управлением (Противопехотная) Míssil Guiado por Fio (Anti-Pessoal) 有線制導飛彈(反步兵) + 线导导弹(反人员) Missile filoguidé (antipersonnel) Drátem naváděná střela (protipěchotní) Tel Güdümlü Füze (Anti-Personelı) Misil guiado por cable (Antipersona) + 유선 유도 미사일 (대인) 1x HOT 1 [ACE] @@ -137,9 +155,11 @@ 1x HOT 1 [ACE] 1x HOT 1 [ACE] 1x HOT 1 [ACE] + 1x HOT 1 [ACE] 1x HOT 1 [ACE] 1x HOT 1 [ACE] 1x HOT 1 [ACE] + 1x HOT 1 [ACE] 3x HOT 1 [ACE] @@ -151,9 +171,11 @@ 3x HOT 1 [ACE] 3x HOT 1 [ACE] 3x HOT 1 [ACE] + 3x HOT 1 [ACE] 3x HOT 1 [ACE] 3x HOT 1 [ACE] 3x HOT 1 [ACE] + 3x HOT 1 [ACE] 4x HOT 1 [ACE] @@ -165,9 +187,11 @@ 4x HOT 1 [ACE] 4x HOT 1 [ACE] 4x HOT 1 [ACE] + 4x HOT 1 [ACE] 4x HOT 1 [ACE] 4x HOT 1 [ACE] 4x HOT 1 [ACE] + 4x HOT 1 [ACE] 1x HOT 2 [ACE] @@ -179,9 +203,11 @@ 1x HOT 2 [ACE] 1x HOT 2 [ACE] 1x HOT 2 [ACE] + 1x HOT 2 [ACE] 1x HOT 2 [ACE] 1x HOT 2 [ACE] 1x HOT 2 [ACE] + 1x HOT 2 [ACE] 3x HOT 2 [ACE] @@ -193,9 +219,11 @@ 3x HOT 2 [ACE] 3x HOT 2 [ACE] 3x HOT 2 [ACE] + 3x HOT 2 [ACE] 3x HOT 2 [ACE] 3x HOT 2 [ACE] 3x HOT 2 [ACE] + 3x HOT 2 [ACE] 4x HOT 2 [ACE] @@ -207,9 +235,11 @@ 4x HOT 2 [ACE] 4x HOT 2 [ACE] 4x HOT 2 [ACE] + 4x HOT 2 [ACE] 4x HOT 2 [ACE] 4x HOT 2 [ACE] 4x HOT 2 [ACE] + 4x HOT 2 [ACE] 1x HOT 2MP [ACE] @@ -221,9 +251,11 @@ 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] 1x HOT 2MP [ACE] + 1x HOT 2MP [ACE] 3x HOT 2MP [ACE] @@ -235,9 +267,11 @@ 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] 3x HOT 2MP [ACE] + 3x HOT 2MP [ACE] 4x HOT 2MP [ACE] @@ -249,9 +283,11 @@ 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] 4x HOT 2MP [ACE] + 4x HOT 2MP [ACE] 1x HOT 3 [ACE] @@ -263,9 +299,11 @@ 1x HOT 3 [ACE] 1x HOT 3 [ACE] 1x HOT 3 [ACE] + 1x HOT 3 [ACE] 1x HOT 3 [ACE] 1x HOT 3 [ACE] 1x HOT 3 [ACE] + 1x HOT 3 [ACE] 4x HOT 3 [ACE] @@ -277,9 +315,11 @@ 4x HOT 3 [ACE] 4x HOT 3 [ACE] 4x HOT 3 [ACE] + 4x HOT 3 [ACE] 4x HOT 3 [ACE] 4x HOT 3 [ACE] 4x HOT 3 [ACE] + 4x HOT 3 [ACE] 3x HOT 3 [ACE] @@ -291,9 +331,11 @@ 3x HOT 3 [ACE] 3x HOT 3 [ACE] 3x HOT 3 [ACE] + 3x HOT 3 [ACE] 3x HOT 3 [ACE] 3x HOT 3 [ACE] 3x HOT 3 [ACE] + 3x HOT 3 [ACE] diff --git a/addons/hunterkiller/$PBOPREFIX$ b/addons/hunterkiller/$PBOPREFIX$ new file mode 100644 index 0000000000..3474867891 --- /dev/null +++ b/addons/hunterkiller/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\hunterkiller \ No newline at end of file diff --git a/addons/hunterkiller/CfgEventHandlers.hpp b/addons/hunterkiller/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a3f71f852 --- /dev/null +++ b/addons/hunterkiller/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/hunterkiller/CfgVehicles.hpp b/addons/hunterkiller/CfgVehicles.hpp new file mode 100644 index 0000000000..4ba64d8a95 --- /dev/null +++ b/addons/hunterkiller/CfgVehicles.hpp @@ -0,0 +1,24 @@ +class CfgVehicles { + class Tank_F; + class MBT_01_base_F: Tank_F { + ADDON = 1; // same as ADDON[] = {{{0}, 1}, {{0,0}, 3}}; + }; + class MBT_01_arty_base_F: MBT_01_base_F { + ADDON = 0; + }; + class MBT_01_mlrs_base_F: MBT_01_base_F { + ADDON = 0; + }; + class MBT_02_base_F: Tank_F { + ADDON = 1; + }; + class MBT_02_arty_base_F: MBT_02_base_F { + ADDON = 0; + }; + class MBT_03_base_F: Tank_F { + ADDON = 1; + }; + class MBT_04_base_F: Tank_F { + ADDON = 1; + }; +}; diff --git a/addons/hunterkiller/README.md b/addons/hunterkiller/README.md new file mode 100644 index 0000000000..293192db4e --- /dev/null +++ b/addons/hunterkiller/README.md @@ -0,0 +1,4 @@ +ace_hunterkiller +========== + +Allows a tank commander to re-aim the main turret or to aim their turret at the what the main turret is looking at diff --git a/addons/hunterkiller/XEH_PREP.hpp b/addons/hunterkiller/XEH_PREP.hpp new file mode 100644 index 0000000000..e0d7cd892e --- /dev/null +++ b/addons/hunterkiller/XEH_PREP.hpp @@ -0,0 +1,5 @@ +LOG("prep"); + +PREP(keydown); +PREP(slew); +PREP(turretChangedEH); diff --git a/addons/hunterkiller/XEH_postInit.sqf b/addons/hunterkiller/XEH_postInit.sqf new file mode 100644 index 0000000000..1560b6cc54 --- /dev/null +++ b/addons/hunterkiller/XEH_postInit.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +[QGVAR(slew), LINKFUNC(slew)] call CBA_fnc_addEventHandler; + +if (!hasInterface) exitWith {}; + +GVAR(mode) = 0; +GVAR(targetTurret) = []; + +["CBA_settingsInitialized", { + ["turret", LINKFUNC(turretChangedEH), true] call CBA_fnc_addPlayerEventHandler; +}] call CBA_fnc_addEventHandler; + + +["ACE3 Vehicles", QGVAR(observe), [format ["%1 - %2", LLSTRING(displayName), LLSTRING(observe)], LLSTRING(observe_description)], +{ + [false] call FUNC(keyDown) +}, { + false +}, [DIK_Q, [false, false, false]]] call CBA_fnc_addKeybind; + +["ACE3 Vehicles", QGVAR(override), [format ["%1 - %2", LLSTRING(displayName), LLSTRING(override)], LLSTRING(override_description)], +{ + [true] call FUNC(keyDown) +}, { + false +}, [DIK_E, [false, false, false]]] call CBA_fnc_addKeybind; diff --git a/addons/hunterkiller/XEH_preInit.sqf b/addons/hunterkiller/XEH_preInit.sqf new file mode 100644 index 0000000000..b47cf6628d --- /dev/null +++ b/addons/hunterkiller/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/hunterkiller/XEH_preStart.sqf b/addons/hunterkiller/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/hunterkiller/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/hunterkiller/config.cpp b/addons/hunterkiller/config.cpp new file mode 100644 index 0000000000..ff31bbede3 --- /dev/null +++ b/addons/hunterkiller/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/hunterkiller/functions/fnc_keydown.sqf b/addons/hunterkiller/functions/fnc_keydown.sqf new file mode 100644 index 0000000000..ea6fa7933c --- /dev/null +++ b/addons/hunterkiller/functions/fnc_keydown.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Slew keybind pressed + * + * Arguments: + * 0: Override if true, Observe if false + * + * Return Value: + * None + * + * Example: + * [true] call ace_hunterkiller_fnc_keydown + * + * Public: No + */ + +if ((GVAR(mode) == MODE_NO_ACTIONS) || {!([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith))}) exitWith { + false +}; + +params ["_modeOverride"]; +TRACE_1("keydown",_modeOverride); +if ((_modeOverride) && {!(GVAR(mode) in [MODE_OVERRIDE, MODE_OBSERVE_AND_OVERRIDE])}) exitWith { false }; +if ((!_modeOverride) && {!(GVAR(mode) in [MODE_OBSERVE, MODE_OBSERVE_AND_OVERRIDE])}) exitWith { false }; + +private _vehicle = vehicle ACE_player; +private _playerTurret = _vehicle unitTurret ACE_player; + +private _sourceTurret = [GVAR(targetTurret), _playerTurret] select _modeOverride; +private _puppetTurret = [_playerTurret, GVAR(targetTurret)] select _modeOverride; +TRACE_3("",_modeOverride,_sourceTurret,_puppetTurret); + +private _eyePos = eyePos _vehicle; +private _lookDir = if ((getNumber (([_vehicle, _sourceTurret] call CBA_fnc_getTurret) >> "primaryObserver")) == 1) then { + TRACE_1("using commander",_sourceTurret); + // CBA_fnc_turretDir fails on "CUP_B_M1A2SEP_TUSK_II_NATO", but eyeDirection should be correct on commander turrets + eyeDirection _vehicle +} else { + ([1] + ([_vehicle, _sourceTurret] call CBA_fnc_turretDir)) call CBA_fnc_polar2vect +}; +private _lookPoint = _eyePos vectorAdd (_lookDir vectorMultiply 5000); + +TRACE_1("sending event",_lookDir); +[QGVAR(slew), [_vehicle, _puppetTurret, _lookPoint, _modeOverride], _vehicle, _puppetTurret] call CBA_fnc_turretEvent; + +playSound "ACE_Sound_Click"; + +true // return (key used) diff --git a/addons/hunterkiller/functions/fnc_slew.sqf b/addons/hunterkiller/functions/fnc_slew.sqf new file mode 100644 index 0000000000..97d66aa38f --- /dev/null +++ b/addons/hunterkiller/functions/fnc_slew.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Slews turret to target pos and shows visual feedback + * + * Arguments: + * 0: Vehicle + * 1: Turret (will be local) + * 2: Look PosASL + * 3: Override + * + * Return Value: + * None + * + * Example: + * [vehicle, [0], [0,0,0], true] call ace_hunterkiller_fnc_slew + * + * Public: No + */ + +params ["_vehicle", "_turret", "_posASL", "_isOverride"]; +TRACE_4("slew",_vehicle,_turret,_posASL,_isOverride); + +_vehicle lockCameraTo [_posASL, _turret, true]; + +if (hasInterface && {(_vehicle turretUnit _turret) isEqualTo ace_player}) then { + private _displayText = if (_isOverride) then { LLSTRING(override) } else { LLSTRING(observe) }; + QGVAR(text) cutText [format ["




[%1]", _displayText], "PLAIN", -1, false, true]; + [{ + QGVAR(text) cutText ["", "PLAIN"]; + }, [], 1] call CBA_fnc_waitAndExecute; +}; diff --git a/addons/hunterkiller/functions/fnc_turretChangedEH.sqf b/addons/hunterkiller/functions/fnc_turretChangedEH.sqf new file mode 100644 index 0000000000..88ca02fe98 --- /dev/null +++ b/addons/hunterkiller/functions/fnc_turretChangedEH.sqf @@ -0,0 +1,52 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Turret changed event handler. Determine if in a master turret + * + * Arguments: + * 0: Unit + * 1: Turret + * + * Return Value: + * None + * + * Example: + * [player, [0]] call ace_hunterkiller_fnc_turretChangedEH + * + * Public: No + */ + +params ["_player", "_playerTurret"]; +TRACE_2("turretChangedEH",_player,_playerTurret); + +GVAR(mode) = 0; +GVAR(targetTurret) = []; + +if (_playerTurret isEqualTo []) exitWith {}; +private _vehicle = vehicle _player; +private _config = configOf _vehicle; + +// setVar can be real array or true/false +private _hkArray = _vehicle getVariable [QUOTE(ADDON), nil]; +if (isNil "_hkArray") then { + _hkArray = if (isArray (_config >> QUOTE(ADDON))) then { + getArray (_config >> QUOTE(ADDON)) + } else { + ((getNumber (_config >> QUOTE(ADDON))) == 1) + }; +}; +if (_hkArray isEqualTo true) then { _hkArray = [[[0], 1], [[0,0], 3]]; }; +if (_hkArray isEqualTo false) then { _hkArray = []; }; + +TRACE_1("",_hkArray); +if ((count _hkArray) != 2) exitWith {}; + +{ + _x params ["_xTurret", "_xMode"]; + TRACE_2("x",_playerTurret,_xTurret); + if (_xTurret isEqualTo _playerTurret) exitWith { + TRACE_3("seat active",typeOf _vehicle,_xTurret,_xMode); + GVAR(mode) = _xMode; + GVAR(targetTurret) = _hkArray # ((_forEachIndex + 1) % 2) # 0; + }; +} forEach _hkArray; diff --git a/addons/hunterkiller/functions/script_component.hpp b/addons/hunterkiller/functions/script_component.hpp new file mode 100644 index 0000000000..5ad82702f2 --- /dev/null +++ b/addons/hunterkiller/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\hunterkiller\script_component.hpp" diff --git a/addons/hunterkiller/script_component.hpp b/addons/hunterkiller/script_component.hpp new file mode 100644 index 0000000000..75f4a0ead5 --- /dev/null +++ b/addons/hunterkiller/script_component.hpp @@ -0,0 +1,14 @@ +#define COMPONENT hunterkiller +#define COMPONENT_BEAUTIFIED Hunter Killer +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\z\ace\addons\main\script_macros.hpp" + +#define MODE_NO_ACTIONS 0 +#define MODE_OBSERVE 1 +#define MODE_OVERRIDE 2 +#define MODE_OBSERVE_AND_OVERRIDE 3 diff --git a/addons/hunterkiller/stringtable.xml b/addons/hunterkiller/stringtable.xml new file mode 100644 index 0000000000..3152aaf8be --- /dev/null +++ b/addons/hunterkiller/stringtable.xml @@ -0,0 +1,20 @@ + + + + + Hunter Killer + + + Override + + + Force other turret to slew onto your viewpoint + + + Observe + + + Slew your turret onto other turret's viewpoint + + + diff --git a/addons/huntir/stringtable.xml b/addons/huntir/stringtable.xml index 0ee91b8b95..c24f36842f 100644 --- a/addons/huntir/stringtable.xml +++ b/addons/huntir/stringtable.xml @@ -82,7 +82,7 @@ Câmera: カメラ: 카메라: - 摄像头: + 摄像头: 攝影機: Kamera: @@ -99,7 +99,7 @@ Altitude: 高度: 고도: - 高度: + 高度: 高度: Yükseklik: @@ -116,7 +116,7 @@ Tempo de gravação: 録画時間: 녹화시간: - 记录时间: + 记录时间: 記錄時間: Kayıt süresi: @@ -133,7 +133,7 @@ Pressione ESC para sair da câmera ESC を押しカメラを抜ける ESC를 눌러 카메라 나가기 - 按下ESC退出摄像头 + 按下 ESC 退出摄像头 按下ESC退出攝影機 ESC'ye basarak çıkış yap @@ -167,7 +167,7 @@ A/D - Troca zoom A/D - 倍率の変更 A/D - 줌 전환 - A/D - 切换放大倍率 + A/D—切换放大倍率 A/D - 切換放大倍率 A/D Uzaklığı değiştir @@ -184,7 +184,7 @@ W/S - Seleciona câmera W/S - カメラを選択 W/S - 카메라 선택 - W/S - 切换摄像头 + W/S—切换摄像头 W/S - 切換攝影機 W/S- Kamerayı seç @@ -201,7 +201,7 @@ Esquerda/Direita - Rotaciona câmera Left/Right - カメラ回転 좌/우 - 카메라 돌리기 - 左/右 - 旋转摄像头 + 左/右—旋转摄像头 左/右 - 旋轉攝影機 Sol/Sağ Kamerayı döndür @@ -218,7 +218,7 @@ Acima/Abaixo - Eleva/Abaixa a câmera Up/Down - カメラ角度を変更 상/하 카메라 올리기/내리기 - 上/下 - 上升/下降摄像头 + 上/下—上升/下降摄像头 上/下 - 上升/下降攝影機 Yukarı/Asağı- Kamerayı yukarı aşağı oynat @@ -235,7 +235,7 @@ N - Troca modo IT N - IT モードを変更 N - IT모드 순환 - N - 切换热显模式 + N—切换热显模式 N - 切換熱顯模式 N- IT modülünü değiştir @@ -252,7 +252,7 @@ R - Redefine a câmera R - カメラを初期化 R - 카메라 초기화 - R - 重置摄像头 + R—重置摄像头 R - 重置攝影機 R- Kamerayı sıfırla @@ -269,7 +269,7 @@ Esc - Sai do Ajuda Esc - ヘルプ終了 Esc - 도움말 나가기 - Esc - 离开帮助 + Esc—离开帮助 Esc - 離開幫助 Esc- Çıkış Yardım diff --git a/addons/intelitems/functions/fnc_attributeFocus.sqf b/addons/intelitems/functions/fnc_attributeFocus.sqf index 798a4d9b28..e2745c487c 100644 --- a/addons/intelitems/functions/fnc_attributeFocus.sqf +++ b/addons/intelitems/functions/fnc_attributeFocus.sqf @@ -24,7 +24,7 @@ private _object = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); _control ctrlRemoveAllEventHandlers "SetFocus"; private _ctrlLabel = _display displayCtrl IDC_ATTRIBUTE_LABEL; -private _labelText = getText (configFile >> "CfgVehicles" >> typeOf _object >> "Attributes" >> QGVAR(data) >> "displayName"); +private _labelText = getText ((configOf _object) >> "Attributes" >> QGVAR(data) >> "displayName"); _ctrlLabel ctrlSetText _labelText; private _index = _object getVariable [QGVAR(index), -1]; diff --git a/addons/intelitems/functions/fnc_canPickup.sqf b/addons/intelitems/functions/fnc_canPickup.sqf index 5ca78e0045..3711f1f359 100644 --- a/addons/intelitems/functions/fnc_canPickup.sqf +++ b/addons/intelitems/functions/fnc_canPickup.sqf @@ -18,6 +18,6 @@ params ["_object", "_player"]; -private _magazineClass = getText (configFile >> "CfgVehicles" >> typeOf _object >> QGVAR(magazine)); +private _magazineClass = getText ((configOf _object) >> QGVAR(magazine)); _magazineClass != "" && {_player canAdd _magazineClass} diff --git a/addons/intelitems/functions/fnc_deleteControl.sqf b/addons/intelitems/functions/fnc_deleteControl.sqf index 8c93f85fa6..858044715f 100644 --- a/addons/intelitems/functions/fnc_deleteControl.sqf +++ b/addons/intelitems/functions/fnc_deleteControl.sqf @@ -27,7 +27,7 @@ ctrlPosition _controlsGroup params ["_posX", "_posY"]; private _ctrlContent = _controlsGroup controlsGroupCtrl IDC_CONTENT; private _data = ctrlText _ctrlContent; -if !(_data isEqualTo GET_DATA(_index)) then { +if (_data isNotEqualTo GET_DATA(_index)) then { SET_DATA(_index,_data); }; diff --git a/addons/intelitems/functions/fnc_pickup.sqf b/addons/intelitems/functions/fnc_pickup.sqf index 4d61e3a281..844c84f3f4 100644 --- a/addons/intelitems/functions/fnc_pickup.sqf +++ b/addons/intelitems/functions/fnc_pickup.sqf @@ -18,7 +18,7 @@ params ["_object", "_player"]; -private _magazineClass = getText (configFile >> "CfgVehicles" >> typeOf _object >> QGVAR(magazine)); +private _magazineClass = getText ((configOf _object) >> QGVAR(magazine)); private _index = _object getVariable [QGVAR(index), -1]; // Add magazine to inventory and get its id diff --git a/addons/intelitems/stringtable.xml b/addons/intelitems/stringtable.xml index 17b705bf79..468877176e 100644 --- a/addons/intelitems/stringtable.xml +++ b/addons/intelitems/stringtable.xml @@ -5,73 +5,89 @@ ACE Intel Items ACE Aufklärungsgegenstände ACE 情報物品 + ACE 情报物品 ACE 機密アイテム ACE Предметы с данными ACE Przedmioty Wywiadu ACE Istihbarat Eşyaları + ACE 정보 아이템 Intel Items Aufklärungsgegenstände 情報物品 + 情报物品 機密アイテム Предметы с данными Przedmioty Wywiadu Istihbarat Eşyaları + 정보 아이템 Notepad Notizblock 筆記本 + 笔记本 メモ Блокнот Notes Not Defteri + 노트패드 Notepad - Can access from the map screen Notizblock - Über die Karte abrufbar 筆記本 - 可以透過地圖界面來存取 + 笔记本—可以透过地图界面访问 メモ - マップ画面から確認可能 Блокнот - Можно получить доступ с экрана карты Notes - Dostępne z mapy Not Defteri - Haritadan erişim sağlanabilinir + 노트패드 - 지도에서 확인 가능합니다 Document Dokument 文件 + 文件 資料 Документ Dokument Döküman + 문서 Printed Document - Can access from the map screen Bedrucktes Dokument - Über die Karte abrufbar 影印文件 - 可以透過地圖界面來存取 + 影印文件—可以透过地图界面访问 メモ - マップ画面から確認可能 Распечатанный документ - Можно получить доступ с экрана карты Wydrukowane Dokumenty - Dostępne z mapy Yazılı Döküman - Haritadan erişim sağlanabilinir + 문서들 - 지도에서 확인 가능합니다 Photo Foto 相片 + 照片 写真 Фотография Zdjęcie Fotoğraf + 사진 Photo - Can access from the map screen Foto - Über die Karte abrufbar 相片 - 可以透過地圖界面來存取 + 照片—可以透过地图界面访问 写真 - マップ画面から確認可能 Фотография - Можно получить доступ с экрана карты Zdjęcie - Dostępne z mapy Fotoğraf - Haritadan erişim sağlanabilinir + 사진 - 지도에서 확인 가능합니다 Text @@ -84,17 +100,21 @@ Текст Texto 文字 + 文字 テキスト Yazı + 문자 Photo Filename Foto-Dateiname 相片名稱 + 照片文件名 写真名 Имя файла фотографии Zdjęcie Nazwa Pliku Fotoğraf Dosya Adı + 사진명 Pick Up @@ -107,8 +127,10 @@ Подобрать Recoger 撿起 + 捡起 拾う Al + 줍기 diff --git a/addons/interact_menu/CursorMenus.hpp b/addons/interact_menu/CursorMenus.hpp index 98f05082a9..79f1109598 100644 --- a/addons/interact_menu/CursorMenus.hpp +++ b/addons/interact_menu/CursorMenus.hpp @@ -9,11 +9,10 @@ class RscTitles { class GVAR(menuBackground) { idd = -1; onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuBackground)),_this select 0)]); - onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuBackground)),displayNull)]); fadeIn = 0.25; fadeOut = 0.25; movingEnable = 0; - duration = 10e10; + duration = QUOTE(10e10); name = QGVAR(menuBackground); class controls {}; class controlsBackground { diff --git a/addons/interact_menu/functions/fnc_createVehiclesActions.sqf b/addons/interact_menu/functions/fnc_createVehiclesActions.sqf index 8218242aab..814bf04f63 100644 --- a/addons/interact_menu/functions/fnc_createVehiclesActions.sqf +++ b/addons/interact_menu/functions/fnc_createVehiclesActions.sqf @@ -21,13 +21,12 @@ params ["_vehicles", "_statement", "_target"]; _vehicles apply { - private _type = typeOf _x; - private _name = getText (configFile >> "CfgVehicles" >> _type >> "displayName"); + private _name = getText ((configOf _x) >> "displayName"); private _ownerName = [_x, true] call EFUNC(common,getName); if ("" != _ownerName) then { _name = format ["%1 (%2)", _name, _ownerName]; }; - private _icon = [_type] call EFUNC(common,getVehicleIcon); + private _icon = [_x] call EFUNC(common,getVehicleIcon); private _action = [format ["%1", _x], _name, _icon, _statement, {true}, {}, _x] call EFUNC(interact_menu,createAction); [_action, [], _target] } diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index c080fa4481..bcc4340913 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -15,13 +15,21 @@ * Public: No */ +#include "\a3\ui_f\hpp\defineResincl.inc" + params ["_menuType"]; if (GVAR(openedMenuType) == _menuType) exitWith {true}; +// Conditions: Don't open when editing a text box +private _isTextEditing = (allDisplays findIf {(ctrlType (focusedCtrl _x)) == CT_EDIT}) != -1; + // Conditions: canInteract (these don't apply to zeus) -if ((isNull curatorCamera) && { - !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith)) +if ( + _isTextEditing || + {(isNull curatorCamera) && { + !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith)) + } }) exitWith {false}; while {dialog} do { diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf index 27ab70ff5e..0220a1cc39 100644 --- a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -27,21 +27,21 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; [{ params ["_args", "_pfID"]; - _args params ["_setPosition", "_addedHelpers", "_housesScaned", "_housesToScanForActions"]; + _args params ["_setPosition", "_addedHelpers", "_housesScanned", "_housesToScanForActions"]; if (!EGVAR(interact_menu,keyDown)) then { {deleteVehicle _x;} forEach _addedHelpers; [_pfID] call CBA_fnc_removePerFrameHandler; } else { // Prevent Rare Error when ending mission with interact key down: - if (isNull ace_player) exitWith {}; + if (isNull ACE_player) exitWith {}; //Make the common case fast (cursorTarget is looking at a door): - if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then { + if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScanned)}) then { if (((count (configOf cursorTarget >> "UserActions")) > 0) || {(count (getArray (configOf cursorTarget >> "ladders"))) > 0}) then { _housesToScanForActions = [cursorTarget]; } else { - _housesScaned pushBack cursorTarget; + _housesScanned pushBack cursorTarget; }; }; @@ -51,47 +51,43 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; if (_housesToScanForActions isEqualTo []) then { //If player moved >2 meters from last pos, then rescan - if (((getPosASL ace_player) distance _setPosition) < 2) exitWith {}; + if (((getPosASL ACE_player) distance _setPosition) < 2) exitWith {}; - private _nearBuidlings = nearestObjects [ace_player, ["Static"], 30]; + private _nearBuidlings = nearestObjects [ACE_player, ["Static"], 30]; { - private _typeOfHouse = typeOf _x; - if (((count (configFile >> "CfgVehicles" >> _typeOfHouse >> "UserActions")) == 0) && {(count (getArray (configFile >> "CfgVehicles" >> _typeOfHouse >> "ladders"))) == 0}) then { - _housesScaned pushBack _x; + private _configOfHouse = configOf _x; + if (((count (_configOfHouse >> "UserActions")) == 0) && {(count (getArray (_configOfHouse >> "ladders"))) == 0}) then { + _housesScanned pushBack _x; } else { _housesToScanForActions pushBack _x; }; - nil - } count (_nearBuidlings - _housesScaned); + } forEach (_nearBuidlings - _housesScanned); - _args set [0, (getPosASL ace_player)]; + _args set [0, (getPosASL ACE_player)]; } else { - private _houseBeingScaned = _housesToScanForActions deleteAt 0; - private _typeOfHouse = typeOf _houseBeingScaned; + private _houseBeingScanned = _housesToScanForActions deleteAt 0; //Skip this house for now if we are outside of it's radius //(we have to scan far out for the big houses, but we don't want to waste time adding actions on every little shack) - if ((_houseBeingScaned != cursorTarget) && {((ACE_player distance _houseBeingScaned) - ((sizeOf _typeOfHouse) / 2)) > 4}) exitWith {}; + if ((_houseBeingScanned != cursorTarget) && {((ACE_player distance _houseBeingScanned) - ((boundingBoxReal _houseBeingScanned) select 2)) > 4}) exitWith {}; - _housesScaned pushBack _houseBeingScaned; + _housesScanned pushBack _houseBeingScanned; - private _actionSet = [_typeOfHouse] call FUNC(userActions_getHouseActions); + private _actionSet = [typeOf _houseBeingScanned] call FUNC(userActions_getHouseActions); _actionSet params ["_memPoints", "_memPointsActions"]; - // systemChat format ["Add Actions for [%1] (count %2) @ %3", _typeOfHouse, (count _memPoints), diag_tickTime]; + TRACE_3("Add Actions for [%1] (count %2) @ %3",typeOf _houseBeingScanned,(count _memPoints),diag_tickTime); { - private _helperPos = _houseBeingScaned modelToWorldWorld (_houseBeingScaned selectionPosition _x); + private _helperPos = _houseBeingScanned modelToWorldWorld (_houseBeingScanned selectionPosition _x); private _helperObject = "ACE_LogicDummy" createVehicleLocal [0,0,0]; _addedHelpers pushBack _helperObject; - _helperObject setVariable [QGVAR(building), _houseBeingScaned]; + _helperObject setVariable [QGVAR(building), _houseBeingScanned]; _helperObject setPosASL _helperPos; - TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScaned); + TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScanned); { [_helperObject, 0, [], _x] call EFUNC(interact_menu,addActionToObject); - nil - } count (_memPointsActions select _forEachIndex); - + } forEach (_memPointsActions select _forEachIndex); } forEach _memPoints; }; }; -}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler; +}, 0, [((getPosASL ACE_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index e2291e2953..b0395c89c0 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -13,8 +13,8 @@ Mostra sempre il cursore delle autointerazioni Sempre mostrar cursor para interação pessoal セルフ インタラクションへ常にカーソルを表示 - 자기상호작용시 항상 커서를 보이기 - 自我互动时永远显示游标 + 자기상호작용 시 항상 커서를 보이기 + 自我互动时永远显示光标 自我互動時永遠顯示游標 Kendi kendine etkileşim için daima imleci göster @@ -30,8 +30,8 @@ Mindig legyen a cselekvés kurzorja látható Sempre mostrar cursor para interação インタラクションへ常にカーソルを表示 - 상호작용시 항상 커서를 보이기 - 互动时永远显示游标 + 상호작용 시 항상 커서를 보이기 + 互动时永远显示光标 互動時永遠顯示游標 Etkileşim için her zaman imleci göster @@ -150,7 +150,7 @@ Interação - Max. de Texto インタラクション - 文字の色 상호작용 - 문자색깔 - 互动-文字颜色最大值 + 互动—文字颜色最大值 互動 - 文字最大化 Etkileşim - Maksimum Metin @@ -167,7 +167,7 @@ Interação - Min. de Texto インタラクション - 文字の背景色 상호작용 - 문자배경색 - 互动-文字颜色最小值 + 互动—文字颜色最小值 互動 - 文字最小化 Etkileşim - Minumum Metin @@ -184,7 +184,7 @@ Interação - Max. de Sombra インタラクション - 文字への影の色 상호작용 - 문자그림자색 - 互动 - 阴影最大值 + 互动—阴影最大值 互動 - 陰影最大化 Etkileşim - Maksimum Gölge @@ -201,7 +201,7 @@ Interação - Min. de Sombra インタラクション - 文字への影の最低色 상호작용 - 문자그림자배경색 - 互动 - 阴影最小值 + 互动—阴影最小值 互動 - 陰影最小化 Etkileşim - Minumum Gölge @@ -218,7 +218,7 @@ Mantieni il cursore centrato 常にカーソルを中央にする 커서를 항상 가운데에 둡니다 - 保持游标在中心点 + 保持光标在中心点 保持游標在中心點 İmleci Ortada tut @@ -234,8 +234,8 @@ Manter o cursor centralizado e mover o menu de opções. Útil caso o tamanho da tela seja limitado. Mantieni il cursore centrato e sposta il menù intorno. Utile se lo schermo è piccolo. 常にカーソルを中央へ表示させ、オプション メニューが移動します。画面の大きさが制限されている時に使いやすくなります。 - 커서를 항상 가운데에 두고 메뉴를 움직입니다. 화면의 크기가 제한되있을때 유용합니다. - 保持游标在中心点并平移周遭的选项选单。这对在荧幕尺寸有限的玩家很有用! + 커서를 항상 가운데에 두고 메뉴를 움직입니다. 화면의 크기가 제한되있을 때 유용합니다. + 保持光标在中心点并平移周遭的选项菜单。这对在屏幕尺寸有限的玩家很有用! 保持游標在中心點並平移周遭的選項選單。這對在螢幕尺寸有限的玩家很有用! İmleci ortalanmış halde tutar ve seçenek menüsünü kaydırır. Ekran boyutu sınırlıysa kullanışlıdır. @@ -251,8 +251,8 @@ Cselekvés végrehajtása a menügomb elengedésekor Esegui l'azione quando rilasci il tasto menu メニュー キーを離した時に動作を実行 - 메뉴키를 놓을때 행동하기 - 当放开选单键后就执行动作 + 메뉴 키를 놓을 때 행동하기 + 当放开菜单键后就执行动作 當放開選單鍵後就執行動作 Menü tuşunu bırakırken işlem yap @@ -269,7 +269,7 @@ Dimensione del testo d'interazione インタラクション文字の大きさ 상호작용 - 문자크기 - 互动选单文字大小 + 互动菜单文字大小 互動選單文字大小 Etkileşim Metni Boyutu @@ -286,7 +286,7 @@ Ombra del testo d'interazione インタラクション文字へ影 상호작용 - 문자그림자 - 互动选单文字阴影 + 互动菜单文字阴影 互動選單文字陰影 Etkileşim Metni Gölgesi @@ -302,7 +302,7 @@ Hozzáférést biztosít a szöveg árnyékának kezeléséhez. A körvonal nem veszi figyelembe az egyedi árnyékszíneket. Permette di controllare l'ombra del testo. L'impostazione "Contorno" ignora il colore dell'ombra. 文字への影を設定します。縁取りは設定された影の色を無視します。 - 문자의 그림자를 조절하는것을 가능케합니다. 외각선은 임의의 그림자색을 무시합니다. + 문자의 그림자를 조절하는 것을 가능케 합니다. 외곽선은 임의의 그림자색을 무시합니다. 允许控制文字阴影。轮廓部分则会忽略自定义的阴影颜色。 允許控制文字陰影。輪廓部分則會忽略自定義的陰影顏色 Metin gölgesinin kontrolüne izin verir. Dış çizgi, özel gölge renklerini yok sayar. @@ -319,7 +319,7 @@ Körvonal Contorno 縁取り - 외각선 + 외곽선 只显示轮廓 只顯示輪廓 Dış Çizgi @@ -337,7 +337,7 @@ Sfondo Menù Interazioni インタラクション メニューの背景 상호작용 메뉴 배경 - 互动选单背景 + 互动菜单背景 互動選單背景 Etkileşim menüsü arka planı @@ -353,8 +353,8 @@ Размыть фон, пока открыто меню взаимодействия. Sfoca lo sfondo mentre il Menù Interazioni è aperto. インタラクション メニューを開いたとき、背景にボケを与えます。 - 상호작용 메뉴가 열릴시 배경을 흐릿하게 처리합니다. - 当互动选单开启时,模糊背景画面。 + 상호작용 메뉴가 열릴 시 배경을 흐릿하게 처리합니다. + 当互动菜单开启时,模糊背景画面。 當互動選單開啟時,模糊背景畫面 Etkileşim menüsü açıkken arka planı bulanıklaştırın. @@ -421,8 +421,8 @@ Добавляет действия открывания дверей и залезания на лестницы для зданий. (Примечание: возможно падение производительности при открытии меню взаимодействия, особенно в городах) Aggiunge azioni interattive per l'apertura delle porte e piazzamento scale su edifici. (Nota: C'è un costo in performance quando si apre il Menù Interazioni, soprattutto in città) 建物にある扉の開閉やはしごの昇降といった動作をインタラクションへ追加します。(街などでインタラクション メニューを開くと動作が低下します) - 건물의 문을 열거나 사다리에 오르는 상호작용 행동을 추가합니다. (주의: 상호작용 메뉴를 열경우 성능하락이 있을 수 있음, 특히 마을 내부에서) - 增加互动选单的功能在可开启的门与建筑物的梯子上。(注意: 此功能有可能会降低系统效能,特别是在城镇区更明显) + 건물의 문을 열거나 사다리에 오르는 상호작용 행동을 추가합니다. (주의: 상호작용 메뉴를 열 경우 성능하락이 있을 수 있음, 특히 마을 내부에서) + 增加互动菜单的功能在可开启的门与建筑物的梯子上。(注意:此功能有可能会降低系统效能,特别是在城镇区更明显) 增加互動選單的功能在可開啟的門與建築物的梯子上。(注意: 此功能有可能會降低系統效能,特別是在城鎮區更明顯) Binalara kapıları açmak ve merdivenleri monte etmek için etkileşim eylemleri ekler. (Not: Etkileşim menüsünü açarken, özellikle şehirlerde bir performansı etkiler) @@ -438,7 +438,7 @@ Menu d'interaction インタラクション メニュー 상호작용 메뉴 - 互动选单 + 互动菜单 互動選單 Etkileşim Menüsü @@ -454,7 +454,7 @@ Vitesse de l'animation d'interaction インタラクションのアニメーション速度 상호작용 움직임 속도 - 互动选单动画速度 + 互动菜单动画速度 互動選單動畫速度 Etkileşim Animasyon Hızı @@ -469,16 +469,16 @@ Hace la animación del menú más rápida, reduciendo el tiempo necesario para abrir sub-acciones. Rend les animations du menu plus rapide, et réduit le temps nécessaire à l'affichage des sous menus d'action. ホバーで子アクションを表示した時に出るメニューのアニメーション速度を早くしたり遅くしたりできます - 使选单的动画速度更快,并减少子选项显现出来的时间 + 使菜单的动画速度更快,并减少子选项显现出来的时间 使選單的動畫速度更快,並減少子選項顯現出來的時間 - 상호 작용을 표시하기 위해 메뉴 애니메이션을 빠르게 만들고 마우스를 가져 오는 데 필요한 시간을 줄입니다. + 상호작용을 표시하기 위해 메뉴 애니메이션을 빠르게 만들고 마우스를 가져오는 데 필요한 시간을 줄입니다. Menü animasyonlarını daha hızlı hale getirir ve alt eylemleri göstermek için fareyle üzerine gelmek için gereken süreyi azaltır Selector Color Farbauswahl セレクターの色 - 选择器颜色 + 菜单颜色 選單的顏色 Controllo Settore Kolor wybierającego @@ -488,6 +488,7 @@ Barva selektoru Selector de color Seçici Renk + 색상 선택 Consolidate single child actions @@ -497,6 +498,8 @@ Combiner les sous-actions uniques Untergeordnete Aktionen zusammenfassen Połącz akcje podrzędne + 整合子操作 + 하위 동작 통합 Combines parent action with only one child action together. @@ -506,6 +509,8 @@ Lorsqu'un menu ne contient qu'une seule sous-action, elle est combinée avec son menu parent. Übergeordnete Aktionen mit nur einer Unteraktion zusammenfassen. Gdy menu zawiera tylko jedną akcję podrzędną, łączy ją z akcją nadrzędną. + 主操作与子操作集成显示。 + 대분류로 나뉜 행동을 한눈에 보여줍니다 diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index d20ff1ac6e..c88e93c095 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -644,7 +644,8 @@ class CfgVehicles { class ACE_SelfActions {}; }; - class PlasticCase_01_base_F: ThingX { + class Items_base_F; + class PlasticCase_01_base_F: Items_base_F { class ACE_Actions { class ACE_MainActions { displayName = CSTRING(MainAction); diff --git a/addons/interaction/functions/fnc_openDoor.sqf b/addons/interaction/functions/fnc_openDoor.sqf index cffb9e2410..fae63a9533 100644 --- a/addons/interaction/functions/fnc_openDoor.sqf +++ b/addons/interaction/functions/fnc_openDoor.sqf @@ -47,7 +47,7 @@ if ((_house animationPhase (_animations select 0) <= 0) && {_house getVariable [ // Add handle on carrier if (typeOf _house == "Land_Carrier_01_island_01_F") then { - private _handle = format ["door_handle_%1_rot_1", (_animations select 0) select [5, 1]]; + private _handle = format ["door_handle_%1_rotate_1", (_animations select 0) select [5, 1]]; TRACE_1("carrier handle",_handle); _animations pushBack _handle; }; diff --git a/addons/interaction/functions/fnc_renameGroupUI.sqf b/addons/interaction/functions/fnc_renameGroupUI.sqf index e9b46d0f83..2fdac954e1 100644 --- a/addons/interaction/functions/fnc_renameGroupUI.sqf +++ b/addons/interaction/functions/fnc_renameGroupUI.sqf @@ -26,7 +26,7 @@ _display displayAddEventHandler ["Unload", { params ["_display", "_exitCode"]; - if !(_exitCode isEqualTo 1) exitWith {}; + if (_exitCode isNotEqualTo 1) exitWith {}; private _group = _display getVariable QGVAR(renamedGroup); private _textCtrl = _display displayCtrl 451; diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 4bda1e8c12..91e059b8b4 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -6,7 +6,7 @@ Interaktion Interazione 互動 - 互动 + 互动菜单 インタラクション 상호작용 Interakcja @@ -80,7 +80,7 @@ Braccio sinistro Braço Esquerdo 左腕 - 왼쪽 팔 + 왼팔 左手 左手 Sol Kol @@ -97,7 +97,7 @@ Braccio destro Braço Direito 右腕 - 오른쪽 팔 + 오른팔 右手 右手 Sağ Kol @@ -114,7 +114,7 @@ Gamba sinistra Perna Esquerda 左足 - 왼쪽 다리 + 왼다리 左脚 左腳 Sol Bacak @@ -131,7 +131,7 @@ Gamba destra Perna Direita 右足 - 오른쪽 다리 + 오른다리 右脚 右腳 Sağ Bacak @@ -166,7 +166,7 @@ Menù interazione インタラクション メニュー 상호작용 메뉴 - 互动选单 + 互动菜单 互動選單 Etkileim Menüsü @@ -183,7 +183,7 @@ Menù interazione (individuale) インタラクション メニュー (セルフ) 상호작용 메뉴(자신) - 互动选单 (自我) + 互动菜单(自我) 互動選單 (自我) Etkileşim Menüsü(Şahsi) @@ -233,7 +233,7 @@ Odblokuj drzwi Odemknout dveře ドアの鍵をあける - 잠긴문 열기 + 잠긴 문 열기 解锁门 解鎖門 Kapının Kilidini Aç @@ -330,6 +330,8 @@ Переименовать группу Gruppe umbenennen Zmień nazwę grupy + 小队重命名 + 그룹 명칭 다시 짓기 This group name is already in use. @@ -338,6 +340,8 @@ Данное имя группы уже используется. Dieser Gruppenname ist bereits in Verwendung. Ta nazwa grupy jest już w użyciu. + 该小队名称已被使用 + 그 명칭은 이미 사용 중 입니다. NEW GROUP NAME: @@ -346,6 +350,8 @@ НОВОЕ ИМЯ ГРУППЫ NEUER GRUPPENNAME: NOWA NAZWA GRUPY: + 新的小队名: + 새 그룹 명칭: DANCE! @@ -376,7 +382,7 @@ Parar de dançar Smetti di ballare 踊るのを止める - 춤 멈추기 + 춤 그만 추기 停止跳舞 停止跳舞 Dans Etmeyi Durdur @@ -513,7 +519,7 @@ Via di qui! 失せろ! 저리 가! - 走开! + 走开! 走開! Git! @@ -530,7 +536,7 @@ A terra! 伏せろ! 엎드려! - 趴下! + 趴下! 趴下! Yat! @@ -681,7 +687,7 @@ Assigner à bleu Assegna al team blu ブルーにする - 파랑이 등록 + 파랑에 등록 指派为蓝组 指派為藍組 Maviye Ata @@ -930,6 +936,7 @@ Перевернуть ひっくり返す + 翻动 Gira Przewróć Virar @@ -937,6 +944,7 @@ Otočit Voltear Döndür + 뒤집기 Interact @@ -1036,7 +1044,7 @@ Possono i giocatori usare il Menù Managment Squadra? Default: Si プレイヤーがチーム管理メニューを使えるかどうかを設定します。標準: 有効化 플레이어들이 팀 설정하는 것을 허락합니까? 기본설정: 예 - 允许玩家使用小队管理选单? 预设: 是 + 允许玩家使用小队管理菜单? 预设:是 允許玩家使用小隊管理選單? 預設: 是 Oyuncuların Takım Yönetimi Menüsünü kullanmalarına izin verilmeli mi? Varsayılan: Evet @@ -1047,7 +1055,7 @@ Disabilita valutazione negativa 關閉負面評價 关闭负面评价 - 부정행위 가중치 사용안함 + 부정행위 가중치 사용 안함 Wyłącz negatywną ocenę Отключить отрицательный рейтинг Desativar avaliação negativa @@ -1061,8 +1069,8 @@ 否定評価を受けますか?有効化した場合プレイヤーは肯定評価のみを受け、友軍の装備を壊したり殺害をしても AI からの攻撃を防ぎます。 I giocatori dovrebbero ricevere delle valutazioni negative ? Quando è abilitato i giocatori ricevono esclusivamente valutazioni positive che prevengono il fuoco delle AI alleate quando distruggono equipaggiamenti o uccidono membri della squadra. 玩家是否會收到負面評價? 當本功能開啟時玩家只會接收到正面評價,所以當玩家做出擊殺友軍AI、毀壞友軍裝備或殺害小隊夥伴都不會收到負面評價 - 玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。 - 플레이어의 부정행위 가중치를 계산합니까? 활성화된 플레이어는 높은 레이팅을 가질때, 아군의 장비나 병력을 사격해도 아군 AI의 사격을 받지 않습니다. + 玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军 AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。 + 플레이어의 부정행위 가중치를 계산합니까? 활성화된 플레이어는 낮은 부정행위 가중치를 가질 때, 아군의 장비나 병력을 사격해도 아군 AI의 사격을 받지 않습니다. Czy powinni gracze otrzymywać negatywną ocenę? Kiedy aktywowani gracze otrzymuję wyłącznie pozytywną ocenę, która zapobiega ognia przyjaznego SI podczas niszczenia przyjaznego wyposażenia lub zabijaniu członków drużyny. Должны ли игроки получать отрицательный рейтинг? Когда включено, игроки получают только положительный рейтинг, что предотвращает дружественный огонь от ИИ при уничтожении дружественного оборудования или убийстве членов команды. Jogadores devem receber uma avaliação negativa? Quando ativado, os jogadores estão recebendo avaliações positivas, prevenindo que IA amigável atire quando destruir algum equipamento aliado ou matar membros de equipe. @@ -1202,7 +1210,7 @@ Вытащить тело 身体を引き出す Estrai il corpo - 시체 끌기 + 인원 꺼내기 拿出屍體 拿出尸体 Wyciągnij ciało @@ -1226,6 +1234,8 @@ 踹開擋風玻璃 Romper parabrisas Ön camı parçala + 砸碎挡风玻璃 + 전면유리 부수기 Attach %1 @@ -1235,6 +1245,8 @@ Fixer %1 Przyczep %1 Befestige %1 + 附加 %1 + %1 붙이기 Detach %1 @@ -1244,6 +1256,8 @@ Retirer %1 Odczep %1 Löse %1 + 拆卸 %1 + %1 떼내기 Enables attach/detach weapon attachment actions for current weapon. @@ -1253,6 +1267,8 @@ Cette option permet de fixer/retirer des accessoires d'arme à partir du menu d'interaction personnel. Włącza akcje przyczepienia/odczepienia dodatków dla obecnej broni Aktiviert das Befestigen/Lösen von Waffenausätzen an der aktuellen Waffe. + 启用当前武器的附加/拆卸武器配件的动作。 + 현재 사용하고 있는 무기에서 부착물을 붙이거나 떼냅니다. Allow group rename @@ -1261,6 +1277,8 @@ Разрешить переименование группы Erlaube das Umbenennen der Gruppe Zezwól na zmianę nazwy grupy + 允许小队重命名 + 그룹 이름 재설정 허가 Allows a group leader to rename their group if the name is not already taken. @@ -1269,6 +1287,8 @@ Разрешить лидеру группы её переименование, если имя не занято. Erlaube Gruppenführer das Umbenennen Ihrer Gruppe, wenn der Name nicht bereits vergeben ist. Pozwala liderowi grupy na zmianę jej nazwy, jeżeli ta nazwa nie jest już w użyciu. + 允许队长在队名未被占用的情况下重命名。 + 그룹 리더가 그룹 이름을 재설정 하는 것을 허가합니다. Warning: can cause some objects to collide with others. @@ -1277,6 +1297,8 @@ 警告: 一部のオブジェクトが干渉する可能性があります。 Achtung: einige Objekte könnten mit anderen Kollidieren. Uwaga: niektóre obiekty mogą kolidować z innymi. + 警告:会导致一些物体与其他物体发生碰撞。 + 주의: 물체끼리 충돌하는 현상이 있을 수 있음. diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index e5ed300836..026e23476c 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -30,8 +30,8 @@ Normalmente il menù inventario è scalato in base alle dimensioni dell'interfaccia. Questa opzione permette di ingrandirlo ulteriormente ma senza aumentare la dimensione del testo. Normalmente o tamanho da tela do inventário é ditada pelo tamanho da UI. Isso permite aumentar o tamanho da tela de inventário, mas não aumenta o tamanho da fonte, permitindo que mais linhas sejam visualizadas. 通常、インベントリは UI の大きさにより調整して表示されます。これはインベントリ UI を大きくできますが、文字は大きくできません。 - 보통 소지품 화면은 사용자 인터페이스 크기에 비례합니다. 이 항목은 소지품의 사용자 인터페이스를 확대를 가능케하면서 글씨는 그대로 냅두게 해줍니다. - 一般来说,物品清单尺寸是由使用者介面来决定的。此选项能让你的物品显示清单更大但不会增加字体大小,此举可增加更多能被显示的描述行数! + 보통 소지품 화면은 사용자 인터페이스 크기에 비례합니다. 이 항목은 소지품의 사용자 인터페이스를 확대를 가능케 하면서 글씨는 그대로 놔두게 해줍니다. + 一般来说,物品清单尺寸是由使用者界面来决定的。此选项能让你的物品显示清单更大但不会增加字体大小,此举可增加更多能被显示的描述行数! 一般來說,物品清單尺寸是由使用者介面來決定的。此選項能讓你的物品顯示清單更大但不會增加字體大小,此舉可增加更多能被顯示的描述行數! Normalde envanter görüntüleme, kullanıcı arayüzü boyutuna göre ölçeklenir. Bu, Envanter kullanıcı arayüzü boyutunu büyütmeye izin verir, ancak daha fazla satır görüntülenmesine izin vermek için yazı tipi boyutunu büyütmez. diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 4200722da0..0054cf4f03 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -14,7 +14,7 @@ Travar Alvo(Segurar) 目標を捕捉 (長押し) 표적 획득 (누르기) - 锁定目标 (按住) + 锁定目标(按住) 鎖定目標 (按住) Hedefe Kilitlen(Basılı Tut) diff --git a/addons/kestrel4500/RscTitles.hpp b/addons/kestrel4500/RscTitles.hpp index b4a85951be..88d4cacb0e 100644 --- a/addons/kestrel4500/RscTitles.hpp +++ b/addons/kestrel4500/RscTitles.hpp @@ -223,7 +223,6 @@ class RscTitles { class RscKestrel4500 { idd=-1; onLoad="with uiNameSpace do { RscKestrel4500 = _this select 0 };"; - onUnload=(_this call FUNC(onCloseDisplay)); movingEnable=0; duration=60; fadeIn="false"; diff --git a/addons/kestrel4500/XEH_PREP.hpp b/addons/kestrel4500/XEH_PREP.hpp index 7d062c9ac8..ce9ecf95db 100644 --- a/addons/kestrel4500/XEH_PREP.hpp +++ b/addons/kestrel4500/XEH_PREP.hpp @@ -7,7 +7,6 @@ PREP(displayKestrel); PREP(generateOutputData); PREP(measureWindSpeed); PREP(onCloseDialog); -PREP(onCloseDisplay); PREP(restoreUserData); PREP(storeUserData); PREP(updateDisplay); diff --git a/addons/kestrel4500/functions/fnc_onCloseDisplay.sqf b/addons/kestrel4500/functions/fnc_onCloseDisplay.sqf deleted file mode 100644 index 09e5941a77..0000000000 --- a/addons/kestrel4500/functions/fnc_onCloseDisplay.sqf +++ /dev/null @@ -1,19 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Ruthberg - * Called if Kestrel Display is closed - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ace_kestrel4500_fnc_onCloseDisplay - * - * Public: No - */ - -uiNamespace setVariable ['RscKestrel4500', nil]; -GVAR(Overlay) = false; diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index 1ce5294745..f6580aa507 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -13,8 +13,8 @@ Kestrel 4500NV Kestrel 4500NV ケストレル 4500NV - Kestrel 4500NV - 猎隼4500测风仪 + 케스트렐 4500NV + 猎隼4500 测风仪 獵隼4500測風儀 Kestrel 4500NV @@ -30,8 +30,8 @@ Kestrel 4500 kézi szél-és időjárásmérő Příruční meteostanice Kestrel 4500 ケストレル 4500 携帯型風速計 - Kestrel 4500 휴대형 기상 관측기 - 猎隼4500掌上型天气追踪仪 + 케스트렐 4500 휴대형 기상 관측기 + 猎隼4500 掌上型天气追踪仪 獵隼4500掌上型天氣追蹤儀 Kestrel 4500 Cep Hava Durumu Izleyicisi @@ -47,8 +47,8 @@ Abrir Kestrel 4500 Otevřít Kestrel 4500 Kestrel 4500 を開く - Kestrel 4500 열기 - 开启猎隼4500测风仪 + 케스트렐 4500 열기 + 开启猎隼4500 测风仪 開啟獵隼4500測風儀 Aç Kestrel 4500 @@ -64,8 +64,8 @@ Zobrazit Kestrel 4500 Mostrar Kestrel 4500 ケストレル 4500 を見る - Kestrel 4500 보이기 - 显示猎隼4500测风仪 + 케스트렐 4500 보이기 + 显示猎隼4500 测风仪 顯示獵隼4500測風儀 Göster Kestrel 4500 @@ -81,8 +81,8 @@ Skrýt Kestrel 4500 Ocultar Kestrel 4500 Kestrel 4500 を隠す - Kestrel 4500 숨기기 - 隐藏猎隼4500测风仪 + 케스트렐 4500 숨기기 + 隐藏猎隼4500 测风仪 隱藏獵隼4500測風儀 Gizle Kestrel 4500 @@ -98,8 +98,8 @@ Otevřít Kestrel 4500 Abrir Kestrel 4500 ケストレル 4500 を開く - Kestrel 4500 열기 - 开启猎隼4500测风仪 + 케스트렐 4500 열기 + 开启猎隼4500 测风仪 開啟獵隼4500測風儀 Aç Kestrel 4500 @@ -115,8 +115,8 @@ Zobrazit Kestrel 4500 Mostrar Kestrel 4500 ケストレル 4500 を見る - Kestrel 4500 숨기기 - 显示猎隼4500测风仪 + 케스트렐 4500 숨기기 + 显示猎隼4500 测风仪 顯示獵隼4500測風儀 Göster Kestrel 4500 diff --git a/addons/killtracker/README.md b/addons/killtracker/README.md index f96e43e2a2..81b98a6b50 100644 --- a/addons/killtracker/README.md +++ b/addons/killtracker/README.md @@ -1,7 +1,8 @@ ace_killtracker ============ -Tracks deaths/kills and logs to the end mission disaplay. Attemps to log kills from Medical by using `ace_medical_lastDamageSource`. +Tracks deaths/kills and logs to the end mission disaplay. +Show detailed info from player kills from ACE Medical by using `ace_killed` event. Note: Requires config setup in a mission, see `killtracker.inc` - has no effect if mission is not setup correctly. diff --git a/addons/killtracker/XEH_postInit.sqf b/addons/killtracker/XEH_postInit.sqf index b11b1fa4e0..2f75baa929 100644 --- a/addons/killtracker/XEH_postInit.sqf +++ b/addons/killtracker/XEH_postInit.sqf @@ -19,6 +19,10 @@ if ((getText (missionconfigfile >> "CfgDebriefingSections" >> QUOTE(XADDON) >> "variable")) != QXGVAR(outputText)) exitWith { TRACE_1("no mission debriefing config",_this); }; +if (!(["ACE_Medical"] call EFUNC(common,isModLoaded))) exitWith { + WARNING("No ACE-Medical"); + XGVAR(outputText) = "No ACE-Medical"; +}; private _global = missionNamespace getVariable [QGVAR(globalSync), false]; // Global Sync (e.g. for spectator) INFO_1("Running Kill Tracking [Global: %1]",_global); @@ -61,7 +65,7 @@ GVAR(killCount) = 0; if (!isNull _killer) then { if (!(_killer isKindof "CAManBase")) then { // If killer is a vehicle log the vehicle type - _killInfo pushBack format [LLSTRING(Vehicle), getText (configfile >> "CfgVehicles" >> (typeOf _killer) >> "displayName")]; + _killInfo pushBack format [LLSTRING(Vehicle), getText ((configOf _killer) >> "displayName")]; }; if (isNull _instigator) then { _instigator = effectiveCommander _killer; @@ -78,7 +82,7 @@ GVAR(killCount) = 0; // Log firendly fire private _fnc_getSideFromConfig = { params ["_object"]; - switch (getNumber (configFile >> "CfgVehicles" >> (typeOf _object) >> "side")) do { + switch (getNumber ((configOf _object) >> "side")) do { case (0): {east}; case (1): {west}; case (2): {resistance}; @@ -113,7 +117,7 @@ GVAR(killCount) = 0; } else { _killerName = _killer getVariable [QGVAR(aiName), ""]; // allow setting a custom AI name (e.g. VIP Target) if (_killerName == "") then { - _killerName = format ["*AI* - %1", getText (configfile >> "CfgVehicles" >> (typeOf _killer) >> "displayName")]; + _killerName = format ["*AI* - %1", getText ((configOf _killer) >> "displayName")]; }; }; }; @@ -129,7 +133,7 @@ GVAR(killCount) = 0; } else { _unitName = _unit getVariable [QGVAR(aiName), ""]; // allow setting a custom AI name (e.g. VIP Target) if (_unitName == "") then { - _unitName = format ["*AI* - %1", getText (configfile >> "CfgVehicles" >> (typeOf _unit) >> "displayName")]; + _unitName = format ["*AI* - %1", getText ((configOf _unit) >> "displayName")]; }; }; TRACE_3("send kill event",_killer,_unitName,_killInfo); diff --git a/addons/killtracker/config.cpp b/addons/killtracker/config.cpp index 8164c08f7c..7cda7110d4 100644 --- a/addons/killtracker/config.cpp +++ b/addons/killtracker/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_medical"}; + requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); authors[]= {"PabstMirror"}; url = ECSTRING(main,URL); diff --git a/addons/killtracker/stringtable.xml b/addons/killtracker/stringtable.xml index 0cd0af2d42..3edf073469 100644 --- a/addons/killtracker/stringtable.xml +++ b/addons/killtracker/stringtable.xml @@ -6,6 +6,8 @@ ACE キルトラッカー ACE Abgeschossene Ereignisse ACE Licznik Zabójstw + ACE 击杀事件 + ACE 사살 이벤트 Total Kills: @@ -14,6 +16,8 @@ Toplam Öldürme: 総キル: Gesammte Abschüsse: + 总击杀数: + 총 사살수: Kill: %1 %2 @@ -22,6 +26,8 @@ Öldürülen: %1 %2 キル: %1 %2 Abschuss: %1 %2 + 击杀:%1 %2 + 사살: %1 %2 Killer: %1 %2 @@ -30,6 +36,8 @@ Öldüren: %1 %2 キラー: %1 %2 Täter: %1 %2 + 击杀者:%1 %2 + 사살자: %1 %2 Vehicle: %1 @@ -38,6 +46,8 @@ Araç :%1 車両: %1 Fahrzeuge %! + 载具:%1 + 차량: %1 Friendly Fire @@ -51,7 +61,7 @@ Střelba do vlastních! Fogo amigo 아군 오인사격 - 友军误射 + 友军误击 同士討ち Dost Atışı diff --git a/addons/laser/XEH_PREP.hpp b/addons/laser/XEH_PREP.hpp index 6af5643e23..8f75906346 100644 --- a/addons/laser/XEH_PREP.hpp +++ b/addons/laser/XEH_PREP.hpp @@ -1,5 +1,6 @@ PREP(addLaserTarget); +PREP(addMapHandler); PREP(dev_drawVisibleLaserTargets); PREP(findLaserSource); PREP(handleLaserTargetCreation); diff --git a/addons/laser/XEH_postInit.sqf b/addons/laser/XEH_postInit.sqf index 84a3416e50..2ede72f372 100644 --- a/addons/laser/XEH_postInit.sqf +++ b/addons/laser/XEH_postInit.sqf @@ -6,6 +6,13 @@ if (hasInterface) then { GVAR(pfID) = -1; ["CBA_settingsInitialized", { + // Handle Map Drawing + GVAR(mapLaserSource) = objNull; + ["ACE_controlledUAV", LINKFUNC(addMapHandler)] call CBA_fnc_addEventHandler; + ["turret", LINKFUNC(addMapHandler), false] call CBA_fnc_addPlayerEventHandler; + ["unit", LINKFUNC(addMapHandler), true] call CBA_fnc_addPlayerEventHandler; + + // Laser code display ["turret", LINKFUNC(showVehicleHud), false] call CBA_fnc_addPlayerEventHandler; ["vehicle", LINKFUNC(showVehicleHud), true] call CBA_fnc_addPlayerEventHandler; // only one of these needs the retro flag diff --git a/addons/laser/functions/fnc_addMapHandler.sqf b/addons/laser/functions/fnc_addMapHandler.sqf new file mode 100644 index 0000000000..a731ddce2f --- /dev/null +++ b/addons/laser/functions/fnc_addMapHandler.sqf @@ -0,0 +1,70 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Add laser drawing to map + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_laser_fnc_addMapHandler + * + * Public: No + */ +TRACE_3("addMapHandler",ace_player,typeOf vehicle ace_player,ACE_controlledUAV); + +GVAR(mapLaserSource) = call { + if (GVAR(showLaserOnMap) == 0) exitWith { + TRACE_1("setting - disabled",GVAR(showLaserOnMap)); + objNull + }; + if (alive (ACE_controlledUAV # 0)) exitWith { + TRACE_1("using UAV",objNull); + ACE_controlledUAV # 0; + }; + if (GVAR(showLaserOnMap) == 1) exitWith { + TRACE_1("setting - no UAV",GVAR(showLaserOnMap)); + objNull + }; + private _player = ace_player; + private _vehicle = vehicle _player; + if ((_player != _vehicle) && {_player in [gunner _vehicle, commander _vehicle]}) exitWith { + TRACE_1("using player's vehicle",_vehicle); + _vehicle + }; + if (GVAR(showLaserOnMap) == 2) exitWith { + TRACE_1("setting - no UAV or vehicle",GVAR(showLaserOnMap)); + objNull + }; + TRACE_1("using player",_player); + _player +}; + +if (!alive GVAR(mapLaserSource)) exitWith {}; + +[{!isNull findDisplay 12}, // for some reason the display is null for the frame when starting to control drone +{ + private _map = ((findDisplay 12) displayCtrl 51); + private _ehID = _map getVariable [QGVAR(ehID), -1]; + if (_ehID > -1) exitWith {}; + _ehID = _map ctrlAddEventHandler ["Draw", { + if (!alive GVAR(mapLaserSource)) exitWith {}; + private _laserTarget = laserTarget GVAR(mapLaserSource); + if (!alive _laserTarget) exitWith {}; + + params ["_map"]; + _map drawLine [getPos _laserTarget, getPos GVAR(mapLaserSource), [1,0,0,0.333]]; + _map drawIcon [ + "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa", + [1,0,1,1], + (getPos _laserTarget), + 16, 16, + ((getDir _laserTarget) + 90) + ]; + }]; + TRACE_2("added map drawEH",_map,_ehID); + _map setVariable [QGVAR(ehID), _ehID]; +}, []] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf index 089c25e0a0..c5677d3bf7 100644 --- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -164,8 +164,9 @@ if ((count _spots) > 0) then { { _x params ["_xPos", "_owner"]; _finalPos = _finalPos vectorAdd _xPos; - private _count = _ownersHash getOrDefault [hashValue _owner, 0]; - _ownersHash set [hashValue _owner, _count + 1]; + private _value = _ownersHash getOrDefault [hashValue _owner, [0, _owner]]; + _value set [0, 1 + _value#0]; + _ownersHash set [hashValue _owner, _value]; } forEach _finalBucket; _finalPos = _finalPos vectorMultiply (1 / (count _finalBucket)); @@ -174,8 +175,10 @@ if ((count _spots) > 0) then { { //IGNORE_PRIVATE_WARNING ["_x", "_y"]; - if (_y > _maxOwnerCount) then { - _finalOwner = _x; + _y params ["_count", "_owner"]; + if (_count > _maxOwnerCount) then { + _maxOwnerCount = _count; + _finalOwner = _owner; }; } forEach _ownersHash; }; diff --git a/addons/laser/initSettings.sqf b/addons/laser/initSettings.sqf index 128e56d3f9..a7574e55ad 100644 --- a/addons/laser/initSettings.sqf +++ b/addons/laser/initSettings.sqf @@ -1,4 +1,4 @@ -private _category = [LELSTRING(common,categoryUncategorized), localize "str_a3_itemtype_laser"]; +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(laser)]; [ QGVAR(dispersionCount), "SLIDER", @@ -7,3 +7,15 @@ private _category = [LELSTRING(common,categoryUncategorized), localize "str_a3_i [0, 5, 2, -1], 1 ] call CBA_fnc_addSetting; + +[ + QGVAR(showLaserOnMap), "LIST", + [LSTRING(showLaserOnMap), LSTRING(showLaserOnMap_tooltip)], + _category, + [ + [0, 1, 2, 3], + [LELSTRING(Common,Disabled), "STR_A3_CfgEditorSubcategories_EdSubcat_Drones0", "str_dn_vehicles", LELSTRING(common,Always)], + 1 + ], + true +] call CBA_fnc_addSetting; diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index 4663712840..846a3d168a 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -1,6 +1,23 @@ + + Laser + Laser + Laser + Laser + Лазер + Laser + Lézer + Láser + Laser + Laser + レーザー + 레이저 + 激光 + 雷射 + Lazer + Laser Dispersion Simulation Count レーザーの分散シミュレート数 @@ -9,7 +26,7 @@ Wskaźnik poziomu rozproszenia wiązki lasera Nombre de simulations pour la dispersion du laser Contatore di Simulazione della Dispersione del Laser - 雷射散射模拟计算 + 激光色散模拟计数 雷射散射模擬計算 Число симуляций рассеивания лазерного луча Contador da Simulação de Dispersão de Laser @@ -30,7 +47,7 @@ Codice laser レーザ コード 레이저 코드 - 雷射码 + 激光码 雷射碼 Lazer Kod @@ -47,7 +64,7 @@ Laser - Cambia codice + レーザ - コードの数値を増やす 레이저 - 코드 순환 위 - 雷射 - 循环切换雷射码 上 + 激光—循环切换激光码 上 雷射 - 循環切換雷射碼 上 Lazer - Çevrim Kodu Yukarı @@ -64,9 +81,23 @@ Laser - Cambia codice - レーザ - コードの数値を減らす 레이저 - 코드 순환 아래 - 雷射 - 循环切换雷射码 下 + 激光—循环切换激光码 下 雷射 - 循環切換雷射碼 下 Lazer - Çevrim Kodu aşağı + + Draw Laser on Map + 地図上にレーザーを表示する + Rysuj Laser na Mapie + 맵에 레이저 그리기 + 在地图上绘制激光 + + + Active laser designator's position will be drawn on the map + アクティブな指示レーザーの位置が地図上に描画されます + Pozycja aktywnego wskaźnika laserowego będzie rysowana na mapie. + 지도에 능동 레이저 표시기의 위치가 그려집니다. + 激活的激光指示器本身及其标记的点会在地图上显示 + diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 9418705ceb..fb93914b44 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -14,7 +14,7 @@ Laser レーザ ポインタ 레이저 지시기 - 雷射指示器 + 激光指示器 雷射指示器 Lazer Işaretleyici @@ -31,7 +31,7 @@ Laser (vermelho) レーザ ポインタ (赤) 레이저 지시기 (빨강) - 雷射指示器 (红色) + 激光指示器(红色) 雷射指示器 (紅色) Lazer Işaretleyici (Kırmızı) @@ -48,7 +48,7 @@ Laser (verde) レーザ ポインタ (緑) 레이저 지시기 (초록) - 雷射指示器 (绿色) + 激光指示器(绿色) 雷射指示器 (綠色) Lazer Işaretleyici (Yeşil) @@ -65,7 +65,7 @@ Emite luz visível. 可視光をだします。 밝은 곳에서도 보임 - 发射出可见光 + 发出可见激光 發射出可見光 Görünür ışık yayar. @@ -82,7 +82,7 @@ <t color='#9cf953'>Használat: </t>Lézer BE/KI kapcsolása <t color='#9cf953'>つかう: </t>レーザの起動/停止 <t color='#9cf953'>사용키: </t>레이저 켜기/끄기 - <t color='#9cf953'>使用: </t>雷射开启/关闭 + <t color='#9cf953'>使用:</t>激光开启/关闭 <t color='#9cf953'>使用: </t>雷射開啟/關閉 <t color='#9cf953'>Use: </t>Turn Laser ON/OFF @@ -97,9 +97,9 @@ Lézer Laser Laser - レーザ + レーザー 레이저 - 雷射 + 激光 雷射 Lazer @@ -116,7 +116,7 @@ Laser IV 赤外線レーザ 적외선 레이저 - 红外线雷射 + 红外线激光 紅外線雷射 IR Lazer @@ -132,8 +132,8 @@ Přepnout Laser / Infračervený Laser Alternar entre Laser / Laser IV レーザ/赤外線レーザを切り替える - 레이저 / 적외선 레이저 전환 - 切换雷射/红外线雷射 + 가시광/적외선 레이저 전환 + 切换激光/红外线激光 切換雷射/紅外線雷射 Değiştir Lazer/IR Lazer diff --git a/addons/logistics_rope/CfgWeapons.hpp b/addons/logistics_rope/CfgWeapons.hpp index 4efb85f51b..c5f1b384a2 100644 --- a/addons/logistics_rope/CfgWeapons.hpp +++ b/addons/logistics_rope/CfgWeapons.hpp @@ -4,7 +4,7 @@ class CfgWeapons { class ACE_ropeBase: ACE_ItemCore { scope = 1; picture = QPATHTOF(data\m_rope_ca); - model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; + // model = "\A3\Structures_F_Heli\Items\Tools\Rope_01_F.p3d"; // model is Locked to Helicopter DLC descriptionShort = CSTRING(descriptionShort); }; diff --git a/addons/logistics_rope/stringtable.xml b/addons/logistics_rope/stringtable.xml index b91b7ec1c3..bacea70fde 100644 --- a/addons/logistics_rope/stringtable.xml +++ b/addons/logistics_rope/stringtable.xml @@ -8,6 +8,8 @@ Витой канат. ООбычно используется для спуска или буксирования. Ein verdrehtes Geflecht aus Fasern. Wird normalerweise zum Abseilen oder Abschleppen verwendet. Lina skręcona z włókien. Zwykle używana do zjazdów lub holowania. + 编织绳。通常用于索降和牵引拖曳。 + 꼬아진 섬유입니다. 주로 레펠이나 견인에 사용됩니다. Rope 3.2 meters @@ -21,6 +23,8 @@ 3.2 metre halat Cuerda de 3.2 metros ロープ (3.2 メートル) + 绳索(3.2米) + 줄 (3.2m) Rope 6.2 meters @@ -34,6 +38,8 @@ 6.2 metre halat Cuerda de 6.2 metros ロープ (6.2 メートル) + 绳索(6.2米) + 줄 (6.2m) Rope 12.2 meters @@ -44,10 +50,12 @@ Канат 12.2 метров Corda (12.2m) 繩索(12.2公尺長) + 绳索(12.2米) Corda da 12.2 metri Lano 12.2 metrů 12.2 metre halat Cuerda de 12.2 metros + 줄 (12.2m) Rope 15.2 meters @@ -58,10 +66,12 @@ Канат 15.2 метров Corda (15.2m) 繩索(15.2公尺長) + 绳索(15.2米) Corda da 15.2 metri Lano 15.2 metrů 15.2 metre halat Cuerda de 15.2 metros + 줄 (15.2m) Rope 18.3 meters @@ -72,10 +82,12 @@ Канат 18.3 метров Corda (18.3m) 繩索(18.3公尺長) + 绳索(18.3米) Corda da 18.3 metri Lano 18.3 metrů 18.3 metre halat Cuerda de 18.3 metros + 줄 (18.3m) Rope 27.4 meters @@ -86,10 +98,12 @@ Канат 27.4 метров Corda (27.4m) 繩索(27.4公尺長) + 绳索(27.4米) Corda da 27.4 metri Lano 27.4 metrů 27.4 metre halat Cuerda de 27.4 metros + 줄 (27.4m) Rope 36.6 meters @@ -100,10 +114,12 @@ Канат 36.6 метров Corda (36.6m) 繩索(36.6公尺長) + 绳索(36.6米) Corda da 36.6 metri Lano 36.6 metrů 36.6 metre halat Cuerda 36.6 metros + 줄 (36.6m) diff --git a/addons/logistics_uavbattery/stringtable.xml b/addons/logistics_uavbattery/stringtable.xml index 1cfe226eef..5ca12e7d4e 100644 --- a/addons/logistics_uavbattery/stringtable.xml +++ b/addons/logistics_uavbattery/stringtable.xml @@ -13,8 +13,8 @@ Il drone è pieno БПЛА полностью заряжен ドローンは充電完了 - 무인기 충전완료 - 无人载具电池已充满 + 무인기 충전 완료 + 无人机电池已充满 無人載具電池已充滿 IHA Dolu @@ -31,7 +31,7 @@ Требуется аккумулятор для БПЛА UAV バッテリが必要です 무인기 배터리가 필요합니다 - 你需要一个无人载具电池 + 你需要一个无人机电池 你需要一個無人載具電池 UAV Bataryaya ihtiyacın var @@ -65,7 +65,7 @@ Аккумулятор БПЛА UAV バッテリ 무인기 배터리 - 无人载具电池 + 无人机电池 無人載具電池 UAV Batarya @@ -81,8 +81,8 @@ Usata per ricaricare la Batteria dell'UAV Используется для зарядки переносных БПЛА 運んでいる UAV を充電に使う - 무인기를 재충전 할때 씁니다. - 对可携式无人载具进行充电 + 무인기를 재충전 할 때 씁니다. + 对可携式无人机进行充电 對可攜式無人載具進行充電 Used to refuel Carried UAV's @@ -100,7 +100,7 @@ 充電しています・・・ 正在充电... 充電中... - 충전중... + 충전 중... Şarj Oluyor diff --git a/addons/logistics_wirecutter/functions/fnc_isFence.sqf b/addons/logistics_wirecutter/functions/fnc_isFence.sqf index 38610f30fb..a073c2deaf 100644 --- a/addons/logistics_wirecutter/functions/fnc_isFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_isFence.sqf @@ -19,14 +19,11 @@ params ["_object"]; TRACE_1("Checking if fence",_object); -private _typeOf = typeOf _object; - -private _returnValue = if (_typeOf != "") then { - // Check for isFence entry since we have valid typeOf - 1 == getNumber (configFile >> "CfgVehicles" >> _typeOf >> QGVAR(isFence)); +private _configOf = configOf _object; +if !(isNull _configOf) then { + // Check for isFence entry since we have valid configOf + getNumber (_configOf >> QGVAR(isFence)) == 1 // return } else { // Check the p3d name against list (in script_component.hpp) - (getModelInfo _object select 0) in FENCE_P3DS; + (getModelInfo _object select 0) in FENCE_P3DS // return }; - -_returnValue diff --git a/addons/logistics_wirecutter/script_component.hpp b/addons/logistics_wirecutter/script_component.hpp index 38ed1dd077..a499b6ae32 100644 --- a/addons/logistics_wirecutter/script_component.hpp +++ b/addons/logistics_wirecutter/script_component.hpp @@ -74,7 +74,13 @@ "netfence_03_m_3m_corner_f.p3d",\ "netfence_03_m_9m_f.p3d",\ "vineyardfence_01_f.p3d",\ - "gameprooffence_01_l_5m_f.p3d"\ + "gameprooffence_01_l_5m_f.p3d",\ + "netfence_01_m_gate_f.p3d",\ + "netfence_02_m_2m_f.p3d",\ + "netfence_02_m_4m_f.p3d",\ + "netfence_02_m_8m_f.p3d",\ + "net_fence_gate_f.p3d",\ + "new_wiredfence_10m_dam_f.p3d"\ ] #define SOUND_CLIP_TIME_SPACING 1.5 @@ -83,6 +89,6 @@ #define HAS_WIRECUTTER(unit) (\ "ACE_wirecutter" in (unit call EFUNC(common,uniqueItems)) \ - || {1 == getNumber (configFile >> "CfgVehicles" >> (backpack unit) >> QGVAR(hasWirecutter))} \ - || {1 == getNumber (configFile >> "CfgWeapons" >> (vest unit) >> QGVAR(hasWirecutter))} \ + || {getNumber ((configOf (backpackContainer unit)) >> QGVAR(hasWirecutter)) == 1} \ + || {getNumber (configFile >> "CfgWeapons" >> (vest unit) >> QGVAR(hasWirecutter)) == 1} \ ) diff --git a/addons/logistics_wirecutter/stringtable.xml b/addons/logistics_wirecutter/stringtable.xml index ffc95dfcd8..5e71db11b3 100644 --- a/addons/logistics_wirecutter/stringtable.xml +++ b/addons/logistics_wirecutter/stringtable.xml @@ -64,7 +64,7 @@ Drótok elvágása... Разрезаем забор / провода... フェンス/ワイヤを切断しています・・・ - 철망/철조망 자르는중... + 철망/철조망 자르는 중... 正在剪断护栏/刺网... 剪斷護欄/刺網中... Kesiliyor Çit/Tel diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index f62e6dc0e3..dc3649b529 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -61,6 +61,10 @@ if (count _startingAmmoCounts < 2) exitWith {ERROR("Not Enough Mags to Repack"); private _simEvents = [_fullMagazineCount, _startingAmmoCounts, _isBelt] call FUNC(simulateRepackEvents); private _totalTime = _simEvents select (count _simEvents - 1) select 0; +if (GVAR(repackAnimation)) then { + [_player, "Gear"] call EFUNC(common,doGesture); +}; + [ _totalTime, [_magazineClassname, _startingAmmoCounts, _simEvents], diff --git a/addons/magazinerepack/initSettings.sqf b/addons/magazinerepack/initSettings.sqf index d489864a44..0bb18f3707 100644 --- a/addons/magazinerepack/initSettings.sqf +++ b/addons/magazinerepack/initSettings.sqf @@ -31,3 +31,11 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)]; true, 0 ] call CBA_fnc_addSetting; + +[ + QGVAR(repackAnimation), "CHECKBOX", + LSTRING(repackAnimation), + _category, + true, + 0 +] call CBA_fnc_addSetting; diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index b63fd2cde2..015f1f9fcf 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -24,7 +24,7 @@ 每發所需時間 每发所需时间 弾頭毎の所有時間 - 구경 당 시간 + 탄알 당 시간 Czas na nabój Время на патрон Tempo por projétil @@ -56,7 +56,7 @@ 每彈鍊所需時間 每弹炼所需时间 ベルトリンク毎の所有時間 - 탄약띠 당 시간 + 탄띠 당 시간 Czas na taśmę Время на звено ленты Tempo por carregador de cinto @@ -93,7 +93,7 @@ Újratárazás... Перепаковка магазинов... 弾倉を詰め替えしています・・・ - 다시 채우는중... + 다시 채우는 중... 正在整理弹匣 ... 重新整理彈匣中 ... Şarjör Yeniden Dolduruluyor... @@ -128,7 +128,7 @@ Reorganização Terminada 詰め替えが完了しました 탄창 채우기 끝남 - 重整完成 + 整理完成 重整完成 Yeniden Doldurma Bitti @@ -144,7 +144,7 @@ Riempimento Interrotto Reorganização Interrompida 詰め替えを中断しました - 탄창 채우기 방해받음 + 탄창을 채우는 중 방해받음 弹匣整理被打断 重整被中斷 Yeniden Doldurma Durduruldu @@ -161,7 +161,7 @@ %1 Pieno(i) e %2 Parziale(i) %1 Total e %2 Parcial %1 個の満杯と %2 個の弾薬入り弾倉 - %1 꽉찼고 %2 부분참 + %1 꽉 찼고 %2 부분적으로 참 %1个满的与%2个部分的 %1個滿的與%2個部分的 %1 Dolu ve %2 Partial @@ -173,6 +173,8 @@ Перепаковать загруженные магазины Geladene Magazine umpacken Przepakuj załadowane magazynki + 重新整理已上膛的弹匣 + 장전된 탄창에 총알 채우는 중 Repacking magazines, weapon unloaded @@ -181,6 +183,16 @@ Перепаковка магазинов, оружие разряжено Magazin umgepackt, Waffe entladen Przepakowywanie magazynków, broń rozładowana + 重新整理弹匣,武器未上膛 + 탄창 다시 채우는 중, 무기에서 탄창 뺌 + + + Repack Animation + Animation für Umpacken + Animacja przepakowywania + 탄약 합치기 애니메이션 + 詰め替え時のアニメーション + 整理动画 diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 58ae338aae..cc02c06b94 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -147,4 +147,6 @@ #define ZEUS_ACTION_CONDITION ([_target, {QUOTE(QUOTE(ADDON)) in curatorAddons _this}, missionNamespace, QUOTE(QGVAR(zeusCheck)), 1E11, 'ace_interactMenuClosed'] call EFUNC(common,cachedCall)) +#define SUBSKILLS ["aimingAccuracy", "aimingShake", "aimingSpeed", "spotDistance", "spotTime", "courage", "reloadSpeed", "commanding", "general"] + #include "script_debug.hpp" diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 8e598ffeef..a7bcd0973b 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -10,8 +10,8 @@ #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD // MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 2.06 -#define REQUIRED_CBA_VERSION {3,15,6} +#define REQUIRED_VERSION 2.10 +#define REQUIRED_CBA_VERSION {3,15,7} #ifdef COMPONENT_BEAUTIFIED #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index c4db7da30e..b225155921 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 -#define MINOR 14 +#define MINOR 15 #define PATCHLVL 0 -#define BUILD 63 +#define BUILD 67 diff --git a/addons/main/stringtable.xml b/addons/main/stringtable.xml index 31c0b5c16c..e97670f84f 100644 --- a/addons/main/stringtable.xml +++ b/addons/main/stringtable.xml @@ -14,25 +14,25 @@ ACE ロジスティクス ACE 后勤 ACE 後勤 - ACE 논리 + ACE 병참 ACE Lojistik - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ - http://ace3mod.com/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ + https://ace3.acemod.org/ diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index c2f827e7de..43fdb3eeb8 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -46,8 +46,8 @@ Simulovat nasvícení mapy v závisloti na okolí a předmětů hráče? Simula illuminazione della mappa in base alla luce ambientale e agli oggetti del giocatore? 地図へ環境光やプレイヤーのアイテムに基づいた光のシミュレーションを行うかどうかを設定できます。 - 주변 환경및 플레이어 조명에 의한 빛 변화를 지도에 반영할까요? - 透过环境光与玩家的手电筒来决定地图亮度. + 주변 환경 및 플레이어 조명에 의한 빛 변화를 지도에 반영할까요? + 透过环境光与玩家的手电筒来决定地图亮度。 透過環境光與玩家的物品來決定地圖亮度? @@ -61,7 +61,7 @@ Luce della torcia in mappa Lueur lampe carte 地図をライトで照らす - 지도 조명이 빛이 납니까 + 지도 조명 발광 增加地图亮度 增加地圖亮度 @@ -76,8 +76,8 @@ Přidat externí záři hráči který používá baterku v mapě? Aggiungi luce esterna a giocatori che usano la torcia in mappa? プレイヤーが地図をフラッシュライトで照らせられるように設定します。 - 지도에 불빛을 비치는 플레이어를 조금 더 밝게 합니까? - 当玩家打开手电筒时,增加地图亮度. + 지도에 조명을 사용하는 플레이어에 외부 불빛을 추가합니까? + 当玩家打开手电筒时,增加地图亮度。 當玩家擁有手電筒時,增加地圖亮度? @@ -109,8 +109,8 @@ Заставлять карту трястись при ходьбе? Far scuotere la mappa mentre cammini? 歩いているときは地図を揺らすかかどうかを設定できます。 - 걸을때 지도보면 흔들리게 합니까? - 走路时打开地图会产生晃动. + 걸을 때 지도를 보면 흔들리게 합니까? + 走路时打开地图会产生晃动。 走路時讓地圖有震動的感覺? @@ -142,7 +142,7 @@ Limita l'ammontare di zoom disponibile per la mappa? 地図上で利用できる拡大倍率を制限できます。 지도 확대에 제한을 둡니까? - 限制地图上可允许缩放的倍率? + 限制地图上可允许缩放的倍率? 限制地圖上可允許縮放的倍率? @@ -157,8 +157,8 @@ Показывать координаты курсора Mostra coordinate sul cursore カーソル先で座標を表示 - 커서에 좌표를 보이게 합니까 - 显示游标的座标 + 커서에 좌표를 보이기 + 显示光标的座标 顯示游標的座標 @@ -174,7 +174,7 @@ Mostra la griglia coordinate sul cursore mouse? カーソルで合わせた先を地図座標で表示するかどうかを設定できます。 지도에서 커서 옆에 좌표가 뜨게 합니까? - 显示滑鼠游标所在的网格座标? + 显示鼠标光标所在的网格座标? 顯示滑鼠游標所在的網格座標? @@ -190,7 +190,7 @@ Questo modulo ti permette di customizzare lo schermo della mappa. このモジュールは地図画面を変更できます。 이 모듈은 지도 화면을 임의로 설정할 수 있게 해줍니다. - 此模块允许自定地图的相关效果. + 此模块允许自定地图的相关效果。 此模塊允許自定地圖的相關效果. @@ -205,8 +205,8 @@ Система слежения Blue Force Tracking Blue Force Tracking ブルー フォース トラッキング - GPS피아식별기 - 显示蓝方踪迹 + GPS 피아식별기 + 显示蓝方追踪 顯示藍方蹤跡 @@ -221,8 +221,8 @@ Включить BFT Abilita BFT BFT を有効化 - GPS피아식별기 켜기 - 蓝方踪迹启用 + GPS 피아식별기 켜기 + 蓝方追踪启用 藍方蹤跡啟用 @@ -237,8 +237,8 @@ Включает систему служения BFT. По-умолчанию: Нет Abilita Blue Force Tracking. Default: No ブルー フォース トラッキングを有効化します。標準: 無効 - GPS피아식별기 켭니다. 기본설정: 아니요 - 启用显示蓝方踪迹. 预设: 否 + GPS 피아식별기 켭니다. 기본설정: 아니요 + 启用显示蓝方追踪。预设:否 啟用顯示藍方蹤跡. 預設: 否 @@ -270,7 +270,7 @@ Quanto spesso vengono aggiornati i marker (in secondi) マーカが再描画される間隔を設定できます (秒) 몇 초마다 마커를 새로 갱신합니까? - 设定每多少时间重新标示出单位位置 (秒) + 设定每多少时间重新标示出单位位置(秒) 設定每多少時間重新標示出單位位置 (秒) @@ -285,8 +285,8 @@ Скрыть группы ботов Nascondere gruppi IA AI グループを非表示 - 인공지능 그룹을 숨깁니까 - 隐藏AI小队 + 인공지능 그룹 숨기기 + 隐藏 AI 小队 隱藏AI小隊 @@ -302,7 +302,7 @@ Nascondi markers per gruppi di sole IA? 'AI のみ'グループのマーカー表示有無を設定できます。 인공지능만 있는 그룹의 마커를 숨깁니까? - 隐藏'AI小队'的踪迹? + 隐藏'AI 小队'的追踪? 隱藏'AI小隊'的蹤跡? @@ -317,7 +317,7 @@ Показать имена игроков Mostra i nomi dei giocatori プレイヤー名を表示 - 플레이어 이름을 표시합니까 + 플레이어 이름 표시 显示玩家名称 顯示玩家名稱 @@ -334,7 +334,7 @@ Mostra i nomi dei giocatori singoli? プレイヤーの名前の表示有無を設定できます。 각 플레이어의 이름을 표시합니까? - 显示玩家的个别名称? + 显示玩家的个别名称? 顯示玩家的個別名稱? @@ -350,7 +350,7 @@ Questo modulo permette il tracciamento di unità alleate con i marker BFT in mappa モジュールは BFT マップ マーカとともに、同勢力ユニットの追跡を許可します。 이 모듈은 아군을 지도상에서 추적할 수 있게 해줍니다. - 此模块将使你能在地图上看见友方单位的踪迹 + 此模块将使你能在地图上看见友方单位的追踪 此模塊將使你能在地圖上看見友方單位的蹤跡 @@ -380,8 +380,8 @@ NVG NVG 夜間暗視装置 - 야투경 - 夜视镜 + 야간투시경 + 夜视仪 夜視鏡 NVG @@ -507,7 +507,7 @@ Cambiar el canal de marcadores inicial al comenzar la misión Change le canal de communication par défaut au début de la mission. ミッション開始時にあらかじめ設定されているマーカ チャンネルを変更します - 미션시작시 마커채널을 변경합니다 + 미션 시작시 마커채널을 변경합니다 更改任务启动时的聊天频道 更改任務啟動時的聊天頻道 @@ -515,11 +515,11 @@ Disable BFT BFT deaktivieren BFTを無効化 - GPS피아식별기 끄기 + GPS 피아식별기 끄기 Wyłącz BFT Désactiver le SFA Disablita BFT - 关闭友军踪迹 + 关闭友军追踪 關閉友軍蹤跡 Отключить BFT Desativar BFT @@ -530,11 +530,11 @@ Always disable Blue Force Tracking for this group. Blue Force Tracking für diese Gruppe immer deaktivieren. このグループへのブルー フォース トラッキングを常に無効化します。 - 이 그룹에 한해 GPS피아식별기를 항상 끕니다. + 이 그룹에 한해 GPS 피아식별기를 항상 끕니다. Zawsze wyłączaj Blue Force Tracking dla tej grupy. Désactive en permanence le Suivi des Forces Alliées pour ce groupe. Disabilita sempre il Blue Force Tracking per questo gruppo. - 对此小队永远关闭友军踪迹显示 + 对此小队永远关闭友军追踪显示 對此小隊永遠關閉友軍蹤跡顯示 Всегда отключать Blue Force Tracking для этой группы Sempre desativar Rastreio Blue Force (BFT) para esse grupo. diff --git a/addons/map_gestures/stringtable.xml b/addons/map_gestures/stringtable.xml index 2a73b8be87..03ffdbda8a 100644 --- a/addons/map_gestures/stringtable.xml +++ b/addons/map_gestures/stringtable.xml @@ -13,7 +13,7 @@ Pointage sur carte マップ ジェスチャー 지도 신호 - 地图标识器 + 地图指示 地圖指示器 Harita Hareketleri @@ -45,7 +45,7 @@ Active le pointage sur carte. マップ ジェスチャーを有効化 지도 신호 활성화 - 启用地图标识器 + 启用地图指示 啟用地圖指示器 Harita hareketlerini etkinleştir. @@ -61,7 +61,7 @@ Portée du pointage sur carte マップ ジェスチャーの最大範囲 지도 신호 최대 거리 - 地图标识器最大范围 + 地图指示最大范围 地圖指示器最大範圍 Harita Hareketi Max Uzaklık @@ -77,7 +77,7 @@ Définit le rayon au-delà duquel un joueur ne verra plus l'indicateur de pointage des autres joueurs. プレイヤーによるマップ ジェスチャーの表示範囲を設定します 플레이어간에 지도 신호 표시거리를 설정합니다. - 设定地图标识器显示的最大范围距离 + 设定地图指示显示的最大范围距离 設定地圖指示器顯示的最大範圍距離 @@ -108,7 +108,7 @@ Période de mise à jour des données. データの更新間隔 데이터 갱신 간격 - 定义每次更新数据的时间. + 定义每次更新数据的时间。 定義每次更新數據的時間 Veri güncellemeleri arasındaki zaman. @@ -139,7 +139,7 @@ Définit la couleur du texte pour le nom à côté du marqueur de pointage sur carte. マップ ジェスチャーに表示される、名前の色を決定します。 지도 색상에 표시되는 이름의 색상을 결정합니다. - 定义名称文字颜色。使其与地图标识器颜色有所区别。 + 定义名称文字颜色。使其与地图指示颜色有所区别。 定義名稱文字顏色。使其與地圖指示器顏色有所區別 Barva jména zobrazeného vedle značky ukazovátka na mapě. @@ -168,8 +168,8 @@ Color por defecto para líderes cuando no está configurado [Módulo: dejar en blanco para no forzar] Définit la couleur par défaut pour les chefs de groupe quand il n'y a pas de réglage de groupe. [Module : laisser vide pour ne pas forcer chez les clients.] グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] - 그룹 설정이 없는 경우 리더의 예비 색상 값입니다. [모듈: 클라이언트에서 강체치 않기 위해 공백으로 비워둘것] - 当没有设定小队颜色时,此功能会定义队长的标识器颜色。[模块: 此栏留空来保持预设颜色] + 그룹 설정이 없는 경우 리더의 예비 색상 값입니다. [모듈: 클라이언트에서 강체하지 않기 위해 공백으로 비워둘 것] + 当没有设定小队颜色时,此功能会定义队长的指示颜色。[模块:此栏留空来保持预设颜色] 當沒有設定小隊顏色時,此功能會定義隊長的指示器顏色。[模塊: 此欄留空來保持預設顏色] Záložní barva pro velitele skupin pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů] @@ -199,8 +199,8 @@ Color por defecto cuando no está configurado [Módulo: dejar en blanco para no forzar] Définit la couleur par défaut quand il n'y a pas de réglage pour le groupe. [Module : laisser vide pour ne pas forcer chez les clients.] グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] - 그룹 설정이 없을 경우의 예비 색상입니다. [모듈: 클라이언트에서 강체치 않기 위해 공백으로 비워둘것] - 当没有设定小队颜色时,此功能会定义玩家的标识器颜色。[模块: 此栏留空来保持预设颜色] + 그룹 설정이 없을 경우의 예비 색상입니다. [모듈: 클라이언트에서 강체하지 않기 위해 공백으로 비워둘 것] + 当没有设定小队颜色时,此功能会定义玩家的指示颜色。[模块:此栏留空来保持预设颜色] 當沒有設定小隊顏色時,此功能會定義玩家的指示器顏色。[模塊: 此欄留空來保持預設顏色] Záložní barva pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů] @@ -229,8 +229,8 @@ Color para los líderes de los grupos sincronizados al módulo. Couleur pour les chefs des groupes synchronisés avec ce module. モジュールで同期されたグループのリーダー用に色の値を決定します。 - 그룹이 이 모듈에 동기화 됐을때의 리더 색상입니다. - 改变与此同步小队队长的标识器颜色。 + 그룹이 이 모듈에 동기화 됐을 때의 리더 색상입니다. + 改变与此同步小队队长的指示颜色。 改變與此同步小隊隊長的指示器顏色 Barva pro velitele skupin které jsou synchronizované s tímto modulem. @@ -260,8 +260,8 @@ Color para los miembros de los grupos sincronizados al módulo. Couleur pour les membres des groupes synchronisés avec ce module. モジュールで同期されたグループのメンバ用に色の値を決定します。 - 그룹이 이 모듈에 동기화 됐을때의 멤버 색상입니다. - 改变与此同步小队队员的标识器颜色 + 그룹이 이 모듈에 동기화 됐을 때의 멤버 색상입니다. + 改变与此同步小队队员的指示颜色 改變與此同步小隊隊員的指示器顏色 Barva pro členy skupin které jsou synchronizované s tímto modulem. @@ -273,6 +273,8 @@ 友軍ジェスチャーのみ表示 Mostrar sólo gestos de aliados Nur Gesten befreundeter Einheiten zeigen + 仅显示友军指示 + 아군 신호만 보기 Shows only Gestures from Units that are from the same side or a Friendly side. @@ -282,6 +284,8 @@ Muestra únicamente gestos de las unidades que son del mismo bando o de un bando aliado Pokazuj tylko Gesty od jednostek z tej samej lub sojuszniczej strony Nur Gesten von Einheiten der selben oder einer verbündeten Seite zeigen. + 仅显示来自同一阵营或友军的单位的指示。 + 같은 진영 혹은 아군 진영 인원들만 보이게 합니다. Max range Camera @@ -291,6 +295,8 @@ Máximo alcance de cámara Maksymalny zasięg kamery Maximale Kamerareichweite + 摄像机最大范围 + 카메라와 지도 신호의 최대 거리 Max range between a Camera and players to show the map gesture indicator @@ -300,6 +306,8 @@ Máxima distancia entre una cámara y los jugadores para mostrar el indicador de gestos en mapa Maksymalny zasięg pomiędzy kamerą a graczami do pokazania gestów na mapie Maximale Reichweite, in der eine Kamera das Kartenzeichen der Spieler zeigt + 摄像机和玩家之间的最大范围显示地图指示 + 카메라와 플레이어간 지도 신호를 볼 수 있는 최대 거리를 정합니다 Allow Spectator @@ -309,6 +317,8 @@ Permitir espectador Zezwól na Obserwatora Erlaube Zuschauer + 允许旁观者 + 관전자 허용 Allows Spectator to See Map Gestures @@ -318,6 +328,8 @@ Permitir al espectador ver los gestos de mapa Zezwól Obserwatorowi widzieć Gesty na mapie Erlaube, dass Zuschauer das Kartenzeichen sehen können + 允许旁观者查看地图指示 + 관전자가 지도 신호를 볼 수 있습니다 Allow Curator @@ -327,6 +339,8 @@ Permitir Curador Zezwól na Zeusa Erlaube Zeus + 允许宙斯 + 큐레이터 허용 Allows Curator to See Map Gestures @@ -336,6 +350,8 @@ Permitir al Curador ver los gestos de mapa Zezwól Zeusowi widzieć gesty na mapie Erlaube, dass Zeus das Kartenzeichen sehen kann + 允许宙斯查看地图指示 + 큐레이터가 지도 신호를 볼 수 있습니다 Briefing Mode @@ -345,6 +361,8 @@ Modo de briefing Tryb Odprawy Briefing-Modus + 简报模式 + 브리핑 모드 What player can see what @@ -354,6 +372,8 @@ Qué puede ver cada jugador Co mogą widzieć gracze Welcher Spieler kann was sehen + 什么玩家能看到什么 + 어떤 플레이어가 볼 수 있는지 정합니다 Disabled @@ -363,6 +383,8 @@ Deshabilitado Zablokowany Deaktiviert + 禁用 + 비활성화 Group @@ -375,6 +397,8 @@ Группа Grupo グループ + 小队 + 그룹 Side @@ -387,6 +411,8 @@ Сторона Bando 陣営 + 阵营 + 진영 Proximity @@ -396,6 +422,8 @@ Proximidad Umgebung Tylko w pobliżu + 附近 + 근처 All @@ -408,6 +436,8 @@ Все Todas 全て + 全部 + 모두 Map Gestures - Group Settings @@ -421,7 +451,7 @@ Pointage sur carte - réglages de groupe マップ ジェスチャー - グループ設定 지도 신호 - 그룹 설정 - 地图标识器 - 队伍设定 + 地图指示—队伍设定 地圖指示器 - 隊伍設定 @@ -436,7 +466,7 @@ ACE Pointage sur carte ACE マップ ジェスチャー ACE 지도 신호 - ACE 地图标识器 + ACE 地图指示 ACE 地圖指示器 ACE Harita Hareketleri diff --git a/addons/maptools/CfgVehicles.hpp b/addons/maptools/CfgVehicles.hpp index 5ab3eac165..aacde4cb93 100644 --- a/addons/maptools/CfgVehicles.hpp +++ b/addons/maptools/CfgVehicles.hpp @@ -32,14 +32,14 @@ class CfgVehicles { class ACE_MapToolsShowNormal { displayName = CSTRING(MapToolsShowNormal); condition = QUOTE(GVAR(mapTool_Shown) != 1); - statement = QUOTE(GVAR(mapTool_Shown) = 1;); + statement = QUOTE(if (GVAR(mapTool_Shown) == 0) then {GVAR(mapTool_moveToMouse) = true}; GVAR(mapTool_Shown) = 1;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; }; class ACE_MapToolsShowSmall { displayName = CSTRING(MapToolsShowSmall); condition = QUOTE(GVAR(mapTool_Shown) != 2); - statement = QUOTE(GVAR(mapTool_Shown) = 2;); + statement = QUOTE(if (GVAR(mapTool_Shown) == 0) then {GVAR(mapTool_moveToMouse) = true}; GVAR(mapTool_Shown) = 2;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; }; @@ -52,7 +52,7 @@ class CfgVehicles { }; class ACE_MapToolsAlignCompass { displayName = CSTRING(MapToolsAlignCompass); - condition = QUOTE((GVAR(mapTool_Shown) != 0) && {'ItemCompass' in assigneditems ACE_player}); + condition = QUOTE(GVAR(mapTool_Shown) != 0 && {getUnitLoadout ACE_player param [ARR_2(9, [])] param [ARR_2(3, '')] != ''}); statement = QUOTE(GVAR(mapTool_angle) = getDir ACE_player;); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; showDisabled = 1; diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index c7dceacd75..eede4db015 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -13,6 +13,7 @@ GVAR(mapTool_pos) = [0,0]; GVAR(mapTool_angle) = 0; GVAR(mapTool_isDragging) = false; GVAR(mapTool_isRotating) = false; +GVAR(mapTool_moveToMouse) = true; // used to display it in center of screen when opened //Install the event handers for the map tools on the main in-game map [{!isNull findDisplay 12}, diff --git a/addons/maptools/functions/fnc_canUseMapTools.sqf b/addons/maptools/functions/fnc_canUseMapTools.sqf index e09a450031..0ae75c8c53 100644 --- a/addons/maptools/functions/fnc_canUseMapTools.sqf +++ b/addons/maptools/functions/fnc_canUseMapTools.sqf @@ -17,13 +17,7 @@ visibleMap && {alive ACE_player} && -{ - scopeName "hasMap"; - { - if (_x isKindOf ["ItemMap", configFile >> "CfgWeapons"]) exitWith {true breakOut "hasMap"}; - } forEach (assignedItems ACE_player); - false -} && {"ACE_MapTools" in (ACE_player call EFUNC(common,uniqueItems))} && {!GVAR(mapTool_isDragging)} && -{!GVAR(mapTool_isRotating)} +{!GVAR(mapTool_isRotating)} && +{getUnitLoadout ACE_player param [9, []] param [0, ""] != ""} diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index e9cb14d7ed..a3be0e2c97 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -19,6 +19,13 @@ params ["_theMap"]; if ((GVAR(mapTool_Shown) == 0) || {!("ACE_MapTools" in (ACE_player call EFUNC(common,uniqueItems)))}) exitWith {}; +// open map tools in center of screen when toggled to be shown +if (GVAR(mapTool_moveToMouse)) then { + private _mousePosition = _theMap ctrlMapScreenToWorld getMousePosition; + GVAR(mapTool_pos) = _mousePosition; + GVAR(mapTool_moveToMouse) = false; // we only need to do this once after opening the map tool +}; + private _rotatingTexture = ""; private _textureWidth = 0; if (GVAR(mapTool_Shown) == 1) then { diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 4145954df9..8fdb3d9f33 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -133,7 +133,7 @@ Выровнять инструменты по компасу マップ ツールを方位磁石に合わせる 독도용 도구를 나침반에 정렬 - 地图工具对准指北针 + 地图工具对准指南针 地圖工具對準指北針 Harita Aracını Pusulaya Hizala @@ -150,7 +150,7 @@ Показать GPS на карте 地図上に GPS を表示する GPS를 지도상에 꺼내기 - 在地图上显示GPS + 在地图上显示 GPS 在地圖上顯示GPS Harita da GPS Göster @@ -167,7 +167,7 @@ Скрыть GPS на карте 地図上から GPS を隠す GPS를 지도상에서 숨기기 - 在地图上隐藏GPS + 在地图上隐藏 GPS 在地圖上隱藏GPS Harita da GPS'i Gizle @@ -184,7 +184,7 @@ Direção: %1 方位:%1° 방위: %1° - 方位: %1° + 方位:%1° 方位: %1° Yön: %1° @@ -244,7 +244,7 @@ Przeciągnij po krawędzi narzędzi nawigacyjnych by narysować prostą linię. Uwaga: aby usunąć linię - nalezy ustawić kursor nad jej środkiem. Utilise le bord des outils de navigation pour tracer des lignes droites. Note : il faut pointer au milieu du trait pour pouvoir le supprimer. Disegna sul bordo degli strumenti di mappatura per disegnare linee dritte. Nota: Deve spostarsi al centro per essere cancellato. - 使用地图工具的边缘来绘制直线。备注: 要删除直线时,请把滑鼠移动到该线条的中央即可删除该线。 + 使用地图工具的边缘来绘制直线。备注:要删除直线时,请把鼠标移动到该线条的中央即可删除该线。 使用地圖工具的邊緣來繪製直線。備註: 要刪除直線時,請把滑鼠移動到該線條的中央即可刪除該線 Рисуйте по краю инструмента карты, чтобы провести прямые линии. Примечание: при удалении линии размещайте курсор над ее серединой Desenhe no canto da ferramenta de mapa para desenhar linhas retas. Observação: Sobreponha o meio com o mouse para deletar. diff --git a/addons/marker_flags/$PBOPREFIX$ b/addons/marker_flags/$PBOPREFIX$ new file mode 100644 index 0000000000..cf7a6f6f77 --- /dev/null +++ b/addons/marker_flags/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\marker_flags diff --git a/addons/marker_flags/CfgEventHandlers.hpp b/addons/marker_flags/CfgEventHandlers.hpp new file mode 100644 index 0000000000..b468b9e8b5 --- /dev/null +++ b/addons/marker_flags/CfgEventHandlers.hpp @@ -0,0 +1,23 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; + +class Extended_DisplayLoad_EventHandlers { + class RscDisplayMission { + ADDON = QUOTE(_this call COMPILE_SCRIPT(XEH_missionDisplayLoad)); + }; +}; diff --git a/addons/marker_flags/CfgVehicles.hpp b/addons/marker_flags/CfgVehicles.hpp new file mode 100644 index 0000000000..6a615ca533 --- /dev/null +++ b/addons/marker_flags/CfgVehicles.hpp @@ -0,0 +1,52 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class ADDON { + displayName = CSTRING(ActionPlace); + condition = QUOTE(_player call FUNC(canPlace)); + insertChildren = QUOTE(_this call FUNC(addActions)); + icon = QPATHTOF(ui\icons\white_place_icon.paa); + }; + }; + }; + }; + + class FlagMarker_01_F; + class GVAR(white): FlagMarker_01_F { + scope = 2; + scopeCurator = 2; + author = ECSTRING(common,ACETeam); + displayName = CSTRING(white); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.82,0.82,0.82,1,co)"}; + }; + class GVAR(black): GVAR(white) { + displayName = CSTRING(black); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.18,0.18,0.18,1,co)"}; + }; + class GVAR(red): GVAR(white) { + displayName = CSTRING(red); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.647,0.141,0.161,1,co)"}; + }; + class GVAR(green): GVAR(white) { + displayName = CSTRING(green); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.063,0.588,0.063,1,co)"}; + }; + class GVAR(blue): GVAR(white) { + displayName = CSTRING(blue); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.161,0.349,0.58,1,co)"}; + }; + class GVAR(yellow): GVAR(white) { + displayName = CSTRING(yellow); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.776,0.729,0.129,1,co)"}; + }; + class GVAR(orange): GVAR(white) { + displayName = CSTRING(orange); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.678,0.349,0.153,1,co)"}; + }; + class GVAR(purple): GVAR(white) { + displayName = CSTRING(purple); + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.373,0.141,0.647,1,co)"}; + }; +}; diff --git a/addons/marker_flags/CfgWeapons.hpp b/addons/marker_flags/CfgWeapons.hpp new file mode 100644 index 0000000000..b4c2f88125 --- /dev/null +++ b/addons/marker_flags/CfgWeapons.hpp @@ -0,0 +1,63 @@ +class CfgWeapons { + class ACE_ItemCore; + class CBA_MiscItem_ItemInfo; + + class GVAR(white): ACE_ItemCore { + GVAR(vehicle) = QGVAR(white); + GVAR(icon) = QPATHTOF(ui\icons\white_place_icon.paa); + author = ECSTRING(common,ACETeam); + scope = 2; + displayName = CSTRING(white); + model = QPATHTOF(data\ace_markerpole.p3d); + picture = QPATHTOF(ui\white_ca.paa); + icon = "iconObject_1x10"; + mapSize = 0.2; + + class ItemInfo: CBA_MiscItem_ItemInfo { + mass = 1; + }; + }; + + class GVAR(black): GVAR(white) { + GVAR(vehicle) = QGVAR(black); + GVAR(icon) = QPATHTOF(ui\icons\black_place_icon.paa); + displayName = CSTRING(black); + picture = QPATHTOF(ui\black_ca.paa); + }; + class GVAR(red): GVAR(white) { + GVAR(vehicle) = QGVAR(red); + GVAR(icon) = QPATHTOF(ui\icons\red_place_icon.paa); + displayName = CSTRING(red); + picture = QPATHTOF(ui\red_ca.paa); + }; + class GVAR(green): GVAR(white) { + GVAR(vehicle) = QGVAR(green); + GVAR(icon) = QPATHTOF(ui\icons\green_place_icon.paa); + displayName = CSTRING(green); + picture = QPATHTOF(ui\green_ca.paa); + }; + class GVAR(blue): GVAR(white) { + GVAR(vehicle) = QGVAR(blue); + GVAR(icon) = QPATHTOF(ui\icons\blue_place_icon.paa); + displayName = CSTRING(blue); + picture = QPATHTOF(ui\blue_ca.paa); + }; + class GVAR(yellow): GVAR(white) { + GVAR(vehicle) = QGVAR(yellow); + GVAR(icon) = QPATHTOF(ui\icons\yellow_place_icon.paa); + displayName = CSTRING(yellow); + picture = QPATHTOF(ui\yellow_ca.paa); + }; + class GVAR(orange): GVAR(white) { + GVAR(vehicle) = QGVAR(orange); + GVAR(icon) = QPATHTOF(ui\icons\orange_place_icon.paa); + displayName = CSTRING(orange); + picture = QPATHTOF(ui\orange_ca.paa); + }; + class GVAR(purple): GVAR(white) { + GVAR(vehicle) = QGVAR(purple); + GVAR(icon) = QPATHTOF(ui\icons\purple_place_icon.paa); + displayName = CSTRING(purple); + picture = QPATHTOF(ui\purple_ca.paa); + }; +}; diff --git a/addons/marker_flags/XEH_PREP.hpp b/addons/marker_flags/XEH_PREP.hpp new file mode 100644 index 0000000000..628433ff1c --- /dev/null +++ b/addons/marker_flags/XEH_PREP.hpp @@ -0,0 +1,6 @@ +PREP(addActions); +PREP(canPlace); +PREP(getFlags); +PREP(handleScrollWheel); +PREP(pickUpFlag); +PREP(placeFlag); diff --git a/addons/marker_flags/XEH_missionDisplayLoad.sqf b/addons/marker_flags/XEH_missionDisplayLoad.sqf new file mode 100644 index 0000000000..fc336ad799 --- /dev/null +++ b/addons/marker_flags/XEH_missionDisplayLoad.sqf @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +params ["_display"]; + +_display displayAddEventHandler ["MouseZChanged", { + params ["", "_scroll"]; + [_scroll] call FUNC(handleScrollWheel); +}]; + +_display displayAddEventHandler ["MouseButtonDown", { + params ["", "_button"]; + if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith {false}; + if (_button isNotEqualTo 1) exitWith {false}; // 1 = Left mouse button + GVAR(isPlacing) = PLACE_CANCEL; +}]; diff --git a/addons/marker_flags/XEH_postInit.sqf b/addons/marker_flags/XEH_postInit.sqf new file mode 100644 index 0000000000..19011893cc --- /dev/null +++ b/addons/marker_flags/XEH_postInit.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +GVAR(isPlacing) = PLACE_CANCEL; +["ace_interactMenuOpened", {GVAR(isPlacing) = PLACE_CANCEL;}] call CBA_fnc_addEventHandler; + +private _cfgWeapons = configFile >> "CfgWeapons"; +private _weapons = (call (uiNamespace getVariable [QGVAR(flagItems), {[]}])) apply {_cfgWeapons >> _x}; + +{ + private _name = configName _x; + private _vehicleClass = getText (_x >> QGVAR(vehicle)); + private _displayName = getText (_x >> "displayName"); + private _icon = getText (_x >> QGVAR(icon)); + GVAR(flagCache) set [_name, [_vehicleClass, _displayName, _icon]]; + + private _action = [ + QGVAR(pickup), + LLSTRING(ActionPickUp), + QPATHTOF(ui\icons\white_pickup_icon.paa), + {call FUNC(pickUpFlag)}, + {[_player, _target, []] call EFUNC(common,canInteractWith)}, + {}, + [_name], + [0, 0.072, 0.2], + 2 + ] call EFUNC(interact_menu,createAction); + [_vehicleClass, 0, [], _action] call EFUNC(interact_menu,addActionToClass); +} forEach _weapons; diff --git a/addons/marker_flags/XEH_preInit.sqf b/addons/marker_flags/XEH_preInit.sqf new file mode 100644 index 0000000000..62febdc7cb --- /dev/null +++ b/addons/marker_flags/XEH_preInit.sqf @@ -0,0 +1,13 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +GVAR(flagCache) = createHashMap; + +ADDON = true; diff --git a/addons/marker_flags/XEH_preStart.sqf b/addons/marker_flags/XEH_preStart.sqf new file mode 100644 index 0000000000..2a2bc52161 --- /dev/null +++ b/addons/marker_flags/XEH_preStart.sqf @@ -0,0 +1,6 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" + +private _weapons = (configProperties [configfile >> "CfgWeapons", QUOTE(isClass _x && {isText (_x >> QQGVAR(vehicle))}), true]) apply {configName _x}; +uiNamespace setVariable [QGVAR(flagItems), compileFinal str _weapons]; diff --git a/addons/marker_flags/config.cpp b/addons/marker_flags/config.cpp new file mode 100644 index 0000000000..078a0d8e7e --- /dev/null +++ b/addons/marker_flags/config.cpp @@ -0,0 +1,37 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = { + QGVAR(white), + QGVAR(black), + QGVAR(red), + QGVAR(green), + QGVAR(blue), + QGVAR(yellow), + QGVAR(orange), + QGVAR(purple) + }; + weapons[] = { + QGVAR(white), + QGVAR(black), + QGVAR(red), + QGVAR(green), + QGVAR(blue), + QGVAR(yellow), + QGVAR(orange), + QGVAR(purple) + }; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common", "ace_interaction", "ace_interact_menu"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Brett Mayson", "Timi007"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/marker_flags/data/ace_default.rvmat b/addons/marker_flags/data/ace_default.rvmat new file mode 100644 index 0000000000..782c9714b8 --- /dev/null +++ b/addons/marker_flags/data/ace_default.rvmat @@ -0,0 +1,79 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.01,0.01,0.01,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower=500; //area of glossiness - the higher the number, the smaller the area +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="#(rgb,1,1,1)color(0.5,0.5,1,1)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,mc)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,as)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,1}; + }; +}; +class Stage5 { + texture="#(rgb,1,1,1)color(0.2,0.2,1,1)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,64,64,1)fresnel(4.7,1.2)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_ca.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/marker_flags/data/ace_markerpole.p3d b/addons/marker_flags/data/ace_markerpole.p3d new file mode 100644 index 0000000000..8722db4260 Binary files /dev/null and b/addons/marker_flags/data/ace_markerpole.p3d differ diff --git a/addons/marker_flags/functions/fnc_addActions.sqf b/addons/marker_flags/functions/fnc_addActions.sqf new file mode 100644 index 0000000000..346cdbe7f8 --- /dev/null +++ b/addons/marker_flags/functions/fnc_addActions.sqf @@ -0,0 +1,40 @@ +#include "script_component.hpp" +/* + * Author: Brett Mayson, Timi007 + * Adds the child actions for placing flags. + * + * Arguments: + * 0: Player + * + * Return Value: + * Actions + * + * Example: + * [player] call ace_marker_flags_fnc_addActions + * + * Public: No + */ + +params ["_unit"]; + +private _actions = []; + +{ + (GVAR(flagCache) get _x) params ["_vehicle", "_displayName", "_icon"]; + + _actions pushBack [ + [ + _x, + _displayName, + _icon, + {[_this select 0, _this select 2] call FUNC(placeFlag)}, + {true}, + {}, + _x + ] call EFUNC(interact_menu,createAction), + [], + _unit + ]; +} forEach ([_unit] call FUNC(getFlags)); + +_actions diff --git a/addons/marker_flags/functions/fnc_canPlace.sqf b/addons/marker_flags/functions/fnc_canPlace.sqf new file mode 100644 index 0000000000..fbaefe6e89 --- /dev/null +++ b/addons/marker_flags/functions/fnc_canPlace.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Authors: Brett Mayson + * Checks if a flag can be placed by a unit. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Can place + * + * Example: + * player call ace_marker_flags_fnc_canPlace + * + * Public: No + */ + +params ["_unit"]; + +GVAR(placeAnywhere) || {_unit call EFUNC(common,canDig)} diff --git a/addons/marker_flags/functions/fnc_getFlags.sqf b/addons/marker_flags/functions/fnc_getFlags.sqf new file mode 100644 index 0000000000..fc8e3a8893 --- /dev/null +++ b/addons/marker_flags/functions/fnc_getFlags.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Authors: Brett Mayson + * Get the placeable flags in the unit's inventory. + * + * Arguments: + * 0: Unit + * + * Return Value: + * flags + * + * Example: + * [_unit] call ace_marker_flags_fnc_getFlags + * + * Public: No + */ + +params ["_unit"]; + +(_unit call EFUNC(common,uniqueItems)) arrayIntersect keys GVAR(flagCache) diff --git a/addons/marker_flags/functions/fnc_handleScrollWheel.sqf b/addons/marker_flags/functions/fnc_handleScrollWheel.sqf new file mode 100644 index 0000000000..c6430be650 --- /dev/null +++ b/addons/marker_flags/functions/fnc_handleScrollWheel.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: Timi007 + * Handles the marker flag object height. + * + * Arguments: + * 0: Scroll amount + * + * Return Value: + * Handled + * + * Example: + * [5] call ace_marker_flags_fnc_handleScrollWheel + * + * Public: No + */ + +params ["_scrollAmount"]; + +if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith { + false +}; + +// Move object height 5cm per scroll +GVAR(objectHeight) = GVAR(objectHeight) + (_scrollAmount * 0.05); + +// Clamp height between MIN_HEIGHT and MAX_HEIGHT +GVAR(objectHeight) = MIN_HEIGHT max (GVAR(objectHeight) min MAX_HEIGHT); + +true diff --git a/addons/marker_flags/functions/fnc_pickUpFlag.sqf b/addons/marker_flags/functions/fnc_pickUpFlag.sqf new file mode 100644 index 0000000000..f3ef5e118a --- /dev/null +++ b/addons/marker_flags/functions/fnc_pickUpFlag.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: Brett Mayson, Timi007 + * Places a flag in front of the unit. + * + * Arguments: + * 0: Flag + * 1: Unit + * 2: Action Args + * + * Return Value: + * Nothing + * + * Example: + * [_flag, player, ["ace_marker_flags_white"]] call ace_marker_flags_fnc_pickupFlag + * + * Public: No + */ + +params [["_flag", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", [""], [[]]]]; +_args params ["_item"]; +TRACE_3("pickupFlag",_unit,_flag,_itemName); + +if (isNull _flag) exitWith {}; + +[_unit, "PutDown"] call EFUNC(common,doGesture); + +[{ + params ["_flag", "_unit", "_item"]; + + [_unit, _item] call EFUNC(common,addToInventory); + deleteVehicle _flag; +}, [_flag, _unit, _item], 0.7] call CBA_fnc_waitAndExecute; diff --git a/addons/marker_flags/functions/fnc_placeFlag.sqf b/addons/marker_flags/functions/fnc_placeFlag.sqf new file mode 100644 index 0000000000..d5c4bdcb13 --- /dev/null +++ b/addons/marker_flags/functions/fnc_placeFlag.sqf @@ -0,0 +1,74 @@ +#include "script_component.hpp" +/* + * Author: Timi007 + * Starts the placing process of the marker flag for the player. + * Flags can be placed with the special marker flag items. + * + * Arguments: + * 0: Player + * 1: Flag item + * + * Return Value: + * Nothing + * + * Example: + * [player, "ace_marker_flags_white"] call ace_marker_flags_fnc_placeFlag + * + * Public: No + */ + +params [["_player", objNull, [objNull]], ["_item", QGVAR(white), [""]]]; +TRACE_2("Placing flag", _player, _item); + +(GVAR(flagCache) get _item) params ["_vehicleClass"]; + +private _flag = _vehicleClass createVehicle [0, 0, 0]; + +TRACE_1("Created flag", _flag); + +// Set flag start height +GVAR(objectHeight) = MAX_HEIGHT; + +GVAR(isPlacing) = PLACE_WAITING; + +// Add info dialog for the player which show the controls +[LLSTRING(ActionPlace), LLSTRING(ActionCancel), LLSTRING(ActionAdjustHeight)] call EFUNC(interaction,showMouseHint); + +private _mouseClickID = [_player, "DefaultAction", { + GVAR(isPlacing) isEqualTo PLACE_WAITING +}, { + GVAR(isPlacing) = PLACE_APPROVE +}] call EFUNC(common,addActionEventHandler); + +[{ + params ["_args", "_handle"]; + _args params ["_player", "_item", "_flag", "_mouseClickID"]; + + if (isNull _flag || {!([_player, _flag] call EFUNC(common,canInteractWith))}) then { + GVAR(isPlacing) = PLACE_CANCEL; + }; + + if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith { + [_handle] call CBA_fnc_removePerFrameHandler; + call EFUNC(interaction,hideMouseHint); + [_player, "DefaultAction", _mouseClickID] call EFUNC(common,removeActionEventHandler); + + if (GVAR(isPlacing) isEqualTo PLACE_APPROVE) then { + // End position of the flag + GVAR(isPlacing) = PLACE_CANCEL; + [_player, "PutDown"] call EFUNC(common,doGesture); + _player removeItem _item; + [QGVAR(placed), [_player, _flag, _item]] call CBA_fnc_localEvent; + } else { + // Action is canceled + deleteVehicle _flag; + }; + }; + + private _pos = (eyePos _player) vectorAdd ((getCameraViewDirection _player) vectorMultiply FLAG_PLACING_DISTANCE); + // Adjust height of flag with the scroll wheel + _pos set [2, ((getPosWorld _player) select 2) + GVAR(objectHeight)]; + + _flag setPosWorld _pos; + _flag setDir (getDir _player - 90); +}, 0, [_player, _item, _flag, _mouseClickID]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/marker_flags/functions/script_component.hpp b/addons/marker_flags/functions/script_component.hpp new file mode 100644 index 0000000000..f70552083f --- /dev/null +++ b/addons/marker_flags/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\marker_flags\script_component.hpp" diff --git a/addons/marker_flags/initSettings.sqf b/addons/marker_flags/initSettings.sqf new file mode 100644 index 0000000000..74ae5a0721 --- /dev/null +++ b/addons/marker_flags/initSettings.sqf @@ -0,0 +1,9 @@ +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(DisplayName_Settings)]; + +[ + QGVAR(placeAnywhere), "CHECKBOX", + [LSTRING(PlaceAnywhere_DisplayName), LSTRING(PlaceAnywhere_Description)], + _category, + false, // default value + true // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/marker_flags/script_component.hpp b/addons/marker_flags/script_component.hpp new file mode 100644 index 0000000000..bef8c1d423 --- /dev/null +++ b/addons/marker_flags/script_component.hpp @@ -0,0 +1,26 @@ +#define COMPONENT marker_flags +#define COMPONENT_BEAUTIFIED Marker Flags +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_MARKER_FLAGS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_ENABLED_MARKER_FLAGS + #define DEBUG_SETTINGS DEBUG_ENABLED_MARKER_FLAGS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define PLACE_WAITING -1 +#define PLACE_CANCEL 0 +#define PLACE_APPROVE 1 + +#define MIN_HEIGHT -0.3 +#define MAX_HEIGHT 0.4 + +#define FLAG_PLACING_DISTANCE 2 diff --git a/addons/marker_flags/stringtable.xml b/addons/marker_flags/stringtable.xml new file mode 100644 index 0000000000..a567ed226e --- /dev/null +++ b/addons/marker_flags/stringtable.xml @@ -0,0 +1,133 @@ + + + + + Marker Flags + Markierungsfahnen + Chorągiewki + 旗マーカー + 마킹용 깃발 + 标记旗 + + + Place Anywhere + Überall platzieren + どこでも設置可能 + Umieść w dowolnym miejscu + 아무 곳에나 배치 + 随意放置 + + + Place marker flag anywhere regardless of surface. + どのような地表でも旗を設置できるようにします + Umieść chorągiewkę w dowolnym miejscu, niezależnie od powierzchni. + 지면에 상관없이 아무곳에서나 마킹용 깃발을 배치합니다. + 不管地形表面是什么都可以放标记旗 + + + Place Marker Flag + Markierungsfahne platzieren + + + Adjust height + Höhe anpassen + + + Cancel + Abbrechen + Cancelar + Anuluj + Annuler + Zrušit + Annulla + Mégsem + Cancelar + Отмена + 中止 + 취소 + 取消 + 取消 + Iptal + + + Pick Up + 提取點 + Récupérer + Recoger + Recupera + Podnieś + Подобрать + Vyzvednutí + Pegar + 가져가기 + 提取点 + 拾う + Al + Aufheben + + + Marker Flag (White) + Markierungsfahne (Weiß) + Chorągiewka (Biała) + 旗マーカー (白) + 마킹용 깃발(하양) + 标记旗(白) + + + Marker Flag (Black) + Markierungsfahne (Schwarz) + Chorągiewka (Czarna) + 旗マーカー (黒) + 마킹용 깃발(검정) + 标记旗(黑) + + + Marker Flag (Red) + Markierungsfahne (Rot) + Chorągiewka (Czerwona) + 旗マーカー (赤) + 마킹용 깃발(빨강) + 标记旗(红) + + + Marker Flag (Green) + Markierungsfahne (Grün) + Chorągiewka (Zielona) + 旗マーカー (緑) + 마킹용 깃발(초록) + 标记旗(绿) + + + Marker Flag (Blue) + Markierungsfahne (Blau) + Chorągiewka (Niebieska) + 旗マーカー (青) + 마킹용 깃발(파랑) + 标记旗(蓝) + + + Marker Flag (Yellow) + Markierungsfahne (Gelb) + Chorągiewka (Żółta) + 旗マーカー (黄) + 마킹용 깃발(노랑) + 标记旗(黄) + + + Marker Flag (Orange) + Markierungsfahne (Orange) + Chorągiewka (Pomarańczowa) + 旗マーカー (橙) + 마킹용 깃발(주황) + 标记旗(橙) + + + Marker Flag (Purple) + Markierungsfahne (Lila) + Chorągiewka (Fioletowa) + 旗マーカー (紫) + 마킹용 깃발(보라) + 标记旗(紫) + + + diff --git a/addons/marker_flags/ui/black_ca.paa b/addons/marker_flags/ui/black_ca.paa new file mode 100644 index 0000000000..72ac604b6b Binary files /dev/null and b/addons/marker_flags/ui/black_ca.paa differ diff --git a/addons/marker_flags/ui/blue_ca.paa b/addons/marker_flags/ui/blue_ca.paa new file mode 100644 index 0000000000..9c45de381f Binary files /dev/null and b/addons/marker_flags/ui/blue_ca.paa differ diff --git a/addons/marker_flags/ui/green_ca.paa b/addons/marker_flags/ui/green_ca.paa new file mode 100644 index 0000000000..72a2f62d6c Binary files /dev/null and b/addons/marker_flags/ui/green_ca.paa differ diff --git a/addons/marker_flags/ui/icons/black_place_icon.paa b/addons/marker_flags/ui/icons/black_place_icon.paa new file mode 100644 index 0000000000..5526fc2c92 Binary files /dev/null and b/addons/marker_flags/ui/icons/black_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/blue_place_icon.paa b/addons/marker_flags/ui/icons/blue_place_icon.paa new file mode 100644 index 0000000000..8f899cae24 Binary files /dev/null and b/addons/marker_flags/ui/icons/blue_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/green_place_icon.paa b/addons/marker_flags/ui/icons/green_place_icon.paa new file mode 100644 index 0000000000..151b597cfe Binary files /dev/null and b/addons/marker_flags/ui/icons/green_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/orange_place_icon.paa b/addons/marker_flags/ui/icons/orange_place_icon.paa new file mode 100644 index 0000000000..7477a4a07f Binary files /dev/null and b/addons/marker_flags/ui/icons/orange_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/purple_place_icon.paa b/addons/marker_flags/ui/icons/purple_place_icon.paa new file mode 100644 index 0000000000..1c5a63d8ef Binary files /dev/null and b/addons/marker_flags/ui/icons/purple_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/red_place_icon.paa b/addons/marker_flags/ui/icons/red_place_icon.paa new file mode 100644 index 0000000000..c0fcea9048 Binary files /dev/null and b/addons/marker_flags/ui/icons/red_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/white_pickup_icon.paa b/addons/marker_flags/ui/icons/white_pickup_icon.paa new file mode 100644 index 0000000000..bc5d4ac7e4 Binary files /dev/null and b/addons/marker_flags/ui/icons/white_pickup_icon.paa differ diff --git a/addons/marker_flags/ui/icons/white_place_icon.paa b/addons/marker_flags/ui/icons/white_place_icon.paa new file mode 100644 index 0000000000..c4f03200d8 Binary files /dev/null and b/addons/marker_flags/ui/icons/white_place_icon.paa differ diff --git a/addons/marker_flags/ui/icons/yellow_place_icon.paa b/addons/marker_flags/ui/icons/yellow_place_icon.paa new file mode 100644 index 0000000000..965a36185f Binary files /dev/null and b/addons/marker_flags/ui/icons/yellow_place_icon.paa differ diff --git a/addons/marker_flags/ui/orange_ca.paa b/addons/marker_flags/ui/orange_ca.paa new file mode 100644 index 0000000000..f6d8b0643a Binary files /dev/null and b/addons/marker_flags/ui/orange_ca.paa differ diff --git a/addons/marker_flags/ui/purple_ca.paa b/addons/marker_flags/ui/purple_ca.paa new file mode 100644 index 0000000000..4a8e620bd9 Binary files /dev/null and b/addons/marker_flags/ui/purple_ca.paa differ diff --git a/addons/marker_flags/ui/red_ca.paa b/addons/marker_flags/ui/red_ca.paa new file mode 100644 index 0000000000..b570688bc9 Binary files /dev/null and b/addons/marker_flags/ui/red_ca.paa differ diff --git a/addons/marker_flags/ui/white_ca.paa b/addons/marker_flags/ui/white_ca.paa new file mode 100644 index 0000000000..c69afdec28 Binary files /dev/null and b/addons/marker_flags/ui/white_ca.paa differ diff --git a/addons/marker_flags/ui/yellow_ca.paa b/addons/marker_flags/ui/yellow_ca.paa new file mode 100644 index 0000000000..c085ad2376 Binary files /dev/null and b/addons/marker_flags/ui/yellow_ca.paa differ diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index 2aa7a0155e..2a900f2241 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -343,7 +343,7 @@ // init marker scale slider _aceScaleSlider sliderSetRange [0.5, 2.0]; - if !(GVAR(editingMarker) isEqualTo "") then { + if (GVAR(editingMarker) isNotEqualTo "") then { //get the original scale GVAR(currentMarkerScale) = (markerSize GVAR(editingMarker)) param [0, 1]; }; diff --git a/addons/markers/functions/fnc_placeMarker.sqf b/addons/markers/functions/fnc_placeMarker.sqf index 77942343ad..8db947d0b8 100644 --- a/addons/markers/functions/fnc_placeMarker.sqf +++ b/addons/markers/functions/fnc_placeMarker.sqf @@ -51,7 +51,7 @@ if (_closeNum isEqualTo 1) then { // Add to list of user placed markers, and then filter for deleted GVAR(userPlacedMarkers) pushBack _newestMarker; - GVAR(userPlacedMarkers) = GVAR(userPlacedMarkers) select {!((getMarkerPos _x) isEqualTo [0,0,0])}; + GVAR(userPlacedMarkers) = GVAR(userPlacedMarkers) select {(getMarkerPos _x) isNotEqualTo [0,0,0]}; [QGVAR(setMarkerNetwork), [ _newestMarker, [ diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index f39f8c3f76..9effc9cf30 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -9,6 +9,8 @@ スケール: %1 Skala: %1 Skalierung: %1 + 规模:%1° + 크기: %1 Direction: %1° @@ -23,7 +25,7 @@ Direção %1 方位: %1° 방위: %1° - 方位: %1° + 方位:%1° 方位: %1° Yön: %1° @@ -34,6 +36,8 @@ 右クリックでリセット Naciśnij PPM żeby zresetować Rechte Maustaste zum Zurücksetzen + 点击鼠标右键重置 + 오른쪽 클릭으로 재설정 Markers @@ -41,8 +45,8 @@ マーカー Marcatori 標誌 - 标志 - 맵마커 + 标识 + 지도 마커 Znaczniki Маркеры Marcadores @@ -57,7 +61,7 @@ 次ユーザーにマーカー移動を許可 마커 이동 허가 誰可以移動標誌 - 谁可以移动标志 + 谁可以移动标识 Permetti di spostare i marcatori a: Zezwól na poruszanie znaczników dla Разрешить перемещение маркеров для @@ -70,9 +74,9 @@ Restricts which players are able to move markers while holding the Alt key. Beschränkt welche Spieler Marker mit gedrückter Alt-Taste bewegen können. どのプレイヤーが Alt キーを押しながらマーカー移動をできるか制限できます。 - Alt 키를 누른 상태에서 마커를 움직일 수있는 플레이어를 제한합니다. + Alt 키를 누른 상태에서 마커를 움직일 수 있는 플레이어를 제한합니다. 設定誰可以透過按住Alt鍵來移動標誌 - 设定谁可以透过按住Alt键来移动标志。 + 设定谁可以透过按住 Alt 键来移动标识。 Limita quali giocatori possono spostare i marcatori mentre premono il tasto Alt. Ogranicz którzy gracze mogą poruszać znacznikami podczas trzymania przycisku Alt. Устанавливает ограничение на перемещения маркеров игроками при помощи клавиши Alt @@ -170,11 +174,13 @@ Создателя Criador 放置者 + 放置者 Créateur Creatore Tvůrce Yaratıcı Creador + 제작자 Allow Timestamps @@ -184,6 +190,8 @@ Permitir marcas de tiempo Zezwól na znaczniki czasu Erlaube Zeitstempel + 允许时间戳 + 시간 표기 허용 Whether to allow timestamps to be automatically applied to markers @@ -193,6 +201,8 @@ Permitir que las marcas de tiempo sean automáticamente aplicadas a los marcadores Zezwól na automatyczne stosowanie znaczników czasu do markerów Ob Zeitstempel automatisch auf Maker angewendet werden sollen. + 是否允许时间戳自动应用于标记 + 허용 시 마커를 내려놓음과 동시에 시간이 표기됩니다 Timestamp @@ -202,6 +212,8 @@ Marca de tiempo Znacznik czasu Zeitstempel + 时间戳 + 시간 표기 Watch Required @@ -211,6 +223,8 @@ Reloj requerido Wymagany zegarek Uhr benötigt + 需要手表 + 시계 필요함 Timestamp Format @@ -220,6 +234,8 @@ Formato de marca de tiempo Format znacznika czasu Format des Zeitstempels + 时间戳格式 + 시간 표기 포맷 Changes the timestamp format @@ -229,6 +245,8 @@ Cambia el formato de marca de tiempo Zmienia format znacznika czasu Zeitstempel-Format anpassen + 更改时间戳格式 + 시간 표기 포맷을 바꿉니다 "HH" - Hour @@ -238,6 +256,8 @@ "HH" - Hora "HH" - Godziny "HH" - Stunden + "HH"—时 + "HH" - 시 "MM" - Minute @@ -247,6 +267,8 @@ "MM" - Minuto "MM" - Minuty "MM" - Minuten + "MM"—分 + "MM" - 분 "SS" - Seconds @@ -256,6 +278,8 @@ "SS" - Segundos "SS" - Sekundy "SS" - Sekunden + "SS"—秒 + "SS" - 초 "MM" - Milliseconds @@ -265,6 +289,8 @@ "MM" - Milisegundos "MM" - Milisekundy "MS" - Milisekunden + "MS"—毫秒 + "MS" - 밀리초 Timestamp Hour Format @@ -274,6 +300,8 @@ Formato de hora de marca de tiempo Format Godzinnych znaczników czasu Zeitstempel-Stundenformat + 时间戳小时格式 + 시간 표기 시간 포맷 24-Hour Clock @@ -283,6 +311,8 @@ Reloj 24-Horas Zegar 24-godzinny 24-Stunden + 24小时制 + 24시간제 12-Hour Clock @@ -292,6 +322,8 @@ Reloj 12-Horas Zegar 12-godzinny 12-Stunden + 12小时制 + 12시간제 Changes timestamp to use either 24-hour or 12-hour clock format @@ -301,6 +333,8 @@ Cambia que la marca de tiempo sea en formato de reloj 24-horas o 12-horas Zmienia znacznik czasu tak, aby używał formatu 24-godzinnego lub 12-godzinnego Ändert den Zeitstempel, um entweder das 24-Stunden- oder das 12-Stunden-Format zu verwenden + 改变时间戳以使用24小时或12小时的时钟格式 + 시간 표기를 24시간제 혹은 12시간제 에서 골라 표기합니다 diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml index 72cf882add..e50668ed7b 100644 --- a/addons/maverick/stringtable.xml +++ b/addons/maverick/stringtable.xml @@ -8,8 +8,8 @@ AGM-65 Maverick L, Guida Laser Missile Anti-Terra AGM-65 マーベリック L、レーザー誘導対地ミサイル AGM-65"小牛"飛彈L型,雷射導引對地導彈 - AGM-65"小牛"空地L型,雷射导引对地导弹 - AGM-65 Maverick L, 레이저 유도 대지 미사일 + AGM-65"小牛"L型激光制导对地导弹 + AGM-65 매버릭 L, 레이저 유도 대지 미사일 AGM-65 Maverick L, Kierowany laserowo pocisk powietrze-ziemia AGM-65 Maverick L, ракета Воздух-Земля с лазерным наведением AGM-65 Maverick L, Míssil Anti Chão Guiado a Laser @@ -25,7 +25,7 @@ AGM-65 マーベリック L [ACE] AGM-65"小牛"飛彈L型 [ACE] AGM-65"小牛"空地L型 [ACE] - AGM-65 Maverick L [ACE] + AGM-65 매버릭 L [ACE] AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] AGM-65 Maverick L [ACE] @@ -41,7 +41,7 @@ 2x AGM-65 マーベリック L [ACE] 2x AGM-65"小牛"飛彈L型 [ACE] 2x AGM-65"小牛"空地L型 [ACE] - 2x AGM-65 Maverick L [ACE] + 2x AGM-65 매버릭 L [ACE] 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] 2x AGM-65 Maverick L [ACE] @@ -57,7 +57,7 @@ 3x AGM-65 マーベリック L [ACE] 3x AGM-65"小牛"飛彈L型 [ACE] 3x AGM-65"小牛"空地L型 [ACE] - 3x AGM-65 Maverick L [ACE] + 3x AGM-65 매버릭 L [ACE] 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] 3x AGM-65 Maverick L [ACE] @@ -74,13 +74,15 @@ MAVL MAVL MAVL + MAVL + MAVL Kh-25ML, Laser Guided Air-to-Ground-Missile Ch-25ML, Lasergelenkte Luft-Boden-Rakete Kh-25ML, 레이저 유도 대공 미사일 Kh-25ML,雷射導引對地導彈 - Kh-25ML,镭射导引空地导弹 + Kh-25ML,激光制导空地导弹 Kh-25ML、レーザー誘導対地ミサイル Kh-25ML, a Guida Laser Missile Aria-Terra Kh-25ML, Kierowany laserowo pocisk powietrze-ziemia @@ -97,7 +99,7 @@ 1x Х-25МЛ [ACE] 1x Kh-25ML [ACE] 1x Kh-25ML [ACE] - 1x Kh-25ML镭射空地导弹 [ACE] + 1x Kh-25ML 激光空地导弹 [ACE] 1x Kh-25ML [ACE] 1x Kh-25ML [ACE] 1x Kh-25ML [ACE] @@ -115,8 +117,8 @@ AGM-65 Maverick L AGM-65 マーベリック L AGM-65"小牛"空地L型 - AGM-65"小牛"飞弹L型 - AGM-65 Maverick L + AGM-65"小牛"导弹L型 + AGM-65 매버릭 L AGM-65 Maverick L AGM-65 Maverick L AGM-65 Maverick L @@ -131,7 +133,7 @@ Х-25МЛ Kh-25ML Kh-25ML - Kh-25ML镭射空地导弹 + Kh-25ML 激光空地导弹 Kh-25ML Kh-25ML Kh-25ML diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 2ebebbbd3d..9361d05015 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -8,47 +8,4 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" -// Add warning for old functions that were technically public, Remove at 3.14.0 -{ - missionNamespace setVariable [_x, compileFinal format ['diag_log text "ACE Medical WARNING: Formerly public function [%1] has no effect in medical rewrite."; nil', _x]]; -} forEach [ - QFUNC(actionPlaceInBodyBag), - QFUNC(actionRemoveTourniquet), - QFUNC(addHeartRateAdjustment), - QFUNC(addToLog), - QFUNC(addToTriageCard), - QFUNC(addUnconsciousCondition), - QFUNC(addVitalLoop), - QFUNC(canAccessMedicalEquipment), - QFUNC(canTreat), - QFUNC(displayTriageCard), - QFUNC(dropDownTriageCard), - QFUNC(getTriageStatus), - QFUNC(getUnconsciousCondition), - QFUNC(hasItem), - QFUNC(hasItems), - QFUNC(hasTourniquetAppliedTo), - QFUNC(isInMedicalFacility), - QFUNC(isInMedicalVehicle), - QFUNC(isMedic), - QFUNC(isMedicalVehicle), - QFUNC(itemCheck), - QFUNC(selectionNameToNumber), - QFUNC(setCardiacArrest), - QFUNC(setDead), - QFUNC(setHitPointDamage), - QFUNC(showBloodEffect), - QFUNC(treatment), - QFUNC(treatmentAdvanced_bandage), - QFUNC(treatmentAdvanced_CPR), - QFUNC(treatmentAdvanced_CPRLocal), - QFUNC(treatmentAdvanced_medication), - QFUNC(treatmentAdvanced_medicationLocal), - QFUNC(treatmentIV), - QFUNC(treatmentIVLocal), - QFUNC(unconsciousPFH), - QFUNC(useItem), - QFUNC(useItems) -]; - ADDON = true; diff --git a/addons/medical/functions/fnc_addDamageToUnit.sqf b/addons/medical/functions/fnc_addDamageToUnit.sqf index f571d27726..11652777e9 100644 --- a/addons/medical/functions/fnc_addDamageToUnit.sqf +++ b/addons/medical/functions/fnc_addDamageToUnit.sqf @@ -9,7 +9,8 @@ * 2: Body part ("Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg") * 3: Projectile Type * 4: Source - * 5: Non-directional damage source array (Optional) + * 5: Unused parameter maintained for backwards compatibility (default: []) + * 6: Override Invulnerability (default: true) * * Return Value: * Successful @@ -22,8 +23,16 @@ */ // #define DEBUG_TESTRESULTS -params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_bodyPart", "", [""]], ["_typeOfDamage", "", [""]], ["_instigator", objNull, [objNull]], ["_damageSelectionArray", [], [[]]]]; -TRACE_6("addDamageToUnit",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator,_damageSelectionArray); +params [ + ["_unit", objNull, [objNull]], + ["_damageToAdd", -1, [0]], + ["_bodyPart", "", [""]], + ["_typeOfDamage", "", [""]], + ["_instigator", objNull, [objNull]], + "", + ["_overrideInvuln", true, [true]] +]; +TRACE_7("addDamageToUnit",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator,_damageSelectionArray,_overrideInvuln); _bodyPart = toLower _bodyPart; private _bodyPartIndex = ALL_BODY_PARTS find _bodyPart; @@ -32,13 +41,13 @@ if (_bodyPartIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad selection %1", if (isNull _unit || {!local _unit} || {!alive _unit}) exitWith {ERROR_2("addDamageToUnit - badUnit %1 [local %2]", _this, local _unit); false}; if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); false}; +if (!_overrideInvuln && {!((isDamageAllowed _unit) && {_unit getVariable [QEGVAR(medical,allowDamage), true]})}) exitWith { + ERROR_1("addDamageToUnit - unit invulnerable %1", _this); false +}; + // Extension is case sensitive and expects this format (different from ALL_BODY_PARTS) _bodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] select _bodyPartIndex; -if (_damageSelectionArray isEqualTo []) then { // this will only be used if damage type is not location specific - _damageSelectionArray = [HITPOINT_INDEX_HEAD, 1, HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LARM, 1, HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1]; -}; - if (!isNull _instigator) then { _unit setVariable [QEGVAR(medical,lastDamageSource), _instigator]; _unit setVariable [QEGVAR(medical,lastInstigator), _instigator]; @@ -49,7 +58,7 @@ private _startDmg = +(_unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0, private _startPain = GET_PAIN(_unit); #endif -[QEGVAR(medical,woundReceived), [_unit, _bodyPart, _damageToAdd, _instigator, _typeOfDamage, _damageSelectionArray]] call CBA_fnc_localEvent; +[QEGVAR(medical,woundReceived), [_unit, [[_damageToAdd, _bodyPart, _damageToAdd]], _instigator, _typeOfDamage]] call CBA_fnc_localEvent; #ifdef DEBUG_TESTRESULTS private _endDmg = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 55424b618a..c76c312f89 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -13,7 +13,7 @@ ACE Orvosi Rendszer ACE Medical ACE 의료 - ACE 医疗系统 + ACE 医疗 ACE 醫療系統 ACE Medikal ACE 医療 @@ -32,6 +32,7 @@ Szansa na wybudzenie nieprzytomnego Posibilidad de recuperar la conciencia Bayılmış Bir Kişinin Uyanma Şansı + 기절 회복 확률 The probability that a person with stable vitals will wake up from unconsciousness (checked every 15 seconds). @@ -47,6 +48,7 @@ Prawdopodobieństwo, że jednostka ze stabilnymi parametrami życiowymi obudzi się z nieprzytomności (sprawdzane co 15 sekund). La probabilidad de que una unidad estabilizada recupere la conciencia y se levante (se comprueba cada 15 segundos) Hayati değerleri stabil olan bir kişinin bilinçsizlikten uyanma olasılığı (her 15 saniyede bir kontrol edilir). + 기절하고 안정화된 상태에서 깨어날 확률을 정합니다 (매 15초 마다 갱신됨) Epinephrine Wake Up Chance Boost @@ -60,6 +62,7 @@ Увеличение шанса очнуться от адреналина Epinefrin Uyanma Şansı Artışı Aumento de probabilidad de despertarse por epinefrina + 에피네프린 사용 시 추가 회복 확률 Increases how often spontaneous wake up checks happen when patient has Epinephrine in their system. @@ -75,6 +78,7 @@ Erhöht wie oft Aufwachprüfungen passieren, wenn ein Patient Epinephrin im Blutkreislauf hat. Увеличивает частоту проверок на спонтанное пробуждение, когда пациент под действием адреналина. Hastanın sisteminde Epinefrin olduğunda rasgele uyanma kontrollerinin ne sıklıkla gerçekleştiğini artırır. + 에피네프린 투여 후 환자가 일어날 확률을 얼마나 추가할 지 정합니다. Limping @@ -90,6 +94,7 @@ Cojera Humpeln Topallama + 절뚝거림 Controls whether open or bandaged wounds cause a person to limp. @@ -105,6 +110,7 @@ Stellt ein, ob offene oder bandagierte Wunden eine Person zum Humpeln bringen. Контролирует хромоту в случае открытых или забинтованных ран. Açık veya sargılı yaraların bir kişinin topallamasına neden olup olmadığını kontrol eder. + 붕대로 묶인 상처가 플레이어를 절게 만들지 결정합니다. Limp on Open Wounds @@ -120,6 +126,7 @@ Cojera en heridas abiertas Humpeln bei offenen Wunden Açık Yaralarda Topallama + 상처 개방 시 절뚝거림 Limp on Open or Bandaged Wounds @@ -135,6 +142,7 @@ Cojera en heridas abiertas o vendadas Humpeln bei offenen oder bandagierten Wunden Açık veya Sargılı Yaralarda Topallama + 상처 개방 혹은 붕대질 후에도 절뚝거림 Fractures @@ -150,12 +158,13 @@ Fracturas Brüche Kırıklar + 골절 Controls the effect of using splints to treat fractures.\nWhen disabled, injuries will not cause fractures. 医療機能で骨折に添え木効果を使うかどうかを決定できます。\n無効化すると、骨折効果は表れません。 控制是否讓固定版能夠治療骨折。\n當停用時,受傷時不會導致骨折發生。 - 控制是否让固定版能够治疗骨折。 \n当停用时,受伤时不会导致骨折发生。 + 控制是否让固定板能够治疗骨折。 \n当停用时,受伤时不会导致骨折发生。 Permet de définir le niveau d'efficacité des attelles pour le traitement des fractures.\nSi l'option est désactivée, les blessures ne causent pas de fractures. Controlla l'effetto dell'utilizzo di stecche per curare le fratture. Quando disabilitato, le lesioni non causano fratture. Nastavuje efekt dlahy při léčení zlomenin.\nPokud je tato možnost vypnuta, zranění nebudou způsobovat zlomeniny. @@ -165,6 +174,7 @@ Kontrolliert den Effekt wenn Schienen verwendet werden, um Knochenbrüche zu behandeln.\nWenn diese Einstellung nicht aktiviert ist, verursachen Verletzungen keine Knochenbrüche. Управляет эффектом использования шин для лечения переломов.\nПри отключении травмы не вызывают переломов. Kırıkları tedavi etmek için atel kullanmanın etkisini kontrol eder. \ Devre dışı bırakıldığında, yaralanmalar kırılmaya neden olmaz. + 부목이 골절을 어떻게 치료할 지 결정합니다\n비활성화 시 골절이 일어나지 않습니다. Splints Fully Heal Fractures @@ -180,6 +190,7 @@ Férulas sanan completamente las fracturas Schienen heilen Knochenbrüche vollständig Ateller Kırıkları Tamamen İyileştirir + 부목이 골절을 완전히 치료 Splints Heal, but Cannot Sprint @@ -188,13 +199,14 @@ Les attelles guérissent les fractures, mais empêchent de sprinter Talas curam (mas não consegue correr) 固定版能治癒骨折,但無法奔跑 - 固定版能治愈骨折,但无法奔跑 + 固定板能治愈骨折,但无法奔跑 Le gessature curano, ma non puoi correre Dlahy léčí, ale zněmožňují sprintování Szyny leczą, ale uniemożliwiają sprint Las férulas sanan, pero no pueden correr Schienen heilen, aber ermöglichen kein Sprinten Ateller İyileştirir, ancak Koşamaz + 부목이 치료는 하지만 달릴 수는 없음 Splints Heal, but Cannot Jog @@ -205,6 +217,8 @@ Шины вылечивают, но не дают бежать трусцой Szyny leczą, ale uniemożliwiają trucht Schiene heilt, aber verhindert Sprinten + 부목이 치료는 하지만 빨리 걷지 못함 + 固定板能治愈骨折,但无法慢跑 Fracture Chance @@ -217,6 +231,7 @@ Kırılma Şansı Probabilidad de fractura Wahrscheinlichkeit einer Fraktur + 골절 확률 The probability of a fracture causing wound resulting in a fracture. @@ -229,6 +244,7 @@ Yaraya neden olan bir kırığın kırılma olasılığı. La probabilidad de que una herida que pueda provocar una fractura, provoque una fractura. Die Wahrscheinlichkeit, dass eine Wunde, die eine Fraktur verursachen würde, tatsächlich zu einer Fraktur führt. + 상처를 입을 때 골절에 얼마나 관여할지를 결정합니다. Enabled for @@ -260,7 +276,7 @@ Seleziona per quali unità verrà abilitato il sistema medico avanzato 選択されたユニットが、アドバンスド医療が使えるようになります 어느 인원에게 고급 의료 시스템을 적용시킬지 선택하십시요. - 选择进阶医疗系统影响的对象 + 选择进阶医疗系统影响的物体 選擇進階醫療系統影響的對象 Gelişmiş tıbbi sistemin hangi üniteler için etkinleştirileceğini seçin @@ -294,7 +310,7 @@ Giocatori ed IA プレイヤーと AI 플레이어 및 인공지능 - 玩家与AI + 玩家与 AI 玩家與AI Oyuncular ve AI @@ -328,7 +344,7 @@ Le unità sostengono danni da incidenti con veicoli? ユニットは車両の衝突による損傷を受けるようにしますか? 차량 사고시 인원들이 부상을 입습니까? - 设定人员是否会因为载具冲撞别的物件而产生伤害? + 设定人员是否会因为载具冲撞别的物体而产生伤害? 設定人員是否會因為載具衝撞別的物件而產生傷害? Birimler bir araç kazasından hasar alır mı? diff --git a/addons/medical_ai/functions/fnc_healingLogic.sqf b/addons/medical_ai/functions/fnc_healingLogic.sqf index 136b6927da..a07b08db8b 100644 --- a/addons/medical_ai/functions/fnc_healingLogic.sqf +++ b/addons/medical_ai/functions/fnc_healingLogic.sqf @@ -54,7 +54,7 @@ switch (true) do { _treatmentTime = 5; _treatmentArgs = [_target, _selection, "FieldDressing"]; }; - case (IN_CRDC_ARRST(_target) && {EGVAR(medical_treatment,cprSuccessChance) > 0}): { + case (IN_CRDC_ARRST(_target) && {EGVAR(medical_treatment,cprSuccessChanceMin) > 0}): { _treatmentEvent = QEGVAR(medical_treatment,cprLocal); _treatmentArgs = [_healer, _target]; _treatmentTime = 15; diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml index e8b73e56b3..67381ebb18 100644 --- a/addons/medical_ai/stringtable.xml +++ b/addons/medical_ai/stringtable.xml @@ -8,12 +8,14 @@ ИИ Медик Médecine IA IA Médico + AI 医疗兵 AI醫療兵 Medico AI Zdravotnická AI Medyk AI Médico para IA Medikal AI + 인공지능 의무병 AI will respond to injury and unconsciousness @@ -22,11 +24,13 @@ ИИ будет реагировать на травмы и потерю сознания Les unités IA seront sensibles aux blessures, ainsi qu'à la perte de connaissance. A IA irá responder a ferimentos e perdas de consciência + AI 对于受伤及无意识单位会有所反应 AI對於受傷及無意識單位會有所反應 L'intelligenza artificiale risponderà a lesioni e perdita di coscienza UI reaguje na zranění a bezvědomí AI zareaguje na obrażenia i utratę przytomności La IA responderá a heridas e inconsciencia + 인공지능이 기절이나 부상에 대응합니다 Only Server and HC @@ -37,9 +41,9 @@ Tylko serwer i HC Seulement sur le serveur ou le HC Solo Server e HC - 只在伺服器或无头客户端 + 只在服务器或无头客户端 只在伺服器或無頭客戶端 - 서버와 헤드리스만 + 서버와 헤드리스 전용 Apenas Servidor e HC Pouze Server a HC Sadece Sunucu ve HC de diff --git a/addons/medical_blood/XEH_preInit.sqf b/addons/medical_blood/XEH_preInit.sqf index ae4de9d026..3d10086703 100644 --- a/addons/medical_blood/XEH_preInit.sqf +++ b/addons/medical_blood/XEH_preInit.sqf @@ -8,6 +8,9 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +// Damage types which do not cause blood spurts +GVAR(noBloodDamageTypes) = createHashMapFromArray (call (uiNamespace getVariable QGVAR(noBloodDamageTypes))); + // blood object model namespace GVAR(models) = [] call CBA_fnc_createNamespace; diff --git a/addons/medical_blood/XEH_preStart.sqf b/addons/medical_blood/XEH_preStart.sqf index 022888575e..d051879f3c 100644 --- a/addons/medical_blood/XEH_preStart.sqf +++ b/addons/medical_blood/XEH_preStart.sqf @@ -1,3 +1,10 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +// Damage types which do not cause blood spurts +private _noBloodDamageTypes = "getNumber (_x >> 'noBlood') == 1" configClasses (configFile >> "ACE_Medical_Injuries" >> "damageTypes"); +uiNamespace setVariable [ + QGVAR(noBloodDamageTypes), + compileFinal str (_noBloodDamageTypes apply {[configName _x, nil]}) +]; diff --git a/addons/medical_blood/functions/fnc_handleWoundReceived.sqf b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf index 7447cac52f..d6b73cb563 100644 --- a/addons/medical_blood/functions/fnc_handleWoundReceived.sqf +++ b/addons/medical_blood/functions/fnc_handleWoundReceived.sqf @@ -5,9 +5,9 @@ * * Arguments: * 0: Unit - * 1: Body Part (not used) - * 2: Damage - * 3: Shooter + * 1: Damage done to each body part + * 2: Shooter + * 3: Ammo classname or damage type * * Return Value: * None @@ -18,7 +18,11 @@ * Public: No */ -params ["_unit", "", "_damage", "_shooter"]; +params ["_unit", "_allDamages", "_shooter", "_damageType"]; +(_allDamages select 0) params ["_damage"]; + +// Don't bleed if damage type does not cause bleeding +if (_damageType in GVAR(noBloodDamageTypes)) exitWith {}; // Don't bleed when players only and a non-player unit is wounded if (GVAR(enabledFor) == BLOOD_ONLY_PLAYERS && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index 79f8f7ba75..d2027e3ac4 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -13,6 +13,7 @@ Sangue 혈흔 血痕 + 血迹 血跡 Kan @@ -38,6 +39,7 @@ Si une unité saigne, elle laissera des traces de sang derrière elle. Разрешает создание капель крови при кровотечении или получении урона Permitir a criação de gotas de sangue quando as unidades recebem ferimentos ou estão sangrando. + 当单位失血或受伤的时,启用出血效果。 啟用出血效果當單位失血或受傷的時候。 Povoluje vytváření kapek krve na zemi když jednotka krvácí nebo utrpí zranění. Umożliwia tworzenie śladów krwi, gdy jednostki krwawią lub otrzymują obrażenia. @@ -45,6 +47,7 @@ Kişiler kanarken veya hasar alırken kan damlası oluşumunu sağlar. Abilita la creazione di chiazze di sangue quando un'unità sta sanguinando o viene ferita. Ermöglicht das Erstellen von Blutstropfen, wenn Einheiten am Bluten sind oder Schaden nehmen. + 출혈이나 부상 시 핏자국이 생기는것을 활성화합니다. Max Blood Objects @@ -52,6 +55,7 @@ Quantité de sang à afficher Макс. кол-во капель крови Limite de objetos de sangue + 最大血迹数 最大血跡數 Massimo numero di chiazze di sangue Maximum objektů krve @@ -59,6 +63,7 @@ Máxima cantidad de objetos de sangre Maksimum Kan Objeleri Maximale Anzahl an Blutstropfen-Objekten + 최대 피의 양 Sets the maximum number of blood drop objects which can be spawned, excessive amounts can cause FPS lag. @@ -66,6 +71,7 @@ Définit le nombre maximal de traces de sangs pouvant être affichées.\nUne quantité excessive peut engendrer une baisse de FPS. Задает макс. количество создаваемых объектов капель крови. Чрезмерное количество может вызвать задержку FPS Define o limite máximo de objetos de gota de sangue que podem ser criados, quantidades excessivas podem causar lag de FPS. + 设置最大可存在的血迹数量。过量会导致帧数低下或卡顿 設定最大可存在的血跡數量。太極端的數量會導致幀數低落或卡頓 Imposta il numero massimo di chiazze di sangue che possono essere depositate, quantità eccessive possono causare del lag di FPS. Nastavuje maximum objektů krve na zemi, příliš mnoho může způsobit pokles FPS @@ -73,6 +79,7 @@ Fija el límite de objetos de sangre que aparecerán, cantidades excesivas pueden causar caídas de FPS Ortaya çıkabilecek maksimum kan damlası sayısını ayarlar, aşırı miktarlar FPS düşmesine neden olabilir. Legt die maximale Anzahl an Blutstropfen-Objekten fest, die erscheinen können. Eine zu hoch eingestellte Anzahl kann Lags verursachen. + 스폰되는 피의 최대량을 결정합니다. 너무 많은 양은 FPS 랙이 생길 수 있습니다. Blood Lifetime @@ -80,6 +87,7 @@ Durée d'affichage du sang Время жизни капель крови Duração do Sangue + 血迹时长 血跡時長 Durata del sangue Životnost krve @@ -87,6 +95,7 @@ Duración de la sangre Kan Ömrü Anzeigedauer der Blutstropfen + 피 잔존기간 Controls the lifetime of blood drop objects. @@ -94,6 +103,7 @@ Définit la durée d'affichage des traces de sang. Управляет временем жизни объектов капель крови. Controla o tempo de vida que um objeto de gota de sangue tem. + 控制血迹在地上的时长 控制血跡在地上的時長 Controlla la durata delle chiazze di sangue. Nastavuje jak dlouho objekty krve na zemi vydrží. @@ -101,6 +111,7 @@ Controla el tiempo de vida que tendrán los objetos de sangre Kan objelerinin silinme süresini belirler. Kontrolliert die Anzeigedauer der Blutstropfen-Objekte. + 떨어진 피의 잔존 기간을 정합니다. Only Players @@ -110,7 +121,7 @@ Tylko gracze Joueurs seulement Solo Giocatori - 只有玩家 + 仅玩家 只有玩家 Только игроки Apenas Jogadores diff --git a/addons/medical_damage/ACE_Medical_Injuries.hpp b/addons/medical_damage/ACE_Medical_Injuries.hpp index c85040ba29..f09008880b 100644 --- a/addons/medical_damage/ACE_Medical_Injuries.hpp +++ b/addons/medical_damage/ACE_Medical_Injuries.hpp @@ -7,136 +7,305 @@ class ACE_Medical_Injuries { // Source: Scarle // Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). class Abrasion { - causes[] = {"falling", "ropeburn", "vehiclecrash", "collision", "unknown"}; bleeding = 0.001; pain = 0.4; - minDamage = 0.01; - maxDamage = 0.30; }; // Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. class Avulsion { - causes[] = {"explosive", "vehiclecrash", "collision", "grenade", "shell", "bullet", "backblast", "bite"}; bleeding = 0.1; pain = 1.0; - minDamage = 0.01; causeLimping = 1; }; // Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. class Contusion { - causes[] = {"bullet", "backblast", "punch", "vehiclecrash", "collision", "falling"}; bleeding = 0; pain = 0.3; - minDamage = 0.02; - maxDamage = 0.35; }; // Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. class Crush { - causes[] = {"falling", "vehiclecrash", "collision", "punch", "unknown"}; bleeding = 0.05; pain = 0.8; - minDamage = 0.1; causeLimping = 1; causeFracture = 1; }; // Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. class Cut { - causes[] = {"vehiclecrash", "collision", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; bleeding = 0.01; pain = 0.1; - minDamage = 0.1; }; // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. class Laceration { - causes[] = {"vehiclecrash", "collision", "punch"}; bleeding = 0.05; pain = 0.2; - minDamage = 0.01; }; // Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel. class VelocityWound { - causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; bleeding = 0.2; pain = 0.9; - minDamage = 0.35; causeLimping = 1; causeFracture = 1; }; // Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. class PunctureWound { - causes[] = {"stab", "grenade"}; bleeding = 0.05; pain = 0.4; - minDamage = 0.02; causeLimping = 1; }; // Pain wound that is caused by making or being in contact with heat class ThermalBurn { - causes[] = {"burn"}; bleeding = 0; pain = 0.7; minDamage = 0; }; }; + class damageTypes { - // thresholds[] {{, }, {...}} + // thresholds[] {{, }, {...}} + // if damage is between two points, number is interpolated and then rounded by chance based on the decimal part + // e.g. a value of 2.7 has 70% chance to give 3 and 30% to give 2 + // put damage values in descending order; uses the first value found that is below the wound damage, and the point immediately before that thresholds[] = {{0.1, 1}}; + + // if 1, wounds are only applied to the hitpoint that took the most damage. othewrise, wounds are applied to all damaged hitpoints selectionSpecific = 1; + // list of damage handlers, which will be called in reverse order + // each entry should be a SQF expression that returns a function + // this can also be overridden for each damage type + class woundHandlers { + ADDON = QFUNC(woundsHandlerBase); + }; + class bullet { - // above damage, amount. Put the highest threshold to the left and lower the threshold with the elements to the right of it. - thresholds[] = {{0.1, 1}}; + // bullets only create multiple wounds when the damage is very high + thresholds[] = {{20, 10}, {4.5, 2}, {3, 1}, {0, 1}}; selectionSpecific = 1; + + class Avulsion { + // at damage, weight. between points, weight is interpolated then wound is chosen by weighted random. + // as with thresholds, but result is not rounded (decimal values used as-is) + weighting[] = {{1, 1}, {0.35, 0}}; + /* + damageMultiplier = 1; + sizeMultiplier = 1; + bleedingMultiplier = 1; + painMultiplier = 1; + fractureMultiplier = 1; + */ + }; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + // bruises caused by bullets hitting the plate are big + sizeMultiplier = 3.2; + // tone down the pain a tiny bit to compensate + painMultiplier = 0.8; + }; + class VelocityWound { + // velocity wounds are only in the 0.35-1.5 range + weighting[] = {{1.5, 0}, {1.5, 1}, {0.35, 1}, {0.35, 0}}; + // velocity wounds will tend to be medium or large + sizeMultiplier = 0.9; + }; }; class grenade { - thresholds[] = {{0.1, 3}, {0, 1}}; + // at low damage numbers, chance to create no wounds - makes it a bit more random instead of consistently covering people in bruises + thresholds[] = {{20, 10}, {10, 5}, {4, 3}, {1.5, 2}, {0.8, 2}, {0.3, 1}, {0, 0}}; selectionSpecific = 0; + class Avulsion { + weighting[] = {{1.5, 1}, {1.1, 0}}; + }; + class VelocityWound { + weighting[] = {{1.5, 0}, {1.1, 1}, {0.7, 0}}; + }; + class PunctureWound { + weighting[] = {{0.9, 0}, {0.7, 1}, {0.35, 0}}; + }; + class Cut { + weighting[] = {{0.7, 0}, {0.35, 1}, {0.35, 0}}; + }; + class Contusion { + weighting[] = {{0.5, 0}, {0.35, 1}}; + sizeMultiplier = 2; + painMultiplier = 0.9; + }; }; class explosive { - thresholds[] = {{1, 6}, {0.1, 4}, {0, 1}}; + // explosives create more and smaller wounds than grenades + thresholds[] = {{20, 15}, {8, 7}, {2, 3}, {1.2, 2}, {0.4, 1}, {0,0}}; selectionSpecific = 0; + class Avulsion { + weighting[] = {{1, 1}, {0.8, 0}}; + }; + class Cut { + weighting[] = {{1.5, 0}, {0.35, 1}, {0, 0}}; + }; + class Contusion { + weighting[] = {{0.5, 0}, {0.35, 1}}; + sizeMultiplier = 2; + painMultiplier = 0.9; + }; }; class shell { - thresholds[] = {{1, 7}, {0.1, 5}, {0, 1}}; + // shells tend to involve big pieces of shrapnel, so create fewer and larger wounds + thresholds[] = {{20, 10}, {10, 5}, {4.5, 2}, {2, 2}, {0.8, 1}, {0.2, 1}, {0, 0}}; selectionSpecific = 0; + class Avulsion { + weighting[] = {{1.5, 1}, {1.1, 0}}; + }; + class VelocityWound { + weighting[] = {{1.5, 0}, {1.1, 1}, {0.7, 0}}; + }; + class PunctureWound { + weighting[] = {{0.9, 0}, {0.7, 1}, {0.35, 0}}; + }; + class Cut { + weighting[] = {{0.7, 0}, {0.35, 1}, {0.35, 0}}; + }; + class Contusion { + weighting[] = {{0.5, 0}, {0.35, 1}}; + sizeMultiplier = 2; + painMultiplier = 0.9; + }; }; class vehiclecrash { - thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + thresholds[] = {{1.5, 3}, {1.5, 2}, {1, 2}, {1, 1}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered selectionSpecific = 0; + class woundHandlers: woundHandlers { + GVAR(vehiclecrash) = QFUNC(woundsHandlerVehiclecrash); + }; + class Abrasion { + weighting[] = {{0.30, 0}, {0.30, 1}}; + }; + class Avulsion { + weighting[] = {{0.01, 1}, {0.01, 0}}; + }; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + }; + class Crush { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Laceration { + + }; }; class collision { - thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + thresholds[] = {{8, 4}, {1, 1}, {0.3, 1}, {0.15, 0.5}, {0, 0.3}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered selectionSpecific = 0; - }; - class backblast { - thresholds[] = {{1, 6}, {0.55, 5}, {0, 2}}; - selectionSpecific = 0; - }; - class stab { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; - }; - class punch { - thresholds[] = {{0.1, 1}}; - selectionSpecific = 1; + class Avulsion { + weighting[] = {{1, 2}, {0.5, 0.5}, {0.5, 0}}; + }; + class Abrasion { + weighting[] = {{0.4, 0}, {0.2, 1}, {0, 0}}; + }; + class Contusion { + weighting[] = {{0.4, 0}, {0.2, 1}}; + }; + class Crush { + weighting[] = {{0.4, 1}, {0.2, 0}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Laceration { + }; }; class falling { - thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered + thresholds[] = {{8, 4}, {1, 1}, {0.2, 1}, {0.1, 0.7}, {0, 0.5}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered selectionSpecific = 0; + class Abrasion { + weighting[] = {{0.4, 0}, {0.2, 1}, {0, 0}}; + sizeMultiplier = 3; + }; + class Contusion { + weighting[] = {{0.4, 0}, {0.2, 1}}; + sizeMultiplier = 3; + }; + class Crush { + weighting[] = {{0.4, 1}, {0.2, 0}}; + sizeMultiplier = 1.5; + }; + }; + class backblast { + thresholds[] = {{1, 6}, {1, 5}, {0.55, 5}, {0.55, 2}, {0, 2}}; + selectionSpecific = 0; + class Avulsion { + weighting[] = {{0.30, 0}, {0.30, 1}}; + }; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + }; + class stab { + thresholds[] = {{0.1, 1}, {0.1, 0}}; + selectionSpecific = 1; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class PunctureWound { + weighting[] = {{0.02, 1}, {0.02, 0}}; + }; + }; + class punch { + thresholds[] = {{0.1, 1}, {0.1, 0}}; + selectionSpecific = 1; + class Contusion { + weighting[] = {{0.35, 0}, {0.35, 1}}; + }; + class Crush { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class Laceration { + + }; }; class ropeburn { - thresholds[] = {{0.1, 1}}; + thresholds[] = {{0.1, 1}, {0.1, 0}}; selectionSpecific = 1; + noBlood = 1; + class Abrasion { + weighting[] = {{0.30, 1}}; + }; + }; + class drowning { + //No related wounds as drowning should not cause wounds/bleeding. Can be extended for internal injuries if they are added. + thresholds[] = {{0, 0}}; + noBlood = 1; + class woundHandlers {}; + }; + class fire { + noBlood = 1; + // custom handling for environmental fire sources + // passes damage to "burn" so doesn't need its own wound stats + class woundHandlers { + ADDON = QFUNC(woundsHandlerBurning); + }; }; class burn { thresholds[] = {{0, 1}}; selectionSpecific = 0; - }; - //No related wounds as drowning should not cause wounds/bleeding. Can be extended for internal injuries if they are added. - class drowning { - thresholds[] = {{0, 0}}; + noBlood = 1; + class ThermalBurn { + weighting[] = {{0, 1}}; + }; }; class unknown { - thresholds[] = {{0.1, 1}}; + thresholds[] = {{0.1, 1}, {0.1, 0}}; + class Abrasion { + weighting[] = {{0.30, 0}, {0.30, 1}}; + }; + class Cut { + weighting[] = {{0.1, 1}, {0.1, 0}}; + }; + class VelocityWound { + weighting[] = {{0.35, 1}, {0.35, 0}}; + }; }; }; }; diff --git a/addons/medical_damage/XEH_PREP.hpp b/addons/medical_damage/XEH_PREP.hpp index 7f3a5b1102..6df53fb309 100644 --- a/addons/medical_damage/XEH_PREP.hpp +++ b/addons/medical_damage/XEH_PREP.hpp @@ -1,6 +1,11 @@ +PREP(debug_explosiveTest); PREP(determineIfFatal); PREP(getTypeOfDamage); PREP(handleIncapacitation); +PREP(interpolatePoints); PREP(parseConfigForInjuries); -PREP(woundsHandler); -PREP(woundsHandlerSQF); +PREP(parseWoundHandlersCfg); +PREP(woundReceived); +PREP(woundsHandlerBase); +PREP(woundsHandlerBurning); +PREP(woundsHandlerVehiclecrash); diff --git a/addons/medical_damage/XEH_preInit.sqf b/addons/medical_damage/XEH_preInit.sqf index b649db67cf..26445ad61a 100644 --- a/addons/medical_damage/XEH_preInit.sqf +++ b/addons/medical_damage/XEH_preInit.sqf @@ -16,20 +16,6 @@ addMissionEventHandler ["Loaded",{ call FUNC(parseConfigForInjuries); }]; -// decide which woundsHandler to use by whether the extension is present or not -// if ("ace_medical" callExtension "version" != "") then { - - // DFUNC(woundsHandlerActive) = LINKFUNC(woundsHandler); -// } else { - // INFO("Using woundsHandlerSQF"); - DFUNC(woundsHandlerActive) = LINKFUNC(woundsHandlerSQF); -// }; - -[QEGVAR(medical,woundReceived), { - params ["_unit", "_woundedHitPoint", "_receivedDamage", "", "_ammo", "_damageSelectionArray"]; - - private _typeOfDamage = _ammo call FUNC(getTypeOfDamage); - [_unit, _woundedHitPoint, _receivedDamage, _typeOfDamage, _damageSelectionArray] call FUNC(woundsHandlerActive); -}] call CBA_fnc_addEventHandler; +[QEGVAR(medical,woundReceived), LINKFUNC(woundReceived)] call CBA_fnc_addEventHandler; ADDON = true; diff --git a/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf b/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf new file mode 100644 index 0000000000..67f0a48d2d --- /dev/null +++ b/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf @@ -0,0 +1,63 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Testing function that spawns AI units in a spiral around the given point and optionally spawns a projectile at the center + * Used for observing the effects of explosive munitions + * + * Arguments: + * 0: Center position, format PositionAGL + * 1: Distance to spawn units + * 0: Min (default: 1) + * 1: Max (default: 10) + * 2: Step (default: 1) + * 2: Unit class to spawn (default: "B_Soldier_F") + * 3: Ammo class to spawn, "" or nil to skip (default: "") + * 4: Delay between unit placement and ammo spawning in seconds (default: 1) + * 5: Function to run on each unit that is spawned (optional) params [_unit, _center, _ammoClass] + * + * ReturnValue: + * Nothing + * + * Example: + * [position player, [20, 80, 5]] call ace_medical_damage_fnc_debug_explosiveTest + * + * Public: No + */ +params [ + "_center", + ["_distances", []], + ["_unitClass", "B_Soldier_F"], + ["_ammoClass", ""], + ["_delay", 1], + "_initCode" +]; + +_distances params [["_min", 1], ["_max", 10], ["_step", 1]]; + +if (isNil "_center") exitwith {}; + +_max = _max max _min; +private _nSteps = 0 max ceil ((_max - _min) / _step); +private _angleStep = 360 / (_nSteps + 1); + +for "_distance" from _min to _max step _step do { + private _i = (_distance - _min) / _step; + private _angle = _i * _angleStep; + private _offset = [_distance * sin _angle, _distance * cos _angle, 0]; + private _position = _center vectorAdd _offset; + private _unit = (createGroup west) createUnit [_unitClass, _position, [], 0, "CAN_COLLIDE"]; + if !(isNil "_initCode") then { + [_unit, _center, _ammoClass] call _initCode; + }; +}; + +// spawn the ammo above the ground falling. necessary for shells, doesn't cause problems for grenades etc. +if (_ammoClass != "") then { + [{ + params ["_ammoClass", "_center"]; + private _position = _center vectorAdd [0, 0, 5]; + private _obj = _ammoClass createVehicle _position; + _obj setVectorDirAndUp [[0, 0, -1], [0, 1, 0]]; + _obj setVelocity [0, 0, -20]; + }, [_ammoClass, _center], _delay] call CBA_fnc_waitAndExecute; +}; diff --git a/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf index f73edf580f..6e6757c486 100644 --- a/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf @@ -17,7 +17,7 @@ params ["_typeOfProjectile"]; -private _damageType = GVAR(damageTypeCache) getVariable _typeOfProjectile; +private _damageType = GVAR(damageTypeCache) get _typeOfProjectile; if (isNil "_damageType") then { if (isText (configFile >> "CfgAmmo" >> _typeOfProjectile >> "ACE_damageType")) then { @@ -28,13 +28,13 @@ if (isNil "_damageType") then { }; // config may define an invalid damage type - if (isNil {GVAR(allDamageTypesData) getVariable _damageType}) then { + if !(_damageType in GVAR(damageTypeDetails)) then { WARNING_2("Damage type [%1] for ammo [%2] not found",_typeOfDamage,_typeOfProjectile); _damageType = "unknown"; }; TRACE_2("getTypeOfDamage caching",_typeOfProjectile,_damageType); - GVAR(damageTypeCache) setVariable [_typeOfProjectile, _damageType]; + GVAR(damageTypeCache) set [_typeOfProjectile, _damageType]; }; _damageType // return diff --git a/addons/medical_damage/functions/fnc_interpolatePoints.sqf b/addons/medical_damage/functions/fnc_interpolatePoints.sqf new file mode 100644 index 0000000000..98f4bcab39 --- /dev/null +++ b/addons/medical_damage/functions/fnc_interpolatePoints.sqf @@ -0,0 +1,41 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Returns the image of a value on a linear piecewise function defined by given points + * Force integer causes decimals to be rounded up or down by chance based on their decimal part, i.e. 2.7 has a 70% chance to return 3 and 30% to return 2 + * + * Arguments: + * 0: Input value + * 1: Function points, must be in descending order by X (input) value + * 2: Whether to force integer + * + * ReturnValue: + * Interpolated result + * + * Example: + * [0.2, [[1,0], [0.5,1], [0,0]]] call ace_medical_damage_fnc_interpolatePoints + * + * Public: No + */ +params ["_input", "_points", ["_randomRound", false]]; + +if (count _points < 1) exitWith { + //TODO: sensible default/error value + 0 +}; +if (count _points == 1) exitWith {_points select 0 select 1}; + +private _output = 0; +private _lower = _points findIf {(_x select 0) < _input}; +if (_lower == 0) exitWith {_points select 0 select 1}; +if (_lower == -1) exitWith {_points select (count _points - 1) select 1}; +private _upper = _points select (_lower-1); +_lower = _points select _lower; +_output = linearConversion [_lower select 0, _upper select 0, _input, _lower select 1, _upper select 1, true]; + +if (_randomRound) then { + // chance to round up is equal to the decimal part + _output = ceil (_output - random 1); +}; + +_output //return diff --git a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf index af932581be..cc76111b0c 100644 --- a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf @@ -20,7 +20,7 @@ private _injuriesConfigRoot = configFile >> "ACE_Medical_Injuries"; // --- parse wounds GVAR(woundClassNames) = []; GVAR(woundClassNamesComplex) = []; // index = 10 * classID + category; [will contain nils] e.g. ["aMinor", "aMed", "aLarge", nil, nil..."bMinor"] -GVAR(woundsData) = []; +GVAR(woundDetails) = createHashMap; private _woundsConfig = _injuriesConfigRoot >> "wounds"; private _classID = 0; @@ -32,53 +32,61 @@ private _classID = 0; private _selections = GET_ARRAY(_entry >> "selections",["All"]); private _bleeding = GET_NUMBER(_entry >> "bleeding",0); private _pain = GET_NUMBER(_entry >> "pain",0); - private _minDamage = GET_NUMBER(_entry >> "minDamage",0); - private _maxDamage = GET_NUMBER(_entry >> "maxDamage",-1); - private _causes = GET_ARRAY(_entry >> "causes",[]); private _causeLimping = GET_NUMBER(_entry >> "causeLimping",0) == 1; private _causeFracture = GET_NUMBER(_entry >> "causeFracture",0) == 1; - if (_causes isNotEqualTo []) then { - GVAR(woundClassNames) pushBack _className; - GVAR(woundsData) pushBack [_classID, _selections, _bleeding, _pain, [_minDamage, _maxDamage], _causes, _className, _causeLimping, _causeFracture]; - { - GVAR(woundClassNamesComplex) set [10 * _classID + _forEachIndex, format ["%1%2", _className, _x]]; - } forEach ["Minor", "Medium", "Large"]; - _classID = _classID + 1; - }; + private _details = [_selections, _bleeding, _pain, _causeLimping, _causeFracture]; + GVAR(woundDetails) set [_className, _details]; + GVAR(woundDetails) set [_classID, _details]; + + GVAR(woundClassNames) pushBack _className; + { + GVAR(woundClassNamesComplex) set [10 * _classID + _forEachIndex, format ["%1%2", _className, _x]]; + } forEach ["Minor", "Medium", "Large"]; + _classID = _classID + 1; } forEach configProperties [_woundsConfig, "isClass _x"]; // --- parse damage types -GVAR(allDamageTypesData) = [] call CBA_fnc_createNamespace; +GVAR(damageTypeDetails) = createHashMap; // cache for ammunition -> damageType -GVAR(damageTypeCache) = [] call CBA_fnc_createNamespace; +GVAR(damageTypeCache) = createHashMap; // minimum lethal damage collection, mapped to damageTypes private _damageTypesConfig = _injuriesConfigRoot >> "damageTypes"; private _thresholdsDefault = getArray (_damageTypesConfig >> "thresholds"); private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionSpecific"); +private _defaultWoundHandlers = []; +if (isClass (_damageTypesConfig >> "woundHandlers")) then { + _defaultWoundHandlers = [_damageTypesConfig >> "woundHandlers"] call FUNC(parseWoundHandlersCfg); + reverse _defaultWoundHandlers; +}; +TRACE_1("Found default wound handlers", count _defaultWoundHandlers); + // Collect all available damage types from the config { private _entry = _x; private _className = configName _entry; - // Check if this type is in the causes of a wound class, if so, we will store the wound types for this damage type - private _woundTypes = []; - { - if (_className in (_x select 5)) then { - _woundTypes pushBack _x; - }; - } forEach GVAR(woundsData); + if (_className == "woundHandlers") then {continue}; + + GVAR(damageTypeCache) set [_className, _className]; + GVAR(damageTypeCache) set ["#"+_className, _className]; private _damageTypeSubClassConfig = _damageTypesConfig >> _className; private _thresholds = GET_ARRAY(_damageTypeSubClassConfig >> "thresholds",_thresholdsDefault); private _selectionSpecific = GET_NUMBER(_damageTypeSubClassConfig >> "selectionSpecific",_selectionSpecificDefault); - - GVAR(allDamageTypesData) setVariable [_className, [_thresholds, _selectionSpecific > 0, _woundTypes]]; - GVAR(damageTypeCache) setVariable [_className, _className]; - GVAR(damageTypeCache) setVariable ["#"+_className, _className]; + + private _woundHandlers = []; + if (isClass (_damageTypeSubClassConfig >> "woundHandlers")) then { + _woundHandlers = [_damageTypeSubClassConfig >> "woundHandlers"] call FUNC(parseWoundHandlersCfg); + reverse _woundHandlers; + TRACE_2("Damage type found wound handlers", _className, count _woundHandlers); + } else { + _woundHandlers = _defaultWoundHandlers; + TRACE_1("Damage type has no wound handlers, using default", _className); + }; /* // extension loading @@ -99,6 +107,26 @@ private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionS // private _extensionRes = "ace_medical" callExtension _extensionArgs; // TRACE_1("",_extensionRes); */ + + // parse config for each wound this damage type can cause + private _damageWoundDetails = []; + { + private _woundType = configName _x; + if (_woundType == "woundHandlers") then {continue}; + if (_woundType in GVAR(woundDetails)) then { + private _weighting = GET_ARRAY(_x >> "weighting",[[ARR_2(0,1)]]); + private _dmgMulti = GET_NUMBER(_x >> "damageMultiplier", 1); + private _bleedMulti = GET_NUMBER(_x >> "bleedingMultiplier", 1); + private _sizeMulti = GET_NUMBER(_x >> "sizeMultiplier", 1); + private _painMulti = GET_NUMBER(_x >> "painMultiplier", 1); + private _fractureMulti = GET_NUMBER(_x >> "fractureMultiplier", 1); + _damageWoundDetails pushBack [_woundType, _weighting, _dmgMulti, _bleedMulti, _sizeMulti, _painMulti, _fractureMulti]; + } else { + WARNING_2("Damage type %1 refers to wound %2, but it doesn't exist: skipping.",_className,configName _x); + }; + } forEach configProperties [_damageTypeSubClassConfig, "isClass _x"]; + + GVAR(damageTypeDetails) set [_className, [_thresholds, _selectionSpecific, _woundHandlers, _damageWoundDetails]]; } forEach configProperties [_damageTypesConfig, "isClass _x"]; /* diff --git a/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf b/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf new file mode 100644 index 0000000000..dedc29efcf --- /dev/null +++ b/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Read a list of wound handler entries from config, accounting for inheritance + * + * Arguments: + * 0: The config class containing the entries + * + * ReturnValue: + * None + * + * Example: + * [configFile >> "ace_medical_injuries" >> "damageTypes"] call ace_medical_damage_fnc_parseWoundHandlersCfg + * + * Public: No + */ +params ["_config"]; + +// read all valid entries from config and store +private _entries = []; +{ + private _entryResult = call compile getText _x; + if !(isNil "_entryResult") then { + _entries pushBack _entryResult; + } +} forEach configProperties [_config, "isText _x", false]; + +private _parent = inheritsFrom _config; +if (isNull _parent) exitWith {_entries}; + +// recursive call for parent +// can't use configProperties for inheritance since it returns entries in the wrong order +([_parent] call FUNC(parseWoundHandlersCfg)) + _entries; diff --git a/addons/medical_damage/functions/fnc_woundReceived.sqf b/addons/medical_damage/functions/fnc_woundReceived.sqf new file mode 100644 index 0000000000..4a16042b31 --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundReceived.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Handle woundReceived event and pass to individual wound handlers + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Shooter + * 3: Ammo classname or damage type + * + * ReturnValue: + * None + * + * Example: + * [_target, [[0.5, "LeftLeg", 1]], _shooter, "B_65x39_Caseless"] call ace_medical_damage_fnc_woundReceived + * + * Public: No + */ +params ["_unit", "_allDamages", "_shooter", "_ammo"]; + +private _typeOfDamage = _ammo call FUNC(getTypeOfDamage); +if (_typeOfDamage in GVAR(damageTypeDetails)) then { + (GVAR(damageTypeDetails) get _typeOfDamage) params ["", "", "_woundHandlers"]; + + private _damageData = [_unit, _allDamages, _typeOfDamage]; + { + _damageData = _damageData call _x; + TRACE_1("Wound handler returned", _damageData); + if !(_damageData isEqualType [] && {(count _damageData) >= 3}) exitWith { + TRACE_1("Return invalid, terminating wound handling", _damageData); + }; + } forEach _woundHandlers; + +}; diff --git a/addons/medical_damage/functions/fnc_woundsHandler.sqf b/addons/medical_damage/functions/fnc_woundsHandler.sqf deleted file mode 100644 index 049437fdf5..0000000000 --- a/addons/medical_damage/functions/fnc_woundsHandler.sqf +++ /dev/null @@ -1,141 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, commy2 - * Handling of the open wounds & injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Body Part - * 2: Amount Of Damage - * 3: Type of the damage done - * - * Return Value: - * None - * - * Example: - * [player, "Body", 0.5, "bullet"] call ace_medical_damage_fnc_woundsHandler - * - * Public: No - */ - -WARNING("this function needs to be updated for changes to woundsHandlerSQF"); - -params ["_unit", "_bodyPart", "_damage", "_typeOfDamage"]; -TRACE_4("start",_unit,_bodyPart,_damage,_typeOfDamage); - -if (_typeOfDamage isEqualTo "") then { - _typeOfDamage = "unknown"; -}; - -if (isNil {GVAR(allDamageTypesData) getVariable _typeOfDamage} ) then { - _typeOfDamage = "unknown"; -}; - -// Administration for open wounds and ids -private _openWounds = GET_OPEN_WOUNDS(_unit); -private _woundID = _unit getVariable [QEGVAR(medical,lastUniqueWoundID), 1]; // Unique wound ids are not used anywhere: ToDo Remove from openWounds array - -TRACE_4("extension call",_bodyPart,_damage,_typeOfDamage,_woundID); -private _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _bodyPart, _damage, _typeOfDamage, _woundID]; -TRACE_1("",_extensionOutput); - -// these are default values and modified by _extensionOutput -(parseSimpleArray _extensionOutput) params ["_woundsCreated", "_painToAdd"]; - -// todo: Make the pain and bleeding calculations part of the extension again -private _woundDamage = _damage / ((count _woundsCreated) max 1); // If the damage creates multiple wounds -private _painLevel = 0; -private _critialDamage = false; -private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; -private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals); -{ - _x params ["", "_woundClassIDToAdd", "_bodyPartNToAdd", "", "_bleeding"]; - - _bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage]; - _bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating - - // The higher the nastiness likelihood the higher the change to get a painful and bloody wound - private _nastinessLikelihood = linearConversion [0, 20, _woundDamage, 0.5, 30, true]; - private _bleedingModifier = 0.25 + 8 * exp ((random [-4.5, -5, -6]) / _nastinessLikelihood); - private _painModifier = 0.05 + 2 * exp (-2 / _nastinessLikelihood); - - TRACE_3("",_nastinessLikelihood,_bleedingModifier,_painModifier); - - _bleeding = _bleeding * _bleedingModifier; - private _pain = (((GVAR(woundsData) select _woundClassIDToAdd) select 3) * _painModifier); - _painLevel = _painLevel + _pain; - - // wound category (minor [0..0.5], medium[0.5..1.0], large[1.0+]) - private _category = floor linearConversion [0, 1, _bleedingModifier, 0, 2, true]; - - _x set [4, _bleeding]; - _x set [5, _woundDamage]; - _x set [6, _category]; - - - if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { - _critialDamage = true; - }; -#ifdef DEBUG_MODE_FULL - systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; -#endif - - // Emulate damage to vital organs - switch (true) do { - // Fatal damage to the head is guaranteed death - case (_bodyPartNToAdd == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}): { - TRACE_1("lethal headshot",_woundDamage toFixed 2); - [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; - }; - // Fatal damage to torso has various results based on organ hit - case (_bodyPartNToAdd == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD}): { - // Heart shot is lethal - if (random 1 < HEART_HIT_CHANCE) then { - TRACE_1("lethal heartshot",_woundDamage toFixed 2); - [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; - }; - }; - }; - - // todo `forceWalk` based on leg damage - private _causeLimping = (GVAR(woundsData) select _woundClassIDToAdd) select 7; - if (_causeLimping == 1 && {_woundDamage > LIMPING_DAMAGE_THRESHOLD} && {_bodyPartNToAdd > 3}) then { - [_unit, true] call EFUNC(medical_engine,setLimping); - }; - - // if possible merge into existing wounds - private _createNewWound = true; - { - _x params ["", "_classID", "_bodyPartN", "_oldAmountOf", "_oldBleeding", "_oldDamage", "_oldCategory"]; - if (_woundClassIDToAdd == _classID && {_bodyPartNToAdd == _bodyPartN && {(_woundDamage < PENETRATION_THRESHOLD) isEqualTo (_oldDamage < PENETRATION_THRESHOLD)}}) then { - if (_oldCategory == _category) exitWith { - private _newAmountOf = _oldAmountOf + 1; - _x set [3, _newAmountOf]; - private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; - _x set [4, _newBleeding]; - private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; - _x set [5, _newDamage]; - _createNewWound = false; - }; - }; - } forEach _openWounds; - - if (_createNewWound) then { - _openWounds pushBack _x; - }; -} forEach _woundsCreated; - -_unit setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; -_unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; - -[_unit] call EFUNC(medical_status,updateWoundBloodLoss); - -_bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals); - -[QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent; - -if (_critialDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { - [_unit] call FUNC(handleIncapacitation); -}; - -TRACE_5("exit",_unit,_painLevel,GET_PAIN(_unit),GET_OPEN_WOUNDS(_unit),_woundsCreated); diff --git a/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf new file mode 100644 index 0000000000..e0b0a2a32b --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf @@ -0,0 +1,214 @@ +#include "script_component.hpp" +/* + * Author: Glowbal, commy2 + * Handling of the open wounds & injuries upon the handleDamage eventhandler. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, [[0.5, "Body", 1]], "bullet"] call ace_medical_damage_fnc_woundsHandlerBase + * + * Public: No + */ + +params ["_unit", "_allDamages", "_typeOfDamage"]; +TRACE_3("woundsHandlerBase",_unit,_allDamages,_typeOfDamage); + + +if !(_typeOfDamage in GVAR(damageTypeDetails)) then { + WARNING_1("damage type not found",_typeOfDamage); + _typeOfDamage = "unknown"; +}; + +GVAR(damageTypeDetails) get _typeOfDamage params ["_thresholds", "_selectionSpecific", "", "_damageWoundDetails"]; + +// Administration for open wounds and ids +private _openWounds = GET_OPEN_WOUNDS(_unit); + +private _createdWounds = false; +private _updateDamageEffects = false; +private _painLevel = 0; +private _criticalDamage = false; +private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; +private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals); + +// process wounds separately for each body part hit +{ // forEach _allDamages + _x params ["_damage", "_bodyPart"]; + + // silently ignore structural damage + if (_bodyPart == "#structural") then {continue}; + + // Convert the selectionName to a number and ensure it is a valid selection. + private _bodyPartNToAdd = ALL_BODY_PARTS find toLower _bodyPart; + if (_bodyPartNToAdd < 0) then { + ERROR_1("invalid body part %1",_bodyPart); + continue + }; + + // determine how many wounds to create + private _nWounds = [_damage, _thresholds, true] call FUNC(interpolatePoints); + if (_nWounds < 1) then { + TRACE_2("Damage created zero wounds",_damage,_typeOfDamage); + continue + }; + private _dmgPerWound = _damage/_nWounds; + + // find the available injuries for this damage type and damage amount + private _weightedWoundTypes = []; + { + private _weighting = _x select 1; + private _woundWeight = [_dmgPerWound, _weighting] call FUNC(interpolatePoints); + _weightedWoundTypes pushBack _x; + _weightedWoundTypes pushBack _woundWeight; + } forEach _damageWoundDetails; + + if (_weightedWoundTypes isEqualTo []) then { + TRACE_2("No valid wounds",_damage,_typeOfDamage); + continue + }; + + for "_i" from 1 to _nWounds do { + + // Select the injury we are going to add + selectRandomWeighted _weightedWoundTypes params ["_woundTypeToAdd", "", "_dmgMultiplier", "_bleedMultiplier", "_sizeMultiplier", "_painMultiplier", "_fractureMultiplier"]; + if (isNil "_woundTypeToAdd") then { + WARNING_4("No valid wound types",_damage,_dmgPerWound,_typeOfDamage,_bodyPart); + continue + }; + GVAR(woundDetails) get _woundTypeToAdd params ["","_injuryBleedingRate","_injuryPain","_causeLimping","_causeFracture"]; + private _woundClassIDToAdd = GVAR(woundClassNames) find _woundTypeToAdd; + + // Add a bit of random variance to wounds + private _woundDamage = _dmgPerWound * _dmgMultiplier * random [0.9, 1, 1.1]; + + _bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage]; + _bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating + + // Anything above this value is guaranteed worst wound possible + private _worstDamage = 2; + + #define LARGE_WOUND_THRESHOLD 0.5 + + // Config specifies bleeding and pain for worst possible wound + // Worse wound correlates to higher damage, damage is not capped at 1 + private _woundSize = linearConversion [0.1, _worstDamage, _woundDamage * _sizeMultiplier, LARGE_WOUND_THRESHOLD^3, 1, true]; + + private _pain = _woundSize * _painMultiplier * _injuryPain; + _painLevel = _painLevel + _pain; + + private _bleeding = _woundSize * _bleedMultiplier * _injuryBleedingRate; + + // large wounds are > LARGE_WOUND_THRESHOLD + // medium is > LARGE_WOUND_THRESHOLD^2 + // minor is > LARGE_WOUND_THRESHOLD^3 + private _category = 0 max (2 - floor (ln _woundSize / ln LARGE_WOUND_THRESHOLD)) min 2; + + private _classComplex = 10 * _woundClassIDToAdd + _category; + + // Create a new injury. Format [0:classComplex, 1:bodypart, 2:amountOf, 3:bleedingRate, 4:woundDamage] + private _injury = [_classComplex, _bodyPartNToAdd, 1, _bleeding, _woundDamage]; + + if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { + _criticalDamage = true; + }; + if ([_unit, _bodyPartNToAdd, _bodyPartDamage, _woundDamage] call FUNC(determineIfFatal)) then { + if (!isPlayer _unit || {random 1 < EGVAR(medical,deathChance)}) then { + TRACE_1("determineIfFatal returned true",_woundDamage); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; + }; + + #ifdef DEBUG_MODE_FULL + systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; + #endif + + switch (true) do { + case ( + _causeFracture + && {EGVAR(medical,fractures) > 0} + && {_bodyPartNToAdd > 1} + && {_woundDamage > FRACTURE_DAMAGE_THRESHOLD} + && {random 1 < (_fractureMultiplier * EGVAR(medical,fractureChance))} + ): { + private _fractures = GET_FRACTURES(_unit); + _fractures set [_bodyPartNToAdd, 1]; + _unit setVariable [VAR_FRACTURES, _fractures, true]; + + [QEGVAR(medical,fracture), [_unit, _bodyPartNToAdd]] call CBA_fnc_localEvent; + TRACE_1("Limb fracture",_bodyPartNToAdd); + + _updateDamageEffects = true; + }; + case ( + _causeLimping + && {EGVAR(medical,limping) > 0} + && {_bodyPartNToAdd > 3} + && {_woundDamage > LIMPING_DAMAGE_THRESHOLD} + ): { + _updateDamageEffects = true; + }; + }; + + // if possible merge into existing wounds + private _createNewWound = true; + { + _x params ["_classID", "_bodyPartN", "_oldAmountOf", "_oldBleeding", "_oldDamage"]; + if ( + (_classComplex == _classID) && + {_bodyPartNToAdd == _bodyPartN} && + {(_bodyPartNToAdd != 1) || {(_woundDamage < PENETRATION_THRESHOLD) isEqualTo (_oldDamage < PENETRATION_THRESHOLD)}} && // penetrating body damage is handled differently + {(_bodyPartNToAdd > 3) || {!_causeLimping} || {(_woundDamage <= LIMPING_DAMAGE_THRESHOLD) isEqualTo (_oldDamage <= LIMPING_DAMAGE_THRESHOLD)}} // ensure limping damage is stacked correctly + ) exitWith { + TRACE_2("merging with existing wound",_injury,_x); + private _newAmountOf = _oldAmountOf + 1; + _x set [2, _newAmountOf]; + private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; + _x set [3, _newBleeding]; + private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; + _x set [4, _newDamage]; + _createNewWound = false; + }; + } forEach _openWounds; + + if (_createNewWound) then { + TRACE_1("adding new wound",_injury); + _openWounds pushBack _injury; + }; + _createdWounds = true; + }; + + // selection-specific damage only hits the first part + if (_selectionSpecific > 0) then { + break; + }; +} forEach _allDamages; + +if (_updateDamageEffects) then { + [_unit] call EFUNC(medical_engine,updateDamageEffects); +}; + +if (_createdWounds) then { + _unit setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; + _unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; + + [_unit] call EFUNC(medical_status,updateWoundBloodLoss); + + _bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals); + + [QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent; + + if (_criticalDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { + [_unit] call FUNC(handleIncapacitation); + }; + + TRACE_4("exit",_unit,_painLevel,GET_PAIN(_unit),GET_OPEN_WOUNDS(_unit)); +}; + +[] //return, no further damage handling diff --git a/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf new file mode 100644 index 0000000000..c6ca70f768 --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf @@ -0,0 +1,51 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Custom wound handler for burns. Stores up small damage events until there's enough to create a wound. + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, [[0.5, "Body", 0.5]], "burning"] call ace_medical_damage_fnc_woundsHandlerBurning + * + * Public: No + */ +params ["_unit", "_allDamages", "_typeOfDamage"]; +TRACE_3("woundsHandlerBurning",_unit,_allDamages,_typeOfDamage); + +#define FIRE_DAMAGE_INTERVAL 1 + +{ + _x params ["_damage", "_bodyPart"]; + + if (_bodyPart != "#structural") then { + continue + }; + + private _storedDamage = _unit getVariable [QGVAR(storedBurnDamage), 0]; + private _newDamage = _storedDamage + _damage; + + // schedule a task to convert stored damage to wounds after a delay + // the task resets stored damage to zero, so if it isn't currently zero that means there is a task already waiting + if (_storedDamage == 0 && _newDamage > 0) then { + [{ + params ["_unit"]; + + _bodyPart = selectRandom ["body", "leftleg", "rightleg"]; + private _storedDamage = _unit getVariable [QGVAR(storedBurnDamage), 0]; + [QEGVAR(medical,woundReceived), [_unit, [[_storedDamage, _bodyPart, _storedDamage]], _unit, "burn"]] call CBA_fnc_localEvent; + _unit setVariable [QGVAR(storedBurnDamage), 0, true]; + }, + [_unit], FIRE_DAMAGE_INTERVAL] call CBA_fnc_waitAndExecute; + }; + + _unit setVariable [QGVAR(storedBurnDamage), _newDamage]; +} forEach _allDamages; + +[] //return, no further damage handling for this event diff --git a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf deleted file mode 100644 index b0de1f6e4a..0000000000 --- a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf +++ /dev/null @@ -1,208 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Glowbal, commy2 - * Handling of the open wounds & injuries upon the handleDamage eventhandler. - * - * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Body Part - * 2: Amount Of Damage - * 3: Type of the damage done - * 4: Weighted array of damaged selections - * - * Return Value: - * None - * - * Example: - * [player, "Body", 0.5, "bullet", [1, 1]] call ace_medical_damage_fnc_woundsHandlerSQF - * - * Public: No - */ - -params ["_unit", "_bodyPart", "_damage", "_typeOfDamage", "_damageSelectionArray"]; -TRACE_5("woundsHandlerSQF",_unit,_bodyPart,_damage,_typeOfDamage,_damageSelectionArray); - -// Convert the selectionName to a number and ensure it is a valid selection. -private _bodyPartN = ALL_BODY_PARTS find toLower _bodyPart; -if (_bodyPartN < 0) exitWith { ERROR_1("invalid body part %1",_bodyPart); }; - -if ((_typeOfDamage isEqualTo "") || {isNil {GVAR(allDamageTypesData) getVariable _typeOfDamage}}) then { - WARNING_1("damage type [%1] not found",_typeOfDamage); - _typeOfDamage = "unknown"; -}; - -// Get the damage type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes] -// WoundTypes are the available wounds for this damage type. Format [[classID, selections, bleedingRate, pain], ..] -private _damageTypeInfo = [GVAR(allDamageTypesData) getVariable _typeOfDamage] param [0, [[], false, []]]; -_damageTypeInfo params ["_thresholds", "_isSelectionSpecific", "_woundTypes"]; - -// find the available injuries for this damage type and damage amount -private _highestPossibleSpot = -1; -private _highestPossibleDamage = -1; -private _allPossibleInjuries = []; - -{ - _x params ["", "_selections", "", "", "_damageExtrema"]; - _damageExtrema params ["_minDamage", "_maxDamage"]; - - // Check if the damage is higher as the min damage for the specific injury - if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { - // Check if the injury can be applied to the given selection name - // if ("All" in _selections || {_bodyPart in _selections}) then { // @todo, this is case sensitive! [we have no injuries that use this, disabled for now] - - // Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries - if (_minDamage > _highestPossibleDamage) then { - _highestPossibleSpot = _forEachIndex; - _highestPossibleDamage = _minDamage; - }; - - // Store the valid possible injury for the damage type, damage amount and selection - _allPossibleInjuries pushBack _x; - // }; - }; -} forEach _woundTypes; - -// No possible wounds available for this damage type or damage amount. -if (_highestPossibleSpot < 0) exitWith { TRACE_2("no wounds possible",_damage,_highestPossibleSpot); }; - -// Administration for open wounds and ids -private _openWounds = GET_OPEN_WOUNDS(_unit); - -private _updateDamageEffects = false; -private _painLevel = 0; -private _critialDamage = false; -private _bodyPartDamage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; -private _bodyPartVisParams = [_unit, false, false, false, false]; // params array for EFUNC(medical_engine,updateBodyPartVisuals); - -{ - _x params ["_thresholdMinDam", "_thresholdWoundCount"]; - if (_damage > _thresholdMinDam) exitWith { - private _woundDamage = _damage / (_thresholdWoundCount max 1); // If the damage creates multiple wounds - for "_i" from 1 to _thresholdWoundCount do { - // Find the injury we are going to add. Format [ classID, allowedSelections, bleedingRate, injuryPain] - private _oldInjury = if (random 1 < 0.15) then { - _woundTypes select _highestPossibleSpot - } else { - selectRandom _allPossibleInjuries - }; - - _oldInjury params ["_woundClassIDToAdd", "", "_injuryBleedingRate", "_injuryPain", "", "", "", "_causeLimping", "_causeFracture"]; - - private _bodyPartNToAdd = if (_isSelectionSpecific) then {_bodyPartN} else {selectRandomWeighted _damageSelectionArray}; - - _bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage]; - _bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating - - - // Damage to limbs/head is scaled higher than torso by engine - // Anything above this value is guaranteed worst wound possible - private _worstDamage = [2, 1, 4, 4, 4, 4] select _bodyPartNToAdd; - - // More wounds means more likely to get nasty wound - private _countModifier = 1 + random(_i - 1); - - // Config specifies bleeding and pain for worst possible wound - // Worse wound correlates to higher damage, damage is not capped at 1 - private _bleedModifier = linearConversion [0.1, _worstDamage, _woundDamage * _countModifier, 0.25, 1, true]; - private _painModifier = (_bleedModifier * random [0.7, 1, 1.3]) min 1; // Pain isn't directly scaled to bleeding - - private _bleeding = _injuryBleedingRate * _bleedModifier; - private _pain = _injuryPain * _painModifier; - _painLevel = _painLevel + _pain; - - // wound category (minor [0.25-0.5], medium [0.5-0.75], large [0.75+]) - private _category = floor linearConversion [0.25, 0.75, _bleedModifier, 0, 2, true]; - - private _classComplex = 10 * _woundClassIDToAdd + _category; - - // Create a new injury. Format [0:classComplex, 1:bodypart, 2:amountOf, 3:bleedingRate, 4:woundDamage] - private _injury = [_classComplex, _bodyPartNToAdd, 1, _bleeding, _woundDamage]; - - if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { - _critialDamage = true; - }; - if ([_unit, _bodyPartNToAdd, _bodyPartDamage, _woundDamage] call FUNC(determineIfFatal)) then { - if (!isPlayer _unit || {random 1 < EGVAR(medical,deathChance)}) then { - TRACE_1("determineIfFatal returned true",_woundDamage); - [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; - }; - }; - - #ifdef DEBUG_MODE_FULL - systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; - #endif - - switch (true) do { - case ( - _causeFracture - && {EGVAR(medical,fractures) > 0} - && {_bodyPartNToAdd > 1} - && {_woundDamage > FRACTURE_DAMAGE_THRESHOLD} - && {random 1 < EGVAR(medical,fractureChance)} - ): { - private _fractures = GET_FRACTURES(_unit); - _fractures set [_bodyPartNToAdd, 1]; - _unit setVariable [VAR_FRACTURES, _fractures, true]; - - [QEGVAR(medical,fracture), [_unit, _bodyPartNToAdd]] call CBA_fnc_localEvent; - TRACE_1("Limb fracture",_bodyPartNToAdd); - - _updateDamageEffects = true; - }; - case ( - _causeLimping - && {EGVAR(medical,limping) > 0} - && {_bodyPartNToAdd > 3} - && {_woundDamage > LIMPING_DAMAGE_THRESHOLD} - ): { - _updateDamageEffects = true; - }; - }; - - // if possible merge into existing wounds - private _createNewWound = true; - { - _x params ["_classID", "_bodyPartN", "_oldAmountOf", "_oldBleeding", "_oldDamage"]; - if ( - (_classComplex == _classID) && - {_bodyPartNToAdd == _bodyPartN} && - {(_bodyPartNToAdd != 1) || {(_woundDamage < PENETRATION_THRESHOLD) isEqualTo (_oldDamage < PENETRATION_THRESHOLD)}} && // penetrating body damage is handled differently - {(_bodyPartNToAdd > 3) || {!_causeLimping} || {(_woundDamage <= LIMPING_DAMAGE_THRESHOLD) isEqualTo (_oldDamage <= LIMPING_DAMAGE_THRESHOLD)}} // ensure limping damage is stacked correctly - ) exitWith { - TRACE_2("merging with existing wound",_injury,_x); - private _newAmountOf = _oldAmountOf + 1; - _x set [2, _newAmountOf]; - private _newBleeding = (_oldAmountOf * _oldBleeding + _bleeding) / _newAmountOf; - _x set [3, _newBleeding]; - private _newDamage = (_oldAmountOf * _oldDamage + _woundDamage) / _newAmountOf; - _x set [4, _newDamage]; - _createNewWound = false; - }; - } forEach _openWounds; - - if (_createNewWound) then { - TRACE_1("adding new wound",_injury); - _openWounds pushBack _injury; - }; - }; - }; -} forEach _thresholds; - -if (_updateDamageEffects) then { - [_unit] call EFUNC(medical_engine,updateDamageEffects); -}; - -_unit setVariable [VAR_OPEN_WOUNDS, _openWounds, true]; -_unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true]; - -[_unit] call EFUNC(medical_status,updateWoundBloodLoss); - -_bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals); - -[QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent; - -if (_critialDamage || {_painLevel > PAIN_UNCONSCIOUS}) then { - [_unit] call FUNC(handleIncapacitation); -}; - -TRACE_4("exit",_unit,_painLevel,GET_PAIN(_unit),GET_OPEN_WOUNDS(_unit)); diff --git a/addons/medical_damage/functions/fnc_woundsHandlerVehiclecrash.sqf b/addons/medical_damage/functions/fnc_woundsHandlerVehiclecrash.sqf new file mode 100644 index 0000000000..6417fd2034 --- /dev/null +++ b/addons/medical_damage/functions/fnc_woundsHandlerVehiclecrash.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: Pterolatypus + * Custom wound handler for vehicle crashes, sends damage to a random hitpoint + * + * Arguments: + * 0: Unit That Was Hit + * 1: Damage done to each body part + * 2: Type of the damage done + * + * Return Value: + * None + * + * Example: + * [player, [[0.5, "#structural", 1.5]], "vehicleCrash"] call ace_medical_damage_fnc_woundsHandlerVehicleCrash + * + * Public: No + */ +params ["_unit", "_allDamages", "_typeOfDamage"]; +TRACE_3("woundsHandlerVehicleCrash",_unit,_allDamages,_typeOfDamage); + +// randomise all hit selections +private _newDamages = _allDamages apply { + [_x select 0, selectRandom ALL_BODY_PARTS, _x select 2]; +}; + +TRACE_1("Vehicle crash handled, passing damage", _newDamages); +[_unit, _newDamages, _typeOfDamage] //return diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 5b7eb96f67..26485816da 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -8,11 +8,13 @@ Порог критического урона игрока Limite de Dano Crítico do Jogador 玩家重擊承受量 + 玩家临界伤害阈值 Soglia danni critici del giocatore Kritická míra poškození pro hráče Próg Obrażeń Krytycznych Gracza Límite de daño crítico al jugador Schwelle für kritischen Spielerschaden + 플레이어 치명상 한계점 Sets the amount of damage a player can receive before going unconscious (and dying if "Sum of Trauma" is enabled). @@ -21,12 +23,14 @@ Устанавливает количество урона, которое может получить игрок, прежде чем потеряет сознание. Define a quantidade de dano que um jogador pode receber antes de ficar inconsciente. 設定玩家在無意識前能承受多少傷害。 + 设置玩家在昏迷前可以承受的伤害量(如果启用了“创伤总和”,则会死亡)。 Imposta la quantità di danno che un giocatore può ricevere prima di perdere conoscenza. Nastavuje kolik poškození hráč může obdržet než upadne do bezvědomí. Definiuje ilość obrażeń jaką może przyjąć gracz przed straceniem przytomności (oraz śmierci gdy "Suma urazów" jest włączona). Fijar la cantidad de daño que un jugador puede recivir antes de caer inconsciente Legt die Höhe des Schadens fest, den ein Spieler erhalten kann, bevor er ohnmächtig wird (oder stirbt, wenn "Summe aller Traumata" aktiviert ist). Bir oyuncunun bayılmadan önce alabileceği hasar miktarını belirler. + 플레이어가 치명상으로 인해 기절까지 가기 전의 한계점을 정합니다. ("피해량 중첩"이 켜져있으면 죽기도 합니다) AI Critical Damage Threshold @@ -35,11 +39,13 @@ Порог критического урона AI Limite de Dano Crítico da IA AI重擊承受量 + AI 临界伤害阈值 Soglia dei danni critici dell AI Kritická míra poškození pro AI Próg Obrażeń Krytycznych AI Límite de daño crítico de la IA Schwelle für kritischen KI-Schaden + 인공지능 치명상 한계점 Sets the amount of damage an AI unit can receive before going unconscious (or dying when "Sum of Trauma" is enabled). @@ -48,11 +54,13 @@ Устанавливает количество урона, которое может получить ИИ, прежде чем потеряет сознание. Define a quantidade de dano que uma IA pode receber antes de ficar inconsciente. 設定AI在無意識之前能承受多少傷害 + 设置 AI 在昏迷前可以承受的伤害量(如果启用了“创伤总和”,则会死亡)。 Imposta la quantità di danno che un'unità AI può ricevere prima di perdere conoscenza. Nastavuje kolik poškození AI může obdržet než upadne do bezvědomí. Definiuje ilość obrażeń jaką może przyjąć AI przed straceniem przytomności (oraz śmierci gdy "Suma urazów" jest włączona). Fijar la cantidad de daño que la IA puede recivir antes de caer inconsciente Legt die Höhe des Schadens fest, den eine KI-Einheit erhalten kann, bevor sie ohnmächtig wird (oder stirbt, wenn "Summe aller Traumata" aktiviert ist). + 인공지능이 치명상으로 인해 기절까지 가기 전의 한계점을 정합니다. ("피해량 중첩"이 켜져있으면 죽기도 합니다) Scrape @@ -134,7 +142,7 @@ Avulsão Avulze 剥離傷 - 떨어져나감 + 찢김 撕除傷 Kopma 撕脱伤 @@ -151,7 +159,7 @@ Avulsão leve Malá avulze 小さな剥離傷 - 조금 떨어져나감 + 조금 찢김 小撕除傷 Küçük Kopuk 轻度撕脱伤 @@ -168,7 +176,7 @@ Avulsão média Střední avulze 中くらいの剥離傷 - 꽤 떨어져나감 + 꽤 찢김 中度撕除傷 Orta Kopuk 中度撕脱伤 @@ -185,7 +193,7 @@ Avulsão grave Velká avulze 大きな剥離傷 - 크게 떨어져나감 + 크게 찢김 嚴重撕除傷 Büyük Kopuk 重度撕脱伤 @@ -259,7 +267,7 @@ 重度挫伤 - Crushed tissue + Crushed Tissue Quetschverletzung Tessuto Schiacciato Компрессионная травма @@ -276,7 +284,7 @@ 挤压伤 - Minor crushed tissue + Minor Crushed Tissue Kleine Quetschverletzung Minimo Tessuto Schiacciato Слабая компрессионная травма @@ -293,7 +301,7 @@ 轻度挤压伤 - Medium crushed tissue + Medium Crushed Tissue Mittlere Quetschverletzung Medio Tessuto Schiacciato Умеренная компрессионная травма @@ -310,7 +318,7 @@ 中度挤压伤 - Large crushed tissue + Large Crushed Tissue Große Quetschverletzung Alto Tessuto Schiacciato Сильная компрессионная травма @@ -406,10 +414,10 @@ Ruptura Tržná rána 裂傷 - 찢어짐 + 열상 撕裂傷 Yırtık - 裂伤 + 撕裂伤 Small Tear @@ -423,10 +431,10 @@ Ruptura leve Malá tržná rána 小さな裂傷 - 조금 찢어짐 + 조그마한 열상 小撕裂傷 Küçük Yırtık - 轻度裂伤 + 轻度撕裂伤 Medium Tear @@ -440,10 +448,10 @@ Ruptura média Střední tržná rána 中くらいの裂傷 - 꽤 찢어짐 + 꽤 큰 열상 中度撕裂傷 Orta Yırtık - 中度裂伤 + 中度撕裂伤 Large Tear @@ -457,9 +465,9 @@ Ruptura grave Velká tržná rána 大きな裂傷 - 심하게 찢어짐 + 심한 열상 嚴重撕裂傷 - 重度裂伤 + 重度撕裂伤 Büyük Yırtık @@ -603,6 +611,7 @@ Причина смертельного урона 致命傷の原因 致命傷來源 + 致命伤来源 Cause de blessure mortelle Fonte del danno fatale Zdroj smrtelné škody @@ -611,12 +620,14 @@ Origen de daño fatal Ölümcül Hasar Kaynağı Quelle für tödlichen Schaden + 치명상의 원인 Determines what damage can be fatal Определяет какой урон будет смертельным 致命傷となるダメージの種類を決定します。 決定何種傷害為致命 + 确定哪些伤害可能是致命的 Determina quali danni possono essere fatali Détermine le type de blessures pouvant être fatales. Nastavuje jaké poškození může být smrtelné @@ -625,12 +636,14 @@ Determina qué daño puede ser fatal Hangi hasarın ölümcül olabileceğini belirler Bestimmt welcher Schaden tödlich ist. + 어떤 피해가 치명상으로 작용할 지 정합니다 Only large hits to vital organs Только серьезные попадания в жизненно важные органы 重要器官に大きなダメージを受けた時のみ 只有重要器官之重傷 + 只有重要器官受到重创 Grosses blessures sur organes vitaux Solo grandi colpi agli organi vitali Pouze zásahy do životně důležitých orgánů @@ -639,12 +652,14 @@ Solo grandes heridas en organos vitales Sadece hayati organlara büyük vuruşlar Nur schwere Treffer an lebenswichtigen Organen + 주요 장기에 큰 피해를 입음 Sum of trauma Совокупность травмы 外傷の数 外部創傷累計 + 创伤总和 Somme des traumatismes Somma dei traumi Celkové množství úrazů @@ -652,12 +667,14 @@ Soma do trauma Suma de traumatismos Summe aller Traumata + 피해량 중첩 Either Оба 両方 兩者都是 + 二者之一 Les deux o Kterýkoliv ze dvou @@ -666,6 +683,7 @@ Ambos Ikisinden biri Beide + 둘 다 Thermal Burn @@ -674,6 +692,8 @@ Термический ожог Thermische Verbrennung Oparzenie + 热灼伤 + 화상 Minor Thermal Burn @@ -682,6 +702,8 @@ Незначительный термический ожог Leichte thermische Verbrennung Pomniejsze oparzenie + 轻微热灼伤 + 작은 화상 Medium Thermal Burn @@ -690,6 +712,8 @@ Средний термический ожог Mittlere thermische Verbrennung Średnie oparzenie + 中度热灼伤 + 꽤 큰 화상 Major Thermal Burn @@ -698,6 +722,8 @@ Сильный термический ожог Schwere thermische Verbrennung Duże oparzenie + 重度热灼伤 + 심각한 화상 Unit Damage Threshold @@ -709,6 +735,8 @@ Próg obrażeń jednostki Birim Hasar Katsayısı Umbral de daño de unidad + 单位伤害阈值 + 유닛 피해 한계점 Sets the amount of damage a unit can receive before going unconscious. (0 for mission default) @@ -720,6 +748,8 @@ Ustawia próg obrażeń jakie może otrzymać jednostka przed utratą przytomności. (0 jako ustawienie domyślne misji) Bilinçsiz duruma geçmeden önce bir birimin alabileceği hasar miktarını ayarlar. (Görev varsayılanı için 0) Determina la cantidad de daño que puede recibir una unidad antes de quedar inconsciente (0 para predeterminado de misión) + 设定一个单位在昏迷前所能承受的伤害量。(任务默认为0) + 이 유닛이 얼마나 많은 피해를 받아야 기절할 지 정합니다. (0은 미션 기본 설정을 사용합니다) Pain Unconscious Chance @@ -729,6 +759,8 @@ Probabilidad de inconsciencia por dolor Douleur - Chance d'évanouissement Chance für Bewusslosigkeit durch Schmerz + 疼痛昏厥概率 + 고통으로 인한 기절 확률 The probability of a person falling unconscious when their pain is above the tolerance threshold upon receiving damage. @@ -738,6 +770,8 @@ La probabilidad de que una persona caiga inconsciente cuando su dolor está por encima del umbral al haber recibido daño. La probabilité pour qu'une personne perde connaissance lorsque la douleur ressentie est supérieure à son seuil de tolérance. Die Wahrscheinlichkeit, dass eine Person bewusstlos wird, wenn ihre Schmerzen bei einer Verwundung über der Toleranzschwelle liegen. + 当一个人的疼痛超过承受能力的极限时,他陷入昏迷的概率。 + 고통 한계점을 넘을 시 기절하는 확률을 정합니다. Fatal Injury Death Chance @@ -747,6 +781,8 @@ Szana na śmierć przy śmiertelej ranie 致命傷による死亡確率 Tödliche Verletzung - Wahrscheinlichkeit des Todes + 致命伤死亡概率 + 치명상 사망 확률 The chance of dying to a fatal injury. @@ -756,6 +792,8 @@ Szansa na śmierć po otrzymaniu śmiertelnej rany. 致命傷による死亡確率を設定します。 Die Wahrscheinlichkeit, an einer eigentlich tödlichen Verletzung zu sterben. + 死于致命伤的概率。 + 치명상으로 인해 사망할 확률을 정합니다. diff --git a/addons/medical_engine/CfgExtendedAnimation.hpp b/addons/medical_engine/CfgExtendedAnimation.hpp index 596418bb7b..03fde9fee4 100644 --- a/addons/medical_engine/CfgExtendedAnimation.hpp +++ b/addons/medical_engine/CfgExtendedAnimation.hpp @@ -1,9 +1,9 @@ class CfgExtendedAnimation { class Revive { - left = QGVAR(faceLeft_unconscious); - right = QGVAR(faceRight_unconscious); - front = QGVAR(faceDown_unconscious); - back = QGVAR(faceUp_unconscious); + left = QUNCON_ANIM(faceLeft); + right = QUNCON_ANIM(faceRight); + front = QUNCON_ANIM(faceDown); + back = QUNCON_ANIM(faceUp); }; }; diff --git a/addons/medical_engine/CfgMoves.hpp b/addons/medical_engine/CfgMoves.hpp index 0bf6ac4b56..7c99321887 100644 --- a/addons/medical_engine/CfgMoves.hpp +++ b/addons/medical_engine/CfgMoves.hpp @@ -8,75 +8,86 @@ class CfgMovesMaleSdr: CfgMovesBasic { weaponIK = 0; }; - class Unconscious; class DeadState; - class ace_unconscious_1: DeadState { + class UNCON_ANIM(1): DeadState { file = QPATHTO_T(data\ace_unconscious_1.rtm); }; - class ace_unconscious_2: ace_unconscious_1 { + + class UNCON_ANIM(2): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_2.rtm); }; - class ace_unconscious_3: ace_unconscious_1 { + + class UNCON_ANIM(3): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_3.rtm); }; - class ace_unconscious_4: ace_unconscious_1 { + + class UNCON_ANIM(4): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_4.rtm); }; - class ace_unconscious_5: ace_unconscious_1 { + + class UNCON_ANIM(5): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_5.rtm); }; - class ace_unconscious_6: ace_unconscious_1 { + + class UNCON_ANIM(6): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_6.rtm); }; - class ace_unconscious_7: ace_unconscious_1 { + + class UNCON_ANIM(7): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_7.rtm); }; - class ace_unconscious_8: ace_unconscious_1 { + + class UNCON_ANIM(8): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_8.rtm); }; - class ace_unconscious_1_1: ace_unconscious_1 { + + class UNCON_ANIM(1_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_1_1.rtm); }; - class ace_unconscious_2_1: ace_unconscious_1 { + + class UNCON_ANIM(2_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_2_1.rtm); }; - class ace_unconscious_3_1: ace_unconscious_1 { + + class UNCON_ANIM(3_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_3_1.rtm); }; - class ace_unconscious_4_1: ace_unconscious_1 { + + class UNCON_ANIM(4_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_4_1.rtm); }; - class ace_unconscious_5_1: ace_unconscious_1 { + + class UNCON_ANIM(5_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_5_1.rtm); }; - class ace_unconscious_6_1: ace_unconscious_1 { + + class UNCON_ANIM(6_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_6_1.rtm); }; - class ace_unconscious_7_1: ace_unconscious_1 { + + class UNCON_ANIM(7_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_7_1.rtm); }; - class ace_unconscious_8_1: ace_unconscious_1 { + + class UNCON_ANIM(8_1): UNCON_ANIM(1) { file = QPATHTO_T(data\ace_unconscious_8_1.rtm); }; + /* added for the "ace_unc" part */ class KIA_passenger_boat_holdleft; - class ace_unconscious_9: KIA_passenger_boat_holdleft { - }; + class UNCON_ANIM(9): KIA_passenger_boat_holdleft {}; + class KIA_driver_boat01; - class ace_unconscious_10: KIA_driver_boat01 { - }; + class UNCON_ANIM(10): KIA_driver_boat01 {}; - class GVAR(faceDown_unconscious): Unconscious { - }; + class Unconscious; + class UNCON_ANIM(faceDown): Unconscious {}; - class GVAR(faceLeft_unconscious): Unconscious { - }; + class UNCON_ANIM(faceLeft): Unconscious {}; - class GVAR(faceRight_unconscious): Unconscious { - }; + class UNCON_ANIM(faceRight): Unconscious {}; - class GVAR(faceUp_unconscious): Unconscious { - }; + class UNCON_ANIM(faceUp): Unconscious {}; class AmovPpneMstpSnonWnonDnon; class ACE_UnconsciousOutProne: AmovPpneMstpSnonWnonDnon { diff --git a/addons/medical_engine/CfgVehicles.hpp b/addons/medical_engine/CfgVehicles.hpp index b17ca15a98..ac744031e3 100644 --- a/addons/medical_engine/CfgVehicles.hpp +++ b/addons/medical_engine/CfgVehicles.hpp @@ -4,7 +4,9 @@ class CfgVehicles { class CAManBase: Man { // General class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -12,12 +14,16 @@ class CfgVehicles { class B_Soldier_base_F; class B_Soldier_04_f: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class B_Soldier_05_f: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -25,12 +31,16 @@ class CfgVehicles { class I_Soldier_base_F; class I_Soldier_03_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class I_Soldier_04_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -38,79 +48,107 @@ class CfgVehicles { class SoldierEB; class O_Soldier_base_F: SoldierEB { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Soldier_02_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_officer_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Soldier_diver_base_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; // Virtual Reality class B_Soldier_VR_F: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class B_Protagonist_VR_F: B_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Soldier_VR_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class I_Soldier_VR_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class I_Protagonist_VR_F: I_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_Protagonist_VR_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class C_man_1; class C_Protagonist_VR_F: C_man_1 { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; // Civilians class C_Soldier_VR_F: C_man_1 { class HitPoints { - ADD_ACE_HITPOINTS(1,1); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; // APEX class O_V_Soldier_Viper_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(3,3); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; class O_V_Soldier_base_F: O_Soldier_base_F { class HitPoints { - ADD_ACE_HITPOINTS(3,3); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; @@ -118,7 +156,9 @@ class CfgVehicles { class I_E_Man_Base_F; class I_E_Uniform_01_coveralls_F: I_E_Man_Base_F { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; }; diff --git a/addons/medical_engine/XEH_postInit.sqf b/addons/medical_engine/XEH_postInit.sqf index fec92ca620..a416bb72df 100644 --- a/addons/medical_engine/XEH_postInit.sqf +++ b/addons/medical_engine/XEH_postInit.sqf @@ -31,8 +31,8 @@ #ifdef DEBUG_MODE_FULL [QEGVAR(medical,woundReceived), { - params ["_unit", "_woundedHitPoint", "_receivedDamage", "_shooter", "_ammo"]; - TRACE_5("wound",_unit,_woundedHitPoint, _receivedDamage, _shooter, _ammo); + params ["_unit", "_damages", "_shooter", "_ammo"]; + TRACE_4("wound",_unit,_damages, _shooter, _ammo); //systemChat str _this; }] call CBA_fnc_addEventHandler; #endif @@ -59,14 +59,14 @@ private _lethality = linearConversion [0, 25, (vectorMagnitude velocity _vehicle), 0.5, 1]; TRACE_2("air crash",_lethality,crew _vehicle); { - [QEGVAR(medical,woundReceived), [_x, "Head", _lethality, _killer, "#vehiclecrash", [HITPOINT_INDEX_HEAD,1]], _x] call CBA_fnc_targetEvent; + [QEGVAR(medical,woundReceived), [_x, [[_lethality, "Head", _lethality]], _killer, "#vehiclecrash"], _x] call CBA_fnc_targetEvent; } forEach (crew _vehicle); }, true, ["ParachuteBase"]] call CBA_fnc_addClassEventHandler; // Fixes units being stuck in unconscious animation when being knocked over by a PhysX object ["CAManBase", "AnimDone", { params ["_unit", "_anim"]; - if (local _unit && {_anim find QGVAR(face) != -1 && {lifeState _unit != "INCAPACITATED"}}) then { + if (local _unit && {_anim find QUNCON_ANIM(face) != -1 && {lifeState _unit != "INCAPACITATED"}}) then { [_unit, false] call FUNC(setUnconsciousAnim); }; }] call CBA_fnc_addClassEventHandler; diff --git a/addons/medical_engine/XEH_preInit.sqf b/addons/medical_engine/XEH_preInit.sqf index 71c7a86595..8157baa4ec 100644 --- a/addons/medical_engine/XEH_preInit.sqf +++ b/addons/medical_engine/XEH_preInit.sqf @@ -31,7 +31,7 @@ if (isNil QUOTE(FATAL_SUM_DAMAGE_WEIBULL_K) || isNil QUOTE(FATAL_SUM_DAMAGE_WEIB }; // Cache for armor values of equipped items (vests etc) -GVAR(armorCache) = false call CBA_fnc_createNamespace; +GVAR(armorCache) = createHashMap; // Hack for #3168 (units in static weapons do not take any damage): // Doing a manual pre-load with a small distance seems to fix the LOD problems @@ -39,10 +39,10 @@ GVAR(armorCache) = false call CBA_fnc_createNamespace; GVAR(fixedStatics) = []; GVAR(animations) = [] call CBA_fnc_createNamespace; -GVAR(animations) setVariable [QGVAR(faceUp_unconscious), ["ace_unconscious_2","ace_unconscious_2_1","ace_unconscious_7_1","ace_unconscious_8_1","ace_unconscious_5_1","ace_unconscious_6_1"]]; -GVAR(animations) setVariable [QGVAR(faceDown_unconscious), ["ace_unconscious_1", "ace_unconscious_3", "ace_unconscious_4","unconscious","ace_unconscious_9","ace_unconscious_3_1","ace_unconscious_4_1"]]; -GVAR(animations) setVariable [QGVAR(faceLeft_unconscious), ["ace_unconscious_7","ace_unconscious_8","ace_unconscious_1_1","ace_unconscious_7_1","ace_unconscious_8_1"]]; -GVAR(animations) setVariable [QGVAR(faceRight_unconscious), ["ace_unconscious_5","ace_unconscious_6","ace_unconscious_10","ace_unconscious_5_1","ace_unconscious_6_1"]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceUp), [QUNCON_ANIM(2),QUNCON_ANIM(2_1),QUNCON_ANIM(7_1),QUNCON_ANIM(8_1),QUNCON_ANIM(5_1),QUNCON_ANIM(6_1)]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceDown), [QUNCON_ANIM(1),QUNCON_ANIM(3),QUNCON_ANIM(4),"unconscious",QUNCON_ANIM(9),QUNCON_ANIM(3_1),QUNCON_ANIM(4_1)]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceLeft), [QUNCON_ANIM(7),QUNCON_ANIM(8),QUNCON_ANIM(1_1),QUNCON_ANIM(7_1),QUNCON_ANIM(8_1)]]; +GVAR(animations) setVariable [QUNCON_ANIM(faceRight), [QUNCON_ANIM(5),QUNCON_ANIM(6),QUNCON_ANIM(10),QUNCON_ANIM(5_1),QUNCON_ANIM(6_1)]]; private _fnc_fixStatic = { params ["_vehicle"]; @@ -69,7 +69,7 @@ addMissionEventHandler ["Loaded", { // Use object reference to indicate the waitUnit is already running (this prevents issues with respawning units keeping SetVars) if ((_unit getVariable [QGVAR(waitForAnim), objNull]) == _unit) exitWith {}; _unit setVariable [QGVAR(waitForAnim), _unit]; - [{(animationState _this) find QGVAR(face) != -1}, { + [{(animationState _this) find QUNCON_ANIM(face) != -1}, { [_this, animationState _this] call FUNC(applyAnimAfterRagdoll); }, _unit, 20] call CBA_fnc_waitUntilAndExecute; } else { diff --git a/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf b/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf index 7d97f8b3f8..116138306a 100644 --- a/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf +++ b/addons/medical_engine/functions/fnc_applyAnimAfterRagdoll.sqf @@ -17,13 +17,16 @@ */ params ["_unit", "_anim"]; -TRACE_2("applyAnimAfterRagdoll",_unit,_unconsciousAnimation); +TRACE_2("applyAnimAfterRagdoll",_unit,_anim); if !(IS_UNCONSCIOUS(_unit) && // do not run if unit is conscious {alive _unit && // do not run if unit is dead {isNull objectParent _unit}}) exitWith {}; // do not run if unit in any vehicle -private _unconsciousAnimation = selectRandom (GVAR(animations) getVariable [_anim, [""]]); +private _animsArray = GVAR(animations) getVariable [_anim, [""]]; +private _random = (toArray (hashValue _unit)) param [0, 0]; +private _index = _random % (count _animsArray); +private _unconsciousAnimation = _animsArray select _index; if (_unconsciousAnimation isEqualTo "") exitWith { // not a valid animation found @@ -33,4 +36,5 @@ if (_unconsciousAnimation isEqualTo "") exitWith { // Apply the animation only locally on the machine and do not broadcast it to others // Reason is the nature of setUnconscious' end of ragdoll animation is not synced on all machines either // Not synced animations are preferred over units snapping from one to another animation +TRACE_2("switchMove",_unit,_unconsciousAnimation); _unit switchMove _unconsciousAnimation; diff --git a/addons/medical_engine/functions/fnc_getItemArmor.sqf b/addons/medical_engine/functions/fnc_getItemArmor.sqf index 9457c54c6e..26e1bd693a 100644 --- a/addons/medical_engine/functions/fnc_getItemArmor.sqf +++ b/addons/medical_engine/functions/fnc_getItemArmor.sqf @@ -19,22 +19,26 @@ params ["_item", "_hitpoint"]; private _key = format ["%1$%2", _item, _hitpoint]; -private _armor = GVAR(armorCache) getVariable _key; +private _armor = GVAR(armorCache) get _key; if (isNil "_armor") then { TRACE_2("Cache miss",_item,_hitpoint); if ("" in [_item, _hitpoint]) exitWith { _armor = 0; - GVAR(armorCache) setVariable [_key, _armor]; + GVAR(armorCache) set [_key, _armor]; }; private _itemInfo = configFile >> "CfgWeapons" >> _item >> "ItemInfo"; if (getNumber (_itemInfo >> "type") == TYPE_UNIFORM) then { private _unitCfg = configFile >> "CfgVehicles" >> getText (_itemInfo >> "uniformClass"); - private _entry = _unitCfg >> "HitPoints" >> _hitpoint; - - _armor = getNumber (_unitCfg >> "armor") * getNumber (_entry >> "armor") + if (_hitpoint == "#structural") then { + // TODO: I'm not sure if this should be multiplied by the base armor value or not + _armor = getNumber (_unitCfg >> "armorStructural"); + } else { + private _entry = _unitCfg >> "HitPoints" >> _hitpoint; + _armor = getNumber (_unitCfg >> "armor") * (1 max getNumber (_entry >> "armor")); + }; } else { private _condition = format ["getText (_x >> 'hitpointName') == '%1'", _hitpoint]; private _entry = configProperties [_itemInfo >> "HitpointsProtectionInfo", _condition] param [0, configNull]; @@ -42,7 +46,7 @@ if (isNil "_armor") then { _armor = getNumber (_entry >> "armor"); }; - GVAR(armorCache) setVariable [_key, _armor]; + GVAR(armorCache) set [_key, _armor]; }; _armor // return diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf index 9eb799cdcd..1b3bb238a1 100644 --- a/addons/medical_engine/functions/fnc_handleDamage.sqf +++ b/addons/medical_engine/functions/fnc_handleDamage.sqf @@ -13,9 +13,6 @@ * * Public: No */ -// for travis -#define HIT_STRUCTURAL QGVAR($#structural) - params ["_unit", "_selection", "_damage", "_shooter", "_ammo", "_hitPointIndex", "_instigator", "_hitpoint"]; // HD sometimes triggers for remote units - ignore. @@ -38,13 +35,37 @@ private _newDamage = _damage - _oldDamage; // Get armor value of hitpoint and calculate damage before armor private _armor = [_unit, _hitpoint] call FUNC(getHitpointArmor); private _realDamage = _newDamage * _armor; -// Damages are stored for "ace_hdbracket" event triggered last -_unit setVariable [format [QGVAR($%1), _hitPoint], [_realDamage, _newDamage]]; -TRACE_3("Received hit",_hitpoint,_newDamage,_realDamage); +TRACE_4("Received hit",_hitpoint,_ammo,_newDamage,_realDamage); -// Engine damage to these hitpoints controls blood visuals, limping, weapon sway -// Handled in fnc_damageBodyPart, persist here -if (_hitPoint in ["hithead", "hitbody", "hithands", "hitlegs"]) exitWith {_oldDamage}; +// Drowning doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs +// Damage occurs in consistent increments +if ( + _hitPoint isEqualTo "#structural" && + {getOxygenRemaining _unit <= 0.5} && + {_damage isEqualTo (_oldDamage + 0.005)} +) exitWith { + TRACE_5("Drowning",_unit,_shooter,_instigator,_damage,_newDamage); + [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, "Body", _newDamage]], _unit, "drowning"]] call CBA_fnc_localEvent; + + 0 +}; + +// Crashing a vehicle doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs +// It does fire the EH multiple times, but this seems to scale with the intensity of the crash +private _vehicle = vehicle _unit; +if ( + EGVAR(medical,enableVehicleCrashes) && + {_hitPoint isEqualTo "#structural"} && + {_ammo isEqualTo ""} && + {_vehicle != _unit} && + {vectorMagnitude (velocity _vehicle) > 5} + // todo: no way to detect if stationary and another vehicle hits you +) exitWith { + TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage); + [QEGVAR(medical,woundReceived), [_unit, [[_newDamage, _hitPoint, _newDamage]], _unit, "vehiclecrash"]] call CBA_fnc_localEvent; + + 0 +}; // This hitpoint is set to trigger last, evaluate all the stored damage values // to determine where wounds are applied @@ -52,7 +73,7 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { _unit setVariable [QEGVAR(medical,lastDamageSource), _shooter]; _unit setVariable [QEGVAR(medical,lastInstigator), _instigator]; - private _damageStructural = _unit getVariable [HIT_STRUCTURAL, 0]; + private _damageStructural = _unit getVariable [QGVAR($#structural), [0,0]]; // --- Head private _damageHead = [ @@ -81,47 +102,27 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { private _damageRightLeg = _unit getVariable [QGVAR($HitRightLeg), [0,0]]; // Find hit point that received the maxium damage - // Priority used for sorting if incoming damage is equivalent (e.g. max which is 4) + // Priority used for sorting if incoming damage is equal private _allDamages = [ - _damageHead + [PRIORITY_HEAD, "Head"], - _damageBody + [PRIORITY_BODY, "Body"], - _damageLeftArm + [PRIORITY_LEFT_ARM, "LeftArm"], - _damageRightArm + [PRIORITY_RIGHT_ARM, "RightArm"], - _damageLeftLeg + [PRIORITY_LEFT_LEG, "LeftLeg"], - _damageRightLeg + [PRIORITY_RIGHT_LEG, "RightLeg"] + [_damageHead select 0, PRIORITY_HEAD, _damageHead select 1, "Head"], + [_damageBody select 0, PRIORITY_BODY, _damageBody select 1, "Body"], + [_damageLeftArm select 0, PRIORITY_LEFT_ARM, _damageLeftArm select 1, "LeftArm"], + [_damageRightArm select 0, PRIORITY_RIGHT_ARM, _damageRightArm select 1, "RightArm"], + [_damageLeftLeg select 0, PRIORITY_LEFT_LEG, _damageLeftLeg select 1, "LeftLeg"], + [_damageRightLeg select 0, PRIORITY_RIGHT_LEG, _damageRightLeg select 1, "RightLeg"], + [_damageStructural select 0, PRIORITY_STRUCTURAL, _damageStructural select 1, "#structural"] ]; TRACE_2("incoming",_allDamages,_damageStructural); - // represents all incoming damage for selecting a non-selectionSpecific wound location, (used for selectRandomWeighted [value1,weight1,value2....]) - private _damageSelectionArray = [ - HITPOINT_INDEX_HEAD, _damageHead select 1, HITPOINT_INDEX_BODY, _damageBody select 1, HITPOINT_INDEX_LARM, _damageLeftArm select 1, - HITPOINT_INDEX_RARM, _damageRightArm select 1, HITPOINT_INDEX_LLEG, _damageLeftLeg select 1, HITPOINT_INDEX_RLEG, _damageRightLeg select 1 - ]; - _allDamages sort false; - (_allDamages select 0) params ["", "_receivedDamage", "", "_woundedHitPoint"]; - private _receivedDamageHead = _damageHead select 1; - if (_receivedDamageHead >= HEAD_DAMAGE_THRESHOLD) then { - TRACE_3("reporting fatal head damage instead of max",_receivedDamageHead,_receivedDamage,_woundedHitPoint); - _receivedDamage = _receivedDamageHead; - _woundedHitPoint = "Head"; - }; - - // We know it's structural when no specific hitpoint is damaged - if (_receivedDamage == 0) then { - _receivedDamage = _damageStructural select 1; - _woundedHitPoint = "Body"; - _damageSelectionArray = [1, 1]; // sum of weights would be 0 - }; - + _allDamages = _allDamages apply {[_x select 2, _x select 3, _x select 0]}; + // Environmental damage sources all have empty ammo string // No explicit source given, we infer from differences between them if (_ammo isEqualTo "") then { // Any collision with terrain/vehicle/object has a shooter // Check this first because burning can happen at any velocity if !(isNull _shooter) then { - _ammo = "collision"; // non-selectionSpecific so only _damageSelectionArray matters - /* If shooter != unit then they hit unit, otherwise it could be: - Unit hitting anything at speed @@ -130,48 +131,24 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { Assume fall damage for downward velocity because it's most common */ if (_shooter == _unit && {(velocity _unit select 2) < -2}) then { - _ammo = "falling"; // non-selectionSpecific so only _damageSelectionArray matters - _damageSelectionArray = [HITPOINT_INDEX_RLEG, 1, HITPOINT_INDEX_LLEG, 1]; - TRACE_5("Fall",_unit,_shooter,_instigator,_damage,_receivedDamage); + _ammo = "falling"; + TRACE_5("Fall",_unit,_shooter,_instigator,_damage,_allDamages); } else { - _damageSelectionArray = [HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1]; - TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_receivedDamage); - }; - - // Significant damage suggests high relative velocity - // Momentum transfers to body/head for worse wounding - // Higher momentum results in higher chance for head to be hit for more lethality - if (_receivedDamage > 0.35) then { - private _headHitWeight = (_receivedDamage / 2) min 1; - if (_receivedDamage < 0.6) then { - _damageSelectionArray append [0, (1 - _headHitWeight), 1, _headHitWeight]; - } else { - _damageSelectionArray = [0, (1 - _headHitWeight), 1, _headHitWeight]; - } + _ammo = "collision"; + TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_allDamages); }; } else { // Anything else is almost guaranteed to be fire damage - _damageSelectionArray = [HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1];; - _ammo = "unknown"; // non-selectionSpecific so only _damageSelectionArray matters - - // Fire damage can occur as lots of minor damage events - // Combine these until significant enough to wound - private _combinedDamage = _receivedDamage + (_unit getVariable [QGVAR(trivialDamage), 0]); - if (_combinedDamage > 0.1) then { - _unit setVariable [QGVAR(trivialDamage), 0]; - _receivedDamage = _combinedDamage; - TRACE_5("Burning",_unit,_shooter,_instigator,_damage,_receivedDamage); - } else { - _unit setVariable [QGVAR(trivialDamage), _combinedDamage]; - _receivedDamage = 0; - }; + _ammo = "fire"; + TRACE_5("Fire Damage",_unit,_shooter,_instigator,_damage,_allDamages); }; }; // No wounds for minor damage - if (_receivedDamage > 1E-3) then { - TRACE_3("received",_receivedDamage,_woundedHitPoint,_damageSelectionArray); - [QEGVAR(medical,woundReceived), [_unit, _woundedHitPoint, _receivedDamage, _shooter, _ammo, _damageSelectionArray]] call CBA_fnc_localEvent; + // TODO check if this needs to be changed for burning damage (occurs as lots of small events that we add together) + if ((_allDamages select 0 select 0) > 1E-3) then { + TRACE_1("received",_allDamages); + [QEGVAR(medical,woundReceived), [_unit, _allDamages, _shooter, _ammo]] call CBA_fnc_localEvent; }; // Clear stored damages otherwise they will influence future damage events @@ -181,45 +158,19 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { } forEach [ QGVAR($HitFace),QGVAR($HitNeck),QGVAR($HitHead), QGVAR($HitPelvis),QGVAR($HitAbdomen),QGVAR($HitDiaphragm),QGVAR($HitChest),QGVAR($HitBody), - QGVAR($HitLeftArm),QGVAR($HitRightArm),QGVAR($HitLeftLeg),QGVAR($HitRightLeg) + QGVAR($HitLeftArm),QGVAR($HitRightArm),QGVAR($HitLeftLeg),QGVAR($HitRightLeg), + QGVAR($#structural) ]; 0 }; -// Drowning doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs -// Damage occurs in consistent increments -if ( - _hitPoint isEqualTo "#structural" && - {getOxygenRemaining _unit <= 0.5} && - {_damage isEqualTo (_oldDamage + 0.005)} -) exitWith { - [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "drowning", [HITPOINT_INDEX_BODY, 1]]] call CBA_fnc_localEvent; - TRACE_5("Drowning",_unit,_shooter,_instigator,_damage,_newDamage); +// Damages are stored for "ace_hdbracket" event triggered last +_unit setVariable [format [QGVAR($%1), _hitPoint], [_realDamage, _newDamage]]; - 0 -}; - -// Crashing a vehicle doesn't fire the EH for each hitpoint so the "ace_hdbracket" code never runs -// It does fire the EH multiple times, but this seems to scale with the intensity of the crash -private _vehicle = vehicle _unit; -if ( - EGVAR(medical,enableVehicleCrashes) && - {_hitPoint isEqualTo "#structural"} && - {_ammo isEqualTo ""} && - {_vehicle != _unit} && - {vectorMagnitude (velocity _vehicle) > 5} - // todo: no way to detect if stationary and another vehicle hits you -) exitWith { - private _damageSelectionArray = [ - HITPOINT_INDEX_HEAD, 1, HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LARM, 1, - HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1 - ]; - [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "vehiclecrash", _damageSelectionArray]] call CBA_fnc_localEvent; - TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage); - - 0 -}; +// Engine damage to these hitpoints controls blood visuals, limping, weapon sway +// Handled in fnc_damageBodyPart, persist here +if (_hitPoint in ["hithead", "hitbody", "hithands", "hitlegs"]) exitWith {_oldDamage}; // We store our own damage values so engine damage is unnecessary 0 diff --git a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf index f71c550add..89de38dbea 100644 --- a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf +++ b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf @@ -59,7 +59,7 @@ if (_isUnconscious) then { if (!alive _unit) exitWith {}; // Fix unit being in locked animation with switchMove (If unit was unloaded from a vehicle, they may be in deadstate instead of unconscious) private _animation = animationState _unit; - if ((_animation == "unconscious" || {_animation == "deadstate" || {_animation find "ace_unconscious_" != -1}}) && {lifeState _unit != "INCAPACITATED"}) then { + if ((_animation == "unconscious" || {_animation == "deadstate" || {_animation find QGVAR(uncon_anim) != -1}}) && {lifeState _unit != "INCAPACITATED"}) then { [_unit, "AmovPpneMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); TRACE_1("forcing SwitchMove",animationState _unit); }; diff --git a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf index f3981127f0..10d62f2141 100644 --- a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf +++ b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf @@ -55,7 +55,7 @@ if (!_isLimping && {EGVAR(medical,limping) > 0}) then { { _x params ["_xClassID", "_xBodyPartN", "_xAmountOf", "", "_xDamage"]; if ((_xBodyPartN > 3) && {_xAmountOf > 0} && {_xDamage > LIMPING_DAMAGE_THRESHOLD} && { - (EGVAR(medical_damage,woundsData) select (_xClassID / 10)) select 7}) exitWith { // select _causeLimping from woundsData + (EGVAR(medical_damage,woundDetails) get (_xClassID / 10)) select 3}) exitWith { // select _causeLimping from woundDetails TRACE_1("limping because of wound",_x); _isLimping = true; }; diff --git a/addons/medical_engine/script_component.hpp b/addons/medical_engine/script_component.hpp index e5e03e6d1f..59cd015080 100644 --- a/addons/medical_engine/script_component.hpp +++ b/addons/medical_engine/script_component.hpp @@ -32,7 +32,11 @@ #define PRIORITY_RIGHT_ARM (1 + random 1) #define PRIORITY_LEFT_LEG (1 + random 1) #define PRIORITY_RIGHT_LEG (1 + random 1) +#define PRIORITY_STRUCTURAL 1 // don't change, these reflect hard coded engine behaviour #define DAMAGED_MIN_THRESHOLD 0.45 #define LIMPING_MIN_DAMAGE 0.5 + +#define UNCON_ANIM(var1) DOUBLES(GVAR(uncon_anim),var1) +#define QUNCON_ANIM(var1) QUOTE(UNCON_ANIM(var1)) diff --git a/addons/medical_engine/script_macros_config.hpp b/addons/medical_engine/script_macros_config.hpp index b29f9dd958..611a8ad356 100644 --- a/addons/medical_engine/script_macros_config.hpp +++ b/addons/medical_engine/script_macros_config.hpp @@ -7,16 +7,19 @@ class My_AwesomeUnit_base; class My_AwesomeUnit: My_AwesomeUnit_base { class HitPoints { - ADD_ACE_HITPOINTS(2,2); + class HitHands; + class HitLegs; + ADD_ACE_HITPOINTS; }; }; }; */ // Our method for adding left and right arm and leg armor. Uses those selections -// that are used for animations and therefore exist in all third party units -// usage: arm_armor and leg_armor are the armor values of of HitHands and -// HitLegs respectively. +// that are used for animations and therefore exist in all third party units. +// This used to take the armor values as parameters; it now inherits the values +// of `armor`, `passThrough` and `explosionShielding` from the existing hitpoints +// for vanilla consistency. // "ACE_HDBracket" is a special hit point. It is designed in a way where the // "HandleDamage" event handler will compute it at the end of every damage // calculation step. This way we can figure out which hit point took the most @@ -24,27 +27,21 @@ // the hit point itself should not take any damage // It is important that the "ACE_HDBracket" hit point is the last in the config, // but has the same selection as the first one (always "HitHead" for soldiers). -#define ADD_ACE_HITPOINTS(arm_armor,leg_armor)\ - class HitLeftArm {\ - armor = arm_armor;\ +#define ADD_ACE_HITPOINTS\ + class HitLeftArm: HitHands {\ material = -1;\ name = "hand_l";\ - passThrough = 1;\ radius = 0.08;\ - explosionShielding = 1;\ visual = "injury_hands";\ minimalHit = 0.01;\ };\ class HitRightArm: HitLeftArm {\ name = "hand_r";\ };\ - class HitLeftLeg {\ - armor = leg_armor;\ + class HitLeftLeg: HitLegs {\ material = -1;\ name = "leg_l";\ - passThrough = 1;\ radius = 0.1;\ - explosionShielding = 1;\ visual = "injury_legs";\ minimalHit = 0.01;\ };\ diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp index f2d4fb9a09..618810414a 100644 --- a/addons/medical_engine/script_macros_medical.hpp +++ b/addons/medical_engine/script_macros_medical.hpp @@ -4,7 +4,7 @@ #define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"] #define ALL_SELECTIONS ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] -#define ALL_HITPOINTS ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] +#define ALL_HITPOINTS ["HitHead", "HitChest", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] #define HITPOINT_INDEX_HEAD 0 #define HITPOINT_INDEX_BODY 1 diff --git a/addons/medical_engine/stringtable.xml b/addons/medical_engine/stringtable.xml index 7c008b0e6c..5bec5e5a70 100644 --- a/addons/medical_engine/stringtable.xml +++ b/addons/medical_engine/stringtable.xml @@ -9,6 +9,8 @@ Włącz obrażenia od kolizji pojazdu 車両衝突ダメージを有効化 Aktiviere Verletzungen durch Fahrzeugunfälle + 启用车辆碰撞损坏 + 차량 충돌 피해 활성화 Controls whether crew receives damage from vehicle collisions. @@ -18,6 +20,8 @@ Kontroluje czy załoga pojazdu otrzyma obrażenia podczas kolizji pojazdu. 車両が衝突をすると乗員がダメージを受けるかどうかを決定します。 Kontrolliert, ob Besatzung eines Fahrzeugs Schaden durch Unfälle erleiden soll + 控制乘员是否受到车辆碰撞的伤害。 + 차량 충돌로 인해 탑승인원들이 피해를 받을 지 결정합니다. diff --git a/addons/medical_feedback/XEH_postInit.sqf b/addons/medical_feedback/XEH_postInit.sqf index c482be9ad1..96d15dbf21 100644 --- a/addons/medical_feedback/XEH_postInit.sqf +++ b/addons/medical_feedback/XEH_postInit.sqf @@ -89,13 +89,12 @@ GVAR(bloodTickCounter) = 0; if (_newCamera == "") then { // switched back to player view private _status = IS_UNCONSCIOUS(_unit); [!_status, _unit] call EFUNC(common,setVolume); - [QUOTE(ADDON), _volume, _status] call EFUNC(common,setHearingCapability); - ["unconscious", _status] call EFUNC(common,setDisableUserInputStatus); } else { // camera view [true, _unit] call EFUNC(common,setVolume); [QUOTE(ADDON), 1, false] call EFUNC(common,setHearingCapability); + ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); }; }] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/medical_feedback/stringtable.xml b/addons/medical_feedback/stringtable.xml index 2db6b75c8c..d681f67b3a 100644 --- a/addons/medical_feedback/stringtable.xml +++ b/addons/medical_feedback/stringtable.xml @@ -9,11 +9,13 @@ Réaction aux blessures Reação a Lesões 視覺回饋 + 受伤反应 Commenti Zpětná vazba Informacje Zwrotne Reacción Geri Bildirim + 피드백 Pain Effect Type @@ -29,6 +31,7 @@ 痛み効果種類 고통 효과 종류 疼痛效果類型 + 疼痛效果类型 Ağrı Etkisi Türü @@ -38,12 +41,14 @@ Выбирает тип визуализации болевого эффекта. Selecione o tipo de efeito de dor. 選擇哪一個視覺效果用於回饋疼痛 + 选择反馈的疼痛效果类型。 Seleziona il tipo di effetto del dolore usato. Nastavuje který efekt bolesti bude používán. Wybiera rodzaj efektu bólu. Selecciona el tipo de efecto de dolor Kullanılan ağrı efekti tipini seçer. Wählt den zu benutzenden Schmerzeffekt aus. + 고통 시 어떤 효과로 나타낼 지 결정합니다. White Flashing @@ -53,11 +58,13 @@ Flash blancs Flashes Brancos 白光閃爍 + 白光闪烁 Bianco lampeggiante Blikání bílé barvy Miganie na biało Destello blanco Beyaz Yanıp Sönüyor + 반짝이는 하얀색 Pulsing Blur @@ -67,11 +74,13 @@ Pulsations floues Borrão Pulsante 脈動模糊 + 脉冲式模糊 Sfocatura pulsante Pulzující rozmazání Pulsujące rozmycie Enborronamiento pulsante Titreşimli Bulanıklık + 두근대는 흐려짐 Chromatic Aberration @@ -94,6 +103,7 @@ Only high pain effect 強い痛みの時のみ 只有在強烈疼痛時使用 + 仅在剧烈疼痛下启用 Juste un fort effet douloureux Solo elevato effetto di dolore Pouze efekt vysoké bolesti @@ -103,6 +113,7 @@ Sadece yüksek ağrı etkisi Nur bei starken Schmerzen Эффект только сильной боли + 강한 고통 때만 보여짐 Low Blood Volume Effect Type @@ -114,6 +125,8 @@ Düşük Kan Efekt Türü Tipo de efecto por volumen bajo de sangre Effektart für "Niedriges Blutvolumen" + 低血容量影响类型 + 혈액량 부족 시 효과 종류 Selects the used low blood volume effect type. @@ -125,6 +138,8 @@ Kullanılan düşük kan hacmi efekt türünü seçer. Selecciona el tipo de efecto a causa de un volumen bajo de sangre. Wählt die verwendete Effektart für niedriges Blutvolumen. + 选择低血容量下的效果类型。 + 혈액량이 부족할 때 어떤 효과로 나타낼지 결정합니다. Color Fading @@ -136,6 +151,8 @@ Renk Soldurma Atenuación del color Farbverblassen + 褪色 + 색바램 Icon @@ -147,6 +164,8 @@ Simge Icono Symbol + 图标 + 아이콘 Icon + Color Fading @@ -158,6 +177,8 @@ Simge + Renk Soldurma Icono + Atenuación del color Symbol + Farbverblassen + 图标+褪色 + 아이콘 및 색바램 @@ -173,7 +194,7 @@ Abilita Grida 叫びを有効化 비명 활성화 - 启用尖叫 + 启用惨叫 啟用尖叫 Çığlıkları Etkinleştir @@ -189,8 +210,8 @@ Engedélyezi a sérült egységek kiáltásait Abilita Grida da parte delle unità ferite 負傷したユニットを叫ぶようにします。 - 부상당한 인원이 소리지르는것을 활성화합니다 - 启用伤者的尖叫声 + 부상당한 인원이 소리지르는 것을 활성화합니다 + 启用伤者的惨叫声 啟用傷者的尖叫聲 Yaralı birimler tarafından çığlık atmayı etkinleştir @@ -201,6 +222,8 @@ Indicateurs de fractures/garrots/attelles Fraktur-/Tourniquet-/Schienen-Indikatoren aktivieren Włącz wskaźniki złamań/stazy/szyny + 启用骨折/止血带/夹板指示器 + 골절/지혈대/부목 표시 활성화 Enables indicators for fractures and applied tourniquets and splints over the Stance Indicator. @@ -209,6 +232,8 @@ Affiche des icônes au niveau de l'indicateur de posture, indiquant si le personnage souffre de fractures ou si des garrots ou des attelles sont appliqués. Aktiviert Indikatoren für Frakturen mit angelegte Tourniquets und Schienen über dem Haltungsindikator. Włącza wskaźniki złamań oraz założonej staz/szyn przy ikonie stanu postawy + 在姿态指示器上启用骨折、应用止血带和夹板指示器。 + 자세 표시기 옆에 골절, 지혈대, 부목의 여부를 표시합니다. diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf index 7e8ed55e40..2d06e4b1d8 100644 --- a/addons/medical_gui/functions/fnc_updateInjuryList.sqf +++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf @@ -38,19 +38,21 @@ if (IS_BLEEDING(_target)) then { _entries pushBack [localize LSTRING(Status_Bleeding), [1, 0, 0, 1]]; }; -// Give a qualitative description of the blood volume lost -switch (GET_HEMORRHAGE(_target)) do { - case 1: { - _entries pushBack [localize LSTRING(Lost_Blood1), [1, 1, 0, 1]]; - }; - case 2: { - _entries pushBack [localize LSTRING(Lost_Blood2), [1, 0.67, 0, 1]]; - }; - case 3: { - _entries pushBack [localize LSTRING(Lost_Blood3), [1, 0.33, 0, 1]]; - }; - case 4: { - _entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]]; +if (GVAR(showBloodlossEntry)) then { + // Give a qualitative description of the blood volume lost + switch (GET_HEMORRHAGE(_target)) do { + case 1: { + _entries pushBack [localize LSTRING(Lost_Blood1), [1, 1, 0, 1]]; + }; + case 2: { + _entries pushBack [localize LSTRING(Lost_Blood2), [1, 0.67, 0, 1]]; + }; + case 3: { + _entries pushBack [localize LSTRING(Lost_Blood3), [1, 0.33, 0, 1]]; + }; + case 4: { + _entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]]; + }; }; }; @@ -114,7 +116,7 @@ private _fnc_processWounds = { private _classIndex = _woundClassID / 10; private _category = _woundClassID % 10; - private _className = EGVAR(medical_damage,woundsData) select _classIndex select 6; + private _className = EGVAR(medical_damage,woundClassNames) select _classIndex; private _suffix = ["Minor", "Medium", "Large"] select _category; private _woundName = localize format [ELSTRING(medical_damage,%1_%2), _className, _suffix]; diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf index 9dc8693143..eb6a36bac6 100644 --- a/addons/medical_gui/initSettings.sqf +++ b/addons/medical_gui/initSettings.sqf @@ -108,3 +108,12 @@ private _categoryColors = [ELSTRING(medical,Category), format ["| %1 |", LELSTRI false // isGlobal ] call CBA_fnc_addSetting; } forEach _damageColors; + +[ + QGVAR(showBloodlossEntry), + "CHECKBOX", + [LSTRING(ShowBloodlossEntry_DisplayName), LSTRING(ShowBloodlossEntry_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + true // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index 84df4102d8..73afb1160e 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -8,12 +8,14 @@ Медицинский интерфейс GUI 界面 + 界面 GUI GUI Graficzny Interfejs Użytkownika Interfaz gráfica GUI Graphische Benutzeroberfläche + GUI Enable Medical Actions @@ -23,11 +25,13 @@ Activer les actions médicales Ativar Ações Médicas 啟用醫療行為 + 启用医疗措施 Attivare azioni mediche Povolit zdravotnické akce Włącza opcje medyczne Habilitar acciones médicas Medikal hareketleri etkinleştir + 의료 행동 활성화 Enables medical actions for the Interaction Menu and selects their style. @@ -37,11 +41,13 @@ Permet d'afficher les actions médicales dans le menu d'interaction, et de définir leur style visuel. Ativa as ações médicas para o menu de interação e seleciona seus estilos. 為互動選單啟用醫療行為以及選擇其風格。 + 为交互式菜单启用医疗操作,并选择其样式。 Abilita le azioni mediche per il Menu Interazione e seleziona il loro stile. Povolit zdravotnické akce pro menu interakcí a vybrat jejich styl. Umożliwia akcje medyczne w menu interakcji i wybiera ich styl. Habilita acciones médicas para el menú de interacción y selecciona su estilo. Etkileşim Menüsü için tıbbi eylemleri etkinleştirir ve stillerini seçer. + 상호작용 메뉴에서 의료 행동을 하는 것을 허락합니다. Selections (3D) @@ -56,7 +62,7 @@ Selezione (3D) 選択 (3D) 선택 (3d) - 选择 (3D) + 选择(3D) 選擇 (3D) Seçimler (3D) @@ -85,11 +91,13 @@ Activer les actions médicales sur soi-même Ativar ações médicas em si mesmo 啟用自我醫療行為 + 启用医疗自我措施 Abilitare le azioni di automedicazione Povolit zdravotnické vlastní akce Włącza akcje medyczne na sobie Habilitar las acciones médicas en uno mismo Kendine Tıbbi Müdahele Etmeyi Etkinleştir + 자가 의료 행동 활성화 Enables medical actions for the Self Interaction Menu. @@ -99,11 +107,13 @@ Active les actions médicales du menu d'interaction personnel. Ativa as ações médicas do menu de interação pessoal. 為自我互動選單啟用醫療行為。 + 为自我交互菜单启用医疗操作。 Abilita il menu per le interazioni mediche personali Povoluje zdravotnické akce v menu vlastních interakcí. Umożliwia działania medyczne w menu własnej interakcji. Activa las acciones médicas para el menú de interacción personal Kişisel Etkileşim Menüsü için tıbbi eylemleri etkinleştirir. + 자기 상호작용 메뉴에서 의료 행동을 하는 것을 허락합니다. Enable Medical Menu @@ -113,11 +123,13 @@ Activer le menu médical Ativar Menu Médico 啟用醫療選單 + 启用医疗菜单 Abilita il menu medico Povolit Zdravotnické menu Włącz Menu Medyczne Activar menú médico Medikal Menüyü Etkinleştir + 의료 메뉴 활성화 Enables the use of the Medical Menu through the keybind or interaction menu. @@ -127,11 +139,13 @@ Permet l'utilisation du menu médical via le menu d'interaction ou l'appui d'une touche. Ativa o uso do Menu Médico atráves da Tecla ou Menu de Interação. 啟用以互動選單或者按鍵綁定所呼出的高效醫療選單 + 通过按键绑定或交互菜单启用医疗菜单。 Abilita l'uso del Menu Medico attraverso il menu tastiera o il menu di interazione. Povoluje používání Zdravotnického menu klávesovou zkratku nebo skrze menu interakcí. Umożliwia korzystanie z menu medycznego poprzez skrót lub menu interakcji. Activa el uso del menú médico a través de la tecla o del menú de interacción Medikal Menünün bir tuşla veya etkileşim menüsü aracılığıyla kullanılmasını sağlar. + 단축키나 상호작용을 통해 의료 메뉴를 활성화 할지 정합니다. Reopen Medical Menu @@ -141,11 +155,13 @@ Rouvrir le menu médical Reabrir Menu Médico 醫療選單二度開啟 + 重新打开医疗菜单 Riaprire il menù medico Znovu otevřít Zdravotnické menu Otwiera ponownie menu medyczne Reabrir menú médico Medikal Menüyü Yeniden Aç + 의료 메뉴 다시 열기 Reopen the Medical Menu after successful treatment. @@ -155,11 +171,13 @@ Réouvre le menu médical suite à l'application d'un soin. Reabrir Menu Médico após um tratamento com sucesso 當治療完成後二度打開醫療選單 + 治疗成功后,重新打开医疗菜单。 Riaprire il menu medico dopo il trattamento con successo. Otevře Zdravotnické menu po úspěšném dokončení zdravotnické akce. Otwiera ponownie menu medyczne po udanym leczeniu. Reabrir menú médico después de completar un tratamiento Başarılı bir tedaviden sonra Tıbbi Menüyü yeniden açın. + 성공적으로 치료한 뒤 의료 메뉴를 다시 열지 결정합니다. Maximum Distance @@ -169,11 +187,13 @@ Distance maximale Distância Máxima 最大醫療距離 + 最大医疗距离 Massima distanza Maximální vzdálenost Maksymalny dystans Distancia máxima Maksimum Mesafe + 최대 거리 Maximum distance from which the Medical Menu can be opened. @@ -183,11 +203,13 @@ Définit la distance (en mètres) à partir de laquelle il n'est plus possible d'activer le menu médical pour traiter un patient. A Distância máxima do paciente para que o Menu Médico possa ser aberto. 設定距離多遠以內可以對目標使用醫療選單 + 设定距离多远以内可以对目标使用医疗菜单 Distanza massima da cui si può aprire il Menu Medico. Maximální vzdálenost ze které je možné otevřít Zdravotnické menu. Maksymalny dystans w którym menu medyczne może zostać otwarte. Distancia máxima desde el paciente para que el menú pueda ser abierto Tıbbi Menünün açılabileceği maksimum mesafe. + 의료 메뉴를 열 수 있는 최대 거리를 지정합니다. Show Triage Level in Interaction Menu @@ -197,6 +219,8 @@ Показывать группу триажа в меню взаимодействий Pokaż poziom Triażu w menu interakcji Zeige Triage-Einstufung im Interaktionsmenü + 在交互式菜单中显示分诊级别 + 상호작용 메뉴에서 부상자 카드 보기 Shows the patient's triage level by changing the color of the main and medical menu actions. @@ -206,6 +230,8 @@ Отображает установленную группу карты медицинской сортировки (триажа), изменяя цвет действий основного и медицинского меню. Pokazuje poziom Triażu pacjenta poprzez zmianę koloru ikony w menu interakcji. Zeigt die Triage-Einstufung des Patienten durch Ändern der Farbe der Aktionen des Hauptmenüs und des medizinischen Menüs an. + 通过改变主菜单和医疗菜单动作的颜色来显示伤员的分诊级别。 + 환자의 부상자 카드를 상호작용에서 볼 수 있게 합니다. Medical @@ -431,7 +457,7 @@ Bendaggi/Fratture 包帯 / 骨折 붕대 / 골절 - 包扎 / 骨折 + 包扎/骨折 繃帶 / 骨折 Bandaj / Kırıklar @@ -495,7 +521,7 @@ Trascina / Trasporta 引きずる / 担ぐ 끌기 / 들기 - 拖 / 背 + 拖/背 拖 / 背 Sürükle / Taşı @@ -511,7 +537,7 @@ Attiva (Te Stesso) 切り替え (自分) 토글 (자신) - 切换 (自己) + 切换(自己) 切換 (自己) Değiştir (Şahsi) @@ -558,7 +584,7 @@ Levá Ruka Braccio Sinistro 左腕 - 왼쪽 팔 + 왼팔 左臂 左手 Sol Kol @@ -574,7 +600,7 @@ Pravá Ruka Braccio Destro 右腕 - 오른쪽 팔 + 오른팔 右臂 右手 Sağ Kol @@ -590,7 +616,7 @@ Levá Noha Gamba Sinistra 左足 - 왼쪽 다리 + 왼다리 左腿 左腳 Sol Bacak @@ -606,7 +632,7 @@ Pravá Noha Gamba Destra 右足 - 오른쪽 다리 + 오른다리 右腿 右腳 Sağ Bacak @@ -654,7 +680,7 @@ Vybrat Levou ruku Seleziona Braccio Sinistro 左腕を選ぶ - 왼쪽 팔 선택 + 왼팔 선택 选择左臂 選擇左手 Sol Kolu Seç @@ -670,7 +696,7 @@ Vybrat Pravou ruku Seleziona Braccio Destro 右腕を選ぶ - 오른쪽 팔 선택 + 오른팔 선택 选择右臂 選擇右手 Sağ Kolu Seç @@ -686,7 +712,7 @@ Vybrat Levou nohu Seleziona Gamba Sinistra 左足を選ぶ - 왼쪽 다리 선택 + 왼다리 선택 选择左腿 選擇左腳 Sol Bacağı Seç @@ -702,7 +728,7 @@ Vybrat Pravou nohu Seleziona Gamba Destra 右足を選ぶ - 오른쪽 다리 선택 + 오른다리 선택 选择右腿 選擇右腳 Sağ Bacağı Seç @@ -718,7 +744,7 @@ Malý Piccolo 小さい - + 작은 Küçük @@ -734,7 +760,7 @@ Střední Medio 中くらい - + 중간의 Orta @@ -750,7 +776,7 @@ Velký Grande 大きい - + Büyük @@ -977,6 +1003,7 @@ 骨折 Kırık Gebrochen + 골절됨 Splint Applied @@ -992,6 +1019,7 @@ 已用夹板固定 Atel Uygulandı Schiene angelegt + 부목 적용함 @@ -1008,6 +1036,7 @@ Algo de sangre perdida Az kan kaybı var 轻微失血 + 피를 조금 잃음 Lost a lot of blood @@ -1021,7 +1050,7 @@ Ha perso parecchio sangue Perdeu muito sangue 大量失血した - 많은 양의 혈액을 잃음 + 피를 꽤 잃음 大量失血 大量失血中 Çok fazla kan kaybı var @@ -1040,6 +1069,7 @@ Perdida gran cantidad de sangre Çok miktarda kan kaybetti 严重失血 + 피를 많이 잃음 Lost a fatal amount of blood @@ -1055,6 +1085,7 @@ Perdida una cantidad fatal de sangre Ölümcül miktarda kan kaybetti 致命失血 + 피를 심각할 만큼 잃음 Tourniquet [CAT] @@ -1068,7 +1099,7 @@ Laccio Emostatico [CAT] 止血帯 [CAT] 지혈대 [CAT] - 止血带 (军用型) + 止血带(军用型) 軍用止血帶 Turnike [CAT] @@ -1083,7 +1114,7 @@ Nasofaryngeální trubice [NPA] Tubo Nasofaringeo [NPA] 鼻咽頭チューブ [NPA] - 비-인두 기도기 [NPA] + 기관삽입기 [NPA] 鼻咽管 鼻咽管 Nazofarengeal Tüp [NPA] @@ -1119,6 +1150,7 @@ Parsiyel %1 Частичное %1 未完全处理的 %1 + 부분 %1 Patient Info @@ -1130,6 +1162,7 @@ Hasta Bilgileri Información de paciente Patienteninformation + 환자 정보 Blood Loss Colors @@ -1138,14 +1171,18 @@ Couleurs des hémorragies Farben für Blutverlust Kolory utraty krwi + 失血颜色 + 출혈 색상 - Blood Loss Colors, That Used in Medical GUI. 10 Color Gradient. + Defines the 10 color gradient used to indicate blood loss in Medical GUIs. Цвета кровопотери, которые используются в Медицинском интерфейсе. Градиент из 10 цветов. 医療 GUI 内で失血量を 10 段階のカラーで表します。 Couleurs utilisées pour afficher les hémorragies dans l'interface médicale. Dégradé de 10 couleurs. Farben für Blutverlust, die in dem Medizinischen Menü verwendet werden. 10-Farben Farbverlauf. Kolory używane do wyświetlania krwawienia w interfejsie medycznym. Gradient 10 kolorów. + 失血颜色,用于医学图形用户界面。10种渐变颜色。 + 출혈로 인한 의료 GUI의 색상을 변경합니다. 총 10가지 색상이 있습니다. Blood Loss Color %1 @@ -1154,6 +1191,8 @@ Hémorragies - couleur %1 Blutverlustfarbe %1 Krwawienie - kolor %1 + 失血颜色 %1 + 출혈 색상 %1 Damage Colors @@ -1162,14 +1201,18 @@ Couleur des dégâts Farben für Schaden Kolory obrażeń + 负伤颜色 + 피해 색상 - Damage Colors, That Used in Medical GUI. 10 Color Gradient. + Defines the 10 color gradient used to indicate damage in Medical GUIs. Цвета урона, которые используются в Медицинском интерфейсе. Градиент из 10 цветов. 医療 GUI 内で負傷を 10 段階のカラーで表します。 Couleurs utilisées pour afficher les dégâts dans l'interface médicale. Dégradé de 10 couleurs. Farben für Schaden, die in dem medizinischen Menü verwendet werden. 10-Farben Farbverlauf. Kolory używane do wyświetlania obrażeń w interfejsie medycznym. Gradient 10 kolorów. + 负伤颜色,用于医学图形用户界面。10种渐变颜色。 + 의료 GUI에 쓰이는 피해 색상입니다. 총 10가지 색상이 있습니다. Damage Color %1 @@ -1178,6 +1221,24 @@ Dégâts - couleur %1 Schadensfarbe %1 Obrażenia - kolor %1 + 负伤颜色 %1 + 피해 색상 %1 + + + Show Blood Loss + Blutverlust anzeigen + 혈액 손실 표시 + Pokaż utratę krwi + 失血量の表示 + 显示失血量 + + + Show qualitative blood loss in the injury list. + Qualitativen Blutverlust in der Verletzungsliste anzeigen. + 부상 목록에 혈액 손실량을 표시합니다. + Pokaż jakościową utratę krwi na liście ran. + 負傷リストに段階的な失血量を表示します。 + 在负伤列表中显示失血阶段 diff --git a/addons/medical_statemachine/Statemachine.hpp b/addons/medical_statemachine/Statemachine.hpp index eecb6a236c..39ff12448e 100644 --- a/addons/medical_statemachine/Statemachine.hpp +++ b/addons/medical_statemachine/Statemachine.hpp @@ -43,10 +43,10 @@ class ACE_Medical_StateMachine { }; class Unconscious { onState = QFUNC(handleStateUnconscious); - onStateEntered = QUOTE([ARR_2(_this,true)] call EFUNC(medical_status,setUnconsciousState)); + onStateEntered = QFUNC(enteredStateUnconscious); class DeathAI { targetState = "Dead"; - condition = QUOTE(!GVAR(AIUnconsciousness) && {!isPlayer _this}); + condition = QUOTE(!(_this getVariable [ARR_2(QQGVAR(AIUnconsciousness), GVAR(AIUnconsciousness))]) && {!isPlayer _this}); }; class WakeUp { targetState = "Injured"; diff --git a/addons/medical_statemachine/XEH_PREP.hpp b/addons/medical_statemachine/XEH_PREP.hpp index 38d0cb573a..df481ae634 100644 --- a/addons/medical_statemachine/XEH_PREP.hpp +++ b/addons/medical_statemachine/XEH_PREP.hpp @@ -4,6 +4,7 @@ PREP(conditionSecondChance); PREP(enteredStateCardiacArrest); PREP(enteredStateDeath); PREP(enteredStateFatalInjury); +PREP(enteredStateUnconscious); PREP(handleStateCardiacArrest); PREP(handleStateDefault); PREP(handleStateInjured); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf index b2bcde8071..b0477cd120 100644 --- a/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf +++ b/addons/medical_statemachine/functions/fnc_enteredStateCardiacArrest.sqf @@ -17,6 +17,9 @@ */ params ["_unit"]; +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + WARNING_1("enteredStateCardiacArrest: State transition on dead or null unit - %1",_unit); +}; // 10% possible variance in cardiac arrest time private _time = GVAR(cardiacArrestTime); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf index cb6f63c39a..9d020719eb 100644 --- a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf +++ b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf @@ -16,12 +16,15 @@ */ params ["_unit"]; -if (isNull _unit) exitWith {}; +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + if ((_unit getVariable [QEGVAR(medical,causeOfDeath), ""]) == "#scripted") exitWith {}; + WARNING_1("enteredStateDeath: State transition on dead or null unit - %1",_unit); +}; //IGNORE_PRIVATE_WARNING ["_thisOrigin", "_thisTransition"]; // vars provided by CBA_statemachine -TRACE_3("enteredStateDeath",_this,_thisOrigin,_thisTransition); +TRACE_4("enteredStateDeath",_this,_thisOrigin,_thisTransition,CBA_missionTime); private _causeOfDeath = format ["%1:%2", _thisOrigin, _thisTransition]; +private _instigator = _unit getVariable [QEGVAR(medical,lastInstigator), objNull]; -// could delay a frame here to fix the double killed EH, but we lose it being a "native" kill (scoreboard / rating) -[_unit, _causeOfDeath] call EFUNC(medical_status,setDead); +[_unit, _causeOfDeath, _instigator] call EFUNC(medical_status,setDead); diff --git a/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf index 04121b1c95..3a01912ebf 100644 --- a/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf +++ b/addons/medical_statemachine/functions/fnc_enteredStateFatalInjury.sqf @@ -16,5 +16,8 @@ */ params ["_unit"]; +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + WARNING_1("enteredStateFatalInjury: State transition on dead or null unit - %1",_unit); +}; [QEGVAR(medical,FatalInjuryInstantTransition), _unit] call CBA_fnc_localEvent; diff --git a/addons/medical_statemachine/functions/fnc_enteredStateUnconscious.sqf b/addons/medical_statemachine/functions/fnc_enteredStateUnconscious.sqf new file mode 100644 index 0000000000..c35d3ab797 --- /dev/null +++ b/addons/medical_statemachine/functions/fnc_enteredStateUnconscious.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: GhostIsSpooky + * Handles a unit reaching the point of unconsciousness (calls for a status update). + * + * Arguments: + * 0: The Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_medical_statemachine_fnc_enteredStateUnconscious + * + * Public: No + */ +params ["_unit"]; + +if (isNull _unit || {!isNil {_unit getVariable QEGVAR(medical,causeOfDeath)}}) exitWith { + WARNING_1("enteredStateUnconscious: State transition on dead or null unit - %1",_unit); +}; + +//IGNORE_PRIVATE_WARNING ["_thisOrigin", "_thisTransition"]; // vars provided by CBA_statemachine +TRACE_4("enteredStateUnconscious",_this,_thisOrigin,_thisTransition,CBA_missionTime); + +[_unit, true] call EFUNC(medical_status,setUnconsciousState); diff --git a/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf b/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf index b9e49adfe3..d108148fc7 100644 --- a/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf +++ b/addons/medical_statemachine/functions/fnc_handleStateCardiacArrest.sqf @@ -18,8 +18,7 @@ params ["_unit"]; // If the unit died the loop is finished -if (!alive _unit) exitWith {}; -if (!local _unit) exitWith {}; +if (!alive _unit || {!local _unit}) exitWith {}; [_unit] call EFUNC(medical_vitals,handleUnitVitals); @@ -34,4 +33,3 @@ if (_timeDiff >= 1) then { _timeLeft = _timeLeft - _timeDiff; // negative values are fine _unit setVariable [QGVAR(cardiacArrestTimeLeft), _timeLeft]; }; - diff --git a/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf b/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf index f1fdada8dc..129a17a77f 100644 --- a/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf +++ b/addons/medical_statemachine/functions/fnc_handleStateDefault.sqf @@ -18,8 +18,7 @@ params ["_unit"]; // If the unit died the loop is finished -if (!alive _unit) exitWith {}; -if (!local _unit) exitWith {}; +if (!alive _unit || {!local _unit}) exitWith {}; if ([_unit] call EFUNC(medical_vitals,handleUnitVitals)) then { // returns true when update ran private _painLevel = GET_PAIN_PERCEIVED(_unit); diff --git a/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf index 6bdd3e07d3..dc2586803a 100644 --- a/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf +++ b/addons/medical_statemachine/functions/fnc_handleStateInjured.sqf @@ -18,8 +18,7 @@ params ["_unit"]; // If the unit died the loop is finished -if (!alive _unit) exitWith {}; -if (!local _unit) exitWith {}; +if (!alive _unit || {!local _unit}) exitWith {}; if ([_unit] call EFUNC(medical_vitals,handleUnitVitals)) then { // returns true when update ran private _painLevel = GET_PAIN_PERCEIVED(_unit); diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index 724ecd3f4f..354de84066 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -9,17 +9,20 @@ États Estados 狀態 + 状态 Stato Stavy Stany Devletler Estados + 현재 상태 Player Fatal Injuries Lesões Fatais do Jogador プレイヤーの致命傷 玩家致命傷 + 玩家致命伤 Décès si blessure mortelle (joueurs) Smrtelná zranění hráčů Śmiertelne Obrażenia Gracza @@ -28,12 +31,14 @@ Tödliche Spielerverletzungen Смертельные травмы игрока Heridas mortales del jugador + 플레이어 중태 Controls when players can receive fatal injuries. A fatal injury is caused by significant damage to the head or torso. Controla quando os jogadores podem receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco. プレイヤーが致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。 控制當玩家受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。 + 控制当玩家受致命伤时是否能救起。致命伤是指对头部或躯干遭受重大伤害。 Détermine si les joueurs décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur. Oyuncuların ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafaya veya vücuda önemli hasar verir. Nastavuje zda hráči mohou utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu. @@ -42,12 +47,14 @@ Legt fest, wann Spieler tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Torso verursacht. Определяет, могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища. Controla cuándo los jugadores pueden sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. + 플레이어가 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다. AI Fatal Injuries Lesões Fatais da IA AI の致命傷 AI致命傷 + AI 致命伤 Décès si blessure mortelle (IA) Smrtelná zranění AI Śmiertelne obrażenia AI. @@ -56,12 +63,14 @@ Tödliche KI-Verletzungen Смертельные травмы ИИ Heridas mortales IA + 인공지능 중태 Controls when AI can receive fatal injuries. A fatal injury is caused by significant damage to the head or troso.\nWhen set to "Always", this effectively produces "AI Instant Death" behaviour as AI will immediately die from any fatal injury.\nNOTE: Any mode other than "Always" requires AI Unconsciousness to be enabled. Controla quando a IA pode receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco.\nQuando definido para "Sempre", isso efetivamente causa a "Morte Instantânea da IA", pois a IA irá imediatamente morrer para qualquer lesão fatal.\nNOTA: Qualquer opção além de "Sempre" requer que Inconsciência de IA esteja ativada. AI が致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。\n"常に"に設定されていると、いかなる致命傷でも "AI の即死" 効果が生まれます。\n注: "常に"以外のモードでは AI の無意識化を有効化させる必要があります。 控制當AI受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。\n當設置為"總是"時,這會使其與"AI 瞬間死亡"同一個效果,在AI受到致命傷時瞬間死亡。\n備註:選了"總是"以外的選項的話必須開啟「AI無意識」的選項。 + 控制当 AI 受致命伤时是否能救起。致命伤是指对头部或躯干遭受重大伤害。\n当设置为"总是"时,这将有效地产生"AI 即时死亡"行为,因为 AI 将立即死于任何致命伤。\n注意:"总是"以外的任何模式都需要启用 AI 无意识。 Détermine si les unités IA décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur.\nSi réglé sur "Toujours", cela produit effectivement un comportement de "Mort instantanée" car les unités IA mourront immédiatement de toute blessure mortelle.\nNOTE : Tout mode autre que "Toujours" nécessite l'activation de l'option "Inconscience IA". AI'nın ölümcül yaralanmaları ne zaman alabileceğini kontrol eder. Ölümcül bir yaralanma, kafa veya vücudun önemli hasar görmesinden kaynaklanır. \"Her zaman" olarak ayarlandığında, AI herhangi bir ölümcül yaralanmadan hemen öleceği için bu etkili bir şekilde "AI Anında Ölüm" davranışı üretir.\ NOT: "Her zaman" "Yapay Zeka Bilinci'nin etkinleştirilmesini gerektirir. Nastavuje zda AI může utrpět smrtelné zranění. Smrtelné zranění je utrpěto významným poškozením hlavy nebo trupu.\nPokud je tato možnost nastavena na "Vždy", efektivně nastává stav "Povolit okamžitou smrt AI", protože AI okamžitě zemře při jakémkoliv smrtelném zranění.\nPOZNÁMKA: Jakýkoliv jiný stav než "Vždy" potřebuje zapnutou možnost "Bezvědomí AI". @@ -70,6 +79,7 @@ Legt fest, wann KI-Einheiten tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Körper verursacht.\nWenn "Immer" eingestellt ist, erzeugt diese Einstellung das "KI Sofort-Tod" Verhalten. KI-Einheiten sterben sofort durch jede tödliche Verletzung.\nBEACHTE: Eine andere Einstellung als "Immer" bedingt, dass "KI-Bewusstlosigkeit" verwendet wird. Определяет могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища.\nКогда установлено «Всегда», это вызывает поведение «Мгновенной смерти ИИ», так как ИИ немедленно умрет от любой смертельной травмы.\nПРИМЕЧАНИЕ: Любой режим, кроме «Всегда», требует включения функции «Потеря сознания». Controla cuándo la IA puede sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. \n Cuando se establece en "Siempre", esto produce efectivamente un comportamiento de "Muerte instantánea de IA", ya que la IA morirá inmediatamente por cualquier lesión fatal. \n NOTA: Cualquier modo que no sea "Siempre" requiere que la inconsciencia de la IA esté habilitada. + 인공지능이 언제 중태로 빠질 지 결정합니다. 중태는 머리나 몸통에 심각한 피해를 입는 경우 발생합니다.\n "언제나"로 설정하면 "인공지능 즉사" 기능이 즉각 적용됩니다.\n 참고: "언제나"를 제외한 다른 모드는 인공지능의 기절이 활성화가 필요합니다. AI Unconsciousness @@ -84,7 +94,7 @@ Incoscienza IA AI の気絶 인공지능 기절 - AI无意识 + AI 无意识 AI無意識 Yapay Zeka Bilinci @@ -93,6 +103,7 @@ Controla se a IA pode ficar inconsciente ao invés de morrer imediatamente.\nEssa configuração funciona com "Lesões Fatais de IA", pois para uma unidade ter uma parada cardíaca é necessário que a IA possa fica inconsciente.\nContudo, essas configurações são separadas pois unidades podem ficar inconscientes por vitais críticos causados por ferimentos não-fatais.\nEssencialmente, isso significa que para ativar uma parada cardíaca em IA, essa configuração precisa estar ativa. AI が即死する代わりに気絶するかどうかを決定できます。\nこれは "AI の致命傷" 設定と連動します。これは AI の進呈しを起こすにはユニットが気絶する必要がある為です。\nしかしながら、これらの設定はユニットが非致死性の負傷により重体となって気絶できるよう分離されています。\n本質的にはこの設定は AI ユニットの心停止を可能にするものであり、有効化されておくべきです。 控制AI是否能進入無意識狀態而非立刻原地死亡。\n這個選項會與「AI致命傷」的選項聯動,使單位心搏停止的話必須先讓其無意識。\n然而,兩個設定分開之原因是使單位能因從非致命傷的攻擊情況下進入生命危險的狀態。\n簡單來說,你想要讓AI單位有心搏停止可能的話,該選項必須啟用。 + 控制 AI 是否可以进入昏迷状态而不是立即死亡。\n这个设置与"AI 致命伤"设置一起工作,因为进入心脏骤停需要单位能够昏迷。\n然而,这些设置是分开的,因为单位可能会因非致命伤害导致的关键生命体征而昏迷过去。\n从本质上讲,这意味着为了使 AI 单位的心脏骤停,必须启用此设置。 Définit si les unités IA peuvent perdre connaissance au lieu de mourir immédiatement.\nCe paramètre fonctionne conjointement avec l'option "Décès si blessure mortelle (IA)" car, pour qu'une unité IA subisse un arrêt cardiaque, elle doit également pouvoir perdre connaissance.\nCependant, ces paramètres sont séparés car les unités peuvent s'évanouir suite à des signes vitaux critiques résultant de blessures non mortelles.\nEn résumé, cela signifie que ce paramètre doit absolument être activé pour qu'une unité IA puisse entrer en état d'arrêt cardiaque. Nastavuje zda AI může upadnout do bezvědomí namísto okamžité smrti.\nToto nastavení funguje společně s "Smrtelná zranění AI" protože srdeční zástava potřebuje možnost upadnout do bezvědomí.\nTyto možnosti jsou separované, protože jednotky mohou upadnout do bezvědomí kvůli kritickému stavu způsobenému ne smrtelnými zraněními.\nV podstatě to znamená, že pokud chcete zapnout srdeční zástavu pro AI, tato možnost musí být zapnutá. Definiuje, czy AI może stracić przytomność zamiast natychmiast zginąć.\n Ta opcja działa razem z ustawieniem "Śmiertelne urazy AI", ponieważ przejście do zatrzymania akcji serca wymaga, aby jednostka mogła stracić przytomność.\n Jednak te ustawienia są rozdzielone, ponieważ jednostki mogą stracić przytomność z powodu krytycznych czynności życiowych powstałych w wyniku urazów innych niż śmiertelne.\n W istocie oznacza to, że aby umożliwić zatrzymanie akcji serca dla jednostek AI, to ustawienie musi być włączone. @@ -101,6 +112,7 @@ Управляет тем, может ли ИИ потерять сознание, вместо того, чтобы немедленно умереть.\nЭтот параметр работает вместе с параметром «Смертельные раны ИИ», поскольку при остановке сердца требуется, чтобы юнит мог потерять сознание.\nОднако эти настройки разделены, потому что юниты могут потерять сознание из-за критических ранений жизненно важных органов, полученных в результате несмертельных травм.\nВ сущности, это означает, что для включения остановки сердца для ИИ этот параметр должен быть включен. Yapay zekanın hemen ölmek yerine bilinçsiz duruma geçip geçemeyeceğini kontrol eder. \ Bu ayar, "Yapay Zeka Ölümcül Yaralanmalar" ayarı ile birlikte çalışır, çünkü kalp durması, ünitenin bilinçsiz duruma geçebilmesini gerektirir. \ Özünde, bunun anlamı şudur: AI birimleri için kalp durmasını etkinleştirirseniz, bu ayar etkinleştirilmelidir. Controla si la IA puede quedar inconsciente en lugar de morir de inmediato. \n Esta configuración funciona junto con la configuración de "Heridas mortales IA", ya que, sufrir un paro cardíaco requiere que la unidad pueda quedar inconsciente. \n Sin embargo, estas configuraciones están separadas porque las unidades pueden perder el conocimiento de los signos vitales críticos como resultado de lesiones no mortales. \n En esencia, esto significa que para habilitar el paro cardíaco en las unidades de IA, esta configuración debe estar habilitada. + 인공지능이 즉사하기보다 기절하는걸 설정합니다.\n이 기능은 "인공지능 중태" 기능과 같이 사용시 심정지를 구현합니다. Cardiac Arrest Time @@ -110,11 +122,13 @@ Durée de l'arrêt cardiaque Tempo de Parada Cardíaca 心搏停止時間 + 心脏骤停时间 Tempo d'arresto cardiaco Délka srdeční zástavy Czas Zatrzymania Akcji Serca Kalp Durma Süresi Tiempo de paro cardíaco + 심정지 시간 Controls how long it takes to die from cardiac arrest. @@ -123,12 +137,14 @@ Контролирует, сколько времени требуется, чтобы умереть от остановки сердца. Controla o tempo necessário para morrer para uma parada cardíaca. 控制心搏停止後多久死亡 + 控制心脏骤停后多久单位死亡 Controlla quanto tempo ci vuole per morire di arresto cardiaco. Nastavuje po jak dlouhé době pacient zemře kvůli srdeční zástavě. Definiuje czas potrzebny na śmierć z powodu zatrzymania akcji serca. Bestimmt die Dauer bis zum Tod durch Herzstillstand. Ne kadar süre de kalbi durarak ölmesini belirleyin. Controla cuanto tiempo dura el paro cardiaco antes de morir. + 심정지 후 얼마나 지나야 죽는지 결정합니다. In Cardiac Arrest @@ -138,11 +154,13 @@ Provoquer un arrêt cardiaque Em Parada Cardíaca 心搏停止中 + 心脏骤停中 In arresto cardiaco V srdeční zástavě Zatrzymanie Akcji Serca Kalbi Durdu En parada cardíaca + 심정지가 옴 Bleedout During Cardiac Arrest @@ -152,6 +170,8 @@ 心停止中の失血 Desangrado durante parada cardíaca Wykrwawienie podczas zatrzymanej akcji serca + 心脏骤停期间失血情况 + 심정지 중 출혈 Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out. @@ -161,6 +181,8 @@ 心停止時間を超え死亡する前に、失血による心停止で死亡するかどうかを決定します。 COntrola si una persona puede morir en parada cardíaca por causa de pérdida de sangre antes de que se termine el contador de parada cardíaca Kontroluje czy śmierć osoby może nastąpić poprzez wykrwawienie zanim wyczerpię się Czas Zatrzymania Akcji Serca. + 控制单位是否会在心脏骤停时间耗完之前因失血过多而死亡。 + 지정한 심정지 시간이 다 되기 전에 출혈로 인해 사망할 수 있는 지를 결정합니다. diff --git a/addons/medical_status/functions/fnc_handleKilled.sqf b/addons/medical_status/functions/fnc_handleKilled.sqf index a78c82bf55..f2b253cf3e 100644 --- a/addons/medical_status/functions/fnc_handleKilled.sqf +++ b/addons/medical_status/functions/fnc_handleKilled.sqf @@ -30,20 +30,22 @@ if (_unit isEqualTo (_unit getVariable [QGVAR(killed), objNull])) exitWith { _unit setVariable [QGVAR(killed), _unit]; private _causeOfDeath = _unit getVariable [QEGVAR(medical,causeOfDeath), "#scripted"]; +private _modifyKilledArray = missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]; // getVar so this can be disabled -// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect) +// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect, forced respawn while conscious) if (_causeOfDeath != "#scripted") then { _killer = _unit getVariable [QEGVAR(medical,lastDamageSource), _killer]; // vehicle _instigator = _unit getVariable [QEGVAR(medical,lastInstigator), _instigator]; // unit in the turret - - // All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator - if (missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]) then { // getVar so this can be disabled - _this set [1, _killer]; - _this set [2, _instigator]; - }; -} else { // in that case, call setDead manually to prevent any issues +} else { + // call setDead manually to prevent any issues [_unit, "#scripted"] call FUNC(setDead); }; + +// All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator +if (_modifyKilledArray) then { + _this set [1, _killer]; + _this set [2, _instigator]; +}; TRACE_3("killer info",_killer,_instigator,_causeOfDeath); if (_unit == player) then { diff --git a/addons/medical_status/functions/fnc_handleKilledMission.sqf b/addons/medical_status/functions/fnc_handleKilledMission.sqf index 67d1f050f4..bf8bd780ba 100644 --- a/addons/medical_status/functions/fnc_handleKilledMission.sqf +++ b/addons/medical_status/functions/fnc_handleKilledMission.sqf @@ -30,16 +30,16 @@ if (_unit isEqualTo (_unit getVariable [QGVAR(killedMission), objNull])) exitWit _unit setVariable [QGVAR(killedMission), _unit]; private _causeOfDeath = _unit getVariable [QEGVAR(medical,causeOfDeath), "#scripted"]; +private _modifyKilledArray = missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]; // getVar so this can be disabled -// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect) +// if undefined then it's a death not caused by ace's setDead (mission setDamage, disconnect, forced respawn while conscious) if (_causeOfDeath != "#scripted") then { _killer = _unit getVariable [QEGVAR(medical,lastDamageSource), _killer]; // vehicle _instigator = _unit getVariable [QEGVAR(medical,lastInstigator), _instigator]; // unit in the turret - - // All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator - if (missionNamespace getVariable [QEGVAR(medical,modifyKilledArray), true]) then { // getVar so this can be disabled - _this set [1, _killer]; - _this set [2, _instigator]; - }; +}; +// All Killed EHs uses the same array, so we can modify it now to pass the correct killer/instigator +if (_modifyKilledArray) then { + _this set [1, _killer]; + _this set [2, _instigator]; }; TRACE_3("killer mission info",_killer,_instigator,_causeOfDeath); diff --git a/addons/medical_status/functions/fnc_initUnit.sqf b/addons/medical_status/functions/fnc_initUnit.sqf index 73ff2ce8b6..1b6c283664 100644 --- a/addons/medical_status/functions/fnc_initUnit.sqf +++ b/addons/medical_status/functions/fnc_initUnit.sqf @@ -75,6 +75,9 @@ if (_isRespawn) then { // Unconscious spontanious wake up chance _unit setVariable [QEGVAR(medical,lastWakeUpCheck), nil]; + + // Cause of death + _unit setVariable [QEGVAR(medical,causeOfDeath), nil]; }; [{ diff --git a/addons/medical_status/functions/fnc_setDead.sqf b/addons/medical_status/functions/fnc_setDead.sqf index 7f41ebf3da..9568974919 100644 --- a/addons/medical_status/functions/fnc_setDead.sqf +++ b/addons/medical_status/functions/fnc_setDead.sqf @@ -6,6 +6,7 @@ * Arguments: * 0: The unit * 1: Reason for death + * 2: Killer * * Return Value: * None @@ -13,8 +14,8 @@ * Public: No */ -params ["_unit", ["_reason", "#setDead"]]; -TRACE_2("setDead",_unit,_reason); +params ["_unit", ["_reason", "#setDead"], ["_instigator", objNull]]; +TRACE_3("setDead",_unit,_reason,_instigator); // No heart rate or blood pressure to measure when dead _unit setVariable [VAR_HEART_RATE, 0, true]; @@ -25,5 +26,22 @@ _unit setVariable [QEGVAR(medical,causeOfDeath), _reason, true]; // Send a local event before death [QEGVAR(medical,death), [_unit]] call CBA_fnc_localEvent; +// Update the state machine if necessary (forced respawn, scripted death, etc) +private _unitState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; +if (_unitState isNotEqualTo "Dead") then { + [_unit, EGVAR(medical,STATE_MACHINE), _unitState, "Dead"] call CBA_statemachine_fnc_manualTransition; +}; + +// (#8803) Reenable damage if disabled to prevent having live units in dead state +// Keep this after death event for compatibility with third party hooks +if !(isDamageAllowed _unit) then { + WARNING_1("setDead executed on unit with damage blocked - %1",_this); + _unit allowDamage true; +}; + // Kill the unit without changing visual apperance -[_unit, 1] call EFUNC(medical_engine,setStructuralDamage); +private _prevDamage = _unit getHitPointDamage "HitHead"; + +_unit setHitPointDamage ["HitHead", 1, true, _instigator]; + +_unit setHitPointDamage ["HitHead", _prevDamage]; diff --git a/addons/medical_status/functions/fnc_setUnconsciousState.sqf b/addons/medical_status/functions/fnc_setUnconsciousState.sqf index 0a10a29a5d..214005f8d4 100644 --- a/addons/medical_status/functions/fnc_setUnconsciousState.sqf +++ b/addons/medical_status/functions/fnc_setUnconsciousState.sqf @@ -9,7 +9,7 @@ * 1: Set unconscious * * Return Value: - * Success + * None * * Example: * [player, true] call ace_medical_status_fnc_setUnconsciousState @@ -21,7 +21,7 @@ params ["_unit", "_active"]; TRACE_2("setUnconsciousState",_unit,_active); // No change to make -if (_active isEqualTo IS_UNCONSCIOUS(_unit)) exitWith { TRACE_2("no change",_active,IS_UNCONSCIOUS(_unit)); }; +if (_active isEqualTo IS_UNCONSCIOUS(_unit) || {!alive _unit}) exitWith { TRACE_2("no change",_active,IS_UNCONSCIOUS(_unit)); }; _unit setVariable [VAR_UNCON, _active, true]; @@ -34,6 +34,9 @@ _unit setVariable [VAR_UNCON, _active, true]; // Block radio on unconsciousness for compatibility with captive module [_unit, "blockRadio", "ace_unconscious", _active] call EFUNC(common,statusEffect_set); +// Block speaking on unconsciousness +[_unit, "blockSpeaking", "ace_unconscious", _active] call EFUNC(common,statusEffect_set); + if (_active) then { // Don't bother setting this if not used if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml index 8f46954596..ed6374c146 100644 --- a/addons/medical_status/stringtable.xml +++ b/addons/medical_status/stringtable.xml @@ -9,11 +9,13 @@ Statut Status 狀態 + 状态 Stato Stav Status Estado Durum + 결과 상태 Bleeding Coefficient @@ -91,11 +93,13 @@ Débit de transfusion IV Velocidade de Transferência de Sangue 點滴輸血流量 + 点滴输血流量 IV Portata della trasfusione Rychlost IV transfuze Natężenie Przepływu Transfuzji IV IV Flujo de transfusión IV Transfüzyon Akış Hızı + 수혈 속도 Controls how quickly fluid flows out of IV Bags. The IV Bag volume change is calculated as:\ntime interval (s) * iv change per second (4.1667 mL/s) * flow rate (this coefficient). @@ -105,11 +109,13 @@ Définit la vitesse à laquelle le liquide s'écoule des poches de perfusion.\nLa variation du volume de poche IV est calculée selon la formule suivante :\n intervalle de temps (s) * variation IV par seconde (4,1667 ml/s) * débit (ce coefficient). Controla o quão rápido flúidos são extraídos de bolsas de IV. A mudança no volume da bolsa d IV é calculado assim:\nIntervalo de tempo (s) * mudança de iv por segundo (4.1667 mL/s) * Velocidade de transferência (esse valor) 控制從點滴輸入人體的液體流量多快。點滴的體積更改是以\n時間間隔(單位秒)乘上點滴每秒速度(4.1667毫升/秒)乘上流量(該係數)。 + 控制从点滴输入人体的液体流量多快。静脉输液袋容积变化的计算方法是:\n时间间隔(秒)x点滴每秒速度(4.1667毫升/秒)x流量(该系数)。 Controlla la velocità con cui il fluido esce dalle sacche per flebo. La variazione di volume delle sacche IV è calcolata come:\intervallo di tempo (s) * variazione iv al secondo (4,1667 mL/s) * portata (questo coefficiente). Nastavuje jak rychle tekutiny vytékají z IV sáčku. Zbývající objem IV sáčku je vypočítáván následovně:\nčasový interval (s) * změna iv za sekundu (4,1667 mL/s) * rychlost toku (tento koeficient). Kontroluje, jak szybko płyn wypływa z worków IV. Zmiana objętości worka IV jest obliczana jako:\n przedział czasowy * zmiana iv na sekundę (4,1667 mL/s) * natężenie przepływu (ten współczynnik). Controla la rapidez con que fluye el líquido de las bolsas intravenosas. El cambio de volumen de la bolsa IV se calcula como: \n intervalo (s) de tiempo * cambio iv por segundo (4.1667 mL/s) * velocidad de flujo (este coeficiente). IV Torbalardan sıvının ne kadar hızlı aktığını kontrol eder. IV Torba hacim değişikliği şu şekilde hesaplanır: zaman aralıkları iv saniye başına değişim (4.1667 mL / s) akış hızı (bu katsayı). + 수액용기에서 얼마나 빨리 들어가는 지를 정합니다. 초당 4.16ml * 계수를 적용받습니다. diff --git a/addons/medical_treatment/CfgVehicles.hpp b/addons/medical_treatment/CfgVehicles.hpp index 876078d484..5036750fab 100644 --- a/addons/medical_treatment/CfgVehicles.hpp +++ b/addons/medical_treatment/CfgVehicles.hpp @@ -328,4 +328,14 @@ class CfgVehicles { MACRO_ADDITEM(ACE_bodyBag,5); }; }; + + class Van_02_base_F; + class Van_02_medevac_base_F: Van_02_base_F { + GVAR(patientSeats)[] = {3,4}; + }; + + class Heli_Transport_04_base_F; + class O_Heli_Transport_04_medevac_F: Heli_Transport_04_base_F { + GVAR(patientSeats)[] = {0,1,2}; + }; }; diff --git a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf index 0a1c498d41..3484811a32 100644 --- a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf +++ b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf @@ -20,6 +20,11 @@ TRACE_1("fullHealLocal",_patient); if (!alive _patient) exitWith {}; +// check if on fire, then put out the fire before healing +if ((["ace_fire"] call EFUNC(common,isModLoaded)) && {[_patient] call EFUNC(fire,isBurning)}) then { + _patient setVariable [QEGVAR(fire,intensity), 0, true]; +}; + private _state = GET_SM_STATE(_patient); TRACE_1("start",_state); diff --git a/addons/medical_treatment/functions/fnc_loadUnit.sqf b/addons/medical_treatment/functions/fnc_loadUnit.sqf index 8b556014e1..91656c3c19 100644 --- a/addons/medical_treatment/functions/fnc_loadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_loadUnit.sqf @@ -32,7 +32,13 @@ if (_patient call EFUNC(medical_status,isBeingDragged)) then { [_medic, _patient] call EFUNC(dragging,dropObject); }; -private _vehicle = [_medic, _patient, _vehicle] call EFUNC(common,loadPerson); +private _vehicle = [ + _medic, + _patient, + _vehicle, + getArray (configOf _vehicle >> QGVAR(patientSeats)), + ([configOf _vehicle >> QGVAR(patientReverseFill), "NUMBER", 1] call CBA_fnc_getConfigEntry) > 0 +] call EFUNC(common,loadPerson); if (isNull _vehicle) exitWith { TRACE_1("no vehicle found",_vehicle); }; diff --git a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf index 3154107e01..87de5f3542 100644 --- a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf +++ b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf @@ -31,7 +31,7 @@ if (!local _patient) exitWith { if (alive _patient) then { TRACE_1("Manually killing with setDead",_patient); - [_patient, "buried_alive"] call EFUNC(medical_status,setDead); + [_patient, "buried_alive", _medic] call EFUNC(medical_status,setDead); }; private _position = (getPosASL _patient) vectorAdd [0, 0, 0.2]; diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index befe21cfeb..5d1dbf53c1 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -9,11 +9,13 @@ Traitement Tratamento 治療 + 治疗 Trattamento Léčba Leczenie Tedavi Tratamiento + 치료 Litter @@ -22,12 +24,14 @@ Медицинский мусор Lixo 醫療用廢棄物 + 医疗废弃物 Rifiuti Odpadky Śmieci Abfall Cöp Basura + 의료폐기물 Advanced Diagnose @@ -37,11 +41,13 @@ Diagnostic avancé Diagnóstico Avançado 進階診斷 + 进阶诊断 Diagnosi avanzata Pokročilá diagnóza Zaawansowana Diagnoza Gelişmiş Teşhis Diagnóstico avanzado + 고급 진료 Enables the Check Pulse, Check Blood Pressure, and Check Response treatment actions instead of the generic Diagnose action.\nWhen disabled, the CPR action will only be shown when performing CPR is appropriate.\nThe actions this setting enables are needed to determine whether a person is unconscious or in cardiac arrest. @@ -50,12 +56,14 @@ Включает действия «Проверить пульс», «Проверить давление» и «Проверить реакцию» вместо общего действия «Диагностика». Ativa as opções de Verificar Pulso, Verificar Pressão Sanguínea e Verificar Resposta, ao invés do diagnóstico geral. 啟用檢查脈搏、血壓以及病患反應的動作而非一般的診斷動作。\n當停用時,CPR只會在需要時出現。\n當這個選項啟用時必須診斷病患是否無意識或者心搏停止。 + 启用后,可以检查脉搏、血压和反应治疗,而不是通用诊断。\n禁用时,心肺复苏操作将仅在适当时显示。\n此设置操作启用后必须需要先确定一个人是失去知觉还是心脏骤停。 Abilita le azioni di controllo del polso, controllo della pressione sanguigna e controllo della risposta al trattamento invece dell'azione generica Diagnose.\ Se disabilitata, l'azione di RCP sarà mostrata solo quando l'esecuzione della RCP è appropriata.\Le azioni abilitate da questa impostazione sono necessarie per determinare se una persona è in stato di incoscienza o in arresto cardiaco. Povoluje kontrolu srdečního tepu, krevního tlaku a reakce pacienta namísto univerzální diagnózy.\nKdyž je tato možnost vypnuta, CPR akce bude dostupná pouze pokud je vhodné ji provést.\nAkce které tato možnost zapíná jsou nutné k určení zda je pacient v bezvědomí nebo má srdeční zástavu. Włącza opcje sprawdzania Pulsu, Ciśnienia Tętniczego Krwi i Reakcje Na Ból, zamiast bardziej ogólnej akcji Diagnozuj.\n Po wyłączeniu tej opcji akcja RKO będzie wyświetlana tylko wtedy, gdy jej wykonanie będzie odpowiednie.\n Opcja, która włącza to ustawienie jest potrzebna do ustalenia, czy osoba jest nieprzytomna lub ma zatrzymanie krążenia. Ermöglicht die 'Überprüfe Puls', 'Überprüfe Blutdruck' und 'Überprüfe Reaktionen' Behandlungsaktionen anstatt der einfachen 'Diagnose' Behandlungsaktion.\nWenn diese Einstellung nicht aktiviert ist, wird die "HLW"-Aktion nur angezeigt, wenn die Anwendung von HLW angemessen ist.\nDie Aktionen, die das Aktivieren dieser Einstellung ermöglicht, werden benötigt um zu bestimmen, ob eine Person bewusstlos ist oder einen Herzstillstand erleidet. Genel Teşhis eylemi yerine Nabzı Kontrol Et, Kan Basıncını Kontrol Et ve Yanıtı Kontrol Et tedavi eylemlerini etkinleştirir. \ Devre dışı bırakıldığında, CPR eylemi yalnızca CPR gerçekleştirilmesi uygun olduğunda gösterilecektir. Habilita la comprobación del pulso, presión sanguinea y rsepuesta a las acciones del tratamiento en lugar de la acción de diagnóstico genérico. \n Cuando se deshabilita, la acción RCP solo se mostrará cuando realizar un RCP sea apropiado. \n Las acciones activadas de este ajuste son necesarias para determinar si una persona está inconsciente o en parada cardiaca. + 맥박 확인, 혈압 확인, 반응 확인 등의 일반적인 진료행위를 추가합니다. \n 비활성화시 심폐소생술은 가능 할때만 표시됩니다. \n 해당 옵션은 인원이 기절한건지 아니면 심정지가 왔는지 구분할 때 쓰입니다. Enabled & Can Diagnose Death/Cardiac Arrest @@ -64,6 +72,8 @@ 死亡/心停止状態でも診断許可 Включено & Может диагностировать смерть/остановку сердца Aktiviert & kann Tod/Herzstillstand diagnostizieren + 已启用 & 可以诊断死亡/心搏骤停 + 활성화 및 사망/심정지 진찰가능 Advanced Medication @@ -73,11 +83,13 @@ Médication avancée Medicação Avançada 進階醫療用品 + 进阶医疗用品 Pokročilé léky Medicazione avanzata Zaawansowane leki Gelişmiş Ilaç Medicación avanzada + 고급 약물 Enables extended, more in-depth medication handling. Also, enables the use of Adenosine. @@ -86,11 +98,13 @@ Permet une manipulation étendue et plus approfondie des médicaments.\nEn outre, permet l'utilisation d'adénosine. Ativa a manipulação avançada de medicações. Também permite o uso de Adenosina e Atropina. 是否擴展藥物管控使其更深度化。並且,啟用腺苷以及阿托品的使用次數 + 可以扩展、更深入地使用药物。同时,能够使用腺苷以及阿托品。 Povoluje hlubší a rozšířené zacházení s léčivy. Také aktivuje Adenosin a Atropin. Abilita una gestione della medicazione più estesa e approfondita. Permette inoltre l'utilizzo dell'Adenosina. Ermöglicht erweiterte, mehr tiefgründigere Anwendung von Medikationen. Ebenso ermöglicht es die Benutzung von Adenosin. Pozwala na zaawansowane uzycie leków. Pozwala na używanie Adenozyny. Habilita el manejo de la medicación más avanzada y en profundidad. Tambien permite el uso de Adenosina. + 더욱 더 확장된, 깊은 약물 치료를 활성화합니다. 또한 아데노신 기능을 활성화합니다. Advanced Bandages @@ -100,11 +114,13 @@ Pansements avancés Ataduras Avançadas 進階包紮 + 进阶包扎 Bendaggi avanzati Pokročilé obvazy Zaawansowane Bandaże Gelişmiş Bandajlar Vendaje avanzado + 고급 붕대 Enables treatment actions for different bandage types instead of the generic Bandage action.\nAdditionally, the reopening of bandaged wounds can also be enabled. @@ -114,11 +130,13 @@ Включает действия для разных типов повязок, вместо общего действия «Перевязка». Ativa o uso de tipos diferentes de ataduras ao invés de apenas a atadura básica. 啟用不同繃帶的可用行為而非一般包紮動作。 + 启用不同绷带类型的治疗操作,而不是通用的绷带操作。\n此外,也可以启用包扎伤口开裂。 Permette azioni di trattamento per diversi tipi di bendaggio al posto del bendaggio generico. Povoluje specifické obvazy s různými vlastnostmi namísto jednoho univerzálního obvazu. Umożliwia wybranie konkretnego rodzaju bandaża zamiast ogólnej akcji bandażowania. Genel Bandaj eylemi yerine farklı bandaj türleri için tedavi eylemlerini etkinleştirir. \ Ek olarak, bandajlı yaraların yeniden açılması da etkinleştirilebilir. Habilita las acciones de ttratamiento para distintos tipos de vendajes en lugar de la acción de vendaje genérico + 붕대마다 조금씩 다른 차이를 둬 상황에 알맞는 붕대를 쓰게 합니다.\n또한 붕대 풀림을 구현합니다. Enabled & Can Reopen @@ -130,6 +148,8 @@ Etkinleştirildi ve Yeniden Açılabilir Habilitada y pueden reabrirse Aktiviert und können sich wieder öffnen + 已启用 & 可以伤口开裂 + 활성화 및 붕대 풀림 구현 Wound Reopening Coefficient @@ -141,6 +161,8 @@ 再開放係数 Yara Yeniden Açılma Katsayısı Coeficiente de reapertura de heridas + 伤口开裂系数 + 붕대 풀림 계수 Coefficient for controlling the wound reopening chance. The final reopening chance is determined by multiplying this value with the specific reopening chance for the wound type and bandage used. @@ -152,6 +174,8 @@ 傷が再開放する確率の係数を設定できます。再開放は、この数値と傷の種類、そして使用した包帯に応じて左右されます。 Yaranın yeniden açılma şansını kontrol etme katsayısı. Son yeniden açılma şansı, bu değerin kullanılan yara tipi ve bandaj için spesifik yeniden açılma şansı ile çarpılmasıyla belirlenir. Coeficiente que controla la probabilidad de reapertura de heridas. La probabilidad final de reapertura de heridas queda determinada multiplicando este valor por la probabilidad específica del tipo de herida y venda usada. + 用于控制伤口开裂概率的系数。最终的重开放概率=该值x伤口类型x所使用的绷带的具体开裂概率。 + 붕대가 풀리는 기회 계수를 정합니다. 최종 붕대 풀림 계수는 상처의 종류와 쓰인 붕대의 합의 결과에 계수를 곱한 결과입니다. Clear Trauma @@ -160,6 +184,8 @@ Очистить рану Traumata entfernen Leczenie ran + 清理创伤 + 상처 제거 Controls when hitpoint damage from wounds is healed. @@ -168,6 +194,8 @@ Определяет, когда исцеляется урон от ран. Steuert, wann Trefferpunktschaden von Wunden geheilt wird. Kontroluje kiedy punkty obrażeń od odniesionych ran są w pełni wyleczone. + 控制伤口治疗后确定受伤部位的受伤情况。 + 상처가 언제 제거되는 지를 결정합니다. After Bandage @@ -176,6 +204,8 @@ После перевязки Nach dem Bandagieren Po zabandażowaniu + 包扎后 + 붕대 묶은 후 After Stitch @@ -184,6 +214,8 @@ После наложения швов Nach dem Nähen Po zszyciu + 缝合后 + 상처 봉합 후 Boost medical training when in medical vehicles or facilities. Untrained becomes medic, medic becomes doctor. @@ -192,12 +224,14 @@ Увеличивает уровень медподготовки при нахождении в медицинской технике или госпитале. Неподготовленный становится Медиком, Медик становится Доктором. Aumenta a qualidade do tratamento quando dentro de veículos ou instalações médicas. Destreinados se tornam médicos, médicos se tornam doutores. 在醫療設施或者載具旁時增加醫療能力。未受訓練的將會成為醫療兵,醫療兵將會成為軍醫。 + 在医疗设施或载具旁时提升医疗训练。未受训练者将会成为医疗兵,医疗兵将会晋升为军医。 Aumentare la formazione medica quando si è in veicoli o strutture mediche. Se non addestrato diventa medico, il medico diventa dottore. Zvyšuje zdravotnickou úroveň v zdravotnických objektech a vozidlech. Nevycvičení se stávají mediky a medici se stávají doktory. Zwiększ wyszkolenie medyczne w pojazdach lub obiektach medycznych. Niewytrenowana jednostka zostaje medykiem, medyk zostaje lekarzem. Verbessere 'Fähigkeiten-Level' in medizinischen Fahrzeugen oder Einrichtungen. Untrainiert wird zu Sanitäter, Sanitäter wird zu Arzt. Tıbbi araçlar veya tesislerdeyken tıbbi müdaheleyi artırın. Eğitimsizler sıhhiye olur, sıhhiyeler doktor olur. Aumente la formación médica cuando se encuentre en vehículos o instalaciones médicas. Sin entrenamiento se convierte en médico, médico se convierte en médico. + 의료 차량이나 시설 주위에 있으면 의료 수준을 높입니다. 의무병이 아닌 사람은 의무병이 되고, 의무병은 군의관이 됩니다. Allow Shared Equipment @@ -206,12 +240,14 @@ Разрешить общие медикаменты Permitir Compartilhar Itens Médicos 允許共享設備 + 允许共享装备 Consentire la condivisione di attrezzature Povolit sdílení vybavení Zezwalaj na współdzielenie sprzętu Erlaube geteilte Ausrüstung Paylaşılan Ekipmana İzin Ver Permite compartir material médico. + 의료물자 공유 Controls whether medical equipment can be shared between the patient and the medic. @@ -220,12 +256,14 @@ Контролирует, можно ли разделить медикаменты между пациентом и врачом. Controla se um item médico pode ser compartilhado entre médico e paciente. 控制是否病患與醫療兵之間能否共享醫療物資 + 控制伤员和医疗兵之间是否可以共享医疗装备。 Controlla se le attrezzature mediche possono essere condivise tra il paziente e il medico. Nastavuje zda jak je zdravotnické vybavení sdíleno mezi medikem a pacientem. Kontroluje, czy sprzęt medyczny ma być dzielony między pacjentem a medykiem. Legt fest, ob medizinische Ausrüstung zwischen Patient und Sanitäter geteilt werden kann. Tıbbi ekipmanın hasta ve sağlık görevlisi arasında paylaşılıp paylaşılamayacağını kontrol eder. Controla si el equipo médico se puede compartir entre el paciente y el médico. + 환자와 치료자간에 의료물자를 공유할 지를 결정합니다. Patient's Equipment First @@ -234,12 +272,14 @@ Сначала медикаменты пациента Usar do Paciente Primeiro 優先使用患者的醫療物資 + 优先消耗伤员装备 L'attrezzatura del paziente prima di tutto Prvně pacientovo vybavení Najpierw sprzęt pacjenta Ausrüstung des Patienten zuerst Önce Hastanın Ekipmanı Usar equipo médico del paciente en primer lugar. + 환자의 의료물자 먼저 사용 Medic's Equipment First @@ -248,12 +288,14 @@ Сначала медикаменты врача Usar do Médico Primeiro 優先使用醫療兵的醫療物資 + 优先消耗医疗兵装备 Prima le attrezzature mediche Prvně medikovo vybavení Najpierw sprzęt medyka Ausrüstung des Sanitäters zuerst İlk Sıhhiyenin Ekipmanı Usar equipo médico del santiario en primer lugar. + 치료자의 의료물자 먼저 사용 Autoinjector Treatment Time @@ -263,6 +305,8 @@ Время ввода автоинъектора Czas aplikacji autostrzykawki Behandlungszeit des Autoinjektors + 自动注射器治疗时间 + 주사기 사용 시간 Time, in seconds, required to administer medication using an autoinjector. @@ -272,6 +316,8 @@ Время, необходимое для введения медикаментов автоинъектором (в секундах). Czas w sekundach potrzebny do aplikacji medykamentów za pomocą autostrzykawki. Zeit in Sekunden, die benötigt wird, um Medikamente mittels Autoinjektor zu verabreichen. + 使用自动注射器给药所需的时间(秒) + 초 단위로 주사기를 사용하는데 걸리는 시간을 정합니다. Tourniquet Treatment Time @@ -281,6 +327,8 @@ Tiempo de tratamiento de torniquete Время наложения/снятия жгута Czas aplikacji stazy + 止血带治疗时间 + 지혈대 사용 시간 Time, in seconds, required to apply/remove a tourniquet. @@ -290,6 +338,8 @@ Tiempo, en segundos, requerido para aplicar/quitar un torniquete. Время, необходимое для наложения/снятия жгута (в секундах). Czas w sekundach potrzebny do założenia/zdjęcia stazy. + 使用/移除止血带所需的时间(秒) + 초 단위로 지혈대를 사용/제거하는 데 걸리는 시간을 정합니다. IV Bag Treatment Time @@ -299,6 +349,8 @@ Tiempo de tratamiento de bolsa de IV Время применения пакета внутривенного переливания Czas aplikacji IV + 静脉输液袋治疗时间 + 수액용기 사용 시간 Time, in seconds, required to administer an IV bag. @@ -308,6 +360,8 @@ Tiempo, en segundos, requerido para administrar una bolsa de IV. Время, необходимое для применения пакета внутривенного переливания (в секундах). Czas w sekundach potrzebny na aplikację transfuzji IV. + 使用静脉输液所需的时间(秒) + 초 단위로 수액용기를 사용하는 데 걸리는 시간을 정합니다. Splint Treatment Time @@ -317,6 +371,8 @@ TIempo de tratamiento de férula Время наложения шины Czas aplikacji szyny + 夹板治疗时间 + 부목 사용 시간 Time, in seconds, required to apply a splint. @@ -326,6 +382,8 @@ TIempo, en segundos, requerido para aplicar una férula. Время, необходимое для наложения шины (в секундах). Czas w sekundach potrzebny na aplikację szyny. + 使用夹板所需的时间(秒) + 초 단위로 부목을 사용하는데 걸리는 시간을 정합니다. Body Bag Use Time @@ -335,6 +393,8 @@ TIempo de uso de bolsa para cuerpos Время использования мешка для трупов Czas użycia worka na ciało + 尸袋使用时间 + 시체 운반용 부대 사용 시간 Time, in seconds, required to put a patient in a body bag. @@ -344,6 +404,8 @@ Tiempo, en segundos, requerido para poner a un paciente en una bolsa para cuerpos. Время, необходимое для того чтобы упаковать труп в мешок (в секундах). Czas w sekundach potrzebny na spakowanie ciała do worka na ciało. + 装入裹尸袋时间 + 초 단위로 시체 운반용 부대를 사용하는데 걸리는 시간을 정합니다. Allow Epinephrine @@ -356,7 +418,7 @@ Permitir Epinefrina Разрешить Адреналин アドレナリンの許可 - 에피네프린 활성화 + 에피네프린 사용 허가 允许使用肾上腺素 允許使用腎上腺素 Epinefrine izin ver @@ -368,12 +430,14 @@ Уровень подготовки, необходимый для использования Адреналина. É necessária uma qualificação médica para usar epinefrina. 要受過何種程度的醫療訓練才可以使用腎上腺素 + 使用肾上腺素所需的医疗水平。 Livello di addestramento richiesto per usare l'Epinefrina. Úroveň výcviku pro použití epinefrinu Poziom wyszkolenia wymagany do korzystania z epinefryny. 'Fähigkeiten-Level', das benötigt wird, um Epinephrin zu nutzen. Epinefrin kullanmak için gerekli eğitim seviyesi. Nivel de entrenamiento médico requerido para usar Epinefrina. + 에피네프린을 사용하는데 필요한 등급을 정합니다. Locations Epinephrine @@ -398,12 +462,14 @@ Контролирует, где можно использовать Адреналин. Controla onde Epinefrina pode ser utilizada. 控制何處能使用腎上腺素 + 控制何地能使用肾上腺素。 Controlli dove si può usare l'Epinefrina. Nastavuje kde může být epinefrin použit Kontroluje, gdzie można stosować epinefrynę. Legt fest, wo Epinephrin genutzt werden kann. Epinefrinin nerelerde kullanılabileceğini kontrol eder Controla donde puede sr usada la Epinefrina. + 에피네프린을 사용할 수 있는 장소를 정합니다. Allow PAK @@ -417,7 +483,7 @@ Elsősegélycsomag engedélyezése Consenti Kit di Pronto Soccorso 応急処置キットの許可 - 개인응급키트 활성화 + 개인응급키트 사용 허가 允许使用个人急救包 允許使用個人急救包 PAK'a izin ver @@ -429,12 +495,14 @@ Уровень подготовки, необходимый для использования Аптечки. É necessária uma qualificação médica para usar KPS 要受過何種程度的醫療訓練才可以使用個人急救包 + 使用个人急救包所需的医疗水平。 Livello di formazione richiesto per l'utilizzo di un PAK. Úroveň výcviku pro použití osobní lékárničky (PAK). Poziom wyszkolenia wymagany do korzystania z apteczek osobistych. 'Fähigkeiten-Level', das benötigt wird, um ein Erste-Hilfe-Set zu nutzen. PAK kullanmak için gerekli eğitim seviyesi. Nivel de entrenamiento requerido para usar EPA + 개인응급키트을 사용하는 데 필요한 등급을 정합니다. Locations PAK @@ -460,12 +528,14 @@ Контролирует, где можно использовать Аптечку. Controla onde o KPS pode ser utilizado. 控制何處能使用個人急救包 + 控制何地能使用个人急救包。 Controlla dove può essere usato un PAK. Nastavuje kde může být osobní lékárnička (PAK) použita. Kontroluje, gdzie można korzystać z apteczek osobistych. Kontrolliert, wo ein Erste-Hilfe-Set benutzt werden kann. PAK'ın nerelerde kullanılabileceğini kontrol eder Controla donde puede usarse el EPA + 개인응급키트을 사용할 수 있는 장소를 정합니다. Consume PAK @@ -474,12 +544,14 @@ Израсходовать Аптечку KPS Descartável 個人急救包為消耗品 + 个人急救包会被消耗 Consumare PAK Spotřebuj osobní lékárničku (PAK) Zużycie apteczek osobistych Verbrauche Erste-Hilfe-Set PAK Tüketimi Consumir EPA + 개인응급키트 소모 Controls whether a PAK should be consumed after use. @@ -488,18 +560,21 @@ Контролирует, следует ли израсходовать Аптечку после использования. Controla se o KPS deve ser descartado/consumido após o uso. 設定個人急救包是否為消耗品 + 设置个人急救包是否会被消耗 Controlla se un PAK deve essere consumato dopo l'uso. Nastavuje zda má být osobní lékárnička (PAK) spotřebována po použití. Kontroluje, czy apteczka osobista powinna być zużyta po użyciu. Kontrolliert, ob ein Erste-Hilfe-Set nach der Benutzung verbraucht werden soll. Kullanımdan sonra bir PAK tüketilip tüketilmeyeceğini kontrol eder. Controla si se debe consumir un EPA después de su uso. + 개인응급키트가 사용 후 소모되는 지를 결정합니다. Self PAK Usage Utilizzo del kit di pronto soccorso su se stessi Erste-Hilfe-Set Selbstanwendung 自我使用急救包 + 自我使用急救包 Utilisation de la trousse sanitaire sur soi-même Używanie apteczki osobistej na sobie 応急処置キットの自己使用 @@ -507,12 +582,14 @@ Использование аптечки на себе Kendi PAK Kullanımı Usar EPA sobre uno mismo + 개인응급키트 자가 사용 Enables the use of PAKs to heal oneself. Abilita l'utilizzo del kit di pronto soccorso su se stessi. Erlaubt die Benutzung des Erste-Hilfe-Sets, um sich selbst zu heilen. 啟用個人急救包能對自己使用。 + 启用自身能使用个人急救包。 Définit si le joueur peut utiliser la trousse sanitaire pour se soigner lui-même. Pozwala na użycie apteczki osobistej na sobie 応急処置キットを使って、自分を治療できるようにします。 @@ -520,6 +597,7 @@ Позволяют использовать аптечку на себе в одиночку. Kendini iyileştirmek için PAK'ların kullanılmasını sağlar. Habilita el uso de EPA para curarse a uno mismo. + 개인응급키트를 사용자 본인에게 쓸 수 있는 지를 정합니다. Time Coefficient PAK @@ -528,12 +606,14 @@ Контролирует, следует ли израсходовать Аптечку после использования. Coeficiente de Tempo do KPS 個人急救包的時間係數 + 个人急救包时间系数 Coefficiente temporale PAK Časový koeficient pro osobní lékárničku (PAK) Współczynnik czasu apteczek osobistych Zeit-Koeffizient Erste-Hilfe-Set PAK Zaman Katsayısı EPA coheficiente de tiempo + 개인응급키트 사용 시간 Modifies how long a PAK takes to apply.\nThe treatment time is based on the total body part damage multiplied by this coefficient, with a minimum of 10 seconds. @@ -542,12 +622,14 @@ Изменяет быстроту применения Аптечки.\nВремя лечения зависит от общего повреждения частей тела, умноженного на данный коэффициент (минимум 10 сек.). Modifica quanto tempo o KPS leva para ser aplicado.\nO tempo de tratamento é baseado no total de dano do corpo, multiplicado por esse coeficiente, com um mínimo de 10 segundos. 修改個人急救包要使用多久才能完成。\n醫療時間是依照全身的肢體狀況並乘上該係數而決定的,至少十秒。 + 修改个人急救包应用时间。 \n治疗时间=全身的总伤害x该系数,至少十秒。 Il tempo di trattamento si basa sul danno totale della parte del corpo moltiplicato per questo coefficiente, con un minimo di 10 secondi. Upravuje jak dlouho trvá léčba pomocí osobní lékárničky (PAK).\nDoba léčby závisí na celkovém poškození částí těla vynásobeném tímto koeficientem, přičemž minimum je 10 vteřin. Zmienia czas potrzebny na zastosowanie apteczki osobistej.\n Czas leczenia jest oparty na całkowitym uszkodzeniu części ciała pomnożonym przez ten współczynnik, wynosi minimum 10 sekund. Modifiziert, wie lange ein Erste-Hilfe-Set für die Anwendung benötigt.\nDie Behandlungszeit basiert auf der Anzahl des Gesamtkörperschadens multipliziert mit diesem Koeffizienten, mit einen Minimum von 10 Sekunden. Bir PAK'ın uygulanmasının ne kadar süreceğini değiştirir. \ Tedavi süresi, toplam vücut parçası hasarının bu katsayı ile en az 10 saniye çarpımına dayanır. Modifica el tiempo que tarda en aplicarse un EPA. \n El tiempo de tratamiento se basa en el daño total de la parte del cuerpo multiplicado por este coeficiente, con un mínimo de 10 segundos. + 개인응급키트를 사용하는데 걸리는 시간의 계수을 정합니다.\n최소 10초를 기준으로 몸 전체 피해량과 계수를 합산하여 계산합니다. Allow Surgical Kit @@ -556,12 +638,14 @@ Разрешить Хирургический набор Permitir Kit Cirúrgico 允許使用手術包 + 允许使用手术包 Permettere il kit chirurgico Povolit sešívací sadu Ograniczenia Użycia Zestawu Chirurgicznego Erlaube Operations-Set Cerrahi Kitine İzin Ver Permitir kit quirúrjico + 봉합키트 사용 허가 Training level required to use a surgical kit. @@ -570,12 +654,14 @@ Уровень медицинской подготовки, необходимый для использования Хирургического набора. É necessária uma qualificação médica para usar Kit Cirúrgico 要受過多少程度的醫療訓練才能使用手術包。 + 使用手术包所需的医疗水平。 Livello di formazione richiesto per l'utilizzo di un kit chirurgico. Úroveň výcviku pro použití sešívací sady. Poziom wyszkolenia wymagany do korzystania z Zestawu Chirurgicznego. 'Fähigkeiten-Level', das benötigt wird um ein Operations-Set zu nutzen. Cerrahi kit kullanmak için gerekli eğitim seviyesi. Nivel de entrenamiento requerido para usar el kit quirúrgico + 봉합키트를 사용하는데 필요한 등급을 정합니다. Locations Surgical Kit @@ -584,12 +670,14 @@ Места использования Хирургического набора Locais para Kit Cirúrgico 手術包使用地點 + 手术包使用地点 Luoghi Kit chirurgico Nastavuje kde může být sešívací sada použita Miejsca użycia Zestawu Chirurgicznego Orte für Operations-Set Cerrahi Kitin kullanılabileceği yerler Localización de los kits quirúrgicos + 봉합키트 사용 장소 Controls where a surgical kit can be used. @@ -598,12 +686,14 @@ Контролирует, где можно использовать Хирургический набор Controle onde o Kit Cirúrgico pode ser utilizado. 控制何處能使用手術包 + 控制何地能使用手术包 Controlla dove può essere usato un kit chirurgico. Nastavuje zda má být sešívací sada spotřebována po použití. Kontroluje, gdzie można użyć Zestawu Chirurgicznego. Legt fest, wo ein Operations-Set genutzt werden kann. Cerrahi Kitin nerelerde kullanılabileceğini kontrol eder Controla donde puede usarse un kit quirúrgico. + 봉합키트을 사용할 수 있는 장소를 정합니다. Consume Surgical Kit @@ -612,11 +702,13 @@ Израсходовать Хирургический набор Kit Cirúrgico Consumível 手術包為消耗品 + 手术包是否被消耗 Consumare Kit Chirurgico Spotřebuj sešívací sadu Zużycie Zestawów Chirurgicznych Verbrauche Operations-Set Consumir kit quirúrgico + 봉합키트 소모 Controls whether a surgical kit should be consumed after use. @@ -625,11 +717,13 @@ Контролирует, следует ли израсходовать Хирургический набор после использования. Controla se o Kit Cirúrgico deve ser descartado/consumido após o uso. 設定手術包是否為消耗品 + 设置手术包是否使用后会被消耗 Controlla se un kit chirurgico deve essere consumato dopo l'uso. Nastavuje Kontroluje, czy Zestaw Chirurgiczny powinien być zużyty po użyciu. Legt fest, ob ein Operations-Set nach der Anwendung verbraucht werden soll. Controla si un kit quirúrgico debería ser consumido tras su uso + 봉합키트가 사용 후 소모되는 지를 결정합니다. Self Stitching @@ -637,12 +731,14 @@ Auto-Cirurgia 自己縫合 自我縫合 + 自我缝合 Auto cucitura Samo-zašívání Zszywanie własnych ran Selbstnähen Зашивание своей раны Auto cosido + 봉합키트 자가 사용 Enables the use of surgical kits to stitch oneself. @@ -650,12 +746,14 @@ Permite o uso de Kit Cirúrgico em si mesmo. 縫合キットを使い自らを縫合できるようにします。 啟用是否能自己使用手術包來縫合自己的傷口。 + 启用是否能够使用手术包进行自我缝合。 Umožňuje použití sešívací sady na sebe sama. Umożliwia użycie Zestawu Chirurgicznego na sobie. Permette l'uso di kit chirurgici per ricucirsi. Ermöglicht die Benutzung des Operations-Sets, um sich selbst zu nähen. Включает использование хирургического набора на себе. Permite el uso de kits quirúrgicos sobre uno mismo + 봉합키트를 사용자 본인에게 쓸 수 있는지를 정합니다. Wound Stitch Time @@ -665,6 +763,8 @@ Время зашивания ран Czas szycia rany Benötigte Zeit, um Wunden zu nähen + 伤口缝合时间 + 상처 봉합 시간 Time, in seconds, required to stitch a single wound. @@ -674,6 +774,8 @@ Время, необходимое для зашивания одной раны (в секундах). Czas w sekundach potrzebny na zaszycie pojedyńczej rany. Zeit in Sekunden, um eine einzelne Wunde zu nähen. + 缝合一个伤口所需的时间(秒) + 초 단위로, 한 상처를 봉합하는데 걸리는 시간을 설정합니다. Self IV Transfusion @@ -683,10 +785,12 @@ Pose d'IV sur soi-même Autotransfusão de IV 自我注射點滴 + 自我静脉输液 Samoaplikace IV transfuze Samotransfuzja IV Trasfusione endovena su se stessi Autotransfusión intravenosa (IV) + 수액용기 자가 사용 Enables the use of IV transfusions on oneself. @@ -696,10 +800,12 @@ Active la possibilité de s'auto-poser des IVs. Permite utilizar bolsas de IV para transfusão em si mesmo 啟用是否能對自己注射點滴 + 启用是否能够自我静脉输液 Umožňuje aplikovat IV transfuze na sama sebe. Pozwala przetoczyć płyny IV samemu sobie Abilita la trasfusione in endovena su se stessi. Habilita el uso de las transfusiones IV sobre uno mismo + 수액용기를 사용자 본인에게 쓸 수 있는지를 정합니다. Allow Unconscious Body Bag @@ -709,6 +815,8 @@ Разрешить упаковывать пациентов без сознания в мешки для трупов Nieprzytomni w worku na ciało Erlaube Benutzung des Leichensackes mit bewusstlosen Personen + 允许昏迷者装入尸袋 + 기절 인원 시체 운반용 부대에 옮기기 Enables placing an unconscious patient in a body bag. @@ -718,6 +826,8 @@ Разрешает упаковывать пациентов без сознания в мешки для трупов. Zezwalaj na pakowanie nieprzytomnych osób do worka na ciało. Aktiviert, Bewusstlose in Leichensack zu legen. + 能够将昏迷的伤员装入尸袋中。 + 기절상태의 인원을 시체운반용부대에 옮겨 담을 수 있는지를 정합니다. Allow IV Transfusion @@ -725,10 +835,12 @@ Zezwalaj na przetaczanie płynów IV Pose de perfusions autorisée pour 允許操作點滴 + 允许静脉输液 IV 輸血の制限 Povolit IV transfuzi Разрешить внутривенное переливание Permitir transfusión de IV + 수액용기 사용 허가 Training level required to transfuse IVs. @@ -736,10 +848,12 @@ Poziom wyszkolenia potrzebny aby móc przetaczać płyny IV. Définit la qualification médicale requise pour poser des perfusions intraveineuses. 要有何種醫療水準才可注射點滴。 + 静脉输液所需的医疗水平。 IV 輸血を行うのに訓練済レベルを要求とします。 Úroveň výcviku nutná pro IV transfuzi. Уровень навыка, требуемый для осуществления внутривенного переливания. Nivel de capacitación requerido para transfusiones de IV. + 수액용기를 사용하는데 필요한 등급을 정합니다. Locations IV Transfusion @@ -749,6 +863,8 @@ Места введения пакетов внутривенного переливания Miejsca do transfuzji IV Orte an denen IV-Transfusionen angelegt werden können + 静脉输液地点 + 수액용기 사용 장소 Controls where IV transfusions can be performed. @@ -758,6 +874,8 @@ Определяет к каким частям тела разрешено применять пакеты внутренного переливания. Kontroluje w jakich miejscach można robić transfuzje IV. Kontrolliert, wo IV-Transfusionen durchgeführt werden können. + 控制何地可以静脉输液 + 수액용기를 사용할 수 있는 장소를 정합니다. Convert Vanilla Items @@ -767,10 +885,12 @@ Convertir les objets vanilla Converter itens vanilla 轉換原版物品 + 转换原版物品 Converti oggetti vanilla Přeměnit zdravotnické předměty ze základní hry Konwertuj przedmioty z vanili Convierte los objetos estándars de A3 en objetos ACE + 바닐라 아이템 전환 Controls whether vanilla medical items are converted to ACE Medical items, removed only, or ignored. @@ -780,10 +900,12 @@ Определяет, что делать с ванильными медикаментами: преобразовать в медикаменты ACE, удалить или проигнорировать. Controla se itens médicos vanilla serão convertidos para itens do ACE, removidos ou ignorados. 控制是否轉換原版的醫療物資成ACE的醫療物資,或者單純移除或無視。 + 控制是否转换原版的医疗物品成 ACE 的医疗物品,或者单纯移除/无视。 Controlla se gli articoli medicali vanilla vengono convertiti in articoli medicali ACE, rimossi o ignorati. Nastavuje zda zdravotnické předměty ze základní hry budou přeměněny na ACE předměty, odstraněny nebo ignorovány. Kontroluje, czy podstawowe przedmioty medyczne z Arma są konwertowane na przedmioty medyczne ACE, tylko usuwane lub ignorowane. Controla si los artículos médicos básicos se convierten en artículos médicos de ACE, solo se eliminan o se ignoran. + 바닐라 치료 아이템을 ACE 치료 물자로 바꿀지, 제거할지, 무시할지를 정합니다. Remove Only @@ -792,11 +914,13 @@ Удалять Apenas Remover 單純移除 + 仅移除 Rimuovere solo Pouze odstranit Tylko Usuwaj Nur Entfernen Solo eliminar + 바닐라 제거 Enable Litter @@ -811,7 +935,9 @@ Abilita rifiuti 廃棄物の有効化 啟用醫療用廢棄物 + 启用医疗废弃物 Çöpleri Etkinleştir + 의료폐기물 생성 활성화 Enables the creation of litter upon treatment. @@ -820,11 +946,13 @@ Разрешает создание медицинского мусора при лечении. Permite a criação de lixo médico durante o tratamento. 啟用醫療後剩下的醫療用廢棄物。 + 启用在治疗后能够产生医疗垃圾。 Permette la creazione di rifiuti al momento del trattamento. Umožňuje vytvořit odpadky při léčbě. Umożliwia tworzenie śmieci po przeprowadzaniu zabiegu. Ermöglicht das Produzieren von Abfall während einer Behandlung. Habilita la opción de basura durante el tratamiento + 치료시 의료폐기물을 주위에 생성하는지를 결정합니다. Max Litter Objects @@ -833,12 +961,14 @@ Макс. кол-во мусора Máximo de Objetos de Lixo 最大醫療用廢棄物數量 + 最大医疗垃圾数量 Numero massimo di rifiuti Maximum odpadků Maksymalna Ilość Śmieci Maximale Anzahl an Abfall-Objekten Maks. Çöp Objesi Número máximo de objetos de basura + 최대 의료폐기물 수 Sets the maximum number of litter objects which can be spawned, excessive amounts can cause FPS lag. @@ -847,11 +977,13 @@ Устанавливает максимальное количество создаваемых объектов мусора. Чрезмерное значение может вызвать задержку FPS. Define o limite máximo de objetos de lixo que podem ser criados, quantidade excessivas podem causar lag de FPS. 設定最大可以產生的醫療用廢棄物數量,極端的數量的話可能導致幀數下降。 + 设置可以生成的最大垃圾数量,数量过多会导致 FPS 延迟。 Imposta il numero massimo di rifiuti che possono essere generati, quantità eccessive possono diminuire gli FPS. Nastavuje maximum odpadků, které se mohou objevit. Vysoká hodnota m§že negativně ovlivnit FPS. Definiuje maksymalną liczbę śmieci, które mogą zostać stworzone, nadmierne ilości mogą powodować spadki FPS. Bestimmt die maximal Anzahl an Abfall-Objekten, die erstellt werden können. Eine zu hohe Anzahl kann Lag verursachen. Establece el número máximo de objetos de basura que se pueden generar, cantidades excesivas pueden causar saltos de FPS. + 최대 의료폐기물의 스폰 수를 결정합니다. 많은 양은 프레임의 저하로 이어질 수 있습니다. Litter Lifetime @@ -860,12 +992,14 @@ Время жизни мусора Duração de Lixo 醫療用廢棄物時長 + 医疗垃圾寿命 Tempo rifiuti Životnost odpadků Czas trwania Śmieci Abfall Anzeigedauer Cöp Silinme Süresi Tiempo de vida de la basura + 의료폐기물 지속시간 Controls the lifetime of litter objects, in seconds. -1 is forever. @@ -874,11 +1008,13 @@ Управляет временем жизни объектов мусора в секундах. -1 означает Навсегда. Controla o tempo de vida de objetos de lixo criados em segundos. -1 é para sempre. 控制醫療用廢棄物的時長,以秒為單位。設定為-1則是永不刪除。 + 控制医疗垃圾物体的生命周期,以秒为单位。-1则是永不删除。 Controlla la durata di vita dei rifiuti in secondi. -1 è per sempre. Nastavuje za jak dlouho zdravotnické odpadky zmizí. -1 je navždy. Kontroluje czas trwania śmieci w sekundach. -1 pozostawia je na zawsze. Kontrolliert die Anzeigedauer von Abfall-Objekten in Sekunden. -1 ist für immer. Controla el tiempo de vida de la basura (segundos). -1 es igual a permanentes + 의료폐기물의 지속시간을 초 단위로 결정합니다. -1의 경우 사라지지 않습니다. Anyone @@ -904,12 +1040,14 @@ Медики Médicos 醫療兵 + 医疗兵 Medici Medikové Medycy Sanitäter Sıhhiye Médicos + 의무병 Doctors @@ -918,12 +1056,14 @@ Доктора Doutores 軍醫 + 军医 Dottori Doktoři Doktorzy Ärzte Doktor Doctores + 군의관 Medical Facilities @@ -932,12 +1072,14 @@ Госпитали Instalações Médicas 醫療設施 + 医疗设施 Strutture mediche Zdravotnické zařízení Obiekty Medyczne Medizinische Einrichtungen Tıbbi tesisler Instalaciones médicas + 의료 시설 Vehicles & Facilities @@ -946,12 +1088,14 @@ Техника и госпитали Veículos e Instalações Médicas 車輛與設施 + 载具&设施 Zdravotnická zařízení a vozidla Veicoli e strutture Pojazdy i Obiekty Fahrzeuge und Einrichtungen Araçlar ve Tesisler Vehículos e instalaciones médicas + 의료 차량 및 시설 CPR Success Chance Minimum @@ -960,6 +1104,8 @@ Szansa na powodzenie CPR - Minimum 心肺蘇生の最低成功確率 HLW Minimale Erfolgschance + 心肺复苏的最低成功率 + 최소 심폐소생술 성공 가능성 CPR Success Chance Maximum @@ -968,6 +1114,8 @@ Szansa na powodzenie CPR - Maksimum 心肺蘇生の最高成功確率 HLW Maximale Erfolgschance + 心肺复苏的最高成功率 + 최대 심폐소생술 성공 가능성 Minimum probability that performing CPR will restore heart rhythm.\nThis minimum value is used when the patient has at least "Lost a fatal amount of blood".\nAn interpolated probability is used when the patient's blood volume is between the minimum and maximum thresholds. @@ -976,6 +1124,8 @@ Minimalna wartość szansy na to że CPR przywróci bicie serca.\nTa minimalna wartość jest używana gdy pacjent ma status "Stracił krytyczną ilość krwi".\nInterpolowana wartość szansy jest używana gdy pacjent ma poziom krwi będący pomiędzy minimum a maksimum. 心肺蘇生を行うことで心拍が回復する最低成功確率を設定します。\nこの値は患者が"致命的な程失血している"時に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 Minimale Wahrscheinlichkeit, dass die Durchführung einer HLW den Herzrhythmus wiederherstellt.\nDieser Mindestwert wird verwendet, wenn der Patient mindestens "eine tödliche Menge Blut verloren" hat.\nEine interpolierte Wahrscheinlichkeit wird verwendet, wenn das Blutvolumen des Patienten zwischen dem minimalen und dem maximalen Schwellenwert liegt. + 实施心肺复苏恢复心律的最小可能性。\n当伤员至少有"致命失血量"时,就取该最小值。\n当伤员的血量介于最小和最大阈值之间时,将使用插值概率。 + 심폐소생술 시 제일 낮은 성공 가능성을 결정합니다.\n이 가능성은 환자가 최소 "심각한 양의 혈액을 잃음"일 때 사용됩니다. Maximum probability that performing CPR will restore heart rhythm.\nThis maximum value is used when the patient has at most "Lost some blood".\nAn interpolated probability is used when the patient's blood volume is between the minimum and maximum thresholds. @@ -984,6 +1134,8 @@ Maksymalna wartość szansy na to że CPR przywróci bicie serca.\nTa maksymalna wartość jest używana gdy pacjent ma status "Stracił trochę krwi".\nInterpolowana wartość szansy jest używana gdy pacjent ma poziom krwi będący pomiędzy minimum a maksimum. 心肺蘇生を行うことで心拍が回復する最高成功確率を設定します。\nこの値は患者が"いくらか失血している"時以上の場合に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 Maximale Wahrscheinlichkeit, dass die Durchführung einer HLW den Herzrhythmus wiederherstellt.\nDieser Maximalwert wird verwendet, wenn der Patient höchstens "Blut verloren" hat.\nEine interpolierte Wahrscheinlichkeit wird verwendet, wenn das Blutvolumen des Patienten zwischen dem minimalen und dem maximalen Schwellenwert liegt. + 实施心肺复苏恢复心律的最大可能性。\n当伤员最多“失血一些”时,就取该最大值。\n当伤员的血量介于最小和最大阈值之间时,将使用插值概率。 + 심폐소생술 시 제일 높은 성공 가능성을 결정합니다.\n이 가능성은 환자가 최소 "혈액을 조금 잃음"일 때 사용됩니다. CPR Treatment Time @@ -993,6 +1145,8 @@ Время проведения СЛР Czas potrzebny na wykonanie CPR HLW Behandlungsdauer + 心肺复苏时间 + 심폐소생술 시행 시간 Time, in seconds, required to perform CPR on a patient. @@ -1002,11 +1156,14 @@ Время, необходимое для проведения сердечно-лёгочной реанимации (СЛР) (в секундах). Czas w sekundach jaki jest potrzebny do wykonania CPR na pacjencie. Zeit in Sekunden, die benötigt wird, um eine HLW durzuführen. + 对伤员实施心肺复苏所需的时间(秒) + 초 단위로, 심폐소생술을 진행하는 시간을 결정합니다. Holster Required 武器の扱い 需要收起武器 + 需要收起武器 Rengainer obligatoirement Fondina richiesta Vyžadováno schování zbraně @@ -1014,11 +1171,13 @@ Holstern benötigt Необходимость убирать оружие Requiere enfundar + 무장여부 Controls whether weapons must be holstered / lowered in order to perform medical actions.\nExcept Exam options allow examination actions (checking pulse, blood pressure, response) at all times regardless of this setting. 何らかの治療をするには武器を下げるか収めるかどうかを決定します。\nなお次の診断行動は設定で例外できます: 心拍確認、血圧測定、反応確認 控制是否要先放下或把武器放入武器套才能做出醫療行為。\n除了診斷 - 允許未放下或未放入的情況下進行一連串的診斷(檢查脈搏,血壓,反應)。 + 控制是否要先放下或把武器放起才能做出医疗行为。\n除了诊断—允许未放下或未收起的情况下进行一连串的诊断(检查脉搏,血压,反应)。 Définit si les armes doivent être rengainées ou abaissées avant de pouvoir effectuer des actes médicaux.\nLes options "sauf examens" autorisent les examens (vérification du pouls, de la tension artérielle, de l'état de conscience) en toutes circonstances. Nastavuje zda musí být zbraň schovaná/snížená pro provádění zdravotnických úkonů.\nKromě Diagnózy - Umožňuje diagnostické akce (kontrola srdečního tepu, tlaku krve a reakci pacienta) vždy bez ohledu na nastavení schování zbraně. Kontroluje, czy broń musi być schowana/opuszczona w celu wykonania leczenia pacjenta.\n Za wyjątkiem diagnozowania - umożliwia wykonywanie czynności kontrolnych (sprawdzanie tętna, ciśnienia krwi, reakcji) przez cały czas, niezależnie od ustawienia Wymagana broń w kaburze. @@ -1026,11 +1185,13 @@ Kontrolliert, ob Waffen geholstert/gesenkt werden müssen, um medizinische Aktionen durchzuführen.\nAusgenommen die eingestellten Untersuchungsoptionen erlauben Diagnose-Aktionen (Überprüfung von Puls, Blutdruck, Reaktion) jederzeit. Нужно ли убирать оружие для проведения медицинских действий.\nОпция «Проверка разрешена» разрешает проверять пульс, кровяное давление или реакцию независимо от этого параметра. Controla si las armas deben estar enfundadas / bajadas para realizar acciones médicas. \n Excepto Las opciones de examen permiten acciones de examen (control del pulso, presión arterial, respuesta) en todo momento, independientemente de esta configuración. + 치료하기에 앞서 손에서 무기를 집어넣을 지/내릴 지를 결정합니다.\n검사제외 옵션의 경우 맥박 확인, 혈압 확인, 반응 확인은 앞선 옵션에 구애받지 않고 사용할 수 있습니다. Lowered or Holstered 下げるか収める 放低或者收起 + 放低或者收起 Abaisser ou rengainer Abbassato o con fondina Snížena nebo Schována @@ -1038,11 +1199,13 @@ Gesenkt oder Geholstert Опущено или убрано Bajada o enfundada + 내리거나 집어넣기 Lowered or Holstered (Except Exam) 下げるか収める (診断行動は除外) 放低或者收起(除了診斷) + 放低或者收起(除了诊断) Abaisser ou rengainer (sauf examens) Abbassato o con la fondina (eccetto l'esame) Snížena nebo Schována (kromě Diagnózy) @@ -1050,11 +1213,13 @@ Gesenkt oder Geholstert (Ausnahme Untersuchung) Опущено или убрано (Проверка разрешена) Bajada o enfundada (excepto examen) + 내리거나 집어넣기(검사 제외) Holstered Only 収めた時のみ 只能收起 + 只能收起 Rengainer seulement Solo con la fondina Pouze Schována @@ -1062,11 +1227,13 @@ Nur geholstert Только убрано Solo enfundada + 집어넣기 Holstered Only (Except Exam) 収めた時のみ (診断行動は除外) 只能收起(除了診斷) + 只能收起(除了诊断) Rengainer seulement (sauf examens) Solo fondina (eccetto esame) Pouze Schována (kromě Diagnózy) @@ -1074,6 +1241,7 @@ Nur geholstert (Ausnahme Untersuchung) Только убрано (Проверка разрешена) Solo enfundada (excepto examen) + 집어넣기(검사 제외) [ACE] Medical Supply Crate (Basic) @@ -1088,7 +1256,7 @@ [ACE] Cassa Rifornimenti Medici (Basico) [ACE] 医療物資箱 (ベーシック) [ACE] 의료 물자 (기본) - [ACE] 医疗补给箱 (基础) + [ACE] 医疗补给箱(基础) [ACE] 醫療補給箱(基本) [ACE] Tıbbi Malzeme Kutusu (Temel) @@ -1105,7 +1273,7 @@ [ACE] Cassa Rifornimenti Medici (Avanzato) [ACE] 医療物資箱 (アドバンスド) [ACE] 의료 물자 (고급) - [ACE] 医疗补给箱 (高级) + [ACE] 医疗补给箱(高级) [ACE] 醫療補給箱(進階) [ACE] Tıbbi Malzeme Kutusu (Gelişmiş) @@ -1119,8 +1287,8 @@ Se o objeto será ou não um veículo médico Будет ли объект считаться медицинским транспортом. どれでも、またはオブジェクトを医療車両として割り当てます。 - 무엇이 되었던간에 이 목록에 있는 물체는 의료 차량이 됩니다. - 是否使该载具为医疗载具? + 이 물체는 의료 차량이 됩니다. + 是否使该载具为医疗载具? 是否使該載具為醫療載具? Rozhoduje zda bude objekt zdravotnickým vozidlem. @@ -1169,7 +1337,7 @@ Este módulo permite asignar la clase médico a las unidades seleccionadas. Questo modulo ti permette di assegnare la classe Medico alle unità selezionate. 選択されたユニットを衛生兵として指定します。 - 이 모듈은 선택한 보직이 의무병을 할 수 있게 해줍니다. + 이 모듈로 선택한 유닛을 의무병으로 만들 수 있습니다. 本模块可让被同步的单位成为医疗兵 本模塊可讓被同步的單位成為醫療兵 Bu modül, Medic sınıfını seçilen birimlere atamanıza izin verir. @@ -1186,7 +1354,7 @@ Nincs Nessuno なし - 없음 + 아님 Hiçbiri @@ -1203,7 +1371,7 @@ Hagyományos orvos Medico Regolare 通常の衛生兵 - 일반 의무병 + 의무병 普通医疗兵 普通醫療兵 Normal Sıhhıye @@ -1255,7 +1423,7 @@ Registra un oggetto come struttura medica オブジェクトを医療施設として割り当てる 물체를 의료시설로 등록합니다 - 指定一个物件作为医疗设施 + 指定一个物体作为医疗设施 指定一個物件作為醫療設施 @@ -1270,8 +1438,8 @@ Doktor (csak fejlett orvosok) Dottore (Solo Medici Avanzati) 医師 (アドバンスド医療のみ) - 의사 (오직 고급 의료에서만) - 军医 (只限进阶医疗系统) + 군의관 (오직 고급 의료에서만) + 军医(只限进阶医疗系统) 軍醫 (只限進階醫療系統) @@ -1286,7 +1454,7 @@ Doktor Dottore 医師 - 의사 + 군의관 军医 軍醫 Doktor @@ -1304,7 +1472,7 @@ Bandagem(Básico) 包帯 (緊急圧迫) 붕대 (기본) - 绷带 (基础型) + 绷带(基础型) 基礎繃帶 Bandaj (Basit) @@ -1320,7 +1488,7 @@ Usado para cobrir um ferimento Slouží k překrytí poranění 傷口を覆います - 상처를 덮을때 씁니다 + 상처를 덮을 때 씁니다 用于覆盖伤口 用於覆蓋傷口 Bir yarayı kapatmak için kullanılır @@ -1338,7 +1506,7 @@ Obvaz je vhodným způsobem upravený sterilní materiál, určený k překrytí rány, případně k fixaci poranění. 傷口を血液凝固剤で塞ぐようにできていて、使うと出血の原因を取りさります。 드레싱, 출혈을 막고서 상처를 덮기위해 쓰는 물건입니다. - 用于覆盖伤口以防止出血, 透过敷料的止血剂来让出血慢慢停止 + 用于覆盖伤口以防止出血,透过敷料的止血剂来让出血慢慢停止 用於覆蓋傷口以防止出血, 透過敷料的止血劑來讓出血慢慢停止 Bir yarayı örtmek için kullanılan ve kanama başladıktan sonra yaranın üzerine uygulanan özel bir malzeme olan bir pansuman. @@ -1353,9 +1521,9 @@ Bendaggio compressivo Bandagem de Compressão Obvaz (Tlakový) - 弾性包帯 - 거즈 붕대 - 绷带 (包扎型) + 包帯 (弾性) + 붕대 (거즈) + 绷带(包扎型) 繃帶(包紮型) Bandaj (Paket) @@ -1371,8 +1539,8 @@ Usado para o preenchimento de cavidades geradas por ferimentos médios e grandes e estancar o sangramento. Používá se k zastavení středních až silnějších krvácení 粘着フィルム状で、普通から大きめなケガに使い止血します。 - 중형 또는 대형 상처를 채우고 출혈을 막기위해 쓰입니다 - 用于包扎中到大型伤口, 并防止出血 + 중형 또는 대형 상처를 채우고 출혈을 막기 위해 쓰입니다, + 用于包扎中到大型伤口,并防止出血 用於包紮中到大型傷口, 並防止出血 Orta ila büyük yaraları sarmak ve kanamayı durdurmak için kullanılır @@ -1388,8 +1556,8 @@ Uma bandagem usada para preencher o ferimento para estancar o sangramento e facilitar a cicatrização. Preenchimento de feridas é uma opção em ferimentos de politrauma grandes. Tlakový obvaz se skládá se ze sterilní krycí vrstvy, na kterou je přiložena silná vrstva savého materiálu stlačující cévu v ráně a která je přitlačována k ráně a připevněna obinadlem. Slouží k zastavení silnějších krvácení. 包帯を使うと出血元を塞ぎ、怪我の治癒を促進させます。また大きめ多発性外傷に対しても使えます。 - 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 채우는것도 한 가지 방법입니다. - 用于包扎中到大型伤口, 并防止出血, 为在大型多处性伤口的选项之一! + 출혈을 막고 상처를 치유하기 위한 붕대. 다발성외상의 경우 상처를 싸매는 것도 한 가지 방법입니다. + 用于包扎中到大型伤口,并防止出血, 为在大型多处性伤口的选项之一! 用於包紮中到大型傷口, 並防止出血, 為在大型多處性傷口的選項之一! Kanamayı durdurmak ve yara iyileşmesini kolaylaştırmak için yarayı sarmak için kullanılan bir bandaj. @@ -1406,7 +1574,7 @@ Bandagem (Elástica) 包帯 (伸縮) 붕대 (압박) - 绷带 (弹性型) + 绷带(弹性型) 繃帶(彈性型) Bandaj (Elastik) @@ -1422,8 +1590,8 @@ Kit de Bandagem, Elástica Sada obvazů, Elastická 包帯キット (伸縮) - 붕대, 압박 - 绷带 (弹性型) + 압박 붕대 키트 + 绷带(弹性型) 一個彈性繃帶包 Bandaj kiti, Elastik @@ -1457,7 +1625,7 @@ Torniquete (CAT) 止血帯 (CAT) 지혈대 [CAT] - 止血带 (军用型) + 止血带(军用型) 軍用止血帶 Turnike (CAT) @@ -1491,7 +1659,7 @@ Zařízení používané ke stlačení venózního a arteriálního oběhu. V důsledku dochází ke zpomalení toku krve a tedy i snížení ztrát krve. 止血帯は静脈や動脈へ圧力をかけ、循環を遅らせることで血液の流れを遅し失血を防ぎます。 정맥과 동맥을 압축시키켜 혈액순환을 억제 혹은 늦추게하여 혈액손실을 줄이는 도구입니다. - 用于压迫静脉与动脉的血液流动, 以达到减缓失血速度的目的 + 用于压迫静脉与动脉的血液流动,以达到减缓失血速度的目的 用於壓迫靜脈與動脈的血液流動, 達到減緩失血速度的目的 Kan akışını engelleyen veya yavaşlatan ve dolayısıyla kan kaybını azaltan venöz ve arteriyel dolaşımı sıkıştırmak için kullanılan bir daraltıcı cihaz. @@ -1509,6 +1677,7 @@ 夹板 Atel Férula + 부목 Stabilizes a fractured limb @@ -1524,6 +1693,7 @@ 用于固定骨折的肢体 Kırık bir uzvu stabilize eder Estabilizar un hueso roto + 아작난 사지를 고정시킵니다. Morphine Autoinjector @@ -1649,7 +1819,7 @@ Usado em casos de ataque QBRN Používá se v přítomnosti nervových plynů 核・生物・化学兵器による汚染環境下にて使います。 - 핵,생물,화학 상황에 쓰입니다 + 화생방 상황에 쓰입니다 使用于核生化污染的情况 使用於核生化汙染的情況 @@ -1665,8 +1835,8 @@ Uma droga usada por militares em casos de ataque QBRN. Atropin slouží jako protijed na otravu organofosfátovými insekticidy (diazinon) a nervovými plyny. 核・生物・化学兵器による汚染環境下にて使います。 - 핵,생물,화학 상황에 쓰이는 군용 약품 - 军用神经解毒针, 用来应付核生化污染的情况. + 화생방 상황에 쓰이는 군용 약품 + 军用神经解毒针,用来应付核生化污染的情况。 軍用神經解毒針, 用來應付核生化汙染的情況. @@ -1698,7 +1868,7 @@ Aumenta a frequência cardíaca e combate efeitos causados por reações alérgicas Zvyšuje srdeční frekvenci a chrání před alergickými reakcemi 心拍数を増加させたり、アレルギー反応を収める効果もあります。 - 심박수를 높이며 알러지반응의 대응책입니다 + 심박수를 높이며 알러지 반응의 대응책입니다 用于提升心率的一种药物 增加心跳速率的一種藥物 @@ -1714,8 +1884,8 @@ Egy hormon, mely a szimpatikus idegrendszer által kitágítja a hörgőket, valamint megnöveli a szívverést, ezzel ellensúlyozva ilyen jellegű allergiás reakciókat (anafilaxiás sokk). Hirtelen szívmegállás esetén is használt, idő alatt csökkenő hatásfokkal. Zúžení periferních cév díky působení na alfa receptory a následné kontrakci hladkých svalů, tím dochází k tzv. centralizaci oběhu, krev se soustřeďuje v životně důležitých centrálních orgánech (srdce, mozek, plíce), působí také pozitivně na srdeční činnost a dochází ke zvýšení krevního tlaku a tepu. Dále se používá při náhlé srdeční zástavě. 気管支を拡張するよう交感神経を拡張させ、心拍数を増加させます。それにアレルギー反応を収める効果もあります (アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにも使われます。 - 기관지를 확장시키는 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과에 대응합니다(아나필락시스). 심폐가 정지하는 경우 호전이 되지않을때 사용합니다. - 俗称强心针, 为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! + 기관지를 확장시키고 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과(과민증)에 대응합니다. 심정지의 경우 호전이 되지 않을 때 사용합니다. + 俗称强心针,为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! 俗稱強心針, 為一種支氣管擴張藥物, 會增加心跳速率並減緩過敏反應(過敏性休克), 在心跳驟停時有恢復心跳的效果! @@ -1730,8 +1900,8 @@ Plasma IV (1000ml) Krevní plazma (1000ml) 血しょう IV (1000ml) - 혈장 IV (250ml) - 血浆 (1000毫升) + 혈장 IV (1000ml) + 血浆(1000毫升) 血漿 (1000毫升) @@ -1779,7 +1949,7 @@ Krevní plazma (500ml) 血しょう IV (500ml) 혈장 IV (500ml) - 血浆 (500毫升) + 血浆(500毫升) 點滴 (血漿 500毫升) Plasma IV (500ml) @@ -1796,7 +1966,7 @@ Krevní plazma (250ml) 血しょう IV (250ml) 혈장 IV (250ml) - 血浆 (250毫升) + 血浆(250毫升) 點滴 (血漿 250毫升) Plasma IV (250ml) @@ -1813,7 +1983,7 @@ Krevní transfúze (1000ml) 血液 IV (1000ml) 혈액 IV (1000ml) - 血液 (1000毫升) + 血液(1000毫升) 點滴 (血液 1000毫升) Kan IV (1000ml) @@ -1830,7 +2000,7 @@ Krevní transfuze pro doplnění pacientovi krve 血液 IV は、患者へ血液を補給します。 혈액 IV, 환자에게 혈액을 공급합니다. - 血液, 用于补充伤者流失的血液 + 血液,用于补充伤者流失的血液 血液, 用於補充傷者流失的血液 Kan IV, bir hastanın kanını geri enjekte etmek için @@ -1846,8 +2016,8 @@ Nullás vércsoportú, Rh-negatív vér-infúzió, melyet kritikus és ritka helyzetekben vérutánpótlásra használnak, jellemzően az orvosi ellátás szállítási fázisa közben. 0 Rh negativní krev se používá v vzácných případech k doplnění pacientovy hladiny krve, obvykle při převozu zraněné osoby do nemocnice. O 型への輸血はまれで厳格であり、通常は治療のための輸送段階で輸血をおこないます。 - O- 형 혈액 투여는 매우 엄격하고 드문 혈액보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. - O型负值注射用血液, 在紧急情况时使用, 用于补充伤者流失的血液 + O형 혈액 투여는 매우 엄격하고 드문 혈액 보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. + O型负值注射用血液,在紧急情况时使用, 用于补充伤者流失的血液 O型陰性注射用血液, 在緊急情況時使用, 用於補充傷者流失的血液 @@ -1863,7 +2033,7 @@ Krevní transfúze (500ml) 血液 IV (500ml) 혈액 IV (500ml) - 血液 (500毫升) + 血液(500毫升) 點滴 (血液 500毫升) Kan IV (500ml) @@ -1880,7 +2050,7 @@ Krevní transfúze (250ml) 血液 IV (250ml) 혈액 IV (250ml) - 血液 (250毫升) + 血液(250毫升) 點滴 (血液 250毫升) Kan IV (250ml) @@ -1897,7 +2067,7 @@ Fyziologický roztok (1000ml) 生理食塩水 IV (1000ml) 생리식염수 IV (1000ml) - 生理盐水 (1000毫升) + 生理盐水(1000毫升) 點滴 (食鹽水 1000毫升) Serum IV (1000ml) @@ -1914,7 +2084,7 @@ Fyziologický roztok se aplikuje intravenózně a slouží k obnově pacientovi krve 生理食塩水 IV は、患者の血液量を補助します 생리식염수, 환자의 혈액량을 보충할때 쓰입니다 - 生理盐水, 用于恢复伤者血液 + 生理盐水,用于恢复伤者血液 生理食鹽水, 用於恢復傷者血液 @@ -1930,7 +2100,7 @@ Fyziologický roztok se využívá nejčastěji jako infuze při dehydrataci organismu. 生理食塩水 IV を静脈へ投与し、血液量を増加させることができます。 혈류에 IV로 투여되는 의료 용적 대체 요법 - 利用静脉注射进入人体血液系统, 帮助伤者血液恢复 + 利用静脉注射进入人体血液系统,帮助伤者血液恢复 利用靜脈注射進入人體血液系統, 幫助傷者血液恢復 @@ -1946,7 +2116,7 @@ Fyziologický roztok (500ml) 生理食塩水 IV (500ml) 생리식염수 IV (500ml) - 生理盐水 (500毫升) + 生理盐水(500毫升) 點滴 (食鹽水 500毫升) Serum IV (500ml) @@ -1963,7 +2133,7 @@ Fyziologický roztok (250ml) 生理食塩水 IV (250ml) 생리식염수 IV (250ml) - 生理盐水 (250毫升) + 生理盐水(250毫升) 點滴 (食鹽水 250毫升) Serum IV (250ml) @@ -1978,9 +2148,9 @@ Bendaggio emostatico (QuikClot) Bandagem básica (Coagulante) Hemostatický obvaz (QuikClot) - 緊急圧迫止血包帯 (クイッククロット) - 필드 드레싱 (퀵 클롯) - 绷带 (止血型) + 包帯 (クイッククロット) + 붕대 (퀵 클롯) + 绷带(止血型) 繃帶 (止血粉) @@ -1996,7 +2166,7 @@ Hemostatický obvaz (QuikClot) クイッククロット 퀵 클롯 붕대 - 绷带 (止血型) + 绷带(止血型) 止血粉繃帶 QuikClot bandaj @@ -2012,8 +2182,8 @@ Bandagem Hemostática com coagulante que controla hemorragia médias e grandes com risco de vida. Hemostatický obvaz určený k zástavě krvácení 血液凝固剤を含む包帯により、止血できます。 - 지혈시 사용하는 붕대로 혈액 응고제를 포함하고있습니다. - 包含止血粉成分的止血绷带, 可用于止血 + 지혈 시 사용하는 붕대로 혈액 응고제를 포함하고 있습니다. + 包含止血粉成分的止血绷带,可用于止血 包含止血粉成分的止血繃帶, 可用於止血 @@ -2045,8 +2215,8 @@ Inclui vários tratamentos materiais para custura e tratamento avançado Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných 縫合や高度な処置に必要とされる、様々な治療器具が含まれています。 - 봉합및 고급 조치에 필요한 다양한 치료 도구가 있습니다. - 包含各种医疗套件, 以及进阶伤口系统需要的缝合用品 + 봉합 및 고급 조치에 필요한 다양한 치료 도구가 있습니다. + 包含各种医疗套件,以及进阶伤口系统需要的缝合用品 包含各種醫療套件, 以及進階傷口系統需要的縫合用品 Dikiş veya gelişmiş tedavi için gerekli çeşitli tedavi malzemelerini içerir @@ -2062,7 +2232,7 @@ Osobní lékárnička obsahuje zdravotnický materiál umožňující šití a pokročilejší ošetřování raněných v poli Pronto soccorso personale da campo per mettersi i punti o per trattamenti avanzati. 戦場で縫合や高度な処置に必要とされる、様々な治療器具が含まれています。 - 야전에서 봉합및 고급 조치를 위한 개인응급키트 + 야전에서 봉합 및 고급 조치를 위한 개인응급키트 个人急救包可用于战地缝合手术或进阶伤口系统使用 個人急救包可用於戰地縫合手術或進階醫療用 Alan dikişi veya gelişmiş tedavi için Kişisel Yardım Kiti @@ -2079,7 +2249,7 @@ Použít osobní lékárničku (PAK) Usa il pronto soccorso personale 応急処置キットを使う - 개인 응급 키트사용하기 + 개인응급키트 사용 使用个人急救包 使用個人急救包 Kişisel Yardım Kitini Kullan @@ -2114,7 +2284,7 @@ Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli 縫合キットは戦場で高度な処置をする為に使われます。 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) 用於在戰場上為傷口進行縫合 Sahada gelişmiş tıbbi tedavi için Cerrahi Kit @@ -2131,7 +2301,7 @@ Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli 縫合キットは戦場で高度な処置をする為に使われます。 야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트 - 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) + 用于在战场上为伤口进行缝合(需要开启进阶伤口系统) 用於在戰場上為傷口進行縫合 Sahada gelişmiş tıbbi tedavi için Cerrahi Kit @@ -2164,7 +2334,7 @@ Saco para cadáver Pytel na mrtvoly 死体袋 - 시체 가방 + 시체 운반용 부대 尸袋 屍袋 Ceset torbası @@ -2181,7 +2351,7 @@ Um saco para corpos mortos Pytel na mrtvoly 死体袋は死体を入れる為に使います。 - 시체를 운반할때 쓰는 가방입니다 + 시체를 운반할 때 쓰는 가방입니다 用于装尸体 用來裝屍體用 Ölü bedenler için bir ceset torbası @@ -2198,7 +2368,7 @@ Um saco para corpos mortos. Pytel na mrtvoly 死体袋は死体を入れる為に使います。 - 시체를 운반할때 쓰는 가방입니다 + 시체를 운반할 때 쓰는 가방입니다 用于装尸体 用來裝屍體用 Ölü bedenler için bir ceset torbası @@ -2231,7 +2401,7 @@ Injetar Adenosina Ввести аденозин アデノシンを投与 - 아데노신 주사 + 아데노신 주사하기 注射腺苷 注射腺苷 Adenosin Enjekte Et @@ -2248,7 +2418,7 @@ Inietta atropina Injetar Atropina アトロピンを投与 - 아트로핀 주사 + 아트로핀 주사하기 注射阿托品 注射阿托品 Atropin Enjekte Et @@ -2265,7 +2435,7 @@ Injetar Epinefrina Inietta adrenalina アドレナリンを投与 - 에피네프린 주사 + 에피네프린 주사하기 注射肾上腺素 注射腎上腺素 Epinefrin Enjekte Et @@ -2282,7 +2452,7 @@ Injetar Morfina Inietta morfina モルヒネを投与 - 모르핀 주사 + 모르핀 주사하기 注射吗啡 注射嗎啡 Morfin Enjekte Et @@ -2384,7 +2554,7 @@ Atar Cabeça Benda la testa 包帯を頭へ - 머리에 붕대감기 + 머리에 붕대 감기 包扎头部 繃帶包紮 頭部 Kafayı Bandajla @@ -2401,7 +2571,7 @@ Atar Tronco Benda il torso 包帯を胴体へ - 몸통에 붕대감기 + 몸통에 붕대 감기 包扎躯干 繃帶包紮 身體 Gövdeyi Bandajla @@ -2418,7 +2588,7 @@ Atar Braço Esquerdo Benda il braccio sinistro 包帯を左腕に - 왼팔에 붕대감기 + 왼팔에 붕대 감기 包扎左臂 繃帶包紮 左手 Sol Kolu Bandajla @@ -2435,7 +2605,7 @@ Atar Braço Direito Benda il braccio destro 包帯を右腕に - 오른팔에 붕대감기 + 오른팔에 붕대 감기 包扎右臂 繃帶包紮 右手 Sağ Kolu Bandajla @@ -2452,7 +2622,7 @@ Atar Perna Esquerda Benda la gamba sinistra 包帯を左足へ - 왼쪽 다리에 붕대감기 + 왼쪽 다리에 붕대 감기 包扎左腿 繃帶包紮 左腳 Sol Bacağı Bandajla @@ -2469,7 +2639,7 @@ Atar Perna Direita Benda la gamba destra 包帯を右足へ - 오른쪽 다리에 붕대감기 + 오른쪽 다리에 붕대 감기 包扎右腿 繃帶包紮 右腳 Sağ Bacağı Bandajla @@ -2486,7 +2656,7 @@ Injetando Morfina... Inietto la morfina... モルヒネを投与しています・・・ - 모르핀 주사중... + 모르핀 주사 중... 正在注射吗啡... 嗎啡注射中... Morfin Enjekte Ediliyor ... @@ -2503,7 +2673,7 @@ Injetando Epinefrina... Inietto l'adrenalina... アドレナリンを投与しています・・・ - 에피네프린 주사중... + 에피네프린 주사 중... 正在注射肾上腺素... 腎上腺素注射中... Epinefrin Enjekte Ediliyor... @@ -2519,7 +2689,7 @@ Injetando Adenosina... Введение аденозина... アドネシンを投与しています・・・ - 아데노신 주사중... + 아데노신 주사 중... 正在注射腺苷... 腺苷注射中... Adenosin Enjekte Ediliyor... @@ -2536,7 +2706,7 @@ Inietto l'atropina... Injetando Atropina アトロピンを投与しています・・・ - 아트리핀 주사중... + 아트로핀 주사 중... 正在注射阿托品... 阿托品注射中 ... Atropin Enjekte Ediliyor... @@ -2553,7 +2723,7 @@ Transfundindo Sangue... Effettuo la trasfusione di sangue... 輸血しています・・・ - 혈액 수혈중... + 혈액 수혈 중... 正在输入血液... 輸血液中 ... Kan Veriliyor... @@ -2570,7 +2740,7 @@ Effettuo la rasfusione di soluzione salina Transfundindo Soro... 生理食塩水を投与しています・・・ - 생리식염수 수혈중... + 생리식염수 수혈 중... 正在输入生理盐水... 施打生理食鹽水中 ... Serum Veriliyor... @@ -2587,7 +2757,7 @@ Effettu la trasfusione di plasma... Transfundindo Plasma... 血しょうを投与しています・・・ - 혈장 수혈중... + 혈장 수혈 중... 正在输入血浆... 輸血漿中 ... Plasma Veriliyor... @@ -2604,7 +2774,7 @@ Atando... Перевязывание... 包帯を巻いています・・・ - 붕대감는중... + 붕대 감는 중... 正在包扎... 繃帶包紮中 ... Bandajlanıyor... @@ -2621,7 +2791,7 @@ Sto applicando il laccio emostatico... Applicando Torniquete 止血帯を巻いています・・・ - 지혈대 적용중... + 지혈대 적용 중... 正在使用止血带... 使用軍用止血帶中 ... Turnike Uygulanıyor... @@ -2637,9 +2807,9 @@ Zárókötszer Bendaggio rapido Curativo de Campo - 緊急圧迫包帯を巻く - 필드 드레싱 - 绷带 (基础型) + 包帯を巻く (緊急圧迫) + 붕대 (기본) + 绷带(基础型) 基礎繃帶 @@ -2653,9 +2823,9 @@ Bandage compressif Bandagem de Compressão Obvaz Tlakový - 弾性包帯を巻く - 거즈 붕대 - 绷带 (包扎型) + 包帯を巻く (弾性) + 붕대 (거즈) + 绷带(包扎型) 包紮繃帶 Paket Bandaj @@ -2670,9 +2840,9 @@ Rögzitő kötszer Bendaggio elastico Bandagem Elástica - 伸縮包帯を巻く - 압박 붕대 - 绷带 (弹性型) + 包帯を巻く (伸縮) + 붕대 (압박) + 绷带(弹性型) 彈性繃帶 Elastik Bandaj @@ -2687,9 +2857,9 @@ QuikClot QuikClot (polvere emostatica) QuikClot - クイッククロットを巻く - 퀵 클롯 - 绷带 (止血型) + 包帯を巻く (クイッククロット) + 붕대 (퀵 클롯) + 绷带(止血型) 止血粉 @@ -2738,7 +2908,7 @@ Žádné záznamy na tomto štítku Nenhuma entrada neste cartão de triagem トリアージ カードには何も無い。 - 부상자 분류 카드에 쓰여있는것이 없습니다. + 부상자 분류 카드에 쓰여있는 것이 없습니다. 此分诊卡上没有信息。 此檢傷分類卡上沒有任何資料 Bu triyaj kartında kayıt yok. @@ -2791,6 +2961,7 @@ Schiene anlegen 安装夹板 Atel Uygula + 부목 대기 Applying Splint... @@ -2806,6 +2977,7 @@ Lege Schiene an ... 正在安装夹板... Atel Uygulanıyor... + 부목 대는 중... Diagnose @@ -2836,7 +3008,7 @@ Diagnostika... Diagnosticando... 診断しています・・・ - 진단중... + 진단 중... 正在诊断... 診斷中... Teşhis ediliyor... @@ -2854,7 +3026,7 @@ SBV 心肺蘇生 심폐소생술 - 心肺复苏(CPR) + 心肺复苏(CPR) 心肺復甦術 CPR @@ -2870,7 +3042,7 @@ Provádím CPR... Realizando o SBV... 心肺蘇生をしています・・・ - 심폐소생중... + 심폐소생 중... 正在进行心肺复苏... 進行心肺復甦術中... CPR Yapılıyor... @@ -2888,7 +3060,7 @@ Administrar Sangue IV (1000ml) 血液 IV (1000ml) を投与 IV 혈액 수혈 (1000ml) - 静脉输血 (1000毫升) + 静脉输血(1000毫升) 輸血液 (1000毫升) Kan IV (1000ml) Ver @@ -2905,7 +3077,7 @@ Administrar Sangue IV (500ml) 血液 IV (500ml) を投与 IV 혈액 수혈 (500ml) - 静脉输血 (500毫升) + 静脉输血(500毫升) 輸血液 (500毫升) Kan IV (500ml) Ver @@ -2922,7 +3094,7 @@ Administrar Sangue IV (250ml) 血液 IV (250ml) を投与 IV 혈액 수혈 (250ml) - 静脉输血 (250毫升) + 静脉输血(250毫升) 輸血液 (250毫升) Kan IV (250ml) Ver @@ -2939,7 +3111,7 @@ Administrar Plasma IV (1000ml) 血しょう IV (1000ml) を投与 IV 혈장 수혈 (1000ml) - 静脉注射血浆 (1000毫升) + 静脉注射血浆(1000毫升) 輸血漿 (1000毫升) Plasma IV (1000ml) Ver @@ -2956,7 +3128,7 @@ Administrar Plasma IV (500ml) 血しょう IV (500ml) を投与 IV 혈장 수혈 (500ml) - 静脉注射血浆 (500毫升) + 静脉注射血浆(500毫升) 輸血漿 (500毫升) Plasma IV (500ml) Ver @@ -2973,7 +3145,7 @@ Administrar Plasma IV (250ml) 血しょう IV (250ml) を投与 IV 혈장 수혈 (250ml) - 静脉注射血浆 (250毫升) + 静脉注射血浆(250毫升) 輸血漿 (250毫升) Plasma IV (250ml) Ver @@ -2990,7 +3162,7 @@ Administrar Soro IV (1000ml) 生理食塩水 IV (1000ml) を投与 IV 생리식염수 수혈 (1000ml) - 静脉注射生理盐水 (1000毫升) + 静脉注射生理盐水(1000毫升) 注射生理食鹽水 (1000毫升) Serum IV (1000ml) Ver @@ -3007,7 +3179,7 @@ Administrar Soro IV (500ml) 生理食塩水 IV (500ml) を投与 IV 생리식염수 수혈 (500ml) - 静脉注射生理盐水 (500毫升) + 静脉注射生理盐水(500毫升) 注射生理食鹽水 (500毫升) Serum IV (500ml) Ver @@ -3024,7 +3196,7 @@ Administrar Soro IV (250ml) 生理食塩水 IV (250ml) を投与 IV 생리식염수 수혈 (250ml) - 静脉注射生理盐水 (250毫升) + 静脉注射生理盐水(250毫升) 注射生理食鹽水 (250毫升) Serum IV (250ml) Ver @@ -3042,6 +3214,7 @@ Mínimo 轻微 Düşük + 비응급 Delayed @@ -3055,7 +3228,7 @@ Differito Atrasado 待機的治療群 - 늦어짐 + 응급 延后 延後 Ertelenmiş @@ -3192,6 +3365,7 @@ W łagodnym bólu Con dolor leve 轻度疼痛 + 조금 고통스러움 In pain @@ -3205,7 +3379,7 @@ Con dolore Com dor 痛みがある - 고통 + 꽤 고통스러움 疼痛 疼痛中 @@ -3222,6 +3396,7 @@ W silnym bólu Con dolor severo 重度疼痛 + 매우 고통스러움 Tourniquet [CAT] @@ -3236,7 +3411,7 @@ Torniquete [CAT] 止血帯 [CAT] 지혈대 [CAT] - 止血带 (军用型) + 止血带(军用型) 軍用止血帶 Turnike [CAT] @@ -3285,7 +3460,7 @@ Aferindo Pressão Arterial... Měřím krevní tlak... 血圧を測定しています・・・ - 혈압 측정증... + 혈압 측정 중... 正在测量血压... 檢查血壓中... Kan basıncı kontrol ediliyor... @@ -3318,7 +3493,7 @@ Você verificou o paciente %1 Zkontroloval jsi %1 血圧は %1 - 나의 혈압은 %1 이다 + 혈압은 %1 입니다 你已检查 %1 你已經檢查 %1 Kontrol ettin %1 @@ -3335,7 +3510,7 @@ A Pressão Arterial é de %2/%3 Naměřil si krevní tlak u %2/%3 血圧は %2/%3 - 혈압이 %2/%3 이다 + 혈압이 %2/%3 입니다 血压为 %2/%3 血壓為%2/%3 Kan basıncı buldun %2/%3 @@ -3352,7 +3527,7 @@ Pressão Arterial baixa Naměřil si nízký krevní tlak 血圧はかなり低い - 혈압이 매우 낮다 + 혈압이 매우 낮습니다 血压低 發現到低血壓 Düşük kan basıncı buldun @@ -3369,7 +3544,7 @@ Pressão Arterial normal Naměřil si normální krevní tlak 血圧は通常 - 혈압이 정상이다 + 혈압이 정상입니다 血压正常 發現到正常血壓 Normal kan basıncı buldun @@ -3386,7 +3561,7 @@ Pressão Arterial Alta Naměřil si vysoký krevní tlak 血圧はかなり高い - 혈압이 매우 높다 + 혈압이 매우 높습니다 血压高 發現到高血壓 Yüksek kan basıncı buldun @@ -3403,7 +3578,7 @@ Sem Pressão Arterial Nenaměřil si žádný krevní tlak 血圧は測れなかった - 혈압이 잡히지 않는다 + 혈압이 잡히지 않습니다 血压为零 量不到血壓 Kan basıncı yok @@ -3420,7 +3595,7 @@ Você falhou em aferir a Pressão Arterial Nedokázal si změřit krevní tlak 血圧を測るのに失敗 - 혈압을 잡을 수 없었다 + 혈압을 측정하는데 실패했습니다 无法测得血压 檢查血壓的動作失敗 Kan basıncını bulamıyorsun @@ -3522,7 +3697,7 @@ Checando Pulso... Kontroluji puls... 脈拍数を測定しています・・・ - 맥박 확인중... + 맥박 확인 중... 正在测量脉搏... 檢查心跳中... Nabız Kontrol Ediliyor ... @@ -3539,7 +3714,7 @@ Você aferiu o paciente %1 Zkontroloval si %1 心拍数は %1 - 나의 맥박은 %1 이다 + 맥박은 %1 입니다 你已检查 %1 你已經檢查 %1 @@ -3639,7 +3814,7 @@ A Freqüência Cardíaca é de %2 Nahmatal jsi srdeční tep u %2 心拍数は %2 - 맥박이 %2 이다 + 맥박이 %2 입니다 心率为 %2 心跳為%2 @@ -3655,7 +3830,7 @@ Freqüência Cardíaca baixa Nahmatal jsi slabý srdeční puls 心拍数は低い - 약한 맥박이다 + 약한 맥박입니다 心率微弱 心跳微弱 Düşük nabız ölçtün @@ -3672,7 +3847,7 @@ Freqüência Cardíaca normal Nahmatal jsi silný srdeční puls 心拍数は強い - 강한 맥박이다 + 강한 맥박입니다 心率过快 心跳過快 Yüksek nabız ölçtün @@ -3689,7 +3864,7 @@ Freqüência Cardíaca alta Nahmatal jsi normální srdeční puls 心拍数は通常 - 보통 맥박이다 + 보통 맥박입니다 心率正常 心跳正常 Normal nabız ölçtün @@ -3706,7 +3881,7 @@ Sem Freqüência Cardíaca Žádný puls 心拍数を測れなかった - 맥박을 찾을 수가 없다 + 맥박을 찾을 수가 없습니다 无法测得心率 量不到心跳 Nabız bulamadın @@ -3739,7 +3914,7 @@ Aferindo se o paciente tem reação Zkontroloval jsi reakci pacienta 患者からの反応をみる - 대상의 반응 확인중 + 대상의 반응 확인 중 检查伤员的反应 檢查傷者的反應 @@ -3755,7 +3930,7 @@ %1 está respondendo %1 odpovídá %1 は反応あり - %1 은 반응이있다 + %1 은 반응이 있습니다 %1 有反应 %1 有反應 %1 tepki veriyor @@ -3772,7 +3947,7 @@ %1 não está respondendo %1 neodpovídá %1 の反応なし - %1 은 반응이없다 + %1 은 반응이 없습니다 %1 没有反应 %1 沒有反應 %1 tepki vermiyor @@ -3783,6 +3958,8 @@ %1 jest nieresponsywny, ma płytki oddech oraz jest w konwulsjach %1 は反応せず、浅い呼吸とけいれんをしている %1 reagiert nicht, schnappt nach Luft und verkrampft + %1没有反应,微软的喘着气和抽搐 + %1 은 반응이 없고, 얕은 헐떡임과 경련증세를 보입니다 %1 is not responsive, motionless and cold @@ -3790,6 +3967,8 @@ %1 jest nieresponsywny, nieruchomy oraz zimny %1 は反応せず、動かず冷たくなっている %1 reagiert nicht, ist regungslos und kalt + %1没有反应,一动不动,身体冰凉 + %1 은 반응이 없고, 움직임이 없으며 차갑습니다 You checked %1 @@ -3988,7 +4167,7 @@ %1 está aplicando uma bandagem em você %1 tě obvazuje %1 はあなたに包帯を巻いている - %1 (이)가 나에게 붕대를 감고있다 + %1 (이)가 나에게 붕대를 감고 있다 你正在被 %1 包扎 %1 正在對你包紮繃帶中 %1 seni bandajlıyor @@ -4005,26 +4184,26 @@ Você começa a suturar os ferimentos do %1 (%2) Zašíváš rány %1 (%2) あなたは %1 (%2) の外傷へ縫合を始めた - 나는 %1(%2) 상처로부터 봉합을 시작했다 + 당신은 %1(%2) 상처로부터 봉합을 시작했다 你正在使用 %2 缝合 %1 的伤口 你正開始對 %1 (%2) 縫合傷口中 - Stitching - Наложение швов - Suturando - Nähen + Stitching... + Наложение швов... + Suturando... + Nähen... Suture en cours... - Szycie - Összevarrás - Suturando - Suturando - Šití - 縫合中 - 붕합중 - 正在缝合 - 縫合中 - Dikiş + Szycie... + Összevarrás... + Suturando... + Suturando... + Šití... + 縫合中・・・ + 봉합 중... + 正在缝合... + 縫合中... + Dikiş... You treat the airway of %1 @@ -4072,7 +4251,7 @@ %1 está te entubando %1 ošetřuje tvoje dýchací cesty %1 はあなたの気道を見ている - %1 (이)가 나의 기도를 확보중이다 + %1 (이)가 나의 기도를 확보 중이다 %1 正在治疗你的呼吸道 %1 正在治療你的呼吸道 % 1 hava yolu tedavi ediyor @@ -4089,7 +4268,7 @@ Arrastar Trascina 引きずる - 끌다 + 끌기 拖拽 拖拉 Sürükle @@ -4106,7 +4285,7 @@ Carregar Trasporta 担ぐ - 업다 + 업기 背起 背起 Taşı @@ -4174,7 +4353,7 @@ %1 est conscient et ne peut être embarqué. 患者 (%1) は意識があり、積み込めない 이 사람 (%1) 은(는) 의식이 있어 태우지 못합니다 - 此人(%1)处于清醒状态, 因此无法被装载 + 此人(%1)处于清醒状态,因此无法被装载 此人(%1)是清醒且不能被裝載 Bu kişi (% 1) uyanık ve yüklenemiyor @@ -4190,7 +4369,7 @@ %1<br/>berakodva ide:<br/>%2 %1<br/>загружен в<br/>%2 %1<br/>は<br/>%2へ積み込まれました - %1<br/>는<br/>%2 에 실림 + %1<br/>(은)는<br/>%2 에 실림 %1<br/>裝載至<br/>%2 %1<br/>装载至<br/>%2 @@ -4206,7 +4385,7 @@ 1%<br/>kirakodva ebből:<br/>%2 %1<br/>разгружен из<br/>%2 <br/>%1が<br/>%2から降ろされました - %1<br/>는<br/>%2 에서 내려짐 + %1<br/>(은)는<br/>%2 에서 내려짐 從<br/>%2卸載<br/>%1 从<br/>%2卸载<br/>%1 @@ -4222,7 +4401,7 @@ Colocar corpo dentro do saco para cadáver Umístit tělo do pytle na mrtvoly 死体袋に入れる - 시체 가방에 담기 + 시체 운반용 부대에 담기 将尸体装入尸袋 將屍體放入屍袋 Vücudu ceset torbasına yerleştir @@ -4239,7 +4418,7 @@ Colocando corpo dentro do saco para cadáver... Umisťuji tělo do pytle na mrtvoly... 死体袋へ入れています・・・ - 시체 가방에 담는중... + 시체 운반용 부대에 담는 중... 正在将尸体装入尸袋... 將屍體放入屍袋中... Vücut, ceset torbasına yerleştiriliyor... @@ -4340,6 +4519,7 @@ %1 hat eine Schiene angelegt %1 已安装夹板 % 1 splint uyguladı + %1 (이)가 부목을 적용했다 %1 used Personal Aid Kit @@ -4403,7 +4583,7 @@ Velmi lehce raněn Muito levemente ferido かなり浅い傷 - 매우 가벼운 부상 + 미미한 부상 小伤 小傷 Çok hafif yaralı @@ -4419,7 +4599,7 @@ Guérir les plaies entièrement bandées Heilt vollständig bandagierte Trefferpunkte 包帯は体力を完全に回復させます - 붕대를 감은후 체력을 회복함 + 붕대를 감은 후 체력을 회복함 完全医疗包扎的部位至痊愈 完全醫療包紮的部位至痊癒 @@ -4435,7 +4615,7 @@ Ošetřuji... Curando... 治療しています・・・ - 치료중... + 치료 중... 正在治疗... 治療中... Tedavi ediliyor ... @@ -4452,7 +4632,7 @@ Снятие жгута... Togliendo il laccio emostatico... 止血帯を外しています・・・ - 지혈대 제거중... + 지혈대 제거 중... 正在移除止血带... 移除軍用止血帶中... Turnike Çıkarılıyor ... @@ -4469,7 +4649,7 @@ Il n'y a pas de garrot sur ce membre ! 身体には止血帯が無い! 이 부위에는 지혈대가 없습니다! - 该部位没有使用止血带! + 该部位没有使用止血带! 這部位沒有止血帶! Bu vücut kısmında turnike yok! @@ -4481,6 +4661,8 @@ ¡El cuerpo se retorció y puede que no esté muerto! Ciało drgnęło i może nie być martwe! Der Körper zuckte und kann nicht tot sein! + 身体抽搐了一下,可能还没死! + 꿈틀대는걸 보니 죽은 것 같지는 않습니다! diff --git a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf index 850ff41607..5c6e098269 100644 --- a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf @@ -165,4 +165,7 @@ if (!isPlayer _unit) then { END_COUNTER(Vitals); +//placed outside the counter as 3rd-party code may be called from this event +[QEGVAR(medical,handleUnitVitals), [_unit, _deltaT]] call CBA_fnc_localEvent; + true diff --git a/addons/metis/config.cpp b/addons/metis/config.cpp index 65e4474dd9..6758b0cc47 100644 --- a/addons/metis/config.cpp +++ b/addons/metis/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_missileguidance"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"Dani (TCVM)"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 74200ac4e6..f718646ae2 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -14,7 +14,7 @@ GPS MicroDAGR MicroDAGR GPS MicroDAGR GPS - 微型军用GPS接收器 + 微型军用 GPS 接收器 微型軍用GPS接收器 MicroDAGR GPS @@ -31,7 +31,7 @@ Receptor GPS avançado MicroDAGR MicroDAGR は改良された GPS 受信機です MicroDAGR 고급 위성항법 수신기 - 微型军用高级防御GPS接收器 + 微型军用高级防御 GPS 接收器 微型軍用高級防禦GPS接收器 @@ -47,7 +47,7 @@ Unidade Angular: 角度の種類: 각도의 단위: - 角密位: + 角密位: 角密位: @@ -95,7 +95,7 @@ Mostrar Waypoints no mapa: 地図へウェイポイントを表示: 웨이포인트를 지도에 보이기: - 显示路径点在地图上: + 显示路径点在地图上: 顯示路徑點在地圖上: @@ -144,7 +144,7 @@ Introduci griglia coordinate: Digite as Coords. do Grid 座標を入力: - 输入网格座标: + 输入网格座标: 輸入網格座標: 좌표 입력: @@ -176,8 +176,8 @@ Nuovo MGRS MGRS-Novo MGRS-New - 军事网格座标系统-新型 - 軍事網格座標系統-新型 + 军事网格座标系统—新型 + 軍事網格座標系統—新型 MGRS-New @@ -209,7 +209,7 @@ Distância: 距離: 거리: - 范围: + 范围: 範圍: @@ -225,7 +225,7 @@ Direção na bússula 方位磁石での方位 방위 - 指北针方位 + 指南针方位 指北針方位 @@ -353,7 +353,7 @@ Alternar Modo de Display do MicroDAGR MicroDAGR の表示モード MicroDAGR 화면 모드 토글 - 切换微型军用GPS接收器显示模式 + 切换微型军用 GPS 接收器显示模式 切換微型軍用GPS接收器顯示模式 @@ -369,7 +369,7 @@ Mostrar MicroDAGR MicoDAGR を表示 MicroDAGR 꺼내기 - 显示微型军用GPS接收器 + 显示微型军用 GPS 接收器 顯示微型軍用GPS接收器 @@ -385,7 +385,7 @@ Configurar MicroDAGR MicroDAGR を設定 MicroDAGR 설정하기 - 设定微型军用GPS接收器 + 设定微型军用 GPS 接收器 設定微型軍用GPS接收器 @@ -401,7 +401,7 @@ Fechar MicroDAGR MicroDAGR を閉じる MicroDAGR 집어넣기 - 关闭微型军用GPS接收器 + 关闭微型军用 GPS 接收器 關閉微型軍用GPS接收器 @@ -417,7 +417,7 @@ Riempimento Mappa MicroDAGR MicroDAGR での地図情報 MicroDAGR - 지도채우기 - 微型军用GPS接收器地图资料 + 微型军用 GPS 接收器地图资料 微型軍用GPS接收器地圖資料 @@ -433,7 +433,7 @@ Riempimento Mappa MicroDAGR MicroDAGR での地図情報 MicroDAGR - 지도채우기 - 微型军用GPS接收器地图资料 + 微型军用 GPS 接收器地图资料 微型軍用GPS接收器地圖資料 @@ -448,8 +448,8 @@ Сколько данных должно отображаться на карте MicroDAGR Quanti dati sono trasferiti nella mappa del MicroDAGR MicroDAGR で表示する地図情報を決定します - 얼마나 많은 데이터가 MicroDAGR에 있는지에 대한 정보 - 有多少地图数据会显示在微型军用GPS接收器 + 얼마나 많은 데이터가 MicroDAGR에 있는 지에 대한 정보 + 有多少地图数据会显示在微型军用 GPS 接收器 有多少地圖數據會顯示在微型軍用GPS接收器 @@ -497,7 +497,7 @@ Nessuno (Non puoi usare la vista mappa) なし(地図表示を使えません) 없음 (지도를 볼 수 없음) - 无 (无法检视地图) + 无(无法检视地图) 無 (無法檢視地圖) @@ -510,8 +510,10 @@ MicroDAGR - Precisão de Waypoint Précision des points de passage 微型軍用GPS接收器 - 導航精確度 + 微型军用 GPS 接收器—航点精度 MicroDAGR - přesnost Waypointů Micro DAGR - precisión del waypoint + MicroDAGR - 웨이포인트 정확도 Controls how precise the waypointdistance can be displayed @@ -523,8 +525,10 @@ Controla o quão preciso pode exibir o waypoint de distância Définit la précision d'affichage des points de passage. 控制顯示的導航點精確度為多少 + 控制显示航点距离的精确程度。 Nastavuje jak přesně je vzdálenost waypointů zobrazena. Controla cómo de precisa se mostrará la distancia al waypoint + 웨이포인트 거리가 얼마나 정확하게 표시되는지를 결정합니다 100m @@ -536,9 +540,11 @@ 100m 100 m 一百公尺 + 100米 100 m 100m 100m + 100m 10m @@ -550,9 +556,11 @@ 10m 10 m 十公尺 + 10米 10 m 10m 10m + 10m 1m @@ -564,9 +572,11 @@ 1m 1 m 一公尺 + 1米 1 m 1m 1m + 1m Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap. @@ -581,7 +591,7 @@ Controlla quanti dati sono presenti negli oggetti MicroDAGR. Meno dati costringono la vista mappa a mostrare meno informazioni nella minimappa. アイテム上で表示されるデータ量を決定します。設定を減らすと地図上での情報が少なくなります。 MicroDAGR에 얼마나 많은 데이터가 들어있는지 정합니다. 적을 수록 지도상에도 비춰지는게 적어집니다. - 设定有多少数据会显示在微型军用GPS接收器上。这些资料的多寡会反映在迷你地图的显示上。 + 设定有多少数据会显示在微型军用 GPS 接收器上。这些资料的多寡会反映在迷你地图的显示上。 設定有多少數據會顯示在微型軍用GPS接收器上。這些資料的多寡會反映在迷你地圖的顯示上。 @@ -592,6 +602,8 @@ MicroDAGR - 前のモードに MicroDAGR - vorheriger Modus MicroDAGR - Poprzedni Tryb + 微型 GPS 接收器—上一个模式 + MicroDAGR - 이전 모드 MicroDAGR - Next Mode @@ -601,6 +613,8 @@ MicroDAGR - 次のモードに MicroDAGR - nächster Modus MicroDAGR - Kolejny Tryb + 微型 GPS 接收器—下一个模式 + MicroDAGR - 다음 모드 diff --git a/addons/minedetector/stringtable.xml b/addons/minedetector/stringtable.xml index 7dec7d1a80..3f6eca652b 100644 --- a/addons/minedetector/stringtable.xml +++ b/addons/minedetector/stringtable.xml @@ -88,7 +88,7 @@ ヘッドホンからはずす Odłącz słuchawki Kopfhörer trennen - 헤드폰 연결끊기 + 헤드폰 연결 끊기 Déconnecter les écouteurs Disconnetti Auricolari 断开耳机 @@ -120,7 +120,7 @@ ヘッドホンから外しました Słuchawki odpięte Kopfhörer getrennt - 헤드폰 연결끊김 + 헤드폰 연결 끊김 Écouteurs déconnectés Auricolari Disconnessi 已断开耳机 diff --git a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf index 10c3bd5892..25afa133ef 100644 --- a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf +++ b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Sets up SACLOS state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/functions/fnc_ahr_onFired.sqf b/addons/missileguidance/functions/fnc_ahr_onFired.sqf index c7a3e5561c..951673f6e4 100644 --- a/addons/missileguidance/functions/fnc_ahr_onFired.sqf +++ b/addons/missileguidance/functions/fnc_ahr_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Sets up Active Radar state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf index 7e9408b2d7..6ff2bef4c8 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Attack profile: Beam guided. Exact same as wire-guided, except no wire cutting * * Arguments: diff --git a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf index 4f0324597f..53ec068319 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Attack profile: Wire guided * * Arguments: diff --git a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf index adfd1b5e01..cffc0e28cd 100644 --- a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf +++ b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf @@ -78,14 +78,13 @@ TRACE_4("",_currentFireMode,_nextFireMode,_index,_attackProfiles); private _currentFireMode = if (_useModeForAttackProfile) then { TRACE_2("setting fire mode",_weaponStateToken,_nextFireMode); - for "_weaponIndex" from 0 to 299 do { - ACE_player action ["SwitchWeapon", _currentShooter, ACE_player, _weaponIndex]; - (weaponState _weaponStateToken) params ["_xWeapon", "", "_xMode"]; + { + _x params ["_xIndex", "", "_xWeapon", "", "_xMode"]; if ((_xWeapon == _weapon) && {(getText (configFile >> "CfgWeapons" >> _weapon >> _xMode >> QGVAR(attackProfile))) == _nextFireMode}) exitWith { - TRACE_2("Restoring",_weaponIndex,weaponState _currentShooter); + ACE_player action ["SwitchWeapon", _currentShooter, ACE_player, _xIndex]; + TRACE_2("Restoring",weaponState _currentShooter,_x); }; - if ((weaponState _weaponStateToken) isEqualTo ["","","","",0]) exitWith {ERROR_2("weaponState not found",_weapon,_nextFireMode);}; - }; + } forEach (ACE_player weaponsInfo [_weapon, false]); } else { TRACE_2("setVariable attackProfile",_currentShooter,_nextFireMode); _currentShooter setVariable [QGVAR(attackProfile), _nextFireMode, false]; diff --git a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf index d8042b1d6c..94c61f49f6 100644 --- a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Active Radar Homing seeker * * Arguments: diff --git a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf index 2d0a1e9170..fa9f20674c 100644 --- a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * SACLOS seeker * * Arguments: diff --git a/addons/missileguidance/functions/fnc_wire_onFired.sqf b/addons/missileguidance/functions/fnc_wire_onFired.sqf index cb4020bd0f..1909f1e9f6 100644 --- a/addons/missileguidance/functions/fnc_wire_onFired.sqf +++ b/addons/missileguidance/functions/fnc_wire_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Sets up wireGuided state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index eb77ee12d4..11092501b2 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -14,7 +14,7 @@ Продвинутое наведение ракет 高度なミサイルの誘導 고급 미사일 유도 - 进阶飞弹制导 + 进阶导弹制导 進階飛彈制導 Gelişmiş Füze Güdüm Sistemi @@ -30,8 +30,8 @@ Orientação avançada de mísseis ou OAM, fornece vários aprimoramentos para travamento de mísseis e disparos. Também é um sistema requerido para disparar armas que utilizem mísseis. Pokočilé navádění raket (AMG) poskytuje několik vylepšení pro lepší zaměření a následnou střelbu. Je to prvek vyžadovaný u typu zbraní jako jsou rakety. 高度なミサイルの誘導、または AMG はミサイルの捕捉と発射に複数の強化をあたえます。これはミサイルの種類によって、枠組みを必要とします。 - 고급 미사일 유도 혹은 AMG 는 표적 획득 및 발사를 위한 여러 기능을 제공합니다. 미사일 종류에따라 체계가 필요합니다. - 进阶飞弹制导增强了多种导弹锁定和射击的能力。此系统适用于所有飞弹类型的武器。 + 고급 미사일 유도 혹은 AMG는 표적 획득 및 발사를 위한 여러 기능을 제공합니다. 미사일 종류에 따라 체계가 필요합니다. + 进阶导弹制导增强了多种导弹锁定和射击的能力。此系统适用于所有导弹类型的武器。 進階飛彈制導增強了多種導彈鎖定和射擊的能力。此系統適用於所有飛彈類型的武器 Gelişmiş füze rehberliği veya AMG, füze kilitleme ve ateşleme için çoklu geliştirmeler sağlar. @@ -47,8 +47,8 @@ Hydra-70 DAGR rakéta Hydra-70 DAGR ハイドラ-70 DAGR ミサイル - Hydra-70 DAGR 미사일 - 九头蛇-70 直接攻击导引飞弹 + 히드라-70 DAGR 미사일 + Hydra-70 DAGR 制导火箭 九頭蛇-70 直接攻擊導引飛彈 Hydra-70 DAGR Füze @@ -65,7 +65,7 @@ DAGR DAGR DAGR - 直接攻击制导火箭弹 + DAGR 直接攻擊導引飛彈 DAGR @@ -81,8 +81,8 @@ Hydra-70 DAGR lézer-irányított rakéta Управляемая ракета лазерного наведения Hydra-70 DAGR ハイドラ-70 DAGR レーザ誘導ミサイル - Hydra-70 DAGR 레이저 유도 미사일 - 九头蛇-70mm 制导航空火箭弹 + 히드라-70 DAGR 레이저 유도 미사일 + Hydra-70 激光制导直接攻击火箭(DAGR) 九頭蛇-70 直接攻擊雷射導引飛彈 Hydra-70 DAGR Lazer Güdümlü Füze @@ -98,8 +98,8 @@ Hellfire II AGM-114K rakéta Hellfire II AGM-114K ヘルファイア II AGM-114K ミサイル - Hellfire II AGM-114K 미사일 - 地狱火II型AGM-114K空地制导破甲弹 + 헬파이어 II AGM-114K 미사일 + AGM-114K 地狱火二型导弹 地獄火II型 AGM-114K 導彈 Hellfire II AGM-114K Füze @@ -116,7 +116,7 @@ AGM-114K AGM-114K AGM-114K - AGM-114K制导破甲弹 + AGM-114K AGM-114K AGM-114K @@ -132,8 +132,8 @@ Hellfire II AGM-114K lézer-irányított rakéta Управляемая ракета лазерного наведения Hellfire II AGM-114K ヘルファイア II AGM-114K レーザ誘導ミサイル - Hellfire II AGM-114K 레이저 유도 미사일 - 地狱火II型AGM-114K空地制导破甲弹 + 헬파이어 II AGM-114K 레이저 유도 미사일 + AGM-114K 地狱火二型激光制导导弹 地獄火II型 AGM-114K 雷射導引飛彈 Hellfire II AGM-114K Lazer Güdümlü Füze @@ -183,7 +183,7 @@ Игрок и боты Giocatore ed IA プレイヤーと AI - 玩家和AI + 玩家和 AI 玩家和AI 플레이어와 AI Oyuncular ve AI diff --git a/addons/missionmodules/stringtable.xml b/addons/missionmodules/stringtable.xml index 858b3ac701..ffbac0902f 100644 --- a/addons/missionmodules/stringtable.xml +++ b/addons/missionmodules/stringtable.xml @@ -64,7 +64,7 @@ Nomi classi dei suoni ambientali da eseguire. Separati da ',' 再生する環境音のクラスネームを記載。','で複数指定できます。 재생되는 환경 효과음의 단위와 이름입니다. ','로 구분됩니다. - 输入想使用的环境声音classname。每个classname用','做区隔 + 输入想使用的环境声音 classname。每个 classname 用','做区隔 輸入想使用的環境聲音classname。每個classname用','做區隔 Çalınacak ambiyans seslerinin sınıf isimleri. @@ -97,8 +97,8 @@ Используется для расчета случайной позиции и указывает минимальное расстояние между игроками и источниками звука Usati per calcolare una posizione casuale ed impostare la distanza minima tra i giocatori ed il file suono eseguito 無作為な位置への計算や、プレイヤーと再生されるファイルの間へ最低距離を設定します - 무작위 위치 계산에 사용되며 플레이어와 재생 된 사운드 파일 간의 최소 거리를 설정합니다. - 声音将随机产生在玩家附近,此选项定义该声音最近会距离玩家多少公尺 + 무작위 위치 계산에 사용되며 플레이어와 재생된 사운드 파일 간의 최소 거리를 설정합니다. + 声音将随机产生在玩家附近,此选项定义该声音最近会距离玩家多少米 聲音將隨機產生在玩家附近,此選項定義該聲音最近會距離玩家多少公尺 @@ -130,8 +130,8 @@ Используется для расчета случайной позиции и указывает максимальное расстояние между игроками и источниками звука Usato per calcolare una posizione casuale ed impostare la distanza massima tra giocatori e il file suono eseguito 無作為な位置への計算や、プレイヤーと再生されるファイルの間へ最大距離を設定します - 무작위 위치 계산에 사용되며 플레이어와 재생 된 사운드 파일 간의 최대 거리를 설정합니다. - 声音将随机产生在玩家附近,此选项定义该声音最远会距离玩家多少公尺 + 무작위 위치 계산에 사용되며 플레이어와 재생된 사운드 파일 간의 최대 거리를 설정합니다. + 声音将随机产生在玩家附近,此选项定义该声音最远会距离玩家多少米 聲音將隨機產生在玩家附近,此選項定義該聲音最遠會距離玩家多少公尺 @@ -163,7 +163,7 @@ Минимальная задержка между воспроизведением звуков Pausa Minima tra suoni eseguiti 再生されるまでの最低遅延 - 재생된 소리간 최소 지연시간 + 재생된 소리간 최소 지연 시간 设定每个声音档案中间最少间隔多久再进行播放 設定每個聲音檔案中間最少間隔多久再進行播放 Çalınan sesler arasında minimum gecikme @@ -197,7 +197,7 @@ Максимальная задержка между воспроизведением звуков Pausa Massima tra suoni eseguiti 再生されるまでの最大遅延 - 재생된 소리간 최대 지연시간 + 재생된 소리간 최대 지연 시간 设定每个声音档案中间最多间隔多久再进行播放 設定每個聲音檔案中間最多間隔多久再進行播放 Çalınan sesler arasında maksimum gecikme @@ -231,7 +231,7 @@ Следовать за игроками. Если установить в Ложь, звуки будут циклически проигрываться только около позиции Логики. Segui Giocatori. Se impostato su falso, il ciclo eseguirà i suoni solo vicino ad una posizione logica. プレイヤーを追随します。False に設定するとロジックの近くで延々と再生します。 - 플레이어를 따라갑니다. 거짓으로 설정될경우 오직 한 자리에서만 반복해서 소리를 재생합니다. + 플레이어를 따라갑니다. False로 설정될 경우 오직 한 자리에서만 반복해서 소리를 재생합니다. 设定声音是否会在玩家的附近产生。假如关闭此功能,声音只会在模块的位置产生。 設定聲音是否會在玩家的附近產生。假如關閉此功能,聲音只會在模塊的位置產生。 Eğer devde dışı bırakılırsa sesler oyuncuyu takip etmez @@ -283,7 +283,7 @@ Ciclo Suoni Ambientali (sincronizzato in MP) 環境音の繰り返し (MP 間で同期させます) 환경 효과음 반복 (멀티플레이 전반적으로 동기화됨) - 循环的环境声音 (在多人游戏中会同步所有玩家的播放状态) + 循环的环境声音(在多人游戏中会同步所有玩家的播放状态) 循環的環境聲音 (在多人遊戲中會同步所有玩家的播放狀態) Ambiyans sesleri döngüsü (MP üzerinden senkronize edilir) diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index 15d8f0b4bc..6d3754f629 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -14,7 +14,7 @@ Tavola di tiro 82mm 82mm 射表 82mm 사거리표 - 82mm迫击炮射表 + 82 mm 迫击炮射表 82毫米迫擊炮射表 82mm Menzil Tablosu @@ -31,7 +31,7 @@ Tavola di tiro per il mortaio calibro 82mm Mk6 Mk6 82mm 迫撃砲の射表 Mk6 82mm 박격포 사격을 위한 사거리표 - MK6 82mm迫击炮射表 + MK6 82 mm 迫击炮射表 MK6 82毫米迫擊炮射表 Mk6 82mm için Menzil Tablosu @@ -48,7 +48,7 @@ Apri la tavola di tiro 82mm 82mm 射表を開く 82mm 사거리표 열기 - 开启82mm迫击炮射表 + 开启82 mm 迫击炮射表 開啟82毫米迫擊炮射表 82mm Menzil Tablosunu Aç @@ -74,7 +74,7 @@ Mk6 Mörser Mortaio Mk6 MK6迫擊炮 - MK6迫击炮 + MK6 迫击炮 Mk6 迫撃砲 Mortier Mk6 Moździerz Mk6 @@ -83,6 +83,7 @@ Minomet Mk6 Mk6 Havan Mortero MK6 + Mk6 박격포 Mk6 Settings @@ -97,7 +98,7 @@ Impostazioni Mk6 Mk6 設定 Mk6 설정 - MK6设定 + MK6 设定 MK6設定 Mk6 Ayarları @@ -130,7 +131,7 @@ Для выстрелов игрока. Моделирует сопротивление воздуха и эффект ветра Per Proiettili dei Giocatori, simula la Resistenza dell'Aria e gli Effetti del Vento プレイヤが射撃すると、空気抵抗モデルと風による影響をあたえます。 - 플레이어 사격시 공기저항과 바람에 영향을 받습니다 + 플레이어가 사격 시 공기저항과 바람에 영향을 받습니다 设定由玩家射击的迫击炮,将会受到空气阻力与风力的影响 設定由玩家射擊的迫擊砲,將會受到空氣阻力與風力的影響 @@ -147,7 +148,7 @@ Consenti Computer Mk6 Mk6 コンピュータを許可 Mk6 탄도계산컴퓨터 허가 - 允许使用MK6射控电脑 + 允许使用 MK6 弹道计算机 允許使用MK6射控電腦 Mk6 bilgisayarına izin ver @@ -163,8 +164,8 @@ Показывает компьютер и дальномер (это НУЖНО отключить, если вы включаете сопротивление воздуха) Mostra il Computer e Distaziometro (questi DEVONO essere rimossi se vuoi abilitare la resistenza dell'aria) コンピュータと距離を表示します (空気抵抗を有効化している場合は必ず削除してください) - 탄도계산컴퓨터와 거리측정기를 보여줍니다(공기저항을 활성화했을경우 이 항목은 비활성화 되어야만 합니다) - 显示射控电脑和测距仪 (如果有启用空气阻力功能时,须停用此项功能) + 탄도계산컴퓨터와 거리측정기를 보여줍니다(공기저항을 활성화했을 경우 이 항목은 비활성화 되어야 합니다) + 显示弹道计算机和测距仪(如果有启用空气阻力功能时,须停用此项功能) 顯示射控電腦和測距儀 (如果有啟用空氣阻力功能時,須停用此項功能) @@ -180,7 +181,7 @@ Consenti Bussola Mk6 Mk6 への方位磁石を有効化 Mk6 나침반 허용 - 允许使用MK6指北针 + 允许使用 MK6 指南针 允許使用MK6指北針 Mk6 pusulasına izin ver @@ -197,7 +198,7 @@ Mostra la Bussola Digitale Mk6 Mk6 のデジタル方位磁石を表示 Mk6 에서 전자 나침반을 보여줍니다 - 显示MK6的数位指北针 + 显示 MK6 的电子指南针 顯示MK6的數位指北針 Mk6 Dijital Pusulasını göster @@ -213,7 +214,7 @@ Este módulo permite configurar los parámetros del mortero Mk6. Mk6 迫撃砲への設定をできます。 이 모듈은 Mk6 설치 설정을 가능케 합니다. - 这个模块允许你设定MK6迫击炮的相关功能 + 这个模块允许你设定 MK6 迫击炮的相关功能 這個模塊允許你設定MK6迫擊砲的相關功能 @@ -241,8 +242,8 @@ Elimina os carregadores do morteiro, requerendo que o atirador ou carregador utilize de forma individual a munição. Não afeta os morteiros controlados pela IA. Удаляет артиллерийские магазины, требует загрузку отдельных снарядов стрелком или заряжащим. Не влияет на артиллерию ИИ. 迫撃砲から弾薬を除去します。射手か装填手により予め装填されている必要があります。AI 迫撃砲へ影響を与えません。 - 박격포 탄창을 제거합니다, 사수나 장전수가 개별적으로 탄환을 넣어줘야만 합니다. 인공지능은 영향을 받지 않습니다. - 开启此功能时。迫击炮的弹药需由炮手与装填手共同合作来进行装填。此功能并不影响由AI射击的迫击炮 + 박격포 탄창을 제거합니다, 사수나 장전수가 개별적으로 탄환을 넣어줘야 합니다. 인공지능은 영향을 받지 않습니다. + 开启此功能时。迫击炮的弹药需由炮手与装填手共同合作来进行装填。此功能并不影响由 AI 射击的迫击炮 開啟此功能時。迫擊砲的彈藥需由砲手與裝填手共同合作來進行裝填。此功能並不影響由AI射擊的迫擊砲 Odstraní z minometu zásobník a vynucuje nabíjení po každém výstřelu buď mířičem nebo nabíječem. Tato možnost neovlivňuje AI posádky. @@ -288,7 +289,7 @@ Descarregar munição Извлечение снаряда 弾薬を除去しています - 탄약 제거중 + 탄약 제거 중 正在卸除弹头 卸除彈頭中 Vybít minomet @@ -305,7 +306,7 @@ Preparar munição Подготовка снаряда 砲弾を事前装填 - 탄약 준비중 + 탄약 준비 중 正在准备弹头 準備彈頭中 Mermi Hazırlanıyor @@ -370,7 +371,7 @@ Зарядить фугасный управляемый 誘導りゅう弾を装填 유도 고폭탄 장전 - 装载导引高爆弹 + 装载制导高爆弹 裝載導引高爆彈 Güdümlü HE Yükle @@ -386,93 +387,93 @@ Зарядить фугасный управляемый по ЛЦУ レーザ誘導りゅう弾を装填 레이저 유도 고폭탄 장전 - 装载雷射导引高爆弹 + 装填激光制导高爆弹 裝載雷射導引高爆彈 Lazer Güdümlü HE Yükle - 82mm HE Round - 82mm Sprengpatrone - Ronda 82mm HE - Pocisk wybuchowy kal. 82mm - Obus de 82 mm HE - Proiettile da 82mm HE - 82mm HE náboj - Munição 82mm HE - Фугасный снаряд 82мм - 82mm りゅう弾 - 82mm 고폭탄 - 82mm高爆弹 - 82毫米高爆彈 - 82mm HE Mermisi + [CSW] 82mm HE Round + [CSW] 82mm Sprengpatrone + [CSW] Ronda 82mm HE + [CSW] Pocisk wybuchowy kal. 82mm + [CSW] Obus de 82 mm HE + [CSW] Proiettile da 82mm HE + [CSW] 82mm HE náboj + [CSW] Munição 82mm HE + [CSW] Фугасный снаряд 82мм + [CSW] 82mm りゅう弾 + [CSW] 82mm 고폭탄 + [班组] 82 mm 高爆弹 + [CSW] 82毫米高爆彈 + [CSW] 82mm HE Mermisi - 82mm Smoke Round - 82mm Nebelpatrone - Ronda 82mm Humo - Pocisk dymny kal. 82mm - Obus de 82 mm fumigène - Proiettile Fumogeno da 82mm - 82mm Kouřový náboj - Munição 82mm Fumaça - Дымовой снаряд 82мм - 82mm 発煙弾 - 82mm 연막탄 - 82mm烟雾弹 - 82毫米煙霧彈 - 82mm Sis Mermisi + [CSW] 82mm Smoke Round + [CSW] 82mm Nebelpatrone + [CSW] Ronda 82mm Humo + [CSW] Pocisk dymny kal. 82mm + [CSW] Obus de 82 mm fumigène + [CSW] Proiettile Fumogeno da 82mm + [CSW] 82mm Kouřový náboj + [CSW] Munição 82mm Fumaça + [CSW] Дымовой снаряд 82мм + [CSW] 82mm 発煙弾 + [CSW] 82mm 연막탄 + [班组] 82 mm 烟雾弹 + [CSW] 82毫米煙霧彈 + [CSW] 82mm Sis Mermisi - 82mm Illumination Round - 82mm Leuchtpatrone - Ronda 82mm Iluminación - Pocisk oświetlający kal. 82mm - Obus de 82 mm éclairant - Proiettile illuminante da 82mm - 82mm Osvětlovací náboj - Munição 82mm Iluminação - Осветительный снаряд 82мм - 82mm 照明弾 - 82mm 조명탄 - 82mm照明弹 - 82毫米照明彈 - 82mm Işık Mermisi + [CSW] 82mm Illumination Round + [CSW] 82mm Leuchtpatrone + [CSW] Ronda 82mm Iluminación + [CSW] Pocisk oświetlający kal. 82mm + [CSW] Obus de 82 mm éclairant + [CSW] Proiettile illuminante da 82mm + [CSW] 82mm Osvětlovací náboj + [CSW] Munição 82mm Iluminação + [CSW] Осветительный снаряд 82мм + [CSW] 82mm 照明弾 + [CSW] 82mm 조명탄 + [班组] 82 mm 照明弹 + [CSW] 82毫米照明彈 + [CSW] 82mm Işık Mermisi - 82mm Guided HE Round - 82mm gelenkte Sprengpatrone - Ronda 82mm Guiada - Kierowany pocisk wybuchowy kal. 82mm - Obus de 82 mm HE guidé - Proiettile HE guidato - 82mm HE náboj (naváděný) - Munição 82mm HE Guiada - Фугасный снаряд управляемый 82мм - 82mm 誘導りゅう弾 - 82mm 유도 고폭탄 - 82mm导引高爆弹 - 82毫米導引高爆彈 - 82mm Güdümlü HE Mermisi + [CSW] 82mm Guided HE Round + [CSW] 82mm gelenkte Sprengpatrone + [CSW] Ronda 82mm Guiada + [CSW] Kierowany pocisk wybuchowy kal. 82mm + [CSW] Obus de 82 mm HE guidé + [CSW] Proiettile HE guidato + [CSW] 82mm HE náboj (naváděný) + [CSW] Munição 82mm HE Guiada + [CSW] Фугасный снаряд управляемый 82мм + [CSW] 82mm 誘導りゅう弾 + [CSW] 82mm 유도 고폭탄 + [班组] 82 mm 制导高爆弹 + [CSW] 82毫米導引高爆彈 + [CSW] 82mm Güdümlü HE Mermisi - 82mm Laser Guided HE Round - 82mm lasergelenkte Sprengpatrone - Ronda 82mm Guiada por Laser - Laserowo napr. pocisk wybuchowy kal. 82mm - Obus de 82 mm HE guidé au laser - Proiettile HE a guida laser - 82mm HE náboj (naváděný laserem) - Munição 82mm HE Guiada por Laser - Фугасный снаряд управляемый по ЛЦУ 82мм - 82mm レーザ誘導りゅう弾 - 82mm 레이저 유도 고폭탄 - 82mm雷射导引高爆弹 - 82毫米雷射導引高爆彈 - 82mm Lazer Güdümlü HE Mermisi + [CSW] 82mm Laser Guided HE Round + [CSW] 82mm lasergelenkte Sprengpatrone + [CSW] Ronda 82mm Guiada por Laser + [CSW] Laserowo napr. pocisk wybuchowy kal. 82mm + [CSW] Obus de 82 mm HE guidé au laser + [CSW] Proiettile HE a guida laser + [CSW] 82mm HE náboj (naváděný laserem) + [CSW] Munição 82mm HE Guiada por Laser + [CSW] Фугасный снаряд управляемый по ЛЦУ 82мм + [CSW] 82mm レーザ誘導りゅう弾 + [CSW] 82mm 레이저 유도 고폭탄 + [班组] 82 mm 激光制导高爆弹 + [CSW] 82毫米雷射導引高爆彈 + [CSW] 82mm Lazer Güdümlü HE Mermisi - Used in Mk6 mortar - Wird im Mk6 Mörser verwendet + Used in Mk6 Mortar + Wird im Mk6-Mörser verwendet Usada en el mortero Mk6 Używany w moździerzu Mk6 Utilisé dans le mortier Mk6. @@ -482,7 +483,7 @@ Использовался в миномете Mk6 Mk6 mortar で使います Mk6 박격포에 사용됨 - 用于Mk6迫击炮 + 用于 Mk6 迫击炮 用於Mk6迫擊砲 @@ -497,7 +498,7 @@ [ACE] Ящик фугасных снарядов 82мм [ACE] 82mm りゅう弾入り弾薬箱 [ACE] 82mm 고폭탄 상자 - [ACE] 82mm高爆弹药箱 + [ACE] 82 mm 高爆弹药箱 [ACE] 82毫米高爆彈藥箱 [ACE] 82mm HE Mermisi Kutusu @@ -513,7 +514,7 @@ [ACE] Ящик дымовых снарядов 82мм [ACE] 82mm 発煙弾入り弾薬箱 [ACE] 82mm 연막탄 상자 - [ACE] 82mm烟雾弹药箱 + [ACE] 82 mm 烟雾弹药箱 [ACE] 82毫米煙霧彈藥箱 [ACE] 82mm Sis Mermisi Kutusu @@ -529,7 +530,7 @@ [ACE] Ящик осветительных снарядов 82мм [ACE] 82mm 照明弾入り弾薬箱 [ACE] 82mm 조명탄 상자 - [ACE] 82mm照明弹药箱 + [ACE] 82 mm 照明弹药箱 [ACE] 82毫米照明彈藥箱 [ACE] 82mm Işık Mermisi Kutusu @@ -545,7 +546,7 @@ [ACE] Ящик снарядов 82мм (стандартный) [ACE] 82mm 保管箱 [ACE] 82mm 기본 장비 상자 - [ACE] 82mm预设弹药箱 + [ACE] 82 mm 预设弹药箱 [ACE] 82毫米預設彈藥箱 [ACE] 82mm Varsayılan Teçhizat Kutusu diff --git a/addons/modules/XEH_postInit.sqf b/addons/modules/XEH_postInit.sqf index c6892046fe..bdc6a9cc40 100644 --- a/addons/modules/XEH_postInit.sqf +++ b/addons/modules/XEH_postInit.sqf @@ -12,7 +12,7 @@ _logic hideObject true; if (_logic getVariable [QGVAR(initalized), false]) exitWith {}; - private _config = (configFile >> "CfgVehicles" >> _logicType); + private _config = configOf _logic; if !(isClass _config) exitWith {}; private _isGlobal = getNumber (_config >> "isGlobal") > 0; diff --git a/addons/mx2a/stringtable.xml b/addons/mx2a/stringtable.xml index 0836523fde..390a264f3a 100644 --- a/addons/mx2a/stringtable.xml +++ b/addons/mx2a/stringtable.xml @@ -14,7 +14,7 @@ MX-2A MX-2A MX-2A - MX-2A(热成像) + MX-2A(热成像) MX-2A MX-2A diff --git a/addons/nametags/functions/fnc_doShow.sqf b/addons/nametags/functions/fnc_doShow.sqf index 12ac1a04cb..32acffe045 100644 --- a/addons/nametags/functions/fnc_doShow.sqf +++ b/addons/nametags/functions/fnc_doShow.sqf @@ -19,7 +19,7 @@ private _player = ACE_player; private _vehicle = vehicle _player; private _type = typeOf _vehicle; -private _config = configFile >> "CfgVehicles" >> _type; +private _config = configOf _vehicle; private _text = format[" %2
", getText(_config>>"picture"), getText (_config >> "DisplayName")]; private _data = [_type] call FUNC(getVehicleData); diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index 338f8b37fc..ac7e005623 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -29,19 +29,26 @@ _fnc_parameters = { params ["_player", "_target", "_alpha", "_heightOffset", "_drawName", "_drawRank", "_drawSoundwave"]; //Set Icon: - private _icon = ""; - if (_drawSoundwave) then { - _icon = format [QPATHTOF(UI\soundwave%1.paa), floor random 10]; - } else { - if (_drawRank) then { - _icon = _target getVariable "ace_nametags_rankIcon"; - if (isNil "_icon" && {rank _target != ""}) then { - _icon = GVAR(factionRanks) getVariable (_target getVariable [QGVAR(faction), faction _target]); - if (!isNil "_icon") then { - _icon = _icon param [ALL_RANKS find rank _target, ""]; - } else { - _icon = format ["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa", rank _target]; - }; + private _targetIcon = _target getVariable QGVAR(rankIcon); + + private _icon = switch true do { + case _drawSoundwave: { + format [QPATHTOF(UI\soundwave%1.paa), floor random 10] + }; + + case !_drawRank: {""}; + case !isNil "_targetIcon": {_targetIcon}; + case (rank _target == ""): {""}; + + default { + private _targetFaction = _target getVariable [QGVAR(faction), faction _target]; + private _customRankIcons = GVAR(factionRanks) getVariable _targetFaction; + + if (!isNil "_customRankIcons") then { + _customRankIcons param [ALL_RANKS find rank _target, ""] // return + } else { + // default rank icons + format ["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa", rank _target] // return }; }; }; diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index a3d7f80ed2..5e322f6e69 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -36,20 +36,22 @@ if (!hasInterface) exitWith {}; }; }] call CBA_fnc_addPlayerEventHandler; -if (isClass (configFile >> "CfgPatches" >> "acre_api")) then { - INFO("ACRE Detected."); - DFUNC(isSpeaking) = { - params ["_unit"]; - ([_unit] call acre_api_fnc_isSpeaking) && {!(_unit getVariable ["ACE_isUnconscious", false])} +switch (true) do { + case (["acre_api"] call EFUNC(common,isModLoaded)): { + INFO("ACRE Detected."); + DFUNC(isSpeaking) = { + params ["_unit"]; + ([_unit] call acre_api_fnc_isSpeaking) && {!(_unit getVariable ["ACE_isUnconscious", false])} + }; }; -} else { - if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { + case (["task_force_radio"] call EFUNC(common,isModLoaded)): { INFO("TFAR Detected."); DFUNC(isSpeaking) = { params ["_unit"]; (_unit getVariable ["tf_isSpeaking", false]) && {!(_unit getVariable ["ACE_isUnconscious", false])} }; - } else { + }; + default { //No Radio Mod - Start a PFEH to watch the internal VON icon //Note: class RscDisplayVoiceChat {idd = 55} - only present when talking diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index f75530cc56..5c6f7e1e5f 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -14,7 +14,7 @@ Etichette Nomi 名札 이름표 - 玩家名字 + 玩家名称 玩家名稱 Isım Etiketleri @@ -65,7 +65,7 @@ Показывать имена игроков (включить имена) プレイヤ名を表示 플레이어 이름 표시 - 显示玩家名字 + 显示玩家名称 顯示玩家名稱 Oyuncu isimlerini göster @@ -82,7 +82,7 @@ Mostra nomi giocatori ed imposta la loro attivazione. Default: Abilitato プレイヤ名の表示と設定を有効化します。標準: 有効 플레이어 이름의 표시와 설정을 활성화합니다. 기본설정: 활성화 - 显示玩家的名字并设置其启动方式。预设: 启用 + 显示玩家的名字并设置其启动方式。预设:启用 顯示玩家的名稱並設置其啟動方式。預設: 啟用 Oyuncu adlarını gösterin ve etkinleştirmelerini ayarlayın. Varsayılan: Etkin @@ -115,7 +115,7 @@ Только по нажатию клавиши Solo quando Premi Tasto キー押下のみ - 키를 누를경우만 + 키를 누를 경우만 只有按按键时 只有按按鍵時 Yalnızca Tuşa Basmada @@ -132,7 +132,7 @@ Под курсором или по нажатию клавиши Solo su Cursore e quando Premi Tasto カーソルとキー押下のみ - 커서와 키를 누를경우만 + 커서와 키를 누를 경우만 只有在准心指到和按按键时 只有在準心指到和按按鍵時 Yalnızca İmleç ve Tuşa Basıldığında @@ -145,7 +145,7 @@ 화면 가장자리에서 사라짐 Estomper sur les bords de l'écran Sfocatura nei bordi dello schermo - 在荧幕边框旁淡出 + 在屏幕边框旁淡出 在螢幕邊框旁淡出 Затухание на границе экрана Ocultar na borda da tela @@ -166,7 +166,7 @@ Показывать звания игроков (при вкл. именах) プレイヤの階級を表示 (プレイヤ名が必要) 플레이어 계급 표시 (플레이어 이름 필요) - 显示玩家军阶 (玩家必须有设定名字) + 显示玩家军阶(玩家必须有设定名字) 顯示玩家軍階 (玩家必須有設定名稱) Oyuncu rütbelerini göster (oyuncu isimleri açılması gerektirir) @@ -199,8 +199,8 @@ Показывать информацию об экипаже техники, или по-умолчанию, позволяет игрокам выбрать свою настройку. По-умолчанию: Не обязывать Mostra informazioni sull'equipaggio del veicolo, oppure consenti di default di lasciare che siano i giocatori a scegliere. Default: Non Forzare 車両の乗員を表示します。標準ではプレイヤ各々が選べられます。標準: 強制しない - 승무원 정보를 표시하거나 플레이어가 직접 고르게 냅둡니다. 기본설정: 강제하지 않음 - 显示载具成员讯息。在预设的情况下,系统允许玩家自己决定开关此讯息。预设: 不显示 + 승무원 정보를 표시하거나 플레이어가 직접 고르게 놔둡니다. 기본설정: 강제하지 않음 + 显示载具成员信息。在预设的情况下,系统允许玩家自己决定开关此信息。预设:不显示 顯示載具成員訊息。在預設的情況下,系統允許玩家自己決定開關此訊息。預設: 不顯示 Araç mürettebat bilgilerini gösterin veya varsayılan olarak oyuncuların kendi başlarına seçmelerine izin verir. Varsayılan: Zorlama @@ -217,7 +217,7 @@ Mostrar nomes para unidades de IA AI ユニットの名札を表示 인공지능 인원 이름 표시 - 显示AI单位名字 + 显示 AI 单位名字 顯示AI單位名稱 AI birimleri için ad etiketlerini göster @@ -234,7 +234,7 @@ Mostra etichette nomi ed etichette gradi per unità IA alleate? Default: Non forzare 友軍の AI にも名前と階級を表示しますか? 標準: 強制しない 아군 인공지능의 계급을 표시합니까? 기본설정: 강제하지 않음 - 显示友军AI的名字和军阶? 预设: 不显示 + 显示友军 AI 的名字和军阶? 预设:不显示 顯示友軍AI的名稱和軍階? 預設: 不顯示 Dost AI birimleri için ad ve rütbe etiketleri gösterilsin mi? Varsayılan: Zorlama @@ -266,8 +266,8 @@ Affiche les noms pour les commandants de véhicule (uniquement si le client a activé l'affichage des noms). Mostra il nome sul cursore per il comandante del veicolo (solo se il client ha le Etichette Nomi attive) Default: No 車長の名札をカーソルを当てて表示します (クライアント側で名札を有効化する必要があります) 標準: 無効 - 차량의 사령관의 이름표를 표시합니다 (오직 클라이언트가 이름표를 활성화 할시에만 보입니다) 기본설정: 아니요 - 使载具指挥官能透过准心指到别的单位来显示其名字 (仅当客户端的名字功能已启用)。预设: 关闭 + 차장의 이름표를 표시합니다 (오직 클라이언트가 이름표를 활성화할 시에만 보입니다) 기본설정: 아니요 + 使载具指挥官能透过准心指到别的单位来显示其名字(仅当客户端的名字功能已启用)。预设:关闭 使載具指揮官能透過準心指到別的單位來顯示其名稱 (僅當客戶端的名稱功能已啟用)。預設: 關閉 Araç komutanı için Gösterge İsim Etiketini göster (yalnızca istemcide ad etiketleri etkinse) Varsayılan: Hayır @@ -284,7 +284,7 @@ Mostrar onda sonora (requer nome de jogadores) 音波形を表示 (プレイヤ名が必要) 음파 표시 (플레이어 이름 필요) - 当玩家讲话时,显示声波图案 (玩家必须有设定名字) + 当玩家讲话时,显示声波图案(玩家必须有设定名字) 當玩家講話時,顯示聲波圖案 (玩家必須有設定名稱) Ses Dalgalarını Göster (oyuncu isimleri gerektirir) @@ -300,8 +300,8 @@ Эффект звуковой волны над головами говорящих игроков при удерживании кнопки push-to-talk. Эта опация работает также с рациями TFAR и ACRE2. Effetto delle onde sonore sopra la testa dei giocatori parlanti quando premono il tasto PTT. Questa opzione funziona con TFAR ed ACRE2 プレイヤーが PTT キーを押している間は、音波形を表示します。このオプションは TFAR と ACRE2 で動作します。 - 플레이어가 PTT로 말할시 머리위에 음파효과를 적용합니다. 이 옵션은 TFAR과 ACRE2가 있을때만 적용됩니다. - 当玩家使用按键发话时,其头上的角色名字旁会显示声波的图案。此功能可搭配TFAR、ACRE2等模组使用。 + 플레이어가 눌러서 말할 시 머리위에 음파효과를 적용합니다. 이 옵션은 TFAR과 ACRE2가 있을 때만 적용됩니다. + 当玩家使用按键发话时,其头上的角色名字旁会显示声波的图案。此功能可搭配 TFAR、ACRE2 等模组使用。 當玩家使用按鍵發話時,其頭上的角色名稱旁會顯示聲波的圖案。此功能可搭配TFAR、ACRE2等模組使用。 Bas Konuş tuşunu basılı tuttuktan sonra ses dalgalarının konuşan oyuncuların başlarının üzerindeki etkisi. Bu seçenek TFAR ve ACRE2 ile çalışır. @@ -318,7 +318,7 @@ Usa impostazioni Etichette Nomi 名札の設定 이름표 설정 사용 - 玩家名字设定 + 玩家名称设定 玩家名稱設定 İsim etiketi ayarlarını kullan @@ -352,7 +352,7 @@ Distanza Visiva Etichette Nomi プレイヤ名が見える範囲 플레이어 이름 표시 거리 - 玩家名字显示距离 + 玩家名称显示距离 玩家名稱顯示距離 Oyuncu Adlarını Görüntüleme Mes. @@ -369,7 +369,7 @@ Distanza in metri a cui sono visibili i nomi giocatori. Default: 5 プレイヤの周り何メートルまで名札を表示できます。標準: 5 플레이어 이름이 표시되는 미터. 기본설정: 5 - 设定名字在多少距离以内显示。预设:5公尺 + 设定名字在多少距离以内显示。预设:5米 設定名稱在多少距離以內顯示。預設:5公尺 Oyuncu adlarının gösterildiği metre cinsinden mesafe. Varsayılan: 5 @@ -377,7 +377,7 @@ Player tags transparency Spielernamen Transparenz プレイヤー名札の透明度 - 玩家名字标签透明度 + 玩家名称标签透明度 玩家名稱透明度 Trasparenza Etichette Nome Przezroczystość etykiet gracza @@ -387,6 +387,7 @@ Průhlednost jmenovek Transparencia de etiquetas de jugadores Oyuncu etiketlerinde şeffaflık + 플레이어 이름 투명도 Nametags Size @@ -401,7 +402,7 @@ Dimensione Etichette Nome 名札の大きさ 이름표 크기 - 玩家名字标记大小 + 玩家名称标记大小 玩家名稱標記大小 Isim Etiketi Büyüklüğü @@ -434,8 +435,8 @@ Colore dei nomi non appartenenti al gruppo Cor padrão do nome (unidades fora do grupo) 標準の名札の色(グループ メンバ以外) - 기본 이름표 색상 (비-그룹 멤버) - 预设名字颜色 (非同小队队友) + 기본 이름표 색상 (비그룹 멤버) + 预设名字颜色(非同小队队友) 預設名稱顏色 (非同小隊隊友) Varsayılan İsim Etiketi Rengi (Grup Üyeleri Olmayanlar) @@ -502,7 +503,7 @@ Обязательно: Только по нажатию клавиши Forza Mostra solo quando Premi Tasto キー押下のみに強制する - 키를 누를경우만 강제로 해당 + 키를 누를 경우만 강제로 해당 强制仅显示在按按键时 強制僅顯示在按按鍵時 Gösteriyi Yalnızca Tuşa Basıldığında Zorla @@ -519,7 +520,7 @@ Обязательно: Под курсором или по нажатию клавиши Forza Mostra solo su Cursore e quando Premi Tasto カーソルとキー押下のみに強制する - 커서와 키를 누를경우만 강제로 해당 + 커서와 키를 누를 경우만 강제로 해당 强制显示在准心指到和按按键时 強制顯示在準心指到和按按鍵時 Göstermeyi Yalnızca İmleç ve Tuşa Basmaya Zorla @@ -531,6 +532,8 @@ Coefficient de luminosité ambiante Spielernamen Umgebungshelligkeitskoeffizient Współczynnik jasności otoczenia + 铭牌的环境亮度系数 + 이름표 배경 밝기 계수 Adjusts how strongly ambient brightness affects nametag view distance. @@ -539,6 +542,8 @@ Définit à quel point le manque de lumière ambiante abaisse la distance de visibilité du nom des joueurs. Stellt ein, wie stark sich die Umgebungshelligkeit auf die Sichtweite der Spielernamen auswirkt. Definiuje jak bardzo jasność otoczenia wpływa na zasięg wyświetlania imion postaci. + 调整环境亮度对铭牌查看距离的影响程度。 + 배경 밝기가 이름표를 보는 거리에 얼마나 영향을 끼치는 지를 조절합니다. diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 63752fb20c..2de00d2180 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -7,7 +7,7 @@ ACE Visione notturna ACE-Nachtsicht ACE夜視鏡 - ACE夜视镜 + ACE 夜视仪 ACE Vision Nocturne ACE Noktowizja ACE ПНВ @@ -15,6 +15,7 @@ ACE Noční vidění ACE Gece Görüşü ACE visión nocturna + ACE 야간투시 NV Goggles (Gen1, Brown) @@ -23,6 +24,8 @@ 暗視装置 (第1世代、ブラウン) Gogle noktowizyjne (Gen 1, Brązowe) NS-Brille (1. Gen., braun) + 夜视仪(一代,棕色) + 아투경 (1세대, 갈색) NV Goggles (Gen1, Black) @@ -31,6 +34,8 @@ 暗視装置 (第1世代、ブラック) Gogle noktowizyjne (Gen 1, Czarne) NS-Brille (1. Gen., schwarz) + 夜视仪(一代,黑色) + 아투경 (1세대, 검정색) NV Goggles (Gen1, Green) @@ -39,6 +44,8 @@ 暗視装置 (第1世代、グリーン) Gogle noktowizyjne (Gen 1, Zielone) NS-Brille (1. Gen., grün) + 夜视仪(一代,绿色) + 아투경 (1세대, 녹색) NV Goggles (Gen2, Brown) @@ -47,6 +54,8 @@ 暗視装置 (第2世代、ブラウン) Gogle noktowizyjne (Gen 2, Brązowe) NS-Brille (2. Gen., braun) + 夜视仪(二代,棕色) + 아투경 (2세대, 갈색) NV Goggles (Gen2, Black) @@ -55,6 +64,8 @@ 暗視装置 (第2世代、ブラック) Gogle noktowizyjne (Gen 2, Czarne) NS-Brille (2. Gen., schwarz) + 夜视仪(二代,黑色) + 아투경 (2세대, 검정색) NV Goggles (Gen2, Green) @@ -63,6 +74,8 @@ 暗視装置 (第2世代、グリーン) Gogle noktowizyjne (Gen 2, Zielone) NS-Brille (2. Gen., grün) + 夜视仪(二代,绿色) + 아투경 (2세대, 녹색) NV Goggles (Gen3) @@ -77,7 +90,7 @@ Éjjellátó szemüveg (3. Gen.) 暗視装置 (第3世代) 야투경 (3세대) - 夜视镜 (三代) + 夜视仪(三代) 夜視鏡 (三代) GG Gözlüğü (3. Jen) @@ -94,7 +107,7 @@ Éjjellátó szemüveg (3. Gen., barna) 暗視装置 (第3世代、ブラウン) 야투경 (3세대, 갈색) - 夜视镜 (三代, 棕色) + 夜视仪(三代,棕色) 夜視鏡 (三代, 棕色) GG Gözlüğü (3. Jen Kahverengi) @@ -111,7 +124,7 @@ Éjjellátó szemüveg (3. Gen., zöld) 暗視装置 (第3世代、グリーン) 야투경 (3세대, 녹색) - 夜视镜 (三代, 绿色) + 夜视仪(三代,绿色) 夜視鏡 (三代, 綠色) GG Gözlüğü (3. Jen Yeşil) @@ -128,7 +141,7 @@ Éjjellátó szemüveg (3. Gen., fekete) 暗視装置 (第3世代、ブラック) 야투경 (3세대, 검정색) - 夜视镜 (三代, 黑色) + 夜视仪(三代,黑色) 夜視鏡 (三代, 黑色) GG Gözlüğü (3. Jen Siyah) @@ -139,6 +152,8 @@ 暗視装置 (第4世代、ブラウン) Gogle noktowizyjne (Gen 4, Brązowe) NS-Brille (4. Gen., braun) + 夜视仪(四代,棕色) + 야투경 (4세대, 갈색) NV Goggles (Gen4, Black) @@ -147,6 +162,8 @@ 暗視装置 (第3世代、ブラック) Gogle noktowizyjne (Gen 4, Czarne) NS-Brille (4. Gen., schwarz) + 夜视仪(四代,黑色) + 야투경 (4세대, 검정색) NV Goggles (Gen4, Green) @@ -155,6 +172,8 @@ 暗視装置 (第3世代、グリーン) Gogle noktowizyjne (Gen 4, Zielone) NS-Brille (4. Gen., grün) + 夜视仪(四代,绿色) + 야투경 (4세대, 녹색) NV Goggles (Wide, Brown) @@ -163,6 +182,8 @@ 暗視装置 (ワイド、ブラウン) Gogle noktowizyjne (Szerokie, Brązowe) NS-Brille (Weit, braun) + 夜视仪(宽,棕色) + 야투경 (넓음, 갈색) NV Goggles (Wide, Black) @@ -171,6 +192,8 @@ 暗視装置 (ワイド、ブラック) Gogle noktowizyjne (Szerokie, Czarne) NS-Brille (Weit, schwarz) + 夜视仪(宽,黑色) + 야투경 (넓음, 검정색) NV Goggles (Wide, Green) @@ -179,6 +202,8 @@ 暗視装置 (ワイド、グリーン) Gogle noktowizyjne (Szerokie, Zielone) NS-Brille (Weit, grün) + 夜视仪(宽,绿色) + 야투경 (넓음, 녹색) Brightness: %1 @@ -193,7 +218,7 @@ Luminosità: %1 明度: %1 밝기: %1 - 亮度: %1 + 亮度:%1 亮度: %1 Parlaklık: %1 @@ -210,7 +235,7 @@ Aumenta la luminosità dell'NVG 暗視装置の明度を上げる 야투경 밝기 높이기 - 增加夜视镜亮度 + 增加夜视仪亮度 增加夜視鏡亮度 Gece Görüşü Parlaklığını Arttır @@ -227,7 +252,7 @@ Riduci la luminosità dell'NVG 暗視装置の明度を下げる 야투경 밝기 줄이기 - 减少夜视镜亮度 + 减少夜视仪亮度 減少夜視鏡亮度 Gece Görüşü Parlaklığını Düşür @@ -243,7 +268,7 @@ Vision nocturne 暗視装置 야간투시경 - 夜视 + 夜视仪 夜視 Gece Görüşü @@ -259,7 +284,7 @@ Réglages pour la vision nocturne. 暗視装置の設定をします。 야간투시경 설정 - 设定夜视选项. + 设置夜视仪选项。 設定夜視選項 Gece görüşü ayarı. @@ -274,8 +299,8 @@ Desactivar NVG en miras Désactiver les JVN dans les viseurs スコープでは暗視装置を無効化 - 조준경 사용시 야투경 비활성화 - 使用瞄准镜时关闭夜视镜 + 조준경 사용 시 야투경 비활성화 + 使用瞄准镜时关闭夜视仪 使用瞄準鏡時關閉夜視鏡 Gece görüşünü dürbünde kapat. @@ -290,8 +315,8 @@ Desactiva el uso de gafas visión nocturna cuando se utilizan miras normales. Bloque l'usage des JVN pendant la visée. スコープで狙いを付けると、暗視装置を無効化します。 - 조준시 야투경의 사용을 제한합니다. - 此功能开启后,当要使用瞄准镜时,为避免夜视镜镜头碰撞到瞄准镜,会先拿开夜视镜后再进行瞄准镜瞄准。 + 조준 시 야투경의 사용을 제한합니다. + 此功能开启后,当要使用瞄准镜时,为避免夜视仪镜头碰撞到瞄准镜,会先拿开夜视仪后再进行瞄准镜瞄准。 此功能開啟後,當要使用瞄準鏡時,為避免夜視鏡鏡頭碰撞到瞄準鏡,會先拿開夜視鏡後再進行瞄準鏡瞄準 @@ -300,13 +325,14 @@ Livello Nebbia NVG Nebel in Nachtsicht 夜視鏡霧氣程度 - 夜视镜雾气程度 + 夜视仪雾气程度 Épaisseur du brouillard (JVN) Skala Mgły NVG Степень размытия ПНВ Escala de Névoa na NVG Míra mlhy pro noktovizor Escala de niebla NVG + 야투경 안개 규모 Fog is used to limit visibility. @@ -314,13 +340,14 @@ La nebbia viene utilizzata per limitare la visibilità. Nebel wird genutzt, um die Sichtbarkeit einzuschränken. 透過霧氣來縮減夜視鏡的可視距離 - 透过雾气来缩减夜视镜的可视距离。 + 透过雾气来缩减夜视仪的可视距离。 Le brouillard est utilisé pour limiter la visibilité. Mgła jest wykorzystywana do ograniczenia widoczności. Туман используется для ограничения видимости Névoa é usada para limitar visibilidade. Mlha je použita pro omezení dohledu. Niebla es usada para limitar la visibilidad + 안개로 시야를 제한합니다 NVG Effect Scale @@ -328,13 +355,14 @@ Effetto livello NVG Nachtsichteffekte 夜視鏡效果程度 - 夜视镜效果程度 + 夜视仪效果程度 Intensité des effets Skala Efektów NVG Степень эффектов ПНВ Intensidade de efeito da Visão Noturna Míra efektu pro noktovizor Escala del efecto NVG + 야투경 효과 스케일 Blur and brightness effects [Setting to 0 will disable ALL nightvision effects] @@ -342,13 +370,14 @@ Effetti di sfocatura e luminosità [Importare a 0 disabiliterà TUTTI gli effetti della visione notturna] Unschärfe und Helligkeitseffekte [Dies auf 0 zu setzen deaktiviert SÄMTLICHE Nachtsichteffekte] 調整模糊與亮度的效果。[設值為0會關閉所有夜視鏡的特殊效果] - 调整模糊与亮度的效果。[设值为0会关闭所有夜视镜的特殊效果] + 调整模糊与亮度的效果。[设值为0会关闭所有夜视仪的特殊效果] Effets de flou et de luminosité. [Régler cette option sur 0 désactivera TOUS les effets de vision nocturne.] Efekty rozmazania i jasności [Ustawienie na 0 wyłączy WSZYSTKIE efekty noktowizji] Эффекты размытия и яркости [Установка на 0 отключит ВСЕ эффекты ПНВ] Efeitos de borrão e brilho [Definir 0 desativa TODOS os efeitos da Visão Noturna] Rozostření a jas [Nastavení na 0 vypne VŠECHNY efekty nočního vidění] Efectos de emborronado y brillo [Configuración a 0 deshabilita todos los efectos de visión nocturna] + 흐림과 밝기 효과 [0으로 설정하면 효과를 제거합니다] Aim Down Sights Blur @@ -363,12 +392,13 @@ Borrão ao mirar Rozostření při použití mířidel Emborronado al mirar + 조준 시 조준경 흐림 NVG Noise Scale Intensität des Bildrauschens 夜視鏡雜訊程度 - 夜视镜杂讯程度 + 夜视仪噪声强度 暗視装置のノイズ度 Intensité du bruit (JVN) Fattore di Disturbo del NVG @@ -377,12 +407,13 @@ Intensidade de Ruído/Efeito Granulado Míra šumu pro noktovizor Escala de ruido/granulado NVG + 야투경 노이즈 규모 Image noise intensity when wearing NVGs Intensität des Bildrauschens im Nachtsichtgerät 調整配戴夜視鏡時畫面雜訊的多寡。 - 调整配戴夜视镜时画面杂讯的多寡。 + 调整配戴夜视仪时画面噪声的强度。 暗視装置を使用時に起きる画像ノイズの強度です Intensité du bruit de l'image lorsque vous portez des JVN. Intensità del disturbo dell'immagine quando i NVG sono equipaggiati @@ -391,6 +422,7 @@ Intensidade de Ruído de Imagem ao utilizar Visão Noturna Intezita šumu při používání noktovizoru Intensidad de ruido de la imagen cuando se usa NVG + 야투경 착용 시 보여지는 노이즈의 정도를 조절합니다 Shutter Effects @@ -405,6 +437,7 @@ Efeito de Obturador Efekt závěrky Efecto de obturador + 셔터효과 Rolling shutter effect from muzzle flashes @@ -419,6 +452,7 @@ Efeito de rolamento de Obturador de flashes de focinho Efekt závěrky z důsledku výšlehu při střelbě Efecto obturador por los fogonazos de la boca del cañón + 총구화염에 의한 셔터효과를 구현합니다 diff --git a/addons/nlaw/stringtable.xml b/addons/nlaw/stringtable.xml index 6ac169dcc8..8181b4e0fe 100644 --- a/addons/nlaw/stringtable.xml +++ b/addons/nlaw/stringtable.xml @@ -6,7 +6,7 @@ NLAW Zielverfolgung NLAW Traccia Bersaglio (Mantieni) NALW 目標の追跡 (押しっぱ) - 次世代轻型反坦克导弹发射器追踪目标 (按住) + NLAW 追踪目标(按住) 次世代輕型反坦克導彈發射器追蹤目標 (按住) Śledzenie Celu NLAW (Przytrzymaj) NLAW 목표 추적 (누름유지) @@ -25,7 +25,7 @@ 直射模式 直射模式 Bezpośredni atak - 직접 사격 + 직선 공격 Прямая атака Ataque Direto Attaque directe @@ -38,7 +38,7 @@ Überflugangriff Attacco dall'alto オーバーフライ トップ アタック - 攻顶模式 + 飞越攻顶模式 攻頂模式 Atak z góry 탑어택 diff --git a/addons/noradio/initSettings.sqf b/addons/noradio/initSettings.sqf index 82b8a37126..5c558064da 100644 --- a/addons/noradio/initSettings.sqf +++ b/addons/noradio/initSettings.sqf @@ -1,9 +1,7 @@ -private _category = [LELSTRING(common,ACEKeybindCategoryCommon), QUOTE(COMPONENT_BEAUTIFIED)]; - [ QGVAR(enabled), "CHECKBOX", [LSTRING(setting), LSTRING(setting_tooltip)], - _category, + [LELSTRING(Common,CategoryUncategorized), LLSTRING(DisplayName)], true, true, { params ["_enabled"]; diff --git a/addons/noradio/stringtable.xml b/addons/noradio/stringtable.xml index affc778e6a..6da884d07a 100644 --- a/addons/noradio/stringtable.xml +++ b/addons/noradio/stringtable.xml @@ -1,6 +1,14 @@ + + No Radio + 去无线电 + Kein Funkgerät + 음소거 + Brak Radia + 無線無し + Mute Player Spieler stummschalten @@ -15,6 +23,7 @@ Ztlumit hráče Oyuncuyu Sustur Ensordecer jugador + 플레이어 음소거 Mutes the controlled player avatar. @@ -30,6 +39,7 @@ Vypne hlas charakteru hráče. Oyuncuları Susturur Ensordecer el avatar del jugador controlado + 플레이어 아바타를 음소거합니다 diff --git a/addons/novehicleclanlogo/$PBOPREFIX$ b/addons/novehicleclanlogo/$PBOPREFIX$ new file mode 100644 index 0000000000..8232a79524 --- /dev/null +++ b/addons/novehicleclanlogo/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\novehicleclanlogo diff --git a/addons/novehicleclanlogo/CfgEventHandlers.hpp b/addons/novehicleclanlogo/CfgEventHandlers.hpp new file mode 100644 index 0000000000..6c29240403 --- /dev/null +++ b/addons/novehicleclanlogo/CfgEventHandlers.hpp @@ -0,0 +1,18 @@ + +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/novehicleclanlogo/README.md b/addons/novehicleclanlogo/README.md new file mode 100644 index 0000000000..4a058d99ba --- /dev/null +++ b/addons/novehicleclanlogo/README.md @@ -0,0 +1,4 @@ +novehicleclanlogo +============= + +Prevents clan logo from being displayed on vehicles controlled by players. diff --git a/addons/novehicleclanlogo/XEH_PREP.hpp b/addons/novehicleclanlogo/XEH_PREP.hpp new file mode 100644 index 0000000000..a835a8884f --- /dev/null +++ b/addons/novehicleclanlogo/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(removeClanLogo); diff --git a/addons/novehicleclanlogo/XEH_postInit.sqf b/addons/novehicleclanlogo/XEH_postInit.sqf new file mode 100644 index 0000000000..ec2049c4a1 --- /dev/null +++ b/addons/novehicleclanlogo/XEH_postInit.sqf @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +// clan logos are not used in singleplayer +if (!isMultiplayer) exitWith {}; + +["CBA_settingsInitialized", { + TRACE_1("settingsInit eh",GVAR(enabled)); + + if (isServer && {GVAR(enabled)}) then { + ["LandVehicle", "initPost", LINKFUNC(removeClanLogo), true, [], true] call CBA_fnc_addClassEventHandler; + ["Air", "initPost", LINKFUNC(removeClanLogo), true, [], true] call CBA_fnc_addClassEventHandler; + ["Ship", "initPost", LINKFUNC(removeClanLogo), true, [], true] call CBA_fnc_addClassEventHandler; + }; +}] call CBA_fnc_addEventHandler; diff --git a/addons/novehicleclanlogo/XEH_preInit.sqf b/addons/novehicleclanlogo/XEH_preInit.sqf new file mode 100644 index 0000000000..9361d05015 --- /dev/null +++ b/addons/novehicleclanlogo/XEH_preInit.sqf @@ -0,0 +1,11 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +ADDON = true; diff --git a/addons/novehicleclanlogo/XEH_preStart.sqf b/addons/novehicleclanlogo/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/novehicleclanlogo/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/novehicleclanlogo/config.cpp b/addons/novehicleclanlogo/config.cpp new file mode 100644 index 0000000000..77c7dce638 --- /dev/null +++ b/addons/novehicleclanlogo/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"veteran29"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/addons/novehicleclanlogo/functions/fnc_removeClanLogo.sqf b/addons/novehicleclanlogo/functions/fnc_removeClanLogo.sqf new file mode 100644 index 0000000000..0b35e608fc --- /dev/null +++ b/addons/novehicleclanlogo/functions/fnc_removeClanLogo.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: veteran29 + * Replaces the vehicle clan logo with an empty texture. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * [vehicle player] call ace_novehicleclanlogo_fnc_removeClanLogo + * + * Public: Yes + */ + +params ["_vehicle"]; + +private _selectionClan = getText (configOf _vehicle >> "selectionClan"); +if !(_selectionClan in selectionNames _vehicle) exitWith { + TRACE_2("vehicle does not have 'selectionClan' selection",_vehicle,_selectionLogo); +}; + +TRACE_1("replacing clan logo with empty texture",_vehicle); +_vehicle setObjectTextureGlobal [_selectionClan, "#(argb,1,1,1)color(0,0,0,0)"] // return diff --git a/addons/novehicleclanlogo/functions/script_component.hpp b/addons/novehicleclanlogo/functions/script_component.hpp new file mode 100644 index 0000000000..41e852be27 --- /dev/null +++ b/addons/novehicleclanlogo/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\novehicleclanlogo\script_component.hpp" diff --git a/addons/novehicleclanlogo/initSettings.sqf b/addons/novehicleclanlogo/initSettings.sqf new file mode 100644 index 0000000000..471877ca5c --- /dev/null +++ b/addons/novehicleclanlogo/initSettings.sqf @@ -0,0 +1,11 @@ +private _category = [ELSTRING(common,ACEKeybindCategoryVehicles), LSTRING(DisplayName)],; + +[ + QGVAR(enabled), "CHECKBOX", + [LELSTRING(common,Enabled), LSTRING(Enabled_Tooltip)], + _category, + false, + true, + {}, + true +] call CBA_fnc_addSetting; diff --git a/addons/novehicleclanlogo/script_component.hpp b/addons/novehicleclanlogo/script_component.hpp new file mode 100644 index 0000000000..eef91354bd --- /dev/null +++ b/addons/novehicleclanlogo/script_component.hpp @@ -0,0 +1,16 @@ +#define COMPONENT novehicleclanlogo +#define COMPONENT_BEAUTIFIED No Vehicle Clan Logo +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE + +#ifdef DEBUG_ENABLED_NOVEHICLECLANLOGO + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_ENABLED_NOVEHICLECLANLOGO + #define DEBUG_SETTINGS DEBUG_ENABLED_NOVEHICLECLANLOGO +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/novehicleclanlogo/stringtable.xml b/addons/novehicleclanlogo/stringtable.xml new file mode 100644 index 0000000000..70aaa50e17 --- /dev/null +++ b/addons/novehicleclanlogo/stringtable.xml @@ -0,0 +1,13 @@ + + + + + Remove clan logo from vehicles + Usuń logo klanu z pojazdów + + + Prevents clan logo from being displayed on vehicles controlled by players. + Zapobiega wyświetlaniu logo klanu na pojazdach kontrolowanych przez graczy. + + + diff --git a/addons/optics/stringtable.xml b/addons/optics/stringtable.xml index 58763da8d6..727399af36 100644 --- a/addons/optics/stringtable.xml +++ b/addons/optics/stringtable.xml @@ -14,7 +14,7 @@ RCO (2D) RCO (2D) RCO (2D) - 步枪战斗光学瞄准镜(2D) + RCO(2D) 步槍戰鬥光學瞄準鏡(2D) RCO (2D) @@ -31,7 +31,7 @@ RCO (PIP) RCO (PIP) RCO (PIP) - 步枪战斗光学瞄准镜(拟真版) + RCO(画中画) 步槍戰鬥光學瞄準鏡(擬真版) RCO (PIP) @@ -48,7 +48,7 @@ ARCO (2D) ARCO (2D) ARCO (2D) - 先进步枪战斗光学瞄准镜(2D) + ARCO(2D) 先進步槍戰鬥光學瞄準鏡(2D) ARCO (2D) @@ -65,7 +65,7 @@ ARCO (PIP) ARCO (PIP) ARCO (PIP) - 先进步枪战斗光学瞄准镜(拟真版) + ARCO(画中画) 先進步槍戰鬥光學瞄準鏡(擬真版) ARCO (PIP) @@ -82,7 +82,7 @@ MRCO (2D) MRCO (2D) MRCO (2D) - 多距离战斗瞄准镜(2D) + MRCO(2D) 多距離戰鬥瞄準鏡(2D) MRCO (2D) @@ -99,7 +99,7 @@ MRCO (PIP) MRCO (PIP) MRCO (PIP) - 多距离战斗瞄准镜(拟真版) + MRCO(画中画) 多距離戰鬥瞄準鏡(擬真版) MRCO (PIP) @@ -116,7 +116,7 @@ MOS (2D) MOS (2D) MOS (2D) - 精准光学瞄准镜(2D) + MOS(2D) 精準光學瞄準鏡(2D) MOS (2D) @@ -133,7 +133,7 @@ MOS (PIP) MOS (PIP) MOS (PIP) - 精准光学瞄准镜(拟真版) + MOS(画中画) 精準光學瞄準鏡(擬真版) MOS (PIP) @@ -150,7 +150,7 @@ LRPS (2D) LRPS (2D) LRPS (2D) - 长距离精确瞄准镜(2D) + LRPS(2D) 長距離精確瞄準鏡(2D) LRPS (2D) @@ -167,7 +167,7 @@ LRPS (PIP) LRPS (PIP) LRPS (PIP) - 长距离精确瞄准镜(拟真版) + LRPS(画中画) 長距離精確瞄準鏡(擬真版) LRPS (PIP) diff --git a/addons/optionsmenu/config.cpp b/addons/optionsmenu/config.cpp index 5661753579..811b1eecec 100644 --- a/addons/optionsmenu/config.cpp +++ b/addons/optionsmenu/config.cpp @@ -38,6 +38,6 @@ class ACE_Extensions { class CfgCommands { allowedHTMLLoadURIs[] += { - "https://ace3mod.com/version.html" + "https://ace3.acemod.org/version.html" }; }; diff --git a/addons/optionsmenu/init_loadMainMenuBox.sqf b/addons/optionsmenu/init_loadMainMenuBox.sqf index 5b21d7aabb..78ba6e839d 100644 --- a/addons/optionsmenu/init_loadMainMenuBox.sqf +++ b/addons/optionsmenu/init_loadMainMenuBox.sqf @@ -51,7 +51,7 @@ if (profileNamespace getVariable [QGVAR(showNewsOnMainMenu), true]) then { _versionStr = _versionStr joinString "."; (_display displayCtrl IDC_MAIN_INFO_CURRENT_VERSION_INFO) ctrlSetText format ["Version: %1", _versionStr]; - (_display displayCtrl IDC_MAIN_INFO_NEWEST_VERSION_INFO) htmlLoad "https://ace3mod.com/version.html"; + (_display displayCtrl IDC_MAIN_INFO_NEWEST_VERSION_INFO) htmlLoad "https://ace3.acemod.org/version.html"; } else { _controlsGroup ctrlShow false; }; diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 9fc44b3beb..e804411504 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -13,8 +13,8 @@ Отладка в буфер обмена Debug su Blocco Note クリップボードにデバッグ - 디버그를 클립보드로 - 复制除错讯息至剪贴簿 + 클립보드를 디버그하기 + 复制调试信息至剪贴板 複製除錯訊息至剪貼簿 Panoya Hata Ayıkla @@ -31,7 +31,7 @@ Invia informazioni di debug all'RPT e al Blocco Note デバッグ情報を RPT とクリップボードに送ります。 디버그 정보를 보고하기 및 클립보드에 복사하기 위해 보냅니다. - 复制除错讯息至剪贴簿与RPT报告档中。 + 复制调试信息至剪贴板与 RPT 报告档中。 複製除錯訊息至剪貼簿與RPT報告檔中 Hata ayıklama bilgilerini RPT ve panoya gönderir. @@ -48,7 +48,7 @@ Sistema Bug della Testa ヘッドバグ修正 헤드버그 수정 - 修复动作BUG + 修复动作 BUG 修復動作BUG Animasyon Düzeltme @@ -65,7 +65,7 @@ Resetta il tuo stato animazione 現在のアニメーション状態を初期化します。 자신의 동작 상태 초기화 - 当ACE发生动作BUG时,点此修复。 + 当 ACE 发生动作 BUG 时,点此修复。 當ACE發生動作BUG時,點此修復 Animasyon durumunuzu sıfırlar. @@ -81,8 +81,8 @@ Новости ACE Novità ACE ACE ニュース - ACE 새소식 - ACE新闻 + ACE 새 소식 + ACE 新闻 ACE新聞 ACE Haberler @@ -98,8 +98,8 @@ Zobrazit zprávy v hlavním menu Mostra News nel Menù Princinpale メイン画面にニュースを表示します - 메인메뉴에 새소식을 표시합니다 - 显示新闻消息于主选单 + 메인메뉴에 새 소식을 표시합니다 + 显示新闻消息于主菜单 顯示新聞消息於主選單 Ana Menü de Haberleri Göster diff --git a/addons/overheating/CfgVehicles.hpp b/addons/overheating/CfgVehicles.hpp index 5a854699e2..e17f030a2b 100644 --- a/addons/overheating/CfgVehicles.hpp +++ b/addons/overheating/CfgVehicles.hpp @@ -38,7 +38,7 @@ class CfgVehicles { }; class GVAR(CoolWeaponWithItem) { displayName = CSTRING(CoolWeaponWithItem); - condition = QUOTE(GVAR(enabled) && {isClass (configfile >> 'CfgPatches' >> 'acex_field_rations')}); + condition = QUOTE(call FUNC(canCoolWeaponWithItem)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; statement = "true"; showDisabled = 0; @@ -66,7 +66,7 @@ class CfgVehicles { }; class GVAR(CoolWeaponWithItem) { displayName = CSTRING(CoolWeaponWithItem); - condition = QUOTE(GVAR(enabled) && {isClass (configfile >> 'CfgPatches' >> 'acex_field_rations')}); + condition = QUOTE(call FUNC(canCoolWeaponWithItem)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; statement = "true"; showDisabled = 0; diff --git a/addons/overheating/XEH_PREP.hpp b/addons/overheating/XEH_PREP.hpp index f4b56c3c3f..865a049569 100644 --- a/addons/overheating/XEH_PREP.hpp +++ b/addons/overheating/XEH_PREP.hpp @@ -3,22 +3,28 @@ PREP(calculateCooling); PREP(canUnjam); PREP(canSwapBarrel); PREP(canCheckSpareBarrelsTemperatures); +PREP(canCoolWeaponWithItem); PREP(checkSpareBarrelsTemperatures); PREP(checkTemperature); PREP(clearJam); +PREP(cookoffWeapon); PREP(coolWeaponWithItem); PREP(coolWeaponWithWaterSource); PREP(displayTemperature); PREP(firedEH); +PREP(getAmmoTemperature); PREP(getBarrelMass); PREP(getConsumableChildren); PREP(getWeaponData); +PREP(getWeaponTemperature); PREP(handleTakeEH); PREP(handleRespawn); PREP(jamWeapon); PREP(loadCoolestSpareBarrel); PREP(overheat); PREP(sendSpareBarrelsTemperaturesHint); +PREP(setAmmoTemperature); +PREP(setWeaponTemperature); PREP(swapBarrel); PREP(swapBarrelAssistant); PREP(swapBarrelCallback); diff --git a/addons/overheating/XEH_postInit.sqf b/addons/overheating/XEH_postInit.sqf index fbd0f94f1c..bbcd9da97f 100644 --- a/addons/overheating/XEH_postInit.sqf +++ b/addons/overheating/XEH_postInit.sqf @@ -44,9 +44,9 @@ if (hasInterface) then { if !(hasInterface) exitWith {}; - GVAR(cacheWeaponData) = call CBA_fnc_createNamespace; - GVAR(cacheAmmoData) = call CBA_fnc_createNamespace; - GVAR(cacheSilencerData) = call CBA_fnc_createNamespace; + GVAR(cacheWeaponData) = createHashMap; + GVAR(cacheAmmoData) = createHashMap; + GVAR(cacheSilencerData) = createHashMap; //Add Take EH if required if (GVAR(unJamOnReload) || {GVAR(cookoffCoef) > 0}) then { @@ -76,13 +76,23 @@ if (hasInterface) then { }] call CBA_fnc_addClassEventHandler; }; + // Reset all weapon heat to ambient on death to prevent cookoffs when a unit respawns. + ["CAManBase", "Killed", { + params ["_unit"]; + { + _unit setVariable [_x, ambientTemperature select 0]; + } forEach (_unit getVariable [QGVAR(trackedWeapons), []]); + _unit setVariable [QGVAR(trackedWeapons), []]; + }] call CBA_fnc_addClassEventHandler; + // Install event handler to display temp when a barrel was swapped [QGVAR(showWeaponTemperature), DFUNC(displayTemperature)] call CBA_fnc_addEventHandler; + // Install event handler to initiate an assisted barrel swap [QGVAR(initiateSwapBarrelAssisted), DFUNC(swapBarrel)] call CBA_fnc_addEventHandler; // Add an action to allow hot weapons to be cooled off in AceX Field Rations water sources - if (isClass (configfile >> "CfgPatches" >> "acex_field_rations")) then { + if (["acex_field_rations"] call EFUNC(common,isModLoaded)) then { [ {EXGVAR(field_rations,enabled) || CBA_missionTime > 1}, { @@ -107,5 +117,4 @@ if (hasInterface) then { [] ] call CBA_fnc_waitUntilAndExecute; }; - }] call CBA_fnc_addEventHandler; diff --git a/addons/overheating/functions/fnc_calculateCooling.sqf b/addons/overheating/functions/fnc_calculateCooling.sqf index 8fd39c7024..db65fb1d2a 100644 --- a/addons/overheating/functions/fnc_calculateCooling.sqf +++ b/addons/overheating/functions/fnc_calculateCooling.sqf @@ -19,9 +19,12 @@ params ["_temperature", "_barrelMass", "_totalTime"]; -if (_temperature < 1) exitWith {0}; +// The lowest temperature a weapon can reach is the ambient air temperature. +private _ambientTemperature = ambientTemperature select 0; + // If a long time passed since the last shot, there's no need to calculate anything; the weapon should be cool -if (_totalTime > 1800) exitWith {0}; +if (_totalTime > 1800) exitWith {_ambientTemperature}; +if (_temperature <= _ambientTemperature) exitWith {_ambientTemperature}; //AR-15 (0.00570m bullet diameter) (barrel diameter usually 0.75" or 0.008255m radius) //Steel Denisty = 7850 m^3 / kg @@ -51,9 +54,9 @@ while {true} do { _convectionRate * _barrelSurface * _temperature // Radiative cooling + 0.4 * 5.67e-8 * _barrelSurface * ((_temperature + 273.15) ^ 4 - 273.15 ^ 4) - ) * _deltaTime / (_barrelMass * 466); + ) * GVAR(coolingCoef) * _deltaTime / (_barrelMass * 466); - if (_temperature < 1) exitWith {0}; + if (_temperature <= _ambientTemperature) exitWith {_ambientTemperature}; if (isNil "_temperature") exitWith { diag_log text format ["[ACE] ERROR: _totalTime = %1; _time = %2; _deltaTime = %3;", _totalTime, _time, _deltaTime]; @@ -61,5 +64,5 @@ while {true} do { }; _time = _time + _deltaTime; - if (_time >= _totalTime) exitWith { _temperature max 0 }; + if (_time >= _totalTime) exitWith {_temperature max _ambientTemperature}; }; diff --git a/addons/overheating/functions/fnc_canCoolWeaponWithItem.sqf b/addons/overheating/functions/fnc_canCoolWeaponWithItem.sqf new file mode 100644 index 0000000000..d91610d7ab --- /dev/null +++ b/addons/overheating/functions/fnc_canCoolWeaponWithItem.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: drofseh + * Return true if the target's weapon can be cooled with an item in the player's inventory + * + * Arguments: + * 0: Target + * 1: Player + * + * Return Value: + * Bool + * + * Example: + * [cursorObject, player] call ace_overheating_fnc_canCoolWeaponWithItem + * + * Public: No + */ + +params ["_unit", "_player"]; +TRACE_2("canCoolWeaponWithItem",_unit,_player); + +GVAR(enabled) +&& {["acex_field_rations"] call EFUNC(common,isModLoaded)} +&& {!(_unit getVariable [QEGVAR(captives,isSurrendering), false])} // interaction point will overlap with ace_captives +&& {!(_unit getVariable [QEGVAR(captives,isHandcuffed), false])} +&& {[_unit, currentWeapon _unit] call FUNC(getWeaponTemperature) > (ambientTemperature select 0)} +&& {((_player call EFUNC(common,uniqueItems)) findIf {getNumber (configFile >> "CfgWeapons" >> _x >> QEXGVAR(field_rations,thirstQuenched)) > 0}) != -1} diff --git a/addons/overheating/functions/fnc_cookoffWeapon.sqf b/addons/overheating/functions/fnc_cookoffWeapon.sqf new file mode 100644 index 0000000000..ae2311243c --- /dev/null +++ b/addons/overheating/functions/fnc_cookoffWeapon.sqf @@ -0,0 +1,66 @@ +#include "script_component.hpp" +/* + * Author: drofseh + * Cookoff loaded round. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Is Weapon Jammed + * 3: Type of Jam + * + * Return Value: + * None + * + * Example: + * [player, currentWeapon player, true, "Fire"] call ace_overheating_fnc_cookoffWeapon + * + * Public: No + */ + +params ["_unit", "_weapon", "_canUnjam", "_jamType"]; +TRACE_4("params",_unit,_weapon,_canUnjam,_jamType); + +// a weapon with a failure to fire or dud type jam will be unjammed from cooking off +// this is first so that the fired event from the cookoff can also cause a jam +if (_canUnjam && {_jamType in ["Fire","Dud"]}) then { + [_unit, currentMuzzle _unit, true] call FUNC(clearJam); + + // clearJam will remove a dud round, but so will the forced fire, so give back the lost round and shoot it + if (_jamType isEqualTo "Dud") then { + _unit setAmmo [_weapon, (_unit ammo _weapon) + 1]; + }; +}; + +// get valid mode and muzzle for the main weapon, we don't want the cookoff to come from an underbarrel launcher +([_weapon] call FUNC(getWeaponData)) params ["", "", "", "_modes", "_muzzle", "_reloadTime"]; + +// get an appropriate firemode and muzzle, cache the current muzzle +// trying to match firemodes and switching back to the cached muzzle will hide the change from the player and prevent unexpected mode/muzzle changes (going from full auto to semi auto, or from underbarrel GL to rifle for example) +private _muzzleCache = currentMuzzle _unit; +private _mode = currentWeaponMode _unit; +if !(_mode in _modes) then { + _mode = _modes select 0; +}; + +// delay cookoff to ensure any previous animation from a fired event is finished +[ + { + params ["_unit", "_mode", "_muzzle", "_muzzleCache"]; + + // fire the cookoff + _unit forceWeaponFire [_muzzle, _mode]; + + // switch back to the cached muzzle if required + if (_muzzle != _muzzleCache) then { + _unit selectWeapon _muzzleCache; + }; + + [ + [localize LSTRING(WeaponCookedOff)], + true // allows the hint to be overwritten by another hint, such as a jam or another cookoff + ] call CBA_fnc_notify; + }, + [_unit, _mode, _muzzle, _muzzleCache], + _reloadTime +] call CBA_fnc_waitAndExecute; diff --git a/addons/overheating/functions/fnc_coolWeaponWithItem.sqf b/addons/overheating/functions/fnc_coolWeaponWithItem.sqf index 7c3bf50aa9..d089c04a64 100644 --- a/addons/overheating/functions/fnc_coolWeaponWithItem.sqf +++ b/addons/overheating/functions/fnc_coolWeaponWithItem.sqf @@ -61,7 +61,7 @@ private _fnc_onSuccess = { }; // cool the weapon - private _barrelMass = _weapon call FUNC(getBarrelMass); + private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; _temperature = [_temperature, _barrelMass, _liquidAmount * 10] call FUNC(calculateCooling); [_target, _tempVarName, _temperature, TEMP_TOLERANCE] call EFUNC(common,setApproximateVariablePublic); }; diff --git a/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf b/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf index 2e142602ec..5879ea6b6c 100644 --- a/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf +++ b/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf @@ -59,7 +59,7 @@ private _fnc_condition = { }; //Cool the weapon down - private _barrelMass = _weapon call FUNC(getBarrelMass); + private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; _temperature = [_temperature, _barrelMass, 20] call FUNC(calculateCooling); [_player, _tempVarName, _temperature, TEMP_TOLERANCE] call EFUNC(common,setApproximateVariablePublic); diff --git a/addons/overheating/functions/fnc_getAmmoTemperature.sqf b/addons/overheating/functions/fnc_getAmmoTemperature.sqf new file mode 100644 index 0000000000..9855335101 --- /dev/null +++ b/addons/overheating/functions/fnc_getAmmoTemperature.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: drofseh + * Get current temperature of weapon's ammo. + * + * Arguments: + * 0: Unit + * 1: Weapon + * + * Return Value: + * Current ammunition temperature + * + * Example: + * [player, currentWeapon player] call ace_overheating_fnc_getAmmoTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon"]; + +private _ammoTempVarName = format [QGVAR(%1_ammoTemp), _weapon]; + +_unit getVariable [_ammoTempVarName, ambientTemperature select 0] diff --git a/addons/overheating/functions/fnc_getBarrelMass.sqf b/addons/overheating/functions/fnc_getBarrelMass.sqf index 1504442a60..a8eb9797ad 100644 --- a/addons/overheating/functions/fnc_getBarrelMass.sqf +++ b/addons/overheating/functions/fnc_getBarrelMass.sqf @@ -17,4 +17,6 @@ params ["_weapon"]; -METAL_MASS_RATIO * (getNumber (configFile >> "CfgWeapons" >> _weapon >> "WeaponSlotsInfo" >> "mass") / 22.0) max 1.0; +private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; + +_barrelMass diff --git a/addons/overheating/functions/fnc_getWeaponData.sqf b/addons/overheating/functions/fnc_getWeaponData.sqf index c5cfb40d4a..f2bd876a6c 100644 --- a/addons/overheating/functions/fnc_getWeaponData.sqf +++ b/addons/overheating/functions/fnc_getWeaponData.sqf @@ -7,9 +7,14 @@ * 0: weapon type * * Return Value: - * 0: dispresion + * 0: dispersion * 1: slowdownFactor * 2: jamChance + * 3: modes + * 4: muzzle + * 5: reloadTime + * 6: closedBolt + * 7: barrelMass * * Example: * ["gun"] call ace_overheating_fnc_getWeaponData @@ -20,7 +25,7 @@ params ["_weapon"]; // Look in the cache first -private _weaponData = GVAR(cacheWeaponData) getVariable _weapon; +private _weaponData = GVAR(cacheWeaponData) get _weapon; if (!isNil "_weaponData") exitWith {_weaponData}; // Search the config @@ -71,11 +76,19 @@ private _muzzle = getArray (configFile >> "CfgWeapons" >> _weapon >> "muzzles") if (_muzzle == "this") then { _muzzle = _weapon; }; + private _reloadTime = getNumber (configfile >> "CfgWeapons" >> _weapon >> (_modes select 0) >> "reloadTime"); +private _closedBolt = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(closedBolt)); + +private _barrelMass = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(barrelMass)); +if (_barrelMass <= 0) then { + _barrelMass = METAL_MASS_RATIO * (getNumber (configFile >> "CfgWeapons" >> _weapon >> "WeaponSlotsInfo" >> "mass") / 22.0) max 1.0; +}; + // Cache the values -_weaponData = [_dispersion, _slowdownFactor, _jamChance, _modes, _muzzle, _reloadTime]; +_weaponData = [_dispersion, _slowdownFactor, _jamChance, _modes, _muzzle, _reloadTime, _closedBolt, _barrelMass]; TRACE_2("building cache",_weapon,_weaponData); -GVAR(cacheWeaponData) setVariable [_weapon, _weaponData]; +GVAR(cacheWeaponData) set [_weapon, _weaponData]; _weaponData diff --git a/addons/overheating/functions/fnc_getWeaponTemperature.sqf b/addons/overheating/functions/fnc_getWeaponTemperature.sqf new file mode 100644 index 0000000000..7aa49d9d0b --- /dev/null +++ b/addons/overheating/functions/fnc_getWeaponTemperature.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: drofseh + * Get current temperature of weapon. + * + * Arguments: + * 0: Unit + * 1: Weapon + * + * Return Value: + * Current ammunition temperature + * + * Example: + * [player, currentWeapon player] call ace_overheating_fnc_getWeaponTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon"]; + +private _weaponTempVarName = format [QGVAR(%1_temp), _weapon]; + +_unit getVariable [_weaponTempVarName, ambientTemperature select 0]; diff --git a/addons/overheating/functions/fnc_jamWeapon.sqf b/addons/overheating/functions/fnc_jamWeapon.sqf index ea77e11ba4..3f6f0838c3 100644 --- a/addons/overheating/functions/fnc_jamWeapon.sqf +++ b/addons/overheating/functions/fnc_jamWeapon.sqf @@ -51,7 +51,9 @@ if (_jamTypesAllowed isEqualTo []) then { }; }; -_unit setVariable [format [QGVAR(%1_jamType), _weapon], selectRandomWeighted _jamTypesAllowed]; +private _jamType = selectRandomWeighted _jamTypesAllowed; +_unit setVariable [format [QGVAR(%1_jamType), _weapon], _jamType]; + // Stop current burst _unit setAmmo [_weapon, 0]; @@ -72,7 +74,7 @@ if (_weapon == primaryWeapon _unit) then { // only display the hint once, after you try to shoot an already jammed weapon GVAR(knowAboutJam) = false; -["ace_weaponJammed", [_unit,_weapon]] call CBA_fnc_localEvent; +["ace_weaponJammed", [_unit, _weapon, _jamType]] call CBA_fnc_localEvent; if (_unit getVariable [QGVAR(JammingActionID), -1] == -1) then { diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index f1eb7b16c0..d63dfe919d 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -26,9 +26,9 @@ TRACE_4("params",_unit,_weapon,_ammo,_projectile); BEGIN_COUNTER(overheat); // Get bullet parameters -private _energyIncrement = GVAR(cacheAmmoData) getVariable _ammo; +private _energyIncrement = GVAR(cacheAmmoData) get _ammo; if (isNil "_energyIncrement") then { - _bulletMass = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ACE_BulletMass"); + private _bulletMass = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ACE_BulletMass"); if (_bulletMass == 0) then { // If the bullet mass is not configured, estimate it _bulletMass = 3.4334 + 0.5171 * (getNumber (configFile >> "CfgAmmo" >> _ammo >> "hit") + getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber")); @@ -38,28 +38,27 @@ if (isNil "_energyIncrement") then { // Ref: https://en.wikipedia.org/wiki/Physics_of_firearms // Muzzle Engergy = 1/2 * m * v^2 = (1/2 * 0.001 g/kg * bulletMass (grams) * v^2) // Multiple by 3 becase we only calc every 3rd bullet: (3 * 1/2 * 0.001) = 0.0015 - _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); + _energyIncrement = GVAR(heatCoef) * 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); - GVAR(cacheAmmoData) setVariable [_ammo, _energyIncrement]; + GVAR(cacheAmmoData) set [_ammo, _energyIncrement]; }; // Increase overheating depending on how obstrusive is the current supressor, // if any. Typical arma supressors have visibleFire=0.5 and audibleFire=0.3, // so they produce x2.1 overheating -private _silencer = switch (_weapon) do { +private _suppressor = switch (_weapon) do { case (primaryWeapon _unit) : {(primaryWeaponItems _unit) select 0}; case (handgunWeapon _unit) : {(handgunItems _unit) select 0}; default {""}; }; -if (_silencer != "") then { - private _silencerCoef = GVAR(cacheSilencerData) getVariable _silencer; - if (isNil "_silencerCoef") then { - _silencerCoef = 1 + - (1 - getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "audibleFire")) + - (1 - getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire")); - GVAR(cacheSilencerData) setVariable [_silencer, _silencerCoef]; +if (_suppressor != "" && {GVAR(suppressorCoef) > 0}) then { + private _suppressorCoef = GVAR(cacheSilencerData) get _suppressor; + if (isNil "_suppressorCoef") then { + private _config = configFile >> "CfgWeapons" >> _suppressor >> "ItemInfo" >> "AmmoCoef"; + _suppressorCoef = GVAR(suppressorCoef) * (1 + (1 - getNumber (_config >> "audibleFire")) + (1 - getNumber (_config >> "visibleFire"))); + GVAR(cacheSilencerData) set [_suppressor, _suppressorCoef]; }; - _energyIncrement = _energyIncrement * _silencerCoef; + _energyIncrement = _energyIncrement * _suppressorCoef; }; TRACE_1("heat",_energyIncrement); diff --git a/addons/overheating/functions/fnc_setAmmoTemperature.sqf b/addons/overheating/functions/fnc_setAmmoTemperature.sqf new file mode 100644 index 0000000000..87da003cc6 --- /dev/null +++ b/addons/overheating/functions/fnc_setAmmoTemperature.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: drofseh + * Set weapon's ammo to specific temperature. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Temperature + * + * Return Value: + * None + * + * Example: + * [player, currentWeapon player, 123] call ace_overheating_fnc_setAmmoTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon", "_temp"]; + +private _ammoTempVarName = format [QGVAR(%1_ammoTemp), _weapon]; + +_unit setVariable [_ammoTempVarName, _temp]; diff --git a/addons/overheating/functions/fnc_setWeaponTemperature.sqf b/addons/overheating/functions/fnc_setWeaponTemperature.sqf new file mode 100644 index 0000000000..be63ff479e --- /dev/null +++ b/addons/overheating/functions/fnc_setWeaponTemperature.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: drofseh + * Set weapon to specific temperature. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Temperature + * + * Return Value: + * None + * + * Example: + * [player, currentWeapon player, 123] call ace_overheating_fnc_setWeaponTemperature + * + * Public: Yes + */ + +params ["_unit", "_weapon", "_temp"]; + +private _weaponTempVarName = format [QGVAR(%1_temp), _weapon]; + +_unit setVariable [_weaponTempVarName, _temp]; diff --git a/addons/overheating/functions/fnc_swapBarrelCallback.sqf b/addons/overheating/functions/fnc_swapBarrelCallback.sqf index 1f458bcc26..e385e09844 100644 --- a/addons/overheating/functions/fnc_swapBarrelCallback.sqf +++ b/addons/overheating/functions/fnc_swapBarrelCallback.sqf @@ -34,7 +34,7 @@ if (GVAR(unJamOnSwapBarrel) && {[_gunner] call FUNC(canUnjam)}) then { [localize LSTRING(SwappedBarrel), QPATHTOF(UI\spare_barrel_ca.paa)] call EFUNC(common,displayTextPicture); private _temp = _gunner getVariable [format [QGVAR(%1_temp), _weapon], 0]; -private _barrelMass = _weapon call FUNC(getBarrelMass); +private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; // Instruct the server to load the coolest spare barrel into the weapon and // store the removed barrel with the former weapon temperature. The server diff --git a/addons/overheating/functions/fnc_updateAmmoTemperature.sqf b/addons/overheating/functions/fnc_updateAmmoTemperature.sqf index 97cbc1276c..b612446b7b 100644 --- a/addons/overheating/functions/fnc_updateAmmoTemperature.sqf +++ b/addons/overheating/functions/fnc_updateAmmoTemperature.sqf @@ -9,7 +9,7 @@ * 2: Barrel Temperature * * Return Value: - * Current ammunition temperature + * New temperature * * Example: * [player, currentWeapon player, 600] call ace_overheating_fnc_updateAmmoTemperature @@ -20,23 +20,25 @@ params ["_unit", "_weapon", "_barrelTemperature"]; TRACE_3("params",_unit,_weapon,_barrelTemperature); -private _closedBolt = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(closedBolt)); +private _closedBolt = ([_weapon] call FUNC(getWeaponData)) select 6; private _canUnjam = [_unit] call FUNC(canUnjam); +private _jamType = _unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"]; // Skip if no ammo in chamber if ( _unit ammo _weapon < 1 // closed bolt, and jammed and type not failure to fire - || {_closedBolt == 1 && {_canUnjam} && {!(_unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"] in ["Fire","Dud"])}} + || {_closedBolt == 1 && {_canUnjam} && {!(_jamType in ["Fire","Dud"])}} // open bolt, and not jammed, or jammed and type not failure to fire - || {_closedBolt == 0 && {!_canUnjam || {_canUnjam && {!(_unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"] in ["Fire","Dud"])}}}} + || {_closedBolt == 0 && {!_canUnjam || {_canUnjam && {!(_jamType in ["Fire","Dud"])}}}} ) exitWith { - _unit setVariable [format [QGVAR(%1_ammoTemp), _weapon], 0]; - 0 + private _ambientTemperature = ambientTemperature select 0; + _unit setVariable [format [QGVAR(%1_ammoTemp), _weapon], _ambientTemperature]; + _ambientTemperature }; private _ammoTempVarName = format [QGVAR(%1_ammoTemp), _weapon]; -private _ammoTemperature = _unit getVariable [_ammoTempVarName, 0]; +private _ammoTemperature = _unit getVariable [_ammoTempVarName, ambientTemperature select 0]; // heat or cool the ammo if (_ammoTemperature < _barrelTemperature) then { @@ -47,58 +49,12 @@ if (_ammoTemperature < _barrelTemperature) then { _ammoTemperature = _barrelTemperature; }; -// check for cook off +// cookoff if too hot if (_ammoTemperature > (GUNPOWDER_IGNITION_TEMP * GVAR(cookoffCoef))) then { + [_unit, _weapon, _canUnjam, _jamType] call FUNC(cookoffWeapon); - // a weapon with a failure to fire or dud type jam will be unjammed from cooking off - // this is first so that the fired event from the cookoff can also cause a jam - private _jamType = _unit getVariable [format [QGVAR(%1_jamType), _weapon], "None"]; - if (_canUnjam && {_jamType in ["Fire","Dud"]}) then { - - [_unit, currentMuzzle _unit, true] call FUNC(clearJam); - - // clearJam will remove a dud round, but so will the forced fire, so give back the lost round and shoot it - if (_jamType isEqualTo "Dud") then { - private _ammo = _unit ammo _weapon; - _unit setAmmo [_weapon, _ammo + 1]; - }; - }; - - // get valid mode and muzzle for the main weapon, we don't want the cookoff to come from an underbarrel launcher - ([_weapon] call FUNC(getWeaponData)) params ["", "", "", "_modes", "_muzzle", "_reloadTime"]; - - // get an appropriate firemode and muzzle, cache the current muzzle - // trying to match firemodes and switching back to the cached muzzle will hide the change from the player and prevent unexpected mode/muzzle changes (going from full auto to semi auto, or from underbarrel GL to rifle for example) - private _muzzleCache = currentMuzzle _unit; - private _mode = currentWeaponMode _unit; - if !(_mode in _modes) then { - _mode = _modes select 0; - }; - - // delay cookoff to ensure any previous animation from a fired event is finished - [ - { - params ["_unit", "_muzzleCache", "_mode", "_muzzle"]; - - // fire the cookoff - _unit forceWeaponFire [_muzzle, _mode]; - - // switch back to the cached muzzle if required - if (_muzzle != _muzzleCache) then { - _unit selectWeapon _muzzleCache; - }; - - [ - [localize LSTRING(WeaponCookedOff)], - true // allows the hint to be overwritten by another hint, such as a jam or another cookoff - ] call CBA_fnc_notify; - }, - [_unit, _muzzleCache, _mode, _muzzle], - _reloadTime - ] call CBA_fnc_waitAndExecute; - - // if the cookoff happened then the next round should start at 0 - _ammoTemperature = 0; + // since a cookoff happened then the next round should start at the ambient temperature. + _ammoTemperature = ambientTemperature select 0; }; _unit setVariable [_ammoTempVarName, _ammoTemperature]; diff --git a/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf b/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf index 2b191102d5..4fff0f59db 100644 --- a/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf +++ b/addons/overheating/functions/fnc_updateAmmoTemperatureThread.sqf @@ -15,6 +15,11 @@ * Public: No */ +// If the ace_overheating_cookoffCoef setting is set to 0 mid mission we want to exit right away or it will immediate cause all player weapons to cook off. +if (GVAR(cookoffCoef) isEqualTo 0) exitWith { + WARNING_1("'%1' has been set to 0 mid mission. Changing this setting requires mission restart.",GVAR(cookoffCoef)); +}; + private _currentWeapon = currentWeapon ACE_player; if ((_currentWeapon != "") && {_currentWeapon == primaryWeapon ACE_player || {_currentWeapon == handgunWeapon ACE_player}}) then { private _temperature = ACE_player getVariable [format [QGVAR(%1_temp), _currentWeapon], 0]; diff --git a/addons/overheating/functions/fnc_updateTemperature.sqf b/addons/overheating/functions/fnc_updateTemperature.sqf index 351323d54a..27d49cd2d1 100644 --- a/addons/overheating/functions/fnc_updateTemperature.sqf +++ b/addons/overheating/functions/fnc_updateTemperature.sqf @@ -9,7 +9,7 @@ * 2: Heat increment (J) * * Return Value: - * Current temperature + * New temperature * * Example: * [player, currentWeapon player, 2000] call ace_overheating_fnc_updateTemperature @@ -27,18 +27,23 @@ private _timeVarName = format [QGVAR(%1_time), _weapon]; private _temperature = _unit getVariable [_tempVarName, 0]; private _lastTime = _unit getVariable [_timeVarName, 0]; -private _barrelMass = _weapon call FUNC(getBarrelMass); +// keep track of weapons that have heat, so they can be set to ambient temperaure on killed/respawn +private _trackedWeapons = _unit getVariable [QGVAR(trackedWeapons), []]; +_trackedWeapons pushBackUnique _tempVarName; +_unit setVariable [QGVAR(trackedWeapons), _trackedWeapons]; // Calculate cooling +private _barrelMass = ([_weapon] call FUNC(getWeaponData)) select 7; _temperature = [_temperature, _barrelMass, CBA_missionTime - _lastTime] call FUNC(calculateCooling); TRACE_1("cooledTo",_temperature); // Calculate heating // Steel Heat Capacity = 466 J/(Kg.K) -_temperature = _temperature + _heatIncrement * GVAR(heatCoef) / (_barrelMass * 466); +_temperature = _temperature + _heatIncrement / (_barrelMass * 466); // Publish the temperature variable [_unit, _tempVarName, _temperature, TEMP_TOLERANCE] call EFUNC(common,setApproximateVariablePublic); + // Store the update time locally _unit setVariable [_timeVarName, CBA_missionTime]; diff --git a/addons/overheating/initSettings.sqf b/addons/overheating/initSettings.sqf index b351a8bed7..b3eaf24029 100644 --- a/addons/overheating/initSettings.sqf +++ b/addons/overheating/initSettings.sqf @@ -15,7 +15,37 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)]; [LSTRING(heatCoef_displayName), LSTRING(heatCoef_description)], _category, [0, 5, 1, 2], - 1 + 1, + { + if (!GVAR(enabled)) exitWith {}; + TRACE_2("reseting cache",GVAR(heatCoef),count GVAR(cacheAmmoData)); + GVAR(cacheAmmoData) = createHashMap; + }, + false +] call CBA_fnc_addSetting; + +[ + QGVAR(coolingCoef), "SLIDER", + [LSTRING(coolingCoef_displayName), LSTRING(coolingCoef_description)], + _category, + [0, 5, 1, 2], + 1, + {}, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(suppressorCoef), "SLIDER", + [LSTRING(suppressorCoef_displayName), LSTRING(suppressorCoef_description)], + _category, + [0, 5, 1, 2], + 1, + { + if (!GVAR(enabled)) exitWith {}; + TRACE_2("reseting cache",GVAR(suppressorCoef),count GVAR(cacheSilencerData)); + GVAR(cacheSilencerData) = createHashMap; + }, + false ] call CBA_fnc_addSetting; [ diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 95172ac4ee..fe0df759d7 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -15,6 +15,7 @@ Túlmelegedés Surchauffe Přehřívání + 과열 Overheating Enabled @@ -40,7 +41,7 @@ 過熱と弾詰まりモジュールを全て有効化します Główny włącznik modułu przegrzewania/zacinania się broni Hauptschalter, um die Überhitzung-/Ladehemmung-Module zu aktivieren - 과열/탄걸림 최종 활성화 + 과열/탄걸림 마스터 활성화 Abilitazione master per il modulo di surriscaldamento / inceppamento 启用枪管过热/干扰模块 啟用槍管過熱/干擾模塊 @@ -53,6 +54,8 @@ Коэффициент нагрева Erhitzungs-Koeffizient Współczynnik nagrzewania + 过热系数 + 과열 계수 Coefficient for the amount of heat a weapon generates per shot.\nHigher value increases heat. @@ -61,6 +64,40 @@ Коэффициент количества тепла, выделяемого оружием за выстрел. \nБольшие значения увеличивают нагрев. Koeffizient für die Menge an Hitze, die eine Waffe pro Schuss erzeugt.\nHöhere Werte beschleunigen die Erhitzung. Współczynnik wpływający na ilość ciepła generowanego przez broń przy każdym strzale. + 武器每次射击产生的热量系数。\n数值越高,热量越高。 + 매 발사마다 만들어지는 열에 계수를 적용합니다.\n높은 계수는 더 많은 열을 발생시킵니다. + + + Cooling Coefficient + 冷却系数 + 냉각 계수 + Abkühlungskoeffizienten + Współczynnik chłodzenia + 冷却係数 + + + Coefficient for how quickly a weapon cools down.\nHigher value increases cooling speed. + 武器冷却速度系数。\n数值越高,冷却速度越快。 + 무기가 차가워지는 정도를 정합니다.\n높은 계수는 무기가 빨리 차가워지는데 관여합니다. + Koeffizient, der angibt, wie schnell eine Waffe abkühlt.\nEin höherer Wert erhöht die Abkühlgeschwindigkeit. + Współczynnik szybkości chłodzenia broni.\nWiększa wartość zwiększa szybkość chłodzenia. + 武器の冷却速度の係数。\n値を大きくすると冷却速度が速くなります。 + + + Suppressor Coefficient + 消音器系数 + 소음기 계수 + Schalldämpfer-Koeffizient + Współczynnik tłumika + サプレッサー係数 + + + Coefficient for how much additional heat is added from having a suppressor attached.\nHigher value increases heat, 0 means no additional heat from the suppressor. + 附加了消音器后,产生的额外热量系数。\n数值越高,热量越高,0意味着消音器不产生额外热量。 + 소음기 장착 시 만들어 지는 열에 대한 계수를 적용합니다.\n높을 수록 온도가 높아집니다, 0으로 설정 시 추가적인 열을 얻지 않습니다. + Koeffizient, der angibt, wie viel zusätzliche Wärme durch das Anbringen eines Schalldämpfers hinzugefügt wird. Ein höherer Wert erhöht die Menge an Wärme, 0 bedeutet, dass keine zusätzliche Wärme durch den Schalldämpfer hinzukommt. + Współczynnik określający, ile dodatkowego ciepła jest dodawane z założonego tłumika.\nWyższa wartość zwiększa ciepło, 0 oznacza brak dodatkowego ciepła z tłumika. + サプレッサーを取り付けることで追加される熱量の係数。\n値が大きいほど熱が増加し、0はサプレッサーからの追加の熱がないことを意味します。 Display Text on Jam @@ -75,7 +112,7 @@ Visualizza testo in caso di inceppamento 弾詰りを文章で表示 탄걸림의 경우 화면에 표시 - 在卡弹时显示提示讯息 + 在卡弹时显示提示信息 在卡彈時顯示提示訊息 @@ -90,8 +127,8 @@ Mostra uma notificação quando sua arma sofre um travamento. Visualizza una notifica in caso la tua arma si inceppasse 持っている武器が弾詰りをすると、通知を表示します - 총알이 무기에 걸릴경우 화면에 알림을 띄웁니다 - 当武器卡弹时显示提示讯息 + 총알이 무기에 걸릴 경우 화면에 알림을 띄웁니다 + 当武器卡弹时显示提示信息 當武器卡彈時顯示提示訊息 @@ -153,7 +190,7 @@ Показывать эффект частиц, когда оружие других игроков перегревается Zobrazit částicové efekty když se zbraň přehřije jinému hráči 他のプレイヤーの過熱の視覚表現を表示します - 모든 인원이 무기가 과열될시 입자 효과가 나타납니다. + 모든 인원이 무기가 과열될 시 입자 효과가 나타납니다. 当其他玩家的武器过热时显示特效 當其他玩家的武器過熱時顯示特效 Mutassa a részecskehatásokat, amikor más játékosok fegyvere melegedik túl @@ -185,7 +222,7 @@ Перегретое оружие будет менее точным, а дульная скорость будет снижена. Применяется ко всем игрокам. Přehřátá zbraň bude méně přesná a bude mít menší úsťovou rychlost. Platí pro všechny hráče. 過熱は精度を減少させたり、初速を低下させます。これは全プレイヤに適用します。 - 무기 과열시 무기의 명중률이 저하되고 총구속도가 감소합니다. 이는 모든 플레이어에게 적용됩니다. + 무기 과열 시 무기의 명중률이 저하되고 총구속도가 감소합니다. 이는 모든 플레이어에게 적용됩니다. 过热的武器将会有打不准和减少射击初速的情况。适用于所有玩家 過熱的武器將會有打不準和減少射擊初速的情況。適用於所有玩家 A túlmelegedett fegyverek kevésbé lesznek pontosak és csökkent a lövés sebessége. Minden játékosra vonatkozik. @@ -197,6 +234,8 @@ Дистанция для Еффектов и Разброса Abstand für Effekte und Dispersion Odległość efektów i rozproszenia + 效果和扩散距离 + 효과와 분산 거리 The distance, in meters, from the player within which overheating particle effects and dispersion are visible. @@ -205,6 +244,8 @@ Дистанция в метрах, с которой видны эффекты частиц и разброса при перегреве. Der Abstand in Metern vom Spieler, in dem Überhitzungspartikeleffekte und Dispersion sichtbar sind. Określa odległość w metrach, do której widoczne są efekty cząsteczkowe i rozproszenie. + 距离玩家的距离(米),在这个距离内可以看到过热的粒子效应和扩散。 + 미터 단위로, 과열 시 입자효과와 분산 정도가 플레이어로부터 얼마나 떨어진 곳까지 보여지는지를 결정합니다. Heat Increases Fire Rate @@ -213,6 +254,8 @@ Нагрев увеличивает темп стрельбы Hitze erhöht die Feuerrate Ciepło zwiększa szybkostrzelność + 过热增加射速 + 과열 시 발사속도 증가 As weapons heat up, their rate of fire increases by up to 10%. @@ -221,6 +264,8 @@ При нареве орудия, его темп стрельбы увеличивается до 10%. Wenn sich Waffen erhitzen, erhöht sich ihre Feuerrate um bis zu 10%. Gdy broń się nagrzewa, jej szybkostrzelność może wzrosnąć nawet o 10%. + 随着武器的过热,其射速最多增加10%。 + 과열될수록 발사속도가 최대 10%까지 올라갑니다. Jam Chance Coefficient @@ -229,6 +274,8 @@ Шанс заклинивания оружия Koeffizient für Ladehemmung Szansa na zacięcie + 卡弹概率系数 + 기능고장 확률 계수 Coefficient for the chance that a weapon will jam from overheating.\nHigher value make jams more likely.\nSet to 0 to disable jamming. @@ -237,6 +284,8 @@ Шанс заклинивания оружия от перегрева.\nБольшие значения повышают шанс заклинивания.\nУстановите 0 для отключения заклинивания. Koeffizient für die Wahrscheinlichkeit, dass eine Waffe eine Ladehemmung hat.\Höhere Werte erhöhen die Wahrscheinlichkeit.\Auf 0 setzen, um Ladehemmungen zu deaktivieren. Współczynnik zmieniający szansę na zacięcie się broni z powodu przegrzania.\nIm wyższa wartość, tym większe ryzyko zacięcia się broni.\nUstaw na 0, aby wyłączyć zacinanie się broni. + 武器因过热而卡弹的概率系数。\n数值越高,卡住的可能性越大。\n设置为0以禁用卡弹。 + 과열로 인해 얼마나 고장나는지에 대한 계수를 정합니다.\n높을 수록 더 고장이 잘납니다.\n0으로 설정하면 고장이 일어나지 않습니다. Unjam Weapon on Reload @@ -249,7 +298,7 @@ Desemperrar arma no recarregamento Исправлять клин при перезарядке 再装填による弾詰りの解消 - 재장전시 탄걸림 해결 + 재장전 시 기능고장 해결 重装弹匣以解决卡弹 重裝彈匣以解決卡彈 Távolítsa el az akadályt újratöltéskor @@ -265,7 +314,7 @@ Recarregar desemperra arma. Перезарядка устраняет заклинивание оружия. 再装填により、弾詰りを除去します。 - 탄걸림이 재장전시 해결됩니다. + 기능고장이 재장전 시 해결됩니다. 利用重装弹匣来解决卡弹 利用重裝彈匣來解決卡彈 Az újratöltés megszünteti a fegyver elakadását. @@ -274,9 +323,11 @@ Unjam on Barrel Swap 銃身交換で弾詰まり解消 Désenrayer l'arme au changement de canon - Замена ствола устраняет заклинивание оружия. - Ladehemmungen bei Lauf-Wechsel beheben + Замена ствола устраняет заклинивание оружия. Usuń zacięcie przy wymianie lufy + 更换枪管清除卡弹 + 총열 교환 시 기능고장 해결 + Ladehemmung beim Wechseln des Laufes beheben. Controls whether swapping barrels clears a weapon jam. @@ -285,6 +336,8 @@ Определяет, устраняет ли замена ствола заклинивание оружия. Bestimmt, ob das Wechseln des Laufes eine Ladehemmung behebt. Określa, czy wymiana lufy usuwa zacięcie się broni. + 通过更换枪管,以便清除卡弹。 + 총열을 교체하면서 기능고장을 해결합니다. Chance of Unjam Failing @@ -297,7 +350,7 @@ Chance de falha de desemperramento Шанс неудачи при устранении клина 弾詰りの除去を失敗する可能性 - 탄걸림 해결 시도 실패확률 + 기능고장 해결 시도 실패확률 解决卡弹失败机率 解決卡彈失敗機率 Akadály eltávolítás hibájának esélye @@ -313,7 +366,7 @@ Вертоятность того, что устранение заклинивания не сработает, и его придется повторить. Pravděpodobnost, že uvolnění zbraně selže, je proto nutné tuto akci opakovat. 弾詰りの除去を失敗する可能性が生まれ、もう一度動作を行う必要があります。 - 탄걸림 해결 시도시 실패할 확률이 있습니다. 이는 다시 탄걸림 해결을 시도해야함을 의미합니다. + 기능고장 해결 시도시 실패할 확률이 있습니다. 이는 다시 기능고장 해결을 시도해야함을 의미합니다. 清除卡弹时有可能会失败,需要反覆进行清枪。 清除卡彈時有可能會失敗,需要反覆進行清槍。 Valószínűsége annak, hogy egy akadály eltávolítás művelet kudarcot vall, megismétlést igényel. @@ -325,6 +378,8 @@ Коеффициент возгорания при перегреве Selbstzündungskoeffizient bei Überhitzung Współczynnik samozapłonu + 过热诱发系数 + 과열 쿡오프 계수 Coefficient for the heat required for cookoffs to occur.\nHigher values require more heat to cookoff.\nSet to 0 to disable cookoff. @@ -333,6 +388,8 @@ Коеффициент нагрева, при котором возникает возгорание. Koeffizient für die zum Selbstzünden erforderliche Hitze.\nHöhere Werte erfordern mehr Hitze zum Selbstzünden.\nAuf 0 setzen, um das Selbstzünden zu deaktivieren. Współczynnik modyfikujący ilość ciepła wymaganego do samozapłonu amunicji w komorze broni.\nIm wyższa wartość, tym gorętsza musi być broń, aby amunicja uległa samozapłonowi\nUstaw 0, aby wyłączyć samozapłon. + 发生热诱发的过热系数。\n数值越高,热诱发所需要的过热值越高。\n设置为0禁用热诱发。 + 쿡오프가 되기 위해 얼마나 과열되는가를 결정합니다. \n높을 수록 쿡오프 되기위해 더 뜨거운 열을 필요로 합니다.\n 0으로 설정하면 쿡오프 현상이 없어집니다. Spare barrel @@ -362,7 +419,7 @@ Use para trocar o cano/estriamento. Usata per cambiare la canna. 予身の交換に使用します。 - 총열을 바꿀때 사용합니다. + 총열을 바꿀 때 사용합니다. 用来更换枪管 用來更換槍管 @@ -378,8 +435,8 @@ Arma travada! Arma inceppata! 武器が詰まった! - 탄걸림! - 武器卡弹! + 기능고장! + 武器卡弹! 武器卡彈! @@ -389,6 +446,8 @@ Оружие сдетонировало! Munition durchgezündet! Samozapłon amunicji! + 武器发生热诱发! + 쿡오프가 일어납니다! Failure to eject. @@ -397,6 +456,8 @@ Не удалось достать. Hülse wurde nicht ausgeworfen. Nie udało się wyrzucić łuski. + 抛壳失败。 + 탄피가 약실에 낌. Failure to extract. @@ -405,6 +466,8 @@ Не удалось извлечь. Hülse wurde nicht ausgezogen. Nie udało się wyjąć łuski. + 抽壳失败。 + 탄피가 배출되지 않음. Failure to feed. @@ -413,6 +476,8 @@ Не удалось подать. Patrone wurde nicht zugeführt. Nie udało się załadować naboju. + 供弹失败。 + 탄이 장전 중 걸림. Failure to fire. @@ -421,6 +486,8 @@ Не удалось выстрелить. Patrone wurde nicht gezündet! Nie udało się strzelić. + 未能开火。 + 발사가 되지 않음. Clear jam @@ -434,7 +501,7 @@ Destravar arma Ripulisci l'arma 弾詰りを除去する - 탄걸림 해결 + 기능고장 해결 清除卡弹 清除卡彈 @@ -450,7 +517,7 @@ Arma destravada Arma pronta al fuoco 弾詰りが除去されました - 탄걸림 해결됨 + 기능고장 해결됨 卡弹已清除 卡彈已清除 @@ -465,7 +532,7 @@ Falha no desemperramento Не удалось исправить клин 弾詰りの除去に失敗しました - 탄걸림 해결 실패 + 기능고장 해결 실패 卡弹未能清除 卡彈未能清除 @@ -497,7 +564,7 @@ Substituindo cano... Sostituendo la canna... 銃身を交換しています・・・ - 총열 교체중... + 총열 교체 중... 正在更换枪管... 換槍管中... @@ -561,7 +628,7 @@ Controllando la temperatura... Проверка температуры... 温度を測っています・・・ - 무기 온도 확인중... + 무기 온도 확인 중... 正在检查枪管温度... 檢查槍管溫度中... @@ -590,7 +657,7 @@ 予備銃身の温度を測っています・・・ Sprawdzanie temperatury zapasowych luf... Prüfe Temperatur der Wechselläufe ... - 총열 온도 확인중... + 총열 온도 확인 중... Controllando la temperatura della canna di ricambio... 正在检查枪管温度... 檢查槍管溫度中... @@ -602,6 +669,8 @@ Охладить оружие с... Waffe mit... kühlen Schłódź broń za pomocą... + 冷却武器... + 무기 온도 낮추기 Cooling %1 with %2. @@ -610,6 +679,8 @@ Охлаждение %1 с %2. Kühle %1 mit %2. Chłodzenie %1 za pomocą %2. + 冷却 %1 至 %2。 + %1을 %2로 식히는 중. Cool weapon in water source. @@ -618,6 +689,8 @@ Охладить оружие в воде. Kühle Waffe aus Wasserquelle. Schłódź broń wodą. + 用水源冷却武器。 + 물로 무기 식히기 Cooling weapon in water source. @@ -626,6 +699,8 @@ Охлаждение оружия в воде. Waffe wird aus Wasserquelle gekühlt. Chłodzenie broni wodą. + 在水源中冷却武器。 + 물로 무기 식히는 중. Container doesn't have enough water. @@ -634,6 +709,8 @@ Воды недостаточно для охлаждения. Behälter beinhaltet nicht genug Wasser. Zbiornik nie ma wystarczającej ilości wody + 容器里的水不够。 + 물이 충분치 않습니다. Weapon is cool enough the water has stopped boiling. @@ -642,6 +719,8 @@ Оружие достаточно холодное для прекращения кипения воды. Waffe ist kalt genug, dass Wasser hat aufgehört zu kochen. Broń jest wystarczająco schłodzona. Woda przestała się gotować. + 武器已经冷却,水已经停止沸腾了。 + 물이 끓지 않는 걸 보아 무기가 식은듯 하다. Temperature @@ -731,7 +810,7 @@ Extrem heiße Wechselläufe 엄청나게 뜨거운 예비 총열 Canna/e di Ricambio Rovente - 备用枪管温度超级热 + 备用枪管温度非常热 備用槍管溫度超級熱 diff --git a/addons/overpressure/CfgWeapons.hpp b/addons/overpressure/CfgWeapons.hpp index 1f0814a487..7102e84d1b 100644 --- a/addons/overpressure/CfgWeapons.hpp +++ b/addons/overpressure/CfgWeapons.hpp @@ -7,6 +7,7 @@ class CfgWeapons { GVAR(angle) = 60; GVAR(range) = 10; GVAR(damage) = 0.7; + GVAR(offset) = 1; }; class Launcher_Base_F: Launcher {}; @@ -16,6 +17,7 @@ class CfgWeapons { GVAR(angle) = 40; GVAR(range) = 8; GVAR(damage) = 0.5; + GVAR(offset) = 1; }; class launch_Titan_short_base: launch_Titan_base { @@ -24,6 +26,7 @@ class CfgWeapons { GVAR(angle) = 30; GVAR(range) = 2; GVAR(damage) = 0.5; + GVAR(offset) = 0.85; }; class launch_NLAW_F: Launcher_Base_F { @@ -32,6 +35,7 @@ class CfgWeapons { GVAR(angle) = 30; GVAR(range) = 2; GVAR(damage) = 0.6; + GVAR(offset) = 1.05; }; class launch_RPG32_F: Launcher_Base_F { @@ -39,6 +43,22 @@ class CfgWeapons { GVAR(angle) = 60; GVAR(range) = 15; GVAR(damage) = 0.7; + GVAR(offset) = 1.2; + }; + + class launch_MRAWS_base_F: Launcher_Base_F { + GVAR(range) = 15; + GVAR(offset) = 1.05; + }; + + class launch_Vorona_base_F: Launcher_Base_F { + GVAR(angle) = 50; + GVAR(offset) = 0.88; + }; + + class launch_RPG7_F: Launcher_Base_F { + GVAR(angle) = 40; + GVAR(offset) = 0.9; }; class CannonCore; diff --git a/addons/overpressure/XEH_PREP.hpp b/addons/overpressure/XEH_PREP.hpp index 1efd39d6e5..9d1e8e9725 100644 --- a/addons/overpressure/XEH_PREP.hpp +++ b/addons/overpressure/XEH_PREP.hpp @@ -1,6 +1,5 @@ - PREP(getDistance); PREP(overpressureDamage); -PREP(cacheOverPressureValues); +PREP(getOverPressureValues); PREP(firedEHOP); PREP(firedEHBB); diff --git a/addons/overpressure/XEH_postInit.sqf b/addons/overpressure/XEH_postInit.sqf index bf3758ab3d..46fe460268 100644 --- a/addons/overpressure/XEH_postInit.sqf +++ b/addons/overpressure/XEH_postInit.sqf @@ -9,4 +9,6 @@ // Register fire event handler ["ace_firedPlayer", LINKFUNC(firedEHBB)] call CBA_fnc_addEventHandler; ["ace_firedPlayerVehicle", LINKFUNC(firedEHOP)] call CBA_fnc_addEventHandler; + + GVAR(cacheHash) = createHashMap; }] call CBA_fnc_addEventHandler; diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 2d1d0f783c..b43649607f 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -18,20 +18,16 @@ //IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"]; TRACE_10("firedEH:",_unit, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _vehicle, _gunner, _turret); -// Bake variable name and check if the variable exists, call the caching function otherwise -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -private _var = if (isNil _varName) then { - [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); -} else { - missionNameSpace getVariable _varName; -}; -_var params ["_backblastAngle","_backblastRange","_backblastDamage"]; -TRACE_3("cache",_backblastAngle,_backblastRange,_backblastDamage); +// Retrieve backblast values +private _bbValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues); + +_bbValues params ["_backblastAngle", "_backblastRange", "_backblastDamage", "_offset"]; +TRACE_4("cache",_backblastAngle,_backblastRange,_backblastDamage,_offset); if (_backblastDamage <= 0) exitWith {}; -private _position = getPosASL _projectile; private _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); +private _position = ((getPosASL _projectile) vectorAdd (_direction vectorMultiply _offset)); // Damage to others private _affected = (ASLtoAGL _position) nearEntities ["CAManBase", _backblastRange]; @@ -51,7 +47,7 @@ if (_distance < _backblastRange) then { private _damage = _alpha * _beta * _backblastDamage; [_damage * 100] call BIS_fnc_bloodEffect; - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { [_unit, _damage, "body", "backblast", _unit] call EFUNC(medical,addDamageToUnit); } else { TRACE_1("",isDamageAllowed _unit); diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index 5871fae9b8..618cfae6f1 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -18,20 +18,14 @@ //IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"]; TRACE_10("firedEH:",_unit, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _vehicle, _gunner, _turret); -// Bake variable name and check if the variable exists, call the caching function otherwise -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -private _var = if (isNil _varName) then { - [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); -} else { - missionNameSpace getVariable _varName; -}; -_var params ["_dangerZoneAngle","_dangerZoneRange","_dangerZoneDamage"]; +// Retrieve overpressure values +private _opValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues); + +_opValues params ["_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; TRACE_3("cache",_dangerZoneAngle,_dangerZoneRange,_dangerZoneDamage); if (_dangerZoneDamage <= 0) exitWith {}; - - // The weapon produces overpressure, calculate private _position = getPosASL _projectile; private _direction = vectorDir _projectile; diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_getOverPressureValues.sqf similarity index 72% rename from addons/overpressure/functions/fnc_cacheOverPressureValues.sqf rename to addons/overpressure/functions/fnc_getOverPressureValues.sqf index 2626004e87..2b30dc0008 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_getOverPressureValues.sqf @@ -14,9 +14,10 @@ * 0: Angle * 1: Range * 2: Damage + * 3: Offset * * Example: - * ["cannon_125mm","Sh_125mm_APFSDS_T_Green","24Rnd_125mm_APFSDS_T_Green"] call ace_overpressure_fnc_cacheOverPressureValues + * ["cannon_125mm","Sh_125mm_APFSDS_T_Green","24Rnd_125mm_APFSDS_T_Green"] call ace_overpressure_fnc_getOverPressureValues * * Public: No */ @@ -24,6 +25,13 @@ params ["_weapon", "_ammo", "_magazine"]; TRACE_3("Parameter",_weapon,_magazine,_ammo); +// Check cache for weapon/ammo/mag combo +private _return = GVAR(cacheHash) get _this; +if (!isNil "_return") exitWith { + TRACE_3("CacheHit",_weapon,_magazine,_ammo); + _return +}; + // get Priority Array from Config private _array = [ getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(priority)), @@ -43,15 +51,15 @@ private _config = [ ] select _indexOfMaxPriority; TRACE_1("ConfigPath",_config); -// get the Variables out of the Configes and create a array with then -private _return = [ +// get the Variables out of the Configs and populate return array with them +_return = [ (getNumber (_config >> QGVAR(angle))), (getNumber (_config >> QGVAR(range))) * GVAR(distanceCoefficient), - (getNumber (_config >> QGVAR(damage))) + (getNumber (_config >> QGVAR(damage))), + (getNumber (_config >> QGVAR(offset))) ]; -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -missionNameSpace setVariable [_varName, _return]; -TRACE_2("Return",_varName,_return); +GVAR(cacheHash) set [_this, _return]; +TRACE_2("Return",_this,_return); _return diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 119c19ebb2..c05c281075 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -23,14 +23,10 @@ params ["_firer", "_posASL", "_direction", "_weapon", "_magazine", "_ammo"]; -// Bake variable name and check if the variable exists, call the caching function otherwise -private _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -private _var = if (isNil _varName) then { - [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); -} else { - missionNameSpace getVariable _varName; -}; -_var params ["_overpressureAngle","_overpressureRange","_overpressureDamage"]; +// Retrieve overpressure values +private _opValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues); + +_opValues params ["_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage); { @@ -53,12 +49,13 @@ TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage); private _damage = _alpha * _beta * _overpressureDamage; TRACE_1("",_damage); - // If the target is the ACE_player - if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; - TRACE_1("",isDamageAllowed _x); if (isDamageAllowed _x && {_x getVariable [QEGVAR(medical,allowDamage), true]}) then { - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + // If the target is the ACE_player + if (_x isEqualTo ACE_player) then { + [_damage * 100] call BIS_fnc_bloodEffect + }; + if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { [_x, _damage, "body", "backblast", _firer] call EFUNC(medical,addDamageToUnit); } else { _x setDamage (damage _x + _damage); diff --git a/addons/overpressure/initSettings.sqf b/addons/overpressure/initSettings.sqf index 1ffff4f1aa..7fe6401131 100644 --- a/addons/overpressure/initSettings.sqf +++ b/addons/overpressure/initSettings.sqf @@ -1,4 +1,4 @@ -private _category = [LELSTRING(common,categoryUncategorized), QUOTE(COMPONENT_BEAUTIFIED)]; +private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(DisplayName)]; [ QGVAR(distanceCoefficient), "SLIDER", diff --git a/addons/overpressure/stringtable.xml b/addons/overpressure/stringtable.xml index c5683598e2..27777fdf42 100644 --- a/addons/overpressure/stringtable.xml +++ b/addons/overpressure/stringtable.xml @@ -1,15 +1,23 @@ + + Overpressure + 超压 + Überdruck + 과중압력 + Nadciśnienie + 過圧 + Overpressure Distance Coefficient Überdruckentfernungskoeffizient 過圧の距離係数 - 초과압력 거리 계수 + 과중압력 거리 계수 Mnożnik dystansu nadciśnienia Coefficient de distance pour la surpression Coefficente Distanza Sovrapressione - 高压影响距离系数 + 超压影响距离系数 高壓影響距離係數 Коэффициент избыточного давления Coeficiente de Distância de Sobrepressão @@ -21,11 +29,11 @@ Scales the overpressure effect [Default: 1] Stellt den Koeffizient für die Überdruckentfernung ein [Standard: 1] 過圧効果の範囲 [標準: 1] - 초과압력의 효과 크기 [기본설정: 1] + 과중압력의 효과 크기 [기본설정: 1] Skaluje efekt nadciśnienia [Domyślne: 1] Ajuste l'effet de surpression. Valeur par défaut : 1. Scala l'effetto di sovrapressione [Predefinito: 1] - 高压影响的范围 [预设: 1] + 超压影响的范围 [预设:1] 高壓影響的範圍 [預設: 1] Степень зависимости избыточного давления от расстояния [По умолчанию: 1] Escala o efeito de sobrepressão [Padrão: 1] @@ -47,6 +55,7 @@ Portée du backblast Dosah zpětné tlakové vlny (backblast) Alcance del cono de fuego + 후폭풍 거리 Backblast angle @@ -62,6 +71,7 @@ Angle du backblast Úhel zpětné tlakové vlny (backblast) Ángulo del cono de fuego + 후폭풍 각도 diff --git a/addons/parachute/functions/fnc_handleReserve.sqf b/addons/parachute/functions/fnc_handleReserve.sqf index 3df8d6607e..370da43f3a 100644 --- a/addons/parachute/functions/fnc_handleReserve.sqf +++ b/addons/parachute/functions/fnc_handleReserve.sqf @@ -16,10 +16,10 @@ */ params ["_unit"]; -private _backpack = backpack _unit; +private _backpack = backpackContainer _unit; if ( - _backpack == "" && + isNull _backpack && {(vehicle _unit) isKindOf "ParachuteBase"} && {GETVAR(_unit,GVAR(hasReserve),false)} ) then { @@ -28,7 +28,7 @@ if ( SETVAR(vehicle _unit,GVAR(canCut),true); // Mark the parachute cuttable since reserve is present } else { // Case where inventory has changed otherwise (including when reserve is added) - private _backpackCfg = configFile >> "CfgVehicles" >> _backpack; + private _backpackCfg = configOf _backpack; private _hasReserve = getNumber (_backpackCfg >> "ace_hasReserveParachute") == 1; // Cache reserve parachute state and class when backpack changes diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index 38108c2c5c..6cef14cfdb 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -47,7 +47,7 @@ Usato per mostrare l'altitudine, la velocità di discesa e l'ora. Usado para mostrar altura, taxa de descida e o tempo. 高度や降下率、時間を見るのに使います。 - 높이와, 하강속도 그리고 시간을 보여줍니다. + 높이, 하강속도 그리고 시간을 보여줍니다. 用于显示高度,下降率和时间。 用於顯示高度,下降率和時間 Yüksekliği, alçalma hızını ve zamanı göstermek için kullanılır. @@ -64,7 +64,7 @@ Paracadute non manovrabile Para-querdas não controlável 非操作型パラシュート - 비-조종 낙하산 + 비조종 낙하산 非可操控降落伞 非可操控降落傘 Yönlendirilemez Paraşüt @@ -117,6 +117,7 @@ Schovat výškoměr v GUI při volném pádu Ocultar altímetro de caída libre Serbest Düşüş Altimetresini Gizle + 강하 시 고도계 숨기기 Hides the altitude and speed shown while free falling or parachuting. @@ -132,6 +133,7 @@ Schová výšku a rychlost v GUI při volném pádu a při použití padáku. Oculta la altitud y la velocidad que se muestran en caída libre o en paracaídas. Serbest düşme veya paraşütle atlama sırasında gösterilen yüksekliği ve hızı gizler. + 강하 시 고도와 속도를 보여주지 않습니다. Parachute Failure Chance @@ -140,6 +142,8 @@ 開傘失敗率 Szansa na nieotwarcie się spadochronu Wahrscheinlichkeit, dass ein Fallschirm sich nicht öffnet + 开伞失败率 + 낙하산 펼치기 실패 확률 diff --git a/addons/pylons/XEH_postInit.sqf b/addons/pylons/XEH_postInit.sqf index ed45222d3c..3167c0a838 100644 --- a/addons/pylons/XEH_postInit.sqf +++ b/addons/pylons/XEH_postInit.sqf @@ -14,8 +14,7 @@ GVAR(loadoutAction) = [ // create action private _isRearmVehicle = if (["ace_rearm"] call EFUNC(common,isModLoaded)) then { _vehicles findIf {[_x] call EFUNC(rearm,isSource)} != -1; } else { - private _cfgVehicle = configFile >> "CfgVehicles"; - _vehicles findIf {getNumber (_cfgVehicle >> typeOf _x >> "transportAmmo") > 0} != -1; + _vehicles findIf {getNumber ((configOf _x) >> "transportAmmo") > 0} != -1; }; (_isRearmVehicle && {[ace_player, _target] call FUNC(canConfigurePylons)}) @@ -27,7 +26,7 @@ GVAR(loadoutAction) = [ // create action private _typeOf = typeOf _vehicle; if (_typeOf in GVAR(aircraftWithPylons)) exitWith {}; - if (!isClass (configFile >> "CfgVehicles" >> _typeOf >> 'Components' >> 'TransportPylonsComponent')) exitWith {}; + if (!isClass ((configOf _vehicle) >> 'Components' >> 'TransportPylonsComponent')) exitWith {}; GVAR(aircraftWithPylons) pushBack _typeOf; [_typeOf, 0, ["ACE_MainActions"], GVAR(loadoutAction)] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/pylons/functions/fnc_onButtonApply.sqf b/addons/pylons/functions/fnc_onButtonApply.sqf index 5603ed8d94..3fb802d90b 100644 --- a/addons/pylons/functions/fnc_onButtonApply.sqf +++ b/addons/pylons/functions/fnc_onButtonApply.sqf @@ -17,7 +17,7 @@ // Check for FRIES change private _checkbox = CONTROL(ID_DIALOG) ID_CHECKBOX_FRIES; -if (ctrlShown _checkbox && {!((cbChecked _checkbox) isEqualTo (_checkbox getVariable QGVAR(originalState)))}) then { +if (ctrlShown _checkbox && {(cbChecked _checkbox) isNotEqualTo (_checkbox getVariable QGVAR(originalState))}) then { if (cbChecked _checkbox) then { [GVAR(currentAircraft)] call EFUNC(fastroping,equipFRIES); } else { diff --git a/addons/pylons/functions/fnc_showDialog.sqf b/addons/pylons/functions/fnc_showDialog.sqf index 146238a1b7..f3b01729c5 100644 --- a/addons/pylons/functions/fnc_showDialog.sqf +++ b/addons/pylons/functions/fnc_showDialog.sqf @@ -93,6 +93,8 @@ GVAR(comboBoxes) = []; { _combo lbAdd getText (configFile >> "CfgMagazines" >> _x >> "displayName"); _combo lbSetData [_forEachIndex + 1, _x]; + private _description = getText (configFile >> "CfgMagazines" >> _x >> "descriptionShort"); + _combo lbSetTooltip [_forEachIndex + 1, _description]; if (_x == _mag) then { _index = _forEachIndex + 1; diff --git a/addons/pylons/stringtable.xml b/addons/pylons/stringtable.xml index d6f2823643..d8286e4cb3 100644 --- a/addons/pylons/stringtable.xml +++ b/addons/pylons/stringtable.xml @@ -97,7 +97,7 @@ %1はすでにこの機体へ設定されています! % sta già configurando questo aereo! %1已經正在定義此飛機的武裝配置! - %1已经正在定义此飞机的武器配置! + %1已经正在定义此飞机的武器配置! 이미 이 항공기에 장착되어 있음 (%1) %1 konfiguriert dieses Fluggerät bereits! %1 est déjà en train de configurer cet aéronef ! @@ -127,7 +127,7 @@ パイロン%1で停止しました! Fermato al pilone %1! 已停止在%1號派龍架! - 已在整装%1号挂架时停止! + 已在整装%1号挂架时停止! %1 파일런이 멈춤 Gestoppt bei Außenlaststation %1 Arrêté au pylône %1 ! @@ -165,6 +165,7 @@ Ativar Menu de Pylon para Zeus Povolit menu s pylony pro Zeuse Habilitar menú de pilones para Zeus + 제우스 파일런 메뉴 활성화 Enables use of the zeus module. @@ -179,6 +180,7 @@ Permite usar o módulo de Zeus Povoluje použití daného Zeus modulu. Habilita el uso del módulo de Zeus. + 제우스 파일런 메뉴를 사용할 수 있게 합니다. Enable Pylons Menu from Ammo Trucks @@ -193,6 +195,7 @@ Ativar Menu de Pylons de Caminhões de Munição Povolit menu s pylony z muničních náklaďáků. Habilitar menú de pilones desde camiones de munición + 탄약 차량 파일런 메뉴 활성화 Enables use of pylons menu from ammo trucks. @@ -207,6 +210,7 @@ Permite abrir o menu de pylons através de veículos de munição. Povoluje použití menu na nastavení pylonů z náklaďáků s municí. Habilita el uso del menú de pilones desde camiones de munición. + 탄약 차량에서 파일런 메뉴를 불러올 수 있게 합니다. This aircraft doesn't have pylons @@ -221,6 +225,7 @@ Essa aeronave não possui pylons Toto letadlo nemá pylony Esta aeronave no tiene pilones + 이 비행기는 파일런이 없습니다. Configure pylons module is disabled for zeus @@ -235,6 +240,7 @@ O Módulo de configurar pylons está desativado para o Zeus Nastavení pylonů je vypnuto pro Zeuse La configuración del módulo de pilones está deshabilitada para Zeus + 제우스 파일런 모듈 설정이 비활성화 되어있습니다. Rearm New Pylons @@ -242,7 +248,7 @@ Riarma Nuovi Piloni 重新整装新的导弹挂架 重新武装新的派龙架 - 새파일런 재무장 + 새 파일런 재무장 Neue Außenlaststationen. aufmunitionieren Réarmer les nouveaux pylônes Dozbrój Nowe Pylony @@ -271,8 +277,8 @@ パイロンへの時間 Tempo Per Pilone 派龍架整補所需時間(個別) - 导弹挂架整装所需时间(个别) - 파일런당 시간 + 导弹挂架整装所需时间(个别) + 파일런 당 시간 Zeit pro Außenlaststation Durée par pylône Czas na Pylon @@ -286,7 +292,7 @@ 各パイロンの置き換えにかかる時間を設定します。(秒) Il tempo che impiega ogni pilone ad essere sostituito (in secondi). 每個派龍架需花多久時間進行整補(單位為秒) - 每个挂架需花多久时间进行整装单位为秒)。 + 每个挂架需花多久时间进行整装(单位为秒)。 파일런을 재설정 하는데 걸리는 시간 (초) Die benötigte Zeit, um einzelne Außenlaststationen zu ersetzen (in Sekunden). Le temps nécessaire pour remplacer chaque pylône (en secondes). @@ -316,7 +322,7 @@ 航空機と補給車両との間に必要な距離です。 La distanza necessaria per un aereo da un veicolo di riarmo. 設定飛機必須距離整補載具多少公尺才能進行彈藥整補 - 设定飞机必须距离整装载具多少公尺才能进行弹药整装。 + 设定飞机必须距离整装载具多少米才能进行弹药整装。 항공기에서 재보급 가능한 재무장 차량을 찾습니다. Die Distanz, die ein Fahrzeug von einem Munitionsfahrzeug entfernt sein darf. La distance maximale à laquelle un aéronef doit se trouver du véhicule de ravitaillement. @@ -362,7 +368,7 @@ Necessita Kit Riparazione 需要工具包 需要工具包 - 툴킷 요구 + 도구모음 요구 Benötigt Werkzeugkasten Trousse à outils requise Wymaga Narzędzi @@ -377,7 +383,7 @@ Necessita un kit di riparazione nell'inventario 需要工具包才能進行彈藥整補 需要工具包才能进行弹药整装。 - 툴킷이 필요합니다. + 도구모음이 필요합니다. Benötigt einen Werkzeugkasten im Inventar. Requiert une trousse à outils dans l'inventaire. Wymaga narzędzi w ekwipunku. diff --git a/addons/quickmount/stringtable.xml b/addons/quickmount/stringtable.xml index 19669fa088..1d8fd480c3 100644 --- a/addons/quickmount/stringtable.xml +++ b/addons/quickmount/stringtable.xml @@ -55,7 +55,7 @@ 载具已满 載具已滿 Pojazd pełny - 만차 + 차량이 꽉 찼습니다 Мест нет Veículo cheio Véhicule plein @@ -67,6 +67,7 @@ This option allows quick entry into the vehicle you are directly looking at. Cette option permet d'entrer rapidement dans les véhicules que vous regardez. 這個選項允許你能快速進入你直視的載具 + 这个选项允许你能快速进入你直视的载具 Ta opcja umożliwia szybkie wsiadanie do pojazdu na który patrzysz. Esta opção permite entrada rápida para o veículo que você está olhando この機能により直接見ている車両へすぐさま搭乗できます。 @@ -76,6 +77,7 @@ Эта опция разрешает быстро залезть в транспорт, на который вы смотрите. Esta opción permite entrar rápidamente al vehículo al que estás mirando Diese Option erlaubt es, schnell in das Fahrzeug, auf das der Spieler gerade zeigt, einzusteigen. + 보고 있는 차량에 신속히 탑승하게 합니다. Distance @@ -98,7 +100,7 @@ Maximale Entfernung zu Fahrzeugen Distanza massima per controllare i veicoli. 車両を検知できる最大距離を設定します。 - 最大可检查载具的距离. + 最大可检查载具的距离。 最大可檢查載具的距離 Maksymalna odległość do pojazdu. 탑승 가능한 차량과의 거리 @@ -130,7 +132,7 @@ Maximale Geschwindigkeit (km/h) Velocità Massima (km/h) 最高速度 (km/h) - 最高速度 (公里/小时) + 最高速度(km/h) 最高速度 (公里/小時) Maksymalna prędkość (km/h) 최대 속도 (km/h) @@ -198,10 +200,12 @@ Cambia posto Mudar de Assento 換座位 + 换座位 Changer de place Změnit sedadlo Koltuk Değiştir Cambiar asiento + 좌석 변경 diff --git a/addons/rangecard/stringtable.xml b/addons/rangecard/stringtable.xml index 8290ef9b08..4e1db8954c 100644 --- a/addons/rangecard/stringtable.xml +++ b/addons/rangecard/stringtable.xml @@ -14,7 +14,7 @@ Tavola Balistica 射表 사거리표 - 弹道射表 + 射表 彈道射表 Menzil Kartı @@ -31,7 +31,7 @@ Incrementi per 50 METRI - MRAD/MRAD (reticolo/torrette) 50 メートル増やす -- MRAD/MRAD (照準線/砲塔) 50 미터 늘리기 -- MRAD/MRAD (조준선/포탑) - 50公尺增量 -- 毫弧度/毫弧度 (瞄镜分划线/调整纽) + 50米增量 -- 毫弧度/毫弧度(瞄镜分划线/调整纽) 50公尺增量 -- 毫弧度/毫弧度 (瞄鏡分劃線/調整紐) 50 METER increments -- MRAD/MRAD (reticle/turrets) @@ -48,7 +48,7 @@ Apri Tavola Balistica 射表を開く 사거리표 열기 - 开启弹道射表 + 开启射表 開啟彈道射表 Menzil Kartını Aç @@ -65,7 +65,7 @@ Apri Copia Tavola Balistica 複製された射表を開く 복제 사거리표 열기 - 开启弹道射表副本 + 开启射表副本 開啟彈道射表副本 Menzil Kartının Kopyasını Aç @@ -82,7 +82,7 @@ Apri Tavola Balistica 射表を開く 사거리표 열기 - 开启弹道射表 + 开启射表 開啟彈道射表 Menzil Kartını Aç @@ -99,7 +99,7 @@ Apri Copia Tavola Balistica 複製された射表を開く 복제 사거리표 열기 - 开启弹道射表副本 + 开启射表副本 開啟彈道射表副本 Menzil Kartının Kopyasını Aç @@ -116,7 +116,7 @@ Copia Tavola Balistica 射表を複製する 사거리표 복제 - 复制弹道射表 + 复制射表 複製彈道射表 Menzil Kartını Kopyala diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 394f623f65..efa6a1662f 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -517,6 +517,13 @@ class CfgWeapons { }; }; + class LMG_Minigun_heli: LMG_Minigun { + displayName = "M134 Minigun"; + class manual: manual { + displayName = "M134 Minigun"; + }; + }; + class HMG_127: LMG_RCWS { displayName = "M2"; class manual: MGun { diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 235d29b979..df3987b6fc 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -15,7 +15,7 @@ XM312 XM312 XM312重機槍 - XM312重机枪 + XM312 XM312 @@ -32,7 +32,7 @@ XM312A XM312A XM312A重機槍 - XM312A重机枪 + XM312A XM312A @@ -49,7 +49,7 @@ XM312 (高) XM312 (높음) XM312重機槍 (高射腳架) - XM312重机枪 (高射脚架) + XM312(高) XM312 (Yüksek) @@ -66,7 +66,7 @@ XM307 XM307 XM307榴彈機槍 - XM307榴弹机枪 + XM307 XM307 @@ -83,7 +83,7 @@ XM307A XM307A XM307A榴彈機槍 - XM307A榴弹机枪 + XM307A XM307A @@ -100,7 +100,7 @@ XM307 (高) XM307 (높음) XM307榴彈機槍 (高射腳架) - XM307榴弹机枪 (高射脚架) + XM307(高) XM307 (Yüksek) @@ -115,9 +115,9 @@ Mini-Spike rakétarendszer (Tankelhárító) Lanciatore Mini-Spike (AC) ミニスパイク ランチャー (対戦) - Mini-Spike Launcher (대전차) + 스파이크 미사일 발사기 (대전차) "迷你長釘"導彈發射器 (反坦克) - "迷你长钉"导弹发射器 (反坦克) + "迷你长钉"(反坦) Mini-Spike Launcher (AT) @@ -132,9 +132,9 @@ Mini-Spike rakétarendszer (Repülő-elhárító) Lanciatore Mini-Spike (AA) ミニスパイク ランチャー (対空) - Mini-Spike Launcher (대공) + 스파이크 미사일 발사기 (대공) "迷你長釘"導彈發射器 (防空) - "迷你长钉"导弹发射器 (防空) + "迷你长钉"(防空) Mini-Spike Launcher (AA) @@ -151,7 +151,7 @@ YABHON-R3 YABHON-R3 "亞伯罕-R3型"空中無人載具 - "亚伯罕-R3型"空中无人载具 + "联合"-R3 YABHON-R3 @@ -168,7 +168,7 @@ YABHON-R3 (CAS) YABHON-R3 (근접지원) "亞伯罕-R3型"空中無人載具 (近空支援) - "亚伯罕-R3型"空中无人载具 (近空支援) + "联合"-R3(近空支援) YABHON-R3 (CAS) @@ -185,7 +185,7 @@ M-ATV M-ATV 防地雷反伏擊全地形車 - 防地雷反伏击全地形车 + M-ATV M-ATV @@ -202,7 +202,7 @@ M-ATV (HMG) M-ATV (HMG) 防地雷反伏擊全地形車 (重機槍) - 防地雷反伏击全地形车 (重机枪) + M-ATV(重机枪) M-ATV (HMG) @@ -219,7 +219,7 @@ M-ATV (GMG) M-ATV (GMG) 防地雷反伏擊全地形車 (榴彈機槍) - 防地雷反伏击全地形车 (榴弹机枪) + M-ATV(榴弹发射器) M-ATV (GMG) @@ -234,9 +234,9 @@ Merkava Mk IV M Merkava Mk IV M メルカバ Mk IV M - Merkava Mk IV M + 메르카바 Mk IV M "梅卡瓦4代"主戰坦克 - "梅卡瓦4代"主战坦克 + "梅卡瓦"4M Merkava Mk IV M @@ -251,9 +251,9 @@ Merkava Mk IV LIC Merkava Mk IV LIC メルカバ Mk IV LIC - Merkava Mk IV LIC + 메르카바 Mk IV LIC "梅卡瓦4代"主戰坦克 城市版 - "梅卡瓦4代"主战坦克 城市版 + "梅卡瓦"4M 城市版 Merkava Mk IV LIC @@ -267,10 +267,10 @@ Sholef Sholef Sholef - ショルフ - Sholef + ショレフ + 숄레프 자주포 "神槍"自走炮 - "神枪"自走炮 + "神枪" Sholef @@ -285,9 +285,9 @@ Seara Seara シアラ - Seara + 시아라 다연장로켓 "希拉"多管火箭車 - "希拉"多管火箭车 + "希拉" Seara @@ -301,10 +301,10 @@ Namer Namer Namer - ネイマー - Namer + ナメル + 나메르 APC "花豹"裝甲運兵車 - "花豹"装甲运兵车 + "花豹" Namer @@ -318,10 +318,10 @@ Bardelas Bardelas Bardelas - バーラデラス - Bardelas + バルデラス + 바델라스 자주대공포 "布萊德斯"防空車 - "布莱德斯"防空车 + "布莱德斯" Bardelas @@ -335,10 +335,10 @@ Badger IFV Badger IFV Badger IFV - バッジ IFV - Badger IFV + バジャー IFV + 뱃져 IFV "蜜獾"步兵戰車 - "蜜獾"步兵战车 + "蜜獾" Badger IFV @@ -353,9 +353,9 @@ Nemmera Nemmera ネマラ - Nemmera + 네메라 공병장갑차 "雌豹"戰鬥工程車 - "雌豹"战斗工程车 + "雌豹" Nemmera @@ -372,7 +372,7 @@ HEMTT 輸送型 HEMTT 수송 重型增程機動戰術卡車 (運輸) - 重型增程机动战术卡车 (运输) + HEMTT(运输) HEMTT Nakil @@ -389,7 +389,7 @@ HEMTT 輸送型 (幌) HEMTT 수송 (덮개) 重型增程機動戰術卡車 (運輸, 棚布) - 重型增程机动战术卡车 (运输, 棚布) + HEMTT(运输,棚布) HEMTT Nakil (Kapalı) @@ -406,7 +406,7 @@ HEMTT HEMTT 重型增程機動戰術卡車 - 重型增程机动战术卡车 + HEMTT HEMTT @@ -423,7 +423,7 @@ HEMTT コンテナ型 HEMTT 컨테이너 重型增程機動戰術卡車 (貨櫃) - 重型增程机动战术卡车 (货柜) + HEMTT(货柜) HEMTT Konteynır @@ -440,7 +440,7 @@ HEMTT 救急車 HEMTT 의료 重型增程機動戰術卡車 (醫療) - 重型增程机动战术卡车 (医疗) + HEMTT(医疗) HEMTT Medikal @@ -457,7 +457,7 @@ HEMTT 弾薬給弾型 HEMTT 탄약 重型增程機動戰術卡車 (彈藥) - 重型增程机动战术卡车 (弹药) + HEMTT(弹药) HEMTT Cephane @@ -474,7 +474,7 @@ HEMTT 燃料給油車 HEMTT 연료 重型增程機動戰術卡車 (燃油) - 重型增程机动战术卡车 (燃油) + HEMTT(燃油) HEMTT Yakıt @@ -491,7 +491,7 @@ HEMTT 修理型 HEMTT 수리 重型增程機動戰術卡車 (維修) - 重型增程机动战术卡车 (维修) + HEMTT(维修) HEMTT Tamir @@ -506,9 +506,9 @@ Fennek Fennek フェネック - Fennek + 페넥 "非洲小狐"防地雷反伏擊車 - "非洲小狐"防地雷反伏击车 + "非洲小狐" Fennek @@ -523,9 +523,9 @@ Fennek (nehézgéppuska) Fennek (HMG) フェネック (HMG) - Fennek (HMG) + 페넥 (HMG) "非洲小狐"防地雷反伏擊車 (重機槍) - "非洲小狐"防地雷反伏击车 (重机枪) + "非洲小狐"(重机枪) Fennek (HMG) @@ -540,9 +540,9 @@ Fennek (gránátgéppuska) Fennek (GMG) フェネック (GMG) - Fennek (GMG) + 페넥 (GMG) "非洲小狐"防地雷反伏擊車 (榴彈機槍) - "非洲小狐"防地雷反伏击车 (榴弹机枪) + "非洲小狐"(榴弹发射器) Fennek (GMG) @@ -556,10 +556,10 @@ Leopard 2SG Leopard 2SG Leopard 2SG - レオパルド 2SG - Leopard 2SG + レオパルト 2SG + 레오파르트 2SG "豹2型新加坡版"主戰坦克 - "豹2型新加坡版"主战坦克 + "豹"2 新加坡版 Leopard 2SG @@ -574,9 +574,9 @@ FV510 Warrior FV510 Warrior FV510 ウォーリアー - FV510 Warrior - FV510"戰士"步兵戰車 - FV510"战士"步兵战车 + FV510 워리어 IFV + FV510 "戰士"步兵戰車 + FV510 "战士" FV510 Warrior @@ -591,9 +591,9 @@ Pandur II Pandur II パンデュール II - Pandur II + 판두르 II APC "潘德2型"裝甲運兵車 - "潘德2型"装甲运兵车 + "潘德"二型 Pandur II @@ -608,9 +608,9 @@ KamAZ szállítójármű KamAZ da trasporto KamAZ 輸送型 - KamAZ 수송 + 카마즈 수송 "卡瑪斯"卡車 (運輸) - "卡玛斯"卡车 (运输) + "卡玛兹"(运输) KamAZ Nakil @@ -625,9 +625,9 @@ KamAZ szállítójármű (ponyvás) KamAZ da trasporto (coperto) KamAZ 輸送型 (幌) - KamAZ 수송 (덮개) + 카마즈 수송 (덮개) "卡瑪斯"卡車 (運輸, 棚布) - "卡玛斯"卡车 (运输, 棚布) + "卡玛兹"(运输,棚布) KamAZ Nakil (Kapalı) @@ -642,9 +642,9 @@ KamAZ (lőszerszállító) KamAZ di rifornimento munizioni KamAZ 弾薬給弾型 - KamAZ 탄약 + 카마즈 탄약 "卡瑪斯"卡車 (彈藥) - "卡玛斯"卡车 (弹药) + "卡玛兹"(弹药) KamAZ Cephane @@ -659,9 +659,9 @@ KamAZ (üzemanyag-szállító) KamAZ di rifornimento carburante KamzAZ 燃料給油車 - KamAZ 연료 + 카마즈 연료 "卡瑪斯"卡車 (燃油) - "卡玛斯"卡车 (燃油) + "卡玛兹"(燃油) KamAZ Yakıt @@ -676,9 +676,9 @@ KamAZ (szerelő-jármű) KamAZ riparatore KamzAZ 修理型 - KamAZ 수리 + 카마즈 수리 "卡瑪斯"卡車 (維修) - "卡玛斯"卡车 (维修) + "卡玛兹"(维修) KamAZ Tamir @@ -693,16 +693,16 @@ KamAZ (egészségügyi) KamAZ Medico KamAZ 救急車 - KamAZ 의료 + 카마즈 의료 "卡瑪斯"卡車 (醫療) - "卡玛斯"卡车 (医疗) + "卡玛兹"(医疗) KamAZ Medikal KamAZ MRL KamAS MRL "卡瑪斯"卡車 (多管火箭) - "卡玛斯"卡车 (多管火箭) + "卡玛兹"(多管火箭) KamAZ MRL KamAZ MRL KamAZ MRL @@ -712,6 +712,7 @@ KamAZ MRL (raketové dělostřelectvo) KamAZ MRL KamAZ + 카마즈 다연장로켓 Karatel @@ -725,9 +726,9 @@ Karatel Karatel カラテル - Karatel + 카라텔 "懲罰者"防地雷反伏擊車 - "惩罚者"防地雷反伏击车 + "宪兵" Karatel @@ -742,9 +743,9 @@ Karatel (nehézgéppuska) Karatel (HMG) カラテル (HMG) - Karatel (HMG) + 카라텔 (HMG) "懲罰者"防地雷反伏擊車 (重機槍) - "惩罚者"防地雷反伏击车 (重机枪) + "宪兵"(重机枪) Karatel (HMG) @@ -759,9 +760,9 @@ Karatel (gránátgéppuska) Karatel (GMG) カラテル (GMG) - Karatel (GMG) + 카라텔 (GMG) "懲罰者"防地雷反伏擊車 (榴彈機槍) - "惩罚者"防地雷反伏击车 (榴弹机枪) + "宪兵"(榴弹发射器) Karatel (GMG) @@ -776,9 +777,9 @@ T100 Fekete Sas T100 Black Eagle T100 ブラック イーグル - T100 Black Eagle - T100"黑鷹"主戰坦克 - T100"黑鹰"主战坦克 + T-100 블랙 이글 + T100 "黑鷹"主戰坦克 + T-100 "黑鹰" T100 Black Eagle @@ -793,9 +794,9 @@ 2S9 Sochor 2S9 Sochor 2S9 ソーカー - 2S9 Sochor - 2S9"薩克爾"自走砲 - 2S9"萨克尔"自走炮 + 2S9 소코르 + 2S9 "薩克爾"自走砲 + 2S9 "索科尔" 2S9 Sochor @@ -810,9 +811,9 @@ BM-2T Stalker BM-2T Stalker BM-2T ストーカー - BM-2T Stalker + BM-2T 스토커 BM-2T"潛行者"步兵戰車 - BM-2T"潜行者"步兵战车 + BM-2T "潜行者" BM-2T Stalker @@ -827,9 +828,9 @@ ZSU-35 Tigris ZSU-35 Tigris ZSU-35 ティグリス - ZSU-35 Tigris - ZSU-35"虎式"防空車 - ZSU-35"虎式"防空车 + ZSU-35 티그리스 + ZSU-35 "虎式"防空車 + ZSU-35 "底格里斯" ZSU-35 Tigris @@ -844,9 +845,9 @@ Otokar ARMA Otokar ARMA オトカ アルマ - Otokar ARMA - "奧托卡-阿爾默"裝甲運兵車 - "奥托卡-阿尔默"装甲运兵车 + 오토카르 아르마 APC + "奧托卡—阿爾默"裝甲運兵車 + 奥托卡尔 "阿玛" Otokar ARMA @@ -861,9 +862,9 @@ Typhoon szállítójármű Typhoon da trasporto タイフーン 輸送型 - Typhoon 수송 + 타이푼 수송 "颱風"卡車 (運輸) - "台风"卡车 (运输) + "台风"(运输) Typhoon Nakil @@ -878,9 +879,9 @@ Typhoon szállítójármű (ponyvás) Typhoon da trasporto (coperto) タイフーン 輸送型 (幌) - Typhoon 수송 (덮개) + 타이푼 수송 (덮개) "颱風"卡車 (運輸, 棚布) - "台风"卡车 (运输, 棚布) + "台风"(运输,棚布) Typhoon Nakil (Kapalı) @@ -895,9 +896,9 @@ Typhoon (eszköz) Typhoon per dispositivo タイフーン デバイス型 - Typhoon 장치 + 타이푼 장치 "颱風"卡車 (精密設備) - "台风"卡车 (精密设备) + "台风"(装置) Typhoon Cihaz @@ -912,9 +913,9 @@ Typhoon (lőszerszállító) Typhoon di rifornimento munizioni タイフーン 弾薬給弾型 - Typhoon 탄약 + 타이푼 탄약 "颱風"卡車 (彈藥) - "台风"卡车 (弹药) + "台风"(弹药) Typhoon Cephane @@ -929,9 +930,9 @@ Typhoon (üzemanyag-szállító) Typhoon di rifornimento carburante タイフーン 燃料給油車 - Typhoon 연료 + 타이푼 연료 "颱風"卡車 (燃油) - "台风"卡车 (燃油) + "台风"(燃油) Typhoon Yakıt @@ -946,9 +947,9 @@ Typhoon (szerelő-jármű) Typhoon riparatore タイフーン 修理型 - Typhoon 수리 + 타이푼 수리 "颱風"卡車 (維修) - "台风"卡车 (维修) + "台风"(维修) Typhoon Tamir @@ -963,9 +964,9 @@ Typhoon (egészségügyi) Typhoon medico タイフーン 救急車 - Typhoon 의료 + 타이푼 의료 "颱風"卡車 (醫療) - "台风"卡车 (医疗) + "台风"(医疗) Typhoon Medikal @@ -980,9 +981,9 @@ RAH-66 Comanche RAH-66 Comanche RAH-66 コマンチ - RAH-66 Comanche - RAH-66"卡曼契"攻擊直升機 - RAH-66"卡曼契"攻击直升机 + RAH-66 코만치 + RAH-66 "卡曼契"攻擊直升機 + RAH-66 "科曼奇" RAH-66 Comanche @@ -997,9 +998,9 @@ MH-6 Little Bird MH-6 Little Bird MH-6 リトル バード - MH-6 Little Bird - MH-6"小鳥"運輸直升機 - MH-6"小鸟"运输直升机 + MH-6 리틀버드 + MH-6 "小鳥"運輸直升機 + MH-6 "小鸟" MH-6 Little Bird @@ -1014,9 +1015,9 @@ AH-6 Little Bird AH-6 Little Bird AH-6 リトル バード - AH-6 Little Bird - AH-6"小鳥"武裝直升機 - AH-6"小鸟"武装直升机 + AH-6 리틀버드 + AH-6 "小鳥"武裝直升機 + AH-6 "小鸟" AH-6 Little Bird @@ -1031,9 +1032,9 @@ CH-47I Chinook CH-47I Chinook CH-47I チヌーク - CH-47I Chinook + CH-47I 치누크 CH-47I"契努克"運輸直升機 - CH-47I"契努克"运输直升机 + CH-47I "支努干" CH-47I Chinook @@ -1048,9 +1049,9 @@ CH-47I Chinook (disarmato) CH-47I Chinook (desarmado) CH-47I チヌーク (非武装) - CH-47I Chinook (비무장) + CH-47I 치누크 (비무장) CH-47I"契努克"運輸直升機 (無武裝) - CH-47I"契努克"运输直升机 (无武装) + CH-47I "支努干"(无武装) CH-47I Chinook (silahsız) @@ -1065,9 +1066,9 @@ A-10D Thunderbolt II A-10D Thunderbolt II A-10D サンダーボルト II - A-10D Thunderbolt II + A-10D 썬더볼트 II A-10D"雷霆二式"攻擊機 - A-10D"雷霆二式"攻击机 + A-10D "雷霆"二式 A-10D Thunderbolt II @@ -1082,9 +1083,9 @@ AW159 Wildcat AW159 Wildcat AW159 ワイルドキャット - AW159 Wildcat - AW159"野貓"直升機 - AW159"野猫"直升机 + AW159 와일드캣 + AW159 "野貓"直升機 + AW159 "野猫" AW159 Wildcat @@ -1099,9 +1100,9 @@ AW159 Wildcat (fegyvertelen) AW159 Wildcat (disarmato) AW159 ワイルドキャット (非武装) - AW159 Wildcat (비무장) - AW159"野貓"直升機 (無武裝) - AW159"野猫"直升机 (无武装) + AW159 와일드캣 (비무장) + AW159 "野貓"直升機 (無武裝) + AW159 "野猫"(无武装) AW159 Wildcat (silahsız) @@ -1116,9 +1117,9 @@ AW101 Merlin AW101 Merlin AW101 マーリン - AW101 Merlin - AW101"灰背隼"運輸直升機 - AW101"灰背隼"运输直升机 + AW101 멀린 + AW101 "灰背隼"運輸直升機 + AW101 "灰背隼" AW101 Merlin @@ -1135,7 +1136,7 @@ L-159 ALCA L-159 ALCA L-159先進輕型戰鬥機 - L-159先进轻型战斗机 + L-159 ALCA L-159 ALCA @@ -1152,7 +1153,7 @@ L-159 ALCA (CAS) L-159 ALCA (근접지원) L-159先進輕型戰鬥機 (近空支援) - L-159先进轻型战斗机 (近空支援) + L-159 ALCA(近空支援) L-159 ALCA (CAS) @@ -1169,7 +1170,7 @@ L-159 ALCA (対空) L-159 ALCA (대공) L-159先進輕型戰鬥機 (空對空) - L-159先进轻型战斗机 (空对空) + L-159 ALCA(空对空) L-159 ALCA (AA) @@ -1185,7 +1186,7 @@ JAS 39 グリペン JAS 39 그리펜 JAS 39 獅鷲戰鬥機 - JAS 39 狮鹫战斗机 + JAS 39 "狮鹫" JAS 39 Gripen @@ -1200,9 +1201,9 @@ Ka-60 Kasatka Ka-60 Kasatka Ka-60 カサートカ - Ka-60 Kasatka - Ka-60"逆戟鯨"直升機 - Ka-60"逆戟鲸"直升机 + Ka-60 카사트카 + Ka-60 "逆戟鯨"直升機 + Ka-60 "虎鲸" Ka-60 Kasatka @@ -1216,9 +1217,9 @@ Ka-60 Касатка (белый и черный) Ka-60 Kasatka (blanco y negro) Ka-60 カサートカ (黒 & 白) - Ka-60 Kasatka (검정 및 하양) - Ka-60"逆戟鯨"直升機 (黑&白) - Ka-60"逆戟鲸"直升机 (黑&白) + Ka-60 카사트카 (검정 및 하양) + Ka-60 "逆戟鯨"直升機 (黑&白) + Ka-60 "虎鲸"(黑白) Ka-60 Kasatka (Siyah & Beyaz) @@ -1233,9 +1234,9 @@ Ka-60 Kasatka (fegyvertelen) Ka-60 Kasatka (disarmato) Ka-60 カサートカ (非武装) - Ka-60 Kasatka (비무장) - Ka-60"逆戟鯨"直升機 (無武裝) - Ka-60"逆戟鲸"直升机 (无武装) + Ka-60 카사트카 (비무장) + Ka-60 "逆戟鯨"直升機 (無武裝) + Ka-60 "虎鲸"(无武装) Ka-60 Kasatka (Silahsız) @@ -1251,8 +1252,8 @@ Yak-130 Yak-130 Yak-130 - Yak-130"手套"攻擊機 - Yak-130"手套"攻击机 + Yak-130 "手套"攻擊機 + Yak-130 Yak-130 @@ -1268,8 +1269,8 @@ MD 500 MD 500 MD 500 - MD 500"防衛者"直升機 - MD 500"防卫者"直升机 + MD 500 "防衛者"直升機 + MD 500 "防卫者" MD 500 @@ -1286,7 +1287,7 @@ M4A1 SLAM M4A1 SLAM M4A1指向性反裝甲地雷 - M4A1指向性反装甲地雷 + M4A1 指向性反装甲地雷 M4A1 SLAM @@ -1302,8 +1303,8 @@ M18A1 Claymore Mina antiuomo M18A1 クレイモア M18A1 클레이모어 - M18A1"闊刀"地雷 - M18A1"阔刀"地雷 + M18A1 "闊刀"地雷 + M18A1 "阔剑" M18A1 Claymore @@ -1320,7 +1321,7 @@ M183 梱包爆薬 M183 폭파 장약 조립 M183炸藥包 - M183炸药包 + M183 炸药包 M183 Demolition Charge Assembly @@ -1332,6 +1333,8 @@ M183 Комплектный подрывной заряд (Бросаемый) Ładunek burzący M183 (Rzucany) M183 Geballte Sprengladung (Werfbar) + M183 炸药包(可投掷) + M183 폭파 장약 (투척) M112 Demolition Block @@ -1347,7 +1350,7 @@ M112 爆薬ブロック M112 폭파 블럭 M112塑性炸藥 - M112塑性炸药 + M112 塑性炸药 M112 Demolition Block @@ -1359,6 +1362,8 @@ M112 подрывной заряд (Бросаемый) Ładunek burzący M112 (Rzucany) M112 Sprengladung (Werfbar) + M112 塑性炸药(可投掷) + M112 폭파 장약 (투척) M67 Fragmentation Grenade @@ -1374,7 +1379,7 @@ M67 破片手榴弾 M67 세열 수류탄 M67破片手榴彈 - M67破片手榴弹 + M67 破片手榴弹 M67 El Bombası @@ -1390,6 +1395,8 @@ V40 Mini-Granát Mini Granada V40 V40 Mini-El Bombası + V40 迷你手榴弹 + V40 소형 수류탄 M83 Smoke Grenade (White) @@ -1402,10 +1409,10 @@ M83 Granada de fumaça (Branca) M83 füstgránát (Fehér) M83 Granata fumogena (Bianco) - M18 発煙手榴弾 (白) + M83 発煙手榴弾 (白) M83 연막탄 (하양) M83煙霧彈 (白色) - M83烟雾弹 (白色) + M83 烟雾弹(白色) M83 Sis Bombası (Beyaz) @@ -1422,7 +1429,7 @@ M18 発煙手榴弾 (青) M18 연막탄 (파랑) M18煙霧彈 (藍色) - M18烟雾弹 (蓝色) + M18 烟雾弹(蓝色) M83 Sis Bombası (Mavi) @@ -1439,7 +1446,7 @@ M18 煙幕手榴弾 (緑) M18 연막탄 (초록) M18煙霧彈 (綠色) - M18烟雾弹 (绿色) + M18 烟雾弹(绿色) M83 Sis Bombası (Yeşil) @@ -1456,7 +1463,7 @@ M18 発煙手榴弾 (橙) M18 연막탄 (주황) M18煙霧彈 (橘色) - M18烟雾弹 (橘色) + M18 烟雾弹(橘色) M83 Sis Bombası (Turuncu) @@ -1473,7 +1480,7 @@ M18 発煙手榴弾 (紫) M18 연막탄 (보라) M18煙霧彈 (紫色) - M18烟雾弹 (紫色) + M18 烟雾弹(紫色) M83 Sis Bombası (Mor) @@ -1490,7 +1497,7 @@ M18 煙幕手榴弾 (赤) M18 연막탄 (빨강) M18煙霧彈 (紅色) - M18烟雾弹 (红色) + M18 烟雾弹(红色) M83 Sis Bombası (Kırmızı) @@ -1507,7 +1514,7 @@ M18 発煙手榴弾 (黄) M18 연막탄 (노랑) M18煙霧彈 (黃色) - M18烟雾弹 (黄色) + M18 烟雾弹(黄色) M83 Sis Bombası (Sarı) @@ -1524,7 +1531,7 @@ M15 対戦車地雷 M15 대전차지뢰 M15反坦克地雷 - M15反坦克地雷 + M15 反坦克地雷 M15 Anti-Tank Mayını @@ -1541,7 +1548,7 @@ VS-50 対人地雷 VS-50 대인지뢰 VS-50反人員地雷 - VS-50反人员地雷 + VS-50 反人员地雷 VS-50 Anti-Personel Mayını @@ -1558,7 +1565,7 @@ M26 対人跳躍地雷 M26 대인도약지뢰 M26反人員彈跳雷 - M26反人员弹跳雷 + M26 反人员跳雷 M26 Anti Personel Mayını @@ -1575,7 +1582,7 @@ PMR-3 仕掛け型対人地雷 PMR-3 대인인계철선지뢰 PMR-3反人員絆線雷 - PMR-3反人员绊线雷 + PMR-3 反人员绊雷 PMR-3 Telli Anti Personel Mayını @@ -1592,7 +1599,7 @@ P99 P99 P99手槍 - P99手枪 + P99 P99 @@ -1607,9 +1614,9 @@ MP-443 Grach MP-443 Grach MP-433 グラッチ - MP-443 Grach - MP-443"烏鴉"手槍 - MP-443"乌鸦"手枪 + MP-443 그라치 + MP-443 "烏鴉"手槍 + MP-443 "乌鸦" MP-443 Grach @@ -1623,10 +1630,10 @@ Custom Covert II Custom Covert II ACP-C2 - カスタム コンバート II - Custom Covert II + カスタム コバートⅡ + 커스텀 커버트 II 特裝隱蔽Ⅱ型手槍 - 特装隐蔽Ⅱ型手枪 + 金柏特特装隐蔽二型 Custom Covert II @@ -1642,9 +1649,9 @@ FNX-45 Tactical FNX-45 Tactical FNX-45 タクティカル - FNX-45 Tactical + FNX-45 택티컬 FNX-45戰術型手槍 - FNX-45战术型手枪 + FNX-45 战术型 FNX-45 Tactical (Green) @@ -1659,9 +1666,9 @@ FNX-45 Tactical (Verde) FNX-45 Tactical (Yeşil) FNX-45 タクティカル (グリーン) - FNX-45 Tactical (초록) + FNX-45 택티컬 (초록) FNX-45戰術型手槍 (綠色) - FNX-45战术型手枪 (绿色) + FNX-45 战术型(绿色) Chiappa Rhino 60DS @@ -1675,9 +1682,9 @@ Chiappa Rhino 60DS Chiappa Rhino 6DS チアッパ ライノ 60DS - Chiappa Rhino 60DS + 키아파 라이노 60DS 齊亞帕"犀牛"60DS左輪手槍 - 齐亚帕"犀牛"60DS左轮手枪 + 齐亚帕"犀牛" 60DS Chiappa Rhino 60DS @@ -1692,9 +1699,9 @@ Taurus Judge Taurus Judge タウルス ジャッジ - Taurus Judge + 타우러스 저지 金牛座"法官"信號槍 - 金牛座"法官"信号枪 + 金牛座"法官" Taurus Judge @@ -1711,7 +1718,7 @@ NLAW NLAW 次世代輕型反坦克導彈發射器 - 次世代轻型反坦克导弹发射器 + NLAW NLAW @@ -1728,8 +1735,8 @@ RPG-32 RPG-32 RPG-32 - RPG-32"哈希姆"火箭發射器 - RPG-32"哈希姆"火箭发射器 + RPG-32 "哈希姆"火箭發射器 + RPG-32 RPG-32 (Green) @@ -1745,8 +1752,8 @@ RPG-32 (Yeşil) RPG-32 (グリーン) RPG-32 (초록) - RPG-32"哈希姆"火箭發射器 (綠色) - RPG-32"哈希姆"火箭发射器 (绿色) + RPG-32 "哈希姆"火箭發射器 (綠色) + RPG-32(绿色) Mini-Spike (AA) @@ -1760,9 +1767,9 @@ Mini-Spike (AA) Mini-Spike (AA) ミニスパイク (対空) - Mini-Spike (대공) + 스파이크 미사일 (대공) "迷你長釘"導彈發射器 (防空) - "迷你长钉"导弹发射器 (防空) + "迷你长钉"(防空) Mini-Spike (AA) @@ -1777,9 +1784,9 @@ Mini-Spike (AT) Mini-Spike (AT) ミニスパイク (対地) - Mini-Spike (대전차) + 스파이크 미사일 (대전차) "迷你長釘"導彈發射器 (反坦克) - "迷你长钉"导弹发射器 (反坦克) + "迷你长钉"(反坦) Mini-Spike (AT) @@ -1788,7 +1795,7 @@ Metis-M Метис-М "麥士蒂索人"-M型反坦克導彈 - "麦士蒂索人"-M型反坦克导弹 + "麦士蒂索"-M Metis-M メチス-M Metis-M @@ -1796,6 +1803,7 @@ Metis-M Metis-M Metis-M + 메티스-M Metis-M (Brown) @@ -1803,7 +1811,7 @@ Metis-M (Brun) Метис-М (Коричневый) "麥士蒂索人"-M型反坦克導彈(棕色) - "麦士蒂索人"-M型反坦克导弹(棕色) + "麦士蒂索"-M(棕色) Metis-M (Marrone) メチス-M (ブラウン) Metis-M (Brązowy) @@ -1811,6 +1819,7 @@ Metis-M (hnědý) Metis-M (Marrón) Metis-M (Kahverengi) + 메티스-M (갈색) Metis-M (Green) @@ -1818,7 +1827,7 @@ Metis-M (Vert) Метис-М (Зелёный) "麥士蒂索人"-M型反坦克導彈(綠色) - "麦士蒂索人"-M型反坦克导弹(绿色) + "麦士蒂索"-M(绿色) Metis-M (Verde) メチス-M (グリーン) Metis-M (Zielony) @@ -1826,6 +1835,7 @@ Metis-M (zelený) Metis-M (Verde) Metis-M (Yeşil) + 메티스-M (녹색) MX @@ -1841,7 +1851,7 @@ MX MX MX突擊步槍 - MX突击步枪 + MX MX @@ -1858,7 +1868,7 @@ MX (ブラック) MX (검정) MX突擊步槍 (黑色) - MX突击步枪 (黑色) + MX(黑色) MX (Siyah) @@ -1891,7 +1901,7 @@ MXC MXC MXC卡賓步槍 - MXC卡宾步枪 + MXC MXC @@ -1908,7 +1918,7 @@ MXC (ブラック) MXC (검정) MXC卡賓步槍 (黑色) - MXC卡宾步枪 (黑色) + MXC(黑色) MXC (Siyah) @@ -1941,7 +1951,7 @@ MX 3GL MX 3GL MX突擊步槍 (3連裝榴彈) - MX突击步枪 (3连装榴弹) + MX 3GL MX 3GL @@ -1957,8 +1967,8 @@ MX 3GL (Nero) MX 3GL (ブラック) MX 3GL (검정) - MX突擊步槍 (3連裝榴彈-黑色) - MX突击步枪 (3连装榴弹-黑色) + MX突擊步槍 (3連裝榴彈—黑色) + MX 3GL(黑色) MX 3GL (Siyah) @@ -1991,7 +2001,7 @@ MX LSW MX LSW MX輕型機槍 - MX轻型机枪 + MX LSW MX LSW @@ -2008,7 +2018,7 @@ MX LSW (ブラック) MX LSW (검정) MX輕型機槍 (黑色) - MX轻型机枪 (黑色) + MX LSW(黑色) MX LSW (Siyah) @@ -2041,7 +2051,7 @@ MXM MXM MXM精準步槍 - MXM精准步枪 + MXM MXM @@ -2058,7 +2068,7 @@ MXM (ブラック) MXM (검정) MXM精準步槍 (黑色) - MXM精准步枪 (黑色) + MXM(黑色) MXM (Siyah) @@ -2089,9 +2099,9 @@ KT2002 Sama KT2002 Katiba KH2002 サマ - KH2002 Sama - KH2002"海白爾"突擊步槍 - KH2002"海白尔"突击步枪 + KH2002 사마 + KH2002 "海白爾"突擊步槍 + KH2002 Sama KH2002 Sama @@ -2106,9 +2116,9 @@ KT2002C Sama KT2002C Katiba KH2002C サマ - KH2002C Sama + KH2002C 사마 KH2002C"海白爾"卡賓步槍 - KH2002C"海白尔"卡宾步枪 + KH2002C Sama KH2002C Sama @@ -2123,9 +2133,9 @@ KT2002 Sama KGL KT2002 Katiba KGL KH2002 サマ KGL - KH2002 Sama KGL - KH2002"海白爾"突擊步槍 (榴彈) - KH2002"海白尔"突击步枪 (榴弹) + KH2002 사마 KGL + KH2002 "海白爾"突擊步槍 (榴彈) + KH2002 Sama KGL KH2002 Sama KGL @@ -2142,7 +2152,7 @@ F2000 (カモフラージュ) F2000 (위장) F2000突擊步槍 (迷彩) - F2000突击步枪 (迷彩) + F2000(迷彩) F2000 (Kamuflaj) @@ -2159,7 +2169,7 @@ F2000 F2000 F2000突擊步槍 - F2000突击步枪 + F2000 F2000 @@ -2174,9 +2184,9 @@ F2000 Tactical (Camo) F2000 Tactical (Camo) F2000 タクティカル (カモフラージュ) - F2000 Tactical (위장) + F2000 택티컬 (위장) F2000戰術型突擊步槍 (迷彩) - F2000战术型突击步枪 (迷彩) + F2000 战术型(迷彩) F2000 Tactical (Kamuflaj) @@ -2191,9 +2201,9 @@ F2000 Tactical F2000 Tactical F2000 タクティカル - F2000 Tactical + F2000 택티컬 F2000戰術型突擊步槍 - F2000战术型突击步枪 + F2000 战术型 F2000 Tactical @@ -2209,8 +2219,8 @@ F2000 EGLM (Camo) F2000 EGLM (カモフラージュ) F2000 EGLM (위장) - F2000突擊步槍 (榴彈-迷彩) - F2000突击步枪 (榴弹-迷彩) + F2000突擊步槍 (榴彈—迷彩) + F2000 ELGM(迷彩) F2000 EGLM (Kamuflaj) @@ -2227,7 +2237,7 @@ F2000 EGLM F2000 EGLM F2000突擊步槍 (榴彈) - F2000突击步枪 (榴弹) + F2000 ELGM F2000 EGLM @@ -2244,7 +2254,7 @@ TAR-21 TAR-21 TAR-21突擊步槍 - TAR-21突击步枪 + TAR-21 TAR-21 @@ -2261,7 +2271,7 @@ CTAR-21 CTAR-21 CTAR-21卡賓步槍 - CTAR-21卡宾步枪 + CTAR-21 CTAR-21 @@ -2278,7 +2288,7 @@ GTAR-21 EGLM GTAR-21 EGLM GTAR-21突擊步槍 (榴彈) - GTAR-21突击步枪 (榴弹) + GTAR-21 EGLM GTAR-21 EGLM @@ -2293,9 +2303,9 @@ Vector SMG Vector SMG ベクター SMG - Vector SMG + 벡터 SMG "維克特"衝鋒槍 - "维克特"冲锋枪 + Vector 冲锋枪 Vector SMG @@ -2310,9 +2320,9 @@ Scorpion Evo 3 A1 Scorpion Evo 3 A1 スコーピオン エボ 3 A1 - Scorpion Evo 3 A1 + 스콜피온 에보 3 A1 "蠍式"Evo 3 A1衝鋒槍 - "蝎式"Evo 3 A1冲锋枪 + Evo 3 A1 "蝎" Scorpion Evo 3 A1 @@ -2329,7 +2339,7 @@ CPW CPW 緊湊型個人衝鋒槍 - 紧凑型个人冲锋枪 + CPW CPW @@ -2346,7 +2356,7 @@ RFB SDAR RFB SDAR 犢牛式水陸兩用步槍 - 犊牛式水陆两用步枪 + RFB SDAR RFB SDAR @@ -2361,9 +2371,9 @@ Stoner 99 LMG Stoner 99 LMG ストーナー 99 LMG - Stoner 99 LMG + 스토너 99 LMG 斯通納99輕機槍 - 斯通纳99轻机枪 + 斯通纳 99 Stoner 99 LMG @@ -2378,9 +2388,9 @@ Negev NG7 Negev NG7 ネゲフ NG7 - Negev NG7 + 네게브 NG7 內蓋夫NG7機槍 - 内盖夫NG7机枪 + 内格夫 NG7 Negev NG7 @@ -2397,7 +2407,7 @@ Mk14 Mod 1 EBR Mk14 Mod 1 EBR Mk14一型增強型戰鬥步槍 - Mk14一型增强型战斗步枪 + Mk14 Mod 1 EBR Mk14 Mod 1 EBR @@ -2412,9 +2422,9 @@ GM6 Lynx GM6 Lynx GM6 リンクス - GM6 Lynx - GM6"天貓"反器材狙擊步槍 - GM6"天猫"反器材狙击步枪 + GM6 링스 + GM6 "天貓"反器材狙擊步槍 + GM6 "猞猁" GM6 Lynx @@ -2429,9 +2439,9 @@ GM6 Lynx (Camo) GM6 Lynx (Camo) GM6 リンクス (カモフラージュ) - GM6 Lynx (위장) - GM6"天貓"反器材狙擊步槍 (迷彩) - GM6"天猫"反器材狙击步枪 (迷彩) + GM6 링스 (위장) + GM6 "天貓"反器材狙擊步槍 (迷彩) + GM6 "猞猁"(迷彩) GM6 Lynx (Kamufulaj) @@ -2446,9 +2456,9 @@ M200 Intervention M200 Intervention M200 インターベンション - M200 Intervention + M200 인터벤션 M200干預型狙擊步槍 - M200干预型狙击步枪 + M200 "干预" M200 Intervention @@ -2463,9 +2473,9 @@ M200 Intervention (Camo) M200 Intervention (Camo) M200 インターベンション (カモフラージュ) - M200 Intervention (위장) + M200 인터벤션 (위장) M200干預型狙擊步槍 (迷彩) - M200干预型狙击步枪 (迷彩) + M200 "干预"(迷彩) M200 Intervention (kamuflaj) @@ -2482,7 +2492,7 @@ VS-121 VS-121 VS-121狙擊步槍 - VS-121狙击步枪 + VS-121 VS-121 @@ -2497,9 +2507,9 @@ Noreen "Bad News"ULR Noreen "Bad News" ULR ノレーン "バッド ニュース" ULR - Noreen "Bad News" ULR + 노린 "배드뉴스" ULR 諾琳"壞消息"極距狙擊步槍 - 诺琳"坏消息"极距狙击步枪 + 诺琳 "坏消息" 极距狙击步枪 Noreen "Bad News" ULR @@ -2514,9 +2524,9 @@ Noreen "Bad News"ULR (Fekete) Noreen "Bad News" ULR (Preto) ノレーン "バッド ニュース" ULR (ブラック) - Noreen "Bad News" ULR (검정) + 노린 "배드뉴스" ULR (검정) 諾琳"壞消息"極距狙擊步槍 (黑色) - 诺琳"坏消息"极距狙击步枪 (黑色) + 诺琳 "坏消息" 极距狙击步枪(黑色) Noreen "Bad News" ULR (Siyah) @@ -2531,9 +2541,9 @@ Noreen "Bad News"ULR (Terepmintás) Noreen "Bad News" ULR (Camuflagem) ノレーン "バッド ニュース" ULR (カモフラージュ) - Noreen "Bad News" ULR (위장) + 노린 "배드뉴스" ULR (위장) 諾琳"壞消息"極距狙擊步槍 (迷彩) - 诺琳"坏消息"极距狙击步枪 (迷彩) + 诺琳 "坏消息" 极距狙击步枪(迷彩) Noreen "Bad News" ULR (Kamufulaj) @@ -2548,9 +2558,9 @@ Noreen "Bad News"ULR (Homok) Noreen "Bad News" ULR (Deserto) ノレーン "バッド ニュース" ULR (砂地) - Noreen "Bad News" ULR (모래) + 노린 "배드뉴스" ULR (모래) 諾琳"壞消息"極距狙擊步槍 (沙色) - 诺琳"坏消息"极距狙击步枪 (沙色) + 诺琳 "坏消息" 极距狙击步枪(沙色) Noreen "Bad News" ULR (Çöl) @@ -2567,7 +2577,7 @@ SIG 556 SIG 556 SIG 556精準步槍 - SIG 556精准步枪 + SIG 556 SIG 556 @@ -2584,7 +2594,7 @@ SIG 556 (ブラック) SIG 556 (검정) SIG 556精準步槍 (黑色) - SIG 556精准步枪 (黑色) + SIG 556(黑色) SIG 556 (Siyah) @@ -2601,7 +2611,7 @@ SIG 556 (カーキ) SIG 556 (카키) SIG 556精準步槍 (卡其色) - SIG 556精准步枪 (卡其色) + SIG 556(卡其色) SIG 556 (Haki) @@ -2618,7 +2628,7 @@ SIG 556 (サンド) SIG 556 (모래) SIG 556精準步槍 (沙色) - SIG 556精准步枪 (沙色) + SIG 556(沙色) SIG 556 (Kum) @@ -2635,7 +2645,7 @@ SIG 556 (カモフラージュ) SIG 556 (위장) SIG 556精準步槍 (迷彩) - SIG 556精准步枪 (迷彩) + SIG 556(迷彩) SIG 556 (Kamufulaj) @@ -2652,7 +2662,7 @@ SIG 556 (森林) SIG 556 (우드랜드) SIG 556精準步槍 (森林迷彩) - SIG 556精准步枪 (森林迷彩) + SIG 556(森林迷彩) SIG 556 (Orman) @@ -2667,9 +2677,9 @@ ASP-1 Kir ASP-1 Kir ASP-1 キール - ASP-1 キール - ASP-1"基爾"消音狙擊步槍 - ASP-1"基尔"消音狙击步枪 + ASP-1 키르 + ASP-1 "基爾"消音狙擊步槍 + ASP-1 "基尔" ASP-1 Kir @@ -2684,9 +2694,9 @@ ASP-1 Kir (Fekete) ASP-1 Kir (Preto) ASP-1 キール (ブラック) - ASP-1 Kir (검정) - ASP-1"基爾"消音狙擊步槍 (黑色) - ASP-1"基尔"消音狙击步枪 (黑色) + ASP-1 키르 (검정) + ASP-1 "基爾"消音狙擊步槍 (黑色) + ASP-1 "基尔"(黑色) ASP-1 Kir (Siyah) @@ -2701,9 +2711,9 @@ ASP-1 Kir (Cserszín) ASP-1 Kir (Deserto) ASP-1 キール (タン) - ASP-1 Kir (황갈) - ASP-1"基爾"消音狙擊步槍 (黃褐色) - ASP-1"基尔"消音狙击步枪 (黄褐色) + ASP-1 키르 (황갈) + ASP-1 "基爾"消音狙擊步槍 (黃褐色) + ASP-1 "基尔"(沙色) ASP-1 Kir (Tan) @@ -2718,9 +2728,9 @@ Cyrus Cyrus サイラス - Cyrus + 사이러스 "居鲁士"狙擊步槍 - "居鲁士"狙击步枪 + "居鲁士" Cyrus @@ -2735,9 +2745,9 @@ Cyrus (Fekete) Cyrus (Preto) サイラス (ブラック) - Cyrus (검정) + 사이러스 (검정) "居鲁士"狙擊步槍 (黑色) - "居鲁士"狙击步枪 (黑色) + "居鲁士"(黑色) Cyrus (Siyah) @@ -2752,9 +2762,9 @@ Cyrus (Hex) Cyrus (Hex) サイラス (ヘックス) - Cyrus (육각) + 사이러스 (육각) "居鲁士"狙擊步槍 (數位蜂巢迷彩) - "居鲁士"狙击步枪 (数位蜂巢迷彩) + "居鲁士"(蜂巢迷彩) Cyrus (Hex) @@ -2769,9 +2779,9 @@ Cyrus (Cserszín) Cyrus (Deserto) サイラス (タン) - Cyrus (황갈) + 사이러스 (황갈) "居鲁士"狙擊步槍 (黃褐色) - "居鲁士"狙击步枪 (黄褐色) + "居鲁士"(沙色) Cyrus (Tan) @@ -2788,7 +2798,7 @@ M14 M14 M14精準步槍 - M14精准步枪 + M14 M14 @@ -2805,7 +2815,7 @@ M14 (カモフラージュ) M14 (위장) M14精準步槍 (迷彩) - M14精准步枪 (迷彩) + M14(迷彩) M14 (Kamufulaj) @@ -2822,7 +2832,7 @@ M14 (オリーブド ラブ) M14 (올리브) M14精準步槍 (橄欖色) - M14精准步枪 (橄榄色) + M14(橄榄色) M14 (Zeytin Yeşili) @@ -2839,7 +2849,7 @@ HK 121 HK121 HK121中型機槍 - HK121中型机枪 + HK121 HK121 @@ -2856,7 +2866,7 @@ HK 121 (ヘックス) HK121 (육각) HK121中型機槍 (數位蜂巢迷彩) - HK121中型机枪 (数位蜂巢迷彩) + HK121(蜂巢迷彩) HK121 (Hex) @@ -2873,7 +2883,7 @@ HK 121 (タン) HK121 (황갈) HK121機槍 (黃褐色) - HK121机枪 (黄褐色) + HK121(沙色) HK121 (Tan) @@ -2890,7 +2900,7 @@ LWMMG LWMMG 輕量化中型機槍 - 轻量化中型机枪 + LWMMG LWMMG @@ -2907,7 +2917,7 @@ LWMMG (マルチカモ) LWMMG (MTP) 輕量化中型機槍 (多地形迷彩) - 轻量化中型机枪 (多地形迷彩) + LWMMG(多地形迷彩) LWMMG (MTP) @@ -2924,7 +2934,7 @@ LWMMG (ブラック) LWMMG (검정) 輕量化中型機槍 (黑色) - 轻量化中型机枪 (黑色) + LWMMG(黑色) LWMMG (Siyah) @@ -2941,7 +2951,7 @@ LWMMG (サンド) LWMMG (모래) 輕量化中型機槍 (沙色) - 轻量化中型机枪 (沙色) + LWMMG(沙色) LWMMG (Kum) @@ -2956,7 +2966,7 @@ Jeep Wrangler Jeep Wrangler ジープ ラングラー - Jeep Wrangler + 지프 랭글러 "牧馬人"吉普車 "牧马人"吉普车 Jeep Wrangler @@ -2964,7 +2974,7 @@ Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) - "牧马人"吉普车(SPG-9火箭筒) + "牧马人"吉普车(SPG-9火箭筒) "牧馬人"吉普車 (SPG-9火箭筒) ジープ ラングラー (SPG-9) Jeep Wrangler (SPG-9) @@ -2975,11 +2985,12 @@ Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) + 지프 랭글러 (SPG-9) Jeep Wrangler (LMG) Jeep Wrangler (LMG) - "牧马人"吉普车(轻机枪) + "牧马人"吉普车(轻机枪) "牧馬人"吉普車 (輕機槍) ジープ ラングラー (LMG) Jeep Wrangler (LMG) @@ -2990,6 +3001,7 @@ Jeep Wrangler (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) + 지프 랭글러 (경기관총) Cessna TTx @@ -3003,9 +3015,9 @@ Cessna TTx Cessna TTx セスナ TTx - Cessna TTx + 세스나 TTx "賽斯納"TTx單引擎飛機 - "赛斯纳"TTx单引擎飞机 + "赛斯纳"TTx 单引擎飞机 Cessna TTx @@ -3020,9 +3032,9 @@ Cessna TTx (Racing) Cessna TTx (Racing) セスナ TTx (レース仕様) - Cessna TTx (경주용) + 세스나 TTx (경주용) "賽斯納"TTx單引擎飛機 (競速) - "赛斯纳"TTx单引擎飞机 (竞速) + "赛斯纳"TTx 单引擎飞机(竞速) Cessna TTx (Racing) @@ -3036,10 +3048,10 @@ Burraq UCAV Burraq UCAV Burraq UCAV - ブラーク UCAV - Burraq UCAV + ブラク UCAV + 부라크 UCAV "柏拉格"空中無人戰鬥載具 - "柏拉格"空中无人战斗载具 + "柏拉格" 战斗无人机 Burraq UCAV @@ -3056,7 +3068,7 @@ QBZ-95-1 (ブラック) QBZ-95-1 (검정) QBZ-95-1式自動步槍 (黑色) - QBZ-95-1式自动步枪 (黑色) + 95-1式自动步枪(黑色) QBZ-95-1 (Siyah) @@ -3073,7 +3085,7 @@ QBZ-95-1 (緑ヘックス) QBZ-95-1 (초록육각) QBZ-95-1式自動步槍 (綠色數位蜂巢迷彩) - QBZ-95-1式自动步枪 (绿色数位蜂巢迷彩) + 95-1式自动步枪(绿色蜂巢迷彩) QBZ-95-1 (Yeşil Hex) @@ -3090,7 +3102,7 @@ QBZ-95-1 (ヘックス) QBZ-95-1 (육각) QBZ-95-1式自動步槍 (數位蜂巢迷彩) - QBZ-95-1式自动步枪 (数位蜂巢迷彩) + 95-1式自动步枪(蜂巢迷彩) QBZ-95-1 (Hex) @@ -3106,8 +3118,8 @@ QBZ-95-1 GL (Preto) QBZ-95-1 GL (ブラック) QBZ-95-1 GL (검정) - QBZ-95-1式自動步槍 (榴彈-黑色) - QBZ-95-1式自动步枪 (榴弹-黑色) + QBZ-95-1式自動步槍 (榴彈—黑色) + 95-1式自动步枪 10A式榴弹(黑色) QBZ-95-1 GL (Siyah) @@ -3123,8 +3135,8 @@ QBZ-95-1 GL (Hex Verde) QBZ-95-1 GL (緑ヘックス) QBZ-95-1 GL (초록육각) - QBZ-95-1式自動步槍 (榴彈-綠色數位蜂巢迷彩) - QBZ-95-1式自动步枪 (榴弹-绿色数位蜂巢迷彩) + QBZ-95-1式自動步槍 (榴彈—綠色數位蜂巢迷彩) + 95-1式自动步枪 10A式榴弹(绿色蜂巢迷彩) QBZ-95-1 GL (Yeşil Hex) @@ -3140,8 +3152,8 @@ QBZ-95-1 GL (Hex) QBZ-95-1 GL (ヘックス) QBZ-95-1 GL (육각) - QBZ-95-1式自動步槍 (榴彈-數位蜂巢迷彩) - QBZ-95-1式自动步枪 (榴弹-数位蜂巢迷彩) + QBZ-95-1式自動步槍 (榴彈—數位蜂巢迷彩) + 95-1式自动步枪 10A式榴弹(蜂巢迷彩) QBZ-95-1 GL (Hex) @@ -3158,7 +3170,7 @@ QBZ-95-1 LSW (ブラック) QBZ-95-1 LSW (검정) QBZ-95-1式輕機槍 (黑色) - QBZ-95-1式轻机枪 (黑色) + 95-1式班用机枪(黑色) QBZ-95-1 LSW (Siyah) @@ -3175,7 +3187,7 @@ QBZ-95-1 LSW (緑ヘックス) QBZ-95-1 LSW (초록육각) QBZ-95-1式輕機槍 (綠色數位蜂巢迷彩) - QBZ-95-1式轻机枪 (绿色数位蜂巢迷彩) + 95-1式班用机枪(绿色蜂巢迷彩) QBZ-95-1 LSW (Yeşil Hex) @@ -3192,7 +3204,7 @@ QBZ-95-1 LSW (ヘックス) QBZ-95-1 LSW (육각) QBZ-95-1式輕機槍 (數位蜂巢迷彩) - QBZ-95-1式轻机枪 (数位蜂巢迷彩) + 95-1式班用机枪(蜂巢迷彩) QBZ-95-1 LSW (Hex) @@ -3209,7 +3221,7 @@ QBU-88 (ブラック) QBU-88 (검정) QBU-88式狙擊步槍 (黑色) - QBU-88式狙击步枪 (黑色) + 88式狙击步枪(黑色) QBU-88 (Siyah) @@ -3226,7 +3238,7 @@ QBU-88 (緑ヘックス) QBU-88 (초록육각) QBU-88式狙擊步槍 (綠色數位蜂巢迷彩) - QBU-88式狙击步枪 (绿色数位蜂巢迷彩) + 88式狙击步枪(绿色蜂巢迷彩) QBU-88 (Yeşil Hex) @@ -3243,7 +3255,7 @@ QBU-88 (ヘックス) QBU-88 (육각) QBU-88式狙擊步槍 (數位蜂巢迷彩) - QBU-88式狙击步枪 (数位蜂巢迷彩) + 88式狙击步枪(蜂巢迷彩) QBU-88 (Hex) @@ -3258,9 +3270,9 @@ GM6 Lynx (Zöld Hex) GM6 Lynx (Hex Verde) GM6 リンクス (緑ヘックス) - GM6 Lynx (초록육각) - GM6"天貓"反器材狙擊步槍 (綠色數位蜂巢迷彩) - GM6"天猫"反器材狙击步枪 (绿色数位蜂巢迷彩) + GM6 링스 (초록육각) + GM6 "天貓"反器材狙擊步槍 (綠色數位蜂巢迷彩) + GM6 "猞猁"(绿色蜂巢迷彩) GM6 Lynx (Yeşil Hex) @@ -3275,9 +3287,9 @@ FN Minimi SPW FN Minimi SPW FN ミニミ SPW - FN Minimi SPW + FN 미니미 SPW FN Minimi班用自動機槍 - FN Minimi班用自动机枪 + FN Minimi 班用自动机枪 FN Minimi SPW @@ -3292,9 +3304,9 @@ M200 Intervention (Trópico) M200 Intervention (Tropico) M200 インターベンション (熱帯) - M200 Intervention (열대) + M200 인터벤션 (열대) M200干預型狙擊步槍 (熱帶迷彩) - M200干预型狙击步枪 (热带迷彩) + M200 "干预"(热带迷彩) M200 Intervention (Tropic) @@ -3311,212 +3323,212 @@ MP5K MP5K MP5K衝鋒槍 - MP5K冲锋枪 + MP5K MP5K - HK416A5 11" (Black) - HK416A5 11" (Černá) - HK416A5 11" (Noir) - HK416A5 11" (Negro) - HK416A5 11" (Чёрный) - HK416A5 11" (czarny) - HK416A5 11" (Schwarz) - HK416A5 11" (Nero) - HK416A5 11" (Fekete) - HK416A5 11" (Preto) - HK416A5 11" (ブラック) - HK416A5 11" (검정) - HK416A5 11"突擊步槍 (黑色) - HK416A5 11"突击步枪 (黑色) - HK416A5 11" (Siyah) + HK416A5 11 " (Black) + HK416A5 11 " (Černá) + HK416A5 11 " (Noir) + HK416A5 11 " (Negro) + HK416A5 11 " (Чёрный) + HK416A5 11 " (czarny) + HK416A5 11 " (Schwarz) + HK416A5 11 " (Nero) + HK416A5 11 " (Fekete) + HK416A5 11 " (Preto) + HK416A5 11 " (ブラック) + HK416A5 11 " (검정) + HK416A5 11 "突擊步槍 (黑色) + HK416A5 11英寸(黑色) + HK416A5 11 " (Siyah) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Kaki) - HK416A5 11" (Caqui) - HK416A5 11" (Хаки) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Khaki) - HK416A5 11" (Caqui) - HK416A5 11" (カーキ) - HK416A5 11" (카키) - HK416A5 11"突擊步槍 (卡其色) - HK416A5 11"突击步枪 (卡其色) - HK416A5 11" (Haki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Kaki) + HK416A5 11 " (Caqui) + HK416A5 11 " (Хаки) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Khaki) + HK416A5 11 " (Caqui) + HK416A5 11 " (カーキ) + HK416A5 11 " (카키) + HK416A5 11 "突擊步槍 (卡其色) + HK416A5 11英寸(卡其色) + HK416A5 11 " (Haki) - HK416A5 11" (Sand) - HK416A5 11" (Písková) - HK416A5 11" (Beige) - HK416A5 11" (Arena) - HK416A5 11" (Песочный) - HK416A5 11" (sandfarben) - HK416A5 11" (piaskowy) - HK416A5 11" (Sabbia) - HK416A5 11" (Homok) - HK416A5 11" (Deserto) - HK416A5 11" (サンド) - HK416A5 11" (모래) - HK416A5 11"突擊步槍 (沙色) - HK416A5 11"突击步枪 (沙色) - HK416A5 11" (Kum) + HK416A5 11 " (Sand) + HK416A5 11 " (Písková) + HK416A5 11 " (Beige) + HK416A5 11 " (Arena) + HK416A5 11 " (Песочный) + HK416A5 11 " (sandfarben) + HK416A5 11 " (piaskowy) + HK416A5 11 " (Sabbia) + HK416A5 11 " (Homok) + HK416A5 11 " (Deserto) + HK416A5 11 " (サンド) + HK416A5 11 " (모래) + HK416A5 11 "突擊步槍 (沙色) + HK416A5 11英寸(沙色) + HK416A5 11 " (Kum) - HK416A5 11" GL (Black) - HK416A5 11" GL (Černá) - HK416A5 11" GL (Noir) - HK416A5 11" GL (Negro) - HK416A5 11" GL (Чёрный) - HK416A5 11" GL (czarny) - HK416A5 11" GL (Schwarz) - HK416A5 11" GL (Nero) - HK416A5 11" GL (Fekete) - HK416A5 11" GL (Preto) - HK416A5 11" GL (ブラック) - HK416A5 11" GL (검정) - HK416A5 11"突擊步槍 (榴彈-黑色) - HK416A5 11"突击步枪 (榴弹-黑色) - HK416A5 11" GL (Siyah) + HK416A5 11 " GL (Black) + HK416A5 11 " GL (Černá) + HK416A5 11 " GL (Noir) + HK416A5 11 " GL (Negro) + HK416A5 11 " GL (Чёрный) + HK416A5 11 " GL (czarny) + HK416A5 11 " GL (Schwarz) + HK416A5 11 " GL (Nero) + HK416A5 11 " GL (Fekete) + HK416A5 11 " GL (Preto) + HK416A5 11 " GL (ブラック) + HK416A5 11 " GL (검정) + HK416A5 11 "突擊步槍 (榴彈—黑色) + HK416A5 11英寸 GLM(黑色) + HK416A5 11 " GL (Siyah) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Kaki) - HK416A5 11" GL (Caqui) - HK416A5 11" GL (Хаки) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Khaki) - HK416A5 11" GL (Caqui) - HK416A5 11" GL (カーキ) - HK416A5 11" GL (카키) - HK416A5 11"突擊步槍 (榴彈-卡其色) - HK416A5 11"突击步枪 (榴弹-卡其色) - HK416A5 11" GL (Hakii) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Kaki) + HK416A5 11 " GL (Caqui) + HK416A5 11 " GL (Хаки) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Khaki) + HK416A5 11 " GL (Caqui) + HK416A5 11 " GL (カーキ) + HK416A5 11 " GL (카키) + HK416A5 11 "突擊步槍 (榴彈—卡其色) + HK416A5 11英寸 GLM(卡其色) + HK416A5 11 " GL (Hakii) - HK416A5 11" GL (Sand) - HK416A5 11" GL (Písková) - HK416A5 11" GL (Beige) - HK416A5 11" GL (Arena) - HK416A5 11" GL (Песочный) - HK416A5 11" GL (sandfarben) - HK416A5 11" GL (piaskowy) - HK416A5 11" GL (Sabbia) - HK416A5 11" GL (Homok) - HK416A5 11" GL (Deserto) - HK416A5 11" GL (サンド) - HK416A5 11" GL (모래) - HK416A5 11"突擊步槍 (榴彈-沙色) - HK416A5 11"突击步枪 (榴弹-沙色) - HK416A5 11" GL (Çöl) + HK416A5 11 " GL (Sand) + HK416A5 11 " GL (Písková) + HK416A5 11 " GL (Beige) + HK416A5 11 " GL (Arena) + HK416A5 11 " GL (Песочный) + HK416A5 11 " GL (sandfarben) + HK416A5 11 " GL (piaskowy) + HK416A5 11 " GL (Sabbia) + HK416A5 11 " GL (Homok) + HK416A5 11 " GL (Deserto) + HK416A5 11 " GL (サンド) + HK416A5 11 " GL (모래) + HK416A5 11 "突擊步槍 (榴彈—沙色) + HK416A5 11英寸 GLM(沙色) + HK416A5 11 " GL (Çöl) - HK416A5 14.5" (Black) - HK416A5 14.5" (Černá) - HK416A5 14.5" (Noir) - HK416A5 14.5" (Negro) - HK416A5 14.5" (Чёрный) - HK416A5 14.5" (czarny) - HK416A5 14.5" (Schwarz) - HK416A5 14.5" (Nero) - HK416A5 14.5" (Fekete) - HK416A5 14.5" (Preto) - HK416A5 14.5" (ブラック) - HK416A5 14.5" (검정) - HK416A5 14.5"突擊步槍 (黑色) - HK416A5 14.5"突击步枪 (黑色) - HK416A5 14.5" (Siyah) + HK416A5 14.5 " (Black) + HK416A5 14.5 " (Černá) + HK416A5 14.5 " (Noir) + HK416A5 14.5 " (Negro) + HK416A5 14.5 " (Чёрный) + HK416A5 14.5 " (czarny) + HK416A5 14.5 " (Schwarz) + HK416A5 14.5 " (Nero) + HK416A5 14.5 " (Fekete) + HK416A5 14.5 " (Preto) + HK416A5 14.5 " (ブラック) + HK416A5 14.5 " (검정) + HK416A5 14.5 "突擊步槍 (黑色) + HK416A5 14.5英寸(黑色) + HK416A5 14.5 " (Siyah) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Kaki) - HK416A5 14.5" (Caqui) - HK416A5 14.5" (Хаки) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Khaki) - HK416A5 14.5" (Caqui) - HK416A5 14.5" (カーキ) - HK416A5 14.5" (카키) - HK416A5 14.5"突擊步槍 (卡其色) - HK416A5 14.5"突击步枪 (卡其色) - HK416A5 14.5" (Haki) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Kaki) + HK416A5 14.5 " (Caqui) + HK416A5 14.5 " (Хаки) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Khaki) + HK416A5 14.5 " (Caqui) + HK416A5 14.5 " (カーキ) + HK416A5 14.5 " (카키) + HK416A5 14.5 "突擊步槍 (卡其色) + HK416A5 14.5英寸(卡其色) + HK416A5 14.5 " (Haki) - HK416A5 14.5" (Sand) - HK416A5 14.5" (Písková) - HK416A5 14.5" (Beige) - HK416A5 14.5" (Arena) - HK416A5 14.5" (Песочный) - HK416A5 14.5" (sandfarben) - HK416A5 14.5" (piaskowy) - HK416A5 14.5" (Sabbia) - HK416A5 14.5" (Homok) - HK416A5 14.5" (Deserto) - HK416A5 14.5" (サンド) - HK416A5 14.5" (모래) - HK416A5 14.5"突擊步槍 (沙色) - HK416A5 14.5"突击步枪 (沙色) - HK416A5 14.5" (Kum) + HK416A5 14.5 " (Sand) + HK416A5 14.5 " (Písková) + HK416A5 14.5 " (Beige) + HK416A5 14.5 " (Arena) + HK416A5 14.5 " (Песочный) + HK416A5 14.5 " (sandfarben) + HK416A5 14.5 " (piaskowy) + HK416A5 14.5 " (Sabbia) + HK416A5 14.5 " (Homok) + HK416A5 14.5 " (Deserto) + HK416A5 14.5 " (サンド) + HK416A5 14.5 " (모래) + HK416A5 14.5 "突擊步槍 (沙色) + HK416A5 14.5英寸(沙色) + HK416A5 14.5 " (Kum) - HK417A2 20" (Black) - HK417A2 20" (Černá) - HK417A2 20" (Noir) - HK417A2 20" (Negro) - HK417A2 20" (Чёрный) - HK417A2 20" (czarny) - HK417A2 20" (Schwarz) - HK417A2 20" (Nero) - HK417A2 20" (Fekete) - HK417A2 20" (Preto) - HK417A2 20" (ブラック) - HK417A2 20" (검정) - HK417A2 20"突擊步槍 (黑色) - HK417A2 20"突击步枪 (黑色) - HK417A2 20" (Siyah) + HK417A2 20 " (Black) + HK417A2 20 " (Černá) + HK417A2 20 " (Noir) + HK417A2 20 " (Negro) + HK417A2 20 " (Чёрный) + HK417A2 20 " (czarny) + HK417A2 20 " (Schwarz) + HK417A2 20 " (Nero) + HK417A2 20 " (Fekete) + HK417A2 20 " (Preto) + HK417A2 20 " (ブラック) + HK417A2 20 " (검정) + HK417A2 20 "突擊步槍 (黑色) + HK417A2 20英寸(黑色) + HK417A2 20 " (Siyah) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Kaki) - HK417A2 20" (Caqui) - HK417A2 20" (Хаки) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Khaki) - HK417A2 20" (Caqui) - HK417A2 20" (カーキ) - HK417A2 20" (카키) - HK417A2 20"突擊步槍 (卡其色) - HK417A2 20"突击步枪 (卡其色) - HK417A2 20" (Haki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Kaki) + HK417A2 20 " (Caqui) + HK417A2 20 " (Хаки) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Khaki) + HK417A2 20 " (Caqui) + HK417A2 20 " (カーキ) + HK417A2 20 " (카키) + HK417A2 20 "突擊步槍 (卡其色) + HK417A2 20英寸(卡其色) + HK417A2 20 " (Haki) - HK417A2 20" (Sand) - HK417A2 20" (Písková) - HK417A2 20" (Beige) - HK417A2 20" (Arena) - HK417A2 20" (Песочный) - HK417A2 20" (sandfarben) - HK417A2 20" (piaskowy) - HK417A2 20" (Sabbia) - HK417A2 20" (Homok) - HK417A2 20" (Deserto) - HK417A2 20" (サンド) - HK417A2 20" (모래) - HK417A2 20"突擊步槍 (沙色) - HK417A2 20"突击步枪 (沙色) - HK417A2 20" (Kum) + HK417A2 20 " (Sand) + HK417A2 20 " (Písková) + HK417A2 20 " (Beige) + HK417A2 20 " (Arena) + HK417A2 20 " (Песочный) + HK417A2 20 " (sandfarben) + HK417A2 20 " (piaskowy) + HK417A2 20 " (Sabbia) + HK417A2 20 " (Homok) + HK417A2 20 " (Deserto) + HK417A2 20 " (サンド) + HK417A2 20 " (모래) + HK417A2 20 "突擊步槍 (沙色) + HK417A2 20英寸(沙色) + HK417A2 20 " (Kum) RPG-32 (Green Hex) @@ -3532,7 +3544,7 @@ RPG-32 (緑ヘックス) RPG-32 (초록육각) RPG-32火箭發射器 (綠色數位蜂巢迷彩) - RPG-32火箭发射器 (绿色数位蜂巢迷彩) + RPG-32(绿色蜂巢迷彩) RPG-32 (Yeşil Hex) @@ -3549,7 +3561,7 @@ P99 (カーキ) P99 (카키) P99半自動手槍 (卡其色) - P99半自动手枪 (卡其色) + P99(卡其色) P99 (Haki) @@ -3566,7 +3578,7 @@ P99 (ブラック) P99 (검정) P99半自動手槍 (黑色) - P99半自动手枪 (黑色) + P99(黑色) P99 (Siyah) @@ -3581,9 +3593,9 @@ Makarov PM Makarov PM マカロフ PM - Makarov PM + 마카로프 PM "馬卡洛夫"手槍 - "马卡洛夫"手枪 + "马卡洛夫" Makarov PM @@ -3591,7 +3603,7 @@ Polaris DAGOR (XM312) ポラリス DAGOR (XM312) "北極星"先進佈署越野車 (XM312重機槍) - "北极星"先进布署越野车 (XM312重机枪) + "北极星"(XM312) Polaris DAGOR (XM312) Polaris DAGOR (XM312) Polaris DAGOR (XM312) @@ -3600,11 +3612,12 @@ Polaris DAGOR (XM312) Polaris DAGOR (XM312) Polaris DAGOR (XM312) + 폴라리스 DAGOR (XM312) Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (Mini-Spike PzAbw) - "北极星"先进布署越野车("迷你长钉"反坦克导弹发射器) + "北极星"("迷你长钉"反坦) "北極星"先進佈署越野車("迷你長釘"反坦克導彈發射器) Polaris DAGOR (Mini-Spike AT) ポラリス DAGOR (ミニスパイク対戦) @@ -3615,13 +3628,14 @@ Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (Mini-Spike AT) + 폴라리스 DAGOR (스파이크 미사일 대전차) Polaris DAGOR Polaris DAGOR ポラリス DAGOR "北極星"先進佈署越野車 - "北极星"先进布署越野车 + "北极星" Polaris DAGOR Polaris DAGOR Polaris DAGOR @@ -3630,13 +3644,14 @@ Polaris DAGOR Polaris DAGOR Polaris DAGOR + 폴라리스 DAGOR Polaris DAGOR (light) Polaris DAGOR (leicht) ポラリス DAGOR (軽) "北極星"先進佈署越野車 (輕型) - "北极星"先进布署越野车 (轻型) + "北极星"(轻型) Polaris DAGOR (leggero) Polaris DAGOR (light) Polaris DAGOR (легкий) @@ -3645,12 +3660,13 @@ Polaris DAGOR (lehký) Polaris DAGOR (light) Polaris DAGOR (ligero) + 폴라리스 DAGOR (경량) LSV Mk. II (M134) LSV Mk. II (M134) 輕型突擊車2式 (M134迷你機炮) - 轻型突击车2式 (M134迷你机炮) + 轻型突击车二型(M134) LSV Mk. II (M134) LSV Mk. II (M134) LSV Mk. II (M134) @@ -3660,11 +3676,12 @@ LSV Mk. II (M134) LSV Mk. II (M134) LSV Mk. II (M134) + LSV Mk. II (M134) LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) - 轻型突击车2式 ("麦士蒂索人"-M型反坦克导弹) + 轻型突击车二型("麦士蒂索"-M) 輕型突擊車2式 ("麥士蒂索人"-M型反坦克導彈) LSV Mk. II (メチス-M) LSV Mk. II (Metis-M) @@ -3675,12 +3692,13 @@ LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) LSV Mk. II (Metis-M) + LSV Mk. II (메티스-M) LSV Mk. II LSV Mk. II 輕型突擊車2式 - 轻型突击车2式 + 轻型突击车二型 LSV Mk. II LSV Mk. II LSV Mk. II @@ -3690,11 +3708,12 @@ LSV Mk. II LSV Mk. II LSV Mk. II + LSV Mk. II Rooikat 120 Rooikat 120 - "狞猫"120主炮轮式装甲车 + "狞猫" 120 "獰貓"120主炮輪式裝甲車 ルーイカット 120 Rooikat 120 @@ -3705,11 +3724,12 @@ Rooikat 120 Rooikat 120 Rooikat 120 + 루이캇트 120 Rooikat 120 UP Rooikat 120 UP - "狞猫"120主炮轮式装甲车 (城市版) + "狞猫" 120 城市版 "獰貓"120主炮輪式裝甲車 (城市版) ルーイカット 120 UP Rooikat 120 UP @@ -3720,13 +3740,14 @@ Rooikat 120 UP Rooikat 120 UP Rooikat 120 UP + 루이캇트 120 시가전형 T-14 Armata T-14 Armata Т-14 Армата - T-14"阿玛塔"主战坦克 - T-14"阿瑪塔"主戰坦克 + T-14 "阿玛塔" + T-14 "阿瑪塔"主戰坦克 T-14 アルマータ T-14 Armata T-14 Armata @@ -3735,12 +3756,13 @@ T-14 Armata T-14 Armata T-14 Armata + T-14 아르마타 T-14K Armata T-14K Armata Т-14К Армата - T-14K"阿玛塔"主战坦克 + T-14K "阿玛塔" T-14K"阿瑪塔"主戰坦克 T-14K アルマータ T-14K Armata @@ -3750,11 +3772,12 @@ T-14K Armata T-14K Armata T-14K Armata + T-14K 아르마타 Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (LeFlaSys) - "鼬鼠"2装甲车 (防空) + "鼬鼠"2(防空) "鼬鼠"2裝甲車 (防空) ウィーゼル 2 オゼロット (対空) Wiesel 2 Ozelot (AA) @@ -3765,11 +3788,12 @@ Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) Wiesel 2 Ozelot (AA) + 비젤 2 오셀롯 (대공) Wiesel 2 (ATGM) Wiesel 2 (PzAbw) - "鼬鼠"2装甲车 (反坦导弹) + "鼬鼠"2(反坦) "鼬鼠"2裝甲車 (反坦導彈) ウィーゼル 2 (ATGM) Wiesel 2 (ATGM) @@ -3780,11 +3804,12 @@ Wiesel 2 (ATGM) Wiesel 2 (ATGM) Wiesel 2 (ATGM) + 비젤 2 (대전차유도) Wiesel 2 (MK20) Wiesel 2 (MK20) - "鼬鼠"2装甲车 (MK20机炮) + "鼬鼠"2(MK20) "鼬鼠"2裝甲車 (MK20機炮) ウィーゼル 2 (MK20) Wiesel 2 (MK20) @@ -3795,13 +3820,14 @@ Wiesel 2 (MK20) Wiesel 2 (MK20) Wiesel 2 (MK20) + 비젤 2 (MK20) Wiesel 2 RFCV (Radar) Wiesel 2 AFF (Radar) - "鼬鼠"2装甲车 (雷达) + "鼬鼠"2(雷达) "鼬鼠"2裝甲車 (雷達) - ウィーゼル 2 (レーダー) + ウィーゼル 2 RFCV (レーダー) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Радар) @@ -3810,6 +3836,7 @@ Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) Wiesel 2 RFCV (Radar) + 비젤 2 RFCV (레이더) Leupold Mark 4 HAMR @@ -3825,12 +3852,13 @@ Leupold Mark 4 HAMR Leupold Mark 4 HAMR Leupold Mark 4 HAMR + 류폴드 마크 4 HAMR Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (卡其色) - Leupold Mark 4 HAMR (卡其色) + Leupold Mark 4 HAMR(卡其色) Leupold Mark 4 HAMR (カーキ) Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Khaki) @@ -3840,12 +3868,13 @@ Leupold Mark 4 HAMR (Khaki) Leupold Mark 4 HAMR (Haki) Leupold Mark 4 HAMR (Caqui) + 류폴드 마크 4 HAMR (카키) Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) - Leupold Mark 4 HAMR (2D) + Leupold Mark 4 HAMR(2D) Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) @@ -3855,12 +3884,13 @@ Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) Leupold Mark 4 HAMR (2D) + 류폴드 마크 4 HAMR (2D) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) - Leupold Mark 4 HAMR (PIP) + Leupold Mark 4 HAMR(画中画) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) @@ -3870,12 +3900,13 @@ Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) Leupold Mark 4 HAMR (PIP) + 류폴드 마크 4 HAMR (PIP) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Beige) ELCAN SpecterOS (黃褐色) - ELCAN SpecterOS (黄褐色) + ELCAN SpecterOS(沙色) ELCAN SpecterOS (タン) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Tan) @@ -3885,12 +3916,13 @@ ELCAN SpecterOS (Žlutohnědá) ELCAN SpecterOS (Tan) ELCAN SpecterOS (Tan) + 엘칸 스펙터OS (황갈) ELCAN SpecterOS (Black) ELCAN SpecterOS (Schwarz) ELCAN SpecterOS (黑色) - ELCAN SpecterOS (黑色) + ELCAN SpecterOS(黑色) ELCAN SpecterOS (ブラック) ELCAN SpecterOS (Nero) ELCAN SpecterOS (Czarny) @@ -3900,11 +3932,12 @@ ELCAN SpecterOS (Černá) ELCAN SpecterOS (Siyah) ELCAN SpecterOS (Negra) + 엘칸 스펙터OS (검정) ELCAN SpecterOS (Green Hex) ELCAN SpecterOS (綠色數位蜂巢迷彩) - ELCAN SpecterOS (绿色数位蜂巢迷彩) + ELCAN SpecterOS(绿色蜂巢迷彩) ELCAN SpecterOS (緑ヘックス) ELCAN SpecterOS (Verde Hex) ELCAN SpecterOS (Zielony Hex) @@ -3915,12 +3948,13 @@ ELCAN SpecterOS (Yeşil Hex) ELCAN SpecterOS (Verde Hex) ELCAN SpecterOS (Hex Grün) + 엘칸 스펙터OS (초록육각) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) - ELCAN SpecterOS (2D) + ELCAN SpecterOS(2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) @@ -3930,12 +3964,13 @@ ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) ELCAN SpecterOS (2D) + 엘칸 스펙터OS (2D) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) - ELCAN SpecterOS (PIP) + ELCAN SpecterOS(画中画) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) @@ -3945,6 +3980,7 @@ ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) ELCAN SpecterOS (PIP) + 엘칸 스펙터OS (PIP) ELCAN SpecterOS (Lush) @@ -3952,6 +3988,8 @@ ELCAN SpecterOS (Forêt) ELCAN SpecterOS (緑地) ELCAN SpecterOS (Grün) + ELCAN SpecterOS(繁茂) + 엘칸 스펙터OS (초목) ELCAN SpecterOS (Arid) @@ -3959,6 +3997,8 @@ ELCAN SpecterOS (Désert) ELCAN SpecterOS (乾燥地帯) ELCAN SpecterOS (Trocken) + ELCAN SpecterOS(干旱) + 엘칸 스펙터OS (건조) ELCAN SpecterOS 7.62 (Black) @@ -3966,6 +4006,8 @@ ELCAN SpecterOS 7.62 (Noire) ELCAN SpecterOS 7.62 (ブラック) ELCAN SpecterOS 7.62 (Schwarz) + ELCAN SpecterOS 7.62(黑色) + 엘칸 스펙터OS 7.62 (검정) ELCAN SpecterOS 7.62 (Lush) @@ -3973,6 +4015,8 @@ ELCAN SpecterOS 7.62 (Forêt) ELCAN SpecterOS 7.62 (緑地) ELCAN SpecterOS 7.62 (Grün) + ELCAN SpecterOS 7.62(繁茂) + 엘칸 스펙터OS 7.62 (초목) ELCAN SpecterOS 7.62 (Arid) @@ -3980,12 +4024,14 @@ ELCAN SpecterOS 7.62 (Désert) ELCAN SpecterOS 7.62 (乾燥地帯) ELCAN SpecterOS 7.62 (Trocken) + ELCAN SpecterOS 7.62(干旱) + 엘칸 스펙터OS 7.62 (건조) SIG BRAVO4 / ROMEO3 (Black) SIG BRAVO4 / ROMEO3 (Schwarz) SIG BRAVO4 / ROMEO3 (黑色) - SIG BRAVO4 / ROMEO3 (黑色) + SIG BRAVO4 / ROMEO3(黑色) SIG BRAVO4 / ROMEO3 (ブラック) SIG BRAVO4 / ROMEO3 (Nero) SIG BRAVO4 / ROMEO3 (Czarny) @@ -3995,12 +4041,13 @@ SIG BRAVO4 / ROMEO3 (Černá) SIG BRAVO4 / ROMEO3 (Siyah) SIG BRAVO4 / ROMEO3 (Negra) + 시그 브라보4 / 로미오3 (검정) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (卡其色) - SIG BRAVO4 / ROMEO3 (卡其色) + SIG BRAVO4 / ROMEO3(卡其色) SIG BRAVO4 / ROMEO3 (カーキ) SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Khaki) @@ -4010,12 +4057,13 @@ SIG BRAVO4 / ROMEO3 (Khaki) SIG BRAVO4 / ROMEO3 (Haki) SIG BRAVO4 / ROMEO3 (Caqui) + 시그 브라보4 / 로미오3 (카키) SIG BRAVO4 / ROMEO3 (Sand) SIG BRAVO4 / ROMEO3 (Beige) SIG BRAVO4 / ROMEO3 (沙色) - SIG BRAVO4 / ROMEO3 (沙色) + SIG BRAVO4 / ROMEO3(沙色) SIG BRAVO4 / ROMEO3 (サンド) SIG BRAVO4 / ROMEO3 (Sabbia) SIG BRAVO4 / ROMEO3 (Piasek) @@ -4025,6 +4073,7 @@ SIG BRAVO4 / ROMEO3 (Písková) SIG BRAVO4 / ROMEO3 (Kum) SIG BRAVO4 / ROMEO3 (Arena) + 시그 브라보4 / 로미오3 (사막) Nightforce NXS @@ -4040,11 +4089,12 @@ Nightforce NXS Nightforce NXS Nightforce NXS + 나이트포스 NXS Nightforce NXS (Green Hex) Nightforce NXS (綠色數位蜂巢迷彩) - Nightforce NXS (绿色数位蜂巢迷彩) + Nightforce NXS(绿色蜂巢迷彩) Nightforce NXS (緑ヘックス) Nightforce NXS (Verde Hex) Nightforce NXS (Zielony Hex) @@ -4055,12 +4105,13 @@ Nightforce NXS (Yeşil Hex) Nightforce NXS (Verde Hex) Nightforce NXS (Hex Grün) + 나이트포스 NXS (초록육각) Nightforce NXS (Jungle) Nightforce NXS (Dschungel) Nightforce NXS (叢林色) - Nightforce NXS (丛林色) + Nightforce NXS(丛林色) Nightforce NXS (ジャングル) Nightforce NXS (Giungla) Nightforce NXS (Dżungla) @@ -4070,11 +4121,12 @@ Nightforce NXS (Džungle) Nightforce NXS (Orman) Nightforce NXS (Jungla) + 나이트포스 NXS (정글) Nightforce NXS (2D) Nightforce NXS (2D) - Nightforce NXS (2D) + Nightforce NXS(2D) Nightforce NXS (2D) Nightforce NXS (2D) Nightforce NXS (2D) @@ -4085,11 +4137,12 @@ Nightforce NXS (2D) Nightforce NXS (2D) Nightforce NXS (2D) + 나이트포스 NXS (2D) Nightforce NXS (PIP) Nightforce NXS (PIP) - Nightforce NXS (PIP) + Nightforce NXS(画中画) Nightforce NXS (PIP) Nightforce NXS (PIP) Nightforce NXS (PIP) @@ -4100,11 +4153,12 @@ Nightforce NXS (PIP) Nightforce NXS (PIP) Nightforce NXS (BIB) + 나이트포스 NXS (PIP) US Optics MR-10 (Black) US Optics MR-10 (Black) - US Optics MR-10 (Black) + US Optics MR-10(黑色) US Optics MR-10 (ブラック) US Optics MR-10 (Czarny) Ottica US MR-10 (nera) @@ -4115,11 +4169,12 @@ US Optics MR-10 (Siyah) US Optics MR-10 (Negra) US Optics MR-10 (Schwarz) + US 옵틱스 MR-10 (검정) US Optics MR-10 (Khaki) US Optics MR-10 (Khaki) - US Optics MR-10 (Khaki) + US Optics MR-10(卡其色) US Optics MR-10 (カーキ) US Optics MR-10 (Khaki) Ottica US MR-10 (cachi) @@ -4130,11 +4185,12 @@ US Optics MR-10 (Haki) US Optics MR-10 (Caqui) US Optics MR-10 (Khaki) + US 옵틱스 MR-10 (카키) US Optics MR-10 (Sand) US Optics MR-10 (Sand) - US Optics MR-10 (Sand) + US Optics MR-10(沙色) US Optics MR-10 (サンド) US Optics MR-10 (Piasek) Ottica US MR-10 (sabbia) @@ -4145,11 +4201,12 @@ US Optics MR-10 (Kum) US Optics MR-10 (Arena) US Optics MR-10 (Sand) + US 옵틱스 MR-10 (사막) KAHLES Helia (Black) KAHLES Helia (Black) - KAHLES Helia (Black) + KAHLES Helia(黑色) KAHLES ヘリア (ブラック) KAHLES Helia (Czarny) KAHLES Helia (nero) @@ -4160,11 +4217,12 @@ KAHLES Helia (Siyah) KAHLES Helia (Negra) KAHLES Helia (Schwarz) + 칼레스 헬리아 (검정) KAHLES Helia (Hex) KAHLES Helia (Hex) - KAHLES Helia (Hex) + KAHLES Helia(蜂巢迷彩) KAHLES ヘリア (ヘックス) KAHLES Helia (Hex) KAHLES Helia (esagonale) @@ -4175,11 +4233,12 @@ KAHLES Helia (Hex) KAHLES Helia (Hex) KAHLES Helia (Hex) + 칼레스 헬리아 (육각) KAHLES Helia (Old) KAHLES Helia (Old) - KAHLES Helia (Old) + KAHLES Helia(旧) KAHLES ヘリア (使い古し) KAHLES Helia (Stary) KAHLES Helia (vecchio) @@ -4190,11 +4249,12 @@ KAHLES Helia (Eski) KAHLES Helia (Vieja) KAHLES Helia (Alt) + 칼레스 헬리아 (낡음) KAHLES Helia (Tan) KAHLES Helia (Tan) - KAHLES Helia (Tan) + KAHLES Helia(沙色) KAHLES Helia (タン) KAHLES Helia (Tan) KAHLES Helia (marroncino) @@ -4205,6 +4265,7 @@ KAHLES Helia (Tan) KAHLES Helia (Tan) KAHLES Helia (Tan) + 칼레스 헬리아 (황갈) Burris XTR II @@ -4220,11 +4281,12 @@ Burris XTR II Burris XTR II Burris XTR II + 버리스 XTR II Burris XTR II (Green Hex) Burris XTR II (綠色數位蜂巢迷彩) - Burris XTR II (绿色数位蜂巢迷彩) + Burris XTR II(绿色蜂巢迷彩) Burris XTR II (緑ヘックス) Burris XTR II (Green Hex) Burris XTR II (Zielony Hex) @@ -4235,6 +4297,7 @@ Burris XTR II (Yeşil Hex) Burris XTR II (Verde Hex) Burris XTR II (Hex Grün) + 버리스 XTR II (초록육각) Burris XTR II (Old) @@ -4242,6 +4305,8 @@ Burris XTR II (Usée) Burris XTR II (使い古し) Burris XTR II (Alt) + Burris XTR II(陈旧) + 버리스 XTR II (낡음) Burris XTR II (ASP-1 Kir) @@ -4249,12 +4314,14 @@ Burris XTR II (ASP-1 Kir) Burris XTR II (ASP-1 Kir) Burris XTR II (ASP-1 Kir) + Burris XTR II(ASP-1 Kir) + 버리스 XTR II (ASP-1 키르) EOTech XPS3 (Tan) EOTech XPS3 (Beige) EOTech XPS3 (黃褐色) - EOTech XPS3 (黄褐色) + EOTech XPS3(沙色) EOTech XPS3 (タン) EOTech XPS3 (Tan) EOTech XPS3 (Tan) @@ -4264,12 +4331,13 @@ EOTech XPS3 (Žlutohnědá) EOTech XPS3 (Tan) EOTech XPS3 (Tan) + 이오텍 XPS3 (황갈) EOTech XPS3 (Black) EOTech XPS3 (Schwarz) EOTech XPS3 (黑色) - EOTech XPS3 (黑色) + EOTech XPS3(黑色) EOTech XPS3 (ブラック) EOTech XPS3 (Black) EOTech XPS3 (Czarny) @@ -4279,12 +4347,13 @@ EOTech XPS3 (Černá) EOTech XPS3 (Siyah) EOTech XPS3 (Negra) + 이오텍 XPS3 (검정) EOTech XPS3 (Khaki) EOTech XPS3 (Khaki) EOTech XPS3 (卡其色) - EOTech XPS3 (卡其色) + EOTech XPS3(卡其色) EOTech XPS3 (カーキ) EOTech XPS3 (Khaki) EOTech XPS3 (Khaki) @@ -4294,6 +4363,7 @@ EOTech XPS3 (Khaki) EOTech XPS3 (Haki) EOTech XPS3 (Caqui) + 이오텍 XPS3 (카키) EOTech XPS3 (Lush) @@ -4301,6 +4371,8 @@ EOTech XPS3 (Forêt) EOTech XPS3 (緑地) EOTech XPS3 (Grün) + EOTech XPS3(繁茂) + 이오텍 XPS3 (초목) EOTech XPS3 (Arid) @@ -4308,12 +4380,14 @@ EOTech XPS3 (Désert) EOTech XPS3 (乾燥地帯) EOTech XPS3 (Trocken) + EOTech XPS3(干旱) + 이오텍 XPS3 (건조) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Beige) EOTech XPS3 SMG (黃褐色) - EOTech XPS3 SMG (黄褐色) + EOTech XPS3(冲锋枪用,沙色) EOTech XPS3 SMG (タン) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Tan) @@ -4323,12 +4397,13 @@ EOTech XPS3 SMG (Žlutohnědá) EOTech XPS3 SMG (Tan) EOTech XPS3 SMG (Tan) + 이오텍 XPS3 SMG (황갈) EOTech XPS3 SMG (Black) EOTech XPS3 SMG (Schwarz) EOTech XPS3 SMG (黑色) - EOTech XPS3 SMG (黑色) + EOTech XPS3(冲锋枪用,黑色) EOTech XPS3 SMG (ブラック) EOTech XPS3 SMG (Nero) EOTech XPS3 SMG (Czarny) @@ -4338,12 +4413,13 @@ EOTech XPS3 SMG (Černá) EOTech XPS3 SMG (Siyah) EOTech XPS3 SMG (Negra) + 이오텍 XPS3 SMG (검정) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (卡其色) - EOTech XPS3 SMG (卡其色) + EOTech XPS3(冲锋枪用,卡其色) EOTech XPS3 SMG (カーキ) EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Khaki) @@ -4353,6 +4429,7 @@ EOTech XPS3 SMG (Khaki) EOTech XPS3 SMG (Hakii) EOTech XPS3 SMG (Caqui) + 이오텍 XPS3 SMG (카키) IOR-Valdada Pitbull 2 @@ -4368,11 +4445,12 @@ IOR-Valdada Pitbull 2 IOR-Valdada Pitbull 2 IOR-Valdada Pitbull 2 + IOR-Valdada 핏불 2 IOR-Valdada Pitbull 2 (2D) IOR-Valdada Pitbull 2 (2D) - IOR-Valdada Pitbull 2 (2D) + IOR-Valdada Pitbull 2(2D) IOR-Valdada ピットブル 2 (2D) IOR-Valdada Pitbull 2 (2D) IOR-Valdada Pitbull 2 (2D) @@ -4383,11 +4461,12 @@ IOR-Valdada Pitbull 2 (2D) IOR-Valdada Pitbull 2 (2D) IOR-Valdada Pitbull 2 (2D) + IOR-Valdada 핏불 2 (2D) IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (PIP) - IOR-Valdada Pitbull 2 (PIP) + IOR-Valdada Pitbull 2(画中画) IOR-Valdada ピットブル 2 (PIP) IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (PIP) @@ -4398,6 +4477,7 @@ IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (PIP) IOR-Valdada Pitbull 2 (BIB) + IOR-Valdada 핏불 2 (PIP) Burris FastFire 2 @@ -4413,12 +4493,13 @@ Burris FastFire 2 Burris FastFire 2 Burris FastFire 2 + 버리스 패스트파이어 2 C-More Railway (Red) C-More Railway (Rot) C-More Railway (紅色) - C-More Railway (红色) + C-More Railway(红色) C-More レイルウェイ (レッド) C-More Railway (Rosso) C-More Railway (Czerwony) @@ -4428,12 +4509,13 @@ C-More Railway (Červený) C-More Railway (Kırmızı) C-More Railway (Roja) + 씨모어 레일웨이 (빨강) C-More Railway (Green) C-More Railway (Grün) C-More Railway (綠色) - C-More Railway (绿色) + C-More Railway(绿色) C-More レイルウェイ (グリーン) C-More Railway (Verde) C-More Railway (Zielony) @@ -4443,12 +4525,13 @@ C-More Railway (Zelený) C-More Railway (Yeşil) C-More Railway (Verde) + 씨모어 레일웨이 (초록) C-More Railway SMG (Red) C-More Railway SMG (Rot) C-More Railway SMG (紅色) - C-More Railway SMG (红色) + C-More Railway(冲锋枪用,红色) C-More レイルウェイ SMG (レッド) C-More Railway SMG (Rosso) C-More Railway SMG (Czerwony) @@ -4458,12 +4541,13 @@ C-More Railway SMG (Červený) C-More Railway SMG (Kırmızı) C-More Railway SMG (Roja) + 씨모어 레일웨이 SMG (빨강) C-More Railway SMG (Green) C-More Railway SMG (Grün) C-More Railway SMG (綠色) - C-More Railway SMG (绿色) + C-More Railway(冲锋枪用,绿色) C-More レイルウェイ SMG (グリーン) C-More Railway SMG (Verde) C-More Railway SMG (Zielony) @@ -4473,6 +4557,7 @@ C-More Railway SMG (Zelený) C-More Railway SMG (Yeşil) C-More Railway SMG (Verde) + 씨모어 레일웨이 SMG (초록) P90 TR (Black) @@ -4487,8 +4572,8 @@ P90 TR (Preto) P90 TR (ブラック) P90 TR (黑色) - P90 TR (黑色) - P90 TR (Black) + P90 TR(黑色) + P90 TR (검정) P90 TR (Siyah) @@ -4504,8 +4589,8 @@ P90 TR (Caqui) P90 TR (カーキ) P90 TR (沙色) - P90 TR (沙色) - P90 TR (Khaki) + P90 TR(沙色) + P90 TR (카키) P90 TR (Haki) @@ -4521,8 +4606,8 @@ P90 TR (Camuflagem) P90 TR (カモフラージュ) P90 TR (迷彩) - P90 TR (迷彩) - P90 TR (Camo) + P90 TR(迷彩) + P90 TR (위장) P90 TR (Kamufulaj) @@ -4538,8 +4623,8 @@ P90 TR (Hex) P90 TR (ヘックス) P90 TR (數位蜂巢迷彩) - P90 TR (数位蜂巢迷彩) - P90 TR (Hex) + P90 TR(蜂巢迷彩) + P90 TR (육각) P90 TR (Hex) @@ -4555,8 +4640,8 @@ P90 (Preto) P90 (ブラック) P90 (黑色) - P90 (黑色) - P90 (Black) + P90(黑色) + P90 (검정) P90 (Siyah) @@ -4572,8 +4657,8 @@ P90 (Caqui) P90 (カーキ) P90 (沙色) - P90 (沙色) - P90 (Khaki) + P90(沙色) + P90 (카키) P90 (Haki) @@ -4589,8 +4674,8 @@ P90 (Camuflagem) P90 (カモフラージュ) P90 (迷彩) - P90 (迷彩) - P90 (Camo) + P90(迷彩) + P90 (위장) P90 (Kamufulaj) @@ -4606,8 +4691,8 @@ P90 (Hex) P90 (ヘックス) P90 (數位蜂巢迷彩) - P90 (数位蜂巢迷彩) - P90 (Hex) + P90(蜂巢迷彩) + P90 (육각) P90 (Hex) @@ -4623,8 +4708,8 @@ PS90 TR (Preto) PS90 TR (ブラック) PS90 TR (黑色) - PS90 TR (黑色) - PS90 TR (Black) + PS90 TR(黑色) + PS90 TR (검정) PS90 TR (Siyah) @@ -4640,8 +4725,8 @@ PS90 TR (Caqui) PS90 TR (カーキ) PS90 TR (沙色) - PS90 TR (沙色) - PS90 TR (Khaki) + PS90 TR(沙色) + PS90 TR (카키) PS90 TR (Haki) @@ -4657,8 +4742,8 @@ PS90 TR (Camuflagem) PS90 TR (カモフラージュ) PS90 TR (迷彩) - PS90 TR (迷彩) - PS90 TR (Camo) + PS90 TR(迷彩) + PS90 TR (위장) PS90 TR (Kamufulaj) @@ -4674,8 +4759,8 @@ PS90 TR (Hex) PS90 TR (ヘックス) PS90 TR (數位蜂巢迷彩) - PS90 TR (数位蜂巢迷彩) - PS90 TR (Hex) + PS90 TR(蜂巢迷彩) + PS90 TR (육각) PS90 TR (Hex) @@ -4691,8 +4776,8 @@ PS90 (Preto) PS90 (ブラック) PS90 (黑色) - PS90 (黑色) - PS90 (Black) + PS90(黑色) + PS90 (검정) PS90 (Siyah) @@ -4708,8 +4793,8 @@ PS90 (Caqui) PS90 (カーキ) PS90 (沙色) - PS90 (沙色) - PS90 (Khaki) + PS90(沙色) + PS90 (카키) PS90 (Haki) @@ -4725,8 +4810,8 @@ PS90 (Camuflagem) PS90 (カモフラージュ) PS90 (迷彩) - PS90 (迷彩) - PS90 (Camo) + PS90(迷彩) + PS90 (위장) PS90 (Kamufulaj) @@ -4742,8 +4827,8 @@ PS90 (Hex) PS90 (ヘックス) PS90 (數位蜂巢迷彩) - PS90 (数位蜂巢迷彩) - PS90 (Hex) + PS90(蜂巢迷彩) + PS90 (육각) PS90 (Hex) @@ -4758,9 +4843,9 @@ Caricatore 5.7mm 50Rnd Магазин из 50-ти 5,7 мм 5.7mm 50 発入り弾倉 - 5.7mm 50發 彈匣 - 5.7mm 50发 弹匣 - 5.7mm 50Rnd Mag + 5.7mm 50發 彈匣 + 5.7 mm 50发 弹匣 + 5.7mm 50발 들이 탄창 5.7mm 50Rnd Şarjör @@ -4776,8 +4861,8 @@ Kaliber: 5,7mm<br />Lövedékek: 50<br />Használható: P90 口径: 5.7mm<br />装弾数: 50<br />次で使用: P90 口徑: 5.7毫米<br />發數: 50<br />使用於: P90 - 口径: 5.7mm<br />发数: 50<br />使用于: P90 - 구경: 5.7mm<br />장탄수: 50<br />사용됨: P90 + 口径:5.7 mm<br />发数:50<br />使用于:P90 + 구경: 5.7mm<br />장탄수: 50<br />사용처: P90 Kalibre: 5.7mm<br />Mermi: 50<br />Kullanıyor: P90 @@ -4843,7 +4928,7 @@ AK-15 (bujný porost) AK-15 (Exuberante) AK-15 (초목) - AK-15 (繁茂) + AK-15(繁茂) AK-15 (緑地) AK-15 (Gür) AK-15 (esőerdő) @@ -4860,7 +4945,7 @@ AK-15 (suchý porost) AK-15 (Árido) AK-15 (건조) - AK-15 (干旱) + AK-15(干旱) AK-15 (乾燥地帯) AK-15 (Kurak) AK-15 (sivatag) @@ -4877,7 +4962,7 @@ AK-15 GL AK-15 GL AK-15 GL - AK-15 GL + AK-15 GP-34 AK-15 GL AK-15 GL AK-15 GL @@ -4894,7 +4979,7 @@ AK-15 GL (bujný porost) AK-15 GL (Exuberante) AK-15 GL (초목) - AK-15 GL (繁茂) + AK-15 GP-34(繁茂) AK-15 GL (緑地) AK-15 GL (Gür) AK-15 GL (esőerdő) @@ -4911,7 +4996,7 @@ AK-15 GL (suchý porost) AK-15 GL (Árido) AK-15 GL (건조) - AK-15 GL (干旱) + AK-15 GP-34(干旱) AK-15 GL (乾燥地帯) AK-15AK-15 GL (Kurak) AK-15 GL (sivatag) @@ -4945,7 +5030,7 @@ AK-15K (bujný porost) AK-15K (Exuberante) AK-15K (초목) - AK-15K (繁茂) + AK-15K(繁茂) AK-15K (緑地) AK-15K (Gür) AK-15K (esőerdő) @@ -4962,7 +5047,7 @@ AK-15K (suchý porost) AK-15K (Árido) AK-15K (건조) - AK-15K (干旱) + AK-15K(干旱) AK-15K (乾燥地帯) AK-15K (Kurak) AK-15K (sivatag) @@ -4996,7 +5081,7 @@ RPK (bujný porost) RPK (Exuberante) RPK (초목) - RPK (繁茂) + RPK(繁茂) RPK (緑地) RPK (Gür) RPK (esőerdő) @@ -5013,7 +5098,7 @@ RPK (suchý porost) RPK (Árido) RPK (건조) - RPK (干旱) + RPK(干旱) RPK (乾燥地帯) RPK (Kurak) RPK (sivatag) @@ -5029,8 +5114,8 @@ M14 (klassisch) M14 (klasický) M14 (clássico) - M14 (표준) - M14 (經典) + M14 (클래식) + M14(经典) M14 (クラシック) M14 (klasik) M14 (klasszikus) @@ -5046,8 +5131,8 @@ Stoner 99 LMG (Schwarz) Stoner 99 LMG (Černá) Stoner 99 LMG (Preto) - Stoner 99 LMG (검정) - 斯通纳99轻机枪(黑色) + 스토너 99 LMG (검정) + 斯通纳 99(黑色) ストーナー 99 LMG(ブラック) Stoner 99 LMG (Siyah) Stoner 99 Könnyűgéppuska (Fekete) @@ -5063,7 +5148,7 @@ MSBS Grot MSBS Grot MSBS Grot - MSBS Grot + MSBS 그롯 MSBS Grot MSBS グロート MSBS Grot @@ -5080,8 +5165,8 @@ MSBS Grot (Schwarz) MSBS Grot (Černá) MSBS Grot (Preto) - MSBS Grot (검정) - MSBS Grot(黑色) + MSBS 그롯 (검정) + MSBS Grot(黑色) MSBS グロート (ブラック) MSBS Grot (Siyah) MSBS Grot (Fekete) @@ -5097,8 +5182,8 @@ MSBS Grot (Tarnmuster) MSBS Grot (Kamufláž) MSBS Grot (Camo) - MSBS Grot (위장) - MSBS Grot(迷彩) + MSBS 그롯 (위장) + MSBS Grot(迷彩) MSBS グロート (カモフラージュ) MSBS Grot (Kamuflaj) MSBS Grot (Terepmintás) @@ -5114,8 +5199,8 @@ MSBS Grot (Sandfarben) MSBS Grot (Písková) MSBS Grot (Deserto) - MSBS Grot (모래) - MSBS Grot(沙色) + MSBS 그롯 (모래) + MSBS Grot(沙色) MSBS グロート (サンド) MSBS Grot (Kum) MSBS Grot (Homok) @@ -5131,8 +5216,8 @@ MSBS Grot GL MSBS Grot GL MSBS Grot GL - MSBS Grot GL - MSBS Grot GL + MSBS 그롯 GL + MSBS Grot GPBO-40 MSBS グロート GL MSBS Grot GL MSBS Grot GL @@ -5148,8 +5233,8 @@ MSBS Grot GL (Schwarz) MSBS Grot GL (Černá) MSBS Grot GL (Preto) - MSBS Grot GL (검정) - MSBS Grot GL(黑色) + MSBS 그롯 GL (검정) + MSBS Grot GPBO-40(黑色) MSBS グロート GL(ブラック) MSBS Grot GL (Siyah) MSBS Grot GL (Fekete) @@ -5165,8 +5250,8 @@ MSBS Grot GL (Tarnmuster) MSBS Grot GL (Kamufláž) MSBS Grot GL (Camo) - MSBS Grot GL (위장) - MSBS Grot GL(迷彩) + MSBS 그롯 GL (위장) + MSBS Grot GPBO-40(迷彩) MSBS グロート GL (カモフラージュ) MSBS Grot GL (Kamuflaj) MSBS Grot GL (Terepmintás) @@ -5182,8 +5267,8 @@ MSBS Grot GL (Sandfarben) MSBS Grot GL (Písková) MSBS Grot GL (Deserto) - MSBS Grot GL (모래) - MSBS Grot GL(沙色) + MSBS 그롯 GL (모래) + MSBS Grot GPBO-40(沙色) MSBS グロート GL (サンド) MSBS Grot GL (Kum) MSBS Grot GL (Homok) @@ -5199,7 +5284,7 @@ MSBS Grot MR MSBS Grot MR MSBS Grot MR - MSBS Grot MR + MSBS 그롯 MR MSBS Grot MR MSBS グロート MR MSBS Grot MR @@ -5216,8 +5301,8 @@ MSBS Grot MR (Schwarz) MSBS Grot MR (Černá) MSBS Grot MR (Preto) - MSBS Grot MR (검정) - MSBS Grot MR(黑色) + MSBS 그롯 MR (검정) + MSBS Grot MR(黑色) MSBS グロート MR (ブラック) MSBS Grot MR (Siyah) MSBS Grot MR (Fekete) @@ -5233,8 +5318,8 @@ MSBS Grot MR (Tarnmuster) MSBS Grot MR (Kamufláž) MSBS Grot MR (Camo) - MSBS Grot MR (위장) - MSBS Grot MR(迷彩) + MSBS 그롯 MR (위장) + MSBS Grot MR(迷彩) MSBS グロート MR (カモフラージュ) MSBS Grot MR (Kamuflaj) MSBS Grot MR (Terepmintás) @@ -5250,8 +5335,8 @@ MSBS Grot MR (Sandfarben) MSBS Grot MR (Písková) MSBS Grot MR (Deserto) - MSBS Grot MR (모래) - MSBS Grot MR(沙色) + MSBS 그롯 MR (모래) + MSBS Grot MR(沙色) MSBS グロート MR (サンド) MSBS Grot MR (Kum) MSBS Grot MR (Homok) @@ -5267,7 +5352,7 @@ MSBS Grot SG MSBS Grot SG MSBS Grot SG - MSBS Grot SG + MSBS 그롯 SG MSBS Grot SG MSBS グロート SG MSBS Grot SG @@ -5284,8 +5369,8 @@ MSBS Grot SG (Schwarz) MSBS Grot SG (Černá) MSBS Grot SG (Preto) - MSBS Grot SG (검정) - MSBS Grot SG(黑色) + MSBS 그롯 SG (검정) + MSBS Grot SG(黑色) MSBS グロート SG (ブラック) MSBS Grot SG (Siyah) MSBS Grot SG (Fekete) @@ -5301,8 +5386,8 @@ MSBS Grot SG (Tarnmuster) MSBS Grot SG (Kamufláž) MSBS Grot SG (Camo) - MSBS Grot SG (위장) - MSBS Grot SG(迷彩) + MSBS 그롯 SG (위장) + MSBS Grot SG(迷彩) MSBS グロート SG (カモフラージュ) MSBS Grot SG (Kamuflaj) MSBS Grot SG (Terepmintás) @@ -5318,8 +5403,8 @@ MSBS Grot SG (Sandfarben) MSBS Grot SG (Písková) MSBS Grot SG (Deserto) - MSBS Grot SG (모래) - MSBS Grot SG(沙色) + MSBS 그롯 SG (모래) + MSBS Grot SG(沙色) MSBS グロート SG (サンド) MSBS Grot SG (Kum) MSBS Grot SG (Homok) diff --git a/addons/realisticweights/CfgWeapons.hpp b/addons/realisticweights/CfgWeapons.hpp index 02b44bbcc2..771b32b96f 100644 --- a/addons/realisticweights/CfgWeapons.hpp +++ b/addons/realisticweights/CfgWeapons.hpp @@ -202,7 +202,7 @@ class CfgWeapons { // - Stoner LMG ----------------------------------------------------------- class LMG_Mk200_F: Rifle_Long_Base_F { class WeaponSlotsInfo: WeaponSlotsInfo { - mass = 100; + mass = 114; }; }; diff --git a/addons/rearm/XEH_postInit.sqf b/addons/rearm/XEH_postInit.sqf index d85104e84f..3a6d72fcbe 100644 --- a/addons/rearm/XEH_postInit.sqf +++ b/addons/rearm/XEH_postInit.sqf @@ -1,6 +1,5 @@ #include "script_component.hpp" -GVAR(hardpointGroupsCache) = [] call CBA_fnc_createNamespace; GVAR(configTypesAdded) = []; ["CBA_settingsInitialized", { TRACE_2("settingsInit",GVAR(level),GVAR(supply)); diff --git a/addons/rearm/XEH_preStart.sqf b/addons/rearm/XEH_preStart.sqf index 022888575e..b092699f9b 100644 --- a/addons/rearm/XEH_preStart.sqf +++ b/addons/rearm/XEH_preStart.sqf @@ -1,3 +1,9 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +// Test binarization one time at startup - ref https://github.com/acemod/ACE3/pull/8093 +private _test = getText (configFile >> "Cfg3DEN" >> "Object" >> "AttributeCategories" >> "ace_attributes" >> "Attributes" >> "ace_rearm_rearmCargo" >> "defaultValue"); +if (!("else {" in _test)) then { + ERROR("3den attribute has ERROR [check binarization]"); +}; diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index 86db3eef78..2159ff8b62 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -19,7 +19,12 @@ params ["_truck", "_player"]; private _vehicles = nearestObjects [_truck, ["AllVehicles"], GVAR(distance)]; -_vehicles = _vehicles select {(_x != _truck) && {!(_x isKindOf "CAManBase")} && {!(_x getVariable [QGVAR(disabled), false])}}; +_vehicles = _vehicles select { + _x != _truck + && {!(_x isKindOf "CAManBase")} + && {alive _x} + && {!(_x getVariable [QGVAR(disabled), false])} +}; private _cswCarryMagazines = []; private _vehicleActions = []; diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf index 1ab5377aad..37b642222a 100644 --- a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -36,10 +36,8 @@ private _turrets = [_vehicle] call FUNC(getAllRearmTurrets); TRACE_2("",_turretPath,_magazines); { [_truck, _x] call FUNC(addMagazineToSupply); - false - } count _magazines; - false -} count _turrets; + } forEach _magazines; +} forEach _turrets; // 1.70 pylons private _pylonConfigs = configProperties [configFile >> "CfgVehicles" >> _vehicle >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; diff --git a/addons/rearm/functions/fnc_initSupplyVehicle.sqf b/addons/rearm/functions/fnc_initSupplyVehicle.sqf index 72b807d810..e748062e65 100644 --- a/addons/rearm/functions/fnc_initSupplyVehicle.sqf +++ b/addons/rearm/functions/fnc_initSupplyVehicle.sqf @@ -19,13 +19,14 @@ if (!hasInterface) exitWith {}; // For now we just add actions, so no need non-c params ["_vehicle"]; private _typeOf = typeOf _vehicle; +private _configOf = configOf _vehicle; TRACE_2("initSupplyVehicle",_vehicle,_typeOf); if (!alive _vehicle) exitWith {}; -private _configSupply = getNumber (configFile >> "CfgVehicles" >> _typeOf >> QGVAR(defaultSupply)); +private _configSupply = getNumber (_configOf >> QGVAR(defaultSupply)); private _isSupplyVehicle = _vehicle getVariable [QGVAR(isSupplyVehicle), false]; -private _oldRearmConfig = isClass (configFile >> "CfgVehicles" >> _typeOf >> "ACE_Actions" >> "ACE_MainActions" >> QGVAR(takeAmmo)); +private _oldRearmConfig = isClass (_configOf >> "ACE_Actions" >> "ACE_MainActions" >> QGVAR(takeAmmo)); TRACE_3("",_configSupply,_isSupplyVehicle,_oldRearmConfig); if ((_configSupply <= 0) && {!_isSupplyVehicle} && {!_oldRearmConfig}) exitWith {}; // Ignore if not enabled @@ -75,4 +76,3 @@ if (_oldRearmConfig || {_configSupply > 0}) then { [_vehicle, 0, ["ACE_MainActions"], _actionTakeAmmo] call EFUNC(interact_menu,addActionToObject); [_vehicle, 0, ["ACE_MainActions"], _actionStoreAmmo] call EFUNC(interact_menu,addActionToObject); }; - diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index 4aae2a1aeb..8aa42344b4 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -14,6 +14,7 @@ Rearme Přezbrojení Rearmar + 재보급 Rearm Settings @@ -41,7 +42,7 @@ Este módulo permite cambiar los parámetros de rearme. Ce module vous permet d'ajuster les paramètres du système de réarmement. 再武装システムの設定を微調整します。 - 이 모듈은 재보급시의 설정을 바꿀수 있게해줍니다. + 이 모듈은 재보급시의 설정을 바꿀수 있게 해줍니다. 此模块允许你调整整装系统设定 此模塊允許你調整整裝系統設定 @@ -72,7 +73,7 @@ Définit la vitesse à laquelle s'effectue le réarmement. 車両を再武装する早さを設定します。 차량을 얼마나 빨리 재보급 시킵니까? - 载具多快会整装完毕? + 载具多快会整装完毕? 載具多快會整裝完畢? @@ -140,10 +141,10 @@ Wie viel Munition transportiert ein Munitionslaster? Quante munizioni può trasportare un camion? 弾薬トラックの運搬量を設定します。 - 弹药卡车会携带多少的弹药? + 弹药卡车会携带多少的弹药? 彈藥卡車會攜帶多少的彈藥? Ile amunicji przewozi ciężarówka? - 탄약 차량은 얼마나 많은 양의 탄약을 가질 수 있음? + 탄약 차량은 얼마나 많은 양의 탄약을 가질 수 있습니까? Définit la quantité de munitions que le camion de ravitaillement transporte. Какой боезапас перевозит грузовик с боеприпасами? Quanta munição um caminhão de munições carrega? @@ -158,7 +159,7 @@ 无限弹药 無限彈藥 Nielimitowany zapas amunicji - 무한의 탄약 + 무한 탄약 보급 Munitions illimitées Неограниченный боезапас Suprimento Ilimitado de Munição @@ -173,7 +174,7 @@ 基于口径限制弹药数量 基於口徑限制彈藥數量 Zapas amunicji zależny od kalibru - 구경에 따라 제한된 탄약 + 구경에 따라 제한된 탄약 보급 En fonction du calibre Ограниченный боезапас в зависимости от калибра Munição Limitada ao Calibre @@ -218,7 +219,7 @@ 正在检查剩余的弹药... 正在檢查剩餘的彈藥中... Sprawdzanie ilości amunicji... - 남은 탄약 확인중... + 남은 탄약 확인 중... Vérification des munitions restantes... Проверка остатка боекомплекта... Checando Munição... @@ -230,10 +231,10 @@ Es ist noch Munition für %1 Punkte übrig. E' presente una penalità delle munizioni %1 punti rimanenti. 弾薬は%1残っています。 - 还剩下%1多的弹药. + 还剩下%1多的弹药。 還剩下%1多的彈藥. Pozostało %1 punktów amunicji. - 여기에는 최소 %1 포인트의 탄약이 남았습니다. + %1 의 탄약이 남아 있습니다. Il reste des munitions d'une valeur de %1 points. Остаток единиц БК: %1 Possui munição equivalente a %1 pontos restantes. @@ -245,7 +246,7 @@ Folgende Munition ist übrig:%1 Mancano le seguenti:%1 この弾薬の残りは:%1 - 以下剩余的弹药:%1 + 以下剩余的弹药:%1 以下剩餘的彈藥:%1 Pozostała amunicja: %1 다음의 탄약이 남음 : %1 @@ -260,10 +261,10 @@ Es ist keine Munition übrig. Non ci sono munizioni rimanenti. 弾薬は残っていない - 已经没有剩余的弹药了. + 已经没有剩余的弹药了。 已經沒有剩餘的彈藥了. Brak amunicji w zapasie. - 여기에는 탄약이 남지 않았습니다. + 탄약이 남지 않았습니다. Il n'y a plus de munitions. Запас боекомплекта пуст Não há munição sobrando. @@ -297,7 +298,7 @@ Rearmando %1 con %2... Réarmement de %1 avec %2... %1に%2を再武装中… - %2을 %1에 재보급중... + %2을 %1에 재보급 중... 正在整装%2到%1... %2正整裝到%1中... @@ -312,7 +313,7 @@ Rearmando %1... Réarmement de %1... %1を再武装中… - %1 재보급중... + %1 재보급 중... 正在整装%1... 整裝%1中... @@ -327,7 +328,7 @@ Tomando %1 para %2... Prise de %1 pour %2... %1を%2用として取得中… - %2를 위해 %1 가져오는중... + %2를 위해 %1 가져오는 중... 正在拿取%1给%2... 拿取%1給%2中... @@ -389,7 +390,7 @@ Guardando %1 en %2... Stocke %1 dans %2... %1を%2へ格納中… - %2에 %1 보관중... + %2에 %1 보관 중... 正在储存%1到%2... 儲存%1到%2中... @@ -403,7 +404,7 @@ Levantando munición... Ramassage des munitions... 弾薬を拾得中… - 탄약 줍는중... + 탄약 줍는 중... 正在捡起弹药... 撿起彈藥中... Sbírám munici... @@ -467,7 +468,7 @@ 30 mm HEI 30mm HEI 30mm 고폭소이탄 - 30mm 高爆燃烧弹 + 30 mm 高爆燃烧 30mm 高爆燃燒彈 30mm HEI @@ -483,7 +484,7 @@ 30 mm HEI-T 30mm HEI-T 30mm 고폭소이예광탄 - 30mm 高爆燃烧曳光弹 + 30 mm 高爆燃烧曳光 30mm 高爆燃燒曳光彈 30mm HEI-T @@ -498,7 +499,7 @@ AIM-9 Sidewinder AIM-9 Sidewinder AIM-9 サイドワインダー - AIM-9 Sidewinder + AIM-9 사이드와인더 AIM-9 响尾蛇 AIM-9 響尾蛇 AIM-9 Sidewinder @@ -514,7 +515,7 @@ Wympel R-73 Wympel R-73 ヴィンペル R-73 - Vympel R-73 + 빔펠 R-73 Wympel R-73 Wympel R-73 Wympel R-73 @@ -530,7 +531,7 @@ AGM-65 Maverick AGM-65 Maverick AGM-65 マーベリック - AGM-65 Maverick + AGM-65 매버릭 AGM-65 小牛 AGM-65 小牛 AGM-65 Maverick @@ -562,7 +563,7 @@ Hydra 70 HE Hydra 70 HE ハイドラ 70 HE - Hydra 70 고폭탄 + 히드라 70 고폭탄 九头蛇 70 高爆弹 九頭蛇 70 高爆彈 Hydra 70 HE @@ -594,7 +595,7 @@ Hydra 70 AP Hydra 70 AP ハイドラ 70 AP - Hydra 70 철갑탄 + 히드라 70 철갑탄 九头蛇 70 反人员弹 九頭蛇 70 反人員彈 Hydra 70 AP @@ -656,9 +657,11 @@ Боеприпасы для перевооружения Carga de Rearme 整裝用貨物 + 重整军备货物 Stock de munitions Sklad munice Cargar munición + 화물 재무장 The cargo for rearming (-1 disable) @@ -669,9 +672,11 @@ Объем боеприпасов для перевооружения (-1 для отмены) A Carga para Rearmamento (-1 para desativar) 貨物可以提高多少次整裝(-1為停用) + 重新武装的货物(-1禁用) Le quantité de munitions (en points), qui est disponible pour du réarmement (-1 pour désactiver). Objekt pro přezbrojování (-1 pro vypnutí) Cantidad de munición restante para rearmado (-1 para deshabilitar) + 화물을 재무장합니다 (-1 설정시 비활성화) Rearm distance @@ -680,11 +685,13 @@ Distância para Rearmar 再武装距離 整裝距離 + 整装距离 Distanza di riarmo Přezbrojovací vzdálenost Odległość przezbrojenia Дистанция перевооружения Distancia de rearmado + 재무장 거리 The maximum distance a vehicle can be rearmed at @@ -693,11 +700,13 @@ A distância máxima que um veículo pode ser rearmado/municiado. 車両から再武装できる範囲を決定します。 與載具之最大可整裝距離 + 车辆可重新整装的最大距离 La distanza massima a cui un veicolo può essere riarmato Maximální vzdálenost na jakou může být vozidlo přezbrojeno Maksymalna odległość na jakiej pojazd może zostać przezbrojony Максимальная дистанция для перевооружения Máxima distancia a la que un vehículo puede ser rearmado + 차량이 재무장 할 수 있는 최대 거리를 설정합니다. diff --git a/addons/refuel/CfgVehicles.hpp b/addons/refuel/CfgVehicles.hpp index 41c4f12625..adce2a8af2 100644 --- a/addons/refuel/CfgVehicles.hpp +++ b/addons/refuel/CfgVehicles.hpp @@ -42,6 +42,18 @@ class CBA_Extended_EventHandlers; +class CfgNonAIVehicles { + class GVAR(fuelHoseSegment) { + access = 0; + scope = 2; + displayName = "Fuel Hose"; + simulation = "ropesegment"; + autocenter = 0; + animated = 0; + model = QPATHTOF(data\hose.p3d); + }; +}; + class CfgVehicles { class ACE_Module; class ACE_moduleRefuelSettings: ACE_Module { @@ -66,6 +78,11 @@ class CfgVehicles { typeName = "NUMBER"; defaultValue = 12; }; + class progressDuration { + displayName = CSTRING(RefuelSettings_progressDuration_DisplayName); + typeName = "NUMBER"; + defaultValue = 2; + }; }; }; @@ -82,6 +99,14 @@ class CfgVehicles { model = QPATHTOF(data\nozzle.p3d); destrType = "DestructNo"; }; + + class Rope; + class GVAR(fuelHose): Rope { + hiddenSelections[] = {"rope"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.009,0.009,0.009,1.0,co)"}; + segmentType = QGVAR(fuelHoseSegment); + model = QPATHTOF(data\hose.p3d); + }; class All; class Static: All {}; diff --git a/addons/refuel/data/hose.cfg b/addons/refuel/data/hose.cfg new file mode 100644 index 0000000000..a49123a444 --- /dev/null +++ b/addons/refuel/data/hose.cfg @@ -0,0 +1,7 @@ +class CfgModels { + class hose { + sectionsInherit = ""; + sections[] = {"rope"}; + skeletonName = ""; + }; +}; \ No newline at end of file diff --git a/addons/refuel/data/hose.p3d b/addons/refuel/data/hose.p3d new file mode 100644 index 0000000000..cc233eacf6 Binary files /dev/null and b/addons/refuel/data/hose.p3d differ diff --git a/addons/refuel/defines.hpp b/addons/refuel/defines.hpp new file mode 100644 index 0000000000..761eb08641 --- /dev/null +++ b/addons/refuel/defines.hpp @@ -0,0 +1,4 @@ +#define REFUEL_INFINITE_FUEL -10 +#define REFUEL_DISABLED_FUEL -1 +#define REFUEL_ACTION_DISTANCE 7 +#define REFUEL_NOZZLE_ACTION_DISTANCE 2 diff --git a/addons/refuel/functions/fnc_checkFuel.sqf b/addons/refuel/functions/fnc_checkFuel.sqf index 275ad7999b..72c1c2b896 100644 --- a/addons/refuel/functions/fnc_checkFuel.sqf +++ b/addons/refuel/functions/fnc_checkFuel.sqf @@ -21,7 +21,7 @@ params [["_unit", objNull, [objNull]], ["_source", objNull, [objNull]]]; private _fuel = [_source] call FUNC(getFuel); [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION * 2), + GVAR(progressDuration) * 2, [_unit, _source, _fuel], { params ["_args"]; diff --git a/addons/refuel/functions/fnc_connectNozzleAction.sqf b/addons/refuel/functions/fnc_connectNozzleAction.sqf index f2e38c34a0..97778d3e83 100644 --- a/addons/refuel/functions/fnc_connectNozzleAction.sqf +++ b/addons/refuel/functions/fnc_connectNozzleAction.sqf @@ -65,7 +65,7 @@ _bestPosASL = _bestPosASL vectorAdd ((_bestPosASL vectorFromTo _startingPosASL) private _attachPosModel = _sink worldToModel (ASLtoAGL _bestPosASL); [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION), + GVAR(progressDuration), [_unit, _nozzle, _sink, _attachPosModel], { params ["_args"]; diff --git a/addons/refuel/functions/fnc_moduleRefuelSettings.sqf b/addons/refuel/functions/fnc_moduleRefuelSettings.sqf index fabdad1706..1972397986 100644 --- a/addons/refuel/functions/fnc_moduleRefuelSettings.sqf +++ b/addons/refuel/functions/fnc_moduleRefuelSettings.sqf @@ -23,5 +23,6 @@ if !(_activated) exitWith {}; [_logic, QGVAR(rate), "rate"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(hoseLength), "hoseLength"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(progressDuration), "progressDuration"] call EFUNC(common,readSettingFromModule); -INFO_2("Refuel Module Initialized with flow rate: %1 - hoseLength: %2",GVAR(rate), GVAR(hoseLength)) +INFO_3("Refuel Module Initialized with flow rate: %1 - hoseLength: %2 - progressDuration: %3",GVAR(rate),GVAR(hoseLength),GVAR(progressDuration)) diff --git a/addons/refuel/functions/fnc_returnNozzle.sqf b/addons/refuel/functions/fnc_returnNozzle.sqf index 3cc2f773f0..5f1eed2721 100644 --- a/addons/refuel/functions/fnc_returnNozzle.sqf +++ b/addons/refuel/functions/fnc_returnNozzle.sqf @@ -23,7 +23,7 @@ private _nozzle = _unit getVariable [QGVAR(nozzle), objNull]; if (isNull _nozzle || {_source != _nozzle getVariable QGVAR(source)}) exitWith {}; [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION), + GVAR(progressDuration), [_unit, _nozzle, _source], { params ["_args"]; diff --git a/addons/refuel/functions/fnc_takeNozzle.sqf b/addons/refuel/functions/fnc_takeNozzle.sqf index 7ce0a9d808..0292e9ec66 100644 --- a/addons/refuel/functions/fnc_takeNozzle.sqf +++ b/addons/refuel/functions/fnc_takeNozzle.sqf @@ -22,7 +22,7 @@ params [ ]; [ - TIME_PROGRESSBAR(REFUEL_PROGRESS_DURATION), + GVAR(progressDuration), [_unit, _object], { params ["_args"]; @@ -69,7 +69,7 @@ params [ _attachPos = _attachPos select (_hookDistances find selectMin _hookDistances); }; private _hoseLength = _source getVariable [QGVAR(hoseLength), GVAR(hoseLength)]; - private _rope = ropeCreate [_ropeTarget, _attachPos, _nozzle, [0, -0.20, 0.12], _hoseLength]; + private _rope = ropeCreate [_ropeTarget, _attachPos, _nozzle, [0, -0.20, 0.12], _hoseLength, [], [], QGVAR(fuelHose)]; _nozzle setVariable [QGVAR(rope), _rope, true]; _nozzle setVariable [QGVAR(attachPos), _attachPos, true]; _nozzle setVariable [QGVAR(source), _source, true]; diff --git a/addons/refuel/initSettings.sqf b/addons/refuel/initSettings.sqf index 160c3ef22d..52e3c7ee8c 100644 --- a/addons/refuel/initSettings.sqf +++ b/addons/refuel/initSettings.sqf @@ -15,3 +15,12 @@ true, // isGlobal {[QGVAR(hoseLength), _this] call EFUNC(common,cbaSettings_settingChanged)} ] call CBA_fnc_addSetting; + +[ + QGVAR(progressDuration), "TIME", + [LSTRING(RefuelSettings_progressDuration_DisplayName), LSTRING(RefuelSettings_progressDuration_Description)], + [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_refuel"], + [0, 10, 2], // [min, max, default value] + true, // isGlobal + {[QGVAR(progressDuration), _this] call EFUNC(common,cbaSettings_settingChanged)} +] call CBA_fnc_addSetting; diff --git a/addons/refuel/script_component.hpp b/addons/refuel/script_component.hpp index be346e0cca..76d9b67819 100644 --- a/addons/refuel/script_component.hpp +++ b/addons/refuel/script_component.hpp @@ -2,7 +2,6 @@ #define COMPONENT_BEAUTIFIED Refuel #include "\z\ace\addons\main\script_mod.hpp" -// #define FAST_PROGRESSBARS // #define DRAW_HOOKS_POS // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE @@ -18,17 +17,7 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define REFUEL_INFINITE_FUEL -10 -#define REFUEL_DISABLED_FUEL -1 -#define REFUEL_ACTION_DISTANCE 7 -#define REFUEL_NOZZLE_ACTION_DISTANCE 2 -#define REFUEL_PROGRESS_DURATION 2 - -#ifdef FAST_PROGRESSBARS - #define TIME_PROGRESSBAR(X) ((X) * 0.075) -#else - #define TIME_PROGRESSBAR(X) (X) -#endif +#include "\z\ace\addons\refuel\defines.hpp" #define INTERACT_EXCEPTIONS_REFUELING "isNotInside", "isNotOnLadder", "isNotSwimming" #define INTERACT_EXCEPTIONS INTERACT_EXCEPTIONS_REFUELING, "isNotRefueling" diff --git a/addons/refuel/stringtable.xml b/addons/refuel/stringtable.xml index 01459451d2..90ace6c7c1 100644 --- a/addons/refuel/stringtable.xml +++ b/addons/refuel/stringtable.xml @@ -45,7 +45,7 @@ Définit la vitesse de ravitaillement en carburant des véhicules. どのくらいの速さで車両へ給油しますか? 차량이 얼마나 빨리 재급유될 수 있습니까? - 载具多快会加油完毕? + 载具多快会加油完毕? 載具多快會加油完畢? Bir araca ne kadar hızlı yakıt ikmali yapılmalıdır? @@ -77,7 +77,7 @@ Prendre le pistolet 給油ノズルを取る 주유기 획득 - 拿取燃料喷嘴 + 拿取加油枪 拿取燃料噴嘴 Yakıt Pompasını Al @@ -92,8 +92,8 @@ Tomando surtidor... Prise du pistolet... 給油ノズルを取っています・・・ - 주유기 획득중... - 正在拿取燃料喷嘴... + 주유기 획득 중... + 正在拿取加油枪... 拿取燃料噴嘴中... Yakıt Pompası Alınıyor... @@ -109,7 +109,7 @@ Introduire le pistolet 給油ノズルを接続する 주유기 꼽기 - 连接燃料喷嘴 + 连接加油枪 連接燃料噴嘴 Yakıt Pompasını Bağla @@ -124,8 +124,8 @@ Conectando surtidor... Introduction du pistolet... 給油ノズルを接続しています・・・ - 주유기 꼽는중... - 正在连结燃料喷嘴... + 주유기 꼽는 중... + 正在连接加油枪... 連結燃料噴嘴中... Yakıt Pompası Bağlanıyor... @@ -141,7 +141,7 @@ Retirer le pistolet 給油ノズルを外す 주유기 뽑기 - 断开燃料喷嘴 + 断开加油枪 斷開燃料噴嘴 Yakıt Pompası Çıkar @@ -157,7 +157,7 @@ Raccorder 接続 꼽기 - 连结 + 连接 連結 Bağlan @@ -205,7 +205,7 @@ Il reste %1 litres. 後 %1 リットル残っています。 %1 리터 남음 - 剩下%1公升的燃料。 + 剩下%1升的燃料。 剩下%1公升的燃料。 %1 litre kaldı. @@ -295,7 +295,7 @@ Impossibile iniziare il rifornimento 給油を始められませんでした 無法開啟燃料噴嘴 - 无法开启燃料喷嘴 + 无法开启加油枪 주유기를 켤 수 없습니다. Nie można włączyć dyszy paliwowej Не удалось включить топливный пистолет @@ -317,7 +317,7 @@ %1 litres pompés. %1 リッターを給油しました %1 리터 재급유됨 - 已加入%1公升的燃料 + 已加入%1升的燃料 已加入%1公升的燃料 %1 Litre Dolduruldu @@ -332,7 +332,7 @@ La fuente de combustible está vacía. La source de carburant est vide. 給油元は空です。 - 燃料来源已空. + 燃料来源已空。 燃料來源已空. 연료공급처가 비었음. Yakıt tankı boş. @@ -413,7 +413,7 @@ Ranger le pistolet 給油ノズルを戻す 주유기 반환 - 放回燃料喷嘴 + 放回加油枪 放回燃料噴嘴 Yakıt Pompasını Geri Koy @@ -428,8 +428,8 @@ Devolviendo el surtidor... Rangement du pistolet... 給油ノズルを戻しています・・・ - 주유기 반환중 - 正在放回燃料喷嘴... + 주유기 반환 중 + 正在放回加油枪... 放回燃料噴嘴中... Yakıt Pompası Geri Koyuluyor @@ -444,7 +444,7 @@ Verificar el contador de combustible Vérifier le compteur 燃料計を見る - 연로카운터 확인 + 연료카운터 확인 检查燃料表 檢查燃料表 Yakıt tankını kontrol et @@ -461,7 +461,7 @@ %1 litres ont été pompés. %1 リッターが給油されました。 %1 리터가 재급유되었습니다. - 已加入%1公升 + 已加入%1升 已加入%1公升 %1 litre dolduruldu @@ -479,7 +479,15 @@ Comprimento da Mangueira de Combustível Longueur du tuyau Délka hadice na palivo - Yakıt poması uzunluğu + Yakıt hortumu uzunluğu + + + Pump/Hose Interaction Time + Pompa/Hortum Etkileşim Süresi + + + How long refuel interactions take in seconds. + Saniye biriminde yakıt ikmali etkileşimlerinin süresi. Fuel Cargo Volume @@ -505,8 +513,8 @@ 給油用の貯油量を設定できます (-1で無効、-10で無限) La capacità del carburante disponibile per il rifornimento (-1 disabilita, -10 se infinito) 設定有多少油料可供載具進行加油(-1時關閉,-10為無限油量) - 设定有多少油料可供载具进行加油(-1时关闭,-10为无限油量) - 재급유에 사용 할 수 있는 연료량 (-1=비활성, -10=무한) + 设定有多少油料可供载具进行加油(-1时关闭,-10为无限油量) + 재급유에 사용할 수 있는 연료량 (-1=비활성, -10=무한) Pojemność paliwa dostępnego do tankowania (-1 wyłącz, -10 jeśli nieskończone) Quantidade de combustível disponível para abastecer (-1 para desativar, -10 para infinito) Le volume de carburant disponible pour le ravitaillement (-1 pour désactiver, -10 pour quantité illimitée). diff --git a/addons/reload/CfgMagazines.hpp b/addons/reload/CfgMagazines.hpp index 965bc3c225..e7a7d8e041 100644 --- a/addons/reload/CfgMagazines.hpp +++ b/addons/reload/CfgMagazines.hpp @@ -12,6 +12,9 @@ class CfgMagazines { class 150Rnd_93x64_Mag: CA_Magazine { // Mag for HK121 (MMG_01) [DLC Opfor Heavy Gunner] ACE_isBelt = 1; }; + class 10Rnd_93x64_DMR_05_Mag: 150Rnd_93x64_Mag { // Mag for Cyrus (DMR_05) [DLC Opfor Sharpshooter] + ACE_isBelt = 0; + }; class 130Rnd_338_Mag: CA_Magazine { // Mag for LWMMG (MMG_02) [DLC Blufor Heavy Gunner] ACE_isBelt = 1; }; diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 478c512200..2d2865d3cd 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -13,7 +13,7 @@ Controlla le munizioni durante il ricaricamento Conferir munição ao recarregar a arma 再装填された武器の弾薬を確認 - 재장전시 장탄수 확인 + 재장전 시 장탄수 확인 在重新装填时检查弹药 在重新裝填時檢查彈藥 @@ -29,8 +29,8 @@ Controlla le munizioni rimanenti nel caricatore in fase di cambio caricatore. Confere a munição no seu novo carregador ao recarregar a arma 新しく装填された弾倉の弾薬を確認します。 - 재장전시 새탄창에 있는 탄약을 확인합니다. - 在重新装填时检查新弹匣上的弹药. + 재장전 시 새 탄창에 있는 탄약을 확인합니다. + 在重新装填时检查新弹匣上的弹药。 在重新裝填時檢查新彈匣上的彈藥. @@ -40,11 +40,13 @@ Vždy zobrazit kontrolu munice v menu vlastní interakce セルフ インタラクションへ弾薬確認を常に表示 總是在自我互動中顯示檢查彈藥動作 + 总是在自我互动中显示检查弹药动作 Toujours afficher l'action de vérification des munitions Sempre mostrar a opção de checar a própria munição Всегда показывать проверку боеприпасов в меню взаимодействия с собой Mostrar siempre la autointeracción de comprobar munición Zeige immer die Selbstinteraktion zur Prüfung der Munition an. + 상호작용에 탄약 확인을 항상 띄우기 Shows check ammo self interaction even when not in static weapons. @@ -53,11 +55,13 @@ Zobrazuje kontrolu munice v menu vlastní interakce i pokud hráč nepoužívá statickou zbraň. 設置型火器を使っていなくても、セルフ インタラクションへ弾薬確認を常に表示します。 即使不是固定式支援武器也依然在自我互動中顯示檢查彈藥動作 + 即使不是固定式支援武器也依然在自我互动中显示检查弹药动作 Permet d'afficher l'action de vérification des munitions du menu d'interaction personnel, même si le joueur n'utilise pas d'arme statique. Mostra a opção de ver sua própria munição mesmo quando não em armas estáticas. Показывать проверку боеприпасов даже вне стационарного орудия Mostrar la comprobación de la munición incluso cuando no está en armas estáticas Zeigt die Selbstinteraktion der Munitionsüberprüfung an, auch wenn nicht in statischen Waffen. + 탄약 확인을 상호작용에서 할 수 있도록 합니다. Check Ammo @@ -121,7 +125,7 @@ Attaccando la tracolla... Ligando cintos... ベルトを繋げています・・・ - 벨트 연결중... + 벨트 연결 중... 正在连接弹链... 連接彈鏈中... diff --git a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf index b0e5a9c332..1765a3350c 100644 --- a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf +++ b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf @@ -26,5 +26,4 @@ _target selectWeapon _weapon; if (currentWeapon _target != _weapon) exitWith {}; if (currentMagazine _target != "") exitWith {}; -// command is wip, reload time for launchers is not intended. _target addWeaponItem [_weapon, _magazine, true]; diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index 80a7dce947..75653f6add 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -14,7 +14,7 @@ Recarregar lançador ランチャーに装填 무기 재장전 - 装载发射器 + 装填发射器 裝載發射器 Fırlatıcıyı Yükle @@ -30,8 +30,8 @@ Caricando il lanciamissili... Recarregando lançador... ランチャーに装填中・・・ - 무기 재장전중... - 正在装载发射器... + 무기 재장전 중... + 正在装填发射器... 裝載發射器中... Fırlatıcı Yükleniyor... @@ -48,7 +48,7 @@ Lançador Carregado ランチャーに装填完了 무기 재장전됨 - 发射器装载完毕 + 发射器装填完毕 發射器裝載完畢 Fırlatıcı Yüklendi @@ -65,7 +65,7 @@ Recarregar %1 %1 を装填 %1 장전 - 装载%1 + 装填%1 裝載%1 %1 Yüklendi diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index 22b5056dc3..6d7a053df2 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -106,7 +106,6 @@ class CfgVehicles { class values { class None { name = "None"; value = 0; default = 1;}; class ToolKit { name = "ToolKit"; value = 1; }; - class gm_repairkit_01 { name = "GM Repair Kit"; value = 1; }; }; }; }; diff --git a/addons/repair/XEH_PREP.hpp b/addons/repair/XEH_PREP.hpp index 7c2e5a1f15..45fcb0206b 100644 --- a/addons/repair/XEH_PREP.hpp +++ b/addons/repair/XEH_PREP.hpp @@ -17,6 +17,7 @@ PREP(doReplaceWheel); PREP(getClaimObjects); PREP(getHitPointString); PREP(getPostRepairDamage); +PREP(getRepairItems); PREP(getWheelHitPointsWithSelections); PREP(hasItems); PREP(isEngineer); diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index 216a16fcf7..2fd97fbf01 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -8,6 +8,8 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +GVAR(allToolKits) = call (uiNamespace getVariable QGVAR(allToolKits)); + ["ACE_RepairItem_Base", "killed", { params ["_object"]; diff --git a/addons/repair/XEH_preStart.sqf b/addons/repair/XEH_preStart.sqf index 022888575e..a01df24b79 100644 --- a/addons/repair/XEH_preStart.sqf +++ b/addons/repair/XEH_preStart.sqf @@ -1,3 +1,8 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +uiNamespace setVariable [ + QGVAR(allToolKits), + compileFinal str (QUOTE(getNumber (_x >> 'ItemInfo' >> 'type') == TYPE_TOOLKIT) configClasses (configFile >> "CfgWeapons") apply {configName _x}) +]; diff --git a/addons/repair/functions/fnc_canRepair.sqf b/addons/repair/functions/fnc_canRepair.sqf index e6873649cb..11a5dea209 100644 --- a/addons/repair/functions/fnc_canRepair.sqf +++ b/addons/repair/functions/fnc_canRepair.sqf @@ -37,12 +37,7 @@ private _engineerRequired = if (isNumber (_config >> "requiredEngineer")) then { }; if !([_caller, _engineerRequired] call FUNC(isEngineer)) exitWith {false}; -// Items can be an array of required items or a string to a missionNamespace variable -private _items = if (isArray (_config >> "items")) then { - getArray (_config >> "items"); -} else { - missionNamespace getVariable [getText (_config >> "items"), []] -}; +private _items = _config call FUNC(getRepairItems); if (count _items > 0 && {!([_caller, _items] call FUNC(hasItems))}) exitWith {false}; private _return = true; diff --git a/addons/repair/functions/fnc_getPostRepairDamage.sqf b/addons/repair/functions/fnc_getPostRepairDamage.sqf index cf0ff923bd..0eac151e45 100644 --- a/addons/repair/functions/fnc_getPostRepairDamage.sqf +++ b/addons/repair/functions/fnc_getPostRepairDamage.sqf @@ -7,7 +7,7 @@ * 0: Unit that does the repairing * * Return Value: - * 0: Rpair Damage Threshold + * 0: Repair Damage Threshold * * Example: * [unit] call ace_repair_fnc_getPostRepairDamage diff --git a/addons/repair/functions/fnc_getRepairItems.sqf b/addons/repair/functions/fnc_getRepairItems.sqf new file mode 100644 index 0000000000..809a6a5da7 --- /dev/null +++ b/addons/repair/functions/fnc_getRepairItems.sqf @@ -0,0 +1,37 @@ +#include "script_component.hpp" +/* + * Author: veteran29 + * Returns the items required for repair. + * + * Arguments: + * 0: Repair config + * + * Return Value: + * 0: Required items + * + * Example: + * [_config] call ace_repair_fnc_getRepairItems + * + * Public: No + */ + +params [["_config", configNull]]; + +// Items can be an array of required items or a string to a missionNamespace variable +private _items = if (isArray (_config >> "items")) then { + getArray (_config >> "items"); +} else { + missionNamespace getVariable [getText (_config >> "items"), []] +}; + +// handle "any toolkit" setting +if (_items isEqualTo [ANY_TOOLKIT_FAKECLASS]) then { + TRACE_1("any toolkit",_items); + + // array element inside items array means "any of these items" + _items = [GVAR(allToolKits)]; +}; + +TRACE_2("get repair items",_config,_items); + +_items diff --git a/addons/repair/functions/fnc_hasItems.sqf b/addons/repair/functions/fnc_hasItems.sqf index 9b54647c8d..a27f9c3202 100644 --- a/addons/repair/functions/fnc_hasItems.sqf +++ b/addons/repair/functions/fnc_hasItems.sqf @@ -29,4 +29,4 @@ private _return = true; }; } forEach _items; -_return; +_return diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf index 88b260b221..51fdea90fe 100644 --- a/addons/repair/functions/fnc_repair.sqf +++ b/addons/repair/functions/fnc_repair.sqf @@ -43,12 +43,7 @@ if ((isEngineOn _target) && {!GVAR(autoShutOffEngineWhenStartingRepair)}) exitWi false }; -// Items can be an array of required items or a string to a missionNamespace variable -private _items = if (isArray (_config >> "items")) then { - getArray (_config >> "items"); -} else { - missionNamespace getVariable [getText (_config >> "items"), []] -}; +private _items = _config call FUNC(getRepairItems); if (count _items > 0 && {!([_caller, _items] call FUNC(hasItems))}) exitWith {false}; private _return = true; diff --git a/addons/repair/initSettings.sqf b/addons/repair/initSettings.sqf index 5f2f98a763..fddd22b541 100644 --- a/addons/repair/initSettings.sqf +++ b/addons/repair/initSettings.sqf @@ -94,7 +94,7 @@ "LIST", [LSTRING(WheelRepairRequiredItems_DisplayName), LSTRING(WheelRepairRequiredItems_Description)], [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], - [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 0], + [[[], [ANY_TOOLKIT_FAKECLASS]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 0], true ] call CBA_fnc_addSetting; @@ -103,7 +103,7 @@ "LIST", [LSTRING(MiscRepairRequiredItems_DisplayName), LSTRING(MiscRepairRequiredItems_Description)], [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], - [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], + [[[], [ANY_TOOLKIT_FAKECLASS]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], true ] call CBA_fnc_addSetting; @@ -112,7 +112,7 @@ "LIST", [LSTRING(FullRepairRequiredItems_DisplayName), LSTRING(FullRepairRequiredItems_Description)], [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], - [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], + [[[], [ANY_TOOLKIT_FAKECLASS]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], true ] call CBA_fnc_addSetting; diff --git a/addons/repair/script_component.hpp b/addons/repair/script_component.hpp index 7ec3be3233..35ab2f4f8c 100644 --- a/addons/repair/script_component.hpp +++ b/addons/repair/script_component.hpp @@ -19,3 +19,5 @@ #define TRACK_HITPOINTS ["hitltrack", "hitrtrack"] #define DAMAGE_COLOR_SCALE ["#FFFFFF", "#FFFF7E", "#FFEC4D", "#FFD52C", "#FCB121", "#FF9916", "#FF7D16", "#FF4400", "#FF0000"] + +#define ANY_TOOLKIT_FAKECLASS QGVAR(anyToolKit) diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 9009b15537..f480cf1ffc 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -63,7 +63,7 @@ Sostituendo la ruota... Remplacement de la roue... タイヤを交換しています・・・ - 바퀴 교체중... + 바퀴 교체 중... 正在更换轮胎... 更換輪胎中... Tekerlek Takılıyor @@ -112,7 +112,7 @@ Rimuovendo la ruota... Démontage de la roue... タイヤを外しています・・・ - 바퀴 제거중... + 바퀴 제거 중... 正在卸下轮胎... 卸下輪胎中... Tekerlek Sökülüyor @@ -160,7 +160,7 @@ Sostituendo il cingolo... Remplacement de la chenille... 履帯を交換しています・・・ - 궤도 교체중... + 궤도 교체 중... 正在更换履带... 更換履帶中... Parça Değişiyor... @@ -208,7 +208,7 @@ Rimuovendo il cingolo... Démontage de la chenille... 履帯を外しています・・・ - 궤도 제거중... + 궤도 제거 중... 正在卸下履带... 卸下履帶中... Parça Sökülüyor... @@ -256,7 +256,7 @@ Riparando il veicolo... Réparation du véhicule... 車両を修理しています・・・ - 차량 수리중... + 차량 수리 중... 正在维修载具... 維修載具中... Tamir Ediliyor... @@ -268,6 +268,8 @@ Повысьте подготовку инженеров при ремонте транспортных средств или объектов. Нетренированный становится инженером, инженер становится продвинутым инженером. Steigert die Ausbildung von Pionieren, wenn Sie sich in Reparaturfahrzeugen oder -einrichtungen befinden. Aus Ungelerntem wird Pionier, aus Pionier wird ein fortgeschrittener Pionier. Zwiększ wyszkolenie inżynierów w pojazdach i budynkach naprawczych. Niewyszkoleni zostają inżynierami, inżynierowie zostają zaawansowanymi inżynierami. + 在修理车辆或设施时,提升工程师训练。未受过训练的变成工程师,工程师晋升为高级工程师。 + 수리 차량이나 시설 주위에 있으면 수리 수준을 높입니다. 정비병이 아닌 사람은 정비병이 되고, 정비병은 정비사가 됩니다. Full Repair Locations @@ -297,7 +299,7 @@ Définit les lieux permettant de réparer intégralement un véhicule. どのような場所で車両の完全な修理を出来るようにしますか? 어느 구역에서 차량을 완전히 수리할 수 있게 합니까? - 什么位置可以完整维修载具? + 什么位置可以完整维修载具? 什麼位置可以完整維修載具? @@ -328,7 +330,7 @@ Définit qui peut effectuer une réparation complète sur un véhicule. 誰が車両の完全な修理を出来るようにしますか? 누가 완전 수리를 할 수 있습니까? - 谁可以完整维修载具? + 谁可以完整维修载具? 誰可以完整維修載具? Kimler araçta tam onarım yapabilir? @@ -360,7 +362,7 @@ Ajoute des pièces de rechange aux véhicules (nécessite le système de cargaison). 車両へ予備部品を追加しますか(カーゴ コンポーネントが必要)? 차량에 예비 부품을 더합니까?(짐칸 요소 필요) - 添加载具备件 (需相关货物组件)? + 添加载具备件(需相关货物组件)? 添加載具備件 (需相關貨物組件)? @@ -422,7 +424,7 @@ javítása... Ремонтируем... 修理しています・・・ - 수리중... + 수리 중... 正在维修... 維修中... Tamir Ediliyor... @@ -439,7 +441,7 @@ %1 javítása... Ремонтируем %1... %1 を修理しています・・・ - %1 수리중... + %1 수리 중... 正在维修%1... 維修%1中... Tamir Ediliyor %1... @@ -472,7 +474,7 @@ Parte riparata completamente Pièce entièrement réparée. 完全に修理された部品 - 부분 완벽히 수리됨 + 완전수리된 부품 完整维修部分 完整維修部分 @@ -778,7 +780,7 @@ Пушку - + Silah @@ -1071,7 +1073,7 @@ Стекло (справа) ガラス (右) 유리 (오른쪽) - 玻璃 (右) + 玻璃(右) 玻璃 (右) Cam(Sağ) @@ -1088,7 +1090,7 @@ Стекло (слава) ガラス (左) 유리 (왼쪽) - 玻璃 (左) + 玻璃(左) 玻璃 (左) Cam (sol) @@ -1191,7 +1193,7 @@ Instandsetzer Solo Geniere avanzato 上級工兵のみ - 只有维修专精兵 + 只有维修专业兵 只有維修專精兵 Tylko zaawansowani mechanicy 고급 정비공만 @@ -1229,7 +1231,7 @@ Définit qui peut démonter et remplacer des roues. 誰がタイヤの除去と交換を出来るようにしますか? 누가 바퀴를 제거 및 교체할 수 있습니까? - 谁可维修轮胎? + 谁可维修轮胎? 誰可維修輪胎? @@ -1259,7 +1261,7 @@ Définit qui peut effectuer des réparations. 誰が修理を出来るようににしますか? 누가 수리를 할 수 있습니까? - 谁可以进行维修操作? + 谁可以进行维修操作? 誰可以進行維修操作? @@ -1289,7 +1291,7 @@ Définit la quantité maximale de dégâts pouvant être réparés avec une trousse à outils. ツールキットで修理できる、最大の損傷許容範囲を設定しますか? 어느정도의 피해까지 툴킷으로 수리가 가능합니까? - 工具包可以修复的最大损坏值? + 工具包可以修复的最大损坏值? 工具包可以修復的最大損壞值? @@ -1304,7 +1306,7 @@ Seuil de réparabilité (ingénieurs) 修理のしきい値 (工兵) 정비 한계치 (정비공) - 维修门槛 (工兵) + 维修门槛(工兵) 維修門檻 (工兵) @@ -1319,7 +1321,7 @@ Définit la quantité maximale de dégâts qu'un ingénieur peut réparer. 工兵が修理できる、最大の損傷許容範囲を設定しますか? 정비공은 어느정도의 피해까지 수리할 수 있습니까? - 工兵可以修复的最大损坏值? + 工兵可以修复的最大损坏值? 工兵可以修復的最大損壞值? @@ -1349,7 +1351,7 @@ Définit si la trousse à outils doit être retirée après usage. ツールキットを使うと削除しますか? 툴킷을 사용하면 제거를 합니까? - 要在使用后删除工具包吗? + 要在使用后删除工具包吗? 要在使用後刪除工具包嗎? @@ -1453,7 +1455,7 @@ Lista di unità che verranno classificate come genieri, separate da virgole. Liste d'unités qui seront classées comme ingénieurs, séparées par des virgules. 一覧に記載されたユニット名を、工兵として指定します。コンマで複数を指定できます。 - 목록내 보직이름은 정비공으로 분류됩니다. 쉼표로 구분합니다. + 목록 내 보직이름은 정비공으로 분류됩니다. 쉼표로 구분합니다. 工兵名单,把单位名称输入在这边即可定义其为工兵。每个单位使用逗号以做区隔。 工兵名單,把單位名稱輸入在這邊即可定義其為工兵。每個單位使用逗號以做區隔。 @@ -1525,7 +1527,7 @@ Instandsetzer Adv. Geniere 上級工兵 - 专精 + 高级工兵 專精 Zaaw. mechanik 고급 정비공 @@ -1623,7 +1625,7 @@ Définit s'il s'agit d'un véhicule de réparation. 車両を修理車両と指定しますか? 이 차량을 정비 차량으로 분류합니까? - 此载具是维修载具吗? + 此载具是维修载具吗? 此載具是維修載具嗎? @@ -1713,7 +1715,7 @@ Définit l'objet comme étant un atelier de réparation. オブジェクトを修理施設として指定しますか? 이 시설을 정비 시설로 분류합니까? - 此设施是维修设施吗? + 此设施是维修设施吗? 此設施是維修設施嗎? @@ -1728,7 +1730,7 @@ Assigne un ou plusieurs objets en tant qu'atelier de réparation. ひとつ、または複数オブジェクトに予備部品を追加 하나 혹은 여러 시설을 정비 시설로 등록합니다 - 指定一个或多个对象作为维修设施 + 指定一个或多个物体作为维修设施 指定一個或多個對象作為維修設施 @@ -1758,7 +1760,7 @@ Ajoute des pièces de rechange à un ou plusieurs objets. 一覧に追加されたオブジェクトへ予備部品を与えます。コンマで複数を指定できます。 하나 혹은 여러 물체가 예비 부품을 더합니다 - 添加备件到一个或多个对象上 + 添加备件到一个或多个物体上 添加備件到一個或多個對象上 @@ -1878,7 +1880,7 @@ Oggetti richiesti per riparare/rimuovere ruote Outils nécessaires pour le démontage ou le remplacement des roues. タイヤの除去と交換にアイテムを必要としますか? - 바퀴를 제거/교체하는데 필요한 물건 + 바퀴를 제거/교체하는데 필요한 물건을 정합니다. 需要特定物品来移除/更换车轮 需要特定物品來移除/更換車輪 @@ -1887,6 +1889,7 @@ Sonstige Reparaturbedingungen 部分修理条件 額外修理條件 + 部分全面维修条件 Exigences pour réparations diverses Requisiti di riparazione vari Požadavky pro částečnou opravu @@ -1894,12 +1897,14 @@ Requerimentos para reparo miscelâneo Requisitos de objetos misceláneos de reparación Требования к разному ремонту + 기타 수리 요구사항 Items required to repair a specific vehicle component or remove/replace tracks. Gegenstände die benötigt werden, um eine spezifische Fahrzeugkomponente oder eine Kette zu entfernen/auszutauschen. 車両の特定コンポーネントか履帯の除去/交換にアイテムを必要とします。 是否需要物品來修復一些特別載具部位或者移除/替換履帶 + 维修特定车辆部件或拆除/更换轨道所需的物品。 Outils nécessaires pour la réparation d'un équipement spécifique du véhicule, et pour le démontage ou le remplacement des chenilles. Předměty potřebné k provedení opravy konkrétní části vozidla nebo sundání/výměny pásů. Przedmioty wymagane do naprawy określonego elementu pojazdu lub usunięcia/wymiany gąsienicy. @@ -1907,12 +1912,14 @@ Objetos necesarios para reparar un componente específico del vehículo o quitar/reemplazar las orugas. Elementi necessari per riparare un componente specifico del veicolo o per rimuovere/sostituire i cingoli Предметы, необходимые для ремонта отдельных компонентов или снятия/замены гусеницы. + 차량의 궤도나 부품을 제거/교체할 때 필요한 아이템을 정합니다. Full Repair Requirements Bedingungen für vollständige Reparatur 完全修理条件 完整修復條件 + 全面维修条件 Exigences pour réparations complètes Requisiti per la riparazione completa Požadavky pro plnou opravu @@ -1920,12 +1927,14 @@ Requerimentos de Reparo Completo Requisitos para reparación completa Требования к полному ремонту + 완전 수리 요구사항 Items required to perform a full vehicle repair. Gegenstände die benötigt werden um ein Fahrzeug vollständig zu reparieren. 車両の完全修理にアイテムを必要とします。 是否需要物品來完整修復載具 + 进行全面车辆维修所需的物品。 Outils nécessaires pour effectuer une réparation complète des véhicules. Předměty potřebné k provedení plné opravy vozidla. Przedmioty wymagane do przeprowadzenia pełnej naprawy pojazdu. @@ -1933,6 +1942,7 @@ Objetos requeridos para una reparación completa Elementi necessari per eseguire una riparazione completa del veicolo. Предметы, необходимые для полного ремонта техники. + 차량 완전 수리 시 필요한 아이템을 정합니다. Engine must be off to repair @@ -1962,6 +1972,7 @@ Chenilles de rechange Náhradní pásy Orugas de repuesto + 여분 궤도 Number of spare tracks in cargo. @@ -1976,6 +1987,7 @@ Nombre de chenilles de rechange dans la cargaison. Počet náhradních pásů v nákladovém prostoru vozidla. Número de orugas de repuesto en la carga + 화물칸 안에 여분 궤도 수 Spare Wheels @@ -1990,6 +2002,7 @@ Roues de secours Náhradní kola Ruedas de repuesto + 여분 바퀴 Number of spare wheels in cargo. @@ -2004,12 +2017,13 @@ Nombre de roues de secours dans la cargaison. Počet náhradních kol v nákladovém prostoru vozidla. Número de ruedas de repuesto en la carga + 화물칸 안에 여분 바퀴 수 Auto shut off engine on repair Motor automatisch ausschalten 修理時にエンジン自動停止 - 维修时自动关闭发动机。 + 维修时自动关闭发动机 維修時自動關閉引擎 Motore spento automaticamente durante la riparazione Automatycznie wyłącz silnik podczas napraw @@ -2018,6 +2032,7 @@ Arrêt auto du moteur lors d'une réparation Automaticky vypnout motor při opravách Apagar el motor automáticamente al reparar + 수리 시 엔진 자동 끄기 Automatically shut off the engine when doing repairs. @@ -2032,6 +2047,7 @@ Coupe automatiquement le moteur lorsque des réparations sont effectuées. Automaticky vypne motor při zahájení oprav. Apagar el motor automáticamente al efectuar una reparación + 수리 시 엔진을 자동으로 끕니다. diff --git a/addons/respawn/functions/fnc_handleKilled.sqf b/addons/respawn/functions/fnc_handleKilled.sqf index 905cd7987b..75d88855b5 100644 --- a/addons/respawn/functions/fnc_handleKilled.sqf +++ b/addons/respawn/functions/fnc_handleKilled.sqf @@ -20,7 +20,7 @@ params ["_unit"]; // Saves the gear when the player! (and only him) is killed if (ACE_player == _unit && {GVAR(SavePreDeathGear)}) then { - _unit setVariable [QGVAR(unitGear), getUnitLoadout _unit]; + _unit setVariable [QGVAR(unitGear), [_unit] call CBA_fnc_getLoadout]; _unit setVariable [QGVAR(activeWeaponAndMuzzle), [currentWeapon _unit, currentMuzzle _unit, currentWeaponMode _unit]]; [QGVAR(saveGear), _unit] call CBA_fnc_localEvent; }; diff --git a/addons/respawn/functions/fnc_restoreGear.sqf b/addons/respawn/functions/fnc_restoreGear.sqf index 990fa77ea8..0a78329f98 100644 --- a/addons/respawn/functions/fnc_restoreGear.sqf +++ b/addons/respawn/functions/fnc_restoreGear.sqf @@ -21,13 +21,7 @@ TRACE_3("restoreGear",_unit, count _allGear, _activeWeaponAndMuzzle); // restore all gear if (!isNil "_allGear") then { - _allGear params ["_primaryWeaponArray"]; - if ((_primaryWeaponArray param [0, ""]) == "ACE_FakePrimaryWeapon") then { - TRACE_1("Ignoring fake gun",_primaryWeaponArray); - _allGear set [0, []]; - _activeWeaponAndMuzzle = nil; - }; - _unit setUnitLoadout _allGear; + [_unit, _allGear] call CBA_fnc_setLoadout; }; // restore the last active weapon, muzzle and weaponMode diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 558a47df02..16ceb790be 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -15,6 +15,7 @@ Znovuzrození Yeniden Doğma Reaparición + 재투입 Deploy in 5 seconds... @@ -28,8 +29,8 @@ Dispiegamento in 5 secondi... Será posicionado em 5 segundos... 設置まであと 5 秒・・・ - 5초 후 재배치... - 5秒后完成布署... + 5초 후 재투입... + 5秒后完成部署... 5秒後完成佈署... @@ -45,7 +46,7 @@ Rallypoints posicionado ラリーポイントを設置しました 집결지 배치됨 - 集合点布署完成 + 集合点部署完成 集合點佈署完成 @@ -126,7 +127,7 @@ Bod shromáždění Západ (Základna) Ponto de encontro Oeste (Base) ラリーポイント 同盟軍 (ベース) - 蓝方集合点 (基地) + 蓝方集合点(基地) 藍方集合點 (基地) 청군 집결지 (기지) @@ -142,7 +143,7 @@ Bod shromáždění Východ (Základna) Ponto de encontro Lest (Base) ラリーポイント OPFOR軍 (ベース) - 红方集合点 (基地) + 红方集合点(基地) 紅方集合點 (基地) 대항군 집결지 (기지) @@ -158,9 +159,9 @@ Bod shromáždění Nezávislý (Základna) Ponto de encontro Independente (Base) ラリーポイント 独立軍 (ベース) - 独立方集合点 (基地) + 独立方集合点(基地) 獨立方集合點 (基地) - 독립군 집결지 (기지) + 무소속군 집결지 (기지) Rallypoint West @@ -208,7 +209,7 @@ ラリーポイント 独立軍 独立方集合点 獨立方集合點 - 독립군 집결지 + 무소속군 집결지 Respawn System @@ -222,7 +223,7 @@ Возрождение Sistema Respawn リスポン システム - 재배치 시스템 + 재투입 시스템 重生系统 重生系統 @@ -239,7 +240,7 @@ Salva Equipaggiamento? 装備保存を有効化 장비를 저장합니까? - 储存装备? + 储存装备? 儲存裝備? Kıyafetleri Kaydet? @@ -255,8 +256,8 @@ Возрождать солдата с тем же снаряжением, которое было на нем при смерти? Respawna con l'equipaggiamento che il soldato aveva appena prima di morire? ユニットが死ぬ前に持っていた装備でリスポーンできるように設定できます。 - 죽기 전에 가지고 있던 장비로 재배치합니까? - 是否在重生时载入死亡前的装备? + 죽기 전에 가지고 있던 장비로 재투입합니까? + 是否在重生时载入死亡前的装备? 是否在重生時載入死亡前的裝備? @@ -272,7 +273,7 @@ Rimuovi corpi? 死体を削除 시체를 제거합니까? - 删除尸体? + 删除尸体? 刪除屍體? Bedeni Sil ? @@ -289,7 +290,7 @@ Rimuovi i corpi dei giocatori quando si disconnettono? 切断後はプレイヤーの死体を削除するかどうかを設定できます。 접속이 끊긴 플레이어의 시체를 제거합니까? - 要删除已离线的玩家尸体吗? + 要删除已离线的玩家尸体吗? 要刪除已離線的玩家屍體嗎? @@ -306,6 +307,7 @@ Časovač odstranění mrtvol Bedenin Silinme Süresi Temporizador para eliminar cuerpos + 시체 제거 타이머 This module enables you to configure ACE functionality specific to respawns. @@ -318,8 +320,8 @@ Questo modulo ti permette di configurare le funzionalità ACE specifiche dei respawn. Este módulo permite configurar parámetros relacionados con la reaparición 有効化するとリスポンへ ACE 機能を設定できます。 - 이 모듈은 ACE 재배치의 자세한 설정을 변결할 수 있게 해줍니다. - 该模块使您可以设定ACE的重生功能 + 이 모듈은 ACE 재투입의 자세한 설정을 변경할 수 있게 해줍니다. + 该模块使您可以设定 ACE 的重生功能 該模塊使您可以設定ACE的重生功能 @@ -334,8 +336,8 @@ Сообщения об огне по своим Messaggi Fuoco Amico 友軍誤射の表示 - 아군사격 메세지 - 友军误击讯息 + 아군 오인사격 메시지 + 友军误击信息 友軍誤擊訊息 @@ -349,8 +351,8 @@ Usando questo modulo nella tua missione farà in modo che ogni uccisione per fuoco amico venga mostrata in forma di messaggio in chat. El usar este módulo, todas las muertes por fuego amigo serán indicadas en el chat. もし友軍誤射による死者が出た場合は、チャットにてその旨を表示します。 - 이 모듈은 미션 중 아군사격으로 인한 사망자 발생시 채팅창에 메세지를 표시해줍니다. - 摆放此模块后,当有发生友军误击致死的事件,会显示提示讯息在聊天视窗中。 + 이 모듈은 미션 중 아군 오인사격으로 인한 사망자 발생 시 채팅창에 메시지를 표시해줍니다. + 摆放此模块后,当有发生友军误击致死的事件,会显示提示信息在聊天视窗中。 擺放此模塊後,當有發生友軍誤擊致死的事件,會顯示提示訊息在聊天視窗中 @@ -380,8 +382,8 @@ Este módulo permite usar puntos de reunión en la misión, a los que pueden teletransportarse las unidades desde la bandera de base. Requiere colocar objetos especiales en el mapa: las banderas de base y de reunión, ambas disponibles en la categoría Vacio-> Reaparición ACE Ce module vous permet d'utiliser des points de ralliement dans les missions, vers lesquels vous pouvez vous téléporter rapidement depuis le drapeau de la base.\nNécessite de placer des objets spéciaux sur la carte - base et drapeau, tous deux disponibles dans la catégorie "Vide -> ACE Réapparition". ミッションでベースから素早く移動できるラリーポイントを使えるようにします。ゲーム内に専用オブジェクトとなるベースとフラッグを設置している必要があります。両オブジェクトは Empty 下の ACE リスポンから設置できます。 - 이 모듈은 미션 중에 기지 깃발에서 집결지로 빠르게 텔레포트 시켜주는 역활을 합니다. 지도 상에 기지 및 깃발이 필요합니다. 두 가지 모두 Empty->ACE Respawn 카테고리에서 찾을 수 있습니다. - 摆放此模块后,你将能在任务中布署集合点,使你可以快速往返基地与前线。要使用本功能,请记得放上空物件->ACE 重生里面的基地与旗帜。 + 이 모듈은 미션 중에 기지 깃발에서 집결지로 빠르게 텔레포트 시켜주는 역할을 합니다. 지도 상에 기지 및 깃발이 필요합니다. 두 가지 모두 Empty->ACE Respawn 카테고리에서 찾을 수 있습니다. + 摆放此模块后,你将能在任务中部署集合点,使你可以快速往返基地与前线。要使用本功能,请记得放上空物体->ACE 重生里面的基地与旗帜。 擺放此模塊後,你將能在任務中佈署集合點,使你可以快速往返基地與前線。要使用本功能,請記得放上空物件->ACE 重生裡面的基地與旗幟 @@ -412,7 +414,7 @@ ACE Возрождение Rigenerazione ACE ACE リスポン - ACE 재배치 + ACE 재투입 ACE 重生 ACE 重生 ACE Yeniden Doğma diff --git a/addons/safemode/stringtable.xml b/addons/safemode/stringtable.xml index 9cabffca46..ebeb50a63f 100644 --- a/addons/safemode/stringtable.xml +++ b/addons/safemode/stringtable.xml @@ -14,7 +14,7 @@ Modo de segurança 安全装置 안전 모드 - 保险模式 + 保险 保險模式 Emniyet Modu diff --git a/addons/sandbag/stringtable.xml b/addons/sandbag/stringtable.xml index 15e10d39c4..b8f48606b0 100644 --- a/addons/sandbag/stringtable.xml +++ b/addons/sandbag/stringtable.xml @@ -31,7 +31,7 @@ Saco de Areia (vazio) 土のう (空) 모래주머니(비어있음) - 沙包 (空) + 沙包(空) 沙包 (空) Kum Torbası (Boş) @@ -133,7 +133,7 @@ Confirmar implantação ここで作る 설치 확인 - 确认布署 + 确认部署 確認佈署 Yerleştirmeyi Onayla @@ -150,7 +150,7 @@ Cancelar implantação 作るのを止める 설치 취소 - 取消布署 + 取消部署 取消佈署 Yerleştirmeyi İptal Et @@ -167,7 +167,7 @@ Implantar saco de areia 土のうを設置 모래주머니 설치 - 布署沙包 + 部署沙包 佈署沙包 Kum Torbasını Yerleştir diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index eae39deffd..af79a5fe3c 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -25,7 +25,7 @@ Włącz ustawienia celowników optycznych ACE Activer le réglage ACE des lunettes Abilita Regolazione mirino ACE - 开启ACE瞄准镜归零调节 + 开启 ACE 瞄准镜归零调节 開啟ACE瞄準鏡歸零調節 Включить настройку прицелов ACE Permitir ajustes de Mira do ACE @@ -126,7 +126,7 @@ Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes Nutzt die Einstellung 'defaultZeroRange' um Zielfernrohre anzupassen 'defaultZeroRange'設定を使う高倍率スコープのゼロイン距離を上書きします - 기존 고성능 조준경의 영점거리에 '기본설정 영점거리' 를 덮어씌웁니다 + 기존 고성능 조준경의 영점거리에 'defaultZeroRange'를 덮어씌웁니다 Używa 'defaultZeroRange' zamiast ustawionej odległości zerowania dla celowników o duzym przybliżeniu Utilise le paramètre "Distance de zérotage par défaut" pour remplacer la distance de zérotage des lunettes de visée à fort grossissement. Usa le impostazioni di "defaultZeroRange" (Portata Zero Predefinita) per sovrascrivere la portata zero dei mirini a lunga gittata @@ -171,7 +171,7 @@ Reference temperature Bezugstemperatur 温度の参照 - 온도 기준 + 기준 온도 Referencyjna temperatura Température de référence Temperatura di riferimento @@ -190,7 +190,7 @@ Temperatura, przy której celownik został wyzerowany Température de référence pour le zérotage des lunettes. Temperatura a cui è stato azzerato il mirino - 武器参考多少温度来进行归零. + 武器参考多少温度来进行归零。 武器參考多少溫度來進行歸零. Температура, при которой выполнена пристрелка прицела Temperatura na qual a mira foi zerada. @@ -201,7 +201,7 @@ Reference barometric pressure Bezugsluftdruck 気圧の参照 - 기압 기준 + 기준 기압 Referencyjne ciśnienie barometryczne Pression barométrique de référence Pressione barometrica di riferimento @@ -231,7 +231,7 @@ Reference humidity Bezugsluftfeuchtigkeit 湿度の参照 - 습도 기준 + 기준 습도 Referencyjna wilgotność Humidité de référence Umidità di riferimento @@ -292,7 +292,7 @@ Vorheriges UI verwenden Usa UI precedente 使用舊版介面 - 使用旧版介面 + 使用旧版界面 昔の UI を使用 기존 UI 사용 Wykorzystaj legacy UI @@ -322,7 +322,7 @@ Vereinfachte Nullung 簡略なゼロイン Azzeramento semplificato - 단순화 된 영점 조정 + 단순화된 영점 조정 簡單歸零 简单归零 Uproszczone zerowanie @@ -337,9 +337,9 @@ Repliziert das Vanilla-Zeroing-System für Zielfernrohre. 標準で使われるライフルスコープ用のゼロイン システムを複製します。 Replica il sistema di azzeramento vanilla per le ottiche. - 라이플스코프 용 바닐라 영점조정 시스템을 복제합니다. + 라이플 스코프용 바닐라 영점조정 시스템을 복제합니다. 使用原版的歸零系統來取代ACE複雜的歸零模擬。 - 使用原版的归零系统来取代ACE复杂的归零模拟。 + 使用原版的归零系统来取代 ACE 复杂的归零模拟。 Replikuje system zerowania, dla celowników karabinowych, z domyślnej gry. Использует ванильную систему прицеливания для прицелов Imita o sistema de zeramento vanilla para miras de rifle. @@ -391,7 +391,7 @@ Pequeno ajuste para direita Korekce doprava (mírně) 僅かに右へ調節 - 오론쪽으로 조절 + 오른쪽으로 조절 向右微调 向右微調 @@ -529,7 +529,7 @@ %1D %1D %1D - %1D + %1하 %1D %1D %1D @@ -545,7 +545,7 @@ %1L %1L %1L - %1L + %1좌 %1L %1L %1L @@ -561,7 +561,7 @@ %1R %1R %1R - %1R + %1우 %1R %1R %1R @@ -573,6 +573,7 @@ Horizontal limits Horizontale Grenzen 水平限制 + 水平限制 水平制限 Limite orrizontale Limit poziomy @@ -581,11 +582,13 @@ Limites horizontales Horizontální limity Límites horizontales + 수평 한계 Vertical limits Vertikale Grenzen 垂直限制 + 垂直限制 垂直制限 Limite verticale Limit pionowy @@ -594,6 +597,7 @@ Limites verticales Vertikální limity Límites verticales + 수직 한계 diff --git a/addons/sitting/functions/fnc_sit.sqf b/addons/sitting/functions/fnc_sit.sqf index 144607b2b7..a8fe2ccf6c 100644 --- a/addons/sitting/functions/fnc_sit.sqf +++ b/addons/sitting/functions/fnc_sit.sqf @@ -37,7 +37,7 @@ private _actionID = _player addAction [ ]; // Read config -private _configFile = configFile >> "CfgVehicles" >> typeOf _seat; +private _configFile = configOf _seat; private _sitDirection = (getDir _seat) + (_seat getVariable [QXGVAR(sitDirection), getNumber (_configFile >> QXGVAR(sitDirection))]); private _sitPositionAll = _seat getVariable [QXGVAR(sitPosition), getArray (_configFile >> QXGVAR(sitPosition))]; private _multiSitting = (_sitPositionAll select 0) isEqualType []; diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index ac11613dfd..9ec35ef8b8 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -81,7 +81,7 @@ Этот модуль позволяет вам запретить возможность садиться на стулья и туалеты. Questo modulo ti permette di disabilitare la possibilità di sederti sulle sedie. モジュールでは椅子に着席するのを無効化できます。 - 이 모듈을 사용하여 의자에 앉을 수 있는 기능을 비활성 할 수 있습니다. + 이 모듈을 사용하여 의자에 앉을 수 있는 기능을 비활성화할 수 있습니다. 此模块可以让你开关在椅子上坐下的能力。 此模塊可以讓你開關在椅子上坐下的能力。 Bu modül, sandalyelere oturma özelliğini devre dışı bırakmanıza izin verir. diff --git a/addons/slideshow/CfgVehicles.hpp b/addons/slideshow/CfgVehicles.hpp index 6c11ba866c..c7c0687913 100644 --- a/addons/slideshow/CfgVehicles.hpp +++ b/addons/slideshow/CfgVehicles.hpp @@ -47,6 +47,12 @@ class CfgVehicles { typeName = "NUMBER"; defaultValue = 0; }; + class Selection { + displayName = CSTRING(Selection_DisplayName); + description = CSTRING(Selection_Description); + typeName = "NUMBER"; + defaultValue = 0; + }; }; class ModuleDescription { description = CSTRING(Description); diff --git a/addons/slideshow/functions/fnc_addSlideActions.sqf b/addons/slideshow/functions/fnc_addSlideActions.sqf index 6416c35748..29997861e5 100644 --- a/addons/slideshow/functions/fnc_addSlideActions.sqf +++ b/addons/slideshow/functions/fnc_addSlideActions.sqf @@ -9,6 +9,7 @@ * 2: Names * 3: Controller * 4: Current Slideshow + * 5: Texture Selection (default: 0) * * Return Value: * List of actions @@ -19,7 +20,7 @@ * Public: No */ -params ["_objects", "_images", "_names", "_controller", "_currentSlideshow"]; +params ["_objects", "_images", "_names", "_controller", "_currentSlideshow", ["_selection", 0]]; private _actions = []; { @@ -30,15 +31,15 @@ private _actions = []; _names select _forEachIndex, "", { - (_this select 2) params ["_objects", "_image", "_currentSlideshow"]; + (_this select 2) params ["_objects", "_image", "_currentSlideshow", "_selection"]; { - _x setObjectTextureGlobal [0, _image] + _x setObjectTextureGlobal [_selection, _image] } count _objects; [QGVAR(slideChanged), [_image, _currentSlideshow]] call CBA_fnc_localEvent; }, {true}, {}, - [_objects, _x, _currentSlideshow] + [_objects, _x, _currentSlideshow, _selection] ] call EFUNC(interact_menu,createAction), [], _controller diff --git a/addons/slideshow/functions/fnc_autoTransition.sqf b/addons/slideshow/functions/fnc_autoTransition.sqf index 87fe488754..f57abdd8df 100644 --- a/addons/slideshow/functions/fnc_autoTransition.sqf +++ b/addons/slideshow/functions/fnc_autoTransition.sqf @@ -9,17 +9,18 @@ * 2: State Variable Name * 3: Current Slideshow * 4: Duration (0 disables automatic transitions) + * 5: Texture Selection * * Return Value: * None * * Example: - * [objects, images, "ace_slideshow_slideshow1", duration] call ace_slideshow_fnc_autoTransition + * [objects, images, "ace_slideshow_slideshow1", duration, selection] call ace_slideshow_fnc_autoTransition * * Public: No */ -params ["_objects", "_images", "_varString", "_currentSlideshow", "_duration"]; +params ["_objects", "_images", "_varString", "_currentSlideshow", "_duration", "_selection"]; // Get current slide number of this slideshow private _currentSlide = missionNamespace getVariable [_varString, 0]; @@ -34,11 +35,11 @@ private _image = _images select _currentSlide; // Set slide { - _x setObjectTextureGlobal [0, _image]; + _x setObjectTextureGlobal [_selection, _image]; } count _objects; [QGVAR(slideChanged), [_image, _currentSlideshow]] call CBA_fnc_localEvent; // Log current slide and execute Next slide TRACE_4("Auto-transition",_image,_currentSlide,count _images,_duration); -[FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration], _duration] call CBA_fnc_waitAndExecute; +[FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration, _selection], _duration] call CBA_fnc_waitAndExecute; diff --git a/addons/slideshow/functions/fnc_createSlideshow.sqf b/addons/slideshow/functions/fnc_createSlideshow.sqf index 0d84fa969b..841365d4c4 100644 --- a/addons/slideshow/functions/fnc_createSlideshow.sqf +++ b/addons/slideshow/functions/fnc_createSlideshow.sqf @@ -10,6 +10,7 @@ * 3: Action Names * 4: Slide Duration (0 disables automatic transitions) * 5: Set Name (default: localized "Slides") + * 6: Texture Selection (default: 0) * * Return Value: * Slideshow ID @@ -26,7 +27,8 @@ params [ ["_images", [], [[]] ], ["_names", [], [[]] ], ["_duration", 0, [0]], - ["_setName", localize LSTRING(Interaction), [""]] + ["_setName", localize LSTRING(Interaction), [""]], + ["_selection", 0, [0]] ]; // Verify data @@ -47,7 +49,7 @@ TRACE_5("Information",_objects,_controllers,_images,_names,_setName); if (isServer) then { // Default images on whiteboards (first image) { - _x setObjectTextureGlobal [0, _images select 0]; + _x setObjectTextureGlobal [_selection, _images select 0]; } count _objects; }; @@ -82,7 +84,7 @@ if (_duration == 0) then { {}, {true}, {(_this select 2) call FUNC(addSlideActions)}, - [_objects, _images, _names, _x, _currentSlideshow], + [_objects, _images, _names, _x, _currentSlideshow, _selection], [0, 0, 0], 2 ] call EFUNC(interact_menu,createAction); @@ -100,7 +102,7 @@ if (_duration == 0) then { missionNamespace setVariable [_varString, 0]; // Automatic transitions handler - [FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration], _duration] call CBA_fnc_waitAndExecute; + [FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration, _selection], _duration] call CBA_fnc_waitAndExecute; }; _currentSlideshow diff --git a/addons/slideshow/functions/fnc_moduleInit.sqf b/addons/slideshow/functions/fnc_moduleInit.sqf index a8cf27ceec..783f1de720 100644 --- a/addons/slideshow/functions/fnc_moduleInit.sqf +++ b/addons/slideshow/functions/fnc_moduleInit.sqf @@ -32,6 +32,7 @@ private _images = [_logic getVariable ["Images", ""], false, false] call EFUNC(c private _names = [_logic getVariable ["Names", ""], false, false] call EFUNC(common,parseList); private _setName = _logic getVariable ["SetName", ""]; private _duration = _logic getVariable ["Duration", 0]; +private _selection = _logic getVariable ["Selection", 0]; // Objects synced to the module { @@ -40,6 +41,6 @@ private _duration = _logic getVariable ["Duration", 0]; } count (synchronizedObjects _logic); // Prepare with actions -[_objects, _controllers, _images, _names, _duration, _setName] call FUNC(createSlideshow); +[_objects, _controllers, _images, _names, _duration, _setName, _selection] call FUNC(createSlideshow); INFO_1("Slideshow Module Initialized on %1 Objects",(count _objects)); diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 10adfc6457..7affe102b1 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -30,9 +30,9 @@ Tento modul umožňuje nastavit prezentaci na různé objekty. Jeden modul na seznam s obrázky. Podporované jsou pouze objekty s hiddenSelection 0. Questo modulo ti permette di creare una presentazione con diapositive su vari oggetti. Un modulo per lista immagini. Solo oggetti con hiddenSelection 0 sono supportati. さまざまなオブジェクトへスライドショーを設定することができます。1つのモジュールは各画像リストになっています。オブジェクトが hiddenSelection 0へ対応している必要があります。 - 이 모듈은 다른 물체에 대해 슬라이드 쇼를 놓을 수 있게 해줍니다. 한 모듈당 한 이미지목록만 가능합니다. 또한 물체가 hiddenSelection 0 를 지원해야만합니다. + 이 모듈은 다른 물체에 대해 슬라이드 쇼를 놓을 수 있게 해줍니다. 한 모듈 당 한 이미지 목록만 가능합니다. 또한 hiddenSelection 0가 있는 물체만 지원됩니다. 此模塊可讓圖片以幻燈片的形式顯示在物件上,每個模塊都能設定一串幻燈片清單,被設定的物件不能有隱藏部位(hiddenSelection) - 此模块可让图片以幻灯片的形式显示在物件上,每个模块都能设定一串幻灯片清单,被设定的物件不能有隐藏部位(hiddenSelection) + 此模块可让图片以幻灯片的形式显示在物体上,每个模块都能设定一串幻灯片清单,被设定的物件不能有隐藏部位(hiddenSelection) Objects @@ -48,7 +48,7 @@ オブジェクト 물체 物件 - 物件 + 物体 Objeler @@ -65,7 +65,7 @@ スライドショーを表示するオブジェクト名 (オブジェクトとの同期も可)。複数ある場合はコンマで区切れます 슬라이드 쇼가 보여질 물체(동기화 되는 물체도 가능합니다) 명칭, 다수의 경우 쉼표로 구분합니다. 物件名稱 (也可使用同步線來設定),幻燈片將會顯示在該物件上,如有多個物件,請以逗號作區隔 - 物件名称 (也可使用同步线来设定),幻灯片将会显示在该物件上,如有多个物件,请以逗号作区隔 + 物体名称(也可使用同步线来设定),幻灯片将会显示在该物件上,如有多个物件,请以逗号作区隔 Controllers @@ -97,7 +97,7 @@ コントローラに指定するオブジェクト名を記入し、複数ある場合はコンマで区切れます。 조종 장치 물체 명칭, 다수의 경우 쉼표로 구분됩니다. 指定是控制器的物件名稱,如有多個物件,請以逗號作區隔 - 指定是控制器的物件名称,如有多个物件,请以逗号作区隔 + 指定是控制器的物体名称,如有多个物件,请以逗号作区隔 Jména kontrolních objektů, v případě více oddělená čárkami. @@ -131,7 +131,7 @@ 完全なパスでスライドショーに使う画像一覧を入力してください。コンマで区別できます。(例: images\image.paa) 슬라이드 쇼에 쓰일 사진목록입니다, 쉼표로 구분됩니다, 경로설정을 정확히 하십시요. (예: 사진\사진.ppa) 要做為幻燈片的圖片清單,每個圖片請已逗號區隔,並輸入完整路徑位址 (例如:images\image.paa) - 要做为幻灯片的图片清单,每个图片请已逗号区隔,并输入完整路径位址 (例如:images\image.paa) + 要做为幻灯片的图片清单,每个图片请已逗号区隔,并输入完整路径位址(例如:images\image.paa) Interaction Names @@ -160,7 +160,7 @@ Lista di nomi che verranno usati per per le interazioni, separati da virgole, in ordine per immagini. Liste aller Namen, die für Interaktionseinträge genutzt werden. Mit Kommata getrennt, in Reihenfolge der Bilder. 画像を操作できるインタラクション エントリ名の一覧を入力してください。コンマで区切り複数を指定できます。 - 상호작용 메세지에 쓰일 명칭입니다, 쉼표로 구분합니다, 이미지의 순서입니다. + 상호작용 메시지에 쓰일 명칭입니다, 쉼표로 구분합니다, 이미지의 순서입니다. 設定互動鍵切換圖片時的按鈕名稱,多個按鈕請以逗號做區隔,有多少圖片就輸入多少個按鈕,以利切換圖片 设定互动键切换图片时的按钮名称,多个按钮请以逗号做区隔,有多少图片就输入多少个按钮,以利切换图片 Seznam jmen které budou použity pro interakce, oddělené čárkami, v pořadí obrázků. @@ -188,8 +188,8 @@ Nom qui sera utilisé pour l'entrée d'interaction principale (pour distinguer plusieurs diaporamas). Valeur par défaut : "Slides". Nome che sarà utilizzato per le principali interazioni (per distinguere le multiple diapositive). Predefinito: "Slides" 設定該幻燈片的標題名稱 (用來區分多個不同標題的幻燈片) 預設名稱: "幻燈片" - 设定该幻灯片的标题名称 (用来区分多个不同标题的幻灯片) 预设名称: "幻灯片" - 상위 상호작용 이름 (여러개의 슬라이드 쇼를 구분하기 위해 사용됨) 기본: "Slides" + 设定该幻灯片的标题名称(用来区分多个不同标题的幻灯片)预设名称:"幻灯片" + 상위 상호작용 이름 (여러 개의 슬라이드 쇼를 구분하기 위해 사용됨) 기본: "Slides" Имя, которое будет использоваться для основных взаимодействий (для различения нескольких слайдов). По умолчанию: «Slides» Nome que será usado para a entrada principal de interação (para separar vários slideshows). Padrão: "Slides" Jméno, které bude použito pro hlavní interakci (pro rozlišení více prezentací). Standard: Snímky @@ -207,7 +207,7 @@ Durata Diapositiva Länge der Diavorführung pro Bild スライドの持続時間 - 슬라이드 지속시간 + 슬라이드 지속 시간 幻燈片顯示時間 幻灯片显示时间 @@ -223,9 +223,27 @@ Durata di ogni diapositiva. Default: 0 (Transizioni Automatiche Disabilitate) Länge der Diavorführung pro Bild. Standard: 0 (Automatischer Wechsel deaktiviert) 各スライドの持続時間。標準:0 (自動的な切り替えは無効) - 매 슬라이드의 지속시간. 기본설정: 0 (자동 전환 비활성화) + 매 슬라이드의 지속 시간. 기본설정: 0 (자동 전환 비활성화) 每張幻燈片顯示的時間。 預設:0 (自動換圖已禁用) - 每张幻灯片显示的时间。 预设:0 (自动换图已禁用) + 每张幻灯片显示的时间。 预设:0(自动换图已禁用) + + + Texture Selection + 纹理选择 + 텍스쳐 선택 + 텍스쳐 선택 + Auswahl der Textur + Wybór Tekstury + テクスチャの選択 + + + Object texture selection. Default: 0 + 物体纹理选择(默认:0) + 개체 텍스처 선택(기본값: 0) + 물체의 텍스쳐를 선택합니다. 기본: 0 + Auswahl der Objekttextur. Standard: 0 + Wybór tekstury obiektu. Domyślnie: 0 + オブジェクトテクスチャの選択。デフォルト: 0 Slides diff --git a/addons/smallarms/stringtable.xml b/addons/smallarms/stringtable.xml index 2277426d78..71a1ecb615 100644 --- a/addons/smallarms/stringtable.xml +++ b/addons/smallarms/stringtable.xml @@ -13,7 +13,7 @@ 9 mm, 17ks zásobník Carregador 17Mun. 9 mm 9mm 17발 탄창 - 9 毫米 17 发弹匣 + 9 mm 17发 弹匣 9mm 17Rnd マガジン 9 mm 17 Merm. Şarjör @@ -27,6 +27,8 @@ .45 ACP, 25ks zásobník .45 ACP 25 Merm. Şarjör .45 ACP 25Rnd マガジン + .45 ACP 25发 弹匣 + .45 ACP 25발 탄창 .45 ACP 25Rnd Tracers (Green) Mag @@ -38,6 +40,8 @@ .45 ACP, 25ks zásobník stopovky (zelené) .45 ACP 25 Merm. İzli (Yeşil) Şarjör .45 ACP 25Rnd 曳光弾 (緑) マガジン + .45 ACP 25发 弹匣(曳光,绿) + .45 ACP 25발 예광탄 (초록) 탄창 .45 ACP 25Rnd Tracers (Red) Mag @@ -49,6 +53,8 @@ .45 ACP, 25ks zásobník stopovky (červené) .45 ACP 25 Merm. İzli (Kırmızı) Şarjör .45 ACP 25Rnd 曳光弾 (赤) マガジン + .45 ACP 25发 弹匣(曳光,红) + .45 ACP 25발 예광탄 (빨강) 탄창 .45 ACP 25Rnd Tracers (Yellow) Mag @@ -60,6 +66,8 @@ .45 ACP, 25ks zásobník stopovky (žluté) .45 ACP 25 Merm. İzli (Sarı) Şarjör .45 ACP 25Rnd 曳光弾 (黄) マガジン + .45 ACP 25发 弹匣(曳光,黄) + .45 ACP 25발 예광탄 (노랑) 탄창 .45 ACP 8Rnd Mag @@ -71,6 +79,8 @@ .45 ACP, 8ks zásobník .45 ACP 8 Merm. Şarjör .45 ACP 8Rnd マガジン + .45 ACP 8发 弹匣 + .45 ACP 8발 탄창 .45 ACP 15Rnd Mag @@ -82,6 +92,8 @@ .45 ACP, 15ks zásobník .45 ACP 15 Merm. Şarjör .45 ACP 15Rnd マガジン + .45 ACP 15发 弹匣 + .45 ACP 15발 탄창 diff --git a/addons/spectator/README.md b/addons/spectator/README.md index 17d0c7b1f5..18cf2e585d 100644 --- a/addons/spectator/README.md +++ b/addons/spectator/README.md @@ -5,5 +5,5 @@ 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 +For more information, see: http://ace3.acemod.org/wiki/feature/spectator.html diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 5467eb6cc3..3ac20c24e7 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -54,7 +54,7 @@ AI にも有効化 AI Abilitate 可觀察AI - 可观察AI + 可观察 AI AI 활성 IA visible SI Aktywowane @@ -70,8 +70,8 @@ スペクテイターで AI 視点を可能に Permette la visibilità delle AI in spettatore 開啟此功能後可在觀察者模式下觀察AI單位 - 开启此功能后可在观察者模式下观察AI单位。 - 관전자가 AI를 관전 할 수 있습니다. + 开启此功能后可在观察者模式下观察 AI 单位。 + 관전자가 AI를 관전할 수 있습니다. Rend les unités IA visibles en spectateur. Spraw, aby SI było widoczne jako obserwator Сделать ИИ видимыми в режиме зрителя @@ -136,7 +136,7 @@ 1PP und 3PP 1. a 3. osoby 1ª e 3ª pessoa - 1PP 과 3PP 카메라 + 1인칭과 3인칭 카메라 一人称と三人称 第一人稱與第三人稱 第一人称与第三人称 @@ -212,11 +212,13 @@ 最大追随距離 Distância Máxima de Acompanhamento 最大跟隨距離 + 最大跟随距离 Distance maximale de suivi Distanza massima per seguire Maximální vzdálenost sledování objektu Maksymalna odległość śledzenia Distancia máxima de seguimiento + 최대 추적 거리 Maximum distance the follow camera can be from the target @@ -225,11 +227,13 @@ カメラが目標へ追随できる最大距離を決定できます。 A distância máxima que a câmera de acompanhamento pode estar do alvo. 攝影機能追隨目標的最大距離 + 摄影机能追随目标的最大距离 Distanza massima che la telecamera seguente può percorrere dall'obiettivo Distance maximale à laquelle la caméra de suivi peut se trouver par rapport à la cible. Maximální vzdálenost při které může kamera sledovat cíl Maksymalna odległość na jakiej kamera może podążać od celu Distancia máxima que la cámara de seguimiento puede estar del objetivo + 카메라가 목표를 따라갈 수 있는 최대 거리를 설정합니다. @@ -259,7 +263,7 @@ Libera Libre 自由視点 - 자유 + 자유시점 自由模式 自由模式 Serbest @@ -275,7 +279,7 @@ Normale Normale 通常 - 정상 + 일반 正常 正常 Normal diff --git a/addons/spottingscope/XEH_preInit.sqf b/addons/spottingscope/XEH_preInit.sqf index 79c7ec515b..568b6c2e4a 100644 --- a/addons/spottingscope/XEH_preInit.sqf +++ b/addons/spottingscope/XEH_preInit.sqf @@ -11,7 +11,7 @@ PREP_RECOMPILE_END; private _tube = "ACE_SpottingScope_tube" createVehicle [0,0,0]; _tube setDir (getDir _wreck - 180); - _tube setPosASL _wreck modelToWorldWorld (_wreck selectionPosition "destructionEffect"); + _tube setPosASL (_wreck modelToWorldWorld (_wreck selectionPosition "destructionEffect")); _tube setVelocity [1 - random 2, 1 - random 2, 4]; _tube addTorque (vectorNormalized [1 - random 2, 1 - random 2, 1 - random 2] vectorMultiply 4); }] call CBA_fnc_addClassEventHandler; diff --git a/addons/spottingscope/stringtable.xml b/addons/spottingscope/stringtable.xml index 1eb19396b6..e6afd17003 100644 --- a/addons/spottingscope/stringtable.xml +++ b/addons/spottingscope/stringtable.xml @@ -47,7 +47,7 @@ Megfigy. távcső elhelyezése Colocar luneta de observador 観測用スコープを置く - 감적 망원경 배치 + 감적 망원경 놓기 放置观测镜 放置觀測鏡 Gözcü Dürbününü Yerleştir diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index c343718f13..f449a7510c 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -5,9 +5,9 @@ Switch Units Cambia Unità 切換單位 - 切换单位 + 单位切换 ユニット切り替え - 병력 전환 + 유닛 변경 Einheitenwechsel Przełącz Jednostki Переключение юнитов @@ -31,7 +31,7 @@ ユニットを切り替え 切换单位 切換單位 - 인원 전환 + 유닛 변경됨 Birlik Değiştirildi @@ -71,12 +71,14 @@ Ermögliche Seitenwechsel Permettre le changement de camp 啟用陣營切換 + 启用阵营切换 Povolit změnu strany Włącz zmiane strony Habilita troca de time 陣営切り替えを有効化 Включить смену стороны Habilitar cambio de bando + 진영 변경 활성화 Switch to West? @@ -90,9 +92,9 @@ На синих? Cambia per BLUFOR? 同盟軍へ切り替え許可 - 切换至蓝方? + 切换至蓝方? 切換至藍方? - 청군으로 전환합니까? + 청군으로 변경합니까? Batıya Geç? @@ -107,9 +109,9 @@ Разрешить переключаться на синих юнитов? Consenti passaggio ad unità BLUFOR? 同盟軍側ユニットへ切り替えられるようにします。 - 允许切换至蓝方? + 允许切换至蓝方? 允許切換至藍方? - 청군 인원으로 전환합니까? + 청군 인원으로 변경하는 것을 허락합니까? Switch to East? @@ -123,9 +125,9 @@ На красных? Cambia per OPFOR? OPFOR軍側へ切り替え許可 - 切换至红方? + 切换至红方? 切換至紅方? - 대항군으로 전환합니까? + 대항군으로 변경합니까? Doğuya Geç ? @@ -140,9 +142,9 @@ Разрешить переключаться на красных юнитов? Consenti passaggio ad unità OPFOR? OPFOR軍側ユニットへ切り替えられるようにします。 - 允许切换至红方? + 允许切换至红方? 允許切換至紅方? - 대항군 인원으로 전환합니까? + 대항군 인원으로 변경하는 것을 허락합니까? Switch to Independent? @@ -156,9 +158,9 @@ На независимых? Cambia per INDFOR? 独立軍へ切り替え許可 - 切换至独立方? + 切换至独立方? 切換至獨立方? - 독립군 으로 전환합니까? + 무소속군으로 전환합니까? Bağımsıza Geç? @@ -173,9 +175,9 @@ Разрешить переключаться на независимых юнитов? Consenti passaggio ad unità INDFOR? 独立軍側ユニットへ切り替えられるようにします。 - 允许切换至独立方? + 允许切换至独立方? 允許切換至獨立方? - 독립군 인원으로 전환합니까? + 무소속군 인원으로 변경하는 것을 허락합니까? Switch to Civilian? @@ -190,7 +192,7 @@ Cambia per Civili? 市民へ切り替え許可 민간인으로 전환합니까? - 切换至平民方? + 切换至平民方? 切換至平民方? Sivillere Geç? @@ -206,8 +208,8 @@ Разрешить переключаться на гражданских юнитов? Consenti passaggio ad unità civili? 市民側ユニットへ切り替えられるようにします。 - 민간인으로 전환하는걸 허가합니까? - 允许切换至平民方? + 민간인으로 변경하는걸 허가합니까? + 允许切换至平民方? 允許切換至平民方? @@ -222,8 +224,8 @@ Безопасная зона Abilita Zona Sicura? 安全地帯を有効化 - 안전 지대 활성화? - 启用安全区? + 안전지대 활성화 + 启用安全区? 啟用安全區? @@ -238,8 +240,8 @@ Включить безопасную зону вокруг вражеских юнитов? Игроки не могут переключаться на юнитов, находящихся в безопасной зоне. Abilita una zona sicura attorno ad unità nemiche? I giocatori non possono cambiare ad unità dentro la zona sicura. 敵ユニットから逃れる安全地帯を生成できます。プレイヤーは安全地帯内のユニットへ切り替えできません。 - 적 주위로 안전 지대를 활성화합니까? 안전 지대 내에서는 플레이어가 인원 전환을 할 수 없습니다. - 启用敌方周围安全地带? 玩家不能切换到安全区内的单位 + 적 주위로 안전지대를 활성화합니까? 안전지대 내에서는 플레이어가 인원 전환을 할 수 없습니다. + 启用敌方周围安全地带? 玩家不能切换到安全区内的单位 啟用敵方周圍安全地帶? 玩家不能切換到安全區內的單位 @@ -254,7 +256,7 @@ Радиус безопасной зоны Raggio Zona Sicura 安全地帯の半径 - 안전 지대 반경 + 안전지대 반경 安全区半径 安全區半徑 diff --git a/addons/tacticalladder/stringtable.xml b/addons/tacticalladder/stringtable.xml index 190616685e..8cd2f5266d 100644 --- a/addons/tacticalladder/stringtable.xml +++ b/addons/tacticalladder/stringtable.xml @@ -12,8 +12,8 @@ Scala Telescopica Teleszkopikus létra Escada telescópica - タクティカル ラダー - 로프 사다리 + 伸縮はしご + 접이식 사다리 伸缩梯子 伸縮梯子 Katlanabilir Merdiven @@ -29,9 +29,9 @@ Piazza scala Létra lerakása Implantar escada - ラダーを設置 + はしごを設置 사다리 배치 - 布署梯子 + 部署梯子 佈署梯子 Merdiveni Konuşlandır @@ -46,8 +46,8 @@ Lascia scala Létra eldobása Derrubar escada - ラダーを落とす - 사다리 놓기 + はしごを落とす + 사다리 내려놓기 降下梯子 降下梯子 Merdiveni Bırak @@ -79,7 +79,7 @@ +Ctrl incliner +Ctrl per inclinare +Ctrl で傾ける - +컨트롤키 기울이기 + +컨트롤 키 기울이기 +Ctrl 倾斜 +Ctrl 傾斜 @@ -94,8 +94,8 @@ Posiziona scala Létra elhelyezése Posicionar escada - ラダーの位置 - 사다리 위치 + はしごの位置 + 사다리 설치 梯子位置 梯子位置 Merdiveni Taşı @@ -111,7 +111,7 @@ Prendi scala Létra felvétele Pegar escada - ラダーを拾う + はしごを拾う 사다리 줍기 捡起梯子 撿起梯子 diff --git a/addons/tagging/ACE_Tags.hpp b/addons/tagging/ACE_Tags.hpp index 78762cf888..1c739897ba 100644 --- a/addons/tagging/ACE_Tags.hpp +++ b/addons/tagging/ACE_Tags.hpp @@ -1,26 +1,78 @@ +#define GLUE(g1,g2) g1##g2 +#define TAG(name,col) class TRIPLES(ACE,name,col) { \ + displayName = CSTRING(name); \ + requiredItem = QUOTE(GLUE(ACE_Spraypaint,col)); \ + textures[] = {QPATHTOF(UI\tags\col\name.paa)}; \ + icon = QPATHTOF(UI\tags\col\name.paa); \ + } \ + class ACE_Tags { class ACE_XBlack { displayName = CSTRING(XBlack); requiredItem = "ACE_SpraypaintBlack"; textures[] = {QPATHTOF(UI\tags\black\0.paa), QPATHTOF(UI\tags\black\1.paa), QPATHTOF(UI\tags\black\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingBlack.paa); + icon = QPATHTOF(UI\tags\black\0.paa); }; class ACE_XRed { displayName = CSTRING(XRed); requiredItem = "ACE_SpraypaintRed"; textures[] = {QPATHTOF(UI\tags\red\0.paa), QPATHTOF(UI\tags\red\1.paa), QPATHTOF(UI\tags\red\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingRed.paa); + icon = QPATHTOF(UI\tags\red\0.paa); }; class ACE_XGreen { displayName = CSTRING(XGreen); requiredItem = "ACE_SpraypaintGreen"; textures[] = {QPATHTOF(UI\tags\green\0.paa), QPATHTOF(UI\tags\green\1.paa), QPATHTOF(UI\tags\green\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingGreen.paa); + icon = QPATHTOF(UI\tags\green\0.paa); }; class ACE_XBlue { displayName = CSTRING(XBlue); requiredItem = "ACE_SpraypaintBlue"; textures[] = {QPATHTOF(UI\tags\blue\0.paa), QPATHTOF(UI\tags\blue\1.paa), QPATHTOF(UI\tags\blue\2.paa)}; - icon = QPATHTOF(UI\icons\iconTaggingBlue.paa); + icon = QPATHTOF(UI\tags\blue\0.paa); }; + + TAG(arrow_up,Black); + TAG(arrow_down,Black); + TAG(arrow_left,Black); + TAG(arrow_right,Black); + TAG(circle,Black); + TAG(cross,Black); + TAG(diamond,Black); + TAG(square,Black); + TAG(triangle,Black); + TAG(triangle_inverted,Black); + + TAG(arrow_up,Blue); + TAG(arrow_down,Blue); + TAG(arrow_left,Blue); + TAG(arrow_right,Blue); + TAG(circle,Blue); + TAG(cross,Blue); + TAG(diamond,Blue); + TAG(square,Blue); + TAG(triangle,Blue); + TAG(triangle_inverted,Blue); + + TAG(arrow_up,Green); + TAG(arrow_down,Green); + TAG(arrow_left,Green); + TAG(arrow_right,Green); + TAG(circle,Green); + TAG(cross,Green); + TAG(diamond,Green); + TAG(square,Green); + TAG(triangle,Green); + TAG(triangle_inverted,Green); + + TAG(arrow_up,Red); + TAG(arrow_down,Red); + TAG(arrow_left,Red); + TAG(arrow_right,Red); + TAG(circle,Red); + TAG(cross,Red); + TAG(diamond,Red); + TAG(square,Red); + TAG(triangle,Red); + TAG(triangle_inverted,Red); }; diff --git a/addons/tagging/CfgVehicles.hpp b/addons/tagging/CfgVehicles.hpp index 204e902641..8eef5c004c 100644 --- a/addons/tagging/CfgVehicles.hpp +++ b/addons/tagging/CfgVehicles.hpp @@ -53,6 +53,17 @@ class CfgVehicles { }; }; + class LandVehicle; + class Car: LandVehicle { + GVAR(canTag) = 1; + }; + class Tank: LandVehicle { + GVAR(canTag) = 1; + }; + class Air; + class Helicopter: Air { + GVAR(canTag) = 1; + }; class Item_Base_F; class ACE_Item_SpraypaintBlack: Item_Base_F { diff --git a/addons/tagging/UI/tags/black/arrow_down.paa b/addons/tagging/UI/tags/black/arrow_down.paa new file mode 100644 index 0000000000..cdaabc04ee Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/black/arrow_left.paa b/addons/tagging/UI/tags/black/arrow_left.paa new file mode 100644 index 0000000000..caa40c3c51 Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/black/arrow_right.paa b/addons/tagging/UI/tags/black/arrow_right.paa new file mode 100644 index 0000000000..da015c37cf Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/black/arrow_up.paa b/addons/tagging/UI/tags/black/arrow_up.paa new file mode 100644 index 0000000000..575aeaea92 Binary files /dev/null and b/addons/tagging/UI/tags/black/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/black/circle.paa b/addons/tagging/UI/tags/black/circle.paa new file mode 100644 index 0000000000..c89cf93306 Binary files /dev/null and b/addons/tagging/UI/tags/black/circle.paa differ diff --git a/addons/tagging/UI/tags/black/cross.paa b/addons/tagging/UI/tags/black/cross.paa new file mode 100644 index 0000000000..a784b63211 Binary files /dev/null and b/addons/tagging/UI/tags/black/cross.paa differ diff --git a/addons/tagging/UI/tags/black/diamond.paa b/addons/tagging/UI/tags/black/diamond.paa new file mode 100644 index 0000000000..8d158348f9 Binary files /dev/null and b/addons/tagging/UI/tags/black/diamond.paa differ diff --git a/addons/tagging/UI/tags/black/square.paa b/addons/tagging/UI/tags/black/square.paa new file mode 100644 index 0000000000..0d288a3002 Binary files /dev/null and b/addons/tagging/UI/tags/black/square.paa differ diff --git a/addons/tagging/UI/tags/black/triangle.paa b/addons/tagging/UI/tags/black/triangle.paa new file mode 100644 index 0000000000..5a29bcdfb3 Binary files /dev/null and b/addons/tagging/UI/tags/black/triangle.paa differ diff --git a/addons/tagging/UI/tags/black/triangle_inverted.paa b/addons/tagging/UI/tags/black/triangle_inverted.paa new file mode 100644 index 0000000000..46eaf69487 Binary files /dev/null and b/addons/tagging/UI/tags/black/triangle_inverted.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_down.paa b/addons/tagging/UI/tags/blue/arrow_down.paa new file mode 100644 index 0000000000..bbd6eb63ac Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_left.paa b/addons/tagging/UI/tags/blue/arrow_left.paa new file mode 100644 index 0000000000..9b70ebfb00 Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_right.paa b/addons/tagging/UI/tags/blue/arrow_right.paa new file mode 100644 index 0000000000..7c7ac2af6b Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/blue/arrow_up.paa b/addons/tagging/UI/tags/blue/arrow_up.paa new file mode 100644 index 0000000000..976151c245 Binary files /dev/null and b/addons/tagging/UI/tags/blue/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/blue/circle.paa b/addons/tagging/UI/tags/blue/circle.paa new file mode 100644 index 0000000000..f841ac9caa Binary files /dev/null and b/addons/tagging/UI/tags/blue/circle.paa differ diff --git a/addons/tagging/UI/tags/blue/cross.paa b/addons/tagging/UI/tags/blue/cross.paa new file mode 100644 index 0000000000..0235a9361a Binary files /dev/null and b/addons/tagging/UI/tags/blue/cross.paa differ diff --git a/addons/tagging/UI/tags/blue/diamond.paa b/addons/tagging/UI/tags/blue/diamond.paa new file mode 100644 index 0000000000..d66fc599ee Binary files /dev/null and b/addons/tagging/UI/tags/blue/diamond.paa differ diff --git a/addons/tagging/UI/tags/blue/square.paa b/addons/tagging/UI/tags/blue/square.paa new file mode 100644 index 0000000000..6eec9cd3ed Binary files /dev/null and b/addons/tagging/UI/tags/blue/square.paa differ diff --git a/addons/tagging/UI/tags/blue/triangle.paa b/addons/tagging/UI/tags/blue/triangle.paa new file mode 100644 index 0000000000..80674f1495 Binary files /dev/null and b/addons/tagging/UI/tags/blue/triangle.paa differ diff --git a/addons/tagging/UI/tags/blue/triangle_inverted.paa b/addons/tagging/UI/tags/blue/triangle_inverted.paa new file mode 100644 index 0000000000..161404bc1a Binary files /dev/null and b/addons/tagging/UI/tags/blue/triangle_inverted.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_down.paa b/addons/tagging/UI/tags/green/arrow_down.paa new file mode 100644 index 0000000000..c3c256beb2 Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_left.paa b/addons/tagging/UI/tags/green/arrow_left.paa new file mode 100644 index 0000000000..b5c3f1cdaa Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_right.paa b/addons/tagging/UI/tags/green/arrow_right.paa new file mode 100644 index 0000000000..4cd445cad9 Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/green/arrow_up.paa b/addons/tagging/UI/tags/green/arrow_up.paa new file mode 100644 index 0000000000..949378dafc Binary files /dev/null and b/addons/tagging/UI/tags/green/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/green/circle.paa b/addons/tagging/UI/tags/green/circle.paa new file mode 100644 index 0000000000..74e79b1d45 Binary files /dev/null and b/addons/tagging/UI/tags/green/circle.paa differ diff --git a/addons/tagging/UI/tags/green/cross.paa b/addons/tagging/UI/tags/green/cross.paa new file mode 100644 index 0000000000..db4a57222d Binary files /dev/null and b/addons/tagging/UI/tags/green/cross.paa differ diff --git a/addons/tagging/UI/tags/green/diamond.paa b/addons/tagging/UI/tags/green/diamond.paa new file mode 100644 index 0000000000..4ab45168d2 Binary files /dev/null and b/addons/tagging/UI/tags/green/diamond.paa differ diff --git a/addons/tagging/UI/tags/green/square.paa b/addons/tagging/UI/tags/green/square.paa new file mode 100644 index 0000000000..8cb639ed85 Binary files /dev/null and b/addons/tagging/UI/tags/green/square.paa differ diff --git a/addons/tagging/UI/tags/green/triangle.paa b/addons/tagging/UI/tags/green/triangle.paa new file mode 100644 index 0000000000..bc570882fe Binary files /dev/null and b/addons/tagging/UI/tags/green/triangle.paa differ diff --git a/addons/tagging/UI/tags/green/triangle_inverted.paa b/addons/tagging/UI/tags/green/triangle_inverted.paa new file mode 100644 index 0000000000..ce6d43b692 Binary files /dev/null and b/addons/tagging/UI/tags/green/triangle_inverted.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_down.paa b/addons/tagging/UI/tags/red/arrow_down.paa new file mode 100644 index 0000000000..7929adf188 Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_left.paa b/addons/tagging/UI/tags/red/arrow_left.paa new file mode 100644 index 0000000000..6788c48858 Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_right.paa b/addons/tagging/UI/tags/red/arrow_right.paa new file mode 100644 index 0000000000..afd12bff4f Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/red/arrow_up.paa b/addons/tagging/UI/tags/red/arrow_up.paa new file mode 100644 index 0000000000..81e15bdf1b Binary files /dev/null and b/addons/tagging/UI/tags/red/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/red/circle.paa b/addons/tagging/UI/tags/red/circle.paa new file mode 100644 index 0000000000..fb76c8f01f Binary files /dev/null and b/addons/tagging/UI/tags/red/circle.paa differ diff --git a/addons/tagging/UI/tags/red/cross.paa b/addons/tagging/UI/tags/red/cross.paa new file mode 100644 index 0000000000..882e79a57a Binary files /dev/null and b/addons/tagging/UI/tags/red/cross.paa differ diff --git a/addons/tagging/UI/tags/red/diamond.paa b/addons/tagging/UI/tags/red/diamond.paa new file mode 100644 index 0000000000..4f9b583af4 Binary files /dev/null and b/addons/tagging/UI/tags/red/diamond.paa differ diff --git a/addons/tagging/UI/tags/red/square.paa b/addons/tagging/UI/tags/red/square.paa new file mode 100644 index 0000000000..ec83e52244 Binary files /dev/null and b/addons/tagging/UI/tags/red/square.paa differ diff --git a/addons/tagging/UI/tags/red/triangle.paa b/addons/tagging/UI/tags/red/triangle.paa new file mode 100644 index 0000000000..7f2b431201 Binary files /dev/null and b/addons/tagging/UI/tags/red/triangle.paa differ diff --git a/addons/tagging/UI/tags/red/triangle_inverted.paa b/addons/tagging/UI/tags/red/triangle_inverted.paa new file mode 100644 index 0000000000..8d2f818fd0 Binary files /dev/null and b/addons/tagging/UI/tags/red/triangle_inverted.paa differ diff --git a/addons/tagging/XEH_PREP.hpp b/addons/tagging/XEH_PREP.hpp index 449a0a6cb2..0350a1f1da 100644 --- a/addons/tagging/XEH_PREP.hpp +++ b/addons/tagging/XEH_PREP.hpp @@ -3,6 +3,7 @@ PREP(addTagActions); PREP(applyCustomTag); PREP(checkTaggable); PREP(compileConfigTags); +PREP(compileTagAction); PREP(createTag); PREP(moduleInit); PREP(parseConfigTag); diff --git a/addons/tagging/XEH_preInit.sqf b/addons/tagging/XEH_preInit.sqf index 2f0e3158a6..34b4928b2a 100644 --- a/addons/tagging/XEH_preInit.sqf +++ b/addons/tagging/XEH_preInit.sqf @@ -7,7 +7,7 @@ PREP_RECOMPILE_START; PREP_RECOMPILE_END; GVAR(cachedTags) = []; -GVAR(cachedRequiredItems) = []; +GVAR(itemActions) = createHashMap; #include "initSettings.sqf" diff --git a/addons/tagging/functions/fnc_addTagActions.sqf b/addons/tagging/functions/fnc_addTagActions.sqf index f9add50829..52a4c267f3 100644 --- a/addons/tagging/functions/fnc_addTagActions.sqf +++ b/addons/tagging/functions/fnc_addTagActions.sqf @@ -19,38 +19,18 @@ params ["_unit"]; private _actions = []; { - _x params ["_class", "_displayName", "_requiredItem", "_textures", "_icon", "_materials"]; - _actions pushBack [ [ - format ["ACE_ConfigTag_%1", _class], - _displayName, - _icon, - { - (_this select 2) params ["_unit", "_class", "_textures", "", "_materials"]; - - ( - if (count _textures == count _materials) then { - private _textureIndex = floor random count _textures; - [_textures select _textureIndex, _materials select _textureIndex] - } else { - [selectRandom _textures, selectRandom _materials] - } - ) params ["_randomTexture", "_randomMaterial"]; - - [_unit, _randomTexture, _randomMaterial] call FUNC(tag); - _unit setVariable [QGVAR(lastUsedTag), _class]; - }, - { - (_this select 2) params ["_unit", "", "", "_requiredItem"]; - _requiredItem in (_unit call EFUNC(common,uniqueItems)) - }, + format ["ACE_TagItem_%1", _x], + getText (configFile >> "CfgWeapons" >> _x >> "displayName"), + getText (configFile >> "CfgWeapons" >> _x >> "picture"), {}, - [_unit, _class, _textures, _requiredItem, _materials] + {(_this select 2) in (_player call EFUNC(common,uniqueItems))}, + {}, + _x ] call EFUNC(interact_menu,createAction), - [], + _y apply { [_x, [], _unit] }, //sub-actions for each individual tag _unit - ]; -} forEach GVAR(cachedTags); - + ] +} forEach GVAR(itemActions); _actions diff --git a/addons/tagging/functions/fnc_applyCustomTag.sqf b/addons/tagging/functions/fnc_applyCustomTag.sqf index 63ae9836ac..61903ebc4e 100644 --- a/addons/tagging/functions/fnc_applyCustomTag.sqf +++ b/addons/tagging/functions/fnc_applyCustomTag.sqf @@ -24,7 +24,7 @@ params ["_identifier", "_displayName", "_requiredItem"]; // Add only if tag not already added (compare identifiers) -if !(GVAR(cachedTags) select {_x select 0 == _identifier} isEqualTo []) exitWith { +if ((GVAR(cachedTags) select {_x select 0 == _identifier}) isNotEqualTo []) exitWith { INFO_2("Tag with selected identifier already exists: %1 (%2)",_identifier,_displayName) }; @@ -36,5 +36,5 @@ _requiredItem = configName (configFile >> "CfgWeapons" >> _requiredItem); // Con _this set [2, _requiredItem]; GVAR(cachedTags) pushBack _this; -GVAR(cachedRequiredItems) pushBackUnique _requiredItem; +_this call FUNC(compileTagAction); TRACE_1("Added custom script tag",_this); diff --git a/addons/tagging/functions/fnc_checkTaggable.sqf b/addons/tagging/functions/fnc_checkTaggable.sqf index 3a022ca2b7..e6d8a7c90f 100644 --- a/addons/tagging/functions/fnc_checkTaggable.sqf +++ b/addons/tagging/functions/fnc_checkTaggable.sqf @@ -20,7 +20,7 @@ // Exit if no required item in inventory if ([_unit, { - GVAR(cachedRequiredItems) arrayIntersect (_unit call EFUNC(common,uniqueItems)) isEqualTo [] + (keys GVAR(itemActions)) arrayIntersect (_unit call EFUNC(common,uniqueItems)) isEqualTo [] }, _unit, QGVAR(checkRequiredItemsCache), 9999, "cba_events_loadoutEvent"] call EFUNC(common,cachedCall)) exitWith {false}; private _startPosASL = eyePos _unit; @@ -42,6 +42,12 @@ // If the class is alright, do not exit if (_object isKindOf "Static") exitWith {false}; + // Taggable vehicle, do not exit + if (((_object getVariable [QGVAR(canTag), getNumber (configOf _object >> QGVAR(canTag))]) in [1, true]) + && {getText (configOf _object >> "selectionClan") in selectionNames _object}) exitWith { + false + }; + // If the class is not categorized correctly search the cache private _modelName = (getModelInfo _object) select 0; private _isStatic = GVAR(cacheStaticModels) getVariable [_modelName, false]; diff --git a/addons/tagging/functions/fnc_compileConfigTags.sqf b/addons/tagging/functions/fnc_compileConfigTags.sqf index 0fea0693b8..6da9536358 100644 --- a/addons/tagging/functions/fnc_compileConfigTags.sqf +++ b/addons/tagging/functions/fnc_compileConfigTags.sqf @@ -23,7 +23,7 @@ _result params ["_tagInfo", "_requiredItem"]; GVAR(cachedTags) pushBack _tagInfo; - GVAR(cachedRequiredItems) pushBackUnique _requiredItem; + _tagInfo call FUNC(compileTagAction); }; } forEach ("true" configClasses (configFile >> "ACE_Tags")); @@ -35,6 +35,6 @@ _result params ["_tagInfo", "_requiredItem"]; GVAR(cachedTags) pushBack _tagInfo; - GVAR(cachedRequiredItems) pushBackUnique _requiredItem; + _tagInfo call FUNC(compileTagAction); }; } forEach ("true" configClasses (missionConfigFile >> "ACE_Tags")); diff --git a/addons/tagging/functions/fnc_compileTagAction.sqf b/addons/tagging/functions/fnc_compileTagAction.sqf new file mode 100644 index 0000000000..b1879a9fd2 --- /dev/null +++ b/addons/tagging/functions/fnc_compileTagAction.sqf @@ -0,0 +1,46 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Compiles tags from ACE_Tags and returns children actions. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [unit] call ace_tagging_fnc_compileTagAction + * + * Public: No + */ + +params ["_class", "_displayName", "_requiredItem", "_textures", "_icon", "_materials"]; + +private _actions = GVAR(itemActions) getOrDefault [_requiredItem, []]; + +_actions pushBack ([ + _class, + _displayName, + _icon, + { + (_this select 2) params ["_class", "_textures", "_materials"]; + + ( + if (count _textures == count _materials) then { + private _textureIndex = floor random count _textures; + [_textures select _textureIndex, _materials select _textureIndex] + } else { + [selectRandom _textures, selectRandom _materials] + } + ) params ["_randomTexture", "_randomMaterial"]; + + [_player, _randomTexture, _randomMaterial] call FUNC(tag); + _player setVariable [QGVAR(lastUsedTag), _class]; + }, + {true}, // required item is checked at an upper level + {}, + [_class, _textures, _materials] +] call EFUNC(interact_menu,createAction)); + +GVAR(itemActions) set [_requiredItem, _actions]; diff --git a/addons/tagging/functions/fnc_createTag.sqf b/addons/tagging/functions/fnc_createTag.sqf index a993e6675f..feec84d312 100644 --- a/addons/tagging/functions/fnc_createTag.sqf +++ b/addons/tagging/functions/fnc_createTag.sqf @@ -10,6 +10,7 @@ * 3: Object it should be tied to * 4: Unit that created the tag * 5: Material of the tag (Optional) + * 6: Vehicle Tag (Optional) * * Return Value: * Tag created @@ -20,7 +21,7 @@ * Public: No */ -params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_object", "_unit", ["_material","",[""]], ["_tagModel", "UserTexture1m_F", [""]]]; +params ["_tagPosASL", "_vectorDirAndUp", "_texture", "_object", "_unit", ["_material","",[""]], ["_tagModel", "UserTexture1m_F", [""]], ["_isVehicleTag", false, [false]]]; TRACE_5("createTag:",_tagPosASL,_vectorDirAndUp,_texture,_object,_unit); if (_texture == "") exitWith { @@ -28,6 +29,12 @@ if (_texture == "") exitWith { false }; +if (_isVehicleTag) exitWith { + TRACE_3("tagging vehicle",_object,typeOf _object,_texture); + _object setObjectTextureGlobal [getText (configOf _object >> "selectionClan"), _texture]; + // if (_material != "") then { _object setObjectMaterialGlobal ["clan", _material] }; // ?? +}; + private _tag = createSimpleObject [_tagModel, _tagPosASL]; _tag setObjectTextureGlobal [0, _texture]; if (_material != "") then { _tag setObjectMaterialGlobal [0, _material] }; diff --git a/addons/tagging/functions/fnc_tag.sqf b/addons/tagging/functions/fnc_tag.sqf index b476145c57..ce31e2360e 100644 --- a/addons/tagging/functions/fnc_tag.sqf +++ b/addons/tagging/functions/fnc_tag.sqf @@ -29,6 +29,7 @@ if (isNull _unit || {_texture == ""}) exitWith { ERROR_2("Tag parameters invalid. Unit: %1, Texture: %2",_unit,_texture); }; +private _isVehicleTag = false; private _startPosASL = eyePos _unit; private _cameraPosASL = AGLToASL positionCameraToWorld [0, 0, 0]; private _cameraDir = (AGLToASL positionCameraToWorld [0, 0, 1]) vectorDiff _cameraPosASL; @@ -51,6 +52,13 @@ if ((!isNull _object) && { // If the class is alright, do not exit if (_object isKindOf "Static") exitWith {false}; + // Taggable vehicle, do not exit and tell server to change "clan" tag + if (((_object getVariable [QGVAR(canTag), getNumber (configOf _object >> QGVAR(canTag))]) in [1, true]) + && {getText (configOf _object >> "selectionClan") in selectionNames _object}) exitWith { + _isVehicleTag = true; + false + }; + // If the class is not categorized correctly search the cache private _modelName = (getModelInfo _object) select 0; private _isStatic = GVAR(cacheStaticModels) getVariable [_modelName, false]; @@ -100,10 +108,11 @@ private _fnc_isOk = { true }; -if ( !([ 0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || +if ( (!_isVehicleTag) && { + !([ 0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || {!([ 0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk) || {!([-0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || - {!([-0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk)}}}) exitWith { + {!([-0.5 * TAG_SIZE,-0.5 * TAG_SIZE] call _fnc_isOk)}}}}) exitWith { TRACE_1("Unsuitable location:",_touchingPoint); false }; @@ -120,6 +129,6 @@ if ( !([ 0.5 * TAG_SIZE, 0.5 * TAG_SIZE] call _fnc_isOk) || // Tell the server to create the tag and handle its destruction [QGVAR(createTag), _this] call CBA_fnc_serverEvent; -}, [_touchingPoint vectorAdd (_surfaceNormal vectorMultiply 0.06), _vectorDirAndUp, _texture, _object, _unit, _material, _tagModel], 0.6] call CBA_fnc_waitAndExecute; +}, [_touchingPoint vectorAdd (_surfaceNormal vectorMultiply 0.06), _vectorDirAndUp, _texture, _object, _unit, _material, _tagModel, _isVehicleTag], 0.6] call CBA_fnc_waitAndExecute; true diff --git a/addons/tagging/stringtable.xml b/addons/tagging/stringtable.xml index 56c1346932..17cc2543a0 100644 --- a/addons/tagging/stringtable.xml +++ b/addons/tagging/stringtable.xml @@ -7,7 +7,7 @@ タグ付け Tagowanie Markieren (Spraydose) - 뿌리기 + 태그하기 Marquage Marcamento 喷漆 @@ -23,7 +23,7 @@ 標準で開くタグ付けシステムの設定を行います。 Skonfiguruj zachowanie systemu tagowania. Konfiguriert, wie das Markieren standardmäßig funktioniert. - 뿌리기 시스템의 기본사항을 설정합니다. + 태그 시스템의 기본사항을 설정합니다. Configure le fonctionnement par défaut du système de marquage. Configura quanto il sistema di marcamento agirà da se. 定义喷漆系统预设设定 @@ -38,7 +38,7 @@ クイック タグ Szybkie tagowanie Schnelle Markierung (Spraydose) - 빠른 뿌리기 + 스프레이 페인트 - 빠른 태그 Peinture en spray - Marquage rapide Marcamento Rapido 快速喷漆 @@ -54,10 +54,10 @@ インタラクション ポイントにむけてタグ付けをします。 Akcja wykonywana na głównym punkcie interakcji tagu. Aktion, die am Haupt-Interaktionspunkt ausgeführt werden soll. - 이 동작은 상호작용에서 뿌리기를 할 수 있게 해준다 + 상호작용 시 표시할 낙서를 고릅니다. Type de marquage à appliquer sur le point visé. Azione eseguita sul punto di interazione dei tag principali. - 直接喷漆在互动选单瞄准的点上。 + 直接喷漆在互动菜单瞄准的点上。 直接噴漆在互動選單瞄準的點上。 Ação executada no ponto principal de marcação Akce prováděná v hlavním bodě značky interakce. @@ -121,7 +121,7 @@ Marcar Маркер タグ - 뿌리기 + 태그 Tag 喷漆 噴漆 @@ -137,7 +137,7 @@ X černě X em preto Черный Х - 黒のX印 + X印 검정 X 黑色X标记 黑色X標記 @@ -153,7 +153,7 @@ X červeně X em vermelho Красный Х - 赤のX印 + X印 빨간 X 红色X标记 紅色X標記 @@ -169,7 +169,7 @@ X zeleně X em verde Зеленый Х - 緑のX印 + X印 초록 X 绿色X标记 綠色X標記 @@ -185,12 +185,72 @@ X modře X em azul Синий Х - 青のX印 + X印 파랑 X 蓝色X标记 藍色X標記 X Mavi + + Up Arrow + 上矢印 + Strzałka w górę + 화살표(위) + + + Down Arrow + 下矢印 + Strzałka w dół + 화살표(아래) + + + Left Arrow + 左矢印 + Strzałka w lewo + 화살표(왼쪽) + + + Right Arrow + 右矢印 + Strzałka w prawo + 화살표(오른쪽) + + + Circle + + Okrąg + + + + Cross + 十字 + Krzyż + 십자 + + + Diamond + ひし形 + Diament + 마름모 + + + Square + 四角 + Kwadrat + 사각형 + + + Triangle + 三角形 + Trójkąt + 삼각형 + + + Triangle Inverted + 三角形 (反転) + Odwrócony trójkąt + 역삼각형 + Spray Paint (Black) Sprühfarbe (Schwarz) @@ -201,7 +261,7 @@ Černý sprej Spray de tinta preta Черный спрей - 黒のスプレー缶 + スプレー缶 (黒) 검정 스프레이 黑色喷漆 黑色噴漆 @@ -217,7 +277,7 @@ Červený sprej Spray de tinta vermelha Красный спрей - 赤のスプレー缶 + スプレー缶 (赤) 빨강 스프레이 红色喷漆 紅色噴漆 @@ -233,7 +293,7 @@ Zelený sprej Spray de tinta verde Зеленый спрей - 緑のスプレー缶 + スプレー缶 (緑) 초록 스프레이 绿色喷漆 綠色噴漆 @@ -249,7 +309,7 @@ Modrý sprej Spray de tinta azul Синий спрей - 青のスプレー缶 + スプレー缶 (青) 파랑 스프레이 蓝色喷漆 藍色噴漆 @@ -266,7 +326,7 @@ Uma lata de tinta spray para marcar paredes. Балончик спрея для рисования маркеров на стенах. スプレー缶は壁にタグ付できます。 - 벽에 뿌릴 수 있는 스프레이캔 입니다. + 벽에 낙서할 수 있는 스프레이캔 입니다. 喷漆可喷涂在墙壁上 噴漆可噴塗在牆壁上 diff --git a/addons/towing/XEH_PREP.hpp b/addons/towing/XEH_PREP.hpp index f3937e01c3..d26b29e5f0 100644 --- a/addons/towing/XEH_PREP.hpp +++ b/addons/towing/XEH_PREP.hpp @@ -1,3 +1,4 @@ +PREP(addRopeToVehicle); PREP(attachRopePFH); PREP(canStartTow); PREP(detach); diff --git a/addons/towing/XEH_preInit.sqf b/addons/towing/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/towing/XEH_preInit.sqf +++ b/addons/towing/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/towing/config.cpp b/addons/towing/config.cpp index 32b80109ea..548ac69582 100644 --- a/addons/towing/config.cpp +++ b/addons/towing/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_logistics_rope"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"Dani (TCVM)"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/towing/functions/fnc_addRopeToVehicle.sqf b/addons/towing/functions/fnc_addRopeToVehicle.sqf new file mode 100644 index 0000000000..09f9f03b6c --- /dev/null +++ b/addons/towing/functions/fnc_addRopeToVehicle.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: Dystopian + * Adds rope to vehicle inventory. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * cursorObject call ace_towing_fnc_addRopeToVehicle + * + * Public: No + */ + +if (!GVAR(addRopeToVehicleInventory)) exitWith {}; +params ["_vehicle"]; + +if (0 == getNumber (configOf _vehicle >> QEGVAR(cargo,hasCargo))) exitWith {}; + +private _ropeType = if ( + -1 < ["Tank", "Wheeled_APC_F", "Truck_F"] findIf {_vehicle isKindOf _x} +) then {"ACE_rope12"} else {"ACE_rope6"}; + +_vehicle addItemCargoGlobal [_ropeType, 1]; diff --git a/addons/towing/functions/fnc_attachRopePFH.sqf b/addons/towing/functions/fnc_attachRopePFH.sqf index 8164060b84..50cfeac5fe 100644 --- a/addons/towing/functions/fnc_attachRopePFH.sqf +++ b/addons/towing/functions/fnc_attachRopePFH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * PFH which allows the user to attach a rope to the given target vehicle * * Arguments: diff --git a/addons/towing/functions/fnc_canStartTow.sqf b/addons/towing/functions/fnc_canStartTow.sqf index 593762c68c..8f9d2136db 100644 --- a/addons/towing/functions/fnc_canStartTow.sqf +++ b/addons/towing/functions/fnc_canStartTow.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Condition for whether or not we can tow from this object * * Arguments: diff --git a/addons/towing/functions/fnc_detach.sqf b/addons/towing/functions/fnc_detach.sqf index e7cd95e079..f593d5309f 100644 --- a/addons/towing/functions/fnc_detach.sqf +++ b/addons/towing/functions/fnc_detach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Detaches child from parent, and gives rope item back * * Arguments: diff --git a/addons/towing/functions/fnc_isSuitableSimulation.sqf b/addons/towing/functions/fnc_isSuitableSimulation.sqf index 076b7933c3..025b43937e 100644 --- a/addons/towing/functions/fnc_isSuitableSimulation.sqf +++ b/addons/towing/functions/fnc_isSuitableSimulation.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Condition for whether or not this object is a simulation type which can be a tow parent (TankX or CarX) * * Arguments: diff --git a/addons/towing/functions/fnc_onMouseButtonDown.sqf b/addons/towing/functions/fnc_onMouseButtonDown.sqf index a20c2cf38c..174ad27ebb 100644 --- a/addons/towing/functions/fnc_onMouseButtonDown.sqf +++ b/addons/towing/functions/fnc_onMouseButtonDown.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Handles mouse interaction for attaching rope * * Arguments: diff --git a/addons/towing/functions/fnc_onMouseButtonUp.sqf b/addons/towing/functions/fnc_onMouseButtonUp.sqf index ff0bac85d3..ba98e16373 100644 --- a/addons/towing/functions/fnc_onMouseButtonUp.sqf +++ b/addons/towing/functions/fnc_onMouseButtonUp.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Handles mouse interaction for attaching rope * * Arguments: diff --git a/addons/towing/functions/fnc_startTow.sqf b/addons/towing/functions/fnc_startTow.sqf index d216576499..7422674c6a 100644 --- a/addons/towing/functions/fnc_startTow.sqf +++ b/addons/towing/functions/fnc_startTow.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Start rope attach PFH * * Arguments: @@ -28,6 +28,7 @@ if (_ropeLength == 0) then { _unit removeItem _ropeClass; +GVAR(cancel) = false; GVAR(canAttach) = false; [LINKFUNC(towStateMachinePFH), 0, [TOW_STATE_ATTACH_PARENT, _unit, _target, objNull, _ropeLength, _ropeClass]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/towing/functions/fnc_towStateMachinePFH.sqf b/addons/towing/functions/fnc_towStateMachinePFH.sqf index 326a9aeee5..40c21bc899 100644 --- a/addons/towing/functions/fnc_towStateMachinePFH.sqf +++ b/addons/towing/functions/fnc_towStateMachinePFH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Called per frame. Handles current unit state for attaching a rope to two vehicles * * Arguments: @@ -25,10 +25,11 @@ private _exitCondition = !( { "" isEqualTo currentWeapon _unit || { _unit call EFUNC(common,isSwimming) }} && { [_unit, objNull, [INTERACTION_EXCEPTIONS]] call EFUNC(common,canInteractWith) } && { "unconscious" isNotEqualTo toLower animationState _unit } && - { !(_unit getVariable ["ACE_isUnconscious", false]) } + { !(_unit getVariable ["ACE_isUnconscious", false]) } && + { ACE_player == _unit } ); -if (_exitCondition) then { +if (_exitCondition && {_state < TOW_STATE_CANCEL}) then { _state = TOW_STATE_CANCEL; }; @@ -45,8 +46,9 @@ switch (_state) do { _args set [3, _rope]; }; - if (GVAR(mouseRight)) then { + if (GVAR(mouseRight) || GVAR(cancel)) then { _args set [0, TOW_STATE_CANCEL]; + GVAR(cancel) = false; }; }; case TOW_STATE_ATTACH_CHILD: { @@ -74,6 +76,11 @@ switch (_state) do { ERROR_MSG("_child isEqualTo _parent"); }; + if (GVAR(cancel)) exitWith { + _args set [0, TOW_STATE_CANCEL]; + GVAR(cancel) = false; + }; + [QGVAR(setTowParent), [_parent, _child], _parent] call CBA_fnc_targetEvent; GVAR(attachHelper) ropeDetach _rope; @@ -127,9 +134,12 @@ switch (_state) do { }; case TOW_STATE_CANCEL: { TRACE_1("state cancel",_rope); - ropeDestroy _rope; + if !(isNull _rope) then { + ropeDestroy _rope; + }; [_unit, _ropeClass, true] call CBA_fnc_addItem; _args set [0, TOW_STATE_CLEANUP]; + GVAR(cancel) = false; (localize LSTRING(canceled)) call CBA_fnc_notify; }; diff --git a/addons/towing/initSettings.sqf b/addons/towing/initSettings.sqf new file mode 100644 index 0000000000..8361dccccd --- /dev/null +++ b/addons/towing/initSettings.sqf @@ -0,0 +1,13 @@ +[ + QGVAR(addRopeToVehicleInventory), "CHECKBOX", + LSTRING(Setting_addRopeToVehicleInventory_DisplayName), + LELSTRING(OptionsMenu,CategoryLogistics), + true, + true, + { + if !(_this && {isServer} && {isNil QGVAR(addRopeToVehicleInventory_initialized)}) exitWith {}; + GVAR(addRopeToVehicleInventory_initialized) = true; + ["Tank", "initPost", LINKFUNC(addRopeToVehicle), true, [], true] call CBA_fnc_addClassEventHandler; + ["Car", "initPost", LINKFUNC(addRopeToVehicle), true, [], true] call CBA_fnc_addClassEventHandler; + } +] call CBA_fnc_addSetting; diff --git a/addons/towing/script_component.hpp b/addons/towing/script_component.hpp index d3c12463c9..2d9790ac20 100644 --- a/addons/towing/script_component.hpp +++ b/addons/towing/script_component.hpp @@ -17,7 +17,7 @@ #include "\z\ace\addons\main\script_macros.hpp" #define TOW_ACTION_DISTANCE 3 -#define INTERACTION_EXCEPTIONS "isNotInside", "isNotOnLadder", "isNotSwimming" +#define INTERACTION_EXCEPTIONS "isNotOnLadder", "isNotSwimming" #define TOW_STATE_ATTACH_PARENT 0 #define TOW_STATE_ATTACH_CHILD 1 diff --git a/addons/towing/stringtable.xml b/addons/towing/stringtable.xml index 4efe789ff6..2c0f37ed38 100644 --- a/addons/towing/stringtable.xml +++ b/addons/towing/stringtable.xml @@ -8,6 +8,8 @@ Буксирование Abschleppen Holowanie + 牵引 + 견인 Attach Tow Rope @@ -16,6 +18,8 @@ Прикрепить буксировочный канат Abschleppseil befestigen Przypnij linkę holowniczą + 系上牵引绳 + 견인줄 부착 Attaching Cancelled @@ -24,6 +28,8 @@ Прикрепление отменено Befestigen Abgebrochen Przyczepianie anulowane + 取消系上绳索 + 견인 취소됨 Attach Tow Rope (3.2m) @@ -32,6 +38,8 @@ Прикрепить буксировочный канат (3.2м) Befestige Seil (3.2m) Przypnij linkę holowniczą (3,2m) + 系上牵引绳(3.2米) + 견인줄 부착(3.2M) Attach Tow Rope (6.2m) @@ -40,6 +48,8 @@ Прикрепить буксировочный канат (6.2м) Befestige Seil (6.2m) Przypnij linkę holowniczą (6,2m) + 系上牵引绳(6.2米) + 견인줄 부착(6.2M) Attach Tow Rope (12.2m) @@ -48,6 +58,8 @@ Прикрепить буксировочный канат (12.2м) Befestige Seil (12.2m) Przypnij linkę holowniczą (12,2m) + 系上牵引绳(12.2米) + 견인줄 부착(12.2M) Attach Tow Rope (15.2m) @@ -56,6 +68,8 @@ Прикрепить буксировочный канат (15.2м) Befestige Seil (15.2m) Przypnij linkę holowniczą (15,2m) + 系上牵引绳(15.2米) + 견인줄 부착(15.2M) Attach Tow Rope (18.3m) @@ -64,6 +78,8 @@ Прикрепить буксировочный канат (18.3м) Befestige Seil (18.3m) Przypnij linkę holowniczą (18,3m) + 系上牵引绳(18.3米) + 견인줄 부착(18.2M) Attach Tow Rope (27.4m) @@ -72,6 +88,8 @@ Прикрепить буксировочный канат (27.4м) Befestige Seil (27.4m) Przypnij linkę holowniczą (27,4m) + 系上牵引绳(27.4米) + 견인줄 부착(27.4M) Attach Tow Rope (36.6m) @@ -80,6 +98,8 @@ Прикрепить буксировочный канат (36.6м) Befestige Seil (36.6m) Przypnij linkę holowniczą (36,6m) + 系上牵引绳(36.6米) + 견인줄 부착(36.6M) Detach Tow Rope @@ -88,6 +108,12 @@ Отцепить буксировочный канат Entferne Abschleppseil Odepnij linkę holowniczą + 解开牵引绳 + 견인줄 분리 + + + Add Tow Rope to Vehicle Inventory + Добавить буксировочный трос в инвентарь машин diff --git a/addons/trenches/ACE_Arsenal_Stats.hpp b/addons/trenches/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..ab467ea588 --- /dev/null +++ b/addons/trenches/ACE_Arsenal_Stats.hpp @@ -0,0 +1,13 @@ +class EGVAR(arsenal,stats) { + class statBase; + class GVAR(entrenchingTool): statBase { + scope = 2; + priority = -1; + stats[] = {QGVAR(entrenchingTool)}; + displayName = CSTRING(EntrenchingToolName); + showText = 1; + textStatement = QUOTE(localize 'STR_ACE_Common_Yes'); // using localization macros in QUOTE is a PITA + condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); + tabs[] = {{0,1,5}, {7}}; + }; +}; diff --git a/addons/trenches/CfgVehicles.hpp b/addons/trenches/CfgVehicles.hpp index 478243345d..d34886f2ae 100644 --- a/addons/trenches/CfgVehicles.hpp +++ b/addons/trenches/CfgVehicles.hpp @@ -16,6 +16,11 @@ class CBA_Extended_EventHandlers; condition = QUOTE([ARR_2(_target,_player)] call FUNC(canRemoveTrench)); \ statement = QUOTE([ARR_2(_target,_player)] call FUNC(removeTrench);); \ }; \ + class ACE_CamouflageTrench { \ + displayName = CSTRING(CamouflageTrench); \ + condition = QUOTE([ARR_2(_target,_player)] call FUNC(canCamouflageTrench)); \ + statement = QUOTE([ARR_2(_target,_player)] call FUNC(camouflageTrench)); \ + }; \ }; \ } @@ -62,6 +67,8 @@ class CfgVehicles { class EventHandlers { class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; }; + hiddenSelections[] = {"velka"}; + hiddenSelectionsTextures[] = {"a3\map_data\gdt_mud_co.paa"}; }; class ACE_envelope_big: BagFence_base_F { author = ECSTRING(common,ACETeam); @@ -78,6 +85,8 @@ class CfgVehicles { class EventHandlers { class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; }; + hiddenSelections[] = {"velka"}; + hiddenSelectionsTextures[] = {"a3\map_data\gdt_mud_co.paa"}; }; class ACE_envelope_small_NoGeo: ACE_envelope_small { diff --git a/addons/trenches/CfgWeapons.hpp b/addons/trenches/CfgWeapons.hpp index de79bc277f..4e14153a1b 100644 --- a/addons/trenches/CfgWeapons.hpp +++ b/addons/trenches/CfgWeapons.hpp @@ -12,5 +12,7 @@ class CfgWeapons { class ItemInfo: CBA_MiscItem_ItemInfo { mass = 10; }; + + GVAR(entrenchingTool) = 1; }; }; diff --git a/addons/trenches/README.md b/addons/trenches/README.md index 0d33527da4..cd19758221 100644 --- a/addons/trenches/README.md +++ b/addons/trenches/README.md @@ -1,17 +1,7 @@ ace_trenches ================= -Adds item 'ACE_entrenchingtool' +Provides players with the capability of digging trenches. + +Adds item 'ACE_EntrenchingTool' Adds 2 trenches; Envelope - Small & Envelop - Big - -### Whitelist surfaces for digging -Single surfaces can be whitelisted by adding `ACE_canDig = 1` into `CfgSurfaces`. -Example: -```cpp -class CfgSurfaces { - class myAwesomeSurface { - ACE_canDig = 1; - }; -}; -``` - diff --git a/addons/trenches/XEH_PREP.hpp b/addons/trenches/XEH_PREP.hpp index 2e671acb85..05eb403fd8 100644 --- a/addons/trenches/XEH_PREP.hpp +++ b/addons/trenches/XEH_PREP.hpp @@ -1,4 +1,6 @@ +PREP(camouflageTrench); +PREP(canCamouflageTrench); PREP(canContinueDiggingTrench); PREP(canDigTrench); PREP(canRemoveTrench); @@ -9,6 +11,7 @@ PREP(handlePlayerChanged); PREP(handlePlayerInventoryChanged); PREP(handleScrollWheel); PREP(handleUnconscious); +PREP(hasEntrenchingTool); PREP(placeCancel); PREP(placeConfirm); PREP(placeTrench); diff --git a/addons/trenches/XEH_preInit.sqf b/addons/trenches/XEH_preInit.sqf index 9361d05015..47d20d7c2b 100644 --- a/addons/trenches/XEH_preInit.sqf +++ b/addons/trenches/XEH_preInit.sqf @@ -8,4 +8,6 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +GVAR(entrenchingTools) = call (uiNamespace getVariable QGVAR(entrenchingTools)); + ADDON = true; diff --git a/addons/trenches/XEH_preStart.sqf b/addons/trenches/XEH_preStart.sqf index 022888575e..c966b2c9b6 100644 --- a/addons/trenches/XEH_preStart.sqf +++ b/addons/trenches/XEH_preStart.sqf @@ -1,3 +1,9 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +private _entrenchingTools = (QUOTE(getNumber (_x >> QQGVAR(entrenchingTool)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x}); +_entrenchingTools append (QUOTE(getNumber (_x >> QQGVAR(entrenchingTool)) > 0) configClasses (configFile >> "CfgVehicles") apply {configName _x}); +TRACE_1("",_entrenchingTools); + +uiNamespace setVariable [QGVAR(entrenchingTools), compileFinal str _entrenchingTools]; diff --git a/addons/trenches/config.cpp b/addons/trenches/config.cpp index 3f76f012ed..18d5e4a3d6 100644 --- a/addons/trenches/config.cpp +++ b/addons/trenches/config.cpp @@ -14,6 +14,7 @@ class CfgPatches { }; }; +#include "ACE_Arsenal_Stats.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/trenches/functions/fnc_camouflageTrench.sqf b/addons/trenches/functions/fnc_camouflageTrench.sqf new file mode 100644 index 0000000000..02cd2b5602 --- /dev/null +++ b/addons/trenches/functions/fnc_camouflageTrench.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: Cyruz + * Apply surfaceTexture to a completed trench. + * + * Arguments: + * 0: Trench + * 1: Unit + * + * Return Value: + * None + * + * Example: + * [TrenchObj, ACE_player] call ace_trenches_fnc_camouflageTrench + * + * Public: No + */ + +params ["_trench", "_unit"]; + +_unit playActionNow "PutDown"; + +[{ + _this setObjectTextureGlobal [0, surfaceTexture getPosATL _this]; + _this setVariable [QGVAR(camouflaged), true, true]; +}, _trench, 2] call CBA_fnc_waitAndExecute; diff --git a/addons/trenches/functions/fnc_canCamouflageTrench.sqf b/addons/trenches/functions/fnc_canCamouflageTrench.sqf new file mode 100644 index 0000000000..2630d61698 --- /dev/null +++ b/addons/trenches/functions/fnc_canCamouflageTrench.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* + * Author: Cyruz + * Checks if a unit can camouflage a trench. + * + * Arguments: + * 0: Trench + * 1: Unit + * + * Return Value: + * Can camouflage + * + * Example: + * [TrenchObj, ACE_player] call ace_trenches_fnc_canCamouflageTrench + * + * Public: No + */ + +params ["_trench", "_unit"]; + +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; + +// Prevent camouflage if not fully dug +if ((_trench getVariable [QGVAR(progress), 0]) != 1) exitWith {false}; + +// Prevent camouflage being applied once already camouflaged +if (_trench getVariable [QGVAR(camouflaged), false]) exitWith {false}; + +true diff --git a/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf b/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf index 740b34df7c..f63332e753 100644 --- a/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf +++ b/addons/trenches/functions/fnc_canContinueDiggingTrench.sqf @@ -18,7 +18,7 @@ params ["_trench", "_unit"]; -if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) exitWith {false}; +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; if ((_trench getVariable [QGVAR(progress), 1]) >= 1) exitWith {false}; // Prevent removing/digging trench by more than one person diff --git a/addons/trenches/functions/fnc_canDigTrench.sqf b/addons/trenches/functions/fnc_canDigTrench.sqf index d6bf05993d..1b6dd28fea 100644 --- a/addons/trenches/functions/fnc_canDigTrench.sqf +++ b/addons/trenches/functions/fnc_canDigTrench.sqf @@ -17,6 +17,6 @@ params ["_unit"]; -if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) exitWith {false}; +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; _unit call EFUNC(common,canDig) diff --git a/addons/trenches/functions/fnc_canRemoveTrench.sqf b/addons/trenches/functions/fnc_canRemoveTrench.sqf index 23347fc310..ebebbd29a9 100644 --- a/addons/trenches/functions/fnc_canRemoveTrench.sqf +++ b/addons/trenches/functions/fnc_canRemoveTrench.sqf @@ -18,7 +18,7 @@ params ["_trench", "_unit"]; -if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) exitWith {false}; +if !(_unit call FUNC(hasEntrenchingTool)) exitWith {false}; // Prevent removing/digging trench by more than one person if (_trench getVariable [QGVAR(digging), false]) exitWith {false}; diff --git a/addons/trenches/functions/fnc_continueDiggingTrench.sqf b/addons/trenches/functions/fnc_continueDiggingTrench.sqf index 4c6c6f9546..e6eab0c548 100644 --- a/addons/trenches/functions/fnc_continueDiggingTrench.sqf +++ b/addons/trenches/functions/fnc_continueDiggingTrench.sqf @@ -48,6 +48,8 @@ private _fnc_onFinish = { private _progress = _trench getVariable [QGVAR(progress), 0]; _trench setVariable [QGVAR(progress), _progress, true]; + [QGVAR(finished), [_unit, _trench]] call CBA_fnc_globalEvent; + // Reset animation [_unit, "", 1] call EFUNC(common,doAnimation); }; @@ -65,7 +67,7 @@ private _fnc_onFailure = { }; private _fnc_condition = { (_this select 0) params ["_unit"]; - "ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems)) + _unit call FUNC(hasEntrenchingTool) }; [(_digTimeLeft + 0.5), [_unit, _trench], _fnc_onFinish, _fnc_onFailure, localize LSTRING(DiggingTrench), _fnc_condition] call EFUNC(common,progressBar); diff --git a/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf b/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf index 3873e40b4a..dcf6493491 100644 --- a/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf +++ b/addons/trenches/functions/fnc_handlePlayerInventoryChanged.sqf @@ -19,7 +19,7 @@ params ["_unit"]; if (_unit getVariable [QGVAR(isPlacing), false]) then { - if !("ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems))) then { + if !(_unit call FUNC(hasEntrenchingTool)) then { [_unit] call FUNC(placeCancel); }; }; diff --git a/addons/trenches/functions/fnc_hasEntrenchingTool.sqf b/addons/trenches/functions/fnc_hasEntrenchingTool.sqf new file mode 100644 index 0000000000..30fb34f441 --- /dev/null +++ b/addons/trenches/functions/fnc_hasEntrenchingTool.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: veteran29 + * Checks if unit has entrenching tool. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Has entrenching tool + * + * Example: + * [bob] call ace_trenches_fnc_hasEntrenchingTool + * + * Public: Yes +*/ + +params [ + ["_unit", objNull, [objNull]] +]; + +private _uniqueItems = _unit call EFUNC(common,uniqueItems); +_uniqueItems append weapons _unit; +_uniqueItems pushBack backpack _unit; + +GVAR(entrenchingTools) findIf {_x in _uniqueItems} != -1 // return diff --git a/addons/trenches/functions/fnc_placeConfirm.sqf b/addons/trenches/functions/fnc_placeConfirm.sqf index 867b034679..43fad843ee 100644 --- a/addons/trenches/functions/fnc_placeConfirm.sqf +++ b/addons/trenches/functions/fnc_placeConfirm.sqf @@ -44,6 +44,8 @@ GVAR(trenchPlacementData) params ["_dx", "_dy", "_offset"]; private _basePos = GVAR(trenchPos); private _angle = (GVAR(digDirection) + getDir _unit); +[QGVAR(placed), [_unit, _trench]] call CBA_fnc_globalEvent; + // _v1 forward from the player, _v2 to the right, _v3 points away from the ground private _v3 = surfaceNormal _basePos; private _v2 = [sin _angle, +cos _angle, 0] vectorCrossProduct _v3; diff --git a/addons/trenches/functions/fnc_removeTrench.sqf b/addons/trenches/functions/fnc_removeTrench.sqf index 2cdb874846..c4ddb8a7c7 100644 --- a/addons/trenches/functions/fnc_removeTrench.sqf +++ b/addons/trenches/functions/fnc_removeTrench.sqf @@ -66,7 +66,7 @@ private _fnc_onFailure = { }; private _fnc_condition = { (_this select 0) params ["_unit"]; - "ACE_EntrenchingTool" in (_unit call EFUNC(common,uniqueItems)) + _unit call FUNC(hasEntrenchingTool) }; [(_removeTimeLeft + 0.5), [_unit, _trench], _fnc_onFinish, _fnc_onFailure, localize LSTRING(RemovingTrench), _fnc_condition] call EFUNC(common,progressBar); diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml index 682c2a7e82..3392cc4ad3 100644 --- a/addons/trenches/stringtable.xml +++ b/addons/trenches/stringtable.xml @@ -11,7 +11,7 @@ Polní lopatka Ferramenta de trincheira Саперная лопата - シャベル + 塹壕ツール 야전삽 战备锹 戰備鍬 @@ -27,8 +27,8 @@ Polní lopatky se používají k zákopovým a jiným pracem. Ferramenta de trincheira Саперная лопата - シャベル - 야전용 삽. 군인들의 영원한 친구 + 塹壕ツール + 야전삽 战备锹 戰備鍬 Kürek @@ -44,7 +44,7 @@ Окоп - Малый 塹壕 - 小型 참호 - 소형 - 掩体 - 小 + 掩体—小 掩體 - 小 Obálka - Malá Zarf - Küçük @@ -77,7 +77,7 @@ Вырыть малый окоп 小型塹壕を掘る 소형참호 파기 - 盖小掩体 + 挖掘小掩体 蓋小掩體 Küçük Siper @@ -92,7 +92,7 @@ Окоп - Большой 塹壕 - 大型 참호 - 대형 - 掩体 - 大 + 掩体—大 掩體 - 大 Obálka - Velká Zarf - Büyük @@ -125,7 +125,7 @@ Вырыть большой окоп 大型の塹壕を掘る 대형참호 파기 - 盖大掩体 + 挖掘大掩体 蓋大掩體 Büyük Siper @@ -189,8 +189,8 @@ Cavando trincheira Копание окопа 塹壕を掘っている - 참호 파는중 - 正在盖掩体 + 참호 파는 중 + 正在挖掘掩体 正在蓋掩體中 Siper Kazılıyor @@ -205,7 +205,7 @@ Graben fortsetzen 계속해서 참호파기 Continuando a Scavare la Trincea - 继续盖掩体 + 继续挖掘掩体 繼續蓋掩體 Kazmaya Devam Et Continuar cavando trinchera @@ -226,6 +226,11 @@ Siperi Kaldır Eliminar trinchera + + Camouflage Trench + Zakamufluj Okop + 伪装掩体 + Removing Trench Usuwanie wnęki @@ -235,7 +240,7 @@ Odstraňuji zákop 塹壕を消しています Entferne Schützengraben - 참호 제거중... + 참호 제거 중 Rimuovendo la Trincea 正在移除掩体 移除掩體中 @@ -250,6 +255,8 @@ ACETrincheras ACE Okopy ACE Gräben + ACE 战壕 + ACE 참호 Small Trench Dig Duration @@ -259,6 +266,8 @@ Tiempo de cavar trinchera pequeña Czas kopania małego okopu Kleiner Graben - Aushebungsdauer + 小型战壕挖掘时间 + 소형참호 건설 시간 Time, in seconds, required to dig a small trench. @@ -268,6 +277,8 @@ Tiempo, en segundos, requerido para cavar una trinchera pequeña. Czas, w sekundach wymagany do wykopania małego okopu Zeit in Sekunden, um einen kleinen Graben auszuheben. + 挖一条小型战壕所需的时间(秒)。 + 소형 참호를 팔 때 필요한 시간을 설정합니다. (초 단위) Small Trench Remove Duration @@ -277,6 +288,8 @@ Tiempo de eliminar trinchera pequeña Czas usuwania małego okopu Kleiner Graben - Aufschüttdauer + 小型战壕回填时间 + 소형참호 제거 시간 Time, in seconds, required to remove a small trench. @@ -286,6 +299,8 @@ Tiempo, en segundos, requerido para eliminar una trinchera pequeña. Czas, w sekundach wymagany do usunięcia małego okopu Zeit in Sekunden, um einen kleinen Graben aufzuschütten. + 回填一条小型战壕所需的时间(秒)。 + 소형 참호를 제거할때 필요한 시간을 설정합니다. (초 단위) Big Trench Dig Duration @@ -295,6 +310,8 @@ Tiempo de cavar trinchera grande Czas kopania dużego okopu Große Graben - Aushebungsdauer + 大型战壕挖掘时间 + 대형참호 건설 시간 Time, in seconds, required to dig a big trench. @@ -304,6 +321,8 @@ Tiempo, en segundos, requerido para cavar una trinchera grande Czas, w sekundach wymagany do wykopania dużego okopu Zeit in Sekunden, um einen großen Graben auszuheben. + 挖一条大型战壕所需的时间(秒)。 + 대형 참호를 팔때 필요한 시간을 설정합니다. (초 단위) Big Trench Remove Duration @@ -313,6 +332,8 @@ Tiempo de eliminar trinchera grande Czas usuwania dużego okopu Kleiner Graben - Aufschüttdauer + 大型战壕回填时间 + 대형참호 제거 시간 Time, in seconds, required to remove a big trench. @@ -322,6 +343,8 @@ Tiempo, en segundos, requerido para eliminar una trinchera grande Czas, w sekundach wymagany do usunięcia dużego okopu Zeit in Sekunden, um einen großen Graben aufzuschütten. + 回填一条大型战壕所需的时间(秒)。 + 대형 참호를 제거할때 필요한 시간을 설정합니다. (초 단위) diff --git a/addons/ui/CfgInGameUI.hpp b/addons/ui/CfgInGameUI.hpp new file mode 100644 index 0000000000..b9a1c447dc --- /dev/null +++ b/addons/ui/CfgInGameUI.hpp @@ -0,0 +1,5 @@ +class CfgInGameUI { + class DefaultAction { + size = QUOTE(profileNamespace getVariable [ARR_2('GVAR(hideDefaultActionIcon)', (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8))]); + }; +}; diff --git a/addons/ui/config.cpp b/addons/ui/config.cpp index 6dfeba4cfb..0a04e1fccb 100644 --- a/addons/ui/config.cpp +++ b/addons/ui/config.cpp @@ -15,6 +15,7 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "CfgInGameUI.hpp" #include "CfgVehicles.hpp" #include "ACE_Settings.hpp" #include "ACE_UI.hpp" diff --git a/addons/ui/initSettings.sqf b/addons/ui/initSettings.sqf index 55160a7888..dc701b91d5 100644 --- a/addons/ui/initSettings.sqf +++ b/addons/ui/initSettings.sqf @@ -294,7 +294,7 @@ if (productVersion select 4 == 'Development') then { QGVAR(enableSpeedIndicator), "CHECKBOX", [LSTRING(EnableSpeedIndicator), LSTRING(EnableSpeedIndicator_Description)], - "ACE " + LLSTRING(Category), + _category, true, true, { if (!_this) then { @@ -303,3 +303,16 @@ if (productVersion select 4 == 'Development') then { }; } ] call CBA_fnc_addSetting; + +[ + QGVAR(hideDefaultActionIcon), + "CHECKBOX", + [LSTRING(HideDefaultActionIcon), LSTRING(HideDefaultActionIcon_Description)], + _category, + false, + 2, { + profileNamespace setVariable [QGVAR(hideDefaultActionIcon), [nil, 0] select _this]; + saveProfileNamespace; + }, + true // needs restart +] call CBA_fnc_addSetting; diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml index ba961711f0..6270ab7c77 100644 --- a/addons/ui/stringtable.xml +++ b/addons/ui/stringtable.xml @@ -12,7 +12,7 @@ Benutzeroberfläche 사용자 인터페이스 Interfaccia Utente - 使用者介面 + 用户界面 使用者介面 Interfaz de usuario Kullanıcı Arayüzü @@ -28,7 +28,7 @@ Benutzeroberfläche 사용자 인터페이스 Interfaccia Utente - 使用者介面 + 用户界面 使用者介面 Interfaz de usuario Kullanıcı Arayüzü @@ -41,9 +41,9 @@ モジュールではユーザ インタフェイスの一部表示を切り替えできます。 Moduł ten pozwala zmienić stan widoczności poszczególnych elementów UI. Dieses Modul erlaubt es, Teile der Benutzeroberfläche (UI) an- oder auszuschalten. - 이 모듈은 사용자 인터페이스의 부분을 토글하는것을 가능케 해줍니다. + 이 모듈은 사용자 인터페이스의 부분을 토글하는 것을 가능케 해줍니다. Questo modulo consente di commutare parti di interfaccia utente visibili. - 此模块允许你调整使用者介面的任何一个元件 + 此模块允许你调整用户界面的任何一个控件 此模塊允許你調整使用者介面的任何一個元件 Tento modul umožňuje přepínání viditelných částí uživatelského rozhraní. Este módulo permite activar la visibilidad de apartados de la interfaz @@ -59,7 +59,7 @@ Erlaube selektives UI 선택적 사용자 인터페이스 허가 Permette l'UI Selettiva - 允许调整使用者介面 + 允许调整用户界面 允許調整使用者介面 Permitir IU selectiva @@ -72,9 +72,9 @@ クライアントがユーザ インタフェイスを編集できるようにします。 Zezwól klientowi na modyfikację UI. Erlaube Clients, ihr UI zu modifizieren. - 클라이언트가 선택적 사용자 인터페이스 사용하는것을 허가합니다 + 클라이언트가 자신의 사용자 인터페이스를 사용하는 것을 허가합니다 Permette al client di modificare la propria UI. - 允许客户端自行调整使用者介面 + 允许客户端自行调整用户界面 允許客戶端自行調整使用者介面 Permitir al cliente modificar su interfaz. @@ -89,7 +89,7 @@ Soldat/Fahrzeug/Waffe Information 병사/차량/무기 정보 Informazioni Soldato/Veicolo/Arma - 士兵/载具/武器资讯栏 + 士兵/载具/武器信息栏 士兵/載具/武器資訊欄 Información de soldado / vehículo / arma @@ -120,7 +120,7 @@ Fahrzeugkompass 차량 나침반 Bussola Veicolo - 载具指北针 + 载具指南针 載具指北針 Brújula del vehículo Araç Pusulası @@ -136,7 +136,7 @@ Kommandomenü 지휘 메뉴 Menù di Comando - 指挥选单 + 指挥菜单 指揮選單 Menú de Comando Komut Menüsü @@ -165,6 +165,8 @@ Znak wodny wersji deweloperskiej 開発版ウォーターマーク Wasserzeichen für Entwicklungsversion + 开发建设水印 + 개발용 빌드 워터마크 Weapon Name @@ -319,7 +321,7 @@ Hintergrund der unteren Waffen-Info-Leiste 무기 상세 정보 배경 Informazioni Sfondo Arma Bassa - 武器底部资讯栏背景 + 武器底部信息栏背景 武器底部資訊欄背景 Fondo de información inferior de arma Nižší pozadí panulu s informacemi o zbrani @@ -349,7 +351,7 @@ 体力バー Pasek staminy Ausdaueranzeige - 체력 막대 + 지구력 막대 Barra Stamina 体力栏 體力欄 @@ -506,7 +508,7 @@ Hintergrund der unteren Waffen-Info-Leiste (Richtschütze) 사수 무기 상세 정보 배경 Informazioni Sfondo Arma Artigliere Bassa - 炮手武器底部资讯栏背景 + 炮手武器底部信息栏背景 砲手武器底部資訊欄背景 Nižší pozadí panelu s informacemi o zbrani vozidla Fondo de información inferior de armamento de artillero @@ -617,7 +619,7 @@ Fahrzeug Info Hintergrund 차량 정보 배경 Informazioni Sfondo Veicolo - 载具资讯栏背景 + 载具信息栏背景 載具資訊欄背景 Fondo de información del vehículo @@ -632,7 +634,7 @@ Benötigt Soldat/Fahrzeug/Waffe Information. 병사/차량/무기의 정보가 필요합니다. Richiede informazione Soldato/Veicolo/Arma. - 需要士兵/载具/武器的资讯. + 需要士兵/载具/武器的信息。 需要士兵/載具/武器的資訊. Requiere información de Soldado/Vehículo. @@ -645,9 +647,9 @@ ユーザ インタフェイスの変更は無効化されています。 Modyfikacja interfejsu użytkownika jest wyłączona. Die Modifizierung des UI ist deaktiviert. - 사용자 인터페이스 변경이 비활성화 되어있습니다. + 사용자 인터페이스 변경이 비활성화 되어 있습니다. La modifica dell'Interfaccia Utente è disabilitata. - 自定使用者介面功能已关闭 + 自定用户界面功能已关闭 自定使用者介面功能已關閉 La modificación de la interfaz de usuario está desactivada. @@ -661,7 +663,7 @@ Gesperrte UI-Elemente können nicht modifiziert werden. 강제 사용자 인터페이스는 변경하실 수 없습니다. Impossibile modificare un elemento forzato d' Interfaccia Utente. - 无法编辑已被锁定的使用者介面元件 + 无法编辑已被锁定的用户界面控件 無法編輯已被鎖定的使用者介面元件 Nelze upravit prvek vynuceného uživatelského rozhraní. No se puede modificar un elemento forzado de la Interfaz del Usuario @@ -673,6 +675,8 @@ Indicateur de vitesse de déplacement Включить индикатор скорости передвижения Aktiviere Bewegungsgeschwindigkeits-Indikator + 启用移动速度指示器 + 이동 속도 표시기 활성화 Enables movement speed indicator for player character. @@ -681,6 +685,22 @@ Affiche un indicateur permettant de visualiser la vitesse de déplacement du personnage. Включает индикатор скорости передвижения персонажа игрока. Aktiviere den Bewegungsgeschwindigkeits-Indikator des Spielers. + 为玩家角色启用移动速度指示器。 + 플레이어 캐릭터를 위한 이동속도 표시기를 활성화합니다. + + + Hide Default Action Icon + デフォルトのアクションアイコンを非表示 + Ukryj domyślną ikonę akcji + 기본 행동 아이콘 숨기기 + 隐藏默认动作标识 + + + Hides the icon shown automatically when something is in front of the cursor. Requires a game restart.\nWarning: Does not remove the action itself! It is advisable to unbind 'Use default action' key to prevent unwanted interactions. + カーソルの前に何かがあるときに自動的に表示されるアイコンを非表示にします。 ゲームを再起動する必要があります。\n警告:アクション自体は削除されません! 誤って実行することを防ぐために、'標準アクション'キーのバインドを解除することをお勧めします。 + Ukrywa ikonę wyświetlaną automatycznie, gdy coś znajduje się przed kursorem. Wymaga ponownego uruchomienia gry.\nOstrzeżenie: Nie usuwa samej akcji! Zaleca się usunięcia przypisania klawisza „Użyj domyślnej akcji”, aby zapobiec niechcianym interakcjom. + 커서 앞에 무언가가 있을 때 자동으로 표시되는 아이콘을 숨깁니다. 게임을 재시작해야 합니다\n경고: 작업 자체를 제거하지 않습니다! 원하지 않는 상호작용을 방지하려면 '기본 행동' 키를 삭제하는 것이 좋습니다. + 隐藏屏幕面前有物体时自动显示的动作标识。需要重新启动游戏。\n警告:不会删除动作本身!建议同时取消对“使用默认动作”键的绑定,以防止不必要的互动。 diff --git a/addons/vector/CfgWeapons.hpp b/addons/vector/CfgWeapons.hpp index 5ffe99eea9..12c6efdaf9 100644 --- a/addons/vector/CfgWeapons.hpp +++ b/addons/vector/CfgWeapons.hpp @@ -19,6 +19,7 @@ class CfgWeapons { reticleSafezoneSize = 1; hidePeripheralVision = 1; opticsPPEffects[] = {QGVAR(OpticsRadBlur1)}; + disableTilt = 1; }; weaponInfoType = "ACE_RscOptics_vector"; }; diff --git a/addons/vector/stringtable.xml b/addons/vector/stringtable.xml index 765722f585..a3451971e7 100644 --- a/addons/vector/stringtable.xml +++ b/addons/vector/stringtable.xml @@ -13,7 +13,7 @@ Vector 21 Nite Vector 21 Nite ベクター 21 ナイト - Vector 21 Nite + 벡터 21 야간투시 Vector 21 Nite Vector 21 Nite Vector 21 Nite @@ -30,7 +30,7 @@ Vector 21 Vector 21 ベクター 21 - Vector 21 + 벡터 21 Vector 21 Vector 21 Vector 21 @@ -64,8 +64,8 @@ Vector - Irányszög gomb Vector – Азимут ベクター - 方位角キー - Vector - 방위각 키 - Vector - 方位按键 + 벡터 - 방위각 키 + Vector—方位按键 Vector - 方位按鍵 Vector - Azimuth Tuşu @@ -81,8 +81,8 @@ Vector - Távolság gomb Vector – Расстояние ベクター - 距離キー - Vector - 거리 키 - Vector - 距离按键 + 벡터 - 거리 키 + Vector—距离按键 Vector - 距離按鍵 Vector - Mesafe Tuşu diff --git a/addons/vehicle_damage/config.cpp b/addons/vehicle_damage/config.cpp index 4b1c790681..1d13491c82 100644 --- a/addons/vehicle_damage/config.cpp +++ b/addons/vehicle_damage/config.cpp @@ -9,7 +9,7 @@ class CfgPatches { // ammo/vehicle config defines touch all of these requiredAddons[] = { "ace_common", "ace_cookoff" }; author = ECSTRING(common,ACETeam); - authors[] = {"Brandon (TCVM)"}; + authors[] = {"Dani (TCVM)"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/vehicle_damage/functions/fnc_abandon.sqf b/addons/vehicle_damage/functions/fnc_abandon.sqf index 6740cf2476..b818581fd2 100644 --- a/addons/vehicle_damage/functions/fnc_abandon.sqf +++ b/addons/vehicle_damage/functions/fnc_abandon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Forces the AI currently in a vehicle to bail out. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_addDamage.sqf b/addons/vehicle_damage/functions/fnc_addDamage.sqf index 4cc6726953..c5ff04292e 100644 --- a/addons/vehicle_damage/functions/fnc_addDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_addDamage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Sets vehicle damage based on HitIndex. Failing that it falls back to HitPoint name. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf index 5c14a2f469..f08c58f574 100644 --- a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf +++ b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Adds the event handler to a vehicle. * * Arguments: @@ -25,7 +25,7 @@ if !(GVAR(enabled)) exitWith { }; private _hitpointHash = [[], nil] call CBA_fnc_hashCreate; -private _vehicleConfig = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _vehicleConfig = configOf _vehicle; private _hitpointsConfig = _vehicleConfig >> "HitPoints"; private _turretConfig = _vehicleConfig >> "Turrets"; private _eraHitpoints = [_vehicleConfig >> QGVAR(eraHitpoints), "ARRAY", []] call CBA_fnc_getConfigEntry; diff --git a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf b/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf index 48792bdbcb..ae787f2805 100644 --- a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf +++ b/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Calculates whether or not hit penetrated given armour or not. Only enabled with advanced penetration simulation turned on. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_detonate.sqf b/addons/vehicle_damage/functions/fnc_detonate.sqf index f615c4cdb5..d29daed48d 100644 --- a/addons/vehicle_damage/functions/fnc_detonate.sqf +++ b/addons/vehicle_damage/functions/fnc_detonate.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Detonates vehicle ammo and heavily wounds all inside. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleBail.sqf b/addons/vehicle_damage/functions/fnc_handleBail.sqf index e81c4cd76f..860403c8d0 100644 --- a/addons/vehicle_damage/functions/fnc_handleBail.sqf +++ b/addons/vehicle_damage/functions/fnc_handleBail.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Handles whether or not the crew should bail. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf index 2f48f76116..9d97b393f3 100644 --- a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf +++ b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Checks hitpoint damage and determines if a vehicle should cookoff. * * Arguments: @@ -25,9 +25,10 @@ params ["_vehicle", "_chanceOfFire", "_intensity", ["_injurer", objNull], ["_hit private _alreadyCookingOff = _vehicle getVariable [QGVAR(cookingOff), false]; if (!_alreadyCookingOff && { _chanceOfFire >= random 1 }) exitWith { - private _fireDetonateChance = [configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(detonationDuringFireProb), "number", 0] call CBA_fnc_getConfigEntry; + private _configOf = configOf _vehicle; + private _fireDetonateChance = [_configOf >> QGVAR(detonationDuringFireProb), "number", 0] call CBA_fnc_getConfigEntry; if (_canRing) then { - _canRing = 1 isEqualTo ([configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(canHaveFireRing), "number", 0] call CBA_fnc_getConfigEntry); + _canRing = ([_configOf >> QGVAR(canHaveFireRing), "number", 0] call CBA_fnc_getConfigEntry) == 1; }; private _delayWithSmoke = _chanceOfFire < random 1; diff --git a/addons/vehicle_damage/functions/fnc_handleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleDamage.sqf index 30bf4408ab..5a2865ba3e 100644 --- a/addons/vehicle_damage/functions/fnc_handleDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_handleDamage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Called by "HandleDamage" event handler. Sets up hit array for this frame's damage. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf index 9735746a06..4a01a0ada6 100644 --- a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf +++ b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Checks hitpoint damage and determines if a vehicle should cookoff. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf index 4d39dc6b78..2dca6de8c6 100644 --- a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Process vehicle hit. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_injureOccupants.sqf b/addons/vehicle_damage/functions/fnc_injureOccupants.sqf index 7dc93cabd4..3e1f29a09d 100644 --- a/addons/vehicle_damage/functions/fnc_injureOccupants.sqf +++ b/addons/vehicle_damage/functions/fnc_injureOccupants.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Injures occupants in a vehicle based on percent chance of injury. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_knockOut.sqf b/addons/vehicle_damage/functions/fnc_knockOut.sqf index 6e554d8edd..773e4f9400 100644 --- a/addons/vehicle_damage/functions/fnc_knockOut.sqf +++ b/addons/vehicle_damage/functions/fnc_knockOut.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Knock out vehicle from battle. Destroy all internal hitpoints. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_processHit.sqf b/addons/vehicle_damage/functions/fnc_processHit.sqf index d548eed5a3..b27425b4d2 100644 --- a/addons/vehicle_damage/functions/fnc_processHit.sqf +++ b/addons/vehicle_damage/functions/fnc_processHit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: Dani (TCVM) * Process hit by projectile against vehicle and apply appropiate damage to part. * * Arguments: @@ -146,7 +146,7 @@ private _chanceOfDetonation = 0; private _explosiveAmmoCount = 0; private _nonExplosiveAmmoCount = 0; -if !(count (_currentVehicleAmmo select 0) isEqualTo 0) then { +if (count (_currentVehicleAmmo select 0) isNotEqualTo 0) then { private _magConfig = configFile >> "CfgMagazines"; private _ammoConfig = configFile >> "CfgAmmo"; private _countOfExplodableAmmo = 0; diff --git a/addons/vehicle_damage/initSettings.sqf b/addons/vehicle_damage/initSettings.sqf index e0d02acfbb..ae322a6fd8 100644 --- a/addons/vehicle_damage/initSettings.sqf +++ b/addons/vehicle_damage/initSettings.sqf @@ -2,7 +2,7 @@ QGVAR(enabled), "CHECKBOX", [ELSTRING(common,Enabled), LSTRING(setting_description)], LSTRING(category_displayName), - true, // default value + false, // default value true, // isGlobal {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart diff --git a/addons/vehicle_damage/stringtable.xml b/addons/vehicle_damage/stringtable.xml index b9def24abe..8bae2d8ef9 100644 --- a/addons/vehicle_damage/stringtable.xml +++ b/addons/vehicle_damage/stringtable.xml @@ -7,6 +7,8 @@ ACE Dégâts de véhicule avancés ACE Erweiterter Fahrzeugsschaden ACE Zaawansowany system uszkodzeń pojazdów + ACE 高级载具损坏 + ACE 고급 차량 피해 Enable/Disable advanced vehicle damage @@ -14,6 +16,8 @@ Active les dégâts de véhicule avancés. Aktiviert/Deaktiviert den Erweiterten Fahrzeugsschaden Włącz/Wyłącz zaawansowane uszkodzenia pojazdów + 启用/禁用高级载具损坏 + 고급 차량 피해 활성화/비활성화 Enable/Disable advanced car damage (Experimental) @@ -21,6 +25,8 @@ Active les dégâts avancés sur les voitures (expérimental). Aktiviert/Deaktiviert den Erweiterten Fahrzeugsschaden (Experimentell) Włącz/Wyłącz zaawansowane uszkodzenia w samochodach (eksperymentalne) + 启用/禁用高级车辆损坏(实验性) + 고급 차량 피해(실험용) 활성화/비활성화 Enable/Disable advanced Car Damage @@ -28,6 +34,8 @@ Dégâts de voiture avancés Aktiviert/Deaktiviert erweiterten Autoschaden Włącz/Wyłącz zaawansowane uszkodzenia w samochodach + 启用/禁用高级车辆损坏 + 고급 차량 피해 활성화/비활성화 Removes all vehicle ammo after cook-off @@ -35,6 +43,8 @@ Retire toutes les munitions des véhicules après une auto-inflammation. Entfernt die gesamte Munition nach dem Durchzünden der Munition eines Fahrzeuges. Usuwa całą amunicję z pojazdu po samozapłonie + 殉爆后移除所有车辆弹药 + 쿡오프 현상 후 차량에서 모든 탄약을 제거합니다. Enable/Disable Ammo Removal During Cook-Off @@ -42,6 +52,8 @@ Retirer les munitions durant l'auto-inflammation Aktiviert/Deaktiviert Entfernung der Munition beim Durchzünden Włącz/Wyłącz usuwanie amunicji podczas samozapłonu + 启用/禁用殉爆过程中的弹药移除功能 + 쿡오프시 탄약 제거 활성화/비활성화 Wreck (Turret) @@ -56,7 +68,7 @@ 잔해(포탑) 残骸 (砲塔) 殘骸 (砲塔) - 残骸 (炮塔) + 残骸(炮塔) diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 0c3bcc4585..f94844eb3d 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -29,7 +29,7 @@ Sblocca il Veicolo Destravar veículo 車両の鍵を開ける - 차량 잠금열기 + 차량 잠금해제 载具解锁 載具解鎖 Araç Kilidini Aç @@ -80,7 +80,7 @@ Scassino il veicolo... Usando Mixa... 鍵をこじ開けている・・・ - 문따는중... + 문따는 중... 正在开锁... 解鎖中... Maymuncuklanıyor... @@ -130,7 +130,7 @@ Um set de chave mixas que pode abrir a maioria dos veículos. ピッキング ツールでは多くの車両をこじ開けられます。 거의 모든 차량을 열 수 있게 해주는 해정도구 모음입니다. - 一组解锁钥匙 (可解锁大部份载具) + 一组解锁钥匙(可解锁大部份载具) 一組解鎖鑰匙 (可解鎖大部份載具) @@ -145,8 +145,8 @@ Una chiave che apre la maggior parte dei veicoli occidentali Uma chave que abre a maioria dos veículos ocidentais このキーは多くの同盟軍車両を開けられます。 - 거의 모든 서방진영 차량을 여는 열쇠입니다. - 一组解锁钥匙 (可解锁大部份蓝方载具) + 거의 모든 청군 진영 차량을 여는 열쇠입니다. + 一组解锁钥匙(可解锁大部份蓝方载具) 一組解鎖鑰匙 (可解鎖大部份藍方載具) @@ -161,8 +161,8 @@ Una chaive che apre la maggior parte dei veicoli orientali Uma chave que abre a maioria dos veículos orientais このキーは多くのOPFOR軍車両を開けられます。 - 거의 모든 동방진영 차량을 여는 열쇠입니다. - 一组解锁钥匙 (可解锁大部份红方载具) + 거의 모든 대항군 진영 차량을 여는 열쇠입니다. + 一组解锁钥匙(可解锁大部份红方载具) 一組解鎖鑰匙 (可解鎖大部份紅方載具) @@ -177,8 +177,8 @@ Una chaive che apre la maggior parte dei veicoli degli indipendenti Uma chave que abre a maioria dos veículos independentes このキーは多くの独立軍車両を開けられます。 - 거의 모든 중립진영 차량을 여는 열쇠입니다. - 一组解锁钥匙 (可解锁大部份独立方载具) + 거의 모든 무소속군 진영 차량을 여는 열쇠입니다. + 一组解锁钥匙(可解锁大部份独立方载具) 一組解鎖鑰匙 (可解鎖大部份獨立方載具) @@ -194,7 +194,7 @@ Uma chave que abre a maioria dos veículos civis. このキーは多くの市民車両を開けられます。 거의 모든 민간인 차량을 여는 열쇠입니다 - 一组解锁钥匙 (可解锁大部份平民载具) + 一组解锁钥匙(可解锁大部份平民载具) 一組解鎖鑰匙 (可解鎖大部份平民載具) @@ -241,7 +241,7 @@ Закрывать инвентарь транспорта, если транспорт закрыт Blocca l'inventario di un veicolo bloccato 施錠されている車両の開けないインベントリ - 잠긴 차량의 소지품을 뒤지지못하게 합니다. + 잠긴 차량의 소지품을 뒤지지 못하게 합니다. 上锁载具的车箱,使玩家不能拿取/查看载具内的装备 上鎖載具的車箱,使玩家不能拿取/查看載具內的裝備 @@ -257,7 +257,7 @@ Начальное состояние замков Stato Iniziale del Blocco per Veicoli 開始時における車両の鍵の状態 - 시작시 차량 잠금 상태 + 시작 시 차량 잠금 상태 载具初始上锁状态 載具初始上鎖狀態 @@ -273,8 +273,8 @@ Устанавливает начальное состояние замков всех транспортных средств (устраняет неоднозначные состояния) Imposta lo stato di blocco per tutti i veicoli (rimuove stati di blocco ambigui) 全車両へ鍵の状態を設定します。(あいまいな鍵の状態を削除) - 모든 차량의 잠금 상태를 정합니다. (애매한 잠금 상태는 모두 없앱니다.) - 设定所有载具的初始上锁状态 (移除不明确的锁定状态) + 모든 차량의 잠금 상태를 정합니다. (불분명한 잠금 상태는 모두 없앱니다.) + 设定所有载具的初始上锁状态(移除不明确的锁定状态) 設定所有載具的初始上鎖狀態 (移除不明確的鎖定狀態) @@ -285,6 +285,8 @@ Usuń niejednoznaczny stan blokady あいまいな鍵の状態を削除 Unklaren Sperrzustand entfernen + 移除不明确的上锁状态 + 불분명한 잠금상태 제거 As Is @@ -364,7 +366,7 @@ Tempo Default richiesto per forzare serrature (in secondi). Default: 10 ピッキング ツールを使った作業時間の標準設定。(秒) 標準: 10 해정을 위해 들이는 기본시간입니다(초 단위). 기본설정: 10 - 开锁时间(秒)。预设:10 + 开锁时间(秒)。预设:10 開鎖時間(秒)。預設:10 @@ -411,7 +413,7 @@ Синхронизируйте с транспортом и игроком. Это выдаст игроку ключи от всех синхронизированных транспортных средств. Работает только для объектов, присутствующих на старте миссии Sincronizza con veicoli e giocatori. Distribuirà chiavi ai giocatori per ogni veicolo sincronizzato. Valido solo per oggetti presenti ad inizio missione. 車両とプレイヤへ同期します。プレイヤへ同期された車両のカスタム キーを作ります。これはミッション開始時に作成されたオブジェクトでのみ有効です。 - 차량과 플레이어에게 동기화됩니다. 동기화된 차량은 플레이어에게 열쇠를 지급합니다. 오직 미션 시작시에 생긴 물체들만 유효합니다. + 차량과 플레이어에게 동기화됩니다. 동기화된 차량은 플레이어에게 열쇠를 지급합니다. 오직 미션 시작 시에 생긴 물체들만 유효합니다. 可同步在载具与玩家身上。将使被同步的玩家掌握其他被同步载具的钥匙。此模块只会在任务刚开始时触发。 可同步在載具與玩家身上。將使被同步的玩家掌握其他被同步載具的鑰匙。此模塊只會在任務剛開始時觸發 diff --git a/addons/vehicles/CfgEventHandlers.hpp b/addons/vehicles/CfgEventHandlers.hpp index 062417fc1c..99633dc28d 100644 --- a/addons/vehicles/CfgEventHandlers.hpp +++ b/addons/vehicles/CfgEventHandlers.hpp @@ -18,7 +18,7 @@ class Extended_PostInit_EventHandlers { }; class Extended_Engine_EventHandlers { - class Car { + class AllVehicles { class ACE_EngineStartDelay { clientEngine = QUOTE(if (local driver (_this select 0)) then {_this call FUNC(startEngine)};); }; diff --git a/addons/vehicles/XEH_postInit.sqf b/addons/vehicles/XEH_postInit.sqf index 23b1a2b226..8b1866c8ee 100644 --- a/addons/vehicles/XEH_postInit.sqf +++ b/addons/vehicles/XEH_postInit.sqf @@ -7,38 +7,66 @@ GVAR(isSpeedLimiter) = false; ["ACE3 Vehicles", QGVAR(speedLimiter), localize LSTRING(SpeedLimiter), { private _connectedUAV = getConnectedUAV ACE_player; - private _uavControll = UAVControl _connectedUAV; - if ((_uavControll select 1) == "DRIVER") then { + private _uavControl = UAVControl _connectedUAV; + if ((_uavControl select 1) == "DRIVER") then { if !(_connectedUAV isKindOf "UGV_01_base_F") exitWith {false}; GVAR(isUAV) = true; - [_uavControll select 0, _connectedUAV] call FUNC(speedLimiter); + [_uavControl select 0, _connectedUAV] call FUNC(speedLimiter); true } else { // Conditions: canInteract if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(ACE_player == driver vehicle ACE_player && - {vehicle ACE_player isKindOf 'Car' || - {vehicle ACE_player isKindOf 'Tank'} || - {vehicle ACE_player isKindOf 'Plane'}}) exitWith {false}; + private _vehicle = vehicle ACE_player; + if ( + ACE_player != driver _vehicle + || {-1 == ["Car", "Tank", "Ship"] findIf {_vehicle isKindOf _x}} + ) exitWith {false}; - GVAR(isUAV) = false; + GVAR(isUAV) = false; // Statement - if (vehicle ACE_player isKindOf 'Plane') then { - [ACE_player, vehicle ACE_player] call FUNC(autoThrottle); + [ACE_player, _vehicle] call FUNC(speedLimiter); + true + }; +}, +{false}, +[DIK_DELETE, [false, false, false]], false] call CBA_fnc_addKeybind; + +["ACE3 Vehicles", QGVAR(cruiseControl), localize LSTRING(CruiseControl), { + private _connectedUAV = getConnectedUAV ACE_player; + private _uavControl = UAVControl _connectedUAV; + if ((_uavControl select 1) == "DRIVER") then { + if !(_connectedUAV isKindOf "UGV_01_base_F") exitWith {false}; + GVAR(isUAV) = true; + [_uavControl select 0, _connectedUAV, true] call FUNC(speedLimiter); + true + } else { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + private _vehicle = vehicle ACE_player; + if ( + ACE_player != driver _vehicle + || {-1 == ["Car", "Tank", "Ship", "Plane"] findIf {_vehicle isKindOf _x}} + ) exitWith {false}; + + GVAR(isUAV) = false; + // Statement + if (_vehicle isKindOf "Plane") then { + [ACE_player, _vehicle] call FUNC(autoThrottle); } else { - [ACE_player, vehicle ACE_player] call FUNC(speedLimiter); + [ACE_player, _vehicle, true] call FUNC(speedLimiter); }; true }; - }, {false}, -[211, [false, false, false]], false] call CBA_fnc_addKeybind; //DELETE Key +[DIK_INSERT, [false, false, false]], false] call CBA_fnc_addKeybind; ["ACE3 Vehicles", QGVAR(scrollUp), localize LSTRING(IncreaseSpeedLimit), { if (GVAR(isSpeedLimiter)) then { GVAR(speedLimit) = round (GVAR(speedLimit) + GVAR(speedLimiterStep)) max (5 max GVAR(speedLimiterStep)); + GVAR(speedLimit) = 5 max GVAR(speedLimiterStep) * floor (GVAR(speedLimit) / GVAR(speedLimiterStep)); [["%1: %2", LSTRING(SpeedLimit), GVAR(speedLimit)]] call EFUNC(common,displayTextStructured); true }; @@ -47,6 +75,7 @@ GVAR(isSpeedLimiter) = false; ["ACE3 Vehicles", QGVAR(scrollDown), localize LSTRING(DecreaseSpeedLimit), { if (GVAR(isSpeedLimiter)) then { GVAR(speedLimit) = round (GVAR(speedLimit) - GVAR(speedLimiterStep)) max (5 max GVAR(speedLimiterStep)); + GVAR(speedLimit) = 5 max GVAR(speedLimiterStep) * ceil (GVAR(speedLimit) / GVAR(speedLimiterStep)); [["%1: %2", LSTRING(SpeedLimit), GVAR(speedLimit)]] call EFUNC(common,displayTextStructured); true }; diff --git a/addons/vehicles/functions/fnc_speedLimiter.sqf b/addons/vehicles/functions/fnc_speedLimiter.sqf index ba3928e3e0..5be170697a 100644 --- a/addons/vehicles/functions/fnc_speedLimiter.sqf +++ b/addons/vehicles/functions/fnc_speedLimiter.sqf @@ -6,41 +6,69 @@ * Arguments: * 0: Driver * 1: Vehicle + * 2: Cruise Control * * Return Value: * None * * Example: - * [player, car] call ace_vehicles_fnc_speedLimiter + * [player, car, true] call ace_vehicles_fnc_speedLimiter * * Public: No */ -params ["_driver", "_vehicle"]; +params ["_driver", "_vehicle", ["_cruiseControl", false]]; if (GVAR(isSpeedLimiter)) exitWith { - [localize LSTRING(Off)] call EFUNC(common,displayTextStructured); - playSound "ACE_Sound_Click"; - _vehicle setCruiseControl [0, false]; - GVAR(isSpeedLimiter) = false; + switch ([GVAR(isCruiseControl), _cruiseControl]) do { + case [true, true]: { + [localize LSTRING(OffCruise)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [0, false]; + GVAR(isSpeedLimiter) = false; + GVAR(isCruiseControl) = false; + }; + case [true, false]: { + [localize LSTRING(On)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [GVAR(speedLimit), false]; + GVAR(isCruiseControl) = false; + }; + case [false, true]: { + [localize LSTRING(OnCruise)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [GVAR(speedLimit), true]; + GVAR(isCruiseControl) = true; + }; + case [false, false]: { + [localize LSTRING(Off)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + _vehicle setCruiseControl [0, false]; + GVAR(isSpeedLimiter) = false; + }; + }; }; (getCruiseControl _vehicle) params ["_speedLimit"]; if (_speedLimit != 0) exitWith { TRACE_1("speed limit set by external source",_speedLimit); }; -[localize LSTRING(On)] call EFUNC(common,displayTextStructured); +[localize ( + [LSTRING(On), LSTRING(OnCruise)] select _cruiseControl +)] call EFUNC(common,displayTextStructured); playSound "ACE_Sound_Click"; GVAR(isSpeedLimiter) = true; +GVAR(isCruiseControl) = _cruiseControl; GVAR(speedLimit) = round (speed _vehicle max 5); +GVAR(speedLimitInit) = true; [{ params ["_args", "_idPFH"]; _args params ["_driver", "_vehicle"]; if (GVAR(isUAV)) then { - private _uavControll = UAVControl _vehicle; - if ((_uavControll select 0) != _driver || _uavControll select 1 != "DRIVER") then { + private _uavControl = UAVControl _vehicle; + if ((_uavControl select 0) != _driver || _uavControl select 1 != "DRIVER") then { GVAR(isSpeedLimiter) = false; TRACE_1("UAV driver changed, disabling speedlimit",_vehicle); _vehicle setCruiseControl [0, false]; @@ -58,11 +86,16 @@ GVAR(speedLimit) = round (speed _vehicle max 5); [_idPFH] call CBA_fnc_removePerFrameHandler; }; - getCruiseControl _vehicle params ["_currentSpeedLimit"]; + getCruiseControl _vehicle params ["_currentSpeedLimit", "_cruiseControlActive"]; + if (GVAR(isCruiseControl) && {!GVAR(speedLimitInit) && {!_cruiseControlActive}}) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + GVAR(isSpeedLimiter) = false; + [localize LSTRING(OffCruise)] call EFUNC(common,displayTextStructured); + playSound "ACE_Sound_Click"; + }; if (round _currentSpeedLimit != GVAR(speedLimit)) then { TRACE_2("Updating speed limit",GVAR(speedLimit),_vehicle); - _vehicle setCruiseControl [GVAR(speedLimit), false]; + _vehicle setCruiseControl [GVAR(speedLimit), GVAR(isCruiseControl)]; + GVAR(speedLimitInit) = false; }; - - }, 0, [_driver, _vehicle]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/vehicles/initSettings.sqf b/addons/vehicles/initSettings.sqf index 500cd8d852..eb15ea346f 100644 --- a/addons/vehicles/initSettings.sqf +++ b/addons/vehicles/initSettings.sqf @@ -25,5 +25,5 @@ "SLIDER", LSTRING(SpeedLimiterStep), ELSTRING(common,ACEKeybindCategoryVehicles), - [1, 10, 5, 0] + [1, 10, 5, -1] // whole numbers only ] call CBA_fnc_addSetting; diff --git a/addons/vehicles/script_component.hpp b/addons/vehicles/script_component.hpp index ae4eec2fd0..a559ab6d7a 100644 --- a/addons/vehicles/script_component.hpp +++ b/addons/vehicles/script_component.hpp @@ -6,6 +6,8 @@ // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + #ifdef DEBUG_ENABLED_VEHICLES #define DEBUG_MODE_FULL #endif diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index bb6ca8d48a..142b4e4d6c 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -18,6 +18,14 @@ 啟用速度限制 Hız Sabitleyeciı Açık + + Cruise control on + Tempomat an + 자동운전 켜짐 + Tempomat włączony + クルーズコントロールを有効化 + 开启巡航模式 + Speed Limiter off Geschwindigkeitsbegrenzer aus @@ -35,19 +43,29 @@ 停用速度限制 Hız Sabitleyeci Kapalı + + Cruise control off + Tempomat aus + 자동운전 꺼짐 + Tempomat wyłączony + クルーズコントロールを無効化 + 关闭巡航模式 + Speed Limit Geschwindigkeitsbegrenzung Limite di velocità - 速度制限 + 制限速度 Ograniczenie prędkości Ограничение скорости Limite de Velocidade Límite de velocidad Rychlostní omezení 速限 + 限速 Vitesse limite Hız Limiti + 속도 제한 Speed Limiter @@ -66,33 +84,45 @@ 速度限制器 Hız Sabitleyici + + Cruise Control + Tempomat + 자동운전 + Tempomat + クルーズコントロール + 巡航模式 + Increase Speed Limit Maximale Geschwindigkeit erhöhen Aumenta limite di velocità - 速度制限を増やす + 制限速度を増やす Zwiększ ograniczenie prędkości Увеличить ограничение скорости Aumentar Limite de Velocidade Aumentar límite de velocidad Zvyš rychlostní limit 增加速限 + 提高限速 Augmenter la vitesse limite Hız Limitini Arttır + 속도 제한 증가 Decrease Speed Limit Maximale Geschwindigkeit verringern Diminuisce limite di velocità - 速度制限を減らす + 制限速度を減らす Zmniejsz ograniczenie prędkości Уменьшить ограничение скорости Diminuir Limite de Velocidade Disminuir límite de velocidad Sniž rychlostní limit 降低速限 + 降低限速 Diminuer la vitesse limite Hız Limitini Azalt + 속도 제한 감소 Disable automatic engine shut-off @@ -103,10 +133,12 @@ Desactivar apagado automático del motor Vypni automatické vypnutí motoru 關閉引擎自動熄火 + 关闭引擎自动熄火 Désactiver l'arrêt automatique du moteur Wyłącz automatyczne wyłączanie silnika Disattivare lo spegnimento automatico del motore Otomatik motor durdurmayı devre dışı bırak + 자동으로 엔진 끄기 비활성화 Prevent the automatic shut-off of the engine when exiting vehicles. @@ -117,10 +149,12 @@ Desactivar el apagado automático del motor al salir de los vehículos. Zabraň automatickému vypnutí motoru při opuštění vozidla. 避免離開載具時自動熄火。 + 避免离开载具时自动熄火。 Impedire lo spegnimento automatico del motore quando si esce dai veicoli. Empêche l'arrêt automatique du moteur à la sortie des véhicules. Araçtan inerken motorun otomatik kapatılmasını engelleyin. Zapobiegaj automatycznemu wyłączaniu silnika podczas wychodzenia z pojazdu. + 차량에서 내릴 때 자동으로 엔진을 끄는 것을 비활성화 합니다. Hide Eject Action @@ -131,9 +165,11 @@ Ocultar opção de Ejetar Ocultar acción de expulsión 隱藏逃脫動作 + 隐藏下车选项 Masquer l'action d'éjection Nascondi azione di espulsione Schovat vyskočení z vozidla + 탈출 액션 숨기기 Hides the Eject entry from the action menu. Requires a game restart. @@ -144,19 +180,23 @@ Oculta a opção de interação para ejetar. Requer que o jogo seja reiniciado. Oculta la entrada Expulsar del menú de acciones. Requiere un reinicio del juego. 隱藏在動作選單中逃脫動作的選項。要求遊戲重新啟動。 + 隐藏鼠标滚轮菜单中的下车选项。需要重新启动游戏。 Masque l'entrée "Éjection" du menu Action. Nécessite un redémarrage du jeu. Nasconde la voce Espelli dal menu azione. Richiede il riavvio del gioco. Schová akci vyskošení z vozidla z akčního menu. Vyžaduje restart hry. + 휠액션에서 탈출을 숨깁니다. 게임 재시작을 필요로 합니다. Speed Limiter Step Schrittgröße des Geschwindigkeitsbegrenzers Przeskok limitera prędkości Pas du limiteur de vitesse - 設定速度の増減量 + 制限速度の増減量 Krokování omezovače rychlosti Шаг ограничителя скорости Salto de limitador de vehículo + 限速器步长 + 속도 제한기 단위 diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml index 55a55fc4c4..124726731a 100644 --- a/addons/viewdistance/stringtable.xml +++ b/addons/viewdistance/stringtable.xml @@ -14,7 +14,7 @@ Limitatore Distanza Visiva 視界距離の制限 시야 제한기 - 视野距离限制器 + 视距限制器 視野距離限制器 Görüş Uzaklığı Sınırlayıcısı @@ -47,7 +47,7 @@ Abilita distanza visiva ACE ACE 視界距離を有効化 ACE 시야 활성화 - 启用ACE视距 + 启用 ACE 视距 啟用ACE視距 ACE Görüş Uzaklığını Aktif Et @@ -63,8 +63,8 @@ Включает ограничитель дальности видимости ACE Abilita distanza visiva ACE ACE 視界距離を有効化 - ACE 시야 활성화 - 启用ACE视距 + ACE 시야를 활성화 합니다. + 启用 ACE 视距 啟用ACE視距 ACE Görüş Uzaklığını Aktif Et @@ -81,7 +81,7 @@ Limite Distanza Visiva 視界距離の制限 시야 제한기 - 视野距离限制 + 视距限制 視野距離限制 Görüş Uzaklığı Limiti @@ -98,7 +98,7 @@ Imposta il limite massimo a cui i client possono alzare la propria distanza visiva (massimo 10000) 各クライアントが最大まで設定できる視界距離を設定します。(最大 10000) 클라이언트가 최대 얼마나 멀리 볼 수 있는지 제한을 둡니다 (10000 까지 가능) - 设定客户端最高可显示的视野距离 (最高至10000) + 设定客户端最高可显示的视距(最高至10000) 設定客戶端最高可顯示的視野距離 (最高至10000) Kişilerin görüş mesafelerini ne kadar yükseltebileceğine ilişkin sınırı belirler (En Fazla 10000) @@ -114,12 +114,17 @@ Предел дальности видимости клиентов устанавливается здесь и может быть переопределен модулем Limite per la distanza visiva del client impostato qui e può essere scavalcato dal modulo クライアントへの視界距離の設定や、それをモジュールにより上書きできます - 클라이언트의 시야를 이 모듈로 치환할 수 있습니다. + 클라이언트의 시야를 이 모듈로 덮어씌울 수 있습니다. 玩家的视距限制可在此设定,也可透过模块改写 玩家的視距限制可在此設定,也可透過模塊改寫 Setting to 0 will use default video settings + 设置为0将使用默认的视频设置 + 0으로 설정시 기존 비디오 설정을 사용합니다. + Bei Einstellung auf 0 werden die Standard-Videoeinstellungen verwendet. + Ustawienie na 0, spowoduje użycie domyślnych ustawień wideo. + 0に設定すると、デフォルトのビデオ設定が使用されます Client View Distance (On Foot) @@ -134,7 +139,7 @@ Distanza Visiva Client (a Piedi) クライアント側視界距離 (地上) 클라이언트 시야 (보병) - 客户端视野距离 (步行) + 客户端视距(步行) 客戶端視野距離 (步行) Kişilerin Görüş Uzaklığı Mesafesi (Yerde) @@ -151,7 +156,7 @@ Cambia la distanza visiva in gioco quando il giocatore è a piedi. プレイヤーが地上にいる時の視界距離を変更します。 플레이어가 보병일 경우의 시야를 바꿀 수 있습니다. - 改变玩家步行时的视野距离. + 改变玩家步行时的视距。 改變玩家步行時的視野距離. Oyuncular ayakta iken görebileceği uzaklığı değiştir. @@ -168,7 +173,7 @@ Distanza Visiva Client (Veicolo Terrestre) クライアント側視界距離 (車両) 클라이언트 시야 (차량) - 客户端视野距离 (地面载具) + 客户端视距(地面载具) 客戶端視野距離 (地面載具) Kişilerin Görüş Uzaklığı Mesafesi (Kara Araçların da) @@ -185,7 +190,7 @@ Cambia la distanza visiva in gioco quando il giocatore è in un veicolo terrestre. プレイヤーが車両の時の視界距離を変更します。 플레이어가 차량 내부일 경우의 시야를 바꿀 수 있습니다. - 改变玩家于地面载具内时的视野距离 + 改变玩家于地面载具内时的视距 改變玩家於地面載具內時的視野距離 Oyuncular kara araçlarında iken görebileceği uzaklığı değiştir. @@ -202,7 +207,7 @@ Distanza Visiva Client (Veicoli d'Aria) クライアント側視界距離 (航空機) 클라이언트 시야 (항공기) - 客户端视野距离 (空中载具) + 客户端视距(空中载具) 客戶端視野距離 (空中載具) Kişilerin Görüş Uzaklığı Mesafesi (Hava Araçların da) @@ -219,7 +224,7 @@ Cambia la distanza visiva in gioco quando il giocatore è in un mezzo aereo. プレイヤーが航空機に乗っている時の視界距離を変更します。 플레이어가 항공기 내부일 경우의 시야를 바꿀 수 있습니다. - 改变玩家于空中载具内时的视野距离 + 改变玩家于空中载具内时的视距 改變玩家於空中載具內時的視野距離 Oyuncular hava araçların da iken görebileceği uzaklığı değiştir. @@ -236,7 +241,7 @@ Distanza Visiva Oggetti Dinamica 動的なオブジェクトの描画距離 동적 물체 시야 - 动态物件的视野距离 + 动态物体的视距 動態物件的視野距離 @@ -251,8 +256,8 @@ Устанавливает дальность отрисовки объектов как коэффициент от общей дальности видимости. Imposta la distanza visiva degli oggetti come un coefficiente basato sulla distanza visiva oppure basato sul campo visivo. 視野角を元にするか、視界距離によるオブジェクト描画距離を決定します。視野角を元にするオプションを有効化した場合、視野角により最低と最高値が変動します。 - 설정된 시야 혹은 시계(FoV)에 계수를 적용해 물체 시야를 적용합니다. 시계를 바탕으로 하는 옵션을 활성화할 경우 시계에 의한 최저와 최고치가 변동됩니다. - 设定物件可被观察的距离,透过视野距离或是视野角度来决定。 + 설정된 시야 혹은 시야각(FoV)에 계수를 적용해 물체 시야를 적용합니다. 시야각를 바탕으로 하는 옵션을 활성화할 경우 시야각에 의한 최저와 최고치가 변동됩니다. + 设定物体可被观察的距离,透过视距或是视野角度来决定。 設定物件可被觀察的距離,透過視野距離或是視野角度來決定。 @@ -368,7 +373,7 @@ Basada en campo de visión Basée sur le champ de vision 視野角を元にする - 시계(FoV) + 시야각(FoV) 由视野角度决定 由視野角度決定 @@ -385,7 +390,7 @@ Distanza Visiva: 視界距離: 시야: - 视野距离: + 视距: 視野距離: Görüş Uzaklığı: @@ -401,8 +406,8 @@ Дальность видимости объектов: Distanza Visiva Oggetti è オブジェクト描画距離は - 동적 물체 시야는 - 物件视野距离为 + 물체 시야는 + 物体视距为 物件視野距離為 @@ -418,7 +423,7 @@ Questa opzione è invalida! Il limite è このオプションは無効です!制限は 이 옵션은 불가능합니다! 제한은 - 该选项是无效的! 限制是 + 该选项是无效的! 限制是 該選項是無效的! 限制是 Bu seçenek geçersiz! Limit diff --git a/addons/viewports/$PBOPREFIX$ b/addons/viewports/$PBOPREFIX$ new file mode 100644 index 0000000000..0ed652c6e7 --- /dev/null +++ b/addons/viewports/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\viewports diff --git a/addons/viewports/CfgEventHandlers.hpp b/addons/viewports/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a3f71f852 --- /dev/null +++ b/addons/viewports/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/viewports/CfgVehicles.hpp b/addons/viewports/CfgVehicles.hpp new file mode 100644 index 0000000000..9b6427ff2c --- /dev/null +++ b/addons/viewports/CfgVehicles.hpp @@ -0,0 +1,22 @@ +class CfgVehicles { + class B_MBT_01_base_F; + class B_MBT_01_cannon_F: B_MBT_01_base_F { // Merkava + class ace_viewports { + class SLD_backLeftUpper { + type = "screen"; + camLocation[] = {0,0,0.05}; + maxDistance = 5; + camAttach[] = {0,0}; + screenLocation[] = {-0.925,-3.43459,-1.07}; + roles[]={"cargo"}; + }; + }; + }; + class B_MBT_01_TUSK_F: B_MBT_01_cannon_F { // Merkava TUSK (slightly different model-space because different p3d model) + class ace_viewports: ace_viewports { + class SLD_backLeftUpper: SLD_backLeftUpper { + screenLocation[] = {-0.925,-4.65511,-1.07}; + }; + }; + }; +}; diff --git a/addons/viewports/README.md b/addons/viewports/README.md new file mode 100644 index 0000000000..c4faabaada --- /dev/null +++ b/addons/viewports/README.md @@ -0,0 +1,4 @@ +ace_viewports +========== + +Allows crew to look through periscopes diff --git a/addons/viewports/XEH_PREP.hpp b/addons/viewports/XEH_PREP.hpp new file mode 100644 index 0000000000..ddf32fb5d9 --- /dev/null +++ b/addons/viewports/XEH_PREP.hpp @@ -0,0 +1,8 @@ +LOG("prep"); + +PREP(eachFrame); +PREP(enterVehicle); +PREP(getSeatInfo); +PREP(getViewports); +PREP(viewCleanup); +PREP(viewCreate); diff --git a/addons/viewports/XEH_postInit.sqf b/addons/viewports/XEH_postInit.sqf new file mode 100644 index 0000000000..06984eabf0 --- /dev/null +++ b/addons/viewports/XEH_postInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +GVAR(pfeh) = -1; +["CBA_settingsInitialized", { + TRACE_1("CBA_settingsInitialized",GVAR(enabled)); + ["vehicle", LINKFUNC(enterVehicle), true] call CBA_fnc_addPlayerEventHandler; +}] call CBA_fnc_addEventHandler; diff --git a/addons/viewports/XEH_preInit.sqf b/addons/viewports/XEH_preInit.sqf new file mode 100644 index 0000000000..a8940fc7dd --- /dev/null +++ b/addons/viewports/XEH_preInit.sqf @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.sqf" + +#ifdef POINT_CONFIG_DEBUG +call compileScript [QPATHTOF(dev\debugPoints.sqf)]; +#endif + +ADDON = true; diff --git a/addons/viewports/XEH_preStart.sqf b/addons/viewports/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/viewports/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/viewports/config.cpp b/addons/viewports/config.cpp new file mode 100644 index 0000000000..7d303de1b7 --- /dev/null +++ b/addons/viewports/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"PabstMirror"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "gui.hpp" diff --git a/addons/viewports/data/optic_window_ca.paa b/addons/viewports/data/optic_window_ca.paa new file mode 100644 index 0000000000..18e1aa9ea7 Binary files /dev/null and b/addons/viewports/data/optic_window_ca.paa differ diff --git a/addons/viewports/dev/debugPoints.sqf b/addons/viewports/dev/debugPoints.sqf new file mode 100644 index 0000000000..4d8346bc0a --- /dev/null +++ b/addons/viewports/dev/debugPoints.sqf @@ -0,0 +1,173 @@ +#include "\z\ace\addons\viewports\script_component.hpp" +/* + [] call compileScript ["\z\ace\addons\viewports\dev\debugPoints.sqf"]; + + This is mostly just for placing the mem points in threeden + left-click to place and adjust current point + alt+left-click to place next point + alt+right-click to output + shift+right-click to reset + + // Tweak: + z = (vehicle player) getVariable "ace_viewports_viewports"; + p = z # 0 # 4; z # 0 set [4, p vectorAdd [0,0.1,0]]; + + // Place by view: + v = (positionCameraToWorld [0,0,0.4]); + m = (vehicle player) worldToModel v; + z = (vehicle player) getVariable "ace_viewports_viewports"; + z # 0 set [4, m]; +*/ + +#define IDD_3DEN 313 + +[] spawn { + INFO_2("Pre-Init [is3den %1][3den display: %2]", is3den, !isNull findDisplay IDD_3DEN); + if (!is3den) exitWith {}; + + GVAR(3denIndex) = 0; + GVAR(3denViewports) = []; + + disableSerialization; + private _3den = findDisplay IDD_3DEN; + if (_3den getVariable [QGVAR(setup), false]) exitWith {}; + _3den setVariable [QGVAR(setup), true]; + + _3den displayAddEventHandler ["MouseButtonDown", { + params ["", "_button", "_mouseX", "_mouseY", "_shift", "_ctrl", "_alt"]; + + if (_shift && _button == 1) exitWith { + systemChat "Reset/Reload"; + if ((supportInfo "u:diag_mergeConfigFile") isNotEqualTo []) then { + call compile 'diag_mergeConfigFile ["P:\z\ace\addons\viewports\config.cpp"]'; + }; + { _x setVariable [QGVAR(viewports), nil] } forEach vehicles; + GVAR(3denIndex) = 0; + GVAR(3denViewports) = []; + true + }; + + if (_alt) then { + if (count GVAR(3denViewports) > GVAR(3denIndex)) then { + systemChat "Advance to next index"; + GVAR(3denIndex) = GVAR(3denIndex) + 1; + }; + }; + if (_alt && _button == 1) exitWith { + private _vehicle = (get3DENSelected "object") param [0, objNull]; + private _config = configOf _vehicle; + private _model = getText (_config >> "model"); + while {true} do { + private _parent = inheritsFrom _config; + if ((getText (_parent >> "model")) != _model) exitWith {}; + _config = _parent; + }; + + private _out = []; + _out pushBack format [" class %1: %2 {", configName _config, configName inheritsFrom _config]; + _out pushBack format [" class ace_viewports {"]; + { + _x params ["_name", "", "_camLocation", "_camAttach"]; + _out pushBack format [' class %1 {', _name]; + _out pushBack format [' camLocation[] = {%1, %2, %3};', _camLocation # 0, _camLocation # 1, _camLocation # 2]; + _out pushBack format [' camAttach = %1;', _camAttach]; + // _out pushBack format [' type = "%1";', _type]; + // _out pushBack format [' screenLocation[] = {};']; + // _out pushBack format [' maxDistance = 99;']; + // _out pushBack format [' compartments[]={};']; + // _out pushBack format [' roles[]={};']; + _out pushBack format [' };']; + } forEach GVAR(3denViewports); + + _out pushBack format [' };']; + _out pushBack format [' };']; + + // Some inherited configs might use a different model which uses a different offset - yuck + private _inherited = '((configName _x) isKindOf (configName _config)) && {_model != getText (_x >> "model")}' configClasses (configFile >> "CfgVehicles"); + _out pushBack format ["// Watch out for %1", _inherited apply {configName _x}]; + + copyToClipboard (_out joinString endl); + systemChat format ["copied %1 lines", count _out]; + }; + if (_button == 0) exitWith { + private _vehicle = (get3DENSelected "object") param [0, objNull]; + if (isNull _vehicle) exitWith {}; + + private _start = AGLToASL positionCameraToWorld [0,0,0]; + private _end = AGLToASL screenToWorld [_mouseX, _mouseY]; + private _intersections = lineIntersectsSurfaces [_start, _end]; + private _pointASL = _intersections # 0 # 0; + if (isNil "_pointASL") exitWith {}; + _pointASL = _pointASL vectorAdd [0,0,0.09]; // Add a little bit up because it always sinks into the model + private _pointMS = _vehicle worldToModel ASLtoAGL _pointASL; + + private _name = format ["view_%1",GVAR(3denIndex)]; + // [_name, _type, _camLocation, _camAttach, _screenLocation, _maxDistance, _compartments, _roles] + GVAR(3denViewports) set [GVAR(3denIndex), [_name, "", _pointMS, 0, _pointMS, 99, [], []]]; + true + }; + }]; +}; + +// this runs in both threeden and in-game +addMissionEventHandler ["Draw3D", { + private _vehicle = vehicle player; + private _viewports = _vehicle getVariable [QGVAR(viewports), []]; + + if (is3den) then { + _vehicle = (get3DENSelected "object") param [0, objNull]; + if (isNull _vehicle) exitWith {}; + _viewports = [_vehicle] call FUNC(getViewports); + if (GVAR(3denViewports) isNotEqualTo []) then { + _viewports = GVAR(3denViewports); + }; + }; + if (isNull _vehicle) exitWith {}; + + + drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [1,1,0,1], _vehicle modelToWorldVisual [0,0,0], 0.1, 0.1, 0, "", 1, 0.02, "TahomaB"]; + if (alive player) then { // not using ace_player so this works in 3den + drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [0,1,0,1], aslToAGL eyepos player, 0.1, 0.1, 0, "eye", 1, 0.02, "TahomaB"]; + drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [0,1,0,1], player modelToWorldVisual (player selectionPosition "pilot"), 0.1, 0.1, 0, "pilot", 1, 0.02, "TahomaB"]; + }; + // { + // private _pos = _vehicle modelToWorldVisual (_vehicle selectionPosition [_x, "Memory"]); + // drawIcon3D ["#(argb,8,8,3)color(1,1,1,1)", [0,0,1,0.2], _pos, 0.05, 0.05, 0, _x, 1, 0.02, "TahomaB"]; + // } forEach (_vehicle selectionNames "Memory"); + + + { + _x params ["_name", "_type", "_camLocation", "_camAttach", "_screenLocation", "_maxDistance", "_compartments", "_roles"]; + + if (_camLocation isEqualType "") then { + _camLocation = _vehicle selectionPosition [_camLocation, "Memory"]; + }; + + private _screenAGL = _vehicle modelToWorldVisual _screenLocation; + drawIcon3D ["#(argb,8,8,3)color(0,0,1,1)", [1,0.5,1,1], _screenAGL, 0.05, 0.05, 0, format ["%1:%2",_forEachIndex,_compartments], 1, 0.03, "TahomaB"]; + + private _camAGL = if (_camAttach isEqualType 0) then { + _vehicle modelToWorldVisual _camLocation + } else { + private _turretConfig = [_vehicle, _camAttach] call CBA_fnc_getTurret; + private _memoryPointGunnerOptics = getText(_turretConfig >> "memoryPointGunnerOptics"); + _vehicle modelToWorldVisual (_camLocation vectorAdd (_vehicle selectionPosition _memoryPointGunnerOptics)) + }; + drawIcon3D ["#(argb,8,8,3)color(1,0,0,1)", [0.5,1,1,1], _camAGL, 0.1, 0.1, 0, format ["%1:%2",_forEachIndex,_name], 1, 0.03, "TahomaB"]; + + if (_camAttach isEqualType 0) then { + private _camAGL = _vehicle modelToWorldVisual _camLocation; + drawIcon3D ["#(argb,8,8,3)color(1,0,0,1)", [1,1,1,1], _camAGL, 0.1, 0.1, 0, _name, 1, 0.05, "TahomaB"]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([1, _camAttach, 0] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [0,1,0,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([1, _camAttach, 1] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [0,1,0,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([1, _camAttach, -1] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [0,1,0,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([0.2, _camAttach+90, 0] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [1,0,1,1]]; + private _target = _vehicle modelToWorldVisual (_camLocation vectorAdd ([0.2, _camAttach-90, 0] call CBA_fnc_polar2vect)); + drawLine3D [_camAGL, _target, [1,0,1.2,1]]; + }; + } forEach _viewports; +}]; diff --git a/addons/viewports/functions/fnc_eachFrame.sqf b/addons/viewports/functions/fnc_eachFrame.sqf new file mode 100644 index 0000000000..247e9e26b5 --- /dev/null +++ b/addons/viewports/functions/fnc_eachFrame.sqf @@ -0,0 +1,77 @@ +#include "script_component.hpp" +/* +* Author: PabstMirror +* Runs each frame while inside of a vehicle with viewports +* +* Arguments: +* 0: PFEH Args +* 0: Player +* 1: Vehicle +* 2: Viewport configuration +* 3: Viewport index shown (-1 for none) +* 4: Last visionmode +* +* Return Value: +* None +* +* Example: +* [] call ace_viewports_fnc_eachFrame +* +* Public: No +*/ + +params ["_args", "_pfID"]; +_args params ["_player", "_vehicle", "_viewports", "_shownIndex", "_lastVisionMode"]; + +private _newIndex = -1; +if (cba_events_control) then { + if (cameraView != "INTERNAL") exitWith {}; + if (isTurnedOut _player) exitWith {}; + if (!([_player, _vehicle, []] call EFUNC(common,canInteractWith))) exitWith {}; + + BEGIN_COUNTER(newIndex); + if ((_shownIndex > -1) && {currentVisionMode _player != _lastVisionMode}) then { + // Vision Mode Changed - Force stop cam and restart + call FUNC(viewCleanup); + _shownIndex = -1; + }; + + ([_player] call FUNC(getSeatInfo)) params ["_role", "", "", "_comparment"]; + + private _newIndexAngle = 45; // Controls the max angle + private _eyesPosASL = AGLtoASL (positionCameraToWorld [0, 0, 0]); + private _eyesDir = (AGLtoASL (positionCameraToWorld [0, 0, 1])) vectorDiff _eyesPosASL; + { + _x params ["", "", "_camLocation", "", "_screenLocation", "_maxDistance", "_compartments", "_roles"]; + + private _viewASL = AGLtoASL (_vehicle modelToWorldVisual _screenLocation); + private _viewDiff = _viewASL vectorDiff _eyesPosASL; + private _viewAngle = acos (_viewDiff vectorCos _eyesDir); + #ifdef DEBUG_MODE_FULL + systemChat format ["%1: %2 @ %3",_forEachIndex,round _viewAngle, vectorMagnitude _viewDiff]; + #endif + if ( + (_viewAngle < _newIndexAngle) + && {(_compartments isEqualTo []) || {(toLower _comparment) in _compartments}} + && {(_roles isEqualTo []) || {(toLower _role) in _roles}} + && {(vectorMagnitude _viewDiff) < _maxDistance} + ) then { + _newIndex = _forEachIndex; + _newIndexAngle = _viewAngle; + }; + } forEach _viewports; + END_COUNTER(newIndex); +}; + +if (_shownIndex == _newIndex) exitWith {}; // No-change - fast exit + +if (_shownIndex > -1) then { + call FUNC(viewCleanup); +}; + +if (_newIndex > -1) then { + [_vehicle, _viewports # _newIndex, currentVisionMode _player] call FUNC(viewCreate); + _args set [4, currentVisionMode _player]; +}; + +_args set [3, _newIndex]; diff --git a/addons/viewports/functions/fnc_enterVehicle.sqf b/addons/viewports/functions/fnc_enterVehicle.sqf new file mode 100644 index 0000000000..4e49be144c --- /dev/null +++ b/addons/viewports/functions/fnc_enterVehicle.sqf @@ -0,0 +1,36 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Handle playerEH for new changing vehicle, check if it has any viewports and start PFEH + * + * Arguments: + * 0: player + * 1: vehicle + * + * Return Value: + * None + * + * Example: + * [player, vehicle player] call ace_viewports_fnc_enterVehicle + * + * Public: No + */ + +params ["_player", "_vehicle"]; +TRACE_2("enterVehicle",_player,_vehicle); + +if (GVAR(pfeh) != -1) then { + TRACE_1("cleaning up",GVAR(pfeh)); + [GVAR(pfeh)] call CBA_fnc_removePerFrameHandler; + GVAR(pfeh) = -1; + call FUNC(viewCleanup); +}; + +if (!GVAR(enabled)) exitWith {}; +if (_player == _vehicle) exitWith {}; + +private _viewports = [_vehicle] call FUNC(getViewports); +if (_viewports isEqualTo []) exitWith {}; + +GVAR(pfeh) = [LINKFUNC(eachFrame), 0, [_player, _vehicle, _viewports, -1, -1]] call CBA_fnc_addPerFrameHandler; +TRACE_3("start pfeh",GVAR(pfeh),typeOf _vehicle,count _viewports); diff --git a/addons/viewports/functions/fnc_getSeatInfo.sqf b/addons/viewports/functions/fnc_getSeatInfo.sqf new file mode 100644 index 0000000000..1254b5f07e --- /dev/null +++ b/addons/viewports/functions/fnc_getSeatInfo.sqf @@ -0,0 +1,46 @@ +#include "script_component.hpp" +/* + * Author: Dystopian, PabstMirror + * Adapted from quickmount's addFreeSeatsActions + * + * Arguments: + * 0: Unit + * + * Return Value: + * ARRAY + * + * Example: + * [player] call ace_viewports_fnc_getSeatInfo + * + * Public: No + */ + +params ["_unit"]; + +private _vehicle = vehicle _unit; +if (_vehicle == _unit) exitWith { [] }; +private _vehicleConfig = configOf _vehicle; + +private _fullCrew = fullCrew [_vehicle, "", false]; +(_fullCrew select (_fullCrew findIf {_unit == _x select 0})) params ["", "_role", "_cargoIndex", "_turretPath"]; + +private _compartment = switch (_role) do { + case "driver": { + (_vehicleConfig >> "driverCompartments") call BIS_fnc_getCfgData + }; + case "cargo": { + // note: cargoNumber is different from the cargoIndex from fullCrew... + private _cargoNumber = fullCrew [_vehicle, "cargo", true] findIf {_unit == _x select 0}; + private _cargoCompartments = getArray (_vehicleConfig >> "cargoCompartments"); + private _cargoCompartmentsLast = count _cargoCompartments - 1; + _cargoCompartments select (_cargoNumber min _cargoCompartmentsLast) + }; + default { + private _turretConfig = [_vehicleConfig, _turretPath] call CBA_fnc_getTurret; + (_turretConfig >> "gunnerCompartments") call BIS_fnc_getCfgData + }; +}; + +if (!(_compartment isEqualType "")) then { _compartment = format ["Compartment%1",_compartment] }; + +[_role, _cargoIndex, _turretPath, _compartment] diff --git a/addons/viewports/functions/fnc_getViewports.sqf b/addons/viewports/functions/fnc_getViewports.sqf new file mode 100644 index 0000000000..ffa82fcc82 --- /dev/null +++ b/addons/viewports/functions/fnc_getViewports.sqf @@ -0,0 +1,74 @@ +#include "script_component.hpp" +/* +* Author: PabstMirror +* Gets viewports for a vehicle from config. Caches results to a setVar on the vic. +* +* Arguments: +* 0: vehicle +* +* Return Value: +* ARRAY +* +* Example: +* [vehicle player] call ace_viewports_fnc_getViewports +* +* Public: No +*/ + +params ["_vehicle"]; + +private _viewports = _vehicle getVariable [QGVAR(viewports), nil]; + +if (isNil "_viewports") then { + _viewports = (configProperties [(configOf _vehicle) >> "ace_viewports", "isClass _x", true]) apply { + // name [STRING] is just used for debug + private _name = configName _x; + // type [STRING] - Optional + private _type = getText (_x >> "type"); + // camLocation [ARRAY or STRING] - Required + private _camLocation = if (isArray (_x >> "camLocation")) then { + getArray (_x >> "camLocation") // modelOffset + } else { + getText (_x >> "camLocation") // memPoint + }; + // camAttach [ARRAY or NUMBER] - Required + private _camAttach = if (isArray (_x >> "camAttach")) then { + getArray (_x >> "camAttach") // turret + } else { + getNumber (_x >> "camAttach") // angle + }; + // screenLocation [ARRAY or STRING] - Optional (will be converted to ARRAY here!) + private _screenLocation = if (isArray (_x >> "screenLocation")) then { + getArray (_x >> "screenLocation") // modelOffset + } else { + getText (_x >> "screenLocation") // memPoint + }; + if (_screenLocation isEqualType "") then { + // screens should be on the hull (IE non-animated) so we can do all the mem-point calculations here + if (_screenLocation == "") exitWith { // use generic periscope drop height from cam + private _camLocArray = if (_camLocation isEqualType []) then { + _camLocation + } else { + _vehicle selectionPosition [_camLocation, "Memory"]; + }; + _screenLocation =_camLocArray vectorAdd [0,0,-0.175] + }; + _screenLocation = _vehicle selectionPosition [_screenLocation, "Memory"]; + }; + // maxDistance [NUMBER] - Optional + private _maxDistance = getNumber (_x >> "maxDistance"); + if (_maxDistance == 0) then { + _maxDistance = 0.8; + }; + // compartments [ARRAY] - Optional + private _compartments = (getArray (_x >> "compartments")) apply {toLower _x}; + // roles [ARRAY] - Optional + private _roles = (getArray (_x >> "roles")) apply {toLower _x}; + + [_name, _type, _camLocation, _camAttach, _screenLocation, _maxDistance, _compartments, _roles] + }; + TRACE_3("getViewports",_vehicle,typeOf _vehicle,count _viewports); + _vehicle setVariable [QGVAR(viewports), _viewports]; +}; + +_viewports diff --git a/addons/viewports/functions/fnc_viewCleanup.sqf b/addons/viewports/functions/fnc_viewCleanup.sqf new file mode 100644 index 0000000000..b24a9cc31b --- /dev/null +++ b/addons/viewports/functions/fnc_viewCleanup.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* +* Author: PabstMirror +* Cleans up existing viewport display and camera +* +* Arguments: +* None +* +* Return Value: +* None +* +* Example: +* [] call ace_viewports_fnc_viewCleanup +* +* Public: No +*/ + +TRACE_1("camCleanup",_this); + +if (!isNull (missionNamespace getVariable [QGVAR(camera), objNull])) then { + GVAR(camera) cameraEffect ["terminate", "back", QGVAR(pip0)]; + camDestroy GVAR(camera); +}; + +private _display = uiNamespace getVariable [QGVAR(display), displayNull]; +if (!isNull _display) then { + QGVAR(display) cutText ["", "PLAIN"]; +}; diff --git a/addons/viewports/functions/fnc_viewCreate.sqf b/addons/viewports/functions/fnc_viewCreate.sqf new file mode 100644 index 0000000000..02e44c129d --- /dev/null +++ b/addons/viewports/functions/fnc_viewCreate.sqf @@ -0,0 +1,129 @@ +#include "script_component.hpp" +/* +* Author: PabstMirror +* Creates a viewport display and camera +* +* Arguments: +* 0: Vehicle +* 1: Viewport +* 2: Player's vision mode +* +* Return Value: +* None +* +* Example: +* [...] call ace_viewports_fnc_viewCreate +* +* Public: No +*/ + +params ["_vehicle", "_viewport", "_visionMode"]; +_viewport params ["_name", "_type", "_camLocation", "_camAttach"]; +TRACE_5("camCreate",_vehicle,_name,_type,_camLocation,_camAttach); + +private _usingGoggles = _visionMode > 0; + +if (_camLocation isEqualType "") then { + _camLocation = _vehicle selectionPosition [_camLocation, "Memory"]; + if (_camLocation isEqualTo [0,0,0]) then { WARNING_2("probably bad cam location %1:%2",typeOf _vehicle,_viewport); } +}; + +// Create Cam and attach it to vic +GVAR(camera) = "camera" camCreate getPos _vehicle; +if (_camAttach isEqualType 0) then { + // number - Static attach and set const direction + GVAR(camera) attachTo [_vehicle, _camLocation]; + GVAR(camera) setDir _camAttach; // could do pitch as well, but probably not needed +} else { + // array - Turret path, get gunner optic mem and bone-attach to it + private _turretConfig = [_vehicle, _camAttach] call CBA_fnc_getTurret; + private _memoryPointGunnerOptics = getText(_turretConfig >> "memoryPointGunnerOptics"); + GVAR(camera) attachTo [_vehicle, _camLocation, _memoryPointGunnerOptics, true]; +}; + +// Setup r2texture +GVAR(camera) cameraEffect ["INTERNAL", "BACK", QGVAR(pip0)]; +private _renderTexture = format ["#(argb,512,512,1)r2t(%1,1)", QGVAR(pip0)]; + +// Create blank display +QGVAR(display) cutRsc [QGVAR(display), "PLAIN", 0, false]; +private _display = uiNamespace getVariable [QGVAR(display), displayNull]; + + +// R2T aspect ratio parameter has no effect - it will match main video AR +// better to have ui elements squashed than to squash the R2T +private _screenAR = getResolution select 4; +private _camEffect = [0]; +private _camFov = 0.75; + + +switch (true) do { + case (_type == "screen"): { + // Generic "Squad Leader's Display" monitor showing turret cam + private _desiredAR = 1.25; + private _stretch = (_desiredAR / _screenAR) max 0.8 min 1.25; // define max stretch factor of pip texture (don't stretch more or less than this) + + private _viewHeight = 0.3 * safeZoneH; + private _viewWidth = _stretch * _viewHeight * _screenAR / 1.3333333333333; + + private _ctrlRender = _display ctrlCreate ["RscPicture", -1]; + _ctrlRender ctrlSetText _renderTexture; + _ctrlRender ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlRender ctrlCommit 0; + + private _ctrlOverlay = _display ctrlCreate ["RscPicture", -1]; + _ctrlOverlay ctrlSetText "\a3\weapons_f\reticle\data\optika_tv_ca.paa"; + _ctrlOverlay ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlOverlay ctrlCommit 0; + + if (_usingGoggles) then { + // Screen will be out of focus, too bright and not in IR; should be almost impossible to see anything useful + _camEffect = [3,1,1,0.1,0,[0,0,0,0],[1,1,1,0],[1,1,1,1]]; + + private _ctrlNVG = _display ctrlCreate ["RscPicture", -1]; + _ctrlNVG ctrlSetText "#(argb,8,8,3)color(1,1,0.6,0.9)"; + _ctrlNVG ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlNVG ctrlCommit 0; + } else { + _camEffect = [0]; // 2.08's currentVisionMode change could allow matching real turret's vision mode + }; + _camFov = 0.25; + }; + default { + // Generic periscope viewport + private _desiredAR = 3; + private _stretch = (_desiredAR / _screenAR) max 0.8 min 1.25; // define max stretch factor of pip texture + private _viewHeight = 0.3 * safeZoneH; + + if (_usingGoggles) then { + _camEffect = [_visionMode]; // pass-thru + // _camEffect = [3, true, 0.747773,0.791092,0,[0,0,0,0],[1.3,1.2,0,0.9],[6,1,1,0]]; + // Some periscope glass is IR Laser Safe (~1064nm) which is close to same wavelength as NVGs + // And cannot apply nvg and ace_nightvision effects to pip at same time, so just make it small and shitty... + _viewHeight = 0.45 * _viewHeight; + }; + private _viewWidth = _stretch * _viewHeight * _screenAR / 1.3333333333333; + + private _ctrlRender = _display ctrlCreate ["RscPicture", -1]; + _ctrlRender ctrlSetText _renderTexture; + _ctrlRender ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlRender ctrlCommit 0; + + if (_usingGoggles) then { + // Roughly try to color match ace_nvg, and make it semi-opaque + private _ctrlNVG = _display ctrlCreate ["RscPicture", -1]; + _ctrlNVG ctrlSetText "#(argb,8,8,3)color(0.25,0.2,0.05,0.75)"; + _ctrlNVG ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlNVG ctrlCommit 0; + }; + + private _ctrlOverlay = _display ctrlCreate ["RscPicture", -1]; + _ctrlOverlay ctrlSetText QPATHTOF(data\optic_window_ca.paa); + _ctrlOverlay ctrlSetPosition [safezoneX + 0.5 * safezoneW - 0.5 * _viewWidth, safezoneY + 0.5 * safeZoneH - 0.5 * _viewHeight, _viewWidth, _viewHeight]; + _ctrlOverlay ctrlCommit 0; + }; +}; + +GVAR(camera) camSetFov _camFov; +QGVAR(pip0) setPiPEffect _camEffect; +GVAR(camera) camCommit 0; diff --git a/addons/viewports/functions/script_component.hpp b/addons/viewports/functions/script_component.hpp new file mode 100644 index 0000000000..c4fa73f63a --- /dev/null +++ b/addons/viewports/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\viewports\script_component.hpp" diff --git a/addons/viewports/gui.hpp b/addons/viewports/gui.hpp new file mode 100644 index 0000000000..50f036f0da --- /dev/null +++ b/addons/viewports/gui.hpp @@ -0,0 +1,11 @@ +class RscTitles { + class GVAR(display) { + idd = -1; + onLoad = QUOTE( with uiNameSpace do { GVAR(display) = _this select 0 }; ); + movingEnable = 0; + duration = 9999999; + fadeIn = 0; + fadeOut = 0; + class controls {}; + }; +}; diff --git a/addons/viewports/initSettings.sqf b/addons/viewports/initSettings.sqf new file mode 100644 index 0000000000..506d3c78a3 --- /dev/null +++ b/addons/viewports/initSettings.sqf @@ -0,0 +1,9 @@ +[ + QGVAR(enabled), "CHECKBOX", + [LELSTRING(common,Enabled), LLSTRING(setting_enabled_description)], + [ELSTRING(common,ACEKeybindCategoryVehicles), LSTRING(addon_displayname)], + true, + true, + {}, + false // Doesn't need full mission restart, but you have to exit and re-enter vic +] call CBA_fnc_addSetting; diff --git a/addons/viewports/script_component.hpp b/addons/viewports/script_component.hpp new file mode 100644 index 0000000000..587a3d3e4e --- /dev/null +++ b/addons/viewports/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT viewports +#define COMPONENT_BEAUTIFIED Viewports +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS +// #define POINT_CONFIG_DEBUG + +#ifdef DEBUG_ENABLED_VIEWPORTS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_VIEWPORTS + #define DEBUG_SETTINGS DEBUG_SETTINGS_VIEWPORTS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/viewports/stringtable.xml b/addons/viewports/stringtable.xml new file mode 100644 index 0000000000..4a1462062f --- /dev/null +++ b/addons/viewports/stringtable.xml @@ -0,0 +1,18 @@ + + + + + Viewports + ビューポート + 뷰포트 + 观察口 + + + Allows crew to look through periscopes + Pozwala załodze patrzeć przez peryskop + 乗組員がペリスコープを通して外を見ることができます + 승무원이 잠망경을 통해 볼 수 있도록 허용합니다 + 允许乘员通过观察口观察 + + + diff --git a/addons/viewrestriction/functions/fnc_canChangeCamera.sqf b/addons/viewrestriction/functions/fnc_canChangeCamera.sqf index 9114a23303..d037d2f095 100644 --- a/addons/viewrestriction/functions/fnc_canChangeCamera.sqf +++ b/addons/viewrestriction/functions/fnc_canChangeCamera.sqf @@ -22,7 +22,7 @@ params ["_newCameraView", "_cameraOn", ["_checkGunnerView", true]]; // Remote control hates switchCamera (control returns to player, camera is left on remotely controlled object/unit), make sure remote controlled units are not impacted !(_newCameraView isEqualTo "GUNNER" && {_checkGunnerView}) && -{!(_newCameraView isEqualTo "GROUP")} && +{_newCameraView isNotEqualTo "GROUP"} && {!isNull ACE_player} && {player == ACE_player} && {alive ACE_player} && diff --git a/addons/viewrestriction/functions/fnc_switchPreserveView.sqf b/addons/viewrestriction/functions/fnc_switchPreserveView.sqf index 6de1b5b135..722de4ea37 100644 --- a/addons/viewrestriction/functions/fnc_switchPreserveView.sqf +++ b/addons/viewrestriction/functions/fnc_switchPreserveView.sqf @@ -32,7 +32,7 @@ GVAR(preserveViewCameraViewEH) = ["cameraView", { private _vehicle = vehicle _player; private _vehicleClass = {if (_vehicle isKindOf _x) exitWith {_x}} forEach ["CAManBase", "LandVehicle", "Air", "Ship", "All"]; private _varName = QXGVAR(preserveView) + _vehicleClass; - if !(_cameraView isEqualTo (profileNamespace getVariable [_varName, ""])) then { + if (_cameraView isNotEqualTo (profileNamespace getVariable [_varName, ""])) then { profileNamespace setVariable [_varName, _cameraView]; }; }] call CBA_fnc_addPlayerEventHandler; @@ -44,7 +44,7 @@ GVAR(preserveViewVehicleEH) = ["vehicle", { private _vehicleClass = {if (_vehicle isKindOf _x) exitWith {_x}} forEach ["CAManBase", "LandVehicle", "Air", "Ship", "All"]; private _savedView = profileNamespace getVariable (QXGVAR(preserveView) + _vehicleClass); - if (!isNil "_savedView" && {!(_cameraView isEqualTo _savedView)}) then { + if (!isNil "_savedView" && {_cameraView isNotEqualTo _savedView}) then { _vehicle switchCamera _savedView; }; }, true] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/viewrestriction/stringtable.xml b/addons/viewrestriction/stringtable.xml index 26785c662b..087e6e18a0 100644 --- a/addons/viewrestriction/stringtable.xml +++ b/addons/viewrestriction/stringtable.xml @@ -9,7 +9,7 @@ 視点制限 시점 제한 Restriction Vue - 视野限制 + 人称限制 視野限制 Visualizza Restrizione Ограничение обзора @@ -22,7 +22,7 @@ 全体や車両ごとで使える視点を1人称か3人称視点のどちらかに制限します。 차량 유형별, 혹은 전체적으로 1,3인칭 시점 사용 제한 설정 La restriction de la vue limite l'usage de la vue à la 1ère/3ème personne globalement ou par type de véhicule. - 视野限制可以设定在全局或是局部状况下能用的视野模式。 + 人称限制可以设定在全局或是局部状况下能用的人称模式。 視野限制可以設定在全局或是局部狀況下能用的視野模式。 Visualizza le impostazioni di restrizione per limitare l'utilizzo di prima e terza persona a livello globale o per tipologia di veicolo. Настройки ограничения обзора при виде от 1-го или 3-го лица. Общие для всех, или Выборочные, в зависимости от техники. @@ -50,7 +50,7 @@ グローバル モードの設定。(標準: 無効) 전체 모드를 사용합니다. 기본값: 사용 안 함 Mode global. Défaut: Désactivé - 设定全局的视野模式。预设:关闭 + 设定全局的人称模式。预设:关闭 設定全局的視野模式。預設:關閉 Imposta modalità globale. Default: Disabilitato Общие установки для всех. По умолчанию: Отключено. @@ -64,7 +64,7 @@ (選択性) 地上 (선택) 보병 (Sélectif) A pied - (可选) 步行 + (可选)步行 (可選) 步行 (Selettiva) Piedi (Выборочные) Пешком @@ -78,7 +78,7 @@ 地上でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 보병 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif hors des véhicules. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在步行的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在步行的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在步行的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Piedi. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки без техники. По умолчанию: Отключено (требуется режим: Выборочные) @@ -92,7 +92,7 @@ (選択性) 地上車両 (선택) 지상 차량 (Sélectif) Véhicules terrestres - (可选) 陆上载具 + (可选)陆上载具 (可選) 陸上載具 (Selettiva) Veicoli Terrestri (Выборочные) Наземная техника @@ -106,7 +106,7 @@ 地上車両でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 차량 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les véhicules terrestres. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘陆上载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘陆上载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘陸上載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Veicoli Terrestri. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для наземной техники. По умолчанию: Отключено (требуется режим: Выборочные) @@ -120,7 +120,7 @@ (選択性) 航空機 (선택) 항공기 (Sélectif) Véhicules aériens - (可选) 空中载具 + (可选)空中载具 (可選) 空中載具 (Selettiva) Veicolo Aerei (Выборочные) Авиатехника @@ -134,7 +134,7 @@ 航空機でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 항공기 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les véhicules aériens. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘空中载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘空中载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘空中載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Veicoli Aerei. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для авиатехники. По умолчанию: Отключено (требуется режим: Выборочные) @@ -148,7 +148,7 @@ (選択性) 船舶 (선택) 함선 (Sélectif) Véhicules marins - (可选) 水上载具 + (可选)水上载具 (可選) 水上載具 (Selettiva) Veicoli Marittimi (Выборочные) Водный транспорт @@ -162,7 +162,7 @@ 船舶でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 함선 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les véhicules marins. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘水上载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘水上载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘水上載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su Veicoli Marittimi. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для водного транспорта. По умолчанию: Отключено (требуется режим: Выборочные) @@ -176,7 +176,7 @@ (選択性) 無人機 (선택) 무인기 (Sélectif) Drones - (可选) 无人载具 + (可选)无人机 (可選) 無人載具 (Selettiva) UAV (Выборочные) Беспиплотники @@ -190,7 +190,7 @@ 無人機でのモードを選択します。(標準: 無効化 (要求モード: 選択性) 무인기 시점. 기본값: 사용 안 함 (모드-선택 필요) Mode sélectif dans les drones. Défaut: Désactivé (Nécessite Mode: Sélectif) - 设定在搭乘无人载具的状况下能使用的视野模式。预设:关闭(需在全局设定中先选择'使用可选设定') + 设定在搭乘无人载具的状况下能使用的人称模式。预设:关闭(需在全局设定中先选择'使用可选设定') 設定在搭乘無人載具的狀況下能使用的視野模式。預設:關閉(需在全局設定中先選擇'使用可選設定') Modalità selettiva su UAVi. Default: Disabilitato (Necessita della Modalità: Selettiva) Выборочные установки для беспилотников. По умолчанию: Отключено (требуется режим: Выборочные) @@ -252,9 +252,10 @@ Запоминать вид для типов техники 車両の種類により視点を変更 保留載具的視野模式 - 保留载具的视野模式 + 保留载具的人称模式 Zachowaj ustawienie widoku dla pojazdów Araç türleri için görünümü koru + 차량 타입에 따른 시야 정보 저장 Switch view on vehicle change to last used in this vehicle type (Requires Mode: Disabled) @@ -262,9 +263,10 @@ Переключать вид при смене техники на последний использованный в данном типе техники (требуется режим: Отключено) 車両の種類により最後に使用した視点へ切り替え (無効モードでのみ有効) 切換到載具時自動切換到上次最後使用的視野模式(需求模式:關閉) - 切换到载具时自动切换到上次最后使用的视野模式(需求模式:关闭) + 切换到载具时自动切换到上次最后使用的人称模式(需求模式:关闭) Zmień widok podczas zmiany pojazdu na ustawienie widoku z ostatniego używanego pojazdu tego typu (Wymaga Tryb: Wyłączony Araçlar için en son kullanılan bakış türünü kaydet. + 해당 차량 타입에서 마지막으로 사용했던 시야로 설정하여 봅니다 (모드 - 사용 안함 필요) diff --git a/addons/volume/stringtable.xml b/addons/volume/stringtable.xml index 3c7a6cc65d..1ccfd9684c 100644 --- a/addons/volume/stringtable.xml +++ b/addons/volume/stringtable.xml @@ -59,7 +59,7 @@ 音量を戻しました Volume rétabli 음량 복구됨 - 回复音量 + 恢复音量 回復音量 Volume ripristinato Громкость восстановлена @@ -107,7 +107,7 @@ Verringere die Lautstärke innerhalb von Fahrzeugen automatisch. 車両内では自動的に音量を低減させます。 Réduit automatiquement le volume à l'intérieur des véhicules. - 자동으로 차량내에 있으면 음량을 감소 합니다. + 차량 내에 있으면 자동으로 음량을 감소시킵니다. 当搭乘载具时自动降低音量。 當搭乘載具時自動降低音量。 Riduce automaticamente il volume quando dentro i veicoli. @@ -133,8 +133,8 @@ Zeige Benachrichtigung, wenn Lautstärke verringert/wiederhergestellt wurde. 音量を低減、復元時に通知を表示します。 Affiche une notification lorsque le volume est réduit/rétabli. - 음량이 감소/복구될 때 메세지를 표시합니다. - 当正在降低/回复音量时显示提示。 + 음량이 감소/복구될 때 메시지를 표시합니다. + 当正在降低/恢复音量时显示提示。 當正在降低/回復音量時顯示提示。 Mostra notifiche mentre si abbassa/ripristina il volume. Показывать уведомление при уменьшении/восстановлении громкости @@ -170,7 +170,7 @@ Erinnere wenn verringert 低減時に通知 Rappel si réduit - 감소시 알림 + 감소 시 알림 降低音量时是否提醒 降低音量時是否提醒 Sollecita se diminuito @@ -196,7 +196,7 @@ Lautstärke noch immer verringert. 音量を低減中です Volume réduit - 음량 감소중 + 음량 감소 중 降低音量中 降低音量中 Il volume è ancora basso diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 185cfdc948..29a12ec4dc 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -13,8 +13,8 @@ Mostra indicazioni nel lancio granate Mostrat texto ao lançar granada 手榴弾を投げるときに通知 - 수류탄 투척시 화면에 문자 표시 - 投掷手榴弹时显示提示讯息 + 수류탄 투척 시 화면에 문자 표시 + 投掷手榴弹时显示提示信息 投擲手榴彈時顯示提示訊息 @@ -29,8 +29,8 @@ Mostra una notifica quando si lanciano granate Mostra um hint ou texto ao lançar uma granada 手榴弾を投げるときに、ヒントか文で通知します。 - 수류탄 투척시 화면에 문자나 힌트를 표시합니다. - 投掷手榴弹时显示提示讯息。 + 수류탄 투척 시 화면에 문자나 힌트를 표시합니다. + 投掷手榴弹时显示提示信息。 投擲手榴彈時顯示提示訊息 diff --git a/addons/weather/functions/fnc_calculateRoughnessLength.sqf b/addons/weather/functions/fnc_calculateRoughnessLength.sqf index 57723355e8..26b7f3a6a9 100644 --- a/addons/weather/functions/fnc_calculateRoughnessLength.sqf +++ b/addons/weather/functions/fnc_calculateRoughnessLength.sqf @@ -19,18 +19,18 @@ #define ROUGHNESS_LENGTHS [0.0002, 0.0005, 0.0024, 0.03, 0.055, 0.1, 0.2, 0.4, 0.8, 1.6] private _windSource = _this vectorDiff ((vectorNormalized wind) vectorMultiply 25); -private _nearBuildings = { +private _nearBuildingCount = { // Filter lights - fixes high roughness on airports (#6602) str _x find "light" == -1 -} count (_windSource nearObjects ["Building", 50]); +} count (ASLToAGL _windSource nearObjects ["Building", 50]); private _isWater = surfaceIsWater _windSource; -if (_nearBuildings == 0 && _isWater) exitWith { +if (_nearBuildingCount == 0 && _isWater) exitWith { 0.0005 }; -if (_nearBuildings >= 10) exitWith { +if (_nearBuildingCount >= 10) exitWith { 1.6 }; -ROUGHNESS_LENGTHS select (2 + (_nearBuildings min 6)) +ROUGHNESS_LENGTHS select (2 + (_nearBuildingCount min 6)) diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 82e0006843..f8f649fb48 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -14,7 +14,7 @@ Mostrar informação do vento 風速を表示 바람 정보 표시 - 显示风力资讯 + 显示风力信息 顯示風力資訊 Rüzgar Bilgilerini Göster @@ -31,7 +31,7 @@ Mostrar informação do vento (alternar) 風速を表示 (切り替え) 바람 정보 표시 (토글) - 显示风力资讯(切换) + 显示风力信息(切换) 顯示風力資訊(切換) Rüzgar Bilgilerini Göster (Değiştir) @@ -47,7 +47,7 @@ Погода Meteo 天候 - 기후 + 날씨 天气 天氣 Hava Durumu @@ -65,7 +65,7 @@ Modulo Sincronizzazione Meteo ACE Multiplayer ACE 天候モジュールではマルチプレイで同期します。 ACE 기후 모듈과 멀티플레이가 동기화됩니다. - 使用ACE天气模块来同步所有客户端的天气状态(多人游戏) + 使用 ACE 天气模块来同步所有客户端的天气状态(多人游戏) 使用ACE天氣模塊來同步所有客戶端的天氣狀態(多人遊戲) Çok oyunculu ACE @@ -81,7 +81,7 @@ Погода ACE Meteo ACE ACE 天候 - ACE 기후 + ACE 날씨 ACE 天气 ACE 天氣 ACE Hava Durumu @@ -131,8 +131,8 @@ Определяет интервал (в секундах) между обновлениями погоды Definisce l'intervallo(in secondi) tra aggiornamenti del meteo 天候を更新する間隔を定義します。(秒) - 기후를 갱신 하는 간격을 초 단위로 정합니다. - 设定天气更新的时间间隔(秒) + 기후를 갱신하는 간격을 초 단위로 정합니다. + 设定天气更新的时间间隔(秒) 設定天氣更新的時間間隔(秒) Hava durumu güncellemeleri arasındaki aralığı (saniye) tanımlar @@ -141,7 +141,7 @@ Wind Simulation (kartenbasiert) Simulazione del Vento (basato sulla mappa) 風力模擬(基於地圖) - 风力模拟(基于地图) + 风力模拟(基于地图) 風シミュレーション (マップを基に) 바람 시뮬레이션 (지도 기반) Symulacja Wiatru (bazowana na mapie) @@ -157,9 +157,9 @@ Aktiviert die kartenbasierte Windsimulation (überschreibt Vanilla Wind) Abilita la simulazione del vento basato sulla mappa (sovrascrive il vento vanilla) 啟用後將遵照地圖特色進行風力模擬(覆蓋掉官方原版的風力模擬) - 启用后将遵照地图特色进行风力模拟(覆盖掉官方原版的风力模拟) + 启用后将遵照地图特色进行风力模拟(覆盖掉官方原版的风力模拟) マップを基にした風シミュレーションを有効化 (標準の風を上書き) - 지도 기반의 바람 시뮬레이션을 활성화합니다 (바닐라 바람을 덮음) + 지도 기반의 바람 시뮬레이션을 활성화합니다. (바닐라 바람을 덮음) Aktywuje symulację wiatru bazującą na mapie (nadpisuje wind z domyślnej wersji gry) Включает симуляцию ветра на основе текущей местности (переписывает ванильный ветер) Ativar a simulação de vento dos mapas. (sobrepõe vento vanilla) @@ -172,6 +172,7 @@ Check Air Temperature Überprüfe Lufttemperatur 檢查氣溫 + 检查气温 Controllare la temperatura dell'aria Zkontrolovat teplotu vzduchu 気温を確認 @@ -181,11 +182,13 @@ Hava Sıcaklığını Kontrol Et Проверить температуру воздуха Comprobar temperatura de aire + 기온 측정하기 Show Check Air Temperature Action Zeige "Überprüfe Lufttemperatur" im Selbstinteraktionsmenü 顯示檢查氣溫動作 + 显示检查气温选项 Mostra Controlla l'azione della temperatura dell'aria Ukázat akci kontroly teploty vzduchu 気温の確認動作を表示 @@ -195,6 +198,7 @@ Hava Sıcaklığını Kontrol Etme Eylemini Göster Показывать действие проверки температуры Mostrar acción de comprobar temperatura de aire + 상호작용에서 기온 측정하기 표시 diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index f9b0ca56e4..03acec7e34 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -14,7 +14,7 @@ Informação do vento 風の情報 바람 정보 - 风力资讯 + 风力信息 風力資訊 Rüzgar Bilgisi @@ -30,8 +30,8 @@ Direzione: %1° Direção: %1 風向: %1 - 방향: %1 - 风向: %1 + 풍향: %1 + 风向:%1 風向: %1 Yön: %1 @@ -48,7 +48,7 @@ Velocidade: %1 m/s 風速: %1 m/s 풍속: %1 m/s - 风速: %1 m/s + 风速:%1 m/s 風速: %1 m/s Hız: %1 m/s @@ -65,7 +65,7 @@ Informação Meteorológica 天候の情報 기상 정보 - 天气资讯 + 天气信息 天氣資訊 Hava Durumu Bilgisi @@ -82,7 +82,7 @@ Humidade: %1% 湿度: %1% 습도: %1% - 湿度: %1% + 湿度:%1% 濕度: %1% Nem Oranı: %1% @@ -99,7 +99,7 @@ Deviazione del Vento 風向の変化 풍향 변화 - 风偏 + 弹道风偏 風偏 Rüzgar Sapması @@ -116,7 +116,7 @@ Deviazione del Vento 風向の変化 풍향 변화 - 风偏 + 弹道风偏 風偏 Rüzgar Sapması @@ -133,7 +133,7 @@ Abilita deviazione del vento 風向の変化を有効化 풍향 변화를 적용합니다 - 开启风偏效果 + 开启弹道风偏效果 開啟風偏效果 Rüzgar sapmasını aktif et @@ -150,7 +150,7 @@ Abilita per Veicoli 車両へ有効化 차량 적용 - 启用风偏给载具 + 给载具启用弹道风偏 啟用風偏給載具 Araçlar da etkin @@ -167,7 +167,7 @@ Abilita deviazione del vento per artiglieri di statiche/veicoli 重火器や車両へ、風向の変化を有効化 차량이나 거치식 무기 사수에게 풍향 변화를 적용합니다 - 使风偏作用在固定式武器与载具炮手身上 + 使弹道风偏作用在固定式武器与载具炮手身上 使風偏作用在固定式武器與載具砲手身上 Araç nişancıları için rüzgar sapmasını etkinleştirir. diff --git a/addons/xm157/$PBOPREFIX$ b/addons/xm157/$PBOPREFIX$ new file mode 100644 index 0000000000..2bddd0ac4e --- /dev/null +++ b/addons/xm157/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\xm157 \ No newline at end of file diff --git a/addons/xm157/CfgEventHandlers.hpp b/addons/xm157/CfgEventHandlers.hpp new file mode 100644 index 0000000000..2a3f71f852 --- /dev/null +++ b/addons/xm157/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/xm157/CfgSounds.hpp b/addons/xm157/CfgSounds.hpp new file mode 100644 index 0000000000..907e710bba --- /dev/null +++ b/addons/xm157/CfgSounds.hpp @@ -0,0 +1,6 @@ +class CfgSounds { + class GVAR(click) { + sound[] = {QPATHTOF(sounds\click.wav), db-30, 3}; + titles[] = {}; + }; +}; diff --git a/addons/xm157/CfgWeapons.hpp b/addons/xm157/CfgWeapons.hpp new file mode 100644 index 0000000000..69abc30bf0 --- /dev/null +++ b/addons/xm157/CfgWeapons.hpp @@ -0,0 +1,48 @@ +class CfgWeapons { + class ItemCore; + class InventoryOpticsItem_Base_F; + + class ace_xm157_prototype: ItemCore { + author = ECSTRING(common,ACETeam); + scope = 1; // hidden + displayName = "XM157 Prototype"; + descriptionShort = ""; + picture = "\a3\Weapons_F\acc\Data\UI\icon_optic_tws_ca.paa"; + model = "\A3\weapons_f\acc\acco_tws_F"; + inertia = 0.3; + + class CBA_ScriptedOptic { + bodyTexture = QPATHTOF(data\ace_vector_body_co.paa); + // bodyTextureNight = ".paa"; // optional + bodyTextureSize = 1; + hideMagnification = 1; // no point, and it flickers at 1x + disableTilt = 0; + }; + + weaponInfoType = QGVAR(info); + class ItemInfo: InventoryOpticsItem_Base_F { + mass = 14; + optics = 1; + modelOptics = "\x\cba\addons\optics\cba_optic_big_100.p3d"; + class OpticsModes { + class lpvo { + opticsID = 1; + useModelOptics = 1; + opticsPPEffects[] = { "OpticsCHAbera1", "OpticsBlur1" }; + opticsZoomMin = "8 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')"; + opticsZoomMax = "1 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')"; + opticsZoomInit = "1 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')"; + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + distanceZoomMin = 100; + distanceZoomMax = 100; + memoryPointCamera = "opticView"; + visionMode[] = {"Normal"}; + opticsFlare = 1; + opticsDisablePeripherialVision = 1; + cameraDir = ""; + }; + }; + }; + }; +}; diff --git a/addons/xm157/README.md b/addons/xm157/README.md new file mode 100644 index 0000000000..55a0696216 --- /dev/null +++ b/addons/xm157/README.md @@ -0,0 +1,2 @@ +ace_xm157 +========== diff --git a/addons/xm157/RscInGameUI.hpp b/addons/xm157/RscInGameUI.hpp new file mode 100644 index 0000000000..4e43e1581a --- /dev/null +++ b/addons/xm157/RscInGameUI.hpp @@ -0,0 +1,79 @@ +class RscObject; +class RscControlsGroupNoScrollbars; + +class RscText; +class GVAR(text): RscText { + font = "EtelkaMonospacePro"; + SizeEx = 0.04; + colorText[]={1,0.1,0.05,0.95}; + shadow = 0; +}; +class GVAR(textMenu): GVAR(text) { + SizeEx = 0.09; + style = 2+16; +}; + +class RscInGameUI { + class CBA_ScriptedOptic_zooming; + class GVAR(info): CBA_ScriptedOptic_zooming { + onLoad = QUOTE(call FUNC(weaponInfo_onLoad)); + class objects { + class Optic: RscObject { // first focal plane + idc = IDC_SCOPE_OBJECT; + type = 82; + model = "\A3\Misc_F\Helpers\UserTexture1m.p3d"; + x = 0; + y = 0; + z = 0; + xBack = 0.9; + yBack = 0.9; + zBack = 0.3; + inBack = 0; + enableZoom = 1; + zoomDuration = 0.001; + class Areas { + class usertexture { + selection = "usertexture"; + class controls { + class test: RscControlsGroupNoScrollbars { + idc = IDC_SCOPE_GROUP; + x = 0; + y = 0; + w = 1; + h = 4/3; + }; + }; + }; + }; + }; + class Screen: RscObject { + idc = IDC_SCREEN_OBJECT; + type = 82; + model = "\A3\Misc_F\Helpers\UserTexture1m.p3d"; + x = 0; + y = 0; + z = 0; + xBack = 0.9; + yBack = 0.9; + zBack = 0.3; + inBack = 1; + enableZoom = 1; + zoomDuration = 0.001; + class Areas { + class usertexture { + selection = "usertexture"; + class controls { + class test: RscControlsGroupNoScrollbars { + idc = IDC_SCREEN_GROUP; + x = 0; + y = 0; + w = 1; + h = 4/3; + }; + }; + }; + }; + }; + }; + }; +}; diff --git a/addons/xm157/XEH_PREP.hpp b/addons/xm157/XEH_PREP.hpp new file mode 100644 index 0000000000..56613ffe34 --- /dev/null +++ b/addons/xm157/XEH_PREP.hpp @@ -0,0 +1,8 @@ +LOG("prep"); + +PREP(ballistics_calculator); +PREP(ballistics_getData); +PREP(keyPress); +PREP(weaponInfo_draw); +PREP(weaponInfo_drawMenu); +PREP(weaponInfo_onLoad); diff --git a/addons/xm157/XEH_postInit.sqf b/addons/xm157/XEH_postInit.sqf new file mode 100644 index 0000000000..5f00e3209f --- /dev/null +++ b/addons/xm157/XEH_postInit.sqf @@ -0,0 +1,66 @@ +#include "script_component.hpp" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +GVAR(shown) = false; +GVAR(data) = createHashMap; +([worldName] call EFUNC(common,getMapData)) params ["_latitude"]; +GVAR(data) set ["latitude", _latitude]; + + +// Add Keybinds +["ACE3 Equipment", QGVAR(range), [format ["XM157 - %1", localize "str_a3_rscdisplayarsenal_stat_range"]], { + ["range", true] call FUNC(keyPress); +}, { + ["range", false] call FUNC(keyPress); +}, [DIK_TAB, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(left), [format ["XM157 - %1", localize "str_a3_left"]], { + ["right", true] call FUNC(keyPress); +}, { + ["right", false] call FUNC(keyPress); +}, [DIK_END, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(right), [format ["XM157 - %1", localize "str_a3_right"]], { + ["left", true] call FUNC(keyPress); +}, { + ["left", false] call FUNC(keyPress); +}, [DIK_DELETE, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(up), [format ["XM157 - %1", localize "str_a3_rscattributetargetstate_up"]], { + ["up", true] call FUNC(keyPress); +}, { + ["up", false] call FUNC(keyPress); +}, [DIK_PGUP, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +["ACE3 Equipment", QGVAR(down), [format ["XM157 - %1", localize "str_a3_rscattributetargetstate_down"]], { + ["down", true] call FUNC(keyPress); +}, { + ["down", false] call FUNC(keyPress); +}, [DIK_PGDN, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + + + +#ifdef ENABLE_QUICK_TESTING +player addPrimaryWeaponItem "ace_xm157_prototype"; +[player] call CBA_fnc_addUnitTrackProjectiles; +player addItem "ACE_ATragMX"; +player addItem "ace_rangecard"; + +["recompile", "recompile", "recompile", { + private _start = diag_tickTime; + [] call ACE_PREP_RECOMPILE; + [] call ace_common_fnc_dumpPerformanceCounters; + private _end = diag_tickTime; + systemChat format ["recompile took [%1 ms]", (1000 * (_end - _start)) toFixed 1]; + + if (productVersion #4 == "Diag") then { + call compile "diag_mergeConfigFile ['P:\z\ace\addons\xm157\config.cpp']"; + }; + + private _windSpd = vectorMagnitude wind; + private _windDir = (wind select 0) atan2 (wind select 1); + systemChat format ["Wind %1 @ %2", _windSpd, _windDir + 180]; + + false +}, {false}, [0x21, [false, false, false]], false] call CBA_fnc_addKeybind; // F Key +#endif diff --git a/addons/xm157/XEH_preInit.sqf b/addons/xm157/XEH_preInit.sqf new file mode 100644 index 0000000000..b47cf6628d --- /dev/null +++ b/addons/xm157/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/xm157/XEH_preStart.sqf b/addons/xm157/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/xm157/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/xm157/config.cpp b/addons/xm157/config.cpp new file mode 100644 index 0000000000..2689764b19 --- /dev/null +++ b/addons/xm157/config.cpp @@ -0,0 +1,27 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {"ace_xm157_prototype"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_advanced_ballistics", "ace_scopes"}; + author = ECSTRING(common,ACETeam); + authors[] = {"PabstMirror"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgSounds.hpp" +#include "CfgWeapons.hpp" +#include "RscInGameUI.hpp" + +class asdg_OpticRail; +class asdg_OpticRail1913: asdg_OpticRail { + class compatibleItems { + ace_xm157_prototype = 1; + }; +}; diff --git a/addons/xm157/data/ace_vector_body_co.paa b/addons/xm157/data/ace_vector_body_co.paa new file mode 100644 index 0000000000..71e1984c6e Binary files /dev/null and b/addons/xm157/data/ace_vector_body_co.paa differ diff --git a/addons/xm157/data/mrad_10_ca.paa b/addons/xm157/data/mrad_10_ca.paa new file mode 100644 index 0000000000..293a29debe Binary files /dev/null and b/addons/xm157/data/mrad_10_ca.paa differ diff --git a/addons/xm157/data/mrad_20_ca.paa b/addons/xm157/data/mrad_20_ca.paa new file mode 100644 index 0000000000..99b724a861 Binary files /dev/null and b/addons/xm157/data/mrad_20_ca.paa differ diff --git a/addons/xm157/data/mrad_40_ca.paa b/addons/xm157/data/mrad_40_ca.paa new file mode 100644 index 0000000000..9e097adff1 Binary files /dev/null and b/addons/xm157/data/mrad_40_ca.paa differ diff --git a/addons/xm157/dev/generate_reticle.py b/addons/xm157/dev/generate_reticle.py new file mode 100644 index 0000000000..119b547ab4 --- /dev/null +++ b/addons/xm157/dev/generate_reticle.py @@ -0,0 +1,178 @@ +from PIL import Image, ImageDraw, ImageFont, ImageFilter +import math + +# based on vortex razor hd + +final_scale = 10 + +supersample = 4 +# supersampling helps make rounded circles, does slighly blur text and straight lines +pixels_per_mrad = supersample * final_scale +image_size = supersample * 4096 +image_center = image_size / 2 + +# create an image +out = Image.new("RGBA", (image_size, image_size), (255, 255, 255, 0)) +# get a drawing context +d = ImageDraw.Draw(out) + +line_thin = math.floor(0.07 * pixels_per_mrad) +line_thick = math.floor(0.15 * pixels_per_mrad) +font_size = math.floor(0.55 * pixels_per_mrad) +# source https://fonts.google.com/specimen/Electrolize (Open Font License) +fnt = ImageFont.truetype("Electrolize-Regular.ttf", font_size) + +# draw center dot +d.ellipse([ + (image_center - 0.1 * pixels_per_mrad, image_center - 0.1 * pixels_per_mrad), + (image_center + 0.1 * pixels_per_mrad, image_center + 0.1 * pixels_per_mrad) +], fill=(0, 0, 0)) + +# draw 3 main axis lines +d.line([ + (image_center - 8 * pixels_per_mrad, image_center), + (image_center - 0.5 * pixels_per_mrad, image_center) +], fill=(0, 0, 0), width=line_thin) +d.line([ + (0, image_center), + (image_center - 8.5 * pixels_per_mrad, image_center) +], fill=(0, 0, 0), width=line_thick) +d.line([ + (image_center + 0.5 * pixels_per_mrad, image_center), + (image_center + 8 * pixels_per_mrad, image_center) +], fill=(0, 0, 0), width=line_thin) +d.line([ + (image_center + 8.5 * pixels_per_mrad, image_center), + (image_size, image_center) +], fill=(0, 0, 0), width=line_thick) +d.line([ + (image_center, image_center + 0.5 * pixels_per_mrad), + (image_center, image_center + 11 * pixels_per_mrad) +], fill=(0, 0, 0), width=line_thin) +d.line([ + (image_center, image_center + 11.5 * pixels_per_mrad), + (image_center, image_size) +], fill=(0, 0, 0), width=line_thick) + +# draw big triangle bar things +if (image_center - 15 * pixels_per_mrad > 0): + d.polygon([ + (0, image_center + 2 * pixels_per_mrad), + (image_center - 20 * pixels_per_mrad, image_center + 2 * pixels_per_mrad), + (image_center - 15 * pixels_per_mrad, image_center), + (image_center - 20 * pixels_per_mrad, image_center - 2 * pixels_per_mrad), + (0, image_center - 2 * pixels_per_mrad), + ], fill=(0, 0, 0)) + d.polygon([ + (image_size, image_center + 2 * pixels_per_mrad), + (image_center + 20 * pixels_per_mrad, image_center + 2 * pixels_per_mrad), + (image_center + 15 * pixels_per_mrad, image_center), + (image_center + 20 * pixels_per_mrad, image_center - 2 * pixels_per_mrad), + (image_size, image_center - 2 * pixels_per_mrad), + ], fill=(0, 0, 0)) + d.polygon([ + (image_center - 2 * pixels_per_mrad, image_size), + (image_center - 2 * pixels_per_mrad, image_center + 20 * pixels_per_mrad), + (image_center, image_center + 15 * pixels_per_mrad), + (image_center + 2 * pixels_per_mrad, image_center + 20 * pixels_per_mrad), + (image_center + 2 * pixels_per_mrad, image_size), + ], fill=(0, 0, 0)) + + +# draw windage hash marks and text +for x in range(1, 9): + if (x % 2 == 0): + text = f"{abs(x)}" + # windage odd numbers + d.text((image_center + (x - 0.15) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), text, font=fnt, fill=(0, 0, 0)) + d.text((image_center - (x + 0.15) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), text, font=fnt, fill=(0, 0, 0)) + # windage mrad hashs + d.line([ + (image_center + x * pixels_per_mrad, image_center + line_thin / 2), + (image_center + x * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + d.line([ + (image_center - x * pixels_per_mrad, image_center + line_thin / 2), + (image_center - x * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + if (x % 2 == 0): + d.line([ + (image_center - x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center - x * pixels_per_mrad, image_center + 0.7 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + d.line([ + (image_center + x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center + x * pixels_per_mrad, image_center + 0.7 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + else: + d.line([ + (image_center - x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center - x * pixels_per_mrad, image_center + 0.55 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + d.line([ + (image_center + x * pixels_per_mrad, image_center + 0.2 * pixels_per_mrad), + (image_center + x * pixels_per_mrad, image_center + 0.55 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thick) + + if (x < 8): + # windage half mrad marks + d.line([ + (image_center + (x + .5) * pixels_per_mrad, image_center), + (image_center + (x + .5) * pixels_per_mrad, image_center - 0.25 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + d.line([ + (image_center - (x + .5) * pixels_per_mrad, image_center), + (image_center - (x + .5) * pixels_per_mrad, image_center - 0.25 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + +# handle 10 mrad thick line +d.multiline_text((image_center + (10 - 0.4) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), "10", font=fnt, fill=(0, 0, 0)) +d.line([ + (image_center + 10 * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad), + (image_center + 10 * pixels_per_mrad, image_center + 0.5 * pixels_per_mrad) +], fill=(0, 0, 0), width=line_thick) +d.multiline_text((image_center + (-10 - 0.4) * pixels_per_mrad, image_center - 1.2 * pixels_per_mrad), "10", font=fnt, fill=(0, 0, 0)) +d.line([ + (image_center - 10 * pixels_per_mrad, image_center - 0.5 * pixels_per_mrad), + (image_center - 10 * pixels_per_mrad, image_center + 0.5 * pixels_per_mrad) +], fill=(0, 0, 0), width=line_thick) + +for y in range(1, 12): + line_y = image_center + y * pixels_per_mrad + # elev hash marks + d.line([ + (image_center - 0.5 * pixels_per_mrad, line_y), + (image_center + 0.5 * pixels_per_mrad, line_y) + ], fill=(0, 0, 0), width=line_thin) + if (y < 11): # half marks + d.line([ + (image_center - 0.1 * pixels_per_mrad, line_y + 0.5 * pixels_per_mrad), + (image_center + 0.1 * pixels_per_mrad, line_y + 0.5 * pixels_per_mrad) + ], fill=(0, 0, 0), width=line_thin) + + dot_count = 2 + if (y > 2): dot_count = 3 + if (y > 4): dot_count = 4 + if (y > 6): dot_count = 5 + for dot in range(1, dot_count + 1): + d.ellipse([ + (image_center + (dot - 0.1) * pixels_per_mrad, line_y - 0.1 * pixels_per_mrad), + (image_center + (dot + 0.1) * pixels_per_mrad, line_y + 0.1 * pixels_per_mrad) + ], fill=(0, 0, 0)) + d.ellipse([ + (image_center + (-dot - 0.1) * pixels_per_mrad, line_y - 0.1 * pixels_per_mrad), + (image_center + (-dot + 0.1) * pixels_per_mrad, line_y + 0.1 * pixels_per_mrad) + ], fill=(0, 0, 0)) + if (y % 2 == 0): + d.text((image_center + (dot_count + 0.85) * pixels_per_mrad, line_y - 0.3 * pixels_per_mrad), f"{y}", font=fnt, fill=(0, 0, 0)) + if (y >= 10): dot_count += 0.2 + d.text((image_center - (dot_count + 1.15) * pixels_per_mrad, line_y - 0.3 * pixels_per_mrad), f"{y}", font=fnt, fill=(0, 0, 0)) + +if (supersample > 1): + out = out.resize((4096, 4096)) + + +output_filename = f"mrad_{final_scale}_ca.png" +out.show() +out.save(output_filename) +print(f"written to {output_filename}") diff --git a/addons/xm157/functions/fnc_ballistics_calculator.sqf b/addons/xm157/functions/fnc_ballistics_calculator.sqf new file mode 100644 index 0000000000..e017cd45b7 --- /dev/null +++ b/addons/xm157/functions/fnc_ballistics_calculator.sqf @@ -0,0 +1,101 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror, Ruthberg (Based on ace_atragmx_fnc_calculate_solution) + * Calculates elevation and windage + * + * Arguments: + * 0: Range + * 1: Direction of Fire (deg) - Yaw + * 2: Inlination (deg) - Pitch + * 3: Bank (deg) - Roll + * + * Return Value: + * Elevation and Windage in MRAD + * + * Example: + * [500, 90, 0, 0] call ace_xm157_fnc_ballistics_calculator + * + * Public: No + */ + +params ["_targetRange", "_directionOfFire", "_inclinationAngle", "_bank"]; + +private _weaponInfo = [] call FUNC(ballistics_getData); +if (_weaponInfo isEqualTo []) exitWith { [0,0] }; +_weaponInfo params ["_scopeBaseAngle","_boreHeight","_airFriction","_muzzleVelocity","_bc", + "_dragModel","_atmosphereModel","_barrelTwist","_twistDirection","_caliber","_bulletLength","_bulletMass"]; + +private _latitude = GVAR(data) getOrDefault ["latitude", 0]; + +// Get Wind +private _windSpeed = GVAR(data) getOrDefault ["wind_speed", 0]; +private _windDirection = 22.5 * (GVAR(data) getOrDefault ["wind_dir", 0]); +private _wind = [sin (_directionOfFire-_windDirection) * _windSpeed, -cos (_directionOfFire-_windDirection) * _windSpeed, 0]; + +// Get atmosphere +private _altitude = (getPosASL ace_player) select 2; +private _relativeHumidity = EGVAR(weather,currentHumidity); +private _temperature = _altitude call EFUNC(weather,calculateTemperatureAtHeight); +private _barometricPressure = _altitude call EFUNC(weather,calculateBarometricPressure); + + +private _bulletPos = [0,0,-(_boreHeight / 100)]; +private _lastBulletPos = +_bulletPos; +private _bulletVelocity = [0,Cos(_scopeBaseAngle) * _muzzleVelocity,Sin(_scopeBaseAngle) * _muzzleVelocity]; +private _gravity = [-sin (_bank) * cos(_scopeBaseAngle + _inclinationAngle) * -GRAVITY, + sin(_scopeBaseAngle + _inclinationAngle) * -GRAVITY, + cos (_bank) * cos(_scopeBaseAngle + _inclinationAngle) * -GRAVITY]; + +private _useAB = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; +if (_useAB) then { + _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel])); +}; + +private _deltaT = 1 / 60; +private _TOF = 0; // Limit TOF to 5 seconds! +while {(_TOF < 5) && {(_bulletPos # 1) < _targetRange}} do { + private _trueVelocity = _bulletVelocity vectorDiff _wind; + private _trueSpeed = vectorMagnitude _trueVelocity; + + private _bulletAccel = if (_useAB) then { + private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3:%4", _dragModel, _bc, _trueSpeed, _temperature])); + (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); + } else { + _trueVelocity vectorMultiply (_trueSpeed * _airFriction); + }; + _bulletAccel = _bulletAccel vectorAdd _gravity; + _lastBulletPos = _bulletPos; + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); + _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); + + _TOF = _TOF + _deltaT; +}; + +private _tx = (_lastBulletPos select 0) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 0) - (_lastBulletPos select 0)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); +private _tz = (_lastBulletPos select 2) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); +private _elevation = - atan(_tz / _targetRange); +private _windage = - atan(_tx / _targetRange); + + +if (_useAB && {(_bulletPos select 1) > 0}) then { + // Coriolis + private _horizontalDeflection = 0.0000729 * (_bulletPos select 1) * _TOF * sin(_latitude); + private _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); + _windage = _windage + _horizontalCoriolis; + // Eoetvoes + private _eoetvoesMultiplier = 2 * (0.0000729 * _muzzleVelocity / -GRAVITY) * cos(_latitude) * sin(_directionOfFire); + private _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; + private _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); + _elevation = _elevation + _verticalCoriolis; + // Spin drift + private _stabilityFactor = 1.5; + if (_caliber * _bulletLength * _bulletMass * _barrelTwist > 0) then { + _stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor); + }; + private _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; + private _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); + private _windage = _windage + _spinDrift; +}; + +[17.453*_elevation, 17.453*_windage] // Convert to MRAD and return diff --git a/addons/xm157/functions/fnc_ballistics_getData.sqf b/addons/xm157/functions/fnc_ballistics_getData.sqf new file mode 100644 index 0000000000..c0d1eed3bf --- /dev/null +++ b/addons/xm157/functions/fnc_ballistics_getData.sqf @@ -0,0 +1,62 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror, Ruthberg (Based on ace_atragmx) + * Gets ballistic info for a weapon, mag and ammo + * + * Arguments: + * None + * + * Return Value: + * Weapon Info + * + * Example: + * [] call ace_xm157_fnc_ballistics_getData + * + * Public: No + */ + +private _unit = ace_player; +private _weaponClass = primaryWeapon _unit; +private _magazineClass = (primaryWeaponMagazine _unit) param [0, ""]; +private _ammoClass = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); + +private _key = format ["weaponInfoCache-%1-%2-%3",_weaponClass,_magazineClass,_ammoClass]; +private _weaponInfo = GVAR(data) getOrDefault [_key, []]; +if ((_weaponInfo isEqualTo []) && {_magazineClass != ""}) then { + TRACE_3("new weapon/mag",_weaponClass,_magazineClass,_ammoClass); + private _useABConfig = (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]); + + private _zeroRange = 100; + private _boreHeight = [_unit, 0] call EFUNC(scopes,getBoreHeight); + + private _ammoConfig = _ammoClass call EFUNC(advanced_ballistics,readAmmoDataFromConfig); + _ammoConfig params ["_airFriction","_caliber","_bulletLength","_bulletMass","","_dragModel","_ballisticCoefficients","","_atmosphereModel","","_muzzleVelocityTable","_barrelLengthTable"]; + private _weaponConfig = _weaponClass call EFUNC(advanced_ballistics,readWeaponDataFromConfig); + _weaponConfig params ["_barrelTwist", "_twistDirection", "_barrelLength"]; + private _bc = if (_ballisticCoefficients isEqualTo []) then { 0 } else { _ballisticCoefficients # 0 }; + + // Get Muzzle Velocity + private _muzzleVelocity = if (_barrelLength > 0 && _useABConfig && {_bc != 0}) then { + [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift) + } else { + private _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "initSpeed"); + private _initSpeedCoef = getNumber (configFile >> "CfgWeapons" >> _weaponClass >> "initSpeed"); + if (_initSpeedCoef < 0) then { + _initSpeed = _initSpeed * -_initSpeedCoef; + }; + if (_initSpeedCoef > 0) then { + _initSpeed = _initSpeedCoef; + }; + _initSpeed + }; + + // Scope Base Angle + private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZero:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight]; + private _scopeBaseAngle = parseNumber _zeroAngle; + + _weaponInfo = [_scopeBaseAngle,_boreHeight,_airFriction,_muzzleVelocity,_bc,_dragModel,_atmosphereModel,_barrelTwist,_twistDirection,_caliber,_bulletLength,_bulletMass]; + GVAR(data) set [_key, _weaponInfo]; + TRACE_1("setting cache",_weaponInfo); +}; + +_weaponInfo diff --git a/addons/xm157/functions/fnc_keyPress.sqf b/addons/xm157/functions/fnc_keyPress.sqf new file mode 100644 index 0000000000..36220f493c --- /dev/null +++ b/addons/xm157/functions/fnc_keyPress.sqf @@ -0,0 +1,67 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Handles key presses + * + * Arguments: + * 0: Type + * 1: IsKeyDown + * + * Return Value: + * Handled + * + * Example: + * ["range", true] call ace_xm157_fnc_keyPress + * + * Public: No + */ + +params ["_func", "_keyDown"]; + +if (!GVAR(shown)) exitWith { false }; // fast exit if not shown +if (!([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith))) exitWith { false }; +if (!(ACE_player call CBA_fnc_canUseWeapon)) exitWith { false }; + +private _display = uinamespace getVariable [QGVAR(display), displayNull]; +if (isNull _display) exitWith { ERROR("keyPress-no display"); false }; + +if (_keyDown) then { playSound QGVAR(click); }; +GVAR(data) set ["lastInputTime", CBA_missionTime]; + +call { + if (_func == "range") exitWith { + if (_keyDown) then { + GVAR(data) set ["range_keyDownStart", CBA_missionTime]; + } else { + private _holdTime = CBA_missionTime - (GVAR(data) getOrDefault ["range_keyDownStart", 0]); + private _range = 0; + if (_holdTime < 0.5) then { + private _distance = round parseNumber ctrlText (_display displayCtrl 151); + if (_distance > 10 && {_distance < RANGEFINDER_MAX}) then { + _range = _distance; + } else { + _range = -1; // bad return + }; + }; + TRACE_1("Updating range",_range); + GVAR(data) set ["range", _range]; + }; + }; + if (!_keyDown) exitWith {}; + + GVAR(data) set ["menu_updated", true]; + private _index = GVAR(data) getOrDefault ["menu_index", 0]; + if (_func in ["left", "right"]) exitWith { + _index = (_index + ([-1, 1] select (_func == "right")) + count GVAR(menu)) % count GVAR(menu); + GVAR(data) set ["menu_index", _index]; + }; + (GVAR(menu) # _index) params ["", "_var", "_thing", ["_upAction", {}], ["_downAction", {}]]; + if (_func == "up") exitWith { + [_index, _var, _thing] call _upAction; + }; + if (_func == "down") exitWith { + [_index, _var, _thing] call _downAction; + }; +}; + +true diff --git a/addons/xm157/functions/fnc_weaponInfo_draw.sqf b/addons/xm157/functions/fnc_weaponInfo_draw.sqf new file mode 100644 index 0000000000..c6b89712d4 --- /dev/null +++ b/addons/xm157/functions/fnc_weaponInfo_draw.sqf @@ -0,0 +1,144 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Draw3D event handler when scope is active + * + * Arguments: + * None (implicit vars from missionEventHandler) + * + * Return Value: + * None + * + * Example: + * [] call ace_xm157_fnc_weaponInfo_draw + * + * Public: No + */ + +//IGNORE_PRIVATE_WARNING ["_thisArgs", "_thisEventHandler"]; // from missionEventHandler +_thisArgs params ["_display"]; +if (isNull _display) exitWith { + TRACE_1("cleaning up display",_thisEventHandler); + GVAR(shown) = false; + removeMissionEventHandler ["Draw3D", _thisEventHandler]; +}; +private _ctrlScopeObject = _display displayCtrl IDC_SCOPE_OBJECT; +private _ctrlScreenObject = _display displayCtrl IDC_SCREEN_OBJECT; + + +// Hide everything when not in scope +private _isUsingOptic = ctrlShown (_display displayCtrl 154); +if (!_isUsingOptic) exitWith { + _ctrlScopeObject ctrlShow false; + _ctrlScreenObject ctrlShow false; +}; +_ctrlScopeObject ctrlShow true; +_ctrlScreenObject ctrlShow true; +BEGIN_COUNTER(draw); + +// Get common info +private _weaponVec = ace_player weaponDirection currentWeapon ace_player; +(_weaponVec call CBA_fnc_vect2Polar) params ["", "_weaponDir", "_weaponPitch"]; +private _weaponBank = call cba_optics_fnc_gunBank; +private _viewBank = _weaponBank; +if (isWeaponDeployed [player, true]) then { // prone deploy tilting is special (screen doesn't tilt, but player does) + _weaponBank = (((vectorUp ace_player) vectorCrossProduct _weaponVec) call CBA_fnc_vect2Polar) # 2; // I think this is right? +}; + +(0.25 call CBA_fnc_getFov) params ["_fov", "_zoom"]; +private _fovMRAD = 1000 * _fov; // Real MRAD (not mils) +private _nonMagnified = _zoom < 1.1; +private _range = GVAR(data) getOrDefault ["range", 0]; +private _needsUpdate = GVAR(data) getOrDefault ["menu_updated", true]; // Updated when a menu item changed +private _timeSinceLastInput = CBA_missionTime - (GVAR(data) getOrDefault ["lastInputTime", 0]); + + +// Bank-tilt display objects +_ctrlScopeObject ctrlSetModelDirAndUp [[0,1,0],[sin _viewBank,0,cos _viewBank]]; +_ctrlScreenObject ctrlSetModelDirAndUp [[0,1,0],[sin _viewBank,0,cos _viewBank]]; + + +// Scope - Handle etched reticle +private _retTex = QPATHTOF(data\mrad_10_ca.paa); +private _retScale = 4096/10; // texureResolution / (px/MRAD) +switch (true) do { + case (_fovMRAD < 4096/40): { + _retTex = QPATHTOF(data\mrad_40_ca.paa); + _retScale = 4096/40; + }; + case (_fovMRAD < 4096/20): { + _retTex = QPATHTOF(data\mrad_20_ca.paa); + _retScale = 4096/20; + }; +}; +private _scale = 1 / (getResolution # 5); +_scale = 2 * _scale * _retScale / _fovMRAD; +_ctrlScopeObject ctrlSetModelScale _scale; +private _ctrlScopeReticle = _display displayCtrl IDC_SCOPE_RETICLE; +if (_retTex != ctrlText _ctrlScopeReticle) then { _ctrlScopeReticle ctrlSetText _retTex; }; + + +// Screen - Draw menu +[_display, _needsUpdate] call FUNC(weaponInfo_drawMenu); + + +// Screen - Show range info +private _rangeInfo = _range call { + if (_range == 0) exitWith { "" }; + if (_range < 0) exitWith { // range error - blink if recent + if ((_timeSinceLastInput < 3) && {(floor (4*_timeSinceLastInput)) % 2 == 1}) then { "----" } else { "" }; + }; + format ["%1 m", _range toFixed 0] +}; +private _ctrl = _display displayCtrl IDC_SCREEN_TEXT_UPPER_RIGHT; +_ctrl ctrlSetText _rangeInfo; + + +// Screen - Show bearing info +private _bearingInfo = call { + private _bearingSetting = GVAR(data) getOrDefault ["bearing_show", 0]; + if ((_bearingSetting == 2) && {_timeSinceLastInput > 2}) exitWith { "" }; + if ((_bearingSetting == 1)) exitWith { format ["%1", floor (17.777777 * _weaponDir)]; }; // (6400 Mils, not MRAD) + format ["%1°", floor _weaponDir]; +}; +private _ctrl = _display displayCtrl IDC_SCREEN_TEXT_UPPER_LEFT; +_ctrl ctrlSetText _bearingInfo; + + +// Screen - update reticle type based on settings and zoom level +private _ctrl = _display displayCtrl IDC_SCREEN_RETICLE; +private _lastMagnified = GVAR(data) getOrDefault ["reticle_cache_lastMag", true]; +private _size = GVAR(data) getOrDefault ["reticle_cache_size", 1]; +if (_needsUpdate || {_nonMagnified isNotEqualTo _lastMagnified}) then { + private _tex = ""; + if (_nonMagnified) then { + switch (GVAR(data) getOrDefault ["reticle_cqb", 0]) do { + case (0): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 1; }; + case (1): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 2; }; + case (2): { _tex = "\a3\weapons_f\acc\data\collimdot_circle_red_ca.paa"; _size = 1; }; + case (3): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_green_ca.paa"; _size = 1; }; + case (4): { _size = 0; }; + }; + } else { + _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 1; + }; + _ctrl ctrlSetText _tex; + GVAR(data) set ["reticle_cache_lastMag", _nonMagnified]; + GVAR(data) set ["reticle_cache_size", _size]; +}; + + +// Screen - update reticle position based on ballistics computer +if (_range > 0 && {_size > 0}) then { + BEGIN_COUNTER(ballistics_calculator); + ([_range, _weaponDir, _weaponPitch, _weaponBank] call FUNC(ballistics_calculator)) params ["_elevMRAD", "_windMRAD"]; + END_COUNTER(ballistics_calculator); + _ctrl ctrlSetPosition [-_windMRAD / _fovMRAD + 0.5 - _size / 2, + 4/3 * (_elevMRAD / _fovMRAD + 0.5 - _size/2), _size, _size*4/3]; + _ctrl ctrlCommit 0; +} else { + _ctrl ctrlSetPosition [0.5 - _size / 2, + 4/3 * (0.5 - _size/2), _size, _size*4/3]; + _ctrl ctrlCommit 0; +}; + + +END_COUNTER(draw); diff --git a/addons/xm157/functions/fnc_weaponInfo_drawMenu.sqf b/addons/xm157/functions/fnc_weaponInfo_drawMenu.sqf new file mode 100644 index 0000000000..63ebe540ef --- /dev/null +++ b/addons/xm157/functions/fnc_weaponInfo_drawMenu.sqf @@ -0,0 +1,81 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Updates the menu display + * + * Arguments: + * 0: Display + * 1: Menu Item Needs Updating + * + * Return Value: + * None + * + * Example: + * [display, true] call ace_xm157_fnc_weaponInfo_drawMenu + * + * Public: No + */ + +params ["_display", "_needsUpdate"]; + +if (isNil QGVAR(menu)) then { + private _arrayUp = { + params ["", "_var", "_thing"]; + private _value = GVAR(data) getOrDefault [_var, 0]; + private _value = (_value + 1 + count _thing) % count _thing; + GVAR(data) set [_var, _value]; + }; + private _arrayDown = { + params ["", "_var", "_thing"]; + private _value = GVAR(data) getOrDefault [_var, 0]; + _value = (_value - 1 + count _thing) % count _thing; + GVAR(data) set [_var, _value]; + }; + private _rangeUp = { + private _range = GVAR(data) getOrDefault ["range", -1]; + if (_range < 0) then { _range = 0; }; + _range = RANGEFINDER_MAX min (100 + 100 * floor (_range/100)); + GVAR(data) set ["range", _range]; + }; + private _rangeDown = { + private _range = GVAR(data) getOrDefault ["range", -1]; + if (_range < 0) then { _range = 0; }; + _range = 0 max (-100 + 100 * ceil (_range/100)); + GVAR(data) set ["range", _range]; + }; + private _atmosphereInfo = { + private _altitude = (getPosASL ace_player) select 2; + private _relativeHumidity = EGVAR(weather,currentHumidity); + private _temperature = _altitude call EFUNC(weather,calculateTemperatureAtHeight); + private _barometricPressure = _altitude call EFUNC(weather,calculateBarometricPressure); // hPA + format ["%1%2 %3%4 %5hPA", _temperature toFixed 1, "°C", _relativeHumidity toFixed 1, "%", _barometricPressure toFixed 0] + }; + GVAR(menu) = [ + ["", "", [""], _rangeUp, _rangeDown], + ["Wind Speed (m/s)", "wind_speed", ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"], _arrayUp, _arrayDown], + ["Wind Direction", "wind_dir", ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"], _arrayUp, _arrayDown], + // ["CQB Reticle", "reticle_cqb", ["2 MOA Red Dot", "4 MOA Red Dot", "Off"], _arrayUp, _arrayDown], + ["Bearing Display", "bearing_show", ["Degrees", "Mils", "Off"], _arrayUp, _arrayDown], + ["Atmosphere", "", _atmosphereInfo, {}, {}] + ]; +}; + + +private _index = GVAR(data) getOrDefault ["menu_index", 0]; +(GVAR(menu) # _index) params ["_title", "_var", "_thing"]; +if ((!_needsUpdate) && {_thing isEqualType []}) exitWith {}; + +private _ctrlMenuText = _display displayCtrl IDC_SCREEN_MENU_TEXT; +private _text = ""; +if (_index != 0) then { + if (_thing isEqualType []) then { + GVAR(data) set ["menu_updated", false]; + private _value = GVAR(data) getOrDefault [_var, 0]; + _text = _title + "\n" + "<" + (_thing param [_value, "#BadIndex"]) + ">"; + } else { + _text = _title + "\n" + ([_var] call _thing); + }; +}; +_ctrlMenuText ctrlSetText _text; + +GVAR(data) set ["menu_updated", false]; diff --git a/addons/xm157/functions/fnc_weaponInfo_onLoad.sqf b/addons/xm157/functions/fnc_weaponInfo_onLoad.sqf new file mode 100644 index 0000000000..3fb82c756e --- /dev/null +++ b/addons/xm157/functions/fnc_weaponInfo_onLoad.sqf @@ -0,0 +1,83 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Creates UI + * + * Arguments: + * 0: Display + * + * Return Value: + * None + * + * Example: + * [display] call ace_xm157_fnc_weaponInfo_onLoad + * + * Public: No + */ + +params ["_display"]; +TRACE_1("weaponInfo_onLoad",_display); + +uinamespace setVariable [QGVAR(display), _display]; +[_display, true] call cba_optics_fnc_loadScriptedOptic; // pass thru to cba + + +// Setup the scope object +private _ctrlScopeObject = _display displayCtrl IDC_SCOPE_OBJECT; +private _scale = 1 / (getResolution # 5); // keep object the same size for any interface size +private _distance = 2.0 * 4/3; +if ((getResolution # 4) < (4/3)) then { _distance = _distance * (getResolution # 7); }; // eg 5x4 +private _base = ["3d", [0,0,_distance], _scale] call EFUNC(common,rscObjectHelper); +_ctrlScopeObject ctrlSetPosition _base; +_ctrlScopeObject ctrlSetModelScale _scale; +_ctrlScopeObject ctrlSetModelDirAndUp [[0,1,0],[0,0,1]]; +_ctrlScopeObject ctrlShow true; + +private _ctrlScopeGroup = _display displayCtrl IDC_SCOPE_GROUP; +// Add reticle +private _ctrlScopeReticle = _display ctrlCreate ["RscPicture", IDC_SCOPE_RETICLE, _ctrlScopeGroup]; +_ctrlScopeReticle ctrlSetPosition [0, 0, 1, 4/3]; +_ctrlScopeReticle ctrlCommit 0; + + +// Setup the screen object +private _ctrlScreenObject = _display displayCtrl IDC_SCREEN_OBJECT; +private _scale = 1 / (getResolution # 5); // keep object the same size for any interface size +private _distance = 4/3; +if ((getResolution # 4) < (4/3)) then { _distance = _distance * (getResolution # 7); }; // eg 5x4 +private _base = ["3d", [0,0,_distance], _scale] call EFUNC(common,rscObjectHelper); +_ctrlScreenObject ctrlSetPosition _base; +_ctrlScreenObject ctrlSetModelScale _scale; +_ctrlScreenObject ctrlSetModelDirAndUp [[0,1,0],[0,0,1]]; +_ctrlScreenObject ctrlShow true; + +private _ctrlScreenGroup = _display displayCtrl IDC_SCREEN_GROUP; +// Info display +private _ctrl = _display ctrlCreate [QGVAR(text), IDC_SCREEN_TEXT_UPPER_LEFT, _ctrlScreenGroup]; +_ctrl ctrlSetPosition [0.3, 0.2, 0.25, 0.25]; +_ctrl ctrlCommit 0; +private _ctrl = _display ctrlCreate [QGVAR(text), IDC_SCREEN_TEXT_UPPER_RIGHT, _ctrlScreenGroup]; +_ctrl ctrlSetPosition [0.7, 0.2, 0.25, 0.25]; +_ctrl ctrlCommit 0; +// Menu +private _ctrlMenuText = _display ctrlCreate [QGVAR(textMenu), IDC_SCREEN_MENU_TEXT, _ctrlScreenGroup]; +_ctrlMenuText ctrlSetPosition [0.1, 0.45, 0.8, 0.7]; +_ctrlMenuText ctrlCommit 0; + + +// Add screen reticle +private _ctrl = _display ctrlCreate ["RscPicture", IDC_SCREEN_RETICLE, _ctrlScreenGroup]; + + +// Add dummy idcs for dist/angle from engine +// 151=Dist, 156=Heading, 182=Pitch, +private _ctrl = _display ctrlCreate ["RscText", 151]; // IDC_IGUI_WEAPON_DISTANCE +_ctrl ctrlSetPosition [-1, -1, 0, 0]; +_ctrl ctrlCommit 0; +private _ctrl = _display displayCtrl 168; // hide ca_zeroing (from cba) +_ctrl ctrlShow false; + + +GVAR(shown) = true; +GVAR(data) set ["menu_updated", true]; +addMissionEventHandler ["Draw3D", LINKFUNC(weaponInfo_draw), [_display]]; diff --git a/addons/xm157/functions/script_component.hpp b/addons/xm157/functions/script_component.hpp new file mode 100644 index 0000000000..3c08948f71 --- /dev/null +++ b/addons/xm157/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\xm157\script_component.hpp" diff --git a/addons/xm157/script_component.hpp b/addons/xm157/script_component.hpp new file mode 100644 index 0000000000..432fb05830 --- /dev/null +++ b/addons/xm157/script_component.hpp @@ -0,0 +1,24 @@ +#define COMPONENT xm157 +#define COMPONENT_BEAUTIFIED XM157 Fire Control Scope +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS +// #define ENABLE_QUICK_TESTING + +#include "\z\ace\addons\main\script_macros.hpp" + +#define RANGEFINDER_MAX 5000 + +#define IDC_SCOPE_OBJECT 7000 +#define IDC_SCOPE_GROUP 7001 +#define IDC_SCOPE_RETICLE 7201 + +#define IDC_SCREEN_OBJECT 8000 +#define IDC_SCREEN_GROUP 8001 +#define IDC_SCREEN_MENU_TEXT 8201 +#define IDC_SCREEN_TEXT_UPPER_LEFT 8202 +#define IDC_SCREEN_TEXT_UPPER_RIGHT 8203 +#define IDC_SCREEN_RETICLE 8204 + diff --git a/addons/xm157/sounds/click.wav b/addons/xm157/sounds/click.wav new file mode 100644 index 0000000000..efc08e62d1 Binary files /dev/null and b/addons/xm157/sounds/click.wav differ diff --git a/addons/xm157/stringtable.xml b/addons/xm157/stringtable.xml new file mode 100644 index 0000000000..761d11def9 --- /dev/null +++ b/addons/xm157/stringtable.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/addons/yardage450/stringtable.xml b/addons/yardage450/stringtable.xml index 8e73904da7..cf955f8a74 100644 --- a/addons/yardage450/stringtable.xml +++ b/addons/yardage450/stringtable.xml @@ -13,7 +13,7 @@ Yardage 450 Yardage 450 ヤードエイジ 450 - Yardage 450 + 야드에이지 450 Yardage 450 Yardage 450 Yardage 450 @@ -31,7 +31,7 @@ Télémètre laser レーザー測距機 레이저 거리측정기 - 雷射测距仪 + 激光测距仪 雷射測距儀 Lazer Menzil Bulucu @@ -47,8 +47,8 @@ Yardage 450 - Bottone Accensione Yardage 450 - Bouton d'alimentation ヤードエイジ 450 - 起動ボタン - Yardage 450 - 전원 버튼 - Yardage 450 - 电源按钮 + 야드에이지 450 - 전원 버튼 + Yardage 450—电源按钮 Yardage 450 - 電源按鈕 Yardage 450 - Güç Tuşu diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 1d86d5fee3..737f2acc09 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -324,6 +324,13 @@ class CfgVehicles { class ModuleArsenal_F: Module_F { function=QFUNC(bi_moduleArsenal); }; + class GVAR(moduleBurn): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(Medical); + displayName = CSTRING(ModuleBurn_DisplayName); + function = QFUNC(moduleBurn); + icon = QPATHTOF(ui\Icon_Module_Zeus_Burn_ca.paa); + }; class Man; class CAManBase: Man { diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index 2d218ddb8f..c92c98b211 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -13,6 +13,7 @@ PREP(moduleAddAceArsenal); PREP(moduleAddSpareTrack); PREP(moduleAddSpareWheel); PREP(moduleAddOrRemoveFRIES); +PREP(moduleBurn); PREP(moduleCaptive); PREP(moduleCargoParadrop); PREP(moduleConfigurePylons); diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 932d5e09c8..fba513760e 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -87,6 +87,11 @@ class CfgPatches { QGVAR(RemoveFullAceArsenal) }; }; + class GVAR(fire): ADDON { + units[] = { + QGVAR(moduleBurn) + }; + }; }; class ACE_Curator { @@ -98,6 +103,7 @@ class ACE_Curator { GVAR(fastroping) = "ace_fastroping"; GVAR(pylons) = "ace_pylons"; GVAR(arsenal) = "ace_arsenal"; + GVAR(fire) = "ace_fire"; }; #include "CfgFactionClasses.hpp" diff --git a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf index 05bf5fdfb3..8e507ebb35 100644 --- a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf +++ b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf @@ -30,14 +30,14 @@ private _removeAddons = []; private _addon = _x; if (isArray _addon) then { { - if !(isClass (configFile >> "CfgPatches" >> _x)) exitWith { + if !([_x] call EFUNC(common,isModLoaded)) exitWith { _removeAddons pushBack (configName _addon); }; } forEach (getArray _addon); }; if (isText _addon) then { - if !(isClass (configFile >> "CfgPatches" >> getText _addon)) then { + if !([getText _addon] call EFUNC(common,isModLoaded)) then { _removeAddons pushBack (configName _addon); }; }; diff --git a/addons/zeus/functions/fnc_moduleBurn.sqf b/addons/zeus/functions/fnc_moduleBurn.sqf new file mode 100644 index 0000000000..43e00d6abd --- /dev/null +++ b/addons/zeus/functions/fnc_moduleBurn.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Inflames a unit. + * + * Arguments: + * 0: The module logic + * + * Return Value: + * None + * + * Example: + * [LOGIC] call ace_zeus_fnc_moduleBurn + * + * Public: No + */ + +params ["_logic"]; + +if !(local _logic) exitWith {}; + +private _unit = attachedTo _logic; +deleteVehicle _logic; + +switch (false) do { + case !(isNull _unit): { + [LSTRING(NothingSelected)] call FUNC(showMessage); + }; + case (_unit isKindOf "CAManBase"): { + [LSTRING(OnlyInfantry)] call FUNC(showMessage); + }; + case (alive _unit): { + [LSTRING(OnlyAlive)] call FUNC(showMessage); + }; + case (["ace_fire"] call EFUNC(common,isModLoaded)): { + [LSTRING(RequiresAddon)] call FUNC(showMessage); + }; + default { + [QEGVAR(fire,burn), [_unit, 5]] call CBA_fnc_globalEvent; + }; +}; + diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf index 9bcec2cdcb..6ee1e8fa60 100644 --- a/addons/zeus/functions/fnc_moduleUnconscious.sqf +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -38,6 +38,11 @@ if (isNil QEFUNC(medical,setUnconscious)) then { [LSTRING(OnlyAlive)] call FUNC(showMessage); } else { private _unconscious = GETVAR(_unit,ACE_isUnconscious,false); + if (_unconscious) then { + _unit setVariable [QEGVAR(medical_statemachine,AIUnconsciousness), nil, true]; + } else { + _unit setVariable [QEGVAR(medical_statemachine,AIUnconsciousness), true, true]; + }; // Function handles locality for me [_unit, !_unconscious, 10e10] call EFUNC(medical,setUnconscious); }; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 9d8d966239..1e84c3fc6c 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -29,7 +29,7 @@ Настройки Зевса Impostazioni Zeus Zeus 設定 - Zeus 설정 + 제우스 설정 宙斯设定 宙斯設定 Zeus Ayarları @@ -46,7 +46,7 @@ Позволяет контролировать различные аспекты Зевса. Fornisce controllo su vari aspetti di Zeus. Zeus の操作性を様々な側面から強化します。 - Zeus에게 다양한 방면의 조작을 제공해줍니다 + 제우스에게 다양한 방면의 조작을 제공해줍니다 提供宙斯各个方面的控制权 提供宙斯各個方面的控制權 @@ -63,7 +63,7 @@ Messaggi di Ascesa 転生表示 재림 메세지 - 宙斯上任讯息 + 宙斯上任信息 宙斯上任訊息 @@ -78,8 +78,8 @@ Отображает глобальное всплывающее сообщение, когда один из игроков становится Зевсом. Mostra messaggi popup globali quando un giocatore viene assegnato come Zeus. プレイヤーが Zeus になる際、全体へポップアップ表示を行います。 - 플레이어가 Zeus 될 시 서버에 이를 알리는 팝업이 등장합니다. - 当一位玩家被指定为宙斯时显示全域讯息 + 플레이어가 제우스가 되면 서버에 알림 팝업이 등장합니다. + 当一位玩家被指定为宙斯时显示全局信息 當一位玩家被指定為宙斯時顯示全域訊息 @@ -94,7 +94,7 @@ Орел Зевса Aquila Zeus Zeus イーグル - Zeus 독수리 + 제우스 독수리 宙斯鹰眼模式 宙斯鷹眼模式 Zeus Kartalı @@ -111,7 +111,7 @@ Спавнит орла, который следует за камерой Зевса. Crea un'aquila che segue la camera Zeus. Zeus カメラを追うイーグルを出現します。 - Zeus의 카메라를 따라다니는 독수리를 생성합니다. + 제우스의 카메라를 따라다니는 독수리를 생성합니다. 生成一个老鹰跟着宙斯的摄影机 生成一個老鷹跟著宙斯的攝影機 @@ -144,7 +144,7 @@ Проигрывает звук ветра каждый раз, когда Зевс вселяется в юнита. Esegui rumori di vento quando Zeus controlla un'unità in remoto. ユニットが Zeus 遠隔操作になった際、風の音がします。 - Zeus가 유닛을 조작할 때 바람소리가 납니다. + 제우스가 유닛을 조작할 때 바람소리가 납니다. 当宙斯开始控制单位时利用风的声音提示 當宙斯開始控制單位時利用風的聲音提示 @@ -176,7 +176,7 @@ Проигрывает звук радио каждый раз, когда Зевс использует артиллерию. Riproduci un messaggio radio quando Zeus usa esplosivi. Zeus が砲撃を使う際に、無線で警告を流します。 - Zeus가 폭격시 경고 무전을 재생합니다. + 제우스가 폭격 시 경고 무전을 재생합니다. 当宙斯开始攻击时使用无线电警告 當宙斯開始攻擊時使用無線電警告 @@ -225,7 +225,7 @@ Rivela ad Alleati 友軍へ表示 모든 아군에게 표시 - 透露给盟军 + 透露给友军 透露給盟軍 @@ -241,7 +241,7 @@ Alleati + Marcatori Mappa 友軍と地図マーカー 아군 + 지도 마커 - 显示盟军+地图标记 + 显示友军+地图标记 顯示盟軍+地圖標記 @@ -285,7 +285,7 @@ 수정 가능한 물체 갱신 Màj les objets modifiables Aggiorna Oggetti Modificabili - 更新可编辑的物件 + 更新可编辑的物体 更新可編輯的物件 Обновить редактируемые объекты Atualizar objetos editáveis @@ -295,6 +295,7 @@ Editing Mode 編輯模式 + 编辑模式 Modalità per editare Bearbeitungsmodus 編集モード @@ -304,10 +305,12 @@ Režim úprav Mode d'édition Modo de edición + 편집 모드 Add or remove editable objects from Zeus 新增或移除可編輯物件給宙斯 + 添加或删除宙斯的可编辑物体 Aktiviere oder deaktiviere zu bearbeitende Objekte von Zeus Agguingi o rimuovi oggetti che Zeus può modificare Zeus から編集可能オブジェクトの追加と削除をする @@ -317,11 +320,13 @@ Přidej nebo odeber upravitelné objekty ze Zeusu Ajoute ou supprime les objets modifiables depuis Zeus. Añadir o eliminar objetos editables desde Zeus + 제우스가 편집 가능한 물체를 추가하거나 제거합니다 Add Objects Füge Objekte hinzu 新增物件 + 新增物体 Aggiungi Oggetti オブジェクト追加 Dodaj obiekty @@ -331,6 +336,7 @@ Ajouter des objets Obje Ekle Añadir objetos + 물체 추가 Remove Objects @@ -340,7 +346,7 @@ Usuń obiekty Enlever des objets Rimuovi Oggetti - 移除物件 + 移除物体 移除物件 Удалить объекты Remover Objetos @@ -356,7 +362,7 @@ Wszyscy kuratorzy Tous les curateurs Tutti i Moderatori - 所有编辑者 + 所有宙斯 所有編輯者 Все кураторы Todos os Curadores @@ -371,7 +377,7 @@ Zatwierdź zmiany dla wszystkich kuratorów Applique les changements à tous les curateurs. Applica i cambiamenti a tutti i moderatori - 确认变更给所有编辑者 + 确认变更给所有宙斯 確認變更給所有編輯者 Применить изменения ко всем кураторам Aplicar mudanças à todos os Curadores @@ -388,8 +394,10 @@ Objetos adicionais Další objekty 額外物件 + 额外物体 Objets supplémentaires Objetos adicionales + 추가 목표 Additional objects to include in the action regardless of Task Radius @@ -401,8 +409,10 @@ Objetos adicionais para incluir na ação, ignorando a distância da tarefa Další objekty, které mají být zahrnuty do akce, bez ohledu na poloměr úlohy 無論任務範圍何處,都在行動中包含著額外的物件 + 确认变更给所有宙斯 Objets supplémentaires à intégrer dans l'action, quel que soit le rayon de la tâche. Objetos adicionales para incluir en la acción al margen del Radio de Tarea + 목표 반경 상관없이 추가 목표를 추가합니다. Global AI Skill @@ -414,7 +424,7 @@ Globale KI-Fähigkeit 서버 인공지능 실력 Abilità AI Globale - AI技巧设定 + AI 技巧设定 AI技巧設定 Habilidade Global da IA Genel AI Yetenekleri @@ -446,7 +456,7 @@ Ändert: general, commanding, courage 변화: 전반적, 지휘, 사기 Cambia: generale, comando, - 改变: 战斗技巧,指挥技巧,勇气大小 + 改变:战斗技巧,指挥技巧,勇气大小 改變: 戰鬥技巧,指揮技巧,勇氣大小 Muda: general, commanding, courage Cambios: general, commanding, courage @@ -476,7 +486,7 @@ Ändert: aimingAccuracy 변화: 조준 명중률 Cambia: aimingAccuracy - 改变: 瞄准精确度 + 改变:瞄准精确度 改變: 瞄準精確度 Muda: aimingAccuracy Cambios: aimingAccuracy @@ -506,7 +516,7 @@ Ändert: aimingShake, aimingSpeed, reloadSpeed 변화: 조준시 흔들림, 조준 속도, 재장전 속도 Cambia: aimingShake, aimingSpeed, reloadSpeed - 改变: 手晃幅度,瞄准速度, 重新装填速度 + 改变:手晃幅度,瞄准速度, 重新装填速度 改變: 手晃幅度,瞄準速度, 重新裝填速度 Muda: aimingShake, aimingSpeed, reloadSpeed Cambios: aimingShake, aimingSpeed, reloadSpeed @@ -536,7 +546,7 @@ Ändert: spotDistance, spotTime 변화: 탐지 거리, 탐지까지의 시간 Cambia: spotDistance, spotTime - 改变: 搜索距离, 发现时间 + 改变:搜索距离,发现时间 改變: 搜索距離, 發現時間 Muda: spotDistance, spotTime Cambios: spotDistance, spotTime @@ -566,7 +576,7 @@ Soll KI nach Deckung suchen 인공지능이 엄폐물을 찾아갑니다 Le AI dovrebbero cercare una copertura - 决定AI是否会寻找掩护 + 决定 AI 是否会寻找掩护 決定AI是否會尋找掩護 A IA dever buscar cobertura La IA debe buscar cobertura @@ -596,7 +606,7 @@ Soll KI automatisch in Kampfmodus umschalten 인공지능이 자동적으로 교전 상태에 돌입합니다 Le AI dovrebbero passare in modalità di combattimento automaticamente - 决定AI是否会自动与敌人交战 + 决定 AI 是否会自动与敌人交战 決定AI是否會自動與敵人交戰 A IA deveria automaticamente mudar para modo de combate La IA debe automáticamente cambiar a modo de combate @@ -767,7 +777,7 @@ グループ内の全ユニットを移動させます Teleportuje wszystkie jednostki w grupie Teleportiert alle Einheiten der Gruppe - 그룹내에 모든 인원을 순간이동 시킵니다 + 그룹 내에 모든 인원을 순간이동 시킵니다 Teletrasporta tutte le unità del gruppo 传送全部小队成员 傳送全部小隊成員 @@ -927,8 +937,8 @@ Si può fare solo su persone vive Unidade deve estar viva ユニットを生存させます - 대상이 반드시 살아있어야 합니다 - 单位必须是活着 + 대상이 반드시 살아 있어야 합니다 + 单位必须是活的 單位必須是活著 Birliğin yaşaması gerekiyor @@ -959,7 +969,7 @@ Si può usare solo su strutture L'unité doit être une structure. ユニットを構造物とします - 대상이 반드시 건축물이어야만 합니다 + 대상이 반드시 건축물이어야 합니다 单位必须是建筑 單位必須是建築 @@ -974,7 +984,7 @@ Si può usare solo su veicoli L'unité doit être un véhicule. ユニットを車両とします - 대상이 반드시 차량이어야만 합니다 + 대상이 반드시 차량이어야 합니다 单位必须是载具 單位必須是載具 @@ -1004,7 +1014,7 @@ La unidad debe tener espacio de carga disponible L'unité doit avoir de l'espace de chargement disponible. ユニットへカーゴ スペースを与えます - 대상의 화물공간이 남아있어야합니다 + 대상의 화물공간이 남아 있어야 합니다 单位必须有剩余的载货空间 單位必須有剩餘的載貨空間 @@ -1032,7 +1042,7 @@ ユニットを適切な陣営にします Jednostka musi należeć do odpowiedniej strony Einheit muss einer passenden Seite angehören - 대상이 적절한 진영에 속해야만합니다 + 대상이 적절한 진영에 속해야 합니다 L'unità deve appartenere ad una fazione coerente 单位必须属于一个合适的一边 單位必須屬於一個合適的一邊 @@ -1047,7 +1057,7 @@ 近くに建物がありません。 Najbliższy budynek jest zbyt daleko Nächstgelegenes Gebäude ist zu weit entfernt - 가장가까운 건물이 너무 멈 + 가장 가까운 건물이 너무 멉니다 L'edificio più vicino è troppo lontano 最近的房子离太远了 最近的房子離太遠了 @@ -1097,9 +1107,11 @@ Nenhum Ninguno + Nikdo Aucun Hiçbiri + 없음 Players @@ -1111,9 +1123,11 @@ Jogadores Jugadores 玩家 + 玩家 Hráči Joueurs Oyuncular + 플레이어 Players and AI @@ -1125,9 +1139,11 @@ Jogadores e IA Jugadores e IA 玩家與AI + 玩家与 AI Hráči a AI Joueurs et IA Oyuncular ve AI + 플레이어와 인공지능 Add Objects to Curator @@ -1141,7 +1157,7 @@ Fügt Objekte zum Kurator hinzu キュレーターにオブジェクトを追加 큐레이터에 물체 추가 - 增加物件给任务策划人 + 增加物体给任务宙斯 增加物件給任務策劃人 @@ -1156,7 +1172,7 @@ Fügt jedes gespawnte Objekt allen Kuratoren der Mission hinzu ミッション内で作成されたオブジェクトに全キュレーターを追加 미션 내 큐레이터에 모든 생성 물체 추가 - 在任务中生成物件给所有的任务策划人 + 在任务中生成物体给所有的任务宙斯 在任務中生成物件給所有的任務策劃人 @@ -1169,7 +1185,7 @@ Ladung: 화물: Cargo: - 货物: + 货物: 貨物: Carga: Kargo: @@ -1179,6 +1195,7 @@ Select cargo to unload Ladung zum ausladen auswählen 選擇要卸載的貨物 + 选择要卸载的货物 Scegli il carico da scaricare 選択したカーゴを降ろす Wybierz ładunek do wyładowania @@ -1188,6 +1205,7 @@ Sélectionner une cargaison à décharger Seçilen kargo boşaltıldı Seleccionar carga para descargar: + 내릴 화물을 선택하세요 Task Radius @@ -1255,7 +1273,7 @@ Ajouter un arsenal complet Aggiungi Arsenale Completo オブジェクトに完全なアーセナルを追加 - 增加完整的虚拟军火库到物件上 + 增加完整的虚拟军火库到物体上 增加完整的虛擬軍火庫到物件上 Dodaj Wirtualny Arsenał 아스날 놓기 @@ -1271,7 +1289,7 @@ Retirer un arsenal Rimuovi Arsenale オブジェクトからアーセナルを削除 - 移除物件上的虚拟军火库 + 移除物体上的虚拟军火库 移除物件上的虛擬軍火庫 Usuń Wirtualny Arsenał 아스날 제거 @@ -1303,7 +1321,7 @@ Attiva NVGs 暗視装置の切り替え 切換夜視鏡 - 切换夜视镜 + 切换夜视仪 야시경 토글 Przełącz NVG Вкл/Выкл ПНВ @@ -1318,7 +1336,7 @@ Attrezzatura NVG 暗視装置 夜視鏡裝備 - 夜视镜装备 + 夜视仪装备 야시경 장비 Ekwipunek NVG Приборы ночного видения @@ -1334,7 +1352,7 @@ Aggiunge o rimuove NVGs alle unità ユニットから暗視装置の追加と削除 增加或移除單位的夜視鏡 - 增加或移除单位的夜视镜 + 增加或移除单位的夜视仪 야시경 추가/제거 Dodaj lub usuń noktowizję z jednostek Добавить/Убрать ПНВ у юнитов @@ -1356,12 +1374,13 @@ Objetivo de palanca Přepnout cíl Unités cible + 타겟 토글 Units affected by the toggle Betroffene Spieler beim umschalten ユニットは切り替えに影響を受けます - 被选单位受切换影响 + 被菜单位受切换影响 受切換所影響的單位 Unità influenzate dallo scambio Jednostki pod wpływem przełączenia @@ -1370,6 +1389,7 @@ Jednotky ovlivněné přepnutím Unités affectées par le changement. Unidades afectadas por esta alternancia + 유닛은 토글에 영향받습니다 Selected Group @@ -1676,7 +1696,7 @@ Suicide Bomber 自殺式炸彈襲擊者 - 自杀式炸弹袭击者 + 自杀炸弹手 Samovražedný bombardér Kamikaze Selbstmordattentäter @@ -1700,7 +1720,7 @@ Aktiválási oldal Lato di attivazione 対象陣営 - 활성화면 + 활성화 진영 Strona aktywacji Explodir em: Сторона активации @@ -1727,7 +1747,7 @@ Explosion Size 爆炸尺寸 - 爆炸尺寸 + 爆炸大小 Velikost výbuchu Taille de l'explosion Explosionsgröße @@ -1744,7 +1764,7 @@ Auto Seek 自動尋求 - 自动寻求 + 自动寻的 Auto Seek Recherche automatique Automatische Suche @@ -1768,7 +1788,7 @@ Az egység aktívan megpróbálja megtalálni és elmozdulni az aktivációs oldal közeli egységei felé.Az automatikus keresési tartomány az egység helyszíni szakértelmén alapul, legalább 100 méterrel. L'unità cercherà attivamente di trovare e spostarsi verso le unità vicine del lato di attivazione. La gamma di Auto Seek si basa sull'abilità a distanza spot dell'unità con un minimo di 100 metri. 対象陣営ユニットを見つけて移動しようと積極的に試みます。自動誘導の範囲は、ユニットの索敵能力に基づいており、最低100メートルです。 - 유닛은 액티브 측의 근접 유닛을 향해 적극적으로 찾아서 이동하려고 시도합니다. 자동 시크의 범위는 유닛의 스팟 거리 스킬을 기준으로 최소 100 미터입니다. + 유닛은 활성화 측의 근접 유닛을 향해 적극적으로 찾아서 이동하려고 시도합니다. 자동 탐색의 범위는 유닛의 색적 거리 스킬을 기준으로 최소 100미터입니다. Jednostka będzie aktywnie próbowała znaleźć i ruszyć w kierunku pobliskich jednostek strony aktywacji. Zasięg Auto Seek opiera się na umiejętności punktowej odległości jednostki z minimum 100 metrów. A unidade tentará ativamente encontrar e se mover para as unidades próximas do lado da ativação. O alcance da Auto Seek é baseado na habilidade de distância do ponto da unidade com um mínimo de 100 metros. Устройство будет активно пытаться найти и перейти к соседним единицам активации. Диапазон автоматического поиска основан на умении снимать расстояние на расстоянии не менее 100 метров. @@ -1784,7 +1804,7 @@ Az egység már öngyilkos bombázó L'unità è già un kamikaze 既に自爆ユニットです - 유닛은 이미 자살 폭탄 테러범이다. + 유닛은 이미 자살 폭탄 테러범입니다. Jednostka jest już zamachowcem-samobójcą A unidade já é um suicida Единица уже является террористом-смертником @@ -1795,7 +1815,7 @@ Add full ACE Arsenal Vollständiges ACE Arsenal hinzufügen ACE 武器庫を追加 - 添加ACE模式军火库 + 添加 ACE 军火库 增加完整的ACE軍火庫 Aggiungi l'arsenale ACE completo Dodaj pełny arsenał ACE @@ -1805,12 +1825,13 @@ Přidat plný ACE Arzenál Ajouter arsenal ACE complet ACE Arsenal ekle + 전체 ACE 아스널 추가 Remove ACE Arsenal ACE Arsenal entfernen ACE 武器庫を削除 - 删除ACE模式军火库 + 删除 ACE 军火库 移除ACE軍火庫 Rimuovi l'arsenale ACE Usuń arsenał ACE @@ -1820,6 +1841,7 @@ Odebrat plný ACE Arzenál Retirer un arsenal ACE ACE Arsenali sil + 전체 ACE 아스널 제거 Create Zeus @@ -1831,9 +1853,11 @@ Criar Zeus Crear Zeus 新增宙斯 + 创建宙斯 Vytvořit Zeuse Créer Zeus Zeus oluştur + 제우스 생성 Delete Zeus @@ -1845,9 +1869,11 @@ Apagar Zeus Eliminar Zeus 刪除宙斯 + 删除宙斯 Smazat Zeuse Supprimer Zeus Zeus sil + 제우스 제거 "%1" menu @@ -1858,10 +1884,12 @@ menu "%1" Menu "%1" 選單 %1 + 菜单"%1" "%1" menu Menu "%1" "%1" menü "%1" menu + "%1" 메뉴 Paradrop Cargo @@ -1871,11 +1899,13 @@ Десантировать груз Soltar carga de paraquedas 空投貨物 + 空投货物 Paradrop Cargo Výsadek nákladu Paralargage de cargaison Paraşüt Kargosu Carga mediante paracaidas + 화물 공수 No cargo loaded @@ -1886,10 +1916,20 @@ Nenhuma carga carregada No hay carga cargada 沒有貨物裝載 + 没有装载货物 Nessun carico caricato Žádný náklad není naložen Aucune cargaison chargée Kargo yüklenmedi + 화물이 실려있지 않습니다 + + + Burn Unit + Einheit anzünden + 焚烧单位 + 유닛 불로 태우기 + Podpal Jednostkę + ユニットを燃やす diff --git a/addons/zeus/ui/Icon_Module_Zeus_Burn_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_Burn_ca.paa new file mode 100644 index 0000000000..b76c33f1b5 Binary files /dev/null and b/addons/zeus/ui/Icon_Module_Zeus_Burn_ca.paa differ diff --git a/docs/404.html b/docs/404.md similarity index 100% rename from docs/404.html rename to docs/404.md diff --git a/docs/CNAME b/docs/CNAME index 21637da470..bb4ad3ca6d 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -ace3mod.com \ No newline at end of file +ace3.acemod.org \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index ee47a3cdd9..599940594c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# Source of https://ace3mod.com/ +# Source of https://ace3.acemod.org/ ## Updating compiled JavaScript and CSS files diff --git a/docs/README.zh-TW.md b/docs/README.zh-TW.md index 933c2b50cb..4216d82dd7 100644 --- a/docs/README.zh-TW.md +++ b/docs/README.zh-TW.md @@ -18,8 +18,8 @@ ACE3 條款 - - 加入ACE3 Slack + + 加入ACE3 Discord ACE3 建構狀態 @@ -77,8 +77,8 @@ ## 新手起步 ACE3需要最新版本的武裝行動3以及最新版本的 CBA A3模組。以下的網頁可用於幫助以及提供安裝ACE3上的資訊。 -- [安裝指南-英文](https://ace3mod.com/wiki/user/installation-guide.html) -- [資訊中心-英文](https://ace3mod.com/wiki/user/information-center.html) +- [安裝指南-英文](https://ace3.acemod.org/wiki/user/installation-guide.html) +- [資訊中心-英文](https://ace3.acemod.org/wiki/user/information-center.html) ## 維護 @@ -91,21 +91,21 @@ ACE3需要最新版本的武裝行動3以及最新版本的 Slack -
+ + diff --git a/docs/README_DE.md b/docs/README_DE.md index 701939741a..fd7eaeef3f 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -3,7 +3,7 @@

- + ACE3 Version @@ -15,8 +15,8 @@ ACE3 Lizenz - - ACE3 Slack + + ACE3 Discord ACE3 Build Status @@ -70,14 +70,14 @@ Die Mod ist **modular aufgebaut**. Beinahe jede PBO kann entfernt werden, sodass #### Anleitungen Du hast ACE3 installiert, hast aber keine Ahnung was und wie alles funktioniert und wo sich was befindet? -- [Erste Schritte](https://ace3mod.com/wiki/user/getting-started.html). +- [Erste Schritte](https://ace3.acemod.org/wiki/user/getting-started.html). #### Mitwirken Wenn du bei der Entwicklung von ACE3 mithelfen möchtest, kannst du dies tun, indem du nach Fehlern Ausschau hältst oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" dieses Repository und erstelle deine "Pull-Requests", welche von anderen Entwicklern und Beiträgern überprüft werden. Bitte trage dich dabei in [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) mit deinem Nutzernamen und einer gültigen Email-Adresse ein. Um uns einen Fehler, Anregungen oder neue Funktionalitäten mitzuteilen: Nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). Besuche auch: -- [Wie kann ich ein Problem melden](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [Wie kann ich ein Wunsch zu einer neuen Funktion mitteilen?](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Wie kann ich ein Problem melden](https://ace3.acemod.org/wiki/user/how-to-report-an-issue.html) +- [Wie kann ich ein Wunsch zu einer neuen Funktion mitteilen?](https://ace3.acemod.org/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 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/docs/README_PL.md b/docs/README_PL.md index b99b96ca95..893261dc54 100644 --- a/docs/README_PL.md +++ b/docs/README_PL.md @@ -2,7 +2,7 @@

- + ACE3 Wersja @@ -14,8 +14,8 @@ ACE3 Licencja - - ACE3 Slack + + ACE3 Discord ACE3 Build Status @@ -65,15 +65,15 @@ Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczo ### 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](https://ace3mod.com/wiki/user/getting-started.html) +- [Wprowadzenie](https://ace3.acemod.org/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](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [Jak zgłosić feature request-a](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Jak zgłosić bug-a](https://ace3.acemod.org/wiki/user/how-to-report-an-issue.html) +- [Jak zgłosić feature request-a](https://ace3.acemod.org/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](https://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](https://ace3.acemod.org/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. diff --git a/docs/_config.yml b/docs/_config.yml index c8b22232dc..f6a6bda551 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,16 +1,16 @@ -name: ACE3 +title: ACE3 description: ACE3 is a joint effort by the teams behind ACE 2, AGM and CSE to improve the realism and authenticity of Arma 3. keywords: Advanced Combat Enhancement 3, ACE, ACE3, Arma, Arma 3, Mod, Modification, Realism, AGM, CSE, Bohemia, Interactive -productionUrl: https://ace3mod.com +productionUrl: https://ace3.acemod.org ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 14 + minor: 15 patch: 0 - build: 63 + build: 67 markdown: kramdown diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml index b5cf2bebed..b8908a4684 100644 --- a/docs/_config_dev.yml +++ b/docs/_config_dev.yml @@ -1,4 +1,4 @@ -name: ACE3 +title: ACE3 description: ACE3 is a joint effort by the teams behind ACE 2, AGM and CSE to improve the realism and authenticity of Arma 3. keywords: Advanced Combat Enhancement 3, ACE, ACE3, Arma, Arma 3, Mod, Modification, Realism, AGM, CSE, Bohemia, Interactive diff --git a/docs/_includes/_footer.html b/docs/_includes/_footer.html index f0e19019ac..2797f35cd9 100644 --- a/docs/_includes/_footer.html +++ b/docs/_includes/_footer.html @@ -3,47 +3,31 @@

ACE3

ACE3 is a joint effort by the teams behind ACE2, AGM and CSE to improve the realism and authenticity of Arma 3.

-

If you want to contribute something to ACE3, simply fork the GitHub repository and submit your pull requests for review.

+

If you want to contribute something to ACE3, simply fork the GitHub repository and submit your pull requests for review.

Issues / Feedback

-

Issues, feature requests and feedback are welcome at the ACE3 GitHub issue tracker.

+

Issues, feature requests and feedback are welcome at the ACE3 GitHub issue tracker.

Before reporting an issue, please read the wiki entry "How to report an issue".

-

We have created a single issue for feature requests.

+

We have created a single issue for feature requests.

Social Media

-
- - diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 8ef2a59a94..ad31f2bb31 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -1,620 +1,706 @@ {% if include.component == "advanced_ballistics" %} -`ace_ballistics`, `ace_weather` +- `ace_ballistics` +- `ace_weather` {% endif %} {% if include.component == "advanced_fatigue" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "advanced_throwing" %} -`ace_common`, `ace_weaponselect` +- `ace_common` +- `ace_weaponselect` {% endif %} {% if include.component == "ai" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "aircraft" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "apl" %} -`ace_main` +- `ace_main` {% endif %} {% if include.component == "arsenal" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "artillerytables" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "atragmx" %} -`ACE_Advanced_Ballistics`, `ACE_common`, `ACE_weather` +- `ACE_Advanced_Ballistics` +- `ACE_common` +- `ACE_weather` {% endif %} {% if include.component == "attach" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "backpacks" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "ballistics" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "captives" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "cargo" %} -`ace_interaction` +- `ace_interaction` +{% endif %} + +{% if include.component == "casings" %} +- `ace_common` {% endif %} {% if include.component == "chemlights" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "common" %} -`ace_main`, `ace_modules` +- `ace_main` +- `ace_modules` {% endif %} {% if include.component == "concertina_wire" %} -`ace_apl`, `ace_interaction` +- `ace_apl` +- `ace_interaction` {% endif %} {% if include.component == "cookoff" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "csw" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "dagr" %} -`ace_weather` +- `ace_weather` {% endif %} {% if include.component == "disarming" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "disposable" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "dogtags" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "dragging" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "dragon" %} -`ace_hot`, `ace_csw` +- `ace_hot` +- `ace_csw` {% endif %} {% if include.component == "explosives" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "fastroping" %} -`ace_interaction`, `ace_logistics_rope` +- `ace_interaction` +- `ace_logistics_rope` {% endif %} {% if include.component == "fcs" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "field_rations" %} -`ace_interact_menu` +- `ace_interact_menu` {% endif %} {% if include.component == "finger" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "fire" %} -`ace_common`, `ace_medical_engine` +- `ace_common` +- `ace_medical_engine` {% endif %} {% if include.component == "flashlights" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "flashsuppressors" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "fonts" %} -`ace_main` +- `ace_main` {% endif %} {% if include.component == "fortify" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "frag" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "gestures" %} -`ace_interact_menu` +- `ace_interact_menu` {% endif %} {% if include.component == "gforces" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "goggles" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "grenades" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "gunbag" %} -`ace_interaction`, `ace_movement` +- `ace_interaction` +- `ace_movement` {% endif %} {% if include.component == "headless" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "hearing" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "hellfire" %} -`ace_interaction`, `ace_missileguidance` +- `ace_interaction` +- `ace_missileguidance` {% endif %} {% if include.component == "hitreactions" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "hot" %} -`ace_common`, `ace_missileguidance` +- `ace_common` +- `ace_missileguidance` +{% endif %} + +{% if include.component == "hunterkiller" %} +- `ace_common` {% endif %} {% if include.component == "huntir" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "intelitems" %} -`ace_interact_menu`, `ace_zeus` +- `ace_interact_menu` +- `ace_zeus` {% endif %} {% if include.component == "interact_menu" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "interaction" %} -`ace_interact_menu` +- `ace_interact_menu` {% endif %} {% if include.component == "inventory" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "javelin" %} -`ace_main`, `ace_common`, `ace_missileguidance` +- `ace_main` +- `ace_common` +- `ace_missileguidance` {% endif %} {% if include.component == "kestrel4500" %} -`ACE_common`, `ACE_weather` +- `ACE_common` +- `ACE_weather` {% endif %} {% if include.component == "killtracker" %} -`ace_medical` +- `ace_common` {% endif %} {% if include.component == "laser" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "laserpointer" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "logistics_rope" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "logistics_uavbattery" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "logistics_wirecutter" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "magazinerepack" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "map" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "map_gestures" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "maptools" %} -`ace_interaction` +- `ace_interaction` +{% endif %} + +{% if include.component == "marker_flags" %} +- `ace_common` +- `ace_interaction` +- `ace_interact_menu` {% endif %} {% if include.component == "markers" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "maverick" %} -`ace_missileguidance` +- `ace_missileguidance` {% endif %} {% if include.component == "medical" %} -`ace_medical_engine` +- `ace_medical_engine` {% endif %} {% if include.component == "medical_ai" %} -`ace_medical_treatment` +- `ace_medical_treatment` {% endif %} {% if include.component == "medical_blood" %} -`ace_medical_status` +- `ace_medical_status` {% endif %} {% if include.component == "medical_damage" %} -`ace_medical_engine` +- `ace_medical_engine` {% endif %} {% if include.component == "medical_engine" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "medical_feedback" %} -`ace_medical_status` +- `ace_medical_status` {% endif %} {% if include.component == "medical_gui" %} -`ace_medical_treatment`, `ace_interaction` +- `ace_medical_treatment` +- `ace_interaction` {% endif %} {% if include.component == "medical_statemachine" %} -`ace_medical_vitals` +- `ace_medical_vitals` {% endif %} {% if include.component == "medical_status" %} -`ace_medical_engine` +- `ace_medical_engine` {% endif %} {% if include.component == "medical_treatment" %} -`ace_medical_status`, `ace_medical_damage`, `ace_apl` +- `ace_medical_status` +- `ace_medical_damage` +- `ace_apl` {% endif %} {% if include.component == "medical_vitals" %} -`ace_medical_status` +- `ace_medical_status` {% endif %} {% if include.component == "metis" %} -`ace_missileguidance` +- `ace_missileguidance` {% endif %} {% if include.component == "microdagr" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "minedetector" %} -`ace_explosives` +- `ace_explosives` {% endif %} {% if include.component == "missileguidance" %} -`ace_laser` +- `ace_laser` {% endif %} {% if include.component == "missionmodules" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "mk6mortar" %} -`ace_csw`, `ace_artillerytables` +- `ace_csw` +- `ace_artillerytables` {% endif %} {% if include.component == "modules" %} -`ace_main` +- `ace_main` {% endif %} {% if include.component == "movement" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "mx2a" %} -`ace_apl` +- `ace_apl` {% endif %} {% if include.component == "nametags" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "nightvision" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "nlaw" %} -`ace_missileguidance` +- `ace_missileguidance` {% endif %} {% if include.component == "noidle" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "noradio" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "norearm" %} -`ace_common` +- `ace_common` +{% endif %} + +{% if include.component == "novehicleclanlogo" %} +- `ace_common` {% endif %} {% if include.component == "optics" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "optionsmenu" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "overheating" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "overpressure" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "parachute" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "pylons" %} -`ace_interact_menu` +- `ace_interact_menu` {% endif %} {% if include.component == "quickmount" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "rangecard" %} -`ACE_Advanced_Ballistics`, `ace_scopes` +- `ACE_Advanced_Ballistics` +- `ace_scopes` {% endif %} {% if include.component == "realisticnames" %} -`ace_common`, `ace_optics` +- `ace_common` +- `ace_optics` {% endif %} {% if include.component == "realisticweights" %} -`ace_common`, `ace_disposable` +- `ace_common` +- `ace_disposable` {% endif %} {% if include.component == "rearm" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "recoil" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "refuel" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "reload" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "reloadlaunchers" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "repair" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "respawn" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "safemode" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "sandbag" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "scopes" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "sitting" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "slideshow" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "smallarms" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "spectator" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "spottingscope" %} -`ace_apl`, `ace_interaction` +- `ace_apl` +- `ace_interaction` {% endif %} {% if include.component == "switchunits" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "tacticalladder" %} -`ace_apl`, `ace_interaction` +- `ace_apl` +- `ace_interaction` {% endif %} {% if include.component == "tagging" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "thermals" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "towing" %} -`ace_common`, `ace_logistics_rope` +- `ace_common` +- `ace_logistics_rope` {% endif %} {% if include.component == "trenches" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "tripod" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "ui" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "vector" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "vehicle_damage" %} -`ace_common`, `ace_cookoff` +- `ace_common` +- `ace_cookoff` {% endif %} {% if include.component == "vehiclelock" %} -`ace_interaction` +- `ace_interaction` {% endif %} {% if include.component == "vehicles" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "viewdistance" %} -`ace_common` +- `ace_common` +{% endif %} + +{% if include.component == "viewports" %} +- `ace_common` {% endif %} {% if include.component == "viewrestriction" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "volume" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "weaponselect" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "weather" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "winddeflection" %} -`ace_common` +- `ace_common` +{% endif %} + +{% if include.component == "xm157" %} +- `ace_advanced_ballistics` +- `ace_scopes` {% endif %} {% if include.component == "yardage450" %} -`ace_apl`, `ace_laser` +- `ace_apl` +- `ace_laser` {% endif %} {% if include.component == "zeus" %} -`ace_common`, `ace_ai` +- `ace_common` +- `ace_ai` {% endif %} {% if include.component == "compat_gm" %} -`ace_csw`, `ace_explosives`, `ace_rearm`, `ace_refuel`, `ace_repair`, `gm_core` +- `ace_csw` +- `ace_explosives` +- `ace_rearm` +- `ace_refuel` +- `ace_repair` +- `gm_core` {% endif %} {% if include.component == "compat_r3f" %} -`r3f_armes_c`, `r3f_acc`, `R3F_G17_addons`, `R3F_G_SCAR`, `R3F_SCAR_H`, `R3F_SCAR_L`, `R3F_FN_MAG` +- `r3f_armes_c` +- `r3f_acc` +- `R3F_G17_addons` +- `R3F_G_SCAR` +- `R3F_SCAR_H` +- `R3F_SCAR_L` +- `R3F_FN_MAG` {% endif %} {% if include.component == "compat_rh_acc" %} -`RH_acc` +- `RH_acc` {% endif %} {% if include.component == "compat_rh_de" %} -`RH_de_cfg` +- `RH_de_cfg` {% endif %} {% if include.component == "compat_rh_m4" %} -`RH_m4_cfg` +- `RH_m4_cfg` {% endif %} {% if include.component == "compat_rh_pdw" %} -`RH_PDW` +- `RH_PDW` {% endif %} {% if include.component == "compat_rhs_afrf3" %} -`ace_explosives`, `ace_csw`, `ace_rearm`, `ace_refuel`, `ace_repair`, `rhs_main_loadorder` +- `ace_explosives` +- `ace_csw` +- `ace_rearm` +- `ace_refuel` +- `ace_repair` +- `rhs_main_loadorder` {% endif %} {% if include.component == "compat_rhs_gref3" %} -`ace_explosives`, `ace_csw`, `rhsgref_main_loadorder` +- `ace_fastroping` +- `ace_explosives` +- `ace_csw` +- `rhsgref_main_loadorder` {% endif %} {% if include.component == "compat_rhs_saf3" %} -`ace_explosives`, `rhssaf_main_loadorder` +- `ace_explosives` +- `rhssaf_main_loadorder` {% endif %} {% if include.component == "compat_rhs_usf3" %} -`ace_explosives`, `ace_javelin`, `ace_rearm`, `ace_refuel`, `ace_repair`, `ace_csw`, `rhsusf_main_loadorder` +- `ace_explosives` +- `ace_javelin` +- `ace_rearm` +- `ace_refuel` +- `ace_repair` +- `ace_csw` +- `rhsusf_main_loadorder` {% endif %} {% if include.component == "compat_rksl_pm_ii" %} -`RKSL_PMII`, `RKSL_PMII_525` +- `RKSL_PMII` +- `RKSL_PMII_525` {% endif %} {% if include.component == "compat_sma3_iansky" %} -`iansky_opt` +- `iansky_opt` {% endif %} {% if include.component == "compat_sog" %} -`vn_weapons`, `vn_emm_main_menu`, `weapons_f_vietnam_c`, `ace_trenches` +- `vn_weapons` +- `vn_emm_main_menu` +- `weapons_f_vietnam_c` +- `ace_trenches` {% endif %} {% if include.component == "noactionmenu" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "nocrosshair" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "nouniformrestrictions" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "particles" %} -`ace_common` +- `ace_common` {% endif %} {% if include.component == "realisticdispersion" %} -`ace_ballistics` +- `ace_ballistics` {% endif %} {% if include.component == "tracers" %} -`ace_ballistics` +- `ace_ballistics` {% endif %} diff --git a/docs/_layouts/wiki.html b/docs/_layouts/wiki.html index 3bb53c4b6a..091d9c4079 100644 --- a/docs/_layouts/wiki.html +++ b/docs/_layouts/wiki.html @@ -55,6 +55,13 @@ layout: compress
+ {% if page.component %} + + {% endif %}

{{page.title}}

diff --git a/docs/_posts/2015-09-17-ace3-version331.md b/docs/_posts/2015-09-17-ace3-version331.md index d0eb8d6d01..0e4e62907e 100644 --- a/docs/_posts/2015-09-17-ace3-version331.md +++ b/docs/_posts/2015-09-17-ace3-version331.md @@ -72,4 +72,4 @@ https://github.com/acemod/ACE3/releases/tag/v3.3.0 With the changes of 3.3.1 which can be found here: https://github.com/acemod/ACE3/releases/tag/v3.3.1 (Be sure to download v3.3.1) -If you want to chat with fellow ACE3 users or with a dev feel free to join our public slack chat. Registration is free and open for everyone: https://slackin.ace3mod.com/ +If you want to chat with fellow ACE3 users or with a dev feel free to join our public slack chat. Registration is free and open for everyone: https://acemod.org/slack diff --git a/docs/_posts/2015-12-03-ace3-version340.md b/docs/_posts/2015-12-03-ace3-version340.md index 3223c7f38a..07d6800f26 100644 --- a/docs/_posts/2015-12-03-ace3-version340.md +++ b/docs/_posts/2015-12-03-ace3-version340.md @@ -62,4 +62,4 @@ The complete change log of 3.4.0 can be found at: https://github.com/acemod/ACE3 And most important: If you want to chat with fellow ACE3 users or with a dev, if you have an idea or are in need of help feel free to join our public slack chat. -Registration is open for everyone: https://slackin.ace3mod.com/ +Registration is open for everyone: https://acemod.org/slack diff --git a/docs/_posts/2016-03-02-ace3-version350.md b/docs/_posts/2016-03-02-ace3-version350.md index 04364babd5..1b741232c6 100644 --- a/docs/_posts/2016-03-02-ace3-version350.md +++ b/docs/_posts/2016-03-02-ace3-version350.md @@ -82,4 +82,4 @@ Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_nam **And most important:** If you want to chat with fellow ACE3 users or with a dev, if you have an idea or are in need of help feel free to join our public slack chat. -**Registration is open for everyone: [https://slackin.ace3mod.com/](https://slackin.ace3mod.com/)** +**Registration is open for everyone: [https://acemod.org/slack](https://acemod.org/slack)** diff --git a/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md b/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md index 498a70785a..f3abc132ae 100644 --- a/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md +++ b/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md @@ -66,7 +66,7 @@ This update does not mean that if your mod depends on any of this functionality ### Replacing deprecated functionality -It is recommended to replace any functionality that is deprecated with its replacement as soon as possible. If you are in need of any help with moving from deprecated ACE3 functionality to it's replacement, please visit our [Public Slack team at https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"}. +It is recommended to replace any functionality that is deprecated with its replacement as soon as possible. If you are in need of any help with moving from deprecated ACE3 functionality to it's replacement, please visit our [Public Slack team at https://acemod.org/slack](https://acemod.org/slack){:target="_blank"}. ## ACE3 Events @@ -77,4 +77,4 @@ Any code currently using the old ACE3 event functions will still function correc --- -We hope you like the new frameworks made publicly available in CBA A3 and without needing a dependency on ACE3. Feel free to leave your feedback either on the [CBA BI forum thread](https://forums.bistudio.com/topic/168277-cba-community-base-addons-arma-3/){:target="_blank"}, the [ACE3 BI forum thread](https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/){:target="_blank"} or in our [public chat](https://slackin.ace3mod.com){:target="_blank"}. +We hope you like the new frameworks made publicly available in CBA A3 and without needing a dependency on ACE3. Feel free to leave your feedback either on the [CBA BI forum thread](https://forums.bistudio.com/topic/168277-cba-community-base-addons-arma-3/){:target="_blank"}, the [ACE3 BI forum thread](https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/){:target="_blank"} or in our [public chat](https://acemod.org/slack){:target="_blank"}. diff --git a/docs/_posts/2016-06-30-ace3-version360.md b/docs/_posts/2016-06-30-ace3-version360.md index a2bfcbf695..de1c034a65 100644 --- a/docs/_posts/2016-06-30-ace3-version360.md +++ b/docs/_posts/2016-06-30-ace3-version360.md @@ -100,6 +100,6 @@ The full changelog for ACE3 v3.6.0 can be found here: [https://github.com/acemod We are still in need for translations for some languages within the ACE3 project. Please have a look at [this github issue to track the progress and what languages lack translations](https://github.com/acemod/ACE3/issues/367){:target="_blank"}. Any and all help with this is appreciated. And most finally, we would like to invite you to our ACE3 public Slack chat. Here you can chat with fellow ACE3 users and developers, ask questions and receive help. -Registration is open for everyone: [https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"}. +Registration is open for everyone: [https://acemod.org/slack](https://acemod.org/slack){:target="_blank"}. Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. diff --git a/docs/_posts/2016-09-17-ace3-version370.md b/docs/_posts/2016-09-17-ace3-version370.md index 93eeeca9ee..e31a14df7d 100644 --- a/docs/_posts/2016-09-17-ace3-version370.md +++ b/docs/_posts/2016-09-17-ace3-version370.md @@ -66,11 +66,11 @@ We are still in need for translations for some languages within the ACE3 project
- Slack Monochrome black logo + Slack Monochrome black logo
And most finally, we would like to invite you to our ACE3 public Slack chat. Here you can chat with fellow ACE3 users and developers, ask questions and receive help. -Registration is open for everyone: [https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"}. +Registration is open for everyone: [https://acemod.org/slack](https://acemod.org/slack){:target="_blank"}. Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. diff --git a/docs/_posts/2016-11-04-ace3-version381.md b/docs/_posts/2016-11-04-ace3-version381.md index d69767cb9f..f19343de61 100644 --- a/docs/_posts/2016-11-04-ace3-version381.md +++ b/docs/_posts/2016-11-04-ace3-version381.md @@ -15,7 +15,7 @@ A big shoutout to those who helped testing! Thank you. We've used this approach for 3.8.0 as well and hope that again most of the bugs have been fixed already and that you can enjoy ACE3 without annoying interruptions. -We will keep this approach for the future and invite you to join to test the release candidates. All information will be posted in our public chat to which you're invited too. You can access it here: [https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"} +We will keep this approach for the future and invite you to join to test the release candidates. All information will be posted in our public chat to which you're invited too. You can access it here: [https://acemod.org/slack](https://acemod.org/slack){:target="_blank"} So, why didn't we release any minor releases for 3.7.0 (e.g. 3.7.1)? In short: We didn't feel that it was necessary. During and directly after the release we had already added new and awesome features so that we had to do a major release. diff --git a/docs/_posts/2021-10-14-ace3-version3140.md b/docs/_posts/2021-10-14-ace3-version3140.md index f2bd90cd21..c4f824e848 100644 --- a/docs/_posts/2021-10-14-ace3-version3140.md +++ b/docs/_posts/2021-10-14-ace3-version3140.md @@ -45,7 +45,7 @@ The new vehicle damage system enhances vanilla armored vehicle damage simulation Alongside the vehicle damage system, a fire system was also added. This system adds the ability to light people and objects on fire, and have it spread. Fire will inflict burn damage and cause intense pain. You can stop, drop, and roll to try and extinguish the flames. Being in contact with water (i.e. in rain or underwater) will put out the fire more quickly. Lastly, there is also an interaction to pat people down if they are on fire. -You can read about the vehicle damage system in greater detail [here](https://ace3mod.com/wiki/feature/vehicledamage.html){:target="_blank"} and the fire system [here](https://ace3mod.com/wiki/feature/fire.html){:target="_blank"}. +You can read about the vehicle damage system in greater detail [here](https://ace3.acemod.org/wiki/feature/vehicledamage.html){:target="_blank"} and the fire system [here](https://ace3.acemod.org/wiki/feature/fire.html){:target="_blank"}. ### Medical Rewrite Follow Up diff --git a/docs/acebot.json b/docs/acebot.json index 8aea4186b2..3ded2b0d61 100644 --- a/docs/acebot.json +++ b/docs/acebot.json @@ -2,101 +2,101 @@ // General { "name": "Arsenal", - "url": "https://ace3mod.com/wiki/feature/arsenal.html" + "url": "https://ace3.acemod.org/wiki/feature/arsenal.html" }, // Interaction { "name": "AdvancedThrowing", - "url": "https://ace3mod.com/wiki/feature/advanced-throwing.html" + "url": "https://ace3.acemod.org/wiki/feature/advanced-throwing.html" }, { "name": "Captives", - "url": "https://ace3mod.com/wiki/feature/captives.html" + "url": "https://ace3.acemod.org/wiki/feature/captives.html" }, { "name": "Explosives", - "url": "https://ace3mod.com/wiki/feature/explosives.html" + "url": "https://ace3.acemod.org/wiki/feature/explosives.html" }, { "name": "Interaction", - "url": "https://ace3mod.com/wiki/feature/interaction.html" + "url": "https://ace3.acemod.org/wiki/feature/interaction.html" }, { "name": "MapGestures", - "url": "https://ace3mod.com/wiki/feature/map-gestures.html" + "url": "https://ace3.acemod.org/wiki/feature/map-gestures.html" }, { "name": "Nametags", - "url": "https://ace3mod.com/wiki/feature/nametags.html" + "url": "https://ace3.acemod.org/wiki/feature/nametags.html" }, { "name": "Pylons", - "url": "https://ace3mod.com/wiki/feature/pylons.html" + "url": "https://ace3.acemod.org/wiki/feature/pylons.html" }, { "name": "Refuel", - "url": "https://ace3mod.com/wiki/feature/refuel.html" + "url": "https://ace3.acemod.org/wiki/feature/refuel.html" }, { "name": "Reload", - "url": "https://ace3mod.com/wiki/feature/reload.html" + "url": "https://ace3.acemod.org/wiki/feature/reload.html" }, { "name": "Repair", - "url": "https://ace3mod.com/wiki/feature/repair.html" + "url": "https://ace3.acemod.org/wiki/feature/repair.html" }, { "name": "Slideshow", - "url": "https://ace3mod.com/wiki/feature/slideshow.html" + "url": "https://ace3.acemod.org/wiki/feature/slideshow.html" }, { "name": "Spectator", - "url": "https://ace3mod.com/wiki/feature/spectator.html" + "url": "https://ace3.acemod.org/wiki/feature/spectator.html" }, // Realism { "name": "AdvancedBallistics", - "url": "https://ace3mod.com/wiki/feature/advanced-ballistics.html" + "url": "https://ace3.acemod.org/wiki/feature/advanced-ballistics.html" }, { "name": "Hearing", - "url": "https://ace3mod.com/wiki/feature/hearing.html" + "url": "https://ace3.acemod.org/wiki/feature/hearing.html" }, { "name": "MedicalSystem", - "url": "https://ace3mod.com/wiki/feature/medical-system.html" + "url": "https://ace3.acemod.org/wiki/feature/medical-system.html" }, { "name": "Overheating", - "url": "https://ace3mod.com/wiki/feature/overheating.html" + "url": "https://ace3.acemod.org/wiki/feature/overheating.html" }, { "name": "Weather", - "url": "https://ace3mod.com/wiki/feature/weather.html" + "url": "https://ace3.acemod.org/wiki/feature/weather.html" }, // Equipment { "name": "ATragMX", - "url": "https://ace3mod.com/wiki/feature/atragmx.html" + "url": "https://ace3.acemod.org/wiki/feature/atragmx.html" }, { "name": "Hellfire", - "url": "https://ace3mod.com/wiki/feature/hellfire.html" + "url": "https://ace3.acemod.org/wiki/feature/hellfire.html" }, { "name": "Kestrel4500", - "url": "https://ace3mod.com/wiki/feature/kestrel4500.html" + "url": "https://ace3.acemod.org/wiki/feature/kestrel4500.html" }, { "name": "MapTools", - "url": "https://ace3mod.com/wiki/feature/maptools.html" + "url": "https://ace3.acemod.org/wiki/feature/maptools.html" }, { "name": "MicroDAGR", - "url": "https://ace3mod.com/wiki/feature/microdagr.html" + "url": "https://ace3.acemod.org/wiki/feature/microdagr.html" }, { "name": "Nightvision", - "url": "https://ace3mod.com/wiki/feature/nightvision.html" + "url": "https://ace3.acemod.org/wiki/feature/nightvision.html" } ] diff --git a/docs/index.html b/docs/index.html index 6d099cb72e..21df9af763 100644 --- a/docs/index.html +++ b/docs/index.html @@ -43,7 +43,7 @@ sitemap:

{{ page.browserTitle }}

@@ -60,11 +60,11 @@ sitemap:
Everything you need to know about using the mod or developing for it.

-

ACE3 on Github
Latest code, issue reports, feature requests +

ACE3 on Github
Latest code, issue reports, feature requests and more.

-

ACE3 Public Chat
+

ACE3 Public Chat
Join our public chat! We're glad to answer questions concerning ACE3, development or Arma things.
If you made something with this mod (screen shots, artwork, videos) we'd love to see it.

diff --git a/docs/js/footer.dev.js b/docs/js/footer.dev.js index 1a627a5244..108c9da9d3 100644 --- a/docs/js/footer.dev.js +++ b/docs/js/footer.dev.js @@ -6353,27 +6353,6 @@ utils.countOccurrences = function (text, searchTerm) { return (n); }; -window.app = window.app || {}; -window.app.analytics = (function () { - - - function sendEvent(category, action, label, value) { - - if (!window.ga) { - return; - } - - try { - ga("send", "event", category, action, label, value); - } catch(ex) {} - } - - - return { - sendEvent: sendEvent - }; -})(); - window.app = window.app || {}; window.app.storage = (function () { @@ -6638,14 +6617,12 @@ window.app.contentSearch = (function ($) { function handleLiveSearchResult(response) { var results = findSearchTermInArray(response, _maxEntriesLive); - app.analytics.sendEvent("LiveSearch", "Search", _searchTerm); showLiveResultList(results); } function openSearchPage(e) { e.preventDefault(); var searchTerm = $liveSearchField.val().trim(); - app.analytics.sendEvent("LiveSearch", "OpenSearchPage", searchTerm); document.location.href = String.format("search.html?{0}={1}", searchTermParamName, encodeURIComponent(searchTerm)); return false; } @@ -6713,7 +6690,6 @@ window.app.contentSearch = (function ($) { function handleContentSearchResult(response) { var results = findSearchTermInArray(response, _maxEntriesContent); - app.analytics.sendEvent("ContentSearch", "Search", _searchTerm); showContentResultList(results); } diff --git a/docs/js/footer.min.js b/docs/js/footer.min.js index 4522b3ee91..26da8d4c0e 100644 --- a/docs/js/footer.min.js +++ b/docs/js/footer.min.js @@ -1,2 +1,2 @@ -window.Modernizr=function(e,i){function t(e){a.cssText=e}var n,o,r={},s=e.documentElement,a=e.createElement("modernizr").style,l={},c=[],d=c.slice,u={}.hasOwnProperty,p=void 0!==u&&void 0!==u.call?function(e,t){return u.call(e,t)}:function(e,t){return t in e&&void 0===e.constructor.prototype[t]};for(o in Function.prototype.bind||(Function.prototype.bind=function(n){var i=this;if("function"!=typeof i)throw new TypeError;var o=d.call(arguments,1),r=function(){if(this instanceof r){var e=function(){};e.prototype=i.prototype;var t=new e,e=i.apply(t,o.concat(d.call(arguments)));return Object(e)===e?e:t}return i.apply(n,o.concat(d.call(arguments)))};return r}),l)p(l,o)&&(n=o.toLowerCase(),r[n]=l[o](),c.push((r[n]?"":"no-")+n));return r.addTest=function(e,t){if("object"==typeof e)for(var n in e)p(e,n)&&r.addTest(n,e[n]);else{if(e=e.toLowerCase(),r[e]!==i)return r;t="function"==typeof t?t():t,s.className+=" "+(t?"":"no-")+e,r[e]=t}return r},t(""),0,function(e,a){function l(){var e=h.elements;return"string"==typeof e?e.split(" "):e}function c(e){var t=f[e[r]];return t||(t={},s++,e[r]=s,f[s]=t),t}function d(e,t,n){return t=t||a,p?t.createElement(e):!(t=(n=n||c(t)).cache[e]?n.cache[e].cloneNode():o.test(e)?(n.cache[e]=n.createElem(e)).cloneNode():n.createElem(e)).canHaveChildren||i.test(e)||t.tagUrn?t:n.frag.appendChild(t)}function t(e){var t,n,i,o,r,s=c(e=e||a);return!h.shivCSS||u||s.hasCSS||(s.hasCSS=(o="article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}",r=(i=e).createElement("p"),i=i.getElementsByTagName("head")[0]||i.documentElement,r.innerHTML="x",!!i.insertBefore(r.lastChild,i.firstChild))),p||(t=e,(n=s).cache||(n.cache={},n.createElem=t.createElement,n.createFrag=t.createDocumentFragment,n.frag=n.createFrag()),t.createElement=function(e){return h.shivMethods?d(e,t,n):n.createElem(e)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/[\w\-]+/g,function(e){return n.createElem(e),n.frag.createElement(e),'c("'+e+'")'})+");return n}")(h,n.frag)),e}var u,p,n=e.html5||{},i=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,o=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,r="_html5shiv",s=0,f={};!function(){try{var e=a.createElement("a");e.innerHTML="",u="hidden"in e,p=1==e.childNodes.length||function(){a.createElement("a");var e=a.createDocumentFragment();return void 0===e.cloneNode||void 0===e.createDocumentFragment||void 0===e.createElement}()}catch(e){p=u=!0}}();var h={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==n.shivCSS,supportsUnknownElements:p,shivMethods:!1!==n.shivMethods,type:"default",shivDocument:t,createElement:d,createDocumentFragment:function(e,t){if(e=e||a,p)return e.createDocumentFragment();for(var n=(t=t||c(e)).frag.cloneNode(),i=0,o=l(),r=o.length;i img, img[srcset][sizes]"),t=0;te._pfLastSize)&&(e._pfLastSize=e.offsetWidth,n=e.sizes,e.sizes+=",100vw",setTimeout(function(){e.sizes=n}))}(e[t])},i=e.matchMedia&&matchMedia("(orientation: landscape)"),o.srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",/^[c|i]|d$/.test(document.readyState||"")?a():document.addEventListener("DOMContentLoaded",a),s))}(window),function(e,r,c){"use strict";var o,d,s;r.createElement("picture");function t(){}function n(e,t,n,i){e.addEventListener?e.addEventListener(t,n,i||!1):e.attachEvent&&e.attachEvent("on"+t,n)}var w={},a=!1,i=r.createElement("img"),u=i.getAttribute,p=i.setAttribute,f=i.removeAttribute,l=r.documentElement,h={},x={algorithm:""},g="data-pfsrc",m=g+"set",v=navigator.userAgent,k=/rident/.test(v)||/ecko/.test(v)&&v.match(/rv\:(\d+)/)&&35=",/max-([a-z-\s]+):/g,"e.$1<=",/calc([^)]+)/g,"($1)",/(\d+[\.]*[\d]*)([a-z]+)/g,"($1 * e.$2)",/^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/gi,"")+";"}),function(e,t){var n;if(!(e in $))if($[e]=!1,t&&(n=e.match(I)))$[e]=n[1]*j[n[2]];else try{$[e]=new Function("e",R(e))(j)}catch(e){}return $[e]}),ie=function(e){if(a){var t,n,i,o=e||{};if(o.elements&&1===o.elements.nodeType&&("IMG"===o.elements.nodeName.toUpperCase()?o.elements=[o.elements]:(o.context=o.elements,o.elements=null)),i=(t=o.elements||w.qsa(o.context||r,o.reevaluate||o.reselect?w.sel:w.selShort)).length){for(w.setupRun(o),L=!0,n=0;nimg,img[srcset]",w.sel=w.selShort,w.cfg=x,w.DPR=_||1,w.u=j,w.types=h,w.setSize=t,w.makeUrl=v(function(e){return D.href=e,D.href}),w.qsa=function(e,t){return"querySelector"in e?e.querySelectorAll(t):[]},w.matchesMedia=function(){return e.matchMedia&&(matchMedia("(min-width: 0.1em)")||{}).matches?w.matchesMedia=function(e){return!e||matchMedia(e).matches}:w.matchesMedia=w.mMQ,w.matchesMedia.apply(this,arguments)},w.mMQ=function(e){return!e||ne(e)},w.calcLength=function(e){e=ne(e,!0)||!1;return e=e<0?!1:e},w.supportsType=function(e){return!e||h[e]},w.parseSize=v(function(e){e=(e||"").match(b);return{media:e&&e[1],length:e&&e[2]}}),w.parseSet=function(e){return e.cands||(e.cands=se(e.srcset,e)),e.cands},w.getEmValue=function(){var e,t,n,i;return!o&&(e=r.body)&&(t=r.createElement("div"),n=l.style.cssText,i=e.style.cssText,t.style.cssText="position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)",l.style.cssText=C,e.style.cssText=C,e.appendChild(t),o=t.offsetWidth,e.removeChild(t),o=parseFloat(o,10),l.style.cssText=n,e.style.cssText=i),o||16},w.calcListLength=function(e){var t;return e in E&&!x.uT||(t=w.calcLength(ae(e)),E[e]=t||j.width),E[e]},w.setRes=function(e){if(e)for(var t,n=0,i=(t=w.parseSet(e)).length;nv)||(b.cached=!0,b.res>=v&&(s=b))),!s)for(e.sort(oe),s=e[(r=e.length)-1],i=0;i=v){s=e[o=i-1]&&(a||y!==w.makeUrl(n.url))&&(d=e[o].res,u=n.res,p=v,f=e[o].cached,g=h=void 0,d="saveData"===x.algorithm?2.7>10|55296,1023&i|56320)}function t(){k()}var e,h,w,r,i,g,p,m,x,l,c,k,S,o,T,v,s,a,y,C="sizzle"+ +new Date,b=n.document,A=0,d=0,f=oe(),$=oe(),E=oe(),_=function(e,t){return e===t&&(c=!0),0},j={}.hasOwnProperty,D=[],L=D.pop,N=D.push,H=D.push,q=D.slice,O=function(e,t){for(var n=0,i=e.length;n+~]|"+M+")"+M+"*"),X=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),Q=new RegExp(I),Y=new RegExp("^"+F+"$"),G={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),TAG:new RegExp("^("+F+"|[*])"),ATTR:new RegExp("^"+z),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},V=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=/'|\\/g,ne=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig");try{H.apply(D=q.call(b.childNodes),b.childNodes),D[b.childNodes.length].nodeType}catch(e){H={apply:D.length?function(e,t){N.apply(e,q.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function ie(e,t,n,i){var o,r,s,a,l,c,d,u,p=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!i&&((t?t.ownerDocument||t:b)!==S&&k(t),t=t||S,T)){if(11!==f&&(c=Z.exec(e)))if(o=c[1]){if(9===f){if(!(s=t.getElementById(o)))return n;if(s.id===o)return n.push(s),n}else if(p&&(s=p.getElementById(o))&&y(t,s)&&s.id===o)return n.push(s),n}else{if(c[2])return H.apply(n,t.getElementsByTagName(e)),n;if((o=c[3])&&h.getElementsByClassName&&t.getElementsByClassName)return H.apply(n,t.getElementsByClassName(o)),n}if(h.qsa&&!E[e+" "]&&(!v||!v.test(e))){if(1!==f)p=t,u=e;else if("object"!==t.nodeName.toLowerCase()){for((a=t.getAttribute("id"))?a=a.replace(te,"\\$&"):t.setAttribute("id",a=C),r=(d=g(e)).length,l=Y.test(a)?"#"+a:"[id='"+a+"']";r--;)d[r]=l+" "+pe(d[r]);u=d.join(","),p=ee.test(e)&&de(t.parentNode)||t}if(u)try{return H.apply(n,p.querySelectorAll(u)),n}catch(e){}finally{a===C&&t.removeAttribute("id")}}}return m(e.replace(W,"$1"),t,n,i)}function oe(){var n=[];function i(e,t){return n.push(e+" ")>w.cacheLength&&delete i[n.shift()],i[e+" "]=t}return i}function re(e){return e[C]=!0,e}function se(e){var t=S.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function ae(e,t){for(var n=e.split("|"),i=n.length;i--;)w.attrHandle[n[i]]=t}function le(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function ce(s){return re(function(r){return r=+r,re(function(e,t){for(var n,i=s([],e.length,r),o=i.length;o--;)e[n=i[o]]&&(e[n]=!(t[n]=e[n]))})})}function de(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in h=ie.support={},i=ie.isXML=function(e){e=e&&(e.ownerDocument||e).documentElement;return!!e&&"HTML"!==e.nodeName},k=ie.setDocument=function(e){var e=e?e.ownerDocument||e:b;return e!==S&&9===e.nodeType&&e.documentElement&&(o=(S=e).documentElement,T=!i(S),(e=S.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",t,!1):e.attachEvent&&e.attachEvent("onunload",t)),h.attributes=se(function(e){return e.className="i",!e.getAttribute("className")}),h.getElementsByTagName=se(function(e){return e.appendChild(S.createComment("")),!e.getElementsByTagName("*").length}),h.getElementsByClassName=K.test(S.getElementsByClassName),h.getById=se(function(e){return o.appendChild(e).id=C,!S.getElementsByName||!S.getElementsByName(C).length}),h.getById?(w.find.ID=function(e,t){if(void 0!==t.getElementById&&T){e=t.getElementById(e);return e?[e]:[]}},w.filter.ID=function(e){var t=e.replace(ne,u);return function(e){return e.getAttribute("id")===t}}):(delete w.find.ID,w.filter.ID=function(e){var t=e.replace(ne,u);return function(e){e=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}}),w.find.TAG=h.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):h.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],o=0,r=t.getElementsByTagName(e);if("*"!==e)return r;for(;n=r[o++];)1===n.nodeType&&i.push(n);return i},w.find.CLASS=h.getElementsByClassName&&function(e,t){return void 0!==t.getElementsByClassName&&T?t.getElementsByClassName(e):void 0},s=[],v=[],(h.qsa=K.test(S.querySelectorAll))&&(se(function(e){o.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+C+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+C+"+*").length||v.push(".#.+[+~]")}),se(function(e){var t=S.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(h.matchesSelector=K.test(a=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&se(function(e){h.disconnectedMatch=a.call(e,"div"),a.call(e,"[s!='']:x"),s.push("!=",I)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),e=K.test(o.compareDocumentPosition),y=e||K.test(o.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},_=e?function(e,t){if(e===t)return c=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!h.sortDetached&&t.compareDocumentPosition(e)===n?e===S||e.ownerDocument===b&&y(b,e)?-1:t===S||t.ownerDocument===b&&y(b,t)?1:l?O(l,e)-O(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return c=!0,0;var n,i=0,o=e.parentNode,r=t.parentNode,s=[e],a=[t];if(!o||!r)return e===S?-1:t===S?1:o?-1:r?1:l?O(l,e)-O(l,t):0;if(o===r)return le(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?le(s[i],a[i]):s[i]===b?-1:a[i]===b?1:0}),S},ie.matches=function(e,t){return ie(e,null,null,t)},ie.matchesSelector=function(e,t){if((e.ownerDocument||e)!==S&&k(e),t=t.replace(X,"='$1']"),h.matchesSelector&&T&&!E[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=a.call(e,t);if(n||h.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ne,u),e[3]=(e[3]||e[4]||e[5]||"").replace(ne,u),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ie.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ie.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Q.test(n)&&(t=g(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(ne,u).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=f[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&f(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,i){return function(e){e=ie.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===i:"!="===n?e!==i:"^="===n?i&&0===e.indexOf(i):"*="===n?i&&-1(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function T(e,n,i){if(S.isFunction(n))return S.grep(e,function(e,t){return!!n.call(e,t,e)!==i});if(n.nodeType)return S.grep(e,function(e){return e===n!==i});if("string"==typeof n){if(w.test(n))return S.filter(n,e,i);n=S.filter(n,e)}return S.grep(e,function(e){return-1)[^>]*|#([\w-]*))$/;(S.fn.init=function(e,t,n){if(!e)return this;if(n=n||A,"string"!=typeof e)return e.nodeType?(this.context=this[0]=e,this.length=1,this):S.isFunction(e)?void 0!==n.ready?n.ready(e):e(S):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),S.makeArray(e,this));if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:C.exec(e))||!i[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(i[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:k,!0)),b.test(i[1])&&S.isPlainObject(t))for(var i in t)S.isFunction(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(n=k.getElementById(i[2]))&&n.parentNode&&(this.length=1,this[0]=n),this.context=k,this.selector=e,this}).prototype=S.fn;var A=S(k),$=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};function _(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e",""],thead:[1,"
SlackWe have a public Slack team that anyone can join. This is where all our developers and contributors hang out and where we make announcementsDiscordWe have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements
我們有著公共的Slack團隊供大家加入,而該模組所有開發者以及維護者也會在此出現並公告Discord我們有著公共的Discord團隊供大家加入,而該模組所有開發者以及維護者也會在此出現並公告
","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function V(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&S.nodeName(e,t)?S.merge([e],n):n}function J(e,t){for(var n=0,i=e.length;nx",m.noCloneChecked=!!n.cloneNode(!0).lastChild.defaultValue;var ee=/^key/,te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ne=/^([^.]*)(?:\.(.+)|)/;function ie(){return!0}function oe(){return!1}function re(){try{return k.activeElement}catch(e){}}function se(e,t,n,i,o,r){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(i=i||n,n=void 0),t)se(e,a,n,i,t[a],r);return e}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=oe;else if(!o)return e;return 1===r&&(s=o,(o=function(e){return S().off(e),s.apply(this,arguments)}).guid=s.guid||(s.guid=S.guid++)),e.each(function(){S.event.add(this,t,o,i,n)})}S.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,c,d,u,p,f,h=O.get(t);if(h)for(n.handler&&(n=(r=n).handler,o=r.selector),n.guid||(n.guid=S.guid++),(a=h.events)||(a=h.events={}),(s=h.handle)||(s=h.handle=function(e){return void 0!==S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;l--;)u=f=(c=ne.exec(e[l])||[])[1],p=(c[2]||"").split(".").sort(),u&&(d=S.event.special[u]||{},u=(o?d.delegateType:d.bindType)||u,d=S.event.special[u]||{},c=S.extend({type:u,origType:f,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&S.expr.match.needsContext.test(o),namespace:p.join(".")},r),(f=a[u])||((f=a[u]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(u,s)),d.add&&(d.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?f.splice(f.delegateCount++,0,c):f.push(c),S.event.global[u]=!0)},remove:function(e,t,n,i,o){var r,s,a,l,c,d,u,p,f,h,g,m=O.hasData(e)&&O.get(e);if(m&&(l=m.events)){for(c=(t=(t||"").match(D)||[""]).length;c--;)if(f=g=(a=ne.exec(t[c])||[])[1],h=(a[2]||"").split(".").sort(),f){for(u=S.event.special[f]||{},p=l[f=(i?u.delegateType:u.bindType)||f]||[],a=a[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=p.length;r--;)d=p[r],!o&&g!==d.origType||n&&n.guid!==d.guid||a&&!a.test(d.namespace)||i&&i!==d.selector&&("**"!==i||!d.selector)||(p.splice(r,1),d.selector&&p.delegateCount--,u.remove&&u.remove.call(e,d));s&&!p.length&&(u.teardown&&!1!==u.teardown.call(e,h,m.handle)||S.removeEvent(e,f,m.handle),delete l[f])}else for(f in l)S.event.remove(e,f+t[c],n,i,!0);S.isEmptyObject(l)&&O.remove(e,"handle events")}},dispatch:function(e){e=S.event.fix(e);var t,n,i,o,r,s=d.call(arguments),a=(O.get(this,"events")||{})[e.type]||[],l=S.event.special[e.type]||{};if((s[0]=e).delegateTarget=this,!l.preDispatch||!1!==l.preDispatch.call(this,e)){for(r=S.event.handlers.call(this,e,a),t=0;(i=r[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,void 0!==(o=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(e.result=o)&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,i,o,r,s=[],a=t.delegateCount,l=e.target;if(a&&l.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(!0!==l.disabled||"click"!==e.type)){for(i=[],n=0;n]*)\/>/gi,le=/\s*$/g;function pe(e,t){return S.nodeName(e,"table")&&S.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function fe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function he(e){var t=de.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function ge(e,t){var n,i,o,r,s,a;if(1===t.nodeType){if(O.hasData(e)&&(r=O.access(e),s=O.set(t,r),a=r.events))for(o in delete s.handle,s.events={},a)for(n=0,i=a[o].length;n")},clone:function(e,t,n){var i,o,r,s,a,l,c,d=e.cloneNode(!0),u=S.contains(e.ownerDocument,e);if(!(m.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(s=V(d),i=0,o=(r=V(e)).length;i")).appendTo(t.documentElement))[0].contentDocument).write(),t.close(),n=we(e,t),ye.detach()),be[e]=n),n}function ke(e){var t=e.ownerDocument.defaultView;return(t=!t||!t.opener?x:t).getComputedStyle(e)}function Se(e,t,n,i){var o,r={};for(o in t)r[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,i||[]),t)e.style[o]=r[o];return i}var Te,Ce,Ae,$e,Ee,_e,je=/^margin/,De=new RegExp("^("+R+")(?!px)[a-z%]+$","i"),Le=k.documentElement;function Ne(){_e.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",_e.innerHTML="",Le.appendChild(Ee);var e=x.getComputedStyle(_e);Te="1%"!==e.top,$e="2px"===e.marginLeft,Ce="4px"===e.width,_e.style.marginRight="50%",Ae="4px"===e.marginRight,Le.removeChild(Ee)}function He(e,t,n){var i,o,r=e.style;return""!==(o=(n=n||ke(e))?n.getPropertyValue(t)||n[t]:void 0)&&void 0!==o||S.contains(e.ownerDocument,e)||(o=S.style(e,t)),n&&!m.pixelMarginRight()&&De.test(o)&&je.test(t)&&(i=r.width,e=r.minWidth,t=r.maxWidth,r.minWidth=r.maxWidth=r.width=o,o=n.width,r.width=i,r.minWidth=e,r.maxWidth=t),void 0!==o?o+"":o}function qe(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}Ee=k.createElement("div"),(_e=k.createElement("div")).style&&(_e.style.backgroundClip="content-box",_e.cloneNode(!0).style.backgroundClip="",m.clearCloneStyle="content-box"===_e.style.backgroundClip,Ee.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",Ee.appendChild(_e),S.extend(m,{pixelPosition:function(){return Ne(),Te},boxSizingReliable:function(){return null==Ce&&Ne(),Ce},pixelMarginRight:function(){return null==Ce&&Ne(),Ae},reliableMarginLeft:function(){return null==Ce&&Ne(),$e},reliableMarginRight:function(){var e,t=_e.appendChild(k.createElement("div"));return t.style.cssText=_e.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",_e.style.width="1px",Le.appendChild(Ee),e=!parseFloat(x.getComputedStyle(t).marginRight),Le.removeChild(Ee),_e.removeChild(t),e}}));var Oe=/^(none|table(?!-c[ea]).+)/,Pe={position:"absolute",visibility:"hidden",display:"block"},Me={letterSpacing:"0",fontWeight:"400"},Fe=["Webkit","O","Moz","ms"],ze=k.createElement("div").style;function Ie(e){if(e in ze)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=Fe.length;n--;)if((e=Fe[n]+t)in ze)return e}function Re(e,t,n){var i=W.exec(t);return i?Math.max(0,i[2]-(n||0))+(i[3]||"px"):t}function We(e,t,n,i,o){for(var r=n===(i?"border":"content")?4:"width"===t?1:0,s=0;r<4;r+=2)"margin"===n&&(s+=S.css(e,n+B[r],!0,o)),i?("content"===n&&(s-=S.css(e,"padding"+B[r],!0,o)),"margin"!==n&&(s-=S.css(e,"border"+B[r]+"Width",!0,o))):(s+=S.css(e,"padding"+B[r],!0,o),"padding"!==n&&(s+=S.css(e,"border"+B[r]+"Width",!0,o)));return s}function Be(e,t,n){var i=!0,o="width"===t?e.offsetWidth:e.offsetHeight,r=ke(e),s="border-box"===S.css(e,"boxSizing",!1,r);if(o<=0||null==o){if(((o=He(e,t,r))<0||null==o)&&(o=e.style[t]),De.test(o))return o;i=s&&(m.boxSizingReliable()||o===e.style[t]),o=parseFloat(o)||0}return o+We(e,t,n||(s?"border":"content"),i,r)+"px"}function Ue(e,t){for(var n,i,o,r=[],s=0,a=e.length;s").prop({charset:n.scriptCharset,src:n.url}).on("load error",o=function(e){i.remove(),o=null,e&&t("error"===e.type?404:200,e.type)}),k.head.appendChild(i[0])},abort:function(){o&&o()}}});var Lt=[],Nt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Lt.pop()||S.expando+"_"+ut++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var i,o,r,s=!1!==e.jsonp&&(Nt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Nt.test(e.data)&&"data");return s||"jsonp"===e.dataTypes[0]?(i=e.jsonpCallback=S.isFunction(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(Nt,"$1"+i):!1!==e.jsonp&&(e.url+=(pt.test(e.url)?"&":"?")+e.jsonp+"="+i),e.converters["script json"]=function(){return r||S.error(i+" was not called"),r[0]},e.dataTypes[0]="json",o=x[i],x[i]=function(){r=arguments},n.always(function(){void 0===o?S(x).removeProp(i):x[i]=o,e[i]&&(e.jsonpCallback=t.jsonpCallback,Lt.push(i)),r&&S.isFunction(o)&&o(r[0]),r=o=void 0}),"script"):void 0}),S.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||k;var i=b.exec(e),n=!n&&[];return i?[t.createElement(i[1])]:(i=Z([e],t,n),n&&n.length&&S(n).remove(),S.merge([],i.childNodes))};var Ht=S.fn.load;function qt(e){return S.isWindow(e)?e:9===e.nodeType&&e.defaultView}S.fn.load=function(e,t,n){if("string"!=typeof e&&Ht)return Ht.apply(this,arguments);var i,o,r,s=this,a=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(i):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.expr.filters.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var i,o,r,s,a=S.css(e,"position"),l=S(e),c={};"static"===a&&(e.style.position="relative"),r=l.offset(),i=S.css(e,"top"),s=S.css(e,"left"),s=("absolute"===a||"fixed"===a)&&-1<(i+s).indexOf("auto")?(o=(a=l.position()).top,a.left):(o=parseFloat(i)||0,parseFloat(s)||0),null!=(t=S.isFunction(t)?t.call(e,n,S.extend({},r)):t).top&&(c.top=t.top-r.top+o),null!=t.left&&(c.left=t.left-r.left+s),"using"in t?t.using.call(e,c):l.css(c)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n=this[0],i={top:0,left:0},o=n&&n.ownerDocument;return o?(e=o.documentElement,S.contains(e,n)?(i=n.getBoundingClientRect(),o=qt(o),{top:i.top+o.pageYOffset-e.clientTop,left:i.left+o.pageXOffset-e.clientLeft}):i):void 0},position:function(){if(this[0]){var e,t,n=this[0],i={top:0,left:0};return"fixed"===S.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),(i=!S.nodeName(e[0],"html")?e.offset():i).top+=S.css(e[0],"borderTopWidth",!0),i.left+=S.css(e[0],"borderLeftWidth",!0)),{top:t.top-i.top-S.css(n,"marginTop",!0),left:t.left-i.left-S.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===S.css(e,"position");)e=e.offsetParent;return e||Le})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,o){var r="pageYOffset"===o;S.fn[t]=function(e){return N(this,function(e,t,n){var i=qt(e);return void 0===n?i?i[o]:e[t]:void(i?i.scrollTo(r?i.pageXOffset:n,r?n:i.pageYOffset):e[t]=n)},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=qe(m.pixelPosition,function(e,t){return t?(t=He(e,n),De.test(t)?S(e).position()[n]+"px":t):void 0})}),S.each({Height:"height",Width:"width"},function(r,s){S.each({padding:"inner"+r,content:s,"":"outer"+r},function(i,e){S.fn[e]=function(e,t){var n=arguments.length&&(i||"boolean"!=typeof e),o=i||(!0===e||!0===t?"margin":"border");return N(this,function(e,t,n){var i;return S.isWindow(e)?e.document.documentElement["client"+r]:9===e.nodeType?(i=e.documentElement,Math.max(e.body["scroll"+r],i["scroll"+r],e.body["offset"+r],i["offset"+r],i["client"+r])):void 0===n?S.css(e,t,o):S.style(e,t,n,o)},s,n?e:void 0,n,null)}})}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},size:function(){return this.length}}),S.fn.andSelf=S.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Ot=x.jQuery,Pt=x.$;return S.noConflict=function(e){return x.$===S&&(x.$=Pt),e&&x.jQuery===S&&(x.jQuery=Ot),S},e||(x.jQuery=x.$=S),S}),function(d,l,i,n){"use strict";!function(e){for(var t=e.length,n=d("head");t--;)0===n.has("."+e[t]).length&&n.append('')}(["foundation-mq-small","foundation-mq-small-only","foundation-mq-medium","foundation-mq-medium-only","foundation-mq-large","foundation-mq-large-only","foundation-mq-xlarge","foundation-mq-xlarge-only","foundation-mq-xxlarge","foundation-data-attribute-namespace"]),d(function(){"undefined"!=typeof FastClick&&void 0!==i.body&&FastClick.attach(i.body)});function a(e,t){if("string"!=typeof e)return d(e,t);if(t){var n;if(t.jquery){if(!(n=t[0]))return t}else n=t;return d(n.querySelectorAll(e))}return d(i.querySelectorAll(e))}function t(e){var t=[];return e||t.push("data"),0 #mq-test-1 { width: 42px; }',u.insertBefore(f,p),c=42===h.offsetWidth,u.removeChild(f),{matches:c,media:e}}),function(t){for(var n,o=0,e=["webkit","moz"],i=l.requestAnimationFrame,r=l.cancelAnimationFrame,s=void 0!==t.fx;o").appendTo("head")[0].sheet,global:{namespace:n},init:function(e,t,n,i,o){var o=[e,n,i,o],r=[];if(this.rtl=/rtl/i.test(a("html").attr("dir")),this.scope=e||this.scope,this.set_namespace(),t&&"string"==typeof t&&!/reflow/i.test(t))this.libs.hasOwnProperty(t)&&r.push(this.init_lib(t,o));else for(var s in this.libs)r.push(this.init_lib(s,t));return a(l).load(function(){a(l).trigger("resize.fndtn.clearing").trigger("resize.fndtn.dropdown").trigger("resize.fndtn.equalizer").trigger("resize.fndtn.interchange").trigger("resize.fndtn.joyride").trigger("resize.fndtn.magellan").trigger("resize.fndtn.topbar").trigger("resize.fndtn.slider")}),e},init_lib:function(e,t){return this.libs.hasOwnProperty(e)?(this.patch(this.libs[e]),t&&t.hasOwnProperty(e)?(void 0!==this.libs[e].settings?d.extend(!0,this.libs[e].settings,t[e]):void 0!==this.libs[e].defaults&&d.extend(!0,this.libs[e].defaults,t[e]),this.libs[e].init.apply(this.libs[e],[this.scope,t[e]])):(t=t instanceof Array?t:new Array(t),this.libs[e].init.apply(this.libs[e],t))):function(){}},patch:function(e){e.scope=this.scope,e.namespace=this.global.namespace,e.rtl=this.rtl,e.data_options=this.utils.data_options,e.attr_name=t,e.add_namespace=o,e.bindings=r,e.S=this.utils.S},inherit:function(e,t){for(var n=t.split(" "),i=n.length;i--;)this.utils.hasOwnProperty(n[i])&&(e[n[i]]=this.utils[n[i]])},set_namespace:function(){var e=this.global.namespace===n?d(".foundation-data-attribute-namespace").css("font-family"):this.global.namespace;this.global.namespace=e===n||/false/i.test(e)?"":e},libs:{},utils:{S:a,throttle:function(n,i){var o=null;return function(){var e=this,t=arguments;null==o&&(o=setTimeout(function(){n.apply(e,t),o=null},i))}},debounce:function(i,o,r){var s,a;return function(){var e=this,t=arguments,n=r&&!s;return clearTimeout(s),s=setTimeout(function(){s=null,r||(a=i.apply(e,t))},o),a=n?i.apply(e,t):a}},data_options:function(e,t){t=t||"options";var n,i,o,r,s,a,l={},e=(r=e,0<(s=Foundation.global.namespace).length?r.data(s+"-"+t):r.data(t));if("object"==typeof e)return e;function c(e){return"string"==typeof e?d.trim(e):e}for(n=(o=(e||":").split(";")).length;n--;)i=[(i=o[n].split(":"))[0],i.slice(1).join(":")],/true/i.test(i[1])&&(i[1]=!0),/false/i.test(i[1])&&(i[1]=!1),a=i[1],isNaN(+a)||null===a||""===a||!1===a||!0===a||(-1===i[1].indexOf(".")?i[1]=parseInt(i[1],10):i[1]=parseFloat(i[1])),2===i.length&&0'),Foundation.media_queries[e]=t="string"==typeof(t=d("."+t).css("font-family"))||t instanceof String?t.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g,""):t)},add_custom_rule:function(e,t){t===n&&Foundation.stylesheet?Foundation.stylesheet.insertRule(e,Foundation.stylesheet.cssRules.length):Foundation.media_queries[t]!==n&&Foundation.stylesheet.insertRule("@media "+Foundation.media_queries[t]+"{ "+e+" }")},image_loaded:function(e,t){var n=this,i=e.length;0===i&&t(e),e.each(function(){s(n.S(this),function(){0===--i&&t(e)})})},random_str:function(){return this.fidx||(this.fidx=0),this.prefix=this.prefix||[this.name||"F",(+new Date).toString(36)].join("-"),this.prefix+(this.fidx++).toString(36)},match:function(e){return l.matchMedia(e).matches},is_small_up:function(){return this.match(Foundation.media_queries.small)},is_medium_up:function(){return this.match(Foundation.media_queries.medium)},is_large_up:function(){return this.match(Foundation.media_queries.large)},is_xlarge_up:function(){return this.match(Foundation.media_queries.xlarge)},is_xxlarge_up:function(){return this.match(Foundation.media_queries.xxlarge)},is_small_only:function(){return!(this.is_medium_up()||this.is_large_up()||this.is_xlarge_up()||this.is_xxlarge_up())},is_medium_only:function(){return this.is_medium_up()&&!this.is_large_up()&&!this.is_xlarge_up()&&!this.is_xxlarge_up()},is_large_only:function(){return this.is_medium_up()&&this.is_large_up()&&!this.is_xlarge_up()&&!this.is_xxlarge_up()},is_xlarge_only:function(){return this.is_medium_up()&&this.is_large_up()&&this.is_xlarge_up()&&!this.is_xxlarge_up()},is_xxlarge_only:function(){return this.is_medium_up()&&this.is_large_up()&&this.is_xlarge_up()&&this.is_xxlarge_up()}}},d.fn.foundation=function(){var e=Array.prototype.slice.call(arguments,0);return this.each(function(){return Foundation.init.apply(Foundation,[this].concat(e)),this})}}(jQuery,window,window.document),function(s,a,l){"use strict";Foundation.libs.topbar={name:"topbar",version:"5.5.1",settings:{index:0,sticky_class:"sticky",custom_back_text:!0,back_text:"Back",mobile_show_parent_link:!0,is_hover:!0,scrolltop:!0,sticky_on:"all"},init:function(e,t,n){Foundation.inherit(this,"add_custom_rule register_media throttle");var i=this;i.register_media("topbar","foundation-mq-topbar"),this.bindings(t,n),i.S("["+this.attr_name()+"]",this.scope).each(function(){var e=s(this),t=e.data(i.attr_name(!0)+"-init");i.S("section, .top-bar-section",this);e.data("index",0);var n=e.parent();n.hasClass("fixed")||i.is_sticky(e,n,t)?(i.settings.sticky_class=t.sticky_class,(i.settings.sticky_topbar=e).data("height",n.outerHeight()),e.data("stickyoffset",n.offset().top)):e.data("height",e.outerHeight()),t.assembled||i.assemble(e),t.is_hover?i.S(".has-dropdown",e).addClass("not-click"):i.S(".has-dropdown",e).removeClass("not-click"),i.add_custom_rule(".f-topbar-fixed { padding-top: "+e.data("height")+"px }"),n.hasClass("fixed")&&i.S("body").addClass("f-topbar-fixed")})},is_sticky:function(e,t,n){var i=t.hasClass(n.sticky_class),o=matchMedia(Foundation.media_queries.small).matches,r=matchMedia(Foundation.media_queries.medium).matches,t=matchMedia(Foundation.media_queries.large).matches;return!(!i||"all"!==n.sticky_on)||(!(!(i&&this.small()&&-1!==n.sticky_on.indexOf("small")&&o)||r||t)||(!(!(i&&this.medium()&&-1!==n.sticky_on.indexOf("medium")&&o&&r)||t)||(!!(i&&this.large()&&-1!==n.sticky_on.indexOf("large")&&o&&r&&t)||!(!i||!navigator.userAgent.match(/(iPad|iPhone|iPod)/g)))))},toggle:function(e){var t=this,n=e?t.S(e).closest("["+this.attr_name()+"]"):t.S("["+this.attr_name()+"]"),i=n.data(this.attr_name(!0)+"-init"),e=t.S("section, .top-bar-section",n);t.breakpoint()&&(t.rtl?(e.css({right:"0%"}),s(">.name",e).css({right:"100%"})):(e.css({left:"0%"}),s(">.name",e).css({left:"100%"})),t.S("li.moved",e).removeClass("moved"),n.data("index",0),n.toggleClass("expanded").css("height","")),i.scrolltop?n.hasClass("expanded")?n.parent().hasClass("fixed")&&(i.scrolltop?(n.parent().removeClass("fixed"),n.addClass("fixed"),t.S("body").removeClass("f-topbar-fixed"),a.scrollTo(0,0)):n.parent().removeClass("expanded")):n.hasClass("fixed")&&(n.parent().addClass("fixed"),n.removeClass("fixed"),t.S("body").addClass("f-topbar-fixed")):(t.is_sticky(n,n.parent(),i)&&n.parent().addClass("fixed"),n.parent().hasClass("fixed")&&(n.hasClass("expanded")?(n.addClass("fixed"),n.parent().addClass("expanded"),t.S("body").addClass("f-topbar-fixed")):(n.removeClass("fixed"),n.parent().removeClass("expanded"),t.update_sticky_positioning())))},timer:null,events:function(e){var o=this,r=this.S;r(this.scope).off(".topbar").on("click.fndtn.topbar","["+this.attr_name()+"] .toggle-topbar",function(e){e.preventDefault(),o.toggle(this)}).on("click.fndtn.topbar",'.top-bar .top-bar-section li a[href^="#"],['+this.attr_name()+'] .top-bar-section li a[href^="#"]',function(e){var t=s(this).closest("li");!o.breakpoint()||t.hasClass("back")||t.hasClass("has-dropdown")||o.toggle()}).on("click.fndtn.topbar","["+this.attr_name()+"] li.has-dropdown",function(e){var t=r(this),n=r(e.target),i=t.closest("["+o.attr_name()+"]").data(o.attr_name(!0)+"-init");n.data("revealId")?o.toggle():o.breakpoint()||i.is_hover&&!Modernizr.touch||(e.stopImmediatePropagation(),t.hasClass("hover")?(t.removeClass("hover").find("li").removeClass("hover"),t.parents("li.hover").removeClass("hover")):(t.addClass("hover"),s(t).siblings().removeClass("hover"),"A"===n[0].nodeName&&n.parent().hasClass("has-dropdown")&&e.preventDefault()))}).on("click.fndtn.topbar","["+this.attr_name()+"] .has-dropdown>a",function(e){var t,n,i;o.breakpoint()&&(e.preventDefault(),i=(n=(t=r(this)).closest("["+o.attr_name()+"]")).find("section, .top-bar-section"),t.next(".dropdown").outerHeight(),e=t.closest("li"),n.data("index",n.data("index")+1),e.addClass("moved"),o.rtl?(i.css({right:-100*n.data("index")+"%"}),i.find(">.name").css({right:100*n.data("index")+"%"})):(i.css({left:-100*n.data("index")+"%"}),i.find(">.name").css({left:100*n.data("index")+"%"})),n.css("height",t.siblings("ul").outerHeight(!0)+n.data("height")))}),r(a).off(".topbar").on("resize.fndtn.topbar",o.throttle(function(){o.resize.call(o)},50)).trigger("resize").trigger("resize.fndtn.topbar").load(function(){r(this).trigger("resize.fndtn.topbar")}),r("body").off(".topbar").on("click.fndtn.topbar",function(e){0.name").css({right:100*n.data("index")+"%"})):(e.css({left:-100*n.data("index")+"%"}),e.find(">.name").css({left:100*n.data("index")+"%"})),0===n.data("index")?n.css("height",""):n.css("height",t.outerHeight(!0)+n.data("height")),setTimeout(function(){i.removeClass("moved")},300)}),r(this.scope).find(".dropdown a").focus(function(){s(this).parents(".has-dropdown").addClass("hover")}).blur(function(){s(this).parents(".has-dropdown").removeClass("hover")})},resize:function(){var r=this;r.S("["+this.attr_name()+"]").each(function(){var e,t,n=r.S(this),i=n.data(r.attr_name(!0)+"-init"),o=n.parent("."+r.settings.sticky_class);r.breakpoint()||(t=n.hasClass("expanded"),n.css("height","").removeClass("expanded").find("li").removeClass("hover"),t&&r.toggle(n)),r.is_sticky(n,o,i)&&(o.hasClass("fixed")?(o.removeClass("fixed"),e=o.offset().top,r.S(l.body).hasClass("f-topbar-fixed")&&(e-=n.data("height")),n.data("stickyoffset",e),o.addClass("fixed")):(e=o.offset().top,n.data("stickyoffset",e)))})},breakpoint:function(){return!matchMedia(Foundation.media_queries.topbar).matches},small:function(){return matchMedia(Foundation.media_queries.small).matches},medium:function(){return matchMedia(Foundation.media_queries.medium).matches},large:function(){return matchMedia(Foundation.media_queries.large).matches},assemble:function(e){var i=this,o=e.data(this.attr_name(!0)+"-init"),t=i.S("section, .top-bar-section",e);t.detach(),i.S(".has-dropdown>a",t).each(function(){var e=i.S(this),t=e.siblings(".dropdown"),n=e.attr("href");t.find(".title.back").length||(n=1==o.mobile_show_parent_link&&n?s('

  • "):s('
  • '),1==o.custom_back_text?s("h5>a",n).html(o.back_text):s("h5>a",n).html("« "+e.html()),t.prepend(n))}),t.appendTo(e),this.sticky(),this.assembled(e)},assembled:function(e){e.data(this.attr_name(!0),s.extend({},e.data(this.attr_name(!0)),{assembled:!0}))},height:function(e){var t=0,n=this;return s("> li",e).each(function(){t+=n.S(this).outerHeight(!0)}),t},sticky:function(){var e=this;this.S(a).on("scroll",function(){e.update_sticky_positioning()})},update_sticky_positioning:function(){var e,t="."+this.settings.sticky_class,n=this.S(a),i=this;i.settings.sticky_topbar&&i.is_sticky(this.settings.sticky_topbar,this.settings.sticky_topbar.parent(),this.settings)&&(e=this.settings.sticky_topbar.data("stickyoffset"),i.S(t).hasClass("expanded")||(n.scrollTop()>e?i.S(t).hasClass("fixed")||(i.S(t).addClass("fixed"),i.S("body").addClass("f-topbar-fixed")):n.scrollTop()<=e&&i.S(t).hasClass("fixed")&&(i.S(t).removeClass("fixed"),i.S("body").removeClass("f-topbar-fixed"))))},off:function(){this.S(this.scope).off(".fndtn.topbar"),this.S(a).off(".fndtn.topbar")},reflow:function(){}}}(jQuery,window,window.document),function(p,n,f){"use strict";Foundation.libs.clearing={name:"clearing",version:"5.5.1",settings:{templates:{viewing:'×'},close_selectors:".clearing-close, div.clearing-blackout",open_selectors:"",skip_selector:"",touch_label:"",init:!1,locked:!1},init:function(e,t,n){var i=this;Foundation.inherit(this,"throttle image_loaded"),this.bindings(t,n),i.S(this.scope).is("["+this.attr_name()+"]")?this.assemble(i.S("li",this.scope)):i.S("["+this.attr_name()+"]",this.scope).each(function(){i.assemble(i.S("li",this))})},events:function(e){var s=this,a=s.S,t=p(".scroll-container");0'),t="",null!=(e=n.detach())[0]&&(t=e[0].outerHTML,e=this.S("#foundationClearingHolder"),t='",n='
    '+n.data(this.attr_name(!0)+"-init").templates.viewing+t+"
    ",t=this.settings.touch_label,Modernizr.touch&&(n=p(n).find(".clearing-touch-label").html(t).end()),e.after(n).remove()))},open:function(e,t,n){var i=this,o=p(f.body),r=n.closest(".clearing-assembled"),s=i.S("div",r).first(),a=i.S(".visible-img",s),l=i.S("img",a).not(e),c=i.S(".clearing-touch-label",s),d=!1;function u(){setTimeout(function(){this.image_loaded(l,function(){1!==l.outerWidth()||d?function(e){p(e).css("visibility","visible"),o.css("overflow","hidden"),r.addClass("clearing-blackout"),s.addClass("clearing-container"),a.show(),this.fix_height(n).caption(i.S(".clearing-caption",a),i.S("img",n)).center_and_label(e,c).shift(t,n,function(){n.closest("li").siblings().removeClass("visible"),n.closest("li").addClass("visible")}),a.trigger("opened.fndtn.clearing")}.call(this,l):u.call(this)}.bind(this))}.bind(this),100)}p("body").on("touchmove",function(e){e.preventDefault()}),l.error(function(){d=!0}),this.locked()||(a.trigger("open.fndtn.clearing"),l.attr("src",this.load(e)).css("visibility","hidden"),u.call(this))},close:function(e,t){e.preventDefault();var n,i=(n=p(t),/blackout/.test(n.selector)?n:n.closest(".clearing-blackout")),n=p(f.body);return t===e.target&&i&&(n.css("overflow",""),e=p("div",i).first(),(n=p(".visible-img",e)).trigger("close.fndtn.clearing"),this.settings.prev_index=0,p("ul["+this.attr_name()+"]",i).attr("style","").closest(".clearing-blackout").removeClass("clearing-blackout"),e.removeClass("clearing-container"),n.hide(),n.trigger("closed.fndtn.clearing")),p("body").off("touchmove"),!1},is_open:function(e){return 0t.outerHeight()&&e.addClass("fix-height")}).closest("ul").width(100*e.length+"%"),this},update_paddles:function(e){var t=(e=e.closest("li")).closest(".carousel").siblings(".visible-img");0this.settings.prev_index?"right":e-1Previous',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return c('',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return c('