Merge branch 'master' into pr/8215

This commit is contained in:
PabstMirror
2024-01-06 18:59:24 -06:00
936 changed files with 14271 additions and 40143 deletions

View File

@ -36,7 +36,7 @@ We welcome anyone to contribute to this repository. Issues that we are actively
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.
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, use GitHub's draft feature. This will mark the PR as a work in progress and will prevent it from being merged until you mark it as ready for review.
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://ace3.acemod.org/wiki/development/).

View File

@ -4,6 +4,6 @@
### 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}`.
- 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}`.

View File

@ -5,6 +5,9 @@ branches:
name-template: 'Version $NEXT_PATCH_VERSION'
tag-template: 'v$NEXT_PATCH_VERSION'
sort-by: title # sort alphabetically
sort-direction: ascending
categories:
- title: '**ADDED:**'
labels:
@ -21,6 +24,10 @@ categories:
labels:
- 'kind/cleanup'
- 'area/compatibility'
- 'kind/change'
- title: '**SETTINGS:**'
labels:
- 'kind/setting'
- title: '**TRANSLATIONS:**'
labels:
- 'area/translations'
@ -39,5 +46,5 @@ template: |
replacers:
# Category titles
- search: '/\#\# (\*\*(ADDED|FIXED|IMPROVED|CHANGED|TRANSLATIONS):\*\*)/g'
- search: '/\#\# (\*\*(ADDED|FIXED|IMPROVED|CHANGED|SETTINGS|TRANSLATIONS):\*\*)/g'
replace: '$1'

View File

@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Validate SQF
run: python3 tools/sqf_validator.py
- name: Validate Config
@ -22,6 +22,8 @@ jobs:
run: python3 tools/check_strings.py
- name: Check for BOM
uses: arma-actions/bom-check@master
with:
path: 'addons'
- name: Validate function headers
run: python3 docs/tools/document_functions.py --debug
@ -29,7 +31,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Lint (sqflint)
uses: arma-actions/sqflint@master
continue-on-error: true # No failure due to many false-positives
@ -38,7 +40,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup HEMTT
uses: arma-actions/hemtt@v1
- name: Run HEMTT build

View File

@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Python packages
run: |
pip3 install wheel
@ -33,7 +33,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Extract Dependencies
run: python3 tools/extract_dependencies.py --markdown

View File

@ -14,7 +14,7 @@ jobs:
steps:
- name: Checkout the source code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Build
shell: cmd
run: |

44
.github/workflows/hemtt.yml vendored Normal file
View File

@ -0,0 +1,44 @@
name: HEMTT
on:
push:
branches:
- master
pull_request_target:
jobs:
windows:
runs-on: windows-latest
steps:
- name: Install Arma 3 Tools
uses: arma-actions/arma3-tools@master
with:
toolsUrl: ${{ secrets.ARMA3_TOOLS_URL }}
- name: Checkout the source code
uses: actions/checkout@v4
- name: Setup HEMTT
uses: arma-actions/hemtt@v1
- name: Checkout pull request
uses: actions/checkout@v4
if: ${{ github.event_name == 'pull_request_target' }}
with:
path: pullrequest
ref: 'refs/pull/${{ github.event.number }}/merge'
- name: Replace addons with pull request addons
if: ${{ github.event_name == 'pull_request_target' }}
run: |
rm -r addons\
rm -r optionals\
rm -r include\
xcopy /e /h /q pullrequest\addons addons\
xcopy /e /h /q pullrequest\optionals optionals\
xcopy /e /h /q pullrequest\include include\
- name: Run HEMTT build
run: hemtt build
- name: Rename build folder
run: mv .hemttout/build .hemttout/@ace
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: ace3-${{ github.sha }}
path: .hemttout/@*

View File

@ -25,7 +25,7 @@ jobs:
Invoke-WebRequest "$env:RHSUSF_URL" -OutFile rhsusf.zip
$files = @("arma3.zip", "rhsafrf.zip", "rhsgref.zip", "rhssaf.zip", "rhsusf.zip")
ForEach ($file in $files) {
Extract-7Zip -Path $file -DestinationPath .
Expand-7ZipArchive -Path $file -DestinationPath .
Remove-Item $file
}
env:
@ -35,18 +35,18 @@ jobs:
RHSSAF_URL: ${{ secrets.RHSSAF_URL }}
RHSUSF_URL: ${{ secrets.RHSUSF_URL }}
- name: Checkout CBA A3
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
path: x\cba
ref: master
repository: CBATeam/CBA_A3.git
- name: Checkout ACE3
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
path: z\ace
persist-credentials: false
- name: Checkout pull request
uses: actions/checkout@v3
uses: actions/checkout@v4
if: ${{ github.event_name == 'pull_request_target' }}
with:
path: pullrequest

View File

@ -18,20 +18,16 @@ include = [
[version]
git_hash = 0
# Unused in HEMTT v1.11 or higher, kept for backwards compatibility
[asc]
enabled = true
exclude = [
"/initsettings.sqf",
"/initkeybinds.sqf",
"/xeh_prep.sqf",
".inc.sqf",
"/dev/",
"medical_ai/statemachine.sqf",
"common/functions/fnc_dummy.sqf",
"zeus/functions/fnc_zeusAttributes.sqf",
]
[hemtt.config]
preset = "Hemtt"
[hemtt.launch]
workshop = [
"450814997", # CBA_A3
@ -60,3 +56,12 @@ workshop = [
dlc = [
"Western Sahara",
]
[hemtt.launch.rhs]
workshop = [
"450814997", # CBA_A3's Workshop ID
"843425103", # RHS AFRF Workshop ID
"843577117", # RHS USAF Workshop ID
"843593391", # RHS GREF Workshop ID
"843632231", # RHS SAF Workshop ID
]

View File

@ -10,7 +10,7 @@ Brett Mayson
bux578 <github@jonathandavid.de>
commy2
Dahlgren
tcvm <baileydanyluk@gmail.com>
Drofseh <drofseh.arma@gmail.com>
esteldunedain <nicolas.d.badano@gmail.com>
Felix Wiegand <koffeinflummi@gmail.com>
Garth "L-H" de Wet <garthofhearts@gmail.com>
@ -18,14 +18,17 @@ Giallustio
Glowbal
Grim
Janus
johnb43
jokoho482 <jokoho482@gmail.com>
Jonpas <jonpas33@gmail.com>
Kieran
kymckay
mharis001 <mhariszakar@gmail.com>
MikeMF
NouberNou
PabstMirror <pabstmirror@gmail.com>
Ruthberg <ulteq@web.de>
tcvm <baileydanyluk@gmail.com>
tpM
veteran29
ViperMaul
@ -79,7 +82,6 @@ diwako
dixon13 <dixonbegay@gmail.com>
Drift_91
Drill <drill87@gmail.com>
Drofseh <drofseh@gmail.com>
Dslyecxi <dslyecxi@gmail.com>
Dudakov aka [OMCB]Kaban <dudakov.s@gmail.com>
Eclipser <jms@modeemi.fi>
@ -113,6 +115,7 @@ havena <silveredenis@gmail.com>
Hawkins
Head <brobergsebastian@gmail.com>
Hybrid V
Hypoxic <martini_a@outlook.com>
JasperRab <jasper@jasperrab.eu>
JDT
john681611 <john681611@hotmail.com>
@ -134,7 +137,6 @@ MarcBook
meat <p.humberdroz@gmail.com>
Michail Nikolaev
MikeMatrix <m.braun92@gmail.com>
MikeMF
mjc4wilton <mjc4wilton@gmail.com>
Mysteryjuju
nic547 <nic547@outlook.com>

View File

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

View File

@ -1,6 +1,6 @@
#include "script_component.hpp"
#include "initKeybinds.sqf"
#include "initKeybinds.inc.sqf"
GVAR(currentbulletID) = -1;

View File

@ -6,6 +6,6 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
#include "initSettings.inc.sqf"
ADDON = true;

View File

@ -4,7 +4,7 @@
<Key ID="STR_ACE_Advanced_Ballistics_WindInfoKey">
<English>Show Wind Info</English>
<Polish>Pokaż inf. o wietrze</Polish>
<Italian>Mostra indicazioni del vento</Italian>
<Italian>Mostra indicazioni vento</Italian>
<Russian>Показать информацию о ветре</Russian>
<French>Afficher les infos sur le vent</French>
<Spanish>Mostrar información del viento</Spanish>
@ -46,7 +46,7 @@
<Hungarian>Fejlett ballisztika</Hungarian>
<Russian>Продвинутая баллистика</Russian>
<Italian>Balistica Avanzata</Italian>
<Japanese>アドバンスド バリスティックス</Japanese>
<Japanese>アドバンスド弾道計算</Japanese>
<Korean>고급 탄도학</Korean>
<Chinese>先進彈道系統</Chinese>
<Chinesesimp>进阶弹道系统</Chinesesimp>
@ -63,7 +63,7 @@
<Hungarian>Fejlett ballisztika</Hungarian>
<Russian>Продвинутая баллистика</Russian>
<Italian>Balistica Avanzata</Italian>
<Japanese>アドバンスド バリスティックスを有効化</Japanese>
<Japanese>アドバンスド弾道計算を有効化</Japanese>
<Korean>고급 탄도학</Korean>
<Chinese>先進彈道系統</Chinese>
<Chinesesimp>进阶弹道系统</Chinesesimp>
@ -80,7 +80,7 @@
<Hungarian>Engedélyezi a fejlett ballisztikát</Hungarian>
<Russian>Включает продвинутую баллистику</Russian>
<Italian>Abilita Balistica Avanzata</Italian>
<Japanese>アドバンスド バリスティックスを有効化します。</Japanese>
<Japanese>アドバンスド弾道計算は高度な弾道計算処理を有効化します。</Japanese>
<Korean>고급 탄도학을 적용합니다</Korean>
<Chinese>啟用先進彈道系統</Chinese>
<Chinesesimp>启用进阶弹道系统</Chinesesimp>
@ -106,8 +106,8 @@
<English>Simulates slight variations in muzzle velocity between each shot</English>
<Spanish>Simula variaciones ligeras de velocidad entre cada disparo</Spanish>
<German>Simuliert leichte Variationen der Mündungsgeschwindigkeit zwischen jedem Schuss.</German>
<Japanese>発射毎の銃口初速の変動をシミュレートします。</Japanese>
<Italian>Simula lievi variazioni della velocità della volata tra un colpo e l'altro</Italian>
<Japanese>発射毎の銃口初速のわずかな変動をシミュレートします。</Japanese>
<Italian>Simula piccole variazioni della velocità alla volata tra ogni colpo.</Italian>
<Korean>각 사격 사이에 총구속도 변화를 시뮬레이션 합니다.</Korean>
<Chinese>模擬每發子彈的槍口初速都略有不同</Chinese>
<Chinesesimp>模拟每发子弹的枪口初速都略有不同</Chinesesimp>
@ -128,8 +128,8 @@
<French>Activer la simulation de la température</French>
<Hungarian>Lőszer-hő szimuláció engedélyezése</Hungarian>
<Russian>Симуляция температуры для боеприпасов</Russian>
<Italian>Abilita simulazione della temperatura delle munizioni</Italian>
<Japanese>弾薬温度シミュレーションを有効化</Japanese>
<Italian>Abilita simulazione temperatura munizioni</Italian>
<Japanese>弾薬温度シミュレーションを有効化</Japanese>
<Korean>탄약 온도 구현 적용</Korean>
<Chinese>啟用彈藥溫度模擬系統</Chinese>
<Chinesesimp>启用弹药温度模拟系统</Chinesesimp>
@ -145,7 +145,7 @@
<French>La vitesse initiale varie en fonction de la température des munitions.</French>
<Hungarian>A kezdősebesség a lőszer hőmérsékletétől függően változó</Hungarian>
<Russian>Начальная скорость пули зависит от температуры</Russian>
<Italian>La velocità dello sparo varia a seconda della temperatura delle munizioni</Italian>
<Italian>La velocità alla volata varia a seconda della temperatura delle munizioni.</Italian>
<Japanese>弾薬の温度により銃口初速を変動させます。</Japanese>
<Korean>탄약 온도에 비례해 총구 속도가 달라집니다</Korean>
<Chinese>子彈初速將隨彈藥溫度而有所變化</Chinese>
@ -162,8 +162,8 @@
<French>Activer la simulation de la longueur de canon</French>
<Hungarian>Csőhossz-szimuláció engedélyezése</Hungarian>
<Russian>Симуляция длины ствола</Russian>
<Italian>Abilita simulazione della lunghezza della canna</Italian>
<Japanese>銃身長シミュレーションを有効化</Japanese>
<Italian>Abilita simulazione lunghezza canna</Italian>
<Japanese>銃身長シミュレーションを有効化</Japanese>
<Korean>총열 길이 구현 적용</Korean>
<Chinese>啟用槍管長度模擬系統</Chinese>
<Chinesesimp>启用枪管长度模拟系统</Chinesesimp>
@ -179,7 +179,7 @@
<French>La vitesse initiale varie en fonction de la longueur du canon.</French>
<Hungarian>A kezdősebesség a cső hosszától függően változó</Hungarian>
<Russian>Начальная скорость пули зависит от длины ствола</Russian>
<Italian>La velocità di sparo varia a seconda della lunghezza della canna</Italian>
<Italian>La velocità alla volata varia a seconda della lunghezza della canna.</Italian>
<Japanese>銃身長により銃口初速を変動させます。</Japanese>
<Korean>총구 속도가 총열에 비례해 달라집니다</Korean>
<Chinese>子彈初速將隨槍管長度而有所變化</Chinese>
@ -196,7 +196,7 @@
<French>Activer l'effet de balle traçante</French>
<Hungarian>Nyomkövető-effekt engedélyezése</Hungarian>
<Russian>Следы пуль</Russian>
<Italian>Abilita effetto dei Proiettili Traccianti</Italian>
<Italian>Abilita effetto di traccia proiettile</Italian>
<Japanese>弾丸の軌跡エフェクトを有効化</Japanese>
<Korean>예광탄 효과 적용</Korean>
<Chinese>啟用曳光彈效果</Chinese>
@ -213,7 +213,7 @@
<French>Active un effet de balle traçante pour les munitions de gros calibre (seulement visible en utilisant une optique à fort grossissement).</French>
<Hungarian>Engedélyezi a nagy kaliberű lövedékek nyomának vizuális követését (csak nagy teljesítményű optikán keresztül látható)</Hungarian>
<Russian>Включает эффект следов пуль для больших калибров (видны только через мощную оптику)</Russian>
<Italian>Abilita effetto dei proiettili traccianti di alto calibro (visibile solo attraverso ottiche ad alto potenziale)</Italian>
<Italian>Abilita effetto di traccia lasciata da proiettili di alto calibro (visibile solo attraverso ottiche ad alto ingrandimento)</Italian>
<Japanese>大口径弾の軌跡エフェクトを有効化します。 (高性能光学機器を介してのみ見ることができます)</Japanese>
<Korean>대구경 탄환에 예광탄 효과를 적용합니다(오직 고성능 조준경 사용시에만 보입니다)</Korean>
<Chinese>啟用曳光彈效果給大口徑子彈 (只有透過高倍率光學瞄鏡才能看到)</Chinese>
@ -230,7 +230,7 @@
<French>Intervalle de simulation</French>
<Hungarian>Szimuláció intervalluma</Hungarian>
<Russian>Интервал симуляции</Russian>
<Italian>Intervallo Simulazione</Italian>
<Italian>Intervallo di Simulazione</Italian>
<Japanese>シミュレーション間隔</Japanese>
<Korean>구현 간격</Korean>
<Chinese>模擬間隔</Chinese>
@ -246,7 +246,7 @@
<French>Définit l'intervalle entre chacune des étapes de calcul.</French>
<Hungarian>Meghatározza a számítási lépések közötti időintervallumot</Hungarian>
<Russian>Определяет временной интервал между вычислениями</Russian>
<Italian>Definisce l'intervallo tra ogni step di calcolo</Italian>
<Italian>Definisce l'intervallo tra ogni passo del calcolo</Italian>
<Japanese>各シミュレーション毎の間隔を定義します。</Japanese>
<Korean>각 계산 단위의 간격을 정의합니다</Korean>
<Chinese>定義每個模擬計算之間的時間間隔</Chinese>
@ -263,7 +263,7 @@
<Hungarian>Szimuláció hatóköre</Hungarian>
<Russian>Радиус симуляции</Russian>
<Italian>Raggio Simulazione</Italian>
<Japanese>シミュレーションの範囲</Japanese>
<Japanese>シミュレーションの半径</Japanese>
<Korean>구현 범위</Korean>
<Chinese>模擬半徑</Chinese>
<Chinesesimp>模拟半径</Chinesesimp>
@ -279,8 +279,8 @@
<French>Définit le rayon autour du joueur (en mètres), dans lequel la balistique avancée est appliquée aux projectiles.</French>
<Hungarian>Meghatározza a játékos körüli hatókört (méterben), ahol a lövedékek fejlett ballisztikát használnak</Hungarian>
<Russian>Определяет радиус вокруг игрока (в метрах), в котором продвинутая баллистика применяется к снарядам</Russian>
<Italian>Definisce il raggio attorno al giocatore (in metri) per cui la Balistica Avanzata è applicata ai proiettili</Italian>
<Japanese>アドバンスド バリスティックスの適用半径範囲 (プレイヤー中心、メートル単位) を定義します。</Japanese>
<Italian>Definisce il raggio attorno al giocatore (in metri) entro il quale la Balistica Avanzata è applicata ai proiettili</Italian>
<Japanese>アドバンスド弾道計算の適用半径範囲 (プレイヤー中心、メートル単位) を定義します。</Japanese>
<Korean>플레이어 주위의 발사체를 고급 탄도학으로 정의하는 범위를 정합니다(미터)</Korean>
<Chinese>以玩家的半徑距離(公尺)定義先進彈道系統啟用範圍</Chinese>
<Chinesesimp>定义玩家周围的半径(米),在这个半径内,进阶弹道系统会被启用</Chinesesimp>
@ -296,8 +296,8 @@
<Hungarian>Ez a modul engedélyezi a fejlett ballisztikai szimulációt - a lövedékek röppályáját befolyásolni fogja a levegő hőmérséklete, légnyomás, páratartalom, gravitáció, a lövedék fajtája, valamint a fegyver, amiből kilőtték a lövedéket.</Hungarian>
<Russian>Этот модуль включает симуляцию продвинутой баллистики - при этом на траекторию полета снаряда влияют различные параметры, такие как температура воздуха, атмосферное давление, влажность, гравитация, тип боеприпаса и оружия, из которого произвели выстрел.</Russian>
<Spanish>Este módulo permite la simulación balística avanzada - es decir, la trayectoria de los proyectiles está influenciada por variables como la temperatura del aire, la presión atmosférica, la humedad, la gravedad, el tipo de municiones y el arma desde el que fue disparada.</Spanish>
<Italian>Questo modulo abilita la simulazione della Balistica Avanzata - cioè la traiettoria dei proiettili è influenzata da variabili come la temperatura dell'aria, pressione atmosferica, umidità, gravità, il tipo di munizione e l'arma da cui è sparata</Italian>
<Japanese>アドバンスド バリスティックスのシミュレーションを有効化します。 弾道は気温・気圧・湿度・重力・弾薬の種類・発射する武器などの変化による影響を受けるようになります。</Japanese>
<Italian>Questo modulo abilita la simulazione della Balistica Avanzata - essa comporta che la traiettoria dei proiettili è influenzata da variabili come la temperatura dell'aria, pressione atmosferica, umidità, gravità, il tipo di munizione e l'arma da cui è sparata.</Italian>
<Japanese>アドバンスド弾道計算のシミュレーションを有効化します。 弾道は気温・気圧・湿度・重力・弾薬の種類・発射する武器などの変化による影響を受けるようになります。</Japanese>
<Korean>이 모듈은 고급 탄도학을 적용시킵니다 - 이는 발사체의 궤적이 기온, 대기압, 습도, 중력, 탄환의 종류와 어느 무기에서 발사되는지에 따라 영향을 받습니다.</Korean>
<Chinese>該模塊實現先進的彈道仿真 - 這意味著子彈的軌跡是由空氣溫度、大氣壓力、濕度、重力、彈藥類型以及射擊的武器所影響</Chinese>
<Chinesesimp>该模块实现增强的弹道模拟—子弹的轨迹由空气温度、大气压力、湿度、重力、弹药类型和射击的武器等变量所影响</Chinesesimp>

View File

@ -17,7 +17,19 @@ if (!hasInterface) exitWith {};
};
}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor);
["multiplier", {GVAR(swayFactor)}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor);
["multiplier", {
switch (true) do {
case (isWeaponRested ACE_player): {
GVAR(swayFactor) * GVAR(restedSwayFactor)
};
case (isWeaponDeployed ACE_player): {
GVAR(swayFactor) * GVAR(deployedSwayFactor)
};
default {
GVAR(swayFactor)
};
};
}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor);
// recheck weapon inertia after weapon swap, change of attachments or switching unit
["weapon", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler;
@ -48,7 +60,7 @@ if (!hasInterface) exitWith {};
}, true] call CBA_fnc_addPlayerEventHandler;
// - Duty factors -------------------------------------------------------------
if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then {
if (["ace_medical"] call EFUNC(common,isModLoaded)) then {
[QEGVAR(medical,pain), { // 0->1.0, 0.5->1.05, 1->1.1
linearConversion [0, 1, (_this getVariable [QEGVAR(medical,pain), 0]), 1, 1.1, true];
}] call FUNC(addDutyFactor);
@ -56,7 +68,7 @@ if (!hasInterface) exitWith {};
linearConversion [6, 0, (_this getVariable [QEGVAR(medical,bloodVolume), 6]), 1, 2, true];
}] call FUNC(addDutyFactor);
};
if (["ACE_Dragging"] call EFUNC(common,isModLoaded)) then {
if (["ace_dragging"] call EFUNC(common,isModLoaded)) then {
[QEGVAR(dragging,isCarrying), {
[1, 3] select (_this getVariable [QEGVAR(dragging,isCarrying), false]);
}] call FUNC(addDutyFactor);

View File

@ -6,7 +6,7 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
#include "initSettings.inc.sqf"
GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40);
GVAR(dutyList) = createHashMap;

View File

@ -89,3 +89,21 @@
[0, 5, 1, 1],
true
] call CBA_fnc_addSetting;
[
QGVAR(restedSwayFactor),
"SLIDER",
[LSTRING(RestedSwayFactor), LSTRING(RestedSwayFactor_Description)],
LSTRING(DisplayName),
[0, 5, 1, 2],
true
] call CBA_fnc_addSetting;
[
QGVAR(deployedSwayFactor),
"SLIDER",
[LSTRING(DeployedSwayFactor), LSTRING(DeployedSwayFactor_Description)],
LSTRING(DisplayName),
[0, 5, 1, 2],
true
] call CBA_fnc_addSetting;

View File

@ -7,7 +7,7 @@
<German>ACE Erweiterte Ausdauer</German>
<Chinese>ACE 進階疲勞</Chinese>
<Chinesesimp>ACE 进阶体力</Chinesesimp>
<Japanese>ACE アドバンスド ファティーグ</Japanese>
<Japanese>ACE アドバンスド疲労</Japanese>
<Italian>ACE Fatica Avanzata</Italian>
<Korean>ACE 고급 피로도</Korean>
<French>ACE Fatigue avancée</French>
@ -41,7 +41,7 @@
<Polish>Wpływa na ogólną wydolność organizmu u wszystkich graczy bez ustawionego niestandardowego współczynnika. Więcej znaczy lepiej.</Polish>
<Korean>모든 성능이 임의로 설정된 값 없이 영향받습니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Impacte la performance globale de tous les joueurs n'ayant pas de facteur personnalisé.\nPlus la valeur est élevée, plus le joueur est performant.</French>
<Italian>Influenza qualsiasi prestazione di tutti i giocatori smuniti di un fattore personalizzato. Maggiore significa migliore.</Italian>
<Italian>Influenza la prestazione generale di tutti i giocatori smuniti di un fattore personalizzato. Maggiore significa migliore.</Italian>
<Chinese>影響所有玩家的體力表現,值越高代表體力越好</Chinese>
<Chinesesimp>影响所有玩家的体力表现,值越高代表体力越好</Chinesesimp>
<Russian>Влияет на общую производительность игроков, у которых не задано персональное значение.</Russian>
@ -56,7 +56,7 @@
<Polish>Wpływa na ogólną wydolność tej jednostki. Więcej znaczy lepiej.</Polish>
<Korean>모든 성능이 이 단위로 영향을 받습니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Impacte la performance globale de cette unité.\nPlus la valeur est élevée, plus l'unité est performante.</French>
<Italian>Influenza qualsiasi prestazione di questa unità. Maggiore significa migliore.</Italian>
<Italian>Influenza la prestazione personalizzata di questa unità. Maggiore significa migliore.</Italian>
<Chinese>影響這個單位的體力表現,值越高代表體力越好</Chinese>
<Chinesesimp>影响这个单位的体力表现,值越高代表体力越好</Chinesesimp>
<Russian>Влияет на общую производительность юнита.</Russian>
@ -87,7 +87,7 @@
<Polish>Wpływa na czas regeneracji podczas postoju. Więcej znaczy szybciej.</Polish>
<Korean>얼마나 빨리 회복하는지를 바꿉니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>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.</French>
<Italian>Determina in quanto tempo il giocatore recupera quando rilassato. Maggiore significa migliore.</Italian>
<Italian>Determina quanto velocemente il giocatore recupera le energie quando si ferma. Maggiore significa migliore.</Italian>
<Chinese>決定玩家休息多久就能回復體力,值越高恢復越快</Chinese>
<Chinesesimp>决定玩家休息多久就能恢复体力,值越高恢复越快</Chinesesimp>
<Russian>Изменяет скорость восстановления игрока во время отдыха. Чем выше, тем быстрее.</Russian>
@ -102,7 +102,7 @@
<Polish>Współczynnik masy ekwipunku</Polish>
<Korean>부담 요인</Korean>
<French>Facteur de charge</French>
<Italian>Fattore Caricamento</Italian>
<Italian>Fattore Carico</Italian>
<Chinese>負重量</Chinese>
<Chinesesimp>重量系数</Chinesesimp>
<Russian>Фактор нагрузки</Russian>
@ -117,7 +117,7 @@
<Polish>Zmniejsza lub zwiększa wpływ ciężaru ekwipunku na wydolność gracza. Zero oznacza kompletny brak wpływu na wydolność.</Polish>
<Korean>플레이어가 무게에 따라 얼마나 영향받는지를 증가시키거나 감소시킵니다. 0의 경우 플레이어가 장비 무게에 영향받지 않습니다.</Korean>
<French>Augmente ou 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.</French>
<Italian>Incrementa o decrementa quanto il peso influenza le prestazioni dei giocatori. Zero significa che il peso dell'equipaggiamento non ha alcuna influenza nelle prestazioni.</Italian>
<Italian>Determina quanto il peso trasportato influenza le prestazioni dei giocatori. Zero significa che il peso dell'equipaggiamento non influisce sulle prestazioni.</Italian>
<Chinese>增加或降低玩家所能承受的負重量. 如設定值為0, 代表裝備的重量將不會影響到玩家的體力表現</Chinese>
<Chinesesimp>增加或降低玩家所能承受的负重量。如设定值为0代表装备的重量将不会影响到玩家的体力表现</Chinesesimp>
<Russian>Увеличивает или уменьшает вес, влияющий на производительность игроков. Ноль означает, что вес снаряжения не влияет на производительность</Russian>
@ -147,7 +147,7 @@
<Polish>Wpływa na to w jakim stopniu stromy teren wpływa na utratę wytrzymałości. Więcej oznacza szybszą utratę wytrzymałości.</Polish>
<Korean>경사도에 따라 얼마나 피로해지는지를 정합니다. 값이 클수록 더 많은 피로를 유발합니다.</Korean>
<French>Définit à quel point un terrain escarpé réduit l'endurance du joueur.\nPlus la valeur est élevée, moins le joueur est endurant.</French>
<Italian>Stabilisce quanto la pendenza del terreno incrementa la perdita della stamina. Maggiore significa più stamina persa.</Italian>
<Italian>Determina quanto la pendenza del terreno incrementa la perdita della stamina. Maggiore significa più stamina persa.</Italian>
<Chinese>設定陡峭的地形將會影響多少體力的流失,值越高代表體力流失越快</Chinese>
<Chinesesimp>设定陡峭的地形将会影响多少体力的流失速度,值越高代表体力流失越快</Chinesesimp>
<Russian>Устанавливает, насколько крутая местность увеличивает потерю выносливости. Чем выше, тем быстрее теряется выносливость.</Russian>
@ -162,7 +162,7 @@
<Chinesesimp>抖动系数</Chinesesimp>
<Chinese>抖動因素</Chinese>
<French>Facteur de tremblement</French>
<Italian>Fattore di oscillazione</Italian>
<Italian>Fattore di Oscillazione</Italian>
<Polish>Czynnik kołysania</Polish>
<Russian>Фактор колебания прицела</Russian>
<Portuguese>Fator de Balanço de Mira</Portuguese>
@ -172,27 +172,63 @@
<Key ID="STR_ACE_Advanced_Fatigue_SwayFactor_Description">
<English>Influences the amount of weapon sway. Higher means more sway.</English>
<Spanish>Afecta al la estabilidad de la mira. Más alto significa más balanceo</Spanish>
<German>Beeinflusst den Faktor, wie ruhig man eine Waffe halten kann. Ein höherer Wert bedeutet weniger Stabilisierung</German>
<Japanese>武器を持つ手のぶれ度合いを設定します。 値が高ければ高いほど、手ぶれが強くなります。</Japanese>
<German>Beeinflusst, wie ruhig man eine Waffe halten kann. Ein höherer Wert bedeutet weniger Stabilisierung.</German>
<Japanese>武器の手ぶれの量に影響します。値が高いほど、手ぶれが強くなります。</Japanese>
<Chinesesimp>影响手持武器的晃动程度,数值越高,抖动的越厉害。</Chinesesimp>
<Chinese>影響手持武器晃動程度,數值越高抖動越厲害</Chinese>
<French>Influe sur l'amplitude du tremblement de l'arme. Une valeur plus élevée signifie plus de tremblement.</French>
<Italian>Influenza l'ammontare di oscillazione dell'arma. Maggiore significa più oscillazione.</Italian>
<Italian>Influenza l'aumento di oscillazione dell'arma quando affaticato. Maggiore significa più oscillazione.</Italian>
<Polish>Wpływa na poziom kołysania broni. Większa ilość znaczy większe kołysanie.</Polish>
<Russian>Влияет на колебания прицела оружия. Чем выше - тем больше.</Russian>
<Portuguese>Influencia a quantidade de balanço da mira da arma. Quanto maior, mais balanço.</Portuguese>
<Czech>Ovlivňuje množství kývání zbraní. Vyšší znamená více kývání.</Czech>
<Korean>손떨림의 정도를 정합니다. 높을 수록 많이 휘적입니다.</Korean>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RestedSwayFactor">
<English>Rested sway factor</English>
<French>Facteur de balancement au repos</French>
<Korean>휴식 시 손떨림 정도</Korean>
<Portuguese>Fator de balanço de mira em repouso</Portuguese>
<German>Verwacklungsfaktor, wenn aufgelegt</German>
<Italian>Fattore di Oscillazione Appoggiato</Italian>
<Japanese>静止時の手ぶれ係数</Japanese>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RestedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is rested.</English>
<French>Influence le degré de balancement de l'arme au repos.</French>
<Korean>무기가 아무런 행동도 하지 않는 동안 무기가 흔들리는 정도를 정합니다.</Korean>
<Portuguese>Influencia a quantidade de balanço de mira enquanto a arma está em repouso.</Portuguese>
<German>Beeinflusst, wie ruhig man die Waffe hält, während sie aufgelegt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è appoggiata.</Italian>
<Japanese>静止している時の武器の手ぶれの量に影響します。</Japanese>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_DeployedSwayFactor">
<English>Deployed sway factor</English>
<French>Facteur de balancement déployé</French>
<Korean>거치 시 손떨림 정도</Korean>
<Portuguese>Fator de balanço de mira em posição de tiro</Portuguese>
<German>Verwacklungsfaktor, wenn Zweibein aufgestellt ist.</German>
<Italian>Fattore di Oscillazione su Bipode</Italian>
<Japanese>展開時の手ぶれ係数</Japanese>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_DeployedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is deployed.</English>
<French>Influence le degré de balancement de l'arme déployée.</French>
<Korean>무기를 거치하는 동안 무기를 흔드는 정도를 정합니다.</Korean>
<Portuguese>Influencia a quantidade de balanço de mira enquanto a arma está em posição de tiro.</Portuguese>
<German>Beeinflusst, wie ruhig man die Waffen hält, während das Zweibein aufgestellt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è stabilizzata usando il bipode.</Italian>
<Japanese>武器の展開(Cキー)時の武器の手ぶれの量に影響します。</Japanese>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
<English>Enabled</English>
<Spanish>Activada</Spanish>
<German>Aktiv</German>
<Japanese>アドバンスド ファティーグを有効化</Japanese>
<Japanese>有効化</Japanese>
<Polish>Włączone</Polish>
<Korean>활성화</Korean>
<French>Activé</French>
<Italian>Abilitato</Italian>
<Italian>Abilitata</Italian>
<Chinese>啟用</Chinese>
<Chinesesimp>启用</Chinesesimp>
<Russian>Включена</Russian>
@ -203,11 +239,11 @@
<English>Enables/disables Advanced Fatigue.</English>
<Spanish>Activa/desactiva la fatiga avanzada</Spanish>
<German>Aktiviert/deaktiviert Advanced Fatigue.</German>
<Japanese>アドバンスド ファティーグを有効化します。</Japanese>
<Japanese>アドバンスド疲労は高度な疲労管理システムを有効化します。</Japanese>
<Polish>Włącza/wyłącza zaawansowaną wytrzymałość</Polish>
<Korean>고급 피로도 활성화/비활성화</Korean>
<French>Active/Désactive la fatigue avancée.</French>
<Italian>Abilita/disabilita la Fatica Avanzata.</Italian>
<Italian>Abilita/Disabilita la Fatica Avanzata.</Italian>
<Chinese>啟用/關閉進階體力.</Chinese>
<Chinesesimp>启用/关闭进阶体力。</Chinesesimp>
<Russian>Включает / Отключает Продвинутую усталость</Russian>
@ -251,7 +287,7 @@
<German>Blende Ausdauerleiste automatisch aus</German>
<Chinese>體力條自動淡去</Chinese>
<Chinesesimp>自动淡化体力条</Chinesesimp>
<Italian>Dissolvenza automatica della barra della stamina</Italian>
<Italian>Nascondi in automatico la barra della stamina</Italian>
<Czech>Automaticky schovat lištu výdrže</Czech>
<French>Fondu automatique de la barre d'endurance</French>
<Japanese>自動的にスタミナバーを非表示</Japanese>

View File

@ -1,6 +1,7 @@
#include "script_component.hpp"
// Fired XEH
GVAR(ammoEventHandlers) = createHashMap;
[QGVAR(throwFiredXEH), FUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
// Exit on HC

View File

@ -6,6 +6,6 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
#include "initSettings.inc.sqf"
ADDON = true;

View File

@ -20,14 +20,25 @@
*
* Public: No
*/
params ["_unit", "", "_muzzle", "", "_ammo"];
TRACE_1("Fired",_this);
{
_this call _x;
} forEach ((_this select 0) getVariable "cba_xeh_fired");
} forEach (_unit getVariable "cba_xeh_fired");
// Call muzzle fired EH
{
_this call compile getText (_x >> "fired");
} forEach (configProperties [configFile >> "CfgWeapons" >> "Throw" >> (_this select 2) >> "EventHandlers", "isClass _x", true]);
} forEach (configProperties [configFile >> "CfgWeapons" >> "Throw" >> _muzzle >> "EventHandlers", "isClass _x", true]);
// Call ammo fired EH
{ _this call _x } forEach (GVAR(ammoEventHandlers) getOrDefaultCall [_ammo, {
private _cfg = configFile >> "CfgAmmo" >> _ammo >> "EventHandlers";
private _eventHandlers = [];
{
private _eh = getText (_x >> "fired");
if (_eh != "") then { _eventHandlers pushBack compile _eh };
} forEach ([_cfg] + configProperties [_cfg, "isClass _x", true]);
_eventHandlers
}, true]);

View File

@ -5,7 +5,7 @@
<English>Advanced Throwing</English>
<Spanish>Lanzamiento Avanzado</Spanish>
<Russian>Улучшенный бросок гранат</Russian>
<Japanese>アドバンスド スローイング</Japanese>
<Japanese>アドバンスド投擲</Japanese>
<Polish>Zaawansowane rzucanie</Polish>
<German>Erweitertes Wurfsystem</German>
<Korean>고급 투척</Korean>
@ -21,7 +21,7 @@
<English>Allows changing advanced throwing behaviour.</English>
<Spanish>Permite modificar el comportamiento del lanzamiento avanzado</Spanish>
<Russian>Позволяет настраивать поведение улучшенного броска гранат.</Russian>
<Japanese>アドバンスド スローイングの動作挙動を変更します。</Japanese>
<Japanese>アドバンスド投擲は投擲の高度な動作挙動を変更可能にします。</Japanese>
<Polish>Zezwala na zmianę zachowania zaawansowanego trybu rzucania.</Polish>
<German>Erlaubt es, das Verhalten des erweiterten Wurfsystems zu ändern.</German>
<Korean>고급 투척 행위를 허가합니다</Korean>
@ -36,7 +36,7 @@
<English>Enable Advanced Throwing</English>
<Spanish>Activar Lanzamiento Avanzado</Spanish>
<Russian>Вкл. улучшенный бросок</Russian>
<Japanese>アドバンスド スローイングを有効化</Japanese>
<Japanese>アドバンスド投擲を有効化</Japanese>
<Polish>Aktywuj zaawansowane rzucanie</Polish>
<German>Aktiviere erweitertes Wurfsystem</German>
<Korean>고급 투척 활성화 </Korean>
@ -52,7 +52,7 @@
<English>Enables advanced throwing system.</English>
<Spanish>Activa el Lanzamiento Avanzado</Spanish>
<Russian>Включает систему улучшенного броска.</Russian>
<Japanese>アドバンスド スローイングを有効化します。</Japanese>
<Japanese>アドバンスド投擲は高度な投擲システムを有効化します。</Japanese>
<Polish>Aktywuje system zaawansowanego rzucania.</Polish>
<German>Aktiviert das erweiterte Wurfsystem.</German>
<Korean>고급 투척을 활성화 합니다</Korean>
@ -68,7 +68,7 @@
<English>Show Throw Arc</English>
<Spanish>Mostrar Arco de Lanzamiento</Spanish>
<Russian>Показать траекторию броска</Russian>
<Japanese>てき軌道を表示</Japanese>
<Japanese>軌道を表示</Japanese>
<Polish>Pokaż trasę lotu</Polish>
<German>Zeige Wurfbogen</German>
<Korean>투척 궤적 표시</Korean>
@ -84,7 +84,7 @@
<English>Enables visualization of the throw arc (where throwable will fly).</English>
<Spanish>Activa la visualización del arco de lanzamiento (donde irá el objeto lanzado)</Spanish>
<Russian>Включает визуализацию траектории броска (как полетит граната).</Russian>
<Japanese>てき軌道 (投てき物がどこに飛ぶか) の表示を有効化します。</Japanese>
<Japanese>軌道 (投物がどこに飛ぶか) の表示を有効化します。</Japanese>
<Polish>Wyświetla wizualizację trasy przelotu granatu.</Polish>
<German>Aktiviert die Visualisierung des Wurfbogens (wohin das Objekt geworfen werden wird).</German>
<Korean>투척 궤도를 시각화 합니다(투척물이 어디로 갈지)</Korean>
@ -99,12 +99,12 @@
<English>Show Throwing Mouse Controls</English>
<Spanish>Mostrar controles de ratón de lanzamiento</Spanish>
<Russian>Показывать управление мышью</Russian>
<Japanese>てきのマウス操作を表示</Japanese>
<Japanese>のマウス操作を表示</Japanese>
<Polish>Pokaż podpowiedzi sterowania myszą</Polish>
<German>Zeige Maussteuerung beim Werfen</German>
<Korean>마우스 조작 표시</Korean>
<French>Afficher les contrôles à la souris du lancé</French>
<Italian>Mostra Comandi Mouse Lancio</Italian>
<Italian>Mostra Comandi Mouse di Lancio</Italian>
<Chinese>顯示滑鼠投擲控制提示</Chinese>
<Chinesesimp>显示鼠标投掷控制提示</Chinesesimp>
<Portuguese>Mostrar os controles de mouse para Arremesso</Portuguese>
@ -114,7 +114,7 @@
<English>Enables visual cues for mouse controls when throwable is prepared.</English>
<Spanish>Activa muestras visuales para los controles del ratón cuando el objeto lanzable está preparado</Spanish>
<Russian>Включает отображение подсказок по управлению мышью, когда граната подготовлена.</Russian>
<Japanese>てき物を構える時、マウス操作の説明表示を有効化します。</Japanese>
<Japanese>物を構える時、マウス操作の説明表示を有効化します。</Japanese>
<Polish>Wyświetla podpowiedzi sterowania myszą kiedy obiekt miotany jest w ręku.</Polish>
<German>Aktiviert visuelle Hinweise zur Maussteuerung, wenn ein Objekt zum Werfen vorbereitet wird.</German>
<Korean>투척물을 준비시 마우스 조작을 시각화해서 보여줍니다</Korean>
@ -129,12 +129,12 @@
<English>Enable Throwables Pick Up</English>
<Spanish>Habilitar recoger objetos lanzados</Spanish>
<Russian>Вкл. подбор гранат</Russian>
<Japanese>てき物の拾い上げを有効化</Japanese>
<Japanese>物の拾い上げを有効化</Japanese>
<Polish>Zezwól na podnoszenie obiektów miotanych</Polish>
<German>Aktiviere Aufheben von Wurfobjekten</German>
<Korean>투척물 줍기 활성화</Korean>
<French>Permettre le ramassage d'objets lançables</French>
<Italian>Abilita Raccogli Oggetti</Italian>
<Italian>Abilita Raccolta Lanciabili</Italian>
<Chinese>啟用可撿取地面投擲物</Chinese>
<Chinesesimp>启用捡取地面投掷物</Chinesesimp>
<Portuguese>Permitir pegar arremessáveis</Portuguese>
@ -144,12 +144,12 @@
<English>Enables ability to pick up throwables from the ground.</English>
<Spanish>Activa la habilidad de coger objetos lanzados del suelo</Spanish>
<Russian>Включает возможность подбирать гранаты с земли.</Russian>
<Japanese>地面に落ちている投てき物を拾い上げる機能を有効化します。</Japanese>
<Japanese>地面に落ちている投物を拾い上げる機能を有効化します。</Japanese>
<Polish>Umożliwia podnoszenie obiektów miotanych z ziemi.</Polish>
<German>Aktiviert die Möglichkeit, geworfene Objekte wieder vom Boden aufzuheben.</German>
<Korean>땅에 떨어진 투척물을 주울 수 있게 해줍니다.</Korean>
<French>Active la possibilité de ramasser des objets lançables du sol.</French>
<Italian>Abilita la possibilità di raccogliere un oggetto lanciabile da terra.</Italian>
<Italian>Permette ai giocatori di raccogliere un oggetto lanciabile da terra.</Italian>
<Chinese>啟用後, 可撿取地面上的投擲物</Chinese>
<Chinesesimp>启用后,可捡取地面上的投掷物</Chinesesimp>
<Portuguese>Permite que objetos arremessados sejam pegos do chão. (ACE Menu de Interação)</Portuguese>
@ -159,12 +159,12 @@
<English>Enable Attached Throwables Pick Up</English>
<Spanish>Activar coger objetos lanzables que se enganchan</Spanish>
<Russian>Вкл. подбор прикрепленных гранат</Russian>
<Japanese>取り付けられた投てき物の拾い上げを有効化</Japanese>
<Japanese>装着済の投擲物の拾い上げを有効化</Japanese>
<Polish>Zezwól na podnoszenie przyczepionych obiektów miotanych</Polish>
<German>Aktiviere erneute Aufnahme befestigter Wurfobjekte</German>
<Korean>부착 투척물 줍기 활성화</Korean>
<French>Activer le ramassage d'objets lançables attachés</French>
<Italian>Abilita Raccogli Oggetti Lanciabili da altri Oggetti</Italian>
<Italian>Abilita Raccolta Lanciabili Attaccati</Italian>
<Chinese>啟用可撿取附著投擲物</Chinese>
<Chinesesimp>启用捡取附着投掷物</Chinesesimp>
<Portuguese>Permitir pegar arremessáveis fixados</Portuguese>
@ -174,12 +174,12 @@
<English>Enables ability to pick up throwables from attached objects.</English>
<Spanish>Activa la habilidad de lanzar objetos enganchados</Spanish>
<Russian>Включает возможность подбирать гранаты, прикрепленные к объектам.</Russian>
<Japanese>取り付けられた投てき物を拾い上げる機能を有効化します。</Japanese>
<Japanese>オブジェクトに装着された投擲可能物を拾い上げる機能を有効化します。</Japanese>
<Polish>Umożliwia podnoszenie obiektów miotanych przyczepionych do innych obiektów.</Polish>
<German>Aktiviert die Möglichkeit, befestigte Wurfobjekte erneut aufzunehmen.</German>
<Korean>부착된 투척물을 주울 수 있게 해줍니다.</Korean>
<French>Active la possibilité de ramasser des objets lançables attachés à d'autres objets.</French>
<Italian>Abilita la possibilità di raccogliere gli oggetti lanciabili dagli altri oggetti. </Italian>
<Italian>Permette ai giocatori di raccogliere gli oggetti lanciabili da altri oggetti attaccati.</Italian>
<Chinese>啟用後, 可撿取附著在物件上的投擲物</Chinese>
<Chinesesimp>启用后,可捡取附着在物体上的投掷物</Chinesesimp>
<Portuguese>Permite que arremessáveis fixados em objetos sejam pegos.</Portuguese>
@ -189,12 +189,12 @@
<English>Prepare/Change Throwable</English>
<Spanish>Preparar/Cambiar objetos lanzables</Spanish>
<Russian>Подготовить/заменить гранату</Russian>
<Japanese>てき物の準備/変更</Japanese>
<Japanese>物の準備/変更</Japanese>
<Polish>Przygotuj/zmień ob. miotany</Polish>
<German>Wurfobjekt vorbereiten/wechseln</German>
<Korean>투척물 준비/변경</Korean>
<French>Préparer/Changer d'objet lançable</French>
<Italian>Prepara/Cambia Oggetto lanciabile</Italian>
<Italian>Prepara/Cambia Oggetto Lanciabile</Italian>
<Chinese>準備/變更投擲物</Chinese>
<Chinesesimp>准备/变更投掷物</Chinesesimp>
<Portuguese>Preparar/Mudar Arremessável</Portuguese>
@ -204,12 +204,12 @@
<English>Throwable Drop Mode (Hold)</English>
<Spanish>Modo soltar objeto lanzable (Mantener pulsado)</Spanish>
<Russian>Режим броска гранаты (удерживать)</Russian>
<Japanese>てきモード (押している間)</Japanese>
<Japanese>モード (押している間)</Japanese>
<Polish>Tryb upuszczania ob. miotanego (przytrzymaj)</Polish>
<German>Wurfobjekt Fallmodus (halten)</German>
<Korean>투척물 떨어뜨리기 모드(꾹눌러서)</Korean>
<French>Mode de lancé de l'objet (Tenir)</French>
<Italian>Modalità Oggetto Gettabile (Mantenere)</Italian>
<Italian>Modalità Gettare (Tieni premuto)</Italian>
<Chinese>投擲模式 (按住)</Chinese>
<Chinesesimp>投掷模式(按住)</Chinesesimp>
<Portuguese>Modo de Arremesso (Segurar)</Portuguese>
@ -219,12 +219,12 @@
<English>Throwable Drop Mode (Toggle)</English>
<Spanish>Modo soltar objeto lanzable (interruptor)</Spanish>
<Russian>Режим броска гранаты (переключить)</Russian>
<Japanese>てきモード (切り替え)</Japanese>
<Japanese>モード (切り替え)</Japanese>
<Polish>Tryb upuszczania ob. miotanego (przełącz)</Polish>
<German>Wurfobjekt Fallmodus (umschalten)</German>
<Korean>투척물 떨어뜨리기 모드(토글)</Korean>
<French>Mode de lancé de l'objet (Basculer)</French>
<Italian>Modalità Oggetto lanciabile Gettabile (Interruttore)</Italian>
<Italian>Modalità Getta Oggetto (Cambia)</Italian>
<Chinese>投擲模式 (切換)</Chinese>
<Chinesesimp>投掷模式(切换)</Chinesesimp>
<Portuguese>Modo de Arremesso (Alternar)</Portuguese>
@ -239,7 +239,7 @@
<German>Scharf gemacht</German>
<Korean>뇌관 작동</Korean>
<French>amorcée</French>
<Italian>Armato</Italian>
<Italian>Innescato</Italian>
<Chinese>引信開始燃燒</Chinese>
<Chinesesimp>已开引信</Chinesesimp>
<Portuguese>Preparado</Portuguese>
@ -254,7 +254,7 @@
<German>Werfen</German>
<Korean>던지기</Korean>
<French>Lancer</French>
<Italian>Lanciare</Italian>
<Italian>Lancia</Italian>
<Chinese>投擲</Chinese>
<Chinesesimp>投掷</Chinesesimp>
<Portuguese>Arremessar</Portuguese>
@ -270,7 +270,7 @@
<German>(Scrollen) Modus wechseln</German>
<Korean>(마우스 휠) 모드 변경</Korean>
<French>(Défilement) Changer de mode</French>
<Italian>(Scorrere) Cambio Modalità</Italian>
<Italian>(Scorri) Cambia Modalità</Italian>
<Chinese>(滾輪) 變更模式</Chinese>
<Chinesesimp>(滚轮)变更模式</Chinesesimp>
<Portuguese>(Roda do Mouse) Alternar modo</Portuguese>
@ -286,10 +286,10 @@
<German>(Scrollen) Erweitern</German>
<Korean>(마우스 휠) 연장</Korean>
<French>(Défilement) Étendre</French>
<Italian>(Scorrere) Estendere</Italian>
<Italian>(Scorri) Estendi</Italian>
<Chinese>(滾輪) 延長</Chinese>
<Chinesesimp>(滚轮)延长</Chinesesimp>
<Portuguese>(Roda do Mouse) Extender</Portuguese>
<Portuguese>(Roda do Mouse) Estender</Portuguese>
<Czech>(Scrollovat) Oddálit</Czech>
<Turkish>(Tekerlek) Uzat</Turkish>
</Key>
@ -302,7 +302,7 @@
<German>(Klicken) Abkochen</German>
<Korean>(클릭) 예열</Korean>
<French>(Clique) Dégoupiller</French>
<Italian>(Click) Arma</Italian>
<Italian>(Click) Innesca</Italian>
<Chinese>(點擊) 提早拉開引信</Chinese>
<Chinesesimp>(点击)提早拉开引信</Chinesesimp>
<Portuguese>(Clique) Cozinhar</Portuguese>
@ -313,7 +313,7 @@
<English>Pick Up</English>
<Spanish>Coger</Spanish>
<Russian>Подобрать</Russian>
<Japanese>い上げる</Japanese>
<Japanese></Japanese>
<Polish>Podnieś</Polish>
<German>Aufheben</German>
<Korean>줍기</Korean>

View File

@ -11,6 +11,6 @@ if (isServer) then {
GVAR(assignNVGstate) = false;
};
#include "initSettings.sqf"
#include "initSettings.inc.sqf"
ADDON = true;

View File

@ -6,7 +6,7 @@
<Chinese>AI</Chinese>
<French>IA</French>
<Spanish>IA</Spanish>
<Italian>AI</Italian>
<Italian>IA</Italian>
<Polish>SI</Polish>
<Russian>ИИ</Russian>
<German>KI</German>
@ -85,13 +85,21 @@
<English>Auto-Equip NVGs</English>
<Polish>Automatyczne zakładanie NVG</Polish>
<German>Automatisch NVGs ausrüsten</German>
<Italian>Equipaggia NVG in automatico</Italian>
<Korean>야투경 자동 창착</Korean>
<French>Equipement JVN automatique</French>
<Portuguese>Equipar NVGs automaticamente</Portuguese>
<Japanese>暗視装置の自動装備</Japanese>
</Key>
<Key ID="STR_ACE_AI_AssignNVG_Description">
<English>Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory!</English>
<Polish>Zakłada NVG w nocy i zdejmuje je w ciągu dnia.\nNie dodaje NVG do ekwipunku!</Polish>
<German>Rüstet NVG nachts aus dem Inventar aus und entfernt es tagsüber.\nFügt keine NVGs zum Inventar hinzu!</German>
<Italian>Equipaggia NVG dall'inventario durante la notte, e li mette nell'inventario durante il giorno.\nNon aggiunge NVG all'inventario se non sono presenti.</Italian>
<Korean>야간에는 야투경을 소지품에 장착하고 주간에는 장착을 해제합니다.\n주의! 소지품에 야투경을 추가하는 것이 아닙니다!</Korean>
<French>Equipe des JVN pendant la nuit et les déséquipe le jour.\nN'ajoute pas les JVN dans l'intenvaire !</French>
<Portuguese>Equipa o NVG do inventário durante a noite e desequipa durante o dia.\nNão adiciona NVGs ao inventário!</Portuguese>
<Japanese>インベントリ内の暗視装置を夜間に装備し、日中は解除し収納します。\nこれはNVGをインベントリに追加しません。</Japanese>
</Key>
</Package>
</Project>

View File

@ -61,16 +61,19 @@
<Polish>30mm Odłamkowo-Burzące - Zapalające</Polish>
<Turkish>30mm Yüksek Patlayıcı </Turkish>
<German>30mm Hochexplosiv/Brandladung</German>
<Japanese>30mm 焼夷りゅう弾</Japanese>
<Italian>30mm Esplosivo/Incendiario</Italian>
<Japanese>30mm 焼夷榴弾</Japanese>
<Czech>30mm Tříštivo-trhavá zápalná střela</Czech>
<Russian>30мм Осколочно-Фугасный Зажигательный</Russian>
<Korean>30mm 고폭소이탄</Korean>
<Portuguese>30mm Alto-Explosivo Incendiária</Portuguese>
</Key>
<Key ID="STR_ACE_Aircraft_GatlingDescriptionShortHEI">
<English>30mm HEI</English>
<Spanish>30mm AEI</Spanish>
<Chinese>30毫米高爆燃燒</Chinese>
<Chinesesimp>30mm 高爆燃烧</Chinesesimp>
<Italian>30mm HEI</Italian>
<French>30 mm HEI</French>
<Polish>30mm OB-Z</Polish>
<Turkish>30mm HEI</Turkish>
@ -79,6 +82,7 @@
<Czech>30mm HEI</Czech>
<Russian>30мм ОФЗ</Russian>
<Korean>30mm HEI</Korean>
<Portuguese>30mm AEI</Portuguese>
</Key>
<Key ID="STR_ACE_Aircraft_GatlingDescriptionAP">
<English>30mm DU Armor Piercing</English>
@ -86,13 +90,15 @@
<Chinese>30毫米貧化鈾穿甲彈 </Chinese>
<Chinesesimp>30 mm 贫铀穿甲</Chinesesimp>
<French>30 mm UA Armor Piercing</French>
<Italian>30mm AP Uranio Impoverito</Italian>
<Polish>30mm Zubożony Uran - Przebijające</Polish>
<Turkish>30mm DU Zırh Delici</Turkish>
<German>30mm abgereichertes panzerbrechendes Uraniumgeschoss</German>
<Japanese>30mm DU 徹甲弾</Japanese>
<Japanese>30mm 劣化ウラン徹甲弾</Japanese>
<Czech>30mm Protipancéřová střela z ochuzeného Uranu</Czech>
<Russian>30мм ОУ Бронебойный Снаряд</Russian>
<Korean>30mm 열화우라늄 철갑탄</Korean>
<Portuguese>30mm DU Perfurante de Blindagem</Portuguese>
</Key>
<Key ID="STR_ACE_Aircraft_GatlingDescriptionShortAP">
<English>30mm DU AP</English>
@ -100,6 +106,7 @@
<Chinese>30毫米貧鈾穿甲</Chinese>
<Chinesesimp>30mm 贫铀穿甲</Chinesesimp>
<French>30 mm UA AP</French>
<Italian>30mm AP-UI</Italian>
<Polish>30mm ZU-P</Polish>
<Turkish>30mm DU AP</Turkish>
<German>30mm DU-PB</German>
@ -107,6 +114,7 @@
<Czech>30 mm DU AP</Czech>
<Russian>30мм ОУ БС</Russian>
<Korean>30mm DU AP</Korean>
<Portuguese>30mm DU AP</Portuguese>
</Key>
<Key ID="STR_ACE_Aircraft_GatlingDescriptionCM41">
<English>30mm Combat Mix 4:1 DU:HEI</English>
@ -114,13 +122,15 @@
<Chinese>30毫米戰鬥混合彈4:1 穿甲:高爆</Chinese>
<Chinesesimp>30mm 战斗混合 穿甲/高爆 4:1</Chinesesimp>
<French>30 mm Mix de Combat 4:1 UA:HEI</French>
<Italian>30mm Misto 4:1 UI:HEI</Italian>
<Polish>30mm Mieszanka bojowa 4:1 ZU:OB-Z</Polish>
<Turkish>30mm Combat Mix 4:1 DU:HEI</Turkish>
<German>30mm Kampfmischung 4:1 DU:HEB</German>
<Japanese>30mm コンバット ミックス 4:1 DU:HEI</Japanese>
<Japanese>30mm コンバット ミックス 4:1 劣化ウラン徹甲弾:焼夷榴弾</Japanese>
<Czech>30mm Bojový Mix 4:1 DU:HEI</Czech>
<Russian>30мм Смешанное боепитание 4:1 ОУ:ОФЗ</Russian>
<Korean>30mm 4:1 열화:고폭소이</Korean>
<Portuguese>30mm Mix de Combate 4:1 DU:AEI</Portuguese>
</Key>
<Key ID="STR_ACE_Aircraft_GatlingDescriptionShortCM41">
<English>30mm CM 4:1</English>
@ -128,6 +138,7 @@
<Chinese>30毫米 穿高混合 4:1</Chinese>
<Chinesesimp>30mm 穿爆混合 4:1</Chinesesimp>
<French>30 mm MdC 4:1</French>
<Italian>30mm Misto 4:1</Italian>
<Polish>30mm MB 4:1</Polish>
<Turkish>30mm CM 4:1</Turkish>
<German>30mm KM 4:1</German>
@ -142,10 +153,11 @@
<Chinese>30毫米戰鬥混合彈5:1 穿甲:高爆</Chinese>
<Chinesesimp>30 mm 战斗混合 穿甲/高爆 5:1</Chinesesimp>
<French>30 mm Mix de Combat 5:1 UA:HEI</French>
<Italian>30mm Misto 5:1 UI:HEI</Italian>
<Polish>30mm Mieszanka bojowa 5:1 ZU:OB-Z</Polish>
<Turkish>30mm Combat Mix 5:1 DU:HEI</Turkish>
<German>30mm Kampfmischung 5:1 DU:HEB</German>
<Japanese>30mm コンバット ミックス 5:1 DU:HEI</Japanese>
<Japanese>30mm コンバット ミックス 5:1 劣化ウラン徹甲弾:焼夷榴弾</Japanese>
<Czech>30mm Bojový Mix 5:1 DU:HEI</Czech>
<Russian>30мм Смешанное боепитание 5:1 ОУ:ОФЗ</Russian>
<Korean>30mm 5:1 열화:고폭소이</Korean>
@ -156,6 +168,7 @@
<Chinese>30毫米 穿高混合 5:1</Chinese>
<Chinesesimp>30mm 穿爆混合 5:1</Chinesesimp>
<French>30 mm MdC 5:1</French>
<Italian>30mm Misto 5:1</Italian>
<Polish>30mm MB 5:1</Polish>
<Turkish>30mm CM 5:1</Turkish>
<German>30mm KM 5:1</German>

View File

@ -75,11 +75,11 @@ class GVAR(sorts) {
scope = 2;
displayName = CSTRING(sortByProtectionBallistic);
tabs[] = {{3,4,6}, {}};
statement = QUOTE([ARR_3(_this, 1000000, 1000)] call FUNC(sortStatement_protection));
statement = QUOTE([ARR_3(_this,1000000,1000)] call FUNC(sortStatement_protection));
};
class ACE_protectionExplosive: ACE_protectionBallistic {
displayName = CSTRING(sortByProtectionExplosive);
statement = QUOTE([ARR_3(_this, 1000, 1000000)] call FUNC(sortStatement_protection));
statement = QUOTE([ARR_3(_this,1000,1000000)] call FUNC(sortStatement_protection));
};
};

View File

@ -24,7 +24,7 @@ class GVAR(stats) {
priority = 1.5;
displayName = "$STR_a3_rscdisplayarsenal_stat_weight";
showText = 1;
textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_mass));
textStatement = QUOTE([ARR_2(_this select 0,_this select 1)] call FUNC(statTextStatement_mass));
tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}, {0,1,2,3,4,5,6,7}};
};
class ACE_rateOfFire: statBase {
@ -34,8 +34,8 @@ class GVAR(stats) {
displayName = "$STR_a3_rscdisplayarsenal_stat_rof";
showBar = 1;
showText = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_2([ARR_2(-1.4, 0.31)], [ARR_2(1, 0.01)])])] call FUNC(statBarStatement_rateOfFIre));
textStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_2([ARR_2(-1.4, 0.31)], false)])] call FUNC(statTextStatement_rateOfFire));
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_2([ARR_2(-1.4,0.31)],[ARR_2(1,0.01)])])] call FUNC(statBarStatement_rateOfFIre));
textStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_2([ARR_2(-1.4,0.31)],false)])] call FUNC(statTextStatement_rateOfFire));
tabs[] = {{0,1}, {}};
};
class ACE_accuracy: statBase {
@ -45,8 +45,8 @@ class GVAR(stats) {
displayName = "$STR_a3_rscdisplayarsenal_stat_dispersion";
showBar = 1;
showText = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(-4, -1.7)], [ARR_2(1, 0.01)], true)])] call FUNC(statBarStatement_accuracy));
textStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_2([ARR_2(-4, -1.7)], false)])] call FUNC(statTextStatement_accuracy));
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(-4,-1.7)],[ARR_2(1,0.01)],true)])] call FUNC(statBarStatement_accuracy));
textStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_2([ARR_2(-4,-1.7)],false)])] call FUNC(statTextStatement_accuracy));
tabs[] = {{0,1}, {}};
};
class ACE_maxZeroing: statBase {
@ -55,7 +55,7 @@ class GVAR(stats) {
stats[] = {"maxZeroing"};
displayName = "$STR_a3_rscdisplayarsenal_stat_range";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 2500)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(0,2500)],[ARR_2(0.01,1)],false)])] call FUNC(statBarStatement_default));
tabs[] = {{0,1,2}, {}};
};
class ACE_impact: statBase {
@ -64,7 +64,7 @@ class GVAR(stats) {
stats[] = {"hit", "initSpeed"};
displayName = "$STR_a3_rscdisplayarsenal_stat_impact";
showBar = 1;
barStatement = QUOTE([ARR_3(_this select 0, _this select 1, [ARR_2([ARR_2(0, 3.2)], [ARR_2(-1, 1100)])])] call FUNC(statBarStatement_impact));
barStatement = QUOTE([ARR_3(_this select 0,_this select 1,[ARR_2([ARR_2(0,3.2)],[ARR_2(-1,1100)])])] call FUNC(statBarStatement_impact));
tabs[] = {{0,1,2}, {}};
};
class ACE_scopeMagnification: statBase {
@ -105,7 +105,7 @@ class GVAR(stats) {
stats[] = {"passthrough"};
displayName = "$STR_a3_rscdisplayarsenal_stat_passthrough";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 0.63)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(0,0.63)],[ARR_2(0.01,1)],false)])] call FUNC(statBarStatement_default));
tabs[] = {{3,4,6}, {}};
};
class ACE_explosiveResistance: statBase {
@ -114,7 +114,7 @@ class GVAR(stats) {
stats[] = {"armor"};
displayName = "$STR_a3_rscdisplayarsenal_stat_armor";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 0.80)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(0,0.80)],[ARR_2(0.01,1)],false)])] call FUNC(statBarStatement_default));
tabs[] = {{3,4,6}, {}};
};
class ACE_load: statBase {
@ -123,7 +123,7 @@ class GVAR(stats) {
stats[] = {"maximumLoad"};
displayName = "$STR_a3_rscdisplayarsenal_stat_load";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 500)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(0,500)],[ARR_2(0.01,1)],false)])] call FUNC(statBarStatement_default));
tabs[] = {{3,4,5}, {}};
};
class ACE_smokeChemTTL: statBase {
@ -133,7 +133,7 @@ class GVAR(stats) {
displayName = CSTRING(statTTL);
showText = 1;
textStatement = QUOTE(call FUNC(statTextStatement_smokeChemTTL));
condition = QUOTE((configName (_this select 1)) isKindOf [ARR_2('smokeShell', configFile >> 'CfgMagazines')]);
condition = QUOTE((configName (_this select 1)) isKindOf [ARR_2('smokeShell',configFile >> 'CfgMagazines')]);
tabs[] = {{}, {5}};
};
class ACE_explosionTime: statBase {
@ -152,4 +152,13 @@ class GVAR(stats) {
textStatement = QUOTE(call FUNC(statTextStatement_magCount));
tabs[] = {{}, {4}};
};
class ACE_illuminators: statBase {
scope = 2;
priority = 1;
stats[] = {};
displayName = CSTRING(statIlluminators);
showText = 1;
textStatement = QUOTE(call FUNC(statTextStatement_illuminators));
tabs[] = {{}, {1}};
};
};

View File

@ -28,7 +28,7 @@ class Cfg3DEN {
w = QUOTE(130 * ATTRIBUTE_W);
h = QUOTE(106.83 * ATTRIBUTE_H);
attributeLoad = QUOTE([ARR_2(_this,+_value)] call FUNC(attributeLoad));
attributeSave = QUOTE(uiNamespace getVariable [ARR_2(QQGVAR(attributeValue),[ARR_2([], 0)])]);
attributeSave = QUOTE(uiNamespace getVariable [ARR_2(QQGVAR(attributeValue),[ARR_2([],0)])]);
class controls {
class ModeTitle: ctrlStatic {
idc = -1;
@ -40,7 +40,7 @@ class Cfg3DEN {
};
class Mode: ctrlToolbox {
idc = IDC_ATTRIBUTE_MODE;
onToolBoxSelChanged = QUOTE([ARR_2(ctrlParentControlsGroup (_this select 0), _this select 1)] call FUNC(attributeMode));
onToolBoxSelChanged = QUOTE([ARR_2(ctrlParentControlsGroup (_this select 0),_this select 1)] call FUNC(attributeMode));
x = QUOTE(5 * ATTRIBUTE_W);
y = QUOTE(5 * ATTRIBUTE_H);
w = QUOTE(125 * ATTRIBUTE_W);
@ -55,7 +55,7 @@ class Cfg3DEN {
};
class Category: ctrlToolboxPictureKeepAspect {
idc = IDC_ATTRIBUTE_CATEGORY;
onToolBoxSelChanged = QUOTE([ARR_2(ctrlParentControlsGroup (_this select 0), _this select 1)] call FUNC(attributeCategory));
onToolBoxSelChanged = QUOTE([ARR_2(ctrlParentControlsGroup (_this select 0),_this select 1)] call FUNC(attributeCategory));
x = QUOTE(5 * ATTRIBUTE_W);
y = QUOTE(15 * ATTRIBUTE_H);
w = QUOTE(125 * ATTRIBUTE_W);
@ -129,7 +129,8 @@ class Cfg3DEN {
};
class SearchButton: ctrlButtonPicture {
idc = IDC_ATTRIBUTE_SEARCH_BUTTON;
onButtonClick = QUOTE( \
#pragma hemtt suppress pw3_padded_arg
onButtonClick = QUOTE(\
params ['_searchButton']; \
private _controlsGroup = ctrlParentControlsGroup _searchButton; \
private _searchBar = _controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR; \
@ -147,7 +148,8 @@ class Cfg3DEN {
class SearchBar: ctrlEdit {
idc = IDC_ATTRIBUTE_SEARCHBAR;
onKeyUp = QUOTE([ctrlParentControlsGroup (_this select 0)] call FUNC(attributeAddItems));
onMouseButtonClick = QUOTE( \
#pragma hemtt suppress pw3_padded_arg
onMouseButtonClick = QUOTE(\
params [ARR_2('_searchBar','_button')]; \
if (_button != 1) exitWith {}; \
_searchBar ctrlSetText ''; \

View File

@ -26,7 +26,7 @@ class Display3DEN {
class GVAR(portVALoadouts) {
text = CSTRING(portLoadoutsText);
picture = QPATHTOEF(common,data\logo_ace3_ca.paa);
action = QUOTE(call DFUNC(portVALoadouts););
action = QUOTE(call DFUNC(portVALoadouts));
};
};
};

View File

@ -39,11 +39,14 @@ PREP(fillLeftPanel);
PREP(fillLoadoutsList);
PREP(fillRightPanel);
PREP(fillSort);
PREP(getVirtualItems);
PREP(handleActions);
PREP(handleLoadoutsSearchbar);
PREP(handleMouse);
PREP(handleScrollWheel);
PREP(handleSearchbar);
PREP(handleSearchInputChanged);
PREP(handleSearchModeToggle);
PREP(handleStats);
PREP(initBox);
PREP(itemInfo);
@ -92,6 +95,7 @@ PREP(statBarStatement_impact);
PREP(statBarStatement_rateOfFIre);
PREP(statTextStatement_accuracy);
PREP(statTextStatement_explosionTime);
PREP(statTextStatement_illuminators);
PREP(statTextStatement_magCount);
PREP(statTextStatement_mass);
PREP(statTextStatement_rateOfFire);
@ -102,4 +106,5 @@ PREP(updateCamPos);
PREP(updateRightPanel);
PREP(updateCurrentItemsList);
PREP(updateUniqueItemsList);
PREP(updateVirtualItemsFlat);
PREP(verifyLoadout);

View File

@ -18,6 +18,15 @@ GVAR(lastSortDirectionRight) = DESCENDING;
[QGVAR(removeDefaultLoadout), LINKFUNC(removeDefaultLoadout)] call CBA_fnc_addEventHandler;
[QGVAR(renameDefaultLoadout), LINKFUNC(renameDefaultLoadout)] call CBA_fnc_addEventHandler;
[QGVAR(refresh), {
params ["_object"];
// If the arsenal is already open, refresh arsenal display
if (!isNil QGVAR(currentBox) && {GVAR(currentBox) isEqualTo _object}) then {
[true, true] call FUNC(refresh);
};
}] call CBA_fnc_addEventHandler;
[QGVAR(broadcastFace), {
params ["_unit", "_face"];
_unit setFace _face;

View File

@ -9,7 +9,7 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
#include "initSettings.inc.sqf"
// Arsenal events
[QGVAR(statsToggle), {

View File

@ -20,8 +20,9 @@
params [["_name", "", [""]], ["_loadout", [], [[]]], ["_global", false, [false]]];
if (_global) then {
[QGVAR(addDefaultLoadout), [_name, _loadout]] call CBA_fnc_remoteEvent;
if (_global) exitWith {
private _eventID = format [QGVAR(loadouts_%1), _name];
[QGVAR(addDefaultLoadout), [_name, _loadout], _eventID] call CBA_fnc_globalEventJIP;
};
private _extendedInfo = createHashMap;

View File

@ -123,3 +123,10 @@ if (_items isEqualType true) then {
};
_object setVariable [QGVAR(virtualItems), _cargo, _global];
// If the arsenal is already open, refresh arsenal display
if (_global) then {
[QGVAR(refresh), _object] call CBA_fnc_globalEvent;
} else {
[QGVAR(refresh), _object] call CBA_fnc_localEvent;
};

View File

@ -18,6 +18,8 @@
params ["_controlsGroup"];
forceUnicode 0; // handle non-ANSI characters
private _category = lbCurSel (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY);
private _filter = ctrlText (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR);
private _configItems = uiNamespace getVariable QGVAR(configItems);
@ -28,7 +30,7 @@ _attributeValue params ["_attributeItems", "_attributeMode"];
TRACE_3("Populating list",_category,_filter,_attributeValue);
if (_filter != "") then {
_filter = _filter call EFUNC(common,escapeRegex);
_filter = ".*?" + (_filter splitString " " joinString ".*?" + ".*?/io");
_filter = ".*?" + (_filter splitString " " joinString ".*?") + ".*?/io";
} else {
_filter = ".*?/io";
};
@ -139,3 +141,6 @@ private _config = _cfgClass;
// Sort alphabetically
_listbox lnbSort [1, false];
// Reset unicode flag
forceUnicode -1;

View File

@ -24,14 +24,12 @@ if (_mode > 0) then {
// Blacklist: add full arsenal and take items away
[_object, true, true] call FUNC(initBox);
// Need to delay removal by 2 frames
// Wait until all items have been added, so that the blacklisted items can be removed
[{
[{
params ["_object", "_items"];
[_object, _items, true] call FUNC(removeVirtualItems);
}, _this] call CBA_fnc_execNextFrame;
}, [_object, _items]] call CBA_fnc_execNextFrame;
!isNil {(_this select 0) getVariable QGVAR(virtualItems)}
}, {
[_this select 0, _this select 1, true] call FUNC(removeVirtualItems);
}, [_object, _items], 20] call CBA_fnc_waitUntilAndExecute; // 20s timeout in case of failure
} else {
// Exit on whitelist mode with no items
if (_items isEqualTo []) exitWith {};

View File

@ -47,8 +47,8 @@ private _container = switch (GVAR(currentLeftPanel)) do {
};
};
/// Get all items from container (excluding container itself)
_containerItems = [GVAR(center), 0, 3, 0, 0, false] call EFUNC(common,uniqueUnitItems);
// Get all items from container
_containerItems = uniformItems GVAR(center);
// Update currentItems
GVAR(currentItems) set [IDX_CURR_UNIFORM_ITEMS, ((getUnitLoadout GVAR(center)) select IDX_LOADOUT_UNIFORM) param [1, []]];
@ -75,8 +75,8 @@ private _container = switch (GVAR(currentLeftPanel)) do {
};
};
// Get all items from container (excluding container itself)
_containerItems = [GVAR(center), 0, 0, 3, 0, false] call EFUNC(common,uniqueUnitItems);
// Get all items from container
_containerItems = vestItems GVAR(center);
// Update currentItems
GVAR(currentItems) set [IDX_CURR_VEST_ITEMS, ((getUnitLoadout GVAR(center)) select IDX_LOADOUT_VEST) param [1, []]];
@ -103,8 +103,8 @@ private _container = switch (GVAR(currentLeftPanel)) do {
};
};
// Get all items from container (excluding container itself)
_containerItems = [GVAR(center), 0, 0, 0, 3, false] call EFUNC(common,uniqueUnitItems);
// Get all items from container
_containerItems = backpackItems GVAR(center);
// Update currentItems
GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, ((getUnitLoadout GVAR(center)) select IDX_LOADOUT_BACKPACK) param [1, []]];
@ -117,7 +117,7 @@ private _container = switch (GVAR(currentLeftPanel)) do {
};
// Find out how many items of that type there are and update the number displayed
_ctrlList lnbSetText [[_lnbCurSel, 2], str (_containerItems getOrDefault [_item, 0])];
_ctrlList lnbSetText [[_lnbCurSel, 2], str ({_item == _x} count _containerItems)];
[QGVAR(cargoChanged), [_display, _item, _addOrRemove, GVAR(shiftState)]] call CBA_fnc_localEvent;

View File

@ -43,11 +43,7 @@ private _loadoutIndex = _data findIf {(_x select 0) == _loadoutName};
(_data select _loadoutIndex) set [0, _editBoxContent];
if (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts) then {
if (is3DEN) then {
set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]];
} else {
[QGVAR(renameDefaultLoadout), [_loadoutName, _editBoxContent]] call CBA_fnc_remoteEvent;
};
set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]];
};
private _currentLoadoutsTab = str GVAR(currentLoadoutsTab);

View File

@ -7,6 +7,7 @@
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Tab control <CONTROL>
* 2: Animate panel refresh <BOOL>
*
* Return Value:
* None
@ -14,28 +15,30 @@
* Public: No
*/
params ["_display", "_control"];
params ["_display", "_control", ["_animate", true]];
// Fade old control background
if (!isNil QGVAR(currentLeftPanel)) then {
private _previousCtrlBackground = _display displayCtrl (GVAR(currentLeftPanel) - 1);
_previousCtrlBackground ctrlSetFade 1;
_previousCtrlBackground ctrlCommit FADE_DELAY;
_previousCtrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
};
// Show new control background
private _ctrlIDC = ctrlIDC _control;
private _ctrlBackground = _display displayCtrl (_ctrlIDC - 1);
_ctrlBackground ctrlSetFade 0;
_ctrlBackground ctrlCommit FADE_DELAY;
_ctrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
private _ctrlPanel = _display displayCtrl IDC_leftTabContent;
// Force a "refresh" animation of the panel
_ctrlPanel ctrlSetFade 1;
_ctrlPanel ctrlCommit 0;
_ctrlPanel ctrlSetFade 0;
_ctrlPanel ctrlCommit FADE_DELAY;
if (_animate) then {
_ctrlPanel ctrlSetFade 1;
_ctrlPanel ctrlCommit 0;
_ctrlPanel ctrlSetFade 0;
_ctrlPanel ctrlCommit FADE_DELAY;
};
_ctrlPanel lbSetCurSel -1;

View File

@ -7,6 +7,7 @@
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Tab control <CONTROL>
* 2: Animate panel refresh <BOOL> (default: true)
*
* Return Value:
* None
@ -14,13 +15,13 @@
* Public: No
*/
params ["_display", "_control"];
params ["_display", "_control", ["_animate", true]];
// Fade old control background
if (!isNil QGVAR(currentRightPanel)) then {
private _previousCtrlBackground = _display displayCtrl (GVAR(currentRightPanel) - 1);
_previousCtrlBackground ctrlSetFade 1;
_previousCtrlBackground ctrlCommit FADE_DELAY;
_previousCtrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
};
// Show new control background
@ -28,7 +29,7 @@ private _ctrlIDC = ctrlIDC _control;
private _ctrlBackground = _display displayCtrl (_ctrlIDC - 1);
_ctrlBackground ctrlShow true;
_ctrlBackground ctrlSetFade 0;
_ctrlBackground ctrlCommit FADE_DELAY;
_ctrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
private _searchbarCtrl = _display displayCtrl IDC_rightSearchbar;
@ -43,10 +44,14 @@ private _cfgMagazines = configFile >> "CfgMagazines";
private _cfgWeapons = configFile >> "CfgWeapons";
private _rightPanelCache = uiNamespace getVariable QGVAR(rightPanelCache);
private _currentCargo = itemsWithMagazines GVAR(center);
private _currentCargo = []; // we only need this if we're filtering for favorites
if (GVAR(favoritesOnly)) then {
_currentCargo = itemsWithMagazines GVAR(center) + backpacks GVAR(center);
_currentCargo = _currentCargo arrayIntersect _currentCargo;
};
private _fnc_fillRightContainer = {
params ["_configCategory", "_className", "_hasItemInfo", ["_isUnique", false, [false]], ["_unknownOrigin", false, [false]]];
params ["_configCategory", "_className", ["_isUnique", false, [false]], ["_unknownOrigin", false, [false]]];
if (GVAR(favoritesOnly) && {!(_className in _currentCargo)} && {!((toLower _className) in GVAR(favorites))}) exitWith {};
@ -63,7 +68,6 @@ private _fnc_fillRightContainer = {
// "Misc. items" magazines (e.g. spare barrels, intel, photos)
if (_className in (uiNamespace getVariable QGVAR(magazineMiscItems))) then {
_configPath = _cfgMagazines >> _className;
_hasItemInfo = false;
};
// If an item with unknown origin is in the arsenal list, try to find it
@ -74,34 +78,15 @@ private _fnc_fillRightContainer = {
if (isNull _configPath) then {
_configPath = _className call CBA_fnc_getObjectConfig;
};
// Check if item is has item info
_itemInfo = isClass (_cfgWeapons >> configName _configPath);
};
// Get mass
private _mass = if (!_hasItemInfo) then {
getNumber (_configPath >> "mass")
} else {
private _mass = getNumber (_configPath >> "itemInfo" >> "mass");
if (_mass == 0) then {
_mass = getNumber (_configPath >> "WeaponSlotsInfo" >> "mass");
};
_mass
};
_rightPanelCache set [_className, _mass]; // Needed because this provides more accurate weight for FUNC(updateRightPanel)
[getText (_configPath >> "displayName"), getText (_configPath >> "picture"), _mass]
}, true]) params ["_displayName", "_picture", "_mass"];
[getText (_configPath >> "displayName"), getText (_configPath >> "picture")]
}, true]) params ["_displayName", "_picture"];
private _lbAdd = _ctrlPanel lnbAddRow ["", _displayName, "0"];
_ctrlPanel lnbSetText [[_lbAdd, 1], _displayName];
_ctrlPanel lnbSetData [[_lbAdd, 0], _className];
_ctrlPanel lnbSetPicture [[_lbAdd, 0], _picture];
_ctrlPanel lnbSetValue [[_lbAdd, 0], _mass];
_ctrlPanel lnbSetValue [[_lbAdd, 2], [0, 1] select _isUnique];
_ctrlPanel lnbSetTooltip [[_lbAdd, 0], format ["%1\n%2", _displayName, _className]];
if ((toLower _className) in GVAR(favorites)) then {
@ -113,15 +98,9 @@ private _fnc_fillRightContainer = {
private _ctrlPanel = _display displayCtrl IDC_rightTabContent;
private _listnBox = _display displayCtrl IDC_rightTabContentListnBox;
// Reset right panel content
lbClear _ctrlPanel;
lbClear _listnBox;
_ctrlPanel lbSetCurSel -1;
_listnBox lbSetCurSel -1;
// Retrieve compatible items
private _itemToCheck = "";
private _isContainer = false;
private _selectedItem = "";
private _compatibleItems = [];
private _compatibleMagsMuzzle = [];
private _compatibleMagsAll = createHashMap;
@ -153,12 +132,12 @@ switch (GVAR(currentLeftPanel)) do {
// Check if weapon attachement or magazine
if (_index != -1) then {
_itemToCheck = (GVAR(currentItems) select _currentWeaponItemsIndex) select _index;
_selectedItem = (GVAR(currentItems) select _currentWeaponItemsIndex) select _index;
// If weapon attachment, get base weapon; Get compatible items
if (_index <= 3) then {
_compatibleItems = compatibleItems _weapon;
_itemToCheck = _itemToCheck call FUNC(baseWeapon);
_selectedItem = _selectedItem call FUNC(baseWeapon);
} else {
// Get compatible magazines for primary & secondary muzzle (secondary muzzle is not guaranteed to exist)
// Assumption: One weapon can have two muzzles maximum
@ -170,7 +149,15 @@ switch (GVAR(currentLeftPanel)) do {
case IDC_buttonUniform;
case IDC_buttonVest;
case IDC_buttonBackpack: {
_ctrlPanel = _listnBox;
_isContainer = true;
// Get the currently selected item in panel
private _selectedItemIndex = lnbCurSelRow _listnBox;
// If something is selected, save it
if (_selectedItemIndex != -1) then {
_selectedItem = _listnBox lnbData [_selectedItemIndex, 0];
};
// This is for the "compatible magazines" tab when a container is open
if (_ctrlIDC == IDC_buttonMag) then {
@ -182,11 +169,24 @@ switch (GVAR(currentLeftPanel)) do {
};
};
// Reset right panel content
lbClear _ctrlPanel;
lnbClear _listnBox;
_ctrlPanel lbSetCurSel -1;
_listnBox lnbSetCurSelRow -1;
if (_isContainer) then {
_ctrlPanel = _listnBox;
};
// Force a "refresh" animation of the panel
_ctrlPanel ctrlSetFade 1;
_ctrlPanel ctrlCommit 0;
_ctrlPanel ctrlSetFade 0;
_ctrlPanel ctrlCommit FADE_DELAY;
if (_animate) then {
_ctrlPanel ctrlSetFade 1;
_ctrlPanel ctrlCommit 0;
_ctrlPanel ctrlSetFade 0;
_ctrlPanel ctrlCommit FADE_DELAY;
};
// Check if the left panel is a weapon. If so, right panel will be compatible items with weapon only
private _leftPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon, IDC_buttonBinoculars];
@ -214,11 +214,11 @@ switch (_ctrlIDC) do {
} forEach _compatibleItems;
} else {
{
["CfgWeapons", _x, true] call _fnc_fillRightContainer;
["CfgWeapons", _x] call _fnc_fillRightContainer;
} forEach (keys ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get _index));
{
["CfgWeapons", _x, true, true] call _fnc_fillRightContainer;
["CfgWeapons", _x, true] call _fnc_fillRightContainer;
} forEach (keys ((GVAR(virtualItems) get IDX_VIRT_UNIQUE_ATTACHMENTS) get _index));
};
};
@ -237,44 +237,44 @@ switch (_ctrlIDC) do {
case IDC_buttonMag: {
{
if (_x in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) then {
["CfgMagazines", _x, false] call _fnc_fillRightContainer;
["CfgMagazines", _x] call _fnc_fillRightContainer;
continue;
};
if (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL)) then {
["CfgMagazines", _x, false, true] call _fnc_fillRightContainer;
["CfgMagazines", _x, true] call _fnc_fillRightContainer;
};
} forEach (keys _compatibleMagsAll);
};
// All magazines
case IDC_buttonMagALL: {
{
["CfgMagazines", _x, false] call _fnc_fillRightContainer;
["CfgMagazines", _x] call _fnc_fillRightContainer;
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL));
{
["CfgMagazines", _x, false, true] call _fnc_fillRightContainer;
["CfgMagazines", _x, true] call _fnc_fillRightContainer;
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL));
};
// Grenades
case IDC_buttonThrow: {
{
["CfgMagazines", _x, false] call _fnc_fillRightContainer;
["CfgMagazines", _x] call _fnc_fillRightContainer;
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_GRENADES));
{
["CfgMagazines", _x, false, true] call _fnc_fillRightContainer;
["CfgMagazines", _x, true] call _fnc_fillRightContainer;
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GRENADES));
};
// Explosives
case IDC_buttonPut: {
{
["CfgMagazines", _x, false] call _fnc_fillRightContainer;
["CfgMagazines", _x] call _fnc_fillRightContainer;
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES));
{
["CfgMagazines", _x, false, true] call _fnc_fillRightContainer;
["CfgMagazines", _x, true] call _fnc_fillRightContainer;
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_EXPLOSIVES));
};
// Misc. items
@ -293,33 +293,35 @@ switch (_ctrlIDC) do {
// "Regular" misc. items
{
if !(_x in _items) then {
["CfgWeapons", _x, true] call _fnc_fillRightContainer;
["CfgWeapons", _x] call _fnc_fillRightContainer;
};
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS));
// Unique items
{
if !(_x in _items) then {
["CfgWeapons", _x, true, true] call _fnc_fillRightContainer;
["CfgWeapons", _x, true] call _fnc_fillRightContainer;
};
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_MISC_ITEMS));
// Unique backpacks
{
if !(_x in _items) then {
["CfgVehicles", _x, false, true] call _fnc_fillRightContainer;
["CfgVehicles", _x, true] call _fnc_fillRightContainer;
};
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_BACKPACKS));
// Unique goggles
{
if !(_x in _items) then {
["CfgGlasses", _x, false, true] call _fnc_fillRightContainer;
// _y indicates if an item is truly unique or if it's a non-inventory item in a container (e.g. goggles in backpack)
["CfgGlasses", _x, _y] call _fnc_fillRightContainer;
};
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES));
} forEach (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES);
// Unknown items
{
if !(_x in _items) then {
["CfgWeapons", _x, true, true, true] call _fnc_fillRightContainer;
// _y indicates if an item is truly unique or if it's a non-inventory item in a container (e.g. helmet in backpack)
["CfgWeapons", _x, _y, true] call _fnc_fillRightContainer;
};
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS));
} forEach (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS); // if an item is here but in virtual items, it's just in the wrong place
};
// Custom buttons
default {
@ -331,23 +333,23 @@ switch (_ctrlIDC) do {
switch (true) do {
// "Regular" misc. items
case (_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)): {
["CfgWeapons", _x, true] call _fnc_fillRightContainer;
["CfgWeapons", _x] call _fnc_fillRightContainer;
};
// Unique items
case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_MISC_ITEMS)): {
["CfgWeapons", _x, true, true] call _fnc_fillRightContainer;
["CfgWeapons", _x, true] call _fnc_fillRightContainer;
};
// Unique backpacks
case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_BACKPACKS)): {
["CfgVehicles", _x, false, true] call _fnc_fillRightContainer;
["CfgVehicles", _x, true] call _fnc_fillRightContainer;
};
// Unique goggles
case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES)): {
["CfgGlasses", _x, false, true] call _fnc_fillRightContainer;
["CfgGlasses", _x, GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES get _x] call _fnc_fillRightContainer;
};
// Unknown items
case (_x in (GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS)): {
["CfgWeapons", _x, true, true, true] call _fnc_fillRightContainer;
["CfgWeapons", _x, GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS get _x, true] call _fnc_fillRightContainer;
};
};
} forEach _items;
@ -365,7 +367,7 @@ GVAR(currentRightPanel) = _ctrlIDC;
[QGVAR(rightPanelFilled), [_display, GVAR(currentLeftPanel), _ctrlIDC]] call CBA_fnc_localEvent;
// Add current items, change progress bar of container load and get relevant container
if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]) then {
if (_isContainer) then {
private _containerItems = [];
private _container = switch (GVAR(currentLeftPanel)) do {
// Uniform
@ -373,8 +375,8 @@ if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBack
// Update load bar
(_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadUniform GVAR(center));
// Get all items from container (excluding container itself)
_containerItems = [GVAR(center), 0, 3, 0, 0, false] call EFUNC(common,uniqueUnitItems);
// Get all items from container
_containerItems = uniformItems GVAR(center);
uniformContainer GVAR(center)
};
@ -383,8 +385,8 @@ if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBack
// Update load bar
(_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadVest GVAR(center));
// Get all items from container (excluding container itself)
_containerItems = [GVAR(center), 0, 0, 3, 0, false] call EFUNC(common,uniqueUnitItems);
// Get all items from container
_containerItems = vestItems GVAR(center);
vestContainer GVAR(center)
};
@ -393,8 +395,8 @@ if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBack
// Update load bar
(_display displayCtrl IDC_loadIndicatorBar) progressSetPosition (loadBackpack GVAR(center));
// Get all items from container (excluding container itself)
_containerItems = [GVAR(center), 0, 0, 0, 3, false] call EFUNC(common,uniqueUnitItems);
// Get all items from container
_containerItems = backpackItems GVAR(center);
backpackContainer GVAR(center)
};
@ -402,7 +404,8 @@ if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBack
// Find out how many items of a type there are and update the number displayed
for "_lbIndex" from 0 to (lnbSize _ctrlPanel select 0) - 1 do {
_ctrlPanel lnbSetText [[_lbIndex, 2], str (_containerItems getOrDefault [_ctrlPanel lnbData [_lbIndex, 0], 0])];
private _xItem = _ctrlPanel lnbData [_lbIndex, 0];
_ctrlPanel lnbSetText [[_lbIndex, 2], str ({_xItem == _x} count _containerItems)];
};
// Refresh availibility of items based on space remaining in container
@ -412,17 +415,34 @@ if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBack
// Sorting
[_display, _control, _display displayCtrl IDC_sortRightTab, _display displayCtrl IDC_sortRightTabDirection] call FUNC(fillSort);
// Try to select previously selected item again, otherwise select first item ("Empty")
if (_itemToCheck != "") then {
private _index = 0;
if (_selectedItem != "") then {
if (_isContainer) then {
// Try to select previously selected item again, otherwise select nothing
private _index = -1;
for "_lbIndex" from 0 to (lbSize _ctrlPanel) - 1 do {
if ((_ctrlPanel lbData _lbIndex) == _itemToCheck) exitWith {
_index = _lbIndex;
for "_lbIndex" from 0 to (lnbSize _ctrlPanel select 0) - 1 do {
if ((_ctrlPanel lnbData [_lbIndex, 0]) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
};
_ctrlPanel lbSetCurSel _index;
_ctrlPanel lnbSetCurSelRow _index;
} else {
// Try to select previously selected item again, otherwise select first item ("Empty")
private _index = 0;
for "_lbIndex" from 0 to (lbSize _ctrlPanel) - 1 do {
if ((_ctrlPanel lbData _lbIndex) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
_ctrlPanel lbSetCurSel _index;
};
} else {
_ctrlPanel lbSetCurSel 0;
if (_isContainer) then {
_ctrlPanel lnbSetCurSelRow -1; // select nothing
} else {
_ctrlPanel lbSetCurSel 0; // select "Empty"
};
};

View File

@ -0,0 +1,39 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: johnb43, Grim
* Gets list of virtual items available to the object.
*
* Arguments:
* 0: Target <OBJECT>
*
* Return Value:
* Virtual Items <HASHMAP>
*
* Example:
* cursorObject call ace_arsenal_fnc_getVirtualItems
*
* Public: Yes
*/
params [["_object", objNull, [objNull]]];
private _virtualItems = _object getVariable QGVAR(virtualItems);
if (isNil "_virtualItems") exitWith {createHashMap};
private _virtualItemsFlat = +_virtualItems;
private _weapons = _virtualItemsFlat deleteAt IDX_VIRT_WEAPONS;
private _attachments = _virtualItemsFlat deleteAt IDX_VIRT_ATTACHMENTS;
for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do {
_virtualItemsFlat merge [_virtualItemsFlat deleteAt _index, true];
};
for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do {
_virtualItemsFlat merge [_weapons deleteAt _index, true];
};
for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do {
_virtualItemsFlat merge [_attachments deleteAt _index, true];
};
_virtualItemsFlat // return

View File

@ -118,12 +118,14 @@ _actionsCurrentPageCtrl ctrlCommit 0;
_actionTextCtrl ctrlSetFade 0;
_actionTextCtrl ctrlCommit 0;
_actionButtonCtrl ctrlSetFade 1;
_actionButtonCtrl ctrlEnable false;
_actionButtonCtrl ctrlCommit 0;
};
default {
_actionTextCtrl ctrlSetFade 1;
_actionTextCtrl ctrlCommit 0;
_actionButtonCtrl ctrlSetFade 1;
_actionButtonCtrl ctrlEnable false;
_actionButtonCtrl ctrlCommit 0;
};
};

View File

@ -0,0 +1,28 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: PabstMirror
* Handles user input in the search text boxes
*
* Arguments:
* 0: Search text input (left or right) <CONTROL>
* 1: Text <STRING>
*
* Return Value:
* None
*
* Public: No
*/
params ["_ctrl", "_newText"];
if (!GVAR(liveUpdateSearch)) exitWith {};
private _display = ctrlParent _ctrl;
if (GVAR(leftSearchbarFocus)) then {
[_display, _display displayCtrl IDC_leftSearchbar, false] call FUNC(handleSearchBar);
};
if (GVAR(rightSearchbarFocus)) then {
[_display, _display displayCtrl IDC_rightSearchbar, false] call FUNC(handleSearchBar);
};

View File

@ -0,0 +1,30 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: PabstMirror
* Handles mouse clicks on search button to toggle live results
*
* Arguments:
* 0: Search button (left or right) <CONTROL>
* 1: Mouse Button <NUMBER>
* 2: Not used
* 3: Not used
* 4: Not used
* 5: Ctrl Button <BOOL>
*
* Return Value:
* None
*
* Public: No
*/
params ["_ctrl", "_mouseButton", "", "", "", "_keyCtrl"];
if ((!_keyCtrl)) exitWith {}; // Ignore if not CTRL + Click
GVAR(liveUpdateSearch) = !GVAR(liveUpdateSearch);
private _display = ctrlParent _ctrl;
private _color = if (GVAR(liveUpdateSearch)) then { [0,1,0,0.5] } else { [0,0,0,0.5] };
(_display displayCtrl IDC_leftSearchbarButton) ctrlSetBackgroundColor _color;
(_display displayCtrl IDC_rightSearchbarButton) ctrlSetBackgroundColor _color;

View File

@ -7,6 +7,7 @@
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Searchbar control <CONTROL>
* 2: Animate panel refresh <BOOL> (default: true)
*
* Return Value:
* None
@ -14,25 +15,28 @@
* Public: No
*/
params ["_display", "_control"];
params ["_display", "_control", ["_animate", true]];
forceUnicode 0; // handle non-ANSI characters
private _searchString = ctrlText _control;
private _searchPattern = "";
if (_searchString != "") then {
_searchString = _searchString call EFUNC(common,escapeRegex);
_searchString = ".*?" + (_searchString splitString " " joinString ".*?") + ".*?/io";
_searchPattern = _searchString call EFUNC(common,escapeRegex);
_searchPattern = ".*?" + (_searchPattern splitString " " joinString ".*?") + ".*?/io";
};
// Right panel search bar
if ((ctrlIDC _control) == IDC_rightSearchbar) then {
// Don't refill if there is no need
if (GVAR(lastSearchTextRight) != "" && {GVAR(lastSearchTextRight) isNotEqualTo _searchString}) then {
[_display, _display displayCtrl GVAR(currentRightPanel)] call FUNC(fillRightPanel);
if (GVAR(lastSearchTextRight) != "" && {(_searchString find GVAR(lastSearchTextRight)) != 0}) then {
[_display, _display displayCtrl GVAR(currentRightPanel), _animate] call FUNC(fillRightPanel);
};
GVAR(lastSearchTextRight) = _searchString;
// If nothing searched, quit here
if (_searchString == "") exitWith {};
if (_searchPattern == "") exitWith {};
private _rightPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon, IDC_buttonBinoculars];
private _rightPanelCtrl = [_display displayCtrl IDC_rightTabContentListnBox, _display displayCtrl IDC_rightTabContent] select _rightPanelState;
@ -45,7 +49,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
// If something is selected, save it
if (_selectedItemIndex != -1) then {
_selectedItem = _rightPanelCtrl lbText _selectedItemIndex;
_selectedItem = _rightPanelCtrl lbData _selectedItemIndex;
};
private _currentDisplayName = "";
@ -57,7 +61,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
_currentClassname = _rightPanelCtrl lbData _lbIndex;
// Remove item in panel if it doesn't match search, skip otherwise
if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then {
if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchPattern) && {!(_currentClassname regexMatch _searchPattern)}}) then {
_rightPanelCtrl lbDelete _lbIndex;
};
};
@ -68,7 +72,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
// Try to find previously selected item in panel
for "_lbIndex" from 0 to (lbSize _rightPanelCtrl) - 1 do {
if ((_rightPanelCtrl lbText _lbIndex) == _selectedItem) exitWith {
if ((_rightPanelCtrl lbData _lbIndex) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
@ -85,7 +89,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
// If something is selected, save it
if (_selectedItemIndex != -1) then {
_selectedItem = _rightPanelCtrl lnbText [_selectedItemIndex, 1];
_selectedItem = _rightPanelCtrl lnbData [_selectedItemIndex, 0];
};
private _currentDisplayName = "";
@ -97,7 +101,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
_currentClassname = _rightPanelCtrl lnbData [_lbIndex, 0];
// Remove item in panel if it doesn't match search, skip otherwise
if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then {
if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchPattern) && {!(_currentClassname regexMatch _searchPattern)}}) then {
_rightPanelCtrl lnbDeleteRow _lbIndex;
};
};
@ -108,7 +112,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
// Try to find previously selected item in panel
for "_lbIndex" from 0 to (lnbSize _rightPanelCtrl select 0) - 1 do {
if ((_rightPanelCtrl lnbText [_lbIndex, 1]) == _selectedItem) exitWith {
if ((_rightPanelCtrl lnbData [_lbIndex, 0]) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
@ -124,14 +128,14 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
} else {
// Left panel search bar
// Don't refill if there is no need
if (GVAR(lastSearchTextLeft) != "" && {GVAR(lastSearchTextLeft) isNotEqualTo _searchString}) then {
[_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel);
if (GVAR(lastSearchTextLeft) != "" && {(_searchString find GVAR(lastSearchTextLeft)) != 0}) then {
[_display, _display displayCtrl GVAR(currentLeftPanel), _animate] call FUNC(fillLeftPanel);
};
GVAR(lastSearchTextLeft) = _searchString;
// If nothing searched, quit here
if (_searchString == "") exitWith {};
if (_searchPattern == "") exitWith {};
private _leftPanelCtrl = _display displayCtrl IDC_leftTabContent;
@ -141,7 +145,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
// If something is selected, save it
if (_selectedItemIndex != -1) then {
_selectedItem = _leftPanelCtrl lbText _selectedItemIndex;
_selectedItem = _leftPanelCtrl lbData _selectedItemIndex;
};
private _currentDisplayName = "";
@ -153,7 +157,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
_currentClassname = _leftPanelCtrl lbData _lbIndex;
// Remove item in panel if it doesn't match search, skip otherwise
if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then {
if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchPattern) && {!(_currentClassname regexMatch _searchPattern)}}) then {
_leftPanelCtrl lbDelete _lbIndex;
};
};
@ -163,7 +167,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
private _index = -1;
for "_lbIndex" from 0 to (lbSize _leftPanelCtrl) - 1 do {
if ((_leftPanelCtrl lbText _lbIndex) == _selectedItem) exitWith {
if ((_leftPanelCtrl lbData _lbIndex) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
@ -175,3 +179,6 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then {
[_display, nil, nil, configNull] call FUNC(itemInfo);
};
// Reset unicode flag
forceUnicode -1;

View File

@ -51,7 +51,10 @@ if (_global && {isMultiplayer} && {isNil {_object getVariable QGVAR(initBoxJIP)}
] call EFUNC(interact_menu,createAction);
[_object, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToObject);
[_object, _items, false] call FUNC(addVirtualItems);
// If items were set globally, do not add items locally
if (isNil {_object getVariable QGVAR(virtualItems)}) then {
[_object, _items, false] call FUNC(addVirtualItems);
};
[QGVAR(boxInitialized), [_object, _items]] call CBA_fnc_localEvent;
};

View File

@ -63,6 +63,7 @@ switch (ctrlIDC _control) do {
_saveButtonCtrl ctrlSetTooltip LLSTRING(buttonSaveTooltip);
};
_renameButtonCtrl ctrlEnable is3DEN; // no renaming mid-mission
_saveButtonCtrl ctrlEnable call FUNC(canEditDefaultLoadout);
_saveButtonCtrl ctrlCommit 0;
};

View File

@ -51,13 +51,6 @@ if (is3DEN) then {
["ShowInterface", true] call BIS_fnc_3DENInterface;
GVAR(visionMode) call BIS_fnc_3DENVisionMode;
} else {
// Select correct weapon
switch (GVAR(selectedWeaponType)) do {
case 0: {GVAR(center) selectWeapon (primaryWeapon GVAR(center))};
case 1: {GVAR(center) selectWeapon (secondaryWeapon GVAR(center))};
case 2: {GVAR(center) selectWeapon (handgunWeapon GVAR(center))};
};
if (!isNull curatorCamera && {ACE_player == player}) then {
curatorCamera cameraEffect ["Internal", "BACK"];
} else {
@ -104,11 +97,13 @@ GVAR(currentLeftPanel) = nil;
GVAR(currentRightPanel) = nil;
GVAR(leftSearchbarFocus) = nil;
GVAR(rightSearchbarFocus) = nil;
GVAR(liveUpdateSearch) = nil;
GVAR(shiftState) = nil;
GVAR(leftTabFocus) = nil;
GVAR(rightTabFocus) = nil;
GVAR(rightTabLnBFocus) = nil;
GVAR(ignoreFirstSortPanelCall) = nil;
GVAR(refreshing) = nil;
GVAR(selectedWeaponType) = nil;
GVAR(virtualItems) = nil;
@ -134,4 +129,6 @@ GVAR(favorites) = nil;
GVAR(center) = nil;
GVAR(centerNotPlayer) = nil;
GVAR(ignoredVirtualItems) = nil;
[QUOTE(ADDON), []] call EFUNC(common,showHud);

View File

@ -42,6 +42,10 @@ if (isNil QGVAR(defaultLoadoutsList)) then {
};
};
if (isNil {profileNamespace getVariable QGVAR(saved_loadouts)}) then {
profileNamespace setVariable [QGVAR(saved_loadouts), []];
};
if (isNil QGVAR(virtualItems)) then {
private _virtualItems = [
[IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]],
@ -57,25 +61,10 @@ if (isNil QGVAR(virtualItems)) then {
GVAR(virtualItems) = _virtualItems;
// Flatten out hashmaps for easy checking later
private _virtualItemsFlat = +_virtualItems;
private _weapons = _virtualItemsFlat deleteAt IDX_VIRT_WEAPONS;
private _attachments = _virtualItemsFlat deleteAt IDX_VIRT_ATTACHMENTS;
for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do {
_virtualItemsFlat merge [_virtualItemsFlat deleteAt _index, true];
};
for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do {
_virtualItemsFlat merge [_weapons deleteAt _index, true];
};
for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do {
_virtualItemsFlat merge [_attachments deleteAt _index, true];
};
GVAR(virtualItemsFlat) = _virtualItemsFlat;
call FUNC(updateVirtualItemsFlat);
};
// Includes items not in the arsenal but equipped on player
GVAR(virtualItemsFlatAll) = +GVAR(virtualItemsFlat);
GVAR(currentFace) = face GVAR(center);
@ -241,10 +230,12 @@ GVAR(currentLeftPanel) = nil;
GVAR(currentRightPanel) = nil;
GVAR(leftSearchbarFocus) = false;
GVAR(rightSearchbarFocus) = false;
GVAR(liveUpdateSearch) = false;
GVAR(leftTabFocus) = false;
GVAR(rightTabFocus) = false;
GVAR(rightTabLnBFocus) = false;
GVAR(ignoreFirstSortPanelCall) = false;
GVAR(refreshing) = false;
{
private _panel = _display displayCtrl _x;
@ -252,7 +243,15 @@ GVAR(ignoreFirstSortPanelCall) = false;
_panel ctrlCommit 0;
} forEach [IDC_leftTabContent, IDC_rightTabContent, IDC_rightTabContentListnBox];
[_display, _display displayCtrl IDC_buttonPrimaryWeapon] call FUNC(fillLeftPanel);
// Open left panel for current weapon, do some math
GVAR(selectedWeaponType) = [primaryWeapon GVAR(center), secondaryWeapon GVAR(center), handgunWeapon GVAR(center), binocular GVAR(center)] find (currentWeapon GVAR(center));
if (GVAR(selectedWeaponType) == -1) then {
GVAR(selectedWeaponType) = 0; // default to primary
};
private _leftPanelIDC = [IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun, IDC_buttonBinoculars] select GVAR(selectedWeaponType);
[_display, _display displayCtrl _leftPanelIDC] call FUNC(fillLeftPanel);
//--------------- Init camera
if (isNil QGVAR(cameraPosition)) then {

View File

@ -23,8 +23,9 @@ private _display = ctrlParent _control;
private _item = [_control lbData _curSel, _control lnbData [_curSel, 0]] select (ctrlType _control == CT_LISTNBOX);
// When having chosen a new category, see if the current right panel can be kept open, otherwise take default
private _selectCorrectPanelWeapon = [_display displayCtrl IDC_buttonOptic, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ACC_IDCS, IDC_buttonCurrentMag, IDC_buttonCurrentMag2]});
private _selectCorrectPanelContainer = [_display displayCtrl IDC_buttonMisc, _display displayCtrl GVAR(currentRightPanel)] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ITEMS_IDCS]});
private _currentRightPanel = _display displayCtrl GVAR(currentRightPanel);
private _selectCorrectPanelWeapon = [_display displayCtrl IDC_buttonOptic, _currentRightPanel] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ACC_IDCS, IDC_buttonCurrentMag, IDC_buttonCurrentMag2]});
private _selectCorrectPanelContainer = [_display displayCtrl IDC_buttonMisc, _currentRightPanel] select (!isNil QGVAR(currentRightPanel) && {GVAR(currentRightPanel) in [RIGHT_PANEL_ITEMS_IDCS]});
// Remove all magazines from the current weapon that aren't compatible with the new weapon
private _fnc_clearCurrentWeaponMags = {
@ -115,7 +116,7 @@ switch (GVAR(currentLeftPanel)) do {
TOGGLE_RIGHT_PANEL_WEAPON
[_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel);
[_display, _selectCorrectPanelWeapon, !GVAR(refreshing) && {_currentRightPanel isNotEqualTo _selectCorrectPanelWeapon}] call FUNC(fillRightPanel);
};
// Make unit switch to new item
@ -191,7 +192,7 @@ switch (GVAR(currentLeftPanel)) do {
TOGGLE_RIGHT_PANEL_WEAPON
[_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel);
[_display, _selectCorrectPanelWeapon, !GVAR(refreshing) && {_currentRightPanel isNotEqualTo _selectCorrectPanelWeapon}] call FUNC(fillRightPanel);
};
// Make unit switch to new item
@ -273,7 +274,7 @@ switch (GVAR(currentLeftPanel)) do {
_this call FUNC(fillRightPanel);
}, [_display, _selectCorrectPanelWeapon]] call CBA_fnc_execNextFrame;
} else {
[_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel);
[_display, _selectCorrectPanelWeapon, !GVAR(refreshing) && {_currentRightPanel isNotEqualTo _selectCorrectPanelWeapon}] call FUNC(fillRightPanel);
};
};
@ -347,7 +348,7 @@ switch (GVAR(currentLeftPanel)) do {
TOGGLE_RIGHT_PANEL_CONTAINER
[_display, _selectCorrectPanelContainer] call FUNC(fillRightPanel);
[_display, _selectCorrectPanelContainer, !GVAR(refreshing) && {_currentRightPanel isNotEqualTo _selectCorrectPanelContainer}] call FUNC(fillRightPanel);
};
// Make unit switch to new item
@ -385,7 +386,7 @@ switch (GVAR(currentLeftPanel)) do {
TOGGLE_RIGHT_PANEL_CONTAINER
[_display, _selectCorrectPanelContainer] call FUNC(fillRightPanel);
[_display, _selectCorrectPanelContainer, !GVAR(refreshing) && {_currentRightPanel isNotEqualTo _selectCorrectPanelContainer}] call FUNC(fillRightPanel);
};
// Make unit switch to new item
@ -423,7 +424,7 @@ switch (GVAR(currentLeftPanel)) do {
TOGGLE_RIGHT_PANEL_CONTAINER
[_display, _selectCorrectPanelContainer] call FUNC(fillRightPanel);
[_display, _selectCorrectPanelContainer, !GVAR(refreshing) && {_currentRightPanel isNotEqualTo _selectCorrectPanelContainer}] call FUNC(fillRightPanel);
};
// Make unit switch to new item
@ -538,7 +539,7 @@ switch (GVAR(currentLeftPanel)) do {
TOGGLE_RIGHT_PANEL_WEAPON
[_display, _selectCorrectPanelWeapon] call FUNC(fillRightPanel);
[_display, _selectCorrectPanelWeapon, !GVAR(refreshing) && {_currentRightPanel isNotEqualTo _selectCorrectPanelWeapon}] call FUNC(fillRightPanel);
};
// Make unit switch to new item

View File

@ -28,13 +28,15 @@ if (
) exitWith {};
// If object has no arsenal and chosen option is to not ignore virtual items of object, exit
if (isNil {_object getVariable QGVAR(virtualItems)} && {!_mode}) exitWith {
private _virtualItems = _object getVariable QGVAR(virtualItems);
if (isNil "_virtualItems" && {!_mode}) exitWith {
[LLSTRING(noVirtualItems), false, 5, 1] call EFUNC(common,displayText);
};
// Don't execute in scheduled environment
if (canSuspend) exitWith {
[{_this call FUNC(openBox)}, _this] call CBA_fnc_directCall;
[FUNC(openBox), _this] call CBA_fnc_directCall;
};
private _displayToUse = findDisplay IDD_RSCDISPLAYCURATOR;
@ -46,53 +48,23 @@ if (isNull _displayToUse || {!isNil QGVAR(camera)}) exitWith {
[LLSTRING(CantOpenDisplay), false, 5, 1] call EFUNC(common,displayText);
};
GVAR(center) = _center;
GVAR(currentBox) = _object;
if (_mode) then {
// Add all the items from the game that the arsenal has detected
GVAR(virtualItems) = +(uiNamespace getVariable QGVAR(configItems));
GVAR(virtualItemsFlat) = +(uiNamespace getVariable QGVAR(configItemsFlat));
GVAR(ignoredVirtualItems) = true;
} else {
// Add only specified items to the arsenal
private _virtualItems = _object getVariable QGVAR(virtualItems);
GVAR(virtualItems) = if (isNil "_virtualItems") then {
_virtualItems = [
[IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]],
[IDX_VIRT_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]]
];
_virtualItems = createHashMapFromArray _virtualItems;
for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do {
_virtualItems set [_index, createHashMap];
};
} else {
+_virtualItems
};
GVAR(virtualItems) = +_virtualItems;
// Flatten out hashmaps for easy checking later
private _virtualItemsFlat = +_virtualItems;
private _weapons = _virtualItemsFlat deleteAt IDX_VIRT_WEAPONS;
private _attachments = _virtualItemsFlat deleteAt IDX_VIRT_ATTACHMENTS;
for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do {
_virtualItemsFlat merge [_virtualItemsFlat deleteAt _index, true];
};
for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do {
_virtualItemsFlat merge [_weapons deleteAt _index, true];
};
for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do {
_virtualItemsFlat merge [_attachments deleteAt _index, true];
};
GVAR(virtualItemsFlat) = _virtualItemsFlat;
call FUNC(updateVirtualItemsFlat);
};
GVAR(center) = _center;
if (is3DEN) then {
_displayToUse createDisplay QGVAR(display);
} else {

View File

@ -6,6 +6,8 @@
*
* Arguments:
* 0: Update current and unique items lists <BOOL> (default: true)
* 1: Update virtual items list <BOOL> (default: false)
* 2: Use panel refresh animation <BOOL> (default: false)
*
* Return Value:
* None
@ -15,19 +17,54 @@
*
* Public: Yes
*/
params [["_updateItems", true, [true]]];
params [["_updateItems", true, [true]], ["_updateVirtualItems", false, [false]], ["_animate", false, [false]]];
TRACE_2("",_updateItems,_updateVirtualItems);
// Don't execute in scheduled environment
if (canSuspend) exitWith {
[{_this call FUNC(refresh)}, _this] call CBA_fnc_directCall;
};
if (_updateItems) then {
// Update current item list
call FUNC(updateCurrentItemsList);
// This takes care of unique inventory items (arsenal doesn't have it whitelisted)
if (!_updateVirtualItems) then {
call FUNC(updateUniqueItemsList);
};
};
private _virtualItems = GVAR(currentBox) getVariable QGVAR(virtualItems);
if (is3DEN) then {
_virtualItems = uiNamespace getVariable QGVAR(configItems); // GVAR(currentBox) is nil in 3DEN
_animate = true; // CBA frame functions are disabled during preInit
};
// Do not close an arsenal if it was opened with ignoring the existing content (see FUNC(openBox))
if (isNil "_virtualItems" && {isNil QGVAR(ignoredVirtualItems)}) exitWith {
[LLSTRING(noVirtualItems), false, 5, 1] call EFUNC(common,displayText);
// Delay a frame in case this is running on display open
[{(findDisplay IDD_ace_arsenal) closeDisplay 0}] call CBA_fnc_execNextFrame;
};
if (_updateVirtualItems) then {
GVAR(virtualItems) = +_virtualItems;
call FUNC(updateVirtualItemsFlat);
// Gotta update this regardless of condition to prevent desync
call FUNC(updateUniqueItemsList);
};
// Don't refresh left panel if in loadout tab
if (!isNull findDisplay IDD_loadouts_display) exitWith {};
if (!_animate) then {
GVAR(refreshing) = true;
[{GVAR(refreshing) = false}, nil, 3] call CBA_fnc_execAfterNFrames;
};
private _display = findDisplay IDD_ace_arsenal;
[_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel);
[_display, _display displayCtrl GVAR(currentLeftPanel), _animate] call FUNC(fillLeftPanel);

View File

@ -1,4 +1,5 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Alganthe, johnb43
* Remove arsenal from target.
@ -24,7 +25,7 @@ private _id = _object getVariable QGVAR(initBoxJIP);
if (_global && {isMultiplayer} && {!isNil "_id"}) then {
// Remove event from JIP queue
[_id] call CBA_fnc_removeGlobalEventJIP;
_id call CBA_fnc_removeGlobalEventJIP;
// Reset JIP ID
_object setVariable [QGVAR(initBoxJIP), nil, true];
@ -39,3 +40,10 @@ if (_global && {isMultiplayer} && {!isNil "_id"}) then {
[_object, 0, ["ACE_MainActions", QGVAR(interaction)]] call EFUNC(interact_menu,removeActionFromObject);
[QGVAR(boxRemoved), _object] call CBA_fnc_localEvent;
};
// If the arsenal is already open and not ignoring content (see FUNC(openBox)), close arsenal display
if (!isNil QGVAR(currentBox) && {GVAR(currentBox) isEqualTo _object} && {isNil QGVAR(ignoredVirtualItems)}) then {
[LLSTRING(noVirtualItems), false, 5, 1] call EFUNC(common,displayText);
// Delay a frame in case this is running on display open
[{(findDisplay IDD_ace_arsenal) closeDisplay 0}] call CBA_fnc_execNextFrame;
};

View File

@ -17,8 +17,10 @@
*/
params [["_name", "", [""]], ["_global", false, [false]]];
if (_global) then {
[QGVAR(removeDefaultLoadout), [_name]] call CBA_fnc_remoteEvent;
if (_global) exitWith {
private _eventID = format [QGVAR(loadouts_%1), _name];
[_eventID] call CBA_fnc_removeGlobalEventJIP;
[QGVAR(removeDefaultLoadout), [_name]] call CBA_fnc_globalEvent;
};
GVAR(defaultLoadoutsList) deleteAt (GVAR(defaultLoadoutsList) findIf {(_x select 0) == _name});

View File

@ -100,5 +100,12 @@ if (_items isEqualType true) then {
[_object, _global] call FUNC(removeBox);
} else {
_object setVariable [QGVAR(virtualItems), _cargo, _global];
// If the arsenal is already open, refresh arsenal display
if (_global) then {
[QGVAR(refresh), _object] call CBA_fnc_globalEvent;
} else {
[QGVAR(refresh), _object] call CBA_fnc_localEvent;
};
};
};

View File

@ -15,6 +15,10 @@
if (GVAR(centerNotPlayer)) exitWith {};
if (EGVAR(common,isReloading)) exitWith { // if player is reloading then wait until it's done so we don't send magazines to the shadow realm
[{!EGVAR(common,isReloading)}, FUNC(showItem)] call CBA_fnc_waitUntilAndExecute;
};
// Determine action to play based on current category selection
private _nextAction = switch (GVAR(currentLeftPanel)) do {
// Primary weapon
@ -54,10 +58,12 @@ if (_nextAction != GVAR(currentAction)) then {
case "PrimaryWeapon": {0};
case "SecondaryWeapon": {1};
case "HandGunOn": {2};
case "Binoculars": {3};
default {GVAR(selectedWeaponType)};
};
if (simulationEnabled GVAR(center)) then {
GVAR(center) call EFUNC(common,stopGesture); // reset gesture state (if arsenal is opened on animation transition, animations played whilst in the arsenal break)
GVAR(center) playActionNow _nextAction;
} else {
GVAR(center) switchAction _nextAction;
@ -65,3 +71,7 @@ if (_nextAction != GVAR(currentAction)) then {
GVAR(currentAction) = _nextAction;
};
if (!(GVAR(currentAction) in ["Civil", "Salute"])) then {
GVAR(center) selectWeapon ([primaryWeapon GVAR(center), secondaryWeapon GVAR(center), handgunWeapon GVAR(center), binocular GVAR(center)] select GVAR(selectedWeaponType)); // select correct weapon, prevents floating weapons
};

View File

@ -0,0 +1,42 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
* Text statement for the pointer slot capabilites.
*
* Arguments:
* 0: Not used
* 1: Item config path <CONFIG>
*
* Return Value:
* Stat Text <STRING>
*
* Example:
* [[], configFile >> "CfgWeapons" >> "acc_pointer_IR"] call ace_arsenal_fnc_statTextStatement_illuminators
*
* Public: No
*/
params ["", "_config"];
TRACE_1("statTextStatement_illuminators",_config);
private _allModes = [];
private _allItems = [configName _config] call CBA_fnc_switchableAttachments;
if (_allItems isEqualTo []) then { _allItems = [configName _config] };
{
private _xCfg = configFile >> "CfgWeapons" >> _x >> "ItemInfo";
private _laser = (getText (_xCfg >> "Pointer" >> "irLaserPos")) != "";
private _illum = (getNumber (_xCfg >> "Flashlight" >> "intensity")) > 0;
private _isIR = (_laser && {([_xCfg >> "Pointer" >> "isIR", "NUMBER", 1] call CBA_fnc_getConfigEntry) == 1})
|| {_illum && {([_xCfg >> "Flashlight" >> "irLight", "NUMBER", 0] call CBA_fnc_getConfigEntry) == 1}};
private _text = switch (true) do { // shorthand roughly based on PEQ-15
case (_laser && _illum): { if (_isIR) then { "IR-DUAL" } else { "VIS-DUAL" } };
case (_laser): { if (_isIR) then { "IR-AIM" } else { "VIS-AIM" } }; // AIM
case (_illum): { if (_isIR) then { "IR-ILM" } else { "VIS-ILM" } }; // ILLUMIATION
default { "_" }; // there are some purely cosmetic attachements
};
_allModes pushBackUnique _text;
} forEach _allItems;
_allModes joinString ", "

View File

@ -14,6 +14,6 @@
*/
params ["", "_config"];
TRACE_1("statTextStatement_magCount",_config)
TRACE_1("statTextStatement_magCount",_config);
getNumber (_config >> "count");

View File

@ -18,19 +18,18 @@
params ["_control", "_container", "_hasItems"];
private _loadRemaining = maxLoad _container - loadAbs _container;
private _rightPanelCache = uiNamespace getVariable [QGVAR(rightPanelCache), createHashMap];
private _mass = -1;
private _item = "";
private _color = [];
private _alpha = 1;
// Grey out items that are too big to fit in remaining space of the container
for "_row" from 0 to (lnbSize _control select 0) - 1 do {
_mass = _rightPanelCache getOrDefault [_control lnbData [_row, 0], 0];
_item = _control lnbData [_row, 0];
_color = _control lnbColor [_row, 1];
// Lower alpha on color for items that can't fit
_alpha = [0.25, 1] select (_mass <= _loadRemaining);
_alpha = [0.25, 1] select (_container canAdd _item);
_color set [3, _alpha];
_control lnbSetColor [[_row, 1], _color];
_control lnbSetColor [[_row, 2], [1, 1, 1, _alpha]];
@ -55,6 +54,6 @@ private _curSel = lnbCurSelRow _control;
// Disable '+' button if item is unique or too big to fit in remaining space
if (_curSel != -1) then {
private _plusButtonCtrl = _display displayCtrl IDC_arrowPlus;
_plusButtonCtrl ctrlEnable !((_control lnbValue [_curSel, 2]) == 1 || {(_rightPanelCache getOrDefault [_control lnbData [_curSel, 0], 0]) > _loadRemaining});
_plusButtonCtrl ctrlEnable ((_control lnbValue [_curSel, 2]) != 1 && {_container canAdd (_control lnbData [_curSel, 0])});
_plusButtonCtrl ctrlCommit FADE_DELAY;
};

View File

@ -125,7 +125,8 @@ private _fnc_uniqueEquipment = {
};
} forEach (getUnitLoadout GVAR(center)); // Only need items, not extended loadout
// Get all items from unit
_items = itemsWithMagazines GVAR(center) + backpacks GVAR(center);
private _isMagazine = false;
private _isWeapon = false;
private _isGrenade = false;
@ -136,6 +137,9 @@ private _simulationType = "";
private _configItemInfo = "";
private _hasItemInfo = false;
private _itemInfoType = 0;
private _baseWeapon = "";
private _weapons = GVAR(virtualItems) get IDX_VIRT_WEAPONS;
private _attachments = GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS;
{
_isMagazine = isClass (_cfgMagazines >> _x);
@ -184,8 +188,13 @@ private _itemInfoType = 0;
// Unknown
default {
// Don't add items that are part of the arsenal
if !(_x in GVAR(virtualItemsFlatAll)) then {
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, nil];
if (
!(_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)) &&
{!(_x in (GVAR(virtualItems) get IDX_VIRT_GRENADES))} &&
{!(_x in (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES))} &&
{!(_x in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL))}
) then {
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, true];
};
};
};
@ -199,11 +208,17 @@ private _itemInfoType = 0;
_itemInfoType = if (_hasItemInfo) then {getNumber (_configItemInfo >> "type")} else {0};
_isMiscItem = _x isKindOf ["CBA_MiscItem", _cfgWeapons];
_baseWeapon = if (!_isMiscItem) then {
_x call FUNC(baseWeapon)
} else {
_x
};
switch (true) do {
// Optics
case (
!(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS)) &&
{_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS) ||
!(_baseWeapon in (_attachments get IDX_VIRT_OPTICS_ATTACHMENTS)) &&
{_baseWeapon in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_OPTICS_ATTACHMENTS) ||
{_hasItemInfo &&
{!_isMiscItem} &&
{_itemInfoType == TYPE_OPTICS}}}
@ -212,8 +227,8 @@ private _itemInfoType = 0;
};
// Flashlights
case (
!(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)) &&
{_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS) ||
!(_baseWeapon in (_attachments get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)) &&
{_baseWeapon in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_FLASHLIGHT_ATTACHMENTS) ||
{_hasItemInfo &&
{!_isMiscItem} &&
{_itemInfoType == TYPE_FLASHLIGHT}}}
@ -222,8 +237,8 @@ private _itemInfoType = 0;
};
// Muzzle attachments
case (
!(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS)) &&
{_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS) ||
!(_baseWeapon in (_attachments get IDX_VIRT_MUZZLE_ATTACHMENTS)) &&
{_baseWeapon in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_MUZZLE_ATTACHMENTS) ||
{_hasItemInfo &&
{!_isMiscItem} &&
{_itemInfoType == TYPE_MUZZLE}}}
@ -232,8 +247,8 @@ private _itemInfoType = 0;
};
// Bipods
case (
!(_x in ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS)) &&
{_x in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS) ||
!(_baseWeapon in (_attachments get IDX_VIRT_BIPOD_ATTACHMENTS)) &&
{_baseWeapon in ((_configItems get IDX_VIRT_ATTACHMENTS) get IDX_VIRT_BIPOD_ATTACHMENTS) ||
{_hasItemInfo &&
{!_isMiscItem} &&
{_itemInfoType == TYPE_BIPOD}}}
@ -242,7 +257,7 @@ private _itemInfoType = 0;
};
// Misc. items
case (
!(_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)) &&
!(_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)) && // misc. items don't use 'baseWeapon'
{_x in (_configItems get IDX_VIRT_MISC_ITEMS) ||
{_hasItemInfo &&
{_isMiscItem &&
@ -254,9 +269,21 @@ private _itemInfoType = 0;
};
// Unknown
default {
// Don't add items that are part of the arsenal
if !(_x in GVAR(virtualItemsFlatAll)) then {
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, nil];
// Don't add attachments or misc. items
if (
!(_baseWeapon in (_attachments get IDX_VIRT_OPTICS_ATTACHMENTS)) &&
{!(_baseWeapon in (_attachments get IDX_VIRT_FLASHLIGHT_ATTACHMENTS))} &&
{!(_baseWeapon in (_attachments get IDX_VIRT_MUZZLE_ATTACHMENTS))} &&
{!(_baseWeapon in (_attachments get IDX_VIRT_BIPOD_ATTACHMENTS))} &&
{!(_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS))}
) then {
// If item is a weapon (including binos), make it unique
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x,
_baseWeapon in (_weapons get IDX_VIRT_PRIMARY_WEAPONS) ||
{_baseWeapon in (_weapons get IDX_VIRT_HANDGUN_WEAPONS)} ||
{_baseWeapon in (_weapons get IDX_VIRT_SECONDARY_WEAPONS)} ||
{_baseWeapon in (GVAR(virtualItems) get IDX_VIRT_BINO)}
];
};
};
};
@ -267,14 +294,14 @@ private _itemInfoType = 0;
};
// Facewear
case (isClass (_cfgGlasses >> _x)): {
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES) set [_x, nil];
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_GOGGLES) set [_x, !(_x in (GVAR(virtualItems) get IDX_VIRT_GOGGLES))];
};
// Unknown
default {
// Don't add items that are part of the arsenal
if !(_x in GVAR(virtualItemsFlatAll)) then {
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, nil];
(GVAR(virtualItems) get IDX_VIRT_UNIQUE_UNKNOWN_ITEMS) set [_x, true];
};
};
};
} forEach (keys ([GVAR(center), 0, 3, 3, 3, false] call EFUNC(common,uniqueUnitItems))); // Get all items from unit
} forEach (_items arrayIntersect _items);

View File

@ -0,0 +1,32 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: johnb43, Grim
* Updates flattened list of virtual items for checking
*
* Arguments:
* None
*
* Return Value:
* None
*
* Public: No
*/
private _virtualItemsFlat = +GVAR(virtualItems);
private _weapons = _virtualItemsFlat deleteAt IDX_VIRT_WEAPONS;
private _attachments = _virtualItemsFlat deleteAt IDX_VIRT_ATTACHMENTS;
for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do {
_virtualItemsFlat merge [_virtualItemsFlat deleteAt _index, true];
};
for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do {
_virtualItemsFlat merge [_weapons deleteAt _index, true];
};
for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do {
_virtualItemsFlat merge [_attachments deleteAt _index, true];
};
GVAR(virtualItemsFlat) = _virtualItemsFlat;

View File

@ -10,16 +10,18 @@ cba_diagnostic_projectileMaxLines = 10;
// Player pose
[{
switch (true) do {
case (primaryWeapon _this != ""): {
_this switchMove "amovpercmstpslowwrfldnon";
};
case (handgunWeapon _this != ""): {
_this switchMove "amovpercmstpslowwpstdnon";
};
default {
switch (currentWeapon _this) do {
case (""): {
_this switchMove "amovpercmstpsnonwnondnon";
};
case (primaryWeapon _this): {
_this switchMove "amovpercmstpslowwrfldnon";
};
case (handgunWeapon _this): {
_this switchMove "amovpercmstpslowwpstdnon";
};
case (binocular _this);
case (secondaryWeapon _this): {}; // deliberately nothing
};
}, _player] call CBA_fnc_execNextFrame;
@ -82,12 +84,13 @@ cba_diagnostic_projectileMaxLines = 10;
_x hideObject false;
} forEach allMissionObjects "";
private _unit = objNull,
private _unit = objNull;
// Update VR unit gear
{
_unit = _x;
removeVest _unit;
if (vest _player != "") then { _unit addVest vest _player; };
removeBackpack _unit;

View File

@ -8,7 +8,7 @@
<German>Verstecken</German>
<Polish>Ukryj</Polish>
<Japanese>隠す</Japanese>
<Italian>Nascondere</Italian>
<Italian>Nascondi</Italian>
<Korean>숨김</Korean>
<Chinese>隱藏</Chinese>
<Chinesesimp>隐藏</Chinesesimp>
@ -23,7 +23,7 @@
<French>Masque l'interface</French>
<German>Oberfläche verstecken</German>
<Polish>Ukryj interfejs</Polish>
<Japanese>インターフェスを隠す</Japanese>
<Japanese>インターフェスを隠す</Japanese>
<Italian>Nascondi interfaccia</Italian>
<Korean>인터페이스 숨기기</Korean>
<Chinese>隱藏介面</Chinese>
@ -98,12 +98,12 @@
<Turkish>Kapat</Turkish>
</Key>
<Key ID="STR_ACE_Arsenal_noVirtualItems">
<English>No virtual item available</English>
<English>No virtual items available</English>
<Spanish>Ningún objeto virtual disponible</Spanish>
<French>Aucun objet virtuel disponible.</French>
<German>Kein virtuelles Objekt verfügbar</German>
<Polish>Brak dostępnych przedmiotów wirtualnych</Polish>
<Japanese>利用可能なバーチャル アイテムはありません</Japanese>
<Japanese>利用可能な仮想アイテムはありません</Japanese>
<Italian>Nessun oggetto virtuale disponibile</Italian>
<Korean>가상장비 사용 불가</Korean>
<Chinese>沒有可用的虛擬物品</Chinese>
@ -149,14 +149,14 @@
<English>[Shift+Click to save to mission defaults]</English>
<Spanish>[Shift+Click para guardar equipamiento predefinido</Spanish>
<German>[Umschalt+Linksklick um als Standard-Missionsausrüstung zu speichern]</German>
<Japanese>[Shift + クリック] でミッション標準として保存します</Japanese>
<Japanese>[Shift + クリックでミッション標準装備として保存します]</Japanese>
<Polish>Shift + Klik aby zapisac jako domyślne dla misji </Polish>
<Russian>[Shift+Клик, чтобы сохранить в настройках по умолчанию]</Russian>
<Portuguese>[Shift+Clique para salvar nos padrões da missão]</Portuguese>
<French>[Shift+Clic pour enregistrer en tant qu'équipement prédéfini.]</French>
<Chinese>[Shift+左鍵來保存至任務預設]</Chinese>
<Chinesesimp>[Shift+左鍵 以保存至任务默认值]</Chinesesimp>
<Italian>[Shift+Click per salvare la missione con gli equipaggiamenti predefiniti]</Italian>
<Italian>[Shift+Click per salvare come equipaggiamento predefinito della missione]</Italian>
<Czech>[Shift+Klik pro uložení jako standardního vybavení pro misi]</Czech>
<Turkish>[Shift+Click varsayılan kıyafetlere kaydet]</Turkish>
<Korean>[쉬프트+클릭 하여 임무 기본으로 설정]</Korean>
@ -279,8 +279,8 @@
<French>Équipements prédéfinis</French>
<German>Standard-Ausrüstungen</German>
<Polish>Domyślne zestawy</Polish>
<Japanese>標準装備</Japanese>
<Italian>Equipaggiamenti standard</Italian>
<Japanese>標準装備</Japanese>
<Italian>Equipaggiamenti predefiniti</Italian>
<Korean>기본 로드아웃</Korean>
<Chinese>預設裝備</Chinese>
<Chinesesimp>默认负载</Chinesesimp>
@ -295,7 +295,7 @@
<French>Sets d'équipement mis à disposition par le créateur de mission.</French>
<German>Ausrüstungen, die durch den Missionsersteller zur Verfügung gestellt worden sind</German>
<Polish>Zestawy udostępnione przez twórcę misji</Polish>
<Japanese>装備はミッション著者によって利用できま</Japanese>
<Japanese>ミッション著者によって作成された装備で</Japanese>
<Italian>Equipaggiamenti resi disponibili dal creatore della missione</Italian>
<Korean>미션메이커가 허용한 로드아웃</Korean>
<Chinese>任務作者提供的預設裝備</Chinese>
@ -343,7 +343,7 @@
<French>Trier par poids</French>
<German>Nach Gewicht sortieren</German>
<Polish>Sortuj wg wagi</Polish>
<Japanese>重量並び替え</Japanese>
<Japanese>重量順に並び替え</Japanese>
<Italian>Ordina per peso</Italian>
<Korean>무게 순서로 정렬</Korean>
<Chinese>以重量排序</Chinese>
@ -359,8 +359,8 @@
<French>Trier par quantité</French>
<German>Nach Menge sortieren</German>
<Polish>Sortuj wg ilości</Polish>
<Japanese>量で並び替え</Japanese>
<Italian>Ordina per quantitativo</Italian>
<Japanese>数量順に並び替え</Japanese>
<Italian>Ordina per quantità</Italian>
<Korean>갯수 순서로 정렬</Korean>
<Chinese>以數量排序</Chinese>
<Chinesesimp>以数量排序</Chinesesimp>
@ -373,81 +373,95 @@
<English>Sort by load</English>
<German>Nach Tragelast sortieren</German>
<French>Trier par capacité de chargement</French>
<Japanese>容量で並び替え</Japanese>
<Italian>Ordina per capacità di carico</Italian>
<Japanese>容量順に並び替え</Japanese>
<Spanish>Ordenar por capacidad</Spanish>
<Russian>Сортировка по вместимости</Russian>
<Polish>Sortuj po rozmiarze</Polish>
<Korean>공간 순서로 정렬</Korean>
<Chinesesimp>以容量排序</Chinesesimp>
<Portuguese>Ordenar por capacidade</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortByAccuracyText">
<English>Sort by accuracy</English>
<German>Nach Genauigkeit sortieren</German>
<French>Trier par précision</French>
<Japanese>精度で並び替え</Japanese>
<Italian>Ordina per precisione</Italian>
<Japanese>精度順に並び替え</Japanese>
<Turkish>Isabet doğruluğuna göre sırala</Turkish>
<Spanish>Ordenar por precisión</Spanish>
<Russian>Сортировка по точности</Russian>
<Polish>Sortuj po celności</Polish>
<Korean>정확도 순서로 정렬</Korean>
<Chinesesimp>以精度排序</Chinesesimp>
<Portuguese>Ordenar por precisão</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortByRateOfFireText">
<English>Sort by rate of fire</English>
<German>Nach Schussrate sortieren</German>
<French>Trier par cadence de tir</French>
<Japanese>連射速度で並び替え</Japanese>
<Italian>Ordina per cadenza di tiro</Italian>
<Japanese>連射速度順に並び替え</Japanese>
<Turkish>Atış hızına göre sırala</Turkish>
<Spanish>Ordenar por cadencia de tiro</Spanish>
<Russian>Сортировка по темпу стрельбы</Russian>
<Polish>Sortuj po szybkostrzelności</Polish>
<Korean>발사속도 순서로 정렬</Korean>
<Chinesesimp>以射速排序</Chinesesimp>
<Portuguese>Ordenar por cadência</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortByMagnificationText">
<English>Sort by magnification</English>
<German>Nach Vergrößerung sortieren</German>
<French>Trier par grossissement</French>
<Japanese>倍率で並び替え</Japanese>
<Italian>Ordina per ingrandimento</Italian>
<Japanese>倍率順に並び替え</Japanese>
<Spanish>Ordenar por magnificación</Spanish>
<Russian>Сортировка по кратности приближения</Russian>
<Polish>Sortuj po przybliżeniu</Polish>
<Korean>배율 순서로 정렬</Korean>
<Chinesesimp>以放大倍数排序</Chinesesimp>
<Portuguese>Ordenar por magnificação</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortByMagCountText">
<English>Sort by ammo count</English>
<German>Nach Munitionszahl sortieren</German>
<French>Trier par nombre de munitions</French>
<Japanese>装弾数で並び替え</Japanese>
<Italian>Ordina per numero di colpi</Italian>
<Japanese>装弾数順に並び替え</Japanese>
<Turkish>Mermi sayısına göre sırala</Turkish>
<Spanish>Ordenar por cantidad de munición</Spanish>
<Russian>Сортировка по количеству боеприпасов</Russian>
<Polish>Sortuj po ilości amunicji</Polish>
<Korean>총알 갯수 순서롤 정렬</Korean>
<Chinesesimp>以弹量排序</Chinesesimp>
<Portuguese>Ordenar por quantidade de munição</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortByProtectionBallistic">
<English>Sort by ballistic protection</English>
<French>Trier par protection balistique</French>
<Japanese>防弾性能で並び替え</Japanese>
<Italian>Ordina per protezione balistica</Italian>
<Japanese>防弾性能順に並び替え</Japanese>
<Spanish>Ordenar por protección balística</Spanish>
<Russian>Сортировка по баллистической защите</Russian>
<Polish>Sortuj po ochronie balistycznej</Polish>
<German>Nach ballistischem Schutz sortieren</German>
<Korean>방탄 성능 순서로 정렬</Korean>
<Chinesesimp>以防弹性能排序</Chinesesimp>
<Portuguese>Ordenar por proteção balística</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortByProtectionExplosive">
<English>Sort by explosive protection</English>
<French>Trier par résistance aux explosifs</French>
<Japanese>防爆性能で並び替え</Japanese>
<Italian>Ordina per protezione esplosiva</Italian>
<Japanese>防爆性能順に並び替え</Japanese>
<Spanish>Ordenar por protección de explosivos</Spanish>
<Russian>Сортировка по защите от взрывов</Russian>
<Polish>Sortuj po ochronie przeciw wybuchom</Polish>
<German>Nach Explosionsschutz sortieren</German>
<Korean>방폭 성능 순서로 정렬</Korean>
<Chinesesimp>以防爆性能排序</Chinesesimp>
<Portuguese>Ordenar por proteção a explosivos</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_buttonShareTooltip">
<English>Share or stop sharing the selected loadout</English>
@ -503,8 +517,8 @@
<French>La liste des équipements prédéfinis est vide !</French>
<German>Die Standard-Ausrüstungen-Liste ist leer!</German>
<Polish>Lista domyślnych zestawów jest pusta!</Polish>
<Japanese>標準装備一欄が空です!</Japanese>
<Italian>La lista degli equipaggiamenti standard è vuota!</Italian>
<Japanese>標準装備の一覧は空です!</Japanese>
<Italian>La lista degli equipaggiamenti predefiniti è vuota!</Italian>
<Korean>기본 로드아웃 목록이 비어있습니다!</Korean>
<Chinese>沒有預設的裝備清單!</Chinese>
<Chinesesimp>没有默认负载清单!</Chinesesimp>
@ -519,8 +533,8 @@
<French>Liste des équipements prédéfinis exportée dans le presse-papier.</French>
<German>Standard-Ausrüstungen-Liste in die Zwischenablage exportiert</German>
<Polish>Lista domyślnych zestawów została eksportowana do schowka</Polish>
<Japanese>標準装備一欄はクリップボードへエクスポートされました</Japanese>
<Italian>La lista degli equipaggiamenti standard è stata esportata negli appunti</Italian>
<Japanese>標準装備の一覧をクリップボードへエクスポートました</Japanese>
<Italian>La lista degli equipaggiamenti predefiniti è stata esportata negli appunti</Italian>
<Korean>클립보드에 기본 로드아웃 목록 내보내기</Korean>
<Chinese>預設的裝備清單已匯出到剪貼簿中</Chinese>
<Chinesesimp>默认负载清单已导出到剪贴板</Chinesesimp>
@ -535,7 +549,7 @@
<French>Équipement actuel exporté dans le presse-papier.</French>
<German>Derzeitige Ausrüstung in die Zwischenablage exportiert</German>
<Polish>Obecny zestaw został eksportowany do schowka</Polish>
<Japanese>現在の装備クリップボードへ出力されました</Japanese>
<Japanese>現在の装備クリップボードへ出力ました</Japanese>
<Italian>Equipaggiamento corrente esportato negli appunti</Italian>
<Korean>현재 로드아웃을 클립보드로 내보냈습니다.</Korean>
<Chinese>當前的裝備已匯出到剪貼簿中</Chinese>
@ -567,8 +581,8 @@
<French>Liste des équipements prédéfinis importée depuis le presse-papier.</French>
<German>Standard-Ausrüstungen-Liste aus der Zwischenablage importiert</German>
<Polish>Lista domyślnych zestawów została importowana ze schowka</Polish>
<Japanese>標準装備一欄はクリップボードからインポートされました</Japanese>
<Italian>La lista degli equipaggiamenti standard è stata importata dagli appunti</Italian>
<Japanese>標準装備の一覧をクリップボードからインポートました</Japanese>
<Italian>La lista degli equipaggiamenti predefiniti è stata importata dagli appunti</Italian>
<Korean>클립보드에서 기본 로드아웃 가져오기</Korean>
<Chinese>預設的裝備清單已從剪貼簿中匯入</Chinese>
<Chinesesimp>默认负载已从剪贴板导入</Chinesesimp>
@ -583,7 +597,7 @@
<French>Set d'équipement importé depuis le presse-papier.</French>
<German>Ausrüstung aus der Zwischenablage importiert</German>
<Polish>Zestaw został importowany ze schowka</Polish>
<Japanese>装備クリップボードからインポートされました</Japanese>
<Japanese>装備クリップボードからインポートました</Japanese>
<Italian>Equipaggiamento importato dagli appunti</Italian>
<Korean>클립보드에서 로드아웃을 가져왔습니다.</Korean>
<Chinese>裝備已從剪貼簿中匯入</Chinese>
@ -728,7 +742,7 @@
<German>wurde umbenannt in</German>
<Polish>zmienił nazwę na</Polish>
<Japanese>次の名前に変更されました</Japanese>
<Italian>E' stato rinominato in</Italian>
<Italian>È stato rinominato in</Italian>
<Korean>이름이 다음과 같이 변경됨:</Korean>
<Chinese>已被改名為</Chinese>
<Chinesesimp>已被改名为</Chinesesimp>
@ -775,7 +789,7 @@
<French>Taille de police des panneaux</French>
<German>Schrifthöhe für die linke und rechte Liste</German>
<Polish>Wysokość czcionki</Polish>
<Japanese>パネルにあるフォントの高さ</Japanese>
<Japanese>パネルフォントの高さ</Japanese>
<Italian>Altezza carattere del pannello</Italian>
<Korean>패널 폰트 높이</Korean>
<Chinese>面板字體高度</Chinese>
@ -791,8 +805,8 @@
<French>Autoriser les équipements prédéfinis</French>
<German>Erlaubt die Benutzung der Standardausrüstungen</German>
<Polish>Zezwól na użycie domyślnych zestawów</Polish>
<Japanese>標準装備を許可</Japanese>
<Italian>Consenti equipaggiamenti standard</Italian>
<Japanese>標準装備を許可</Japanese>
<Italian>Consenti equipaggiamenti predefiniti</Italian>
<Korean>기본 로드아웃 허용</Korean>
<Chinese>允許預設裝備</Chinese>
<Chinesesimp>允许默认负载</Chinesesimp>
@ -807,7 +821,7 @@
<French>Autoriser le partage des sets d'équipement</French>
<German>Erlaubt das Teilen von Ausrüstungen</German>
<Polish>Zezwól na udostępnianie zestawów</Polish>
<Japanese>装備共有を許可</Japanese>
<Japanese>装備共有を許可</Japanese>
<Italian>Consenti condivisione equipaggiamenti</Italian>
<Korean>로드아웃 공유 허용</Korean>
<Chinese>允許分享裝備</Chinese>
@ -902,8 +916,8 @@
<Spanish>Permitir el uso de la pestaña de equipamientos por defecto</Spanish>
<French>Active l'onglet "Équipements prédéfinis".</French>
<Polish>Zezwól na użycie zakładki domyślnych zestawów</Polish>
<Japanese>標準装備タブの使用を許可します</Japanese>
<Italian>Consenti l'uso della sezione per gli equipaggiamenti standard</Italian>
<Japanese>標準装備タブの使用を許可します</Japanese>
<Italian>Consenti l'uso della sezione per gli equipaggiamenti predefiniti</Italian>
<Korean>기본 로드아웃 탭 사용 허가</Korean>
<German>Erlaube die Nutzung des Standardausrüstungsreiters</German>
<Chinese>允許使用預設的裝備</Chinese>
@ -918,7 +932,7 @@
<Spanish>Mostrar / ocultar iconos de mods en el panel izquierdo</Spanish>
<French>Affiche/masque les icônes de mod du panneau gauche.</French>
<Polish>Pokaż / ukryj ikony modów w lewym panelu</Polish>
<Japanese>左パネルにある MOD アイコン表示 / 非表示します</Japanese>
<Japanese>左パネルにあるMODアイコン表示/非表示します</Japanese>
<Italian>Mostra / nascondi le icone delle mod dal pannello sinistro</Italian>
<Korean>왼쪽 패널의 모드 아이콘 표시 / 숨기기</Korean>
<German>Zeigt/Versteckt Mod-Symbole in der linken Leiste</German>
@ -934,7 +948,7 @@
<Spanish>Cambiar el tamaño de fuente para el texto de los paneles izquierdo y derecho</Spanish>
<French>Change la taille de police des panneaux latéraux.</French>
<Polish>Zmień wysokość czcionki dla tekstu lewego i prawego panelu</Polish>
<Japanese>パネルにあるフォントの高さを変更します。</Japanese>
<Japanese>左右パネル内の文字フォントの高さを変更します。</Japanese>
<Italian>Cambia l'altezza del font per il testo sul pannello sinistro / destro</Italian>
<Korean>왼쪽 / 오른쪽 패널 텍스트의 글꼴 높이 변경</Korean>
<German>Ändert die Schriftgröße für die linke/rechte Leiste</German>
@ -950,7 +964,7 @@
<Spanish>Registrar elementos no encontrados o no disponibles en el RPT</Spanish>
<French>Consigne les objets manquants ou indisponibles dans le RPT.</French>
<Polish>Rejestruj brakujące / niedostępne przedmioty do pliku RPT</Polish>
<Japanese>PRT で欠落 / 利用不可アイテムを記録します</Japanese>
<Japanese>PRTに欠落/利用不可アイテムを記録します</Japanese>
<Italian>Log mancante / oggetto non disponibile nell' RPT</Italian>
<Korean>RPT에 누락 된 항목 / 사용할 수없는 항목 기록</Korean>
<German>Fehlende Gegenstände werden in der RPT aufgezeichnet</German>
@ -982,7 +996,7 @@
<Spanish>Importar equipamientos de BI Arsenal hacia el arsenal de ACE</Spanish>
<French>Importer les sets BI VA dans l'arsenal ACE</French>
<German>Importiert die BI-VA-Ausrüstungen in das ACE-Arsenal</German>
<Japanese>標準の VA 装備から ACE 武器庫へ取り込み</Japanese>
<Japanese>BI 武器庫の装備を ACE 武器庫へインポート</Japanese>
<Korean>바닐라 로드아웃을 ACE 아스날로 가져오기</Korean>
<Chinese>匯入BI原廠虛擬軍火庫的裝備到ACE虛擬軍火庫中</Chinese>
<Chinesesimp>导入 BI 原版虚拟军火库的负载到 ACE 虚拟军火库中</Chinesesimp>
@ -997,7 +1011,7 @@
<Spanish>Ninguna unidad de jugador disponible! Coloca una unidad y márcala como "Jugador".</Spanish>
<French>Aucune unité joueur disponible ! Placez une unité et marquez-la en tant que "joueur".</French>
<German>Keine Spielereinheit verfügbar. Setze eine Einheit und markiere sie als "Spieler".</German>
<Japanese>プレイヤーユニットがありません!ユニットを設置し"Player"と名付けてください。</Japanese>
<Japanese>プレイヤーユニットがありません!ユニットを設置し"プレイヤー"に設定してください。</Japanese>
<Korean>플레이어 유닛을 사용할 수 없습니다! 유닛을 놓고 "플레이어"라고 표시하십시오.</Korean>
<Chinese>沒有可用的玩家單位!請擺放一個單位並設定成"玩家"</Chinese>
<Chinesesimp>没有可用的玩家单位!请摆放一个单位并设定成“玩家”。</Chinesesimp>
@ -1138,7 +1152,7 @@
<French>Taux de potassium</French>
<Chinesesimp>钾水平</Chinesesimp>
<Chinese>鉀水平</Chinese>
<Italian>Ilvello di potassio</Italian>
<Italian>Livello di potassio</Italian>
<Polish>Poziomy potasu</Polish>
<Russian>Уровень Калия</Russian>
<Portuguese>Níveis de Potássio</Portuguese>
@ -1228,7 +1242,7 @@
<English>Not Supported</English>
<Spanish>No soportada</Spanish>
<German>Nicht unterstützt</German>
<Japanese>セカンダリに内蔵</Japanese>
<Japanese>非対応</Japanese>
<Polish>Nie wspierane</Polish>
<Italian>Non supportato</Italian>
<Russian>Не поддерживается</Russian>
@ -1282,7 +1296,7 @@
<Spanish>Nocturna</Spanish>
<Italian>Notturno</Italian>
<French>Nocturne</French>
<Japanese>暗視装置</Japanese>
<Japanese>暗視</Japanese>
<Korean>야간</Korean>
<Chinesesimp>夜视</Chinesesimp>
<Chinese>夜視</Chinese>
@ -1298,7 +1312,7 @@
<Spanish>Térmica</Spanish>
<Italian>Termico</Italian>
<French>Thermique</French>
<Japanese>画像</Japanese>
<Japanese>熱画像</Japanese>
<Korean>열상</Korean>
<Chinesesimp>热成像</Chinesesimp>
<Chinese>熱成像</Chinese>
@ -1325,7 +1339,7 @@
<Spanish>Habilitar las pestañas de caras / voces / insignias</Spanish>
<German>Aktiviere die Gesichter-, Stimmen- und Abzeichenübersicht</German>
<French>Activer les onglets visages/voix/insignes</French>
<Japanese> / 声 / 記章(バッジ)タブを有効化</Japanese>
<Japanese>/声/バッジ(記章)タブを有効化</Japanese>
<Chinesesimp>启用脸谱/语音/徽章选项</Chinesesimp>
<Chinese>啟用臉譜/聲音/徽章選項</Chinese>
<Italian>Abilita volti, voci e insegne</Italian>
@ -1435,7 +1449,7 @@
<English>Export current items list as an array for use in scripts</English>
<Spanish>Exportar la lista actual de objetos como una tabla para su uso en scripts</Spanish>
<German>Exportiert aktuelle Gegenstände als Array, um es in Scripten zu verwenden</German>
<Japanese>スクリプト用に現在のアイテム リストをアレイでエクスポートします</Japanese>
<Japanese>スクリプト用に現在のアイテムリストをアレイでエクスポートします</Japanese>
<Italian>Esporta l'attuale lista di elementi come un array, per essere usati negli script</Italian>
<Polish>Eksportuj obecną listę przedmiotów jako tablicę do wykorzystania w skryptach</Polish>
<Portuguese>Exportar a lista atual de itens como uma matriz para usar em scripts</Portuguese>
@ -1481,7 +1495,7 @@
<Spanish>Añade automáticamente accesorios o cargadores (de la categoría seleccionada) a todas las armas de la lista de objetos</Spanish>
<German>Es werden automatisch kompatible Aufsätze oder Magazine für alle ausgewählten Waffen hinzugefügt</German>
<Polish>Automatycznie doda kompatybilne dodatki oraz magazynki (odpowiednio do każdej kategorii) dla wszystkich broni na liście</Polish>
<Japanese>現在のアイテム リスト内にある全武器に対応するアタッチメントと弾倉 (選択したカテゴリに基づき) を自動的に追加します</Japanese>
<Japanese>現在のアイテムリスト内にある全武器に対応する アタッチメントと弾倉(選択したカテゴリに基づく)を自動的に追加します</Japanese>
<Russian>Добавляет совместимые приспособления или магазины (в зависимости от выбранной категории) для всего оружия в текущем списке предметов</Russian>
<Portuguese>Irá automaticamente adicionar acessórios ou carregadores (baseado na categoria selecionada) para todas as armas na lista de itens atual</Portuguese>
<French>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.</French>
@ -1496,9 +1510,9 @@
<Spanish>Tiempo de vida</Spanish>
<German>Lebenszeit</German>
<French>Durée d'expiration</French>
<Japanese>効時間</Japanese>
<Japanese>力持続時間</Japanese>
<Polish>Czas by żyć</Polish>
<Italian>Scadenza (TTL)</Italian>
<Italian>Tempo di vita</Italian>
<Russian>Время действия</Russian>
<Portuguese>Time to live</Portuguese>
<Chinese>有效時間</Chinese>
@ -1513,14 +1527,17 @@
<Russian>Задержка детонации</Russian>
<Polish>Opoźnienie zapalnika</Polish>
<Japanese>信管設定時間</Japanese>
<Italian>Tempo di spoletta</Italian>
<Spanish>Tiempo de espoleta</Spanish>
<German>Detonationsverzögerung</German>
<Chinesesimp>引信时间</Chinesesimp>
<Korean>신관 시간</Korean>
<Portuguese>Atraso de detonação</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_DetonatesOnImpact">
<English>Detonates on impact</English>
<German>Aufschlagzünder</German>
<Italian>Spoletta a impatto</Italian>
<French>Détonation à l'impact</French>
<Russian>Детонация от удара</Russian>
<Polish>Detonuj przy uderzeniu</Polish>
@ -1528,47 +1545,63 @@
<Spanish>Detona mediante impacto</Spanish>
<Chinesesimp>碰炸引信</Chinesesimp>
<Korean>충격 신관</Korean>
<Portuguese>Detona por impacto</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutsSaveFaceSetting">
<English>Save Face</English>
<Korean>얼굴 저장</Korean>
<Russian>Сохранить лицо</Russian>
<Spanish>Guardar Cara</Spanish>
<Italian>Salva faccia</Italian>
<Japanese>顔の保存</Japanese>
<Polish>Zapisz Twarz</Polish>
<German>Gesicht Speichern</German>
<French>Sauvegarder le visage</French>
<Portuguese>Salvar Rosto</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutsSaveVoiceSetting">
<English>Save Voice</English>
<Korean>목소리 저장</Korean>
<Russian>Сохранить голос</Russian>
<Spanish>Guardar Voz</Spanish>
<Italian>Salva voce</Italian>
<Japanese>声の保存</Japanese>
<Polish>Zapisz Głos</Polish>
<German>Stimme Speichern</German>
<French>Sauvegarder la voix</French>
<Portuguese>Salvar Voz</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutsSaveInsigniaSetting">
<English>Save Insignia</English>
<Korean>계급장 저장</Korean>
<Russian>Сохранить эмблему</Russian>
<Spanish>Guardar Insignia</Spanish>
<Japanese>記章(バッジ)の保存</Japanese>
<Italian>Salva insegna</Italian>
<Japanese>バッジ(記章)の保存</Japanese>
<Polish>Zapisz Naszywkę</Polish>
<German>Insignia Speichern</German>
<French>Sauvegarder l'insigne</French>
<Portuguese>Salvar Insígnia</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortDescending">
<English>Descending</English>
<Japanese></Japanese>
<Japanese></Japanese>
<Polish>Malejąco</Polish>
<German>Absteigend</German>
<Italian>Decrescente</Italian>
<Korean>내림차순</Korean>
<French>Décroissant</French>
<Portuguese>Decrescente</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_sortAscending">
<English>Ascending</English>
<Japanese>昇順</Japanese>
<Polish>Rosnąco</Polish>
<German>Aufsteigend</German>
<Italian>Ascendente</Italian>
<Korean>오름차순</Korean>
<French>Croissant</French>
<Portuguese>Crescente</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_toolsTab">
<English>Tools</English>
@ -1591,42 +1624,76 @@
<Japanese>弾薬数</Japanese>
<Polish>Ilość amunicji</Polish>
<German>Munitionszahl</German>
<Italian>Numero di colpi</Italian>
<Korean>장탄 수</Korean>
<French>Nombre de munitions</French>
<Portuguese>Quantidade de munição</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_statIlluminators">
<English>Illuminators</English>
<French>Illuminateurs</French>
<Italian>Illuminanti</Italian>
<German>Leuchtmittel</German>
<Korean>조명</Korean>
<Portuguese>Iluminadores</Portuguese>
<Japanese>イルミネーター</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesSetting">
<English>Default to Favorites</English>
<Japanese>お気に入りをデフォルト</Japanese>
<Japanese>お気に入りを標準に</Japanese>
<Polish>Domyślnie do Ulubionych</Polish>
<Italian>Mostra solo Preferiti come predefinito</Italian>
<German>Standardmäßig auf Favoriten eingestellt</German>
<Korean>즐겨찾기 기본값</Korean>
<French>Favoris par défaut</French>
<Portuguese>Favoritos por padrão</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesTooltip">
<English>Controls whether the ACE Arsenal defaults to showing all items or favorites.</English>
<Japanese>ACE Arsenalがデフォルトで全てのアイテムを表示するか、お気に入りを表示するかを制御します。</Japanese>
<Japanese>ACE 武器庫が標準ですべてのアイテムを表示するか、お気に入りを表示するかを制御します。</Japanese>
<Polish>Kontroluje, czy ACE Arsenal domyślnie wyświetla wszystkie przedmioty, czy tylko ulubione.</Polish>
<Italian>Controlla se lo stato predefinito dell'arsenale ACE mostra tutti gli oggetti o solo i preferiti.</Italian>
<German>Steuert, ob das ACE Arsenal standardmäßig alle Gegenstände oder nur Favoriten anzeigt.</German>
<Korean>ACE 아스널이 기본적으로 모든 아이템 또는 즐겨찾기를 표시할 지 여부를 조정합니다.</Korean>
<French>Contrôle si l'arsenal ACE affiche par défaut tous les éléments ou les favoris.</French>
<Portuguese>Controla se o Arsenal ACE exibe por padrão todos os itens ou favoritos.</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorSetting">
<English>Favorites Color</English>
<Japanese>お気に入りの色</Japanese>
<Polish>Kolor Ulubionych</Polish>
<German>Favoritenfarbe</German>
<Italian>Colore preferiti</Italian>
<Korean>즐겨찾기 색상</Korean>
<French>Couleurs favorites</French>
<Portuguese>Cor dos favoritos</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorTooltip">
<English>Highlight color for favorited items.</English>
<Japanese>お気に入りアイテムのハイライト色。</Japanese>
<Polish>Kolor podświetlenia ulubionych elementów.</Polish>
<German>Hervorhebungsfarbe für Lieblingsgegenstände.</German>
<Italian>Colore che mette in mostra i preferiti nella lista.</Italian>
<Korean>즐겨찾기한 아이템을 색상으로 강조합니다.</Korean>
<French>Met en surbrillance les éléments favoris.</French>
<Portuguese>Cor de destaque para itens favoritados.</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_buttonFavoritesTooltip">
<English>Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item.</English>
<Japanese>Shiftを押しながらダブルクリックするとアイテムを追加・削除できます。</Japanese>
<Japanese>アイテムをすべて表示するかお気に入りのみを表示するかを切り替えます。\nアイテムをお気に入りに追加または削除するには、Shiftキーを押しながらダブルクリックます。</Japanese>
<Polish>Przełączanie między wyświetlaniem wszystkich przedmiotów lub tylko ulubionych. \nKliknij dwukrotnie, przytrzymując Shift, aby dodać lub usunąć przedmiot.</Polish>
<German>Wechseln Sie zwischen der Anzeige aller Elemente oder Ihrer Favoriten.\nDoppelklicken Sie bei gedrückter Umschalttaste, um ein Element hinzuzufügen oder zu entfernen.</German>
<Italian>Cambia tra mostrare tutti gli oggetti o solo i tuoi preferiti.\nShift + Doppio Click per aggiungere o rimuovere un preferito.</Italian>
<Korean>모든 아이템을 표시하거나 즐겨찾기를 표시할 때 전환합니다\nShift 키를 누른 상태에서 두 번 클릭하여 아이템을 추가하거나 제거합니다.</Korean>
<French>Change entre l'affichage de tous les éléments ou de vos favoris.\nDouble-cliquez en maintenant la touche Maj enfoncée pour ajouter ou supprimer un élément.</French>
<Portuguese>Alterna entre a exibição de todos os itens ou seus favoritos.\nClique duas vezes enquanto mantém pressionada a tecla Shift para adicionar ou remover um item.</Portuguese>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSearchTooltip">
<English>Search\nCTRL + Click to enable live results</English>
<German>Suche\nSTRG + Click für Live-Aktualisierung während des Schreibens</German>
<Italian>Cerca\nCTRL + Click per modificare i risultati mentre scrivi</Italian>
<Japanese>検索\nCTRL + クリックで検索結果の即時表示を有効化</Japanese>
<Korean>검색\nCtrl + 클릭으로 실시간 검색 결과를 활성화</Korean>
</Key>
</Package>
</Project>

View File

@ -4,12 +4,12 @@
class GVAR(display) {
idd = IDD_ace_arsenal;
enableSimulation = 1;
onLoad = QUOTE([ARR_3('onLoad', _this, QQGVAR(display))] call FUNC(onArsenalOpen));
onUnload = QUOTE([ARR_3('onUnload', _this, QQGVAR(display))] call FUNC(onArsenalClose));
onKeyDown = QUOTE([ARR_3('onKeyDown', _this, QQGVAR(display))] call FUNC(onKeyDown));
onLoad = QUOTE([ARR_3('onLoad',_this,QQGVAR(display))] call FUNC(onArsenalOpen));
onUnload = QUOTE([ARR_3('onUnload',_this,QQGVAR(display))] call FUNC(onArsenalClose));
onKeyDown = QUOTE([ARR_3('onKeyDown',_this,QQGVAR(display))] call FUNC(onKeyDown));
onKeyUp = QUOTE(GVAR(shiftState) = _this select 2);
onMouseButtonDown = QUOTE([ARR_3('onMouseButtonDown', _this, QQGVAR(display))] call FUNC(onMouseButtonDown));
onMouseButtonUp = QUOTE([ARR_3('onMouseButtonUp', _this, QQGVAR(display))] call FUNC(onMouseButtonUp));
onMouseButtonDown = QUOTE([ARR_3('onMouseButtonDown',_this,QQGVAR(display))] call FUNC(onMouseButtonDown));
onMouseButtonUp = QUOTE([ARR_3('onMouseButtonUp',_this,QQGVAR(display))] call FUNC(onMouseButtonUp));
icon = "\A3\Ui_f\data\Logos\a_64_ca.paa";
logo = "\A3\Ui_f\data\Logos\arsenal_1024_ca.paa";
class ControlsBackground {
@ -28,9 +28,9 @@ class GVAR(display) {
class mouseArea: ctrlStatic {
idc = IDC_mouseArea;
style = 16;
onMouseMoving = QUOTE([ARR_3('onMouseMoving', _this, GVAR(display))] call FUNC(handleMouse));
onMouseHolding = QUOTE([ARR_3('onMouseHolding', _this, GVAR(display))] call FUNC(handleMouse));
onMouseZChanged = QUOTE([ARR_3('onMouseZChanged', _this, GVAR(display))] call FUNC(handleScrollWheel));
onMouseMoving = QUOTE([ARR_3('onMouseMoving',_this,GVAR(display))] call FUNC(handleMouse));
onMouseHolding = QUOTE([ARR_3('onMouseHolding',_this,GVAR(display))] call FUNC(handleMouse));
onMouseZChanged = QUOTE([ARR_3('onMouseZChanged',_this,GVAR(display))] call FUNC(handleScrollWheel));
x = QUOTE(safezoneX);
y = QUOTE(safezoneY);
w = QUOTE(safezoneW);
@ -42,7 +42,7 @@ class GVAR(display) {
idc = IDC_arrowMinus;
text = "-";
colorBackground[] = {0,0,0,0.8};
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), -1)] call FUNC(buttonCargo));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),-1)] call FUNC(buttonCargo));
fade = 1;
enable = 0;
x = 0.5;
@ -53,7 +53,7 @@ class GVAR(display) {
};
class ArrowRight: ArrowLeft {
idc = IDC_arrowPlus;
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), 1)] call FUNC(buttonCargo));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),1)] call FUNC(buttonCargo));
text = "+";
};
class blockLeftFrame: RscFrame {
@ -205,7 +205,7 @@ class GVAR(display) {
x = QUOTE(5 * WIDTH_GAP + 4 * WIDTH_SINGLE);
text = "";
tooltip = CSTRING(buttonFavoritesTooltip);
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), (_this select 0))] call FUNC(buttonFavorites));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),(_this select 0))] call FUNC(buttonFavorites));
};
class buttonClose: ctrlButtonOK {
idc = IDC_menuBarClose;
@ -417,7 +417,7 @@ class GVAR(display) {
text = "<";
colorBackground[] = {0,0,0,0};
colorBackgroundDisabled[] = {0,0,0,0};
onButtonClick = QUOTE([ARR_2(QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, false)])] call CBA_fnc_localEvent);
onButtonClick = QUOTE([ARR_2(QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0),_this select 0,false)])] call CBA_fnc_localEvent);
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(5 * GRID_W);
@ -427,7 +427,7 @@ class GVAR(display) {
class statsNextPage: statsPreviousPage {
idc = IDC_statsNextPage;
text = ">";
onButtonClick = QUOTE([ARR_2(QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, true)])] call CBA_fnc_localEvent);
onButtonClick = QUOTE([ARR_2(QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0),_this select 0,true)])] call CBA_fnc_localEvent);
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 42 * GRID_W);
};
class statsCurrentPage: RscText {
@ -524,7 +524,7 @@ class GVAR(display) {
text="<";
colorBackground[]={0,0,0,0};
colorBackgroundDisabled[]= {0,0,0,0};
onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, false)])] call CBA_fnc_localEvent);
onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0),_this select 0,false)])] call CBA_fnc_localEvent);
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(5 * GRID_W);
@ -534,7 +534,7 @@ class GVAR(display) {
class actionsNextPage: actionsPreviousPage {
idc = IDC_actionsNextPage;
text = ">";
onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, true)])] call CBA_fnc_localEvent);
onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0),_this select 0,true)])] call CBA_fnc_localEvent);
x = QUOTE(42 * GRID_W);
};
class actionsCurrentPage: RscText {
@ -637,7 +637,8 @@ class GVAR(display) {
idc = IDC_leftSearchbar;
onSetFocus = QUOTE(GVAR(leftSearchbarFocus) = true);
onKillFocus = QUOTE(GVAR(leftSearchbarFocus) = false);
onMouseButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0), _this select 0, _this select 1)] call FUNC(clearSearchbar));
onMouseButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),_this select 0,_this select 1)] call FUNC(clearSearchbar));
onEditChanged = QUOTE(call FUNC(handleSearchInputChanged));
x = QUOTE(safezoneX + 13 * GRID_W);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(74 * GRID_W);
@ -647,8 +648,10 @@ class GVAR(display) {
class leftSearchbarButton: ctrlButtonPicture {
idc = IDC_leftSearchbarButton;
text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa";
tooltip = CSTRING(buttonSearchTooltip);
colorBackground[] = {0,0,0,0.5};
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_leftSearchbar)] call FUNC(handleSearchbar));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),ctrlParent (_this select 0) displayCtrl IDC_leftSearchbar)] call FUNC(handleSearchbar));
onMouseButtonDown = QUOTE(call FUNC(handleSearchModeToggle));
x = QUOTE(safezoneX + 87 * GRID_W);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(6 * GRID_W);
@ -662,7 +665,7 @@ class GVAR(display) {
};
class rightSearchbarButton: leftSearchbarButton {
idc = IDC_rightSearchbarButton;
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_rightSearchbar)] call FUNC(handleSearchbar));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),ctrlParent (_this select 0) displayCtrl IDC_rightSearchbar)] call FUNC(handleSearchbar));
x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
};
class tabLeft: RscControlsGroupNoScrollbars {
@ -686,7 +689,7 @@ class GVAR(display) {
idc = IDC_buttonPrimaryWeapon;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\PrimaryWeapon_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_PrimaryWeapon";
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillLeftPanel));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(fillLeftPanel));
colorBackground[] = {0,0,0,0.5};
x = QUOTE(0 * GRID_W);
y = QUOTE(0 * GRID_H);
@ -879,7 +882,7 @@ class GVAR(display) {
idc = IDC_buttonOptic;
tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemOptic";
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemOptic_ca.paa";
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillRightPanel));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(fillRightPanel));
colorBackground[] = {0,0,0,0.5};
x = QUOTE(safezoneW + safezoneX - 10 * GRID_W);
y = QUOTE(safezoneY + 8 * GRID_H);
@ -1005,8 +1008,8 @@ class GVAR(display) {
class GVAR(loadoutsDisplay) {
idd = IDD_loadouts_display;
onLoad = QUOTE([ARR_3('onLoad', _this, QQGVAR(loadoutsDisplay))] call FUNC(onLoadoutsOpen));
onUnload = QUOTE([ARR_3('onUnload', _this, QQGVAR(loadoutsDisplay))] call FUNC(onLoadoutsClose));
onLoad = QUOTE([ARR_3('onLoad',_this,QQGVAR(loadoutsDisplay))] call FUNC(onLoadoutsOpen));
onUnload = QUOTE([ARR_3('onUnload',_this,QQGVAR(loadoutsDisplay))] call FUNC(onLoadoutsClose));
class controls {
class centerBox: ctrlControlsGroupNoScrollbars {
idc = IDC_centerBox;
@ -1048,8 +1051,8 @@ class GVAR(loadoutsDisplay) {
disableOverflow = 1;
onSetFocus = QUOTE(GVAR(loadoutsPanelFocus) = true);
onKillFocus = QUOTE(GVAR(loadoutsPanelFocus) = false);
onLBSelChanged = QUOTE([ARR_3(ctrlParent (_this select 0), _this select 0, _this select 1)] call FUNC(onSelChangedLoadouts));
onLBDblClick = QUOTE([ARR_2(ctrlParent (_this select 0), (ctrlParent (_this select 0)) displayCtrl IDC_buttonLoad)] call FUNC(buttonLoadoutsLoad));
onLBSelChanged = QUOTE([ARR_3(ctrlParent (_this select 0),_this select 0,_this select 1)] call FUNC(onSelChangedLoadouts));
onLBDblClick = QUOTE([ARR_2(ctrlParent (_this select 0),(ctrlParent (_this select 0)) displayCtrl IDC_buttonLoad)] call FUNC(buttonLoadoutsLoad));
x = QUOTE(0);
y = QUOTE(5 * GRID_H);
w = QUOTE(160 * GRID_W);
@ -1078,7 +1081,7 @@ class GVAR(loadoutsDisplay) {
idc = IDC_loadoutsSearchbar;
onSetFocus = QUOTE(GVAR(loadoutsSearchbarFocus) = true);
onKillFocus = QUOTE(GVAR(loadoutsSearchbarFocus) = false);
onMouseButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0), _this select 0, _this select 1)] call FUNC(clearSearchbar));
onMouseButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),_this select 0,_this select 1)] call FUNC(clearSearchbar));
x = QUOTE(83 * GRID_W);
y = QUOTE(safezoneH - (51 * GRID_H));
w = QUOTE(72 * GRID_W);
@ -1089,7 +1092,7 @@ class GVAR(loadoutsDisplay) {
idc = -1;
text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa";
colorBackground[] = {0,0,0,0.5};
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_loadoutsSearchbar)] call FUNC(handleLoadoutsSearchbar));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),ctrlParent (_this select 0) displayCtrl IDC_loadoutsSearchbar)] call FUNC(handleLoadoutsSearchbar));
x = QUOTE(155 * GRID_W);
y = QUOTE(safezoneH - (51 * GRID_H));
w = QUOTE(5 * GRID_W);
@ -1104,7 +1107,7 @@ class GVAR(loadoutsDisplay) {
text = CSTRING(buttonSaveText);
tooltip = CSTRING(buttonSaveTooltip);
sizeEx = QUOTE(5 * GRID_H);
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsSave));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(buttonLoadoutsSave));
colorBackground[] = {0,0,0,0.8};
};
class buttonRename: buttonSave {
@ -1112,21 +1115,21 @@ class GVAR(loadoutsDisplay) {
x = QUOTE(32.5 * GRID_W);
text = ECSTRING(common,rename);
tooltip = CSTRING(buttonRenameTooltip);
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsRename));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(buttonLoadoutsRename));
};
class buttonLoad: buttonSave {
idc = IDC_buttonLoad;
x = QUOTE(65 * GRID_W);
text = CSTRING(buttonLoadText);
tooltip = CSTRING(buttonLoadTooltip);
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsLoad));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(buttonLoadoutsLoad));
};
class buttonShare: buttonSave {
idc = IDC_buttonShare;
x = QUOTE(97.5 * GRID_W);
text = CSTRING(buttonSharePrivateText);
tooltip = CSTRING(buttonShareTooltip);
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsShare));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(buttonLoadoutsShare));
};
class buttonDelete: buttonSave {
idc = IDC_buttonDelete;
@ -1134,7 +1137,7 @@ class GVAR(loadoutsDisplay) {
text = CSTRING(buttonDeleteText);
tooltip = CSTRING(buttonDeleteTooltip);
colorBackgroundActive[] = {0.5,0,0,1};
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsDelete));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(buttonLoadoutsDelete));
};
};
};
@ -1174,7 +1177,7 @@ class GVAR(loadoutsDisplay) {
sizeEx = QUOTE(5 * GRID_H);
text = CSTRING(tabMyLoadoutsText);
tooltip = CSTRING(tabMyLoadoutsTooltip);
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(loadoutsChangeTab));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(loadoutsChangeTab));
};
class buttonDefaultLoadoutsBackground: buttonMyLoadoutsBackground {
idc = IDC_buttonDefaultLoadoutsBackground;

View File

@ -6,7 +6,7 @@ class GVAR(customArsenalButton_Button): RscButtonArsenal {
text = QPATHTOF(data\iconCustom.paa);
tooltip = "";
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillRightPanel));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(fillRightPanel));
colorBackground[] = {0,0,0,0.5};
};

View File

@ -10,7 +10,7 @@ class CfgWeapons {
picture = QPATHTOF(UI\icon_rangeTable.paa);
ACE_isTool = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 0.5;
mass = 0.1;
};
};
};

View File

@ -31,6 +31,6 @@
}] call CBA_fnc_addEventHandler;
#ifdef DEBUG_MODE_FULL
#include "dev\showShotInfo.sqf"
#include "dev\checkConfigs.sqf"
#include "dev\showShotInfo.inc.sqf"
#include "dev\checkConfigs.inc.sqf"
#endif

View File

@ -6,6 +6,6 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
#include "initSettings.inc.sqf"
ADDON = true;

View File

@ -6,9 +6,9 @@
<German>Artillerieschusstafel</German>
<Chinese>火炮射程表</Chinese>
<Chinesesimp>火炮射表</Chinesesimp>
<Italian>Tavola balistica per artigliria </Italian>
<Italian>Tavola balistica per artiglieria </Italian>
<Czech>Dělostřelecké tabulky střelby</Czech>
<Japanese>火砲射表</Japanese>
<Japanese>火砲射表</Japanese>
<Polish>Tabela Strzelnicza</Polish>
<French>Table de tir d'artillerie</French>
<Portuguese>Tabela de Artilharia</Portuguese>
@ -24,7 +24,7 @@
<Chinesesimp>通用火炮射表</Chinesesimp>
<Italian>Tavola balistica universale per artiglieria</Italian>
<Czech>Univerzální dělostřelecká tabulka střelby</Czech>
<Japanese>汎用の火砲用射程</Japanese>
<Japanese>砲兵火砲用の汎用射撃</Japanese>
<Polish>Uniwersalna Tabela Strzelnicza</Polish>
<French>Table de tir universelle pour l'artillerie.</French>
<Portuguese>Tabela de Artilharia Universal</Portuguese>
@ -61,8 +61,8 @@
<Hungarian>Játékos általi lövésekhez, legyen-e számított légellenállás és szélhatás</Hungarian>
<Russian>Для выстрелов игрока. Моделирует сопротивление воздуха и эффект ветра</Russian>
<Italian>Per Proiettili dei Giocatori, simula la Resistenza dell'Aria e gli Effetti del Vento</Italian>
<Japanese>プレイヤが射撃すると、空気抵抗モデルと風による影響を与えます。</Japanese>
<Korean>플레이어 사격시 공기저항과 바람에 영향을 받습니다</Korean>
<Japanese>プレイヤが射撃すると、空気抵抗モデルと風による影響を与えます。</Japanese>
<Korean>플레이어 사격 시 공기저항과 바람에 영향을 받습니다</Korean>
<Chinesesimp>设定由玩家射击的炮弹是否受到空气阻力与风力的影响</Chinesesimp>
<Chinese>設定由玩家射擊的迫擊砲,將會受到空氣阻力與風力的影響</Chinese>
<Turkish>Oyuncu atışları, hava direnci ve rüzgar efektleri için</Turkish>
@ -72,9 +72,9 @@
<German>Artilleriecomputer ausgeschaltet</German>
<Chinese>停用火炮電腦</Chinese>
<Chinesesimp>停用弹道计算机</Chinesesimp>
<Italian>Computer artiglieria disattivato</Italian>
<Italian>Computer balistico disattivato</Italian>
<Czech>Zakázat používání dělostřeleckého počítače</Czech>
<Japanese>砲撃コンピュータ無効化</Japanese>
<Japanese>砲撃コンピュータ無効化</Japanese>
<Polish>Wyłączony Komputer Artyleryjski</Polish>
<French>Désactiver l'ordinateur de tir</French>
<Portuguese>Computador de Artilharia Desabilitado</Portuguese>
@ -88,7 +88,7 @@
<German>Deaktiviert die Vanilla-Artilleriecomputer</German>
<Chinese>停用原本的火炮控制電腦</Chinese>
<Chinesesimp>禁用游戏自带的弹道计算机</Chinesesimp>
<Italian>Disattiva il computer artiglieria vanilla</Italian>
<Italian>Disattiva il computer balistico vanilla</Italian>
<Czech>Zakázat používání dělostřeleckého počítače základní hry</Czech>
<Japanese>ゲームの砲撃コンピュータを無効化します。</Japanese>
<Polish>Wyłącza komputer artyleryjski wprowadzony w vanili</Polish>

View File

@ -1,6 +1,6 @@
#include "script_component.hpp"
#include "initKeybinds.sqf"
#include "initKeybinds.inc.sqf"
GVAR(active) = false;
GVAR(initialised) = false;

View File

@ -46,7 +46,7 @@
<Hungarian>Megerősített PDA, ATragMX-el</Hungarian>
<Czech>PDA s ATragMX</Czech>
<Portuguese>PDA Robusto com ATragMX</Portuguese>
<Japanese>ATragMX 付きの携行型端末</Japanese>
<Japanese>ATragMX を搭載した頑丈な携帯情報端末</Japanese>
<Korean>ATragMX가 달린 PDA</Korean>
<Chinese>裝有軍用PDA的ATragMX</Chinese>
<Chinesesimp>装有 ATragMX 的军用 PDA</Chinesesimp>

View File

@ -13,7 +13,7 @@
class GVAR(DetachVehicle) { \
displayName = CSTRING(Detach); \
condition = QUOTE(_this call FUNC(canDetach)); \
statement = QUOTE(_this call FUNC(detach) ); \
statement = QUOTE(_this call FUNC(detach)); \
exceptions[] = {"isNotSwimming"}; \
showDisabled = 0; \
icon = QPATHTOF(UI\detach_ca.paa); \

View File

@ -5,7 +5,7 @@ class RscTitles {
duration = 9999999;
fadein = 0;
fadeout = 0;
onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(virtualAmmoDisplay), _this select 0)]);
onLoad = QUOTE(uiNamespace setVariable [ARR_2(QQGVAR(virtualAmmoDisplay),_this select 0)]);
class controls {};
class objects {
class TheObject {

View File

@ -26,10 +26,12 @@ if ((_itemClassname == "") || {(!_silentScripted) && {!(_this call FUNC(canAttac
private _itemVehClass = getText (configFile >> "CfgWeapons" >> _itemClassname >> "ACE_Attachable");
private _onAttachText = getText (configFile >> "CfgWeapons" >> _itemClassname >> "displayName");
private _itemModelOrientation = getArray (configFile >> "CfgWeapons" >> _itemClassname >> QGVAR(orientation));
if (_itemVehClass == "") then {
_itemVehClass = getText (configFile >> "CfgMagazines" >> _itemClassname >> "ACE_Attachable");
_onAttachText = getText (configFile >> "CfgMagazines" >> _itemClassname >> "displayName");
_itemModelOrientation = getArray (configFile >> "CfgWeapons" >> _itemClassname >> QGVAR(orientation));
};
if (_itemVehClass == "") exitWith {ERROR("no ACE_Attachable for Item");};
@ -68,7 +70,7 @@ if (_unit == _attachToVehicle) then { //Self Attachment
[{
params ["_args","_idPFH"];
_args params ["_unit","_attachToVehicle","_itemClassname","_itemVehClass","_onAttachText","_actionID"];
_args params ["_unit","_attachToVehicle","_itemClassname","_itemVehClass","_onAttachText","_actionID", "_itemModelOrientation"];
private _virtualPosASL = (eyePos _unit) vectorAdd (positionCameraToWorld [0,0,0.6]) vectorDiff (positionCameraToWorld [0,0,0]);
if (cameraView == "EXTERNAL") then {
@ -95,7 +97,7 @@ if (_unit == _attachToVehicle) then { //Self Attachment
(QGVAR(virtualAmmo) call BIS_fnc_rscLayer) cutText ["", "PLAIN"];
if (GVAR(placeAction) == PLACE_APPROVE) then {
[_unit, _attachToVehicle, _itemClassname, _itemVehClass, _onAttachText, _virtualPos] call FUNC(placeApprove);
[_unit, _attachToVehicle, _itemClassname, _itemVehClass, _onAttachText, _virtualPos, _itemModelOrientation] call FUNC(placeApprove);
};
} else {
//Show the virtual object:
@ -112,9 +114,13 @@ if (_unit == _attachToVehicle) then { //Self Attachment
((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlSetPosition _screenPos;
private _dir = (positionCameraToWorld [0,0,1]) vectorFromTo (positionCameraToWorld [0,0,0]);
private _angle = asin (_dir select 2);
private _up = [0, cos _angle, sin _angle];
((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlSetModelDirAndUp [[1,0,0], _up];
// Tranform yaw/roll angle to vector, defaults are pre-#9623 behavior
_itemModelOrientation params [["_roll", 0], ["_yaw", 90]];
private _dirAndUp = [[[0,1,0], [0,0,1]], _yaw, 0, _roll] call BIS_fnc_transformVectorDirAndUp;
private _dirAndUp = [_dirAndUp, 0, _angle, 0] call BIS_fnc_transformVectorDirAndUp;
((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlSetModelDirAndUp _dirAndUp;
};
};
}, 0, [_unit, _attachToVehicle, _itemClassname, _itemVehClass, _onAttachText, _actionID]] call CBA_fnc_addPerFrameHandler;
}, 0, [_unit, _attachToVehicle, _itemClassname, _itemVehClass, _onAttachText, _actionID, _itemModelOrientation]] call CBA_fnc_addPerFrameHandler;
};

View File

@ -16,7 +16,7 @@
* Public: No
*/
params ["_attachToVehicle","_unit"],
params ["_attachToVehicle","_unit"];
TRACE_2("params",_attachToVehicle,_unit);
private _attachedList = _attachToVehicle getVariable [QGVAR(attached), []];

View File

@ -15,17 +15,18 @@
* 3: Light Vehicle Classname <STRING>
* 4: On Attach Text <STRING>
* 5: Starting Pos of dummy item <ARRAY>
* 5: Orientation of model <ARRAY>
*
* Return Value:
* None
*
* Example:
* No
* None
*
* Public: No
*/
params ["_unit", "_attachToVehicle", "_itemClassname", "_itemVehClass", "_onAttachText", "_startingPosition"];
params ["_unit", "_attachToVehicle", "_itemClassname", "_itemVehClass", "_onAttachText", "_startingPosition", "_itemModelOrientation"];
TRACE_6("params",_unit,_attachToVehicle,_itemClassname,_itemVehClass,_onAttachText,_startingPosition);
private _startingOffset = _attachToVehicle worldToModel _startingPosition;
@ -93,6 +94,19 @@ _endPosTestOffset set [2, (_startingOffset select 2)];
private _attachedObject = _itemVehClass createVehicle (getPos _unit);
_attachedObject attachTo [_attachToVehicle, _endPosTestOffset];
// Get wanted orientation if any is set
_itemModelOrientation params [["_roll", 0], ["_yaw", 90]];
private _dirAndUp = [[[0,1,0],[0,0,1]], -_yaw, 0, _roll] call BIS_fnc_transformVectorDirAndUp;
// Transform dir and up vector from player model to world, then to model-space of _attachToVehicle
private _dir = _unit vectorModelToWorldVisual _dirAndUp#0;
_dir = _attachToVehicle vectorWorldToModelVisual _dir;
private _up = _unit vectorModelToWorldVisual _dirAndUp#1;
_up = _attachToVehicle vectorWorldToModelVisual _up;
_attachedObject setVectorDirAndUp [_dir, _up];
//Remove Item from inventory
_unit removeItem _itemClassname;

View File

@ -132,7 +132,7 @@
<Hungarian>Chemlight hozzácsatolva</Hungarian>
<Russian>Химсвет прикреплён</Russian>
<Japanese>ケミライトを取り付けました</Japanese>
<Korean>켐라이트 부착됨</Korean>
<Korean>화학조명 부착됨</Korean>
<Chinese>已附掛螢光棒</Chinese>
<Chinesesimp>已附挂荧光棒</Chinesesimp>
<Turkish>ık Çubuğu Bağlandı</Turkish>
@ -149,7 +149,7 @@
<Hungarian>Chemlight hozzácsatolva</Hungarian>
<Russian>Химсвет отсоединён</Russian>
<Japanese>ケミライトを外しました</Japanese>
<Korean>켐라이트 떼어냄</Korean>
<Korean>화학조명 떼어냄</Korean>
<Chinese>已取下螢光棒</Chinese>
<Chinesesimp>已取下荧光棒</Chinesesimp>
<Turkish>ık Çubuğu Söküldü</Turkish>
@ -182,7 +182,7 @@
<Italian>La Strobo IR è una luce stroboscopica che ti permette di segnalare la tua posizione grazie all'emissione di impulsi ad infrarossi visibili solo con i visori notturni.</Italian>
<Hungarian>Az infravörös jeladóval megjelölheted a helyzetedet úgy, hogy annak pulzáló fénye csak éjjellátó készülékkel látható.</Hungarian>
<Russian>ИК-маяк позволяет сигнализировать о своём местоположении через пульсирующий свет, видимый только через ПНВ.</Russian>
<Japanese>赤外線ストロボはあなたの位置を知らせますが、夜間暗視装置を介してでしか見れません</Japanese>
<Japanese>赤外線ストロボを使用すると、暗視装置を介してのみ見ることが出来る点滅表示で自分の位置を知らせることができます</Japanese>
<Korean>적외선 스트로브는 자신의 위치를 반짝이면서 표시합니다. 이는 야간투시경으로 밖에 보지 못합니다.</Korean>
<Chinese>紅外線閃頻器,藉由紅外線閃頻信號來辨識你的位置,僅能使用夜視系統來辨識紅外線信號</Chinese>
<Chinesesimp>红外频闪器制造只有用夜视仪才能看到的频闪信标,发出一个位置信号。</Chinesesimp>
@ -199,7 +199,7 @@
<Italian>Posiziona</Italian>
<Hungarian>Elhelyez</Hungarian>
<Russian>Установить</Russian>
<Japanese></Japanese>
<Japanese></Japanese>
<Korean>놓기</Korean>
<Chinese>放置</Chinese>
<Chinesesimp>放置</Chinesesimp>
@ -250,7 +250,7 @@
<Italian>%1&lt;br/&gt;attaccata</Italian>
<Hungarian>%1&lt;br/&gt;hozzácsatolva</Hungarian>
<Russian>%1&lt;br/&gt;присоединен(-а)</Russian>
<Japanese>%1&lt;br/&gt;取り付けました</Japanese>
<Japanese>%1&lt;br/&gt;取り付けました</Japanese>
<Korean>%1&lt;br/&gt;부착됨</Korean>
<Chinese>%1&lt;br/&gt;已附掛</Chinese>
<Chinesesimp>%1&lt;br/&gt;已附挂</Chinesesimp>
@ -267,7 +267,7 @@
<Italian>%1&lt;br/&gt;staccata</Italian>
<Hungarian>%1&lt;br/&gt;lecsatolva</Hungarian>
<Russian>%1&lt;br/&gt;отсоединен(-а)</Russian>
<Japanese>%1&lt;br/&gt;外しました</Japanese>
<Japanese>%1&lt;br/&gt;外しました</Japanese>
<Korean>%1&lt;br/&gt;떼어냄</Korean>
<Chinese>%1&lt;br/&gt;已取下</Chinese>
<Chinesesimp>%1&lt;br/&gt;已取下</Chinesesimp>

View File

@ -6,7 +6,7 @@ class EGVAR(arsenal,stats) {
stats[] = {"ACE_barrelTwist"};
displayName= CSTRING(statBarrelTwist);
showText = 1;
textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _barrelTwist = getNumber (_config >> _stat select 0); format [ARR_3('%1mm (%2in)',_barrelTwist toFixed 0, (_barrelTwist / 25.4) toFixed 1)]);
textStatement = QUOTE(params [ARR_2('_stat','_config')]; private _barrelTwist = getNumber (_config >> _stat select 0); format [ARR_3('%1mm (%2in)',_barrelTwist toFixed 0,(_barrelTwist / 25.4) toFixed 1)]);
tabs[] = {{0,1}, {}};
};
class ACE_barrelLength: statBase {
@ -15,7 +15,7 @@ class EGVAR(arsenal,stats) {
stats[] = {"ACE_barrelLength"};
displayName = CSTRING(statBarrelLength);
showText = 1;
textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _barrelLength = getNumber (_config >> _stat select 0); format [ARR_3('%1mm (%2in)',_barrelLength toFixed 0, (_barrelLength / 25.4) toFixed 1)]);
textStatement = QUOTE(params [ARR_2('_stat','_config')]; private _barrelLength = getNumber (_config >> _stat select 0); format [ARR_3('%1mm (%2in)',_barrelLength toFixed 0,(_barrelLength / 25.4) toFixed 1)]);
tabs[] = {{0,1}, {}};
};
class ACE_ammo: statBase {
@ -25,7 +25,7 @@ class EGVAR(arsenal,stats) {
displayName = "$STR_dn_ammo";
showText = 1;
condition = QUOTE(getText (_this select 1 >> _this select 0 select 0) isNotEqualTo '');
textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _ammoDisplayName = getText (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 1); [ARR_2(_ammoDisplayName, getText (_config >> _stat select 0))] select (_ammoDisplayName == ''));
textStatement = QUOTE(params [ARR_2('_stat','_config')]; private _ammoDisplayName = getText (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 1); [ARR_2(_ammoDisplayName,getText (_config >> _stat select 0))] select (_ammoDisplayName == ''));
tabs[] = {{}, {4}};
};
class ACE_ballisticCoef: statBase {
@ -34,8 +34,8 @@ class EGVAR(arsenal,stats) {
stats[] = {"ACE_dragModel","ACE_ballisticCoefficients", "ACE_standardAtmosphere"};
displayName= CSTRING(statBallisticCoef);
showText= 1;
textStatement = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); private _ballisticCoef = getArray (_ammoCfg >> _stat select 1); _ballisticCoef sort false; format [ARR_4('%1 G%2 (%3)', _ballisticCoef select 0 ,getNumber (_ammoCfg >> _stat select 0), getText (_ammoCfg >> _stat select 2))]);
condition = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); (getArray (_ammoCfg >> _stat select 1) isNotEqualTo []));
textStatement = QUOTE(params[ARR_2('_stat','_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); private _ballisticCoef = getArray (_ammoCfg >> _stat select 1); _ballisticCoef sort false; format [ARR_4('%1 G%2 (%3)',_ballisticCoef select 0,getNumber (_ammoCfg >> _stat select 0),getText (_ammoCfg >> _stat select 2))]);
condition = QUOTE(params[ARR_2('_stat','_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); (getArray (_ammoCfg >> _stat select 1) isNotEqualTo []));
tabs[] ={{}, {4}};
};
class ACE_bulletMass: statBase {
@ -44,8 +44,8 @@ class EGVAR(arsenal,stats) {
stats[] = {"ACE_bulletMass"};
displayName = CSTRING(statBulletMass);
showText = 1;
textStatement = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoWeight = getNumber (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 0); format [ARR_3('%1g (%2gr)', _ammoWeight toFixed 1, (_ammoWeight * 15.43) toFixed 1)]);
condition = QUOTE(params[ARR_2('_stat', '_config')]; getNumber (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 0) > 0);
textStatement = QUOTE(params[ARR_2('_stat','_config')]; private _ammoWeight = getNumber (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 0); format [ARR_3('%1g (%2gr)',_ammoWeight toFixed 1,(_ammoWeight * 15.43) toFixed 1)]);
condition = QUOTE(params[ARR_2('_stat','_config')]; getNumber (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 0) > 0);
tabs[] = {{}, {4}};
};
class ACE_magMuzzleVelocity: statBase {
@ -54,7 +54,7 @@ class EGVAR(arsenal,stats) {
stats[] = {"initSpeed", "ammo"};
displayName= CSTRING(statMuzzleVelocity);
showText= 1;
textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_magazineMuzzleVelocity));
textStatement = QUOTE([ARR_2(_this select 0,_this select 1)] call FUNC(statTextStatement_magazineMuzzleVelocity));
condition = QUOTE(getText (_this select 1 >> _this select 0 select 1) isNotEqualTo '' && {getNumber (_this select 1 >> (_this select 0) select 0) > 0});
tabs[] = {{}, {4}};
};
@ -64,7 +64,7 @@ class EGVAR(arsenal,stats) {
stats[] = {"initSpeed"};
displayName= CSTRING(statMuzzleVelocity);
showText = 1;
textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_weaponMuzzleVelocity));
textStatement = QUOTE([ARR_2(_this select 0,_this select 1)] call FUNC(statTextStatement_weaponMuzzleVelocity));
tabs[] = {{0,1}, {}};
};
class ACE_magazineAiUsage: statBase {
@ -74,7 +74,7 @@ class EGVAR(arsenal,stats) {
displayName= CSTRING(ammoUsage_ai);
showText= 1;
textStatement = QUOTE(call FUNC(statTextStatement_magazineAiUsage));
condition = QUOTE(is3DEN || {!isNull getAssignedCuratorLogic player} || {missionNamespace getVariable [ARR_2(QQGVAR(showAIMagazineUse), missionName == 'Arsenal')]});
condition = QUOTE(is3DEN || {!isNull getAssignedCuratorLogic player} || {missionNamespace getVariable [ARR_2(QQGVAR(showAIMagazineUse),missionName == 'Arsenal')]});
tabs[] = {{}, {4}};
};
};

View File

@ -48,7 +48,7 @@ if (_magIsForCurrentWeapon && {["ace_advanced_ballistics"] call EFUNC(common,isM
private _barrelLengthTable = getArray (_configAmmo >> "ACE_barrelLengths");
private _abShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
if (_abShift != 0) then {
_abAdjustText = " [AB]",
_abAdjustText = " [AB]";
_muzzleVelocity = _abShift;
};
};

View File

@ -44,7 +44,7 @@ if (_magazine isEqualTo "") then {
private _barrelLengthTable = getArray (_configAmmo >> "ACE_barrelLengths");
private _abShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
if (_abShift != 0) then {
_abAdjustText = " [AB]",
_abAdjustText = " [AB]";
_muzzleVelocity = _abShift;
};
};

File diff suppressed because it is too large Load Diff

View File

@ -6,8 +6,8 @@ class CfgVehicles {
displayName = CSTRING(SetCaptive);
selection = "righthand";
distance = HANDCUFFS_DISTANCE;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs));
statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs));
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canApplyHandcuffs));
statement = QUOTE([ARR_2(_player,_target)] call FUNC(doApplyHandcuffs));
exceptions[] = {"isNotSwimming", "isNotInside"};
icon = QPATHTOF(UI\handcuff_ca.paa);
};
@ -17,16 +17,16 @@ class CfgVehicles {
displayName = CSTRING(ReleaseCaptive);
selection = "righthand";
distance = HANDCUFFS_DISTANCE;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs));
statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs));
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canRemoveHandcuffs));
statement = QUOTE([ARR_2(_player,_target)] call FUNC(doRemoveHandcuffs));
exceptions[] = {"isNotSwimming", "isNotInside"};
icon = QPATHTOF(UI\handcuff_ca.paa);
};
class ACE_EscortCaptive {
displayName = CSTRING(EscortCaptive);
distance = 4;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive));
statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive));
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canEscortCaptive));
statement = QUOTE([ARR_3(_player,_target,true)] call FUNC(doEscortCaptive));
exceptions[] = {"isNotSwimming"};
showDisabled = 0;
icon = QPATHTOF(UI\captive_ca.paa);
@ -34,8 +34,8 @@ class CfgVehicles {
class ACE_StopEscorting {
displayName = CSTRING(StopEscorting);
distance = 4;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting));
statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive));
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canStopEscorting));
statement = QUOTE([ARR_3(_player,_target,false)] call FUNC(doEscortCaptive));
exceptions[] = {"isNotEscorting", "isNotSwimming"};
showDisabled = 0;
icon = QPATHTOF(UI\captive_ca.paa);
@ -43,8 +43,8 @@ class CfgVehicles {
class ACE_LoadCaptive {
displayName = CSTRING(LoadCaptive);
distance = 4;
condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive));
statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive));
condition = QUOTE([ARR_3(_player,_target,objNull)] call FUNC(canLoadCaptive));
statement = QUOTE([ARR_3(_player,_target,objNull)] call FUNC(doLoadCaptive));
exceptions[] = {"isNotEscorting", "isNotSwimming"};
showDisabled = 0;
icon = QPATHTOF(UI\captive_ca.paa);
@ -53,23 +53,23 @@ class CfgVehicles {
class GVAR(UnloadCaptive) {
displayName = CSTRING(UnloadCaptive);
distance = 4;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive));
statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive));
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canUnloadCaptive));
statement = QUOTE([ARR_2(_player,_target)] call FUNC(doUnloadCaptive));
exceptions[] = {"isNotSwimming"};
};
class GVAR(BlindfoldCaptive) {
displayName = CSTRING(BlindfoldCaptive);
distance = 4;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canBlindfoldCaptive));
statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doBlindfoldCaptive));
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canBlindfoldCaptive));
statement = QUOTE([ARR_3(_player,_target,true)] call FUNC(doBlindfoldCaptive));
exceptions[] = {"isNotSwimming"};
showDisabled = 0;
};
class GVAR(RemoveBlindfoldCaptive) {
displayName = CSTRING(RemoveBlindfoldCaptive);
distance = 4;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveBlindfoldCaptive));
statement = QUOTE([ARR_3(_player, _target, false)] call FUNC(doBlindfoldCaptive));
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canRemoveBlindfoldCaptive));
statement = QUOTE([ARR_3(_player,_target,false)] call FUNC(doBlindfoldCaptive));
exceptions[] = {"isNotSwimming"};
showDisabled = 0;
};
@ -79,23 +79,23 @@ class CfgVehicles {
class ACE_SelfActions {
class ACE_StopEscortingSelf {
displayName = CSTRING(StopEscorting);
condition = QUOTE([ARR_2(_player, objNull)] call FUNC(canStopEscorting));
statement = QUOTE([ARR_3(_player,objNull, false)] call FUNC(doEscortCaptive));
condition = QUOTE([ARR_2(_player,objNull)] call FUNC(canStopEscorting));
statement = QUOTE([ARR_3(_player,objNull,false)] call FUNC(doEscortCaptive));
exceptions[] = {"isNotEscorting", "isNotSwimming"};
showDisabled = 0;
};
class ACE_StartSurrenderingSelf {
displayName = CSTRING(StartSurrendering);
condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender));
statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered));
condition = QUOTE([ARR_2(_player,true)] call FUNC(canSurrender));
statement = QUOTE([ARR_2(_player,true)] call FUNC(setSurrendered));
exceptions[] = {"isNotSwimming"};
showDisabled = 0;
icon = QPATHTOF(UI\Surrender_ca.paa);
};
class ACE_StopSurrenderingSelf {
displayName = CSTRING(StopSurrendering);
condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender));
statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrendered));
condition = QUOTE([ARR_2(_player,false)] call FUNC(canSurrender));
statement = QUOTE([ARR_2(_player,false)] call FUNC(setSurrendered));
exceptions[] = {"isNotSurrendering", "isNotSwimming"};
showDisabled = 0;
icon = QPATHTOF(UI\Surrender_ca.paa);
@ -109,8 +109,8 @@ class CfgVehicles {
class GVAR(LoadCaptive) { \
displayName = CSTRING(LoadCaptive); \
distance = 4; \
condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \
statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \
condition = QUOTE([ARR_3(_player,objNull,_target)] call FUNC(canLoadCaptive)); \
statement = QUOTE([ARR_3(_player,objNull,_target)] call FUNC(doLoadCaptive)); \
exceptions[] = {"isNotEscorting", "isNotSwimming"}; \
}; \
}; \

View File

@ -11,7 +11,7 @@ class CfgWeapons {
picture = QPATHTOF(UI\ace_cabletie_ca.paa);
scope = 2;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
mass = 0.3;
};
};
};

View File

@ -11,6 +11,6 @@ GVAR(captivityEnabled) = false;
GVAR(restraints) = keys (uiNamespace getVariable QGVAR(restraints));
GVAR(blindfolds) = keys (uiNamespace getVariable QGVAR(blindfolds));
#include "initSettings.sqf"
#include "initSettings.inc.sqf"
ADDON = true;

View File

@ -22,7 +22,5 @@ params ["_unit", "_target"];
(_target getVariable [QGVAR(isHandcuffed), false]) &&
{isNull (attachedTo _target)} &&
{alive _target} &&
{isNull objectParent _unit} &&
{isNull objectParent _target} &&
{(GVAR(blindfolds) findAny (_unit call EFUNC(common,uniqueItems))) != -1} &&
{!((goggles _target) in GVAR(blindfolds))}

View File

@ -22,6 +22,4 @@ params ["_unit", "_target"];
(_target getVariable [QGVAR(isHandcuffed), false]) &&
{isNull (attachedTo _target)} &&
{alive _target} &&
{isNull objectParent _unit} &&
{isNull objectParent _target} &&
{(goggles _target) in GVAR(blindfolds)}

View File

@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
* Author: commy2
* Author: commy2, LinkIsGrim
* Check if the unit can unload a captive from the vehicle.
*
* Arguments:
@ -19,4 +19,6 @@
params ["_player", "_unit"];
// Don't show "Unload Captive" if unit is unconscious (already has "Unload Patient")
(vehicle _unit != _unit) && {vehicle _player == _player} && {_unit getVariable [QGVAR(isHandcuffed), false]} && {!(_unit getVariable ["ACE_isUnconscious", false])}
!isNull objectParent _unit &&
{_unit getVariable [QGVAR(isHandcuffed), false]} &&
{lifeState _unit in ["HEALTHY", "INJURED"]}

View File

@ -66,10 +66,16 @@ if (_state) then { // Blindfold target
removeGoggles _target;
};
// Handle for things that need to be dropped to the ground
// Handle for things that need to be dropped to the ground or in a vehicle inventory
if (_dropGoggles) then {
private _weaponHolder = nearestObject [_target, "WeaponHolder"];
if (isNull _weaponHolder || {_target distance _weaponHolder > 2}) then {
// if _target is in a vehicle, use vehicle inventory as container
private _inVehicle = !isNull objectParent _target;
if (_inVehicle) then {
_weaponHolder = objectParent _target;
};
if (!_inVehicle && {isNull _weaponHolder || {_target distance _weaponHolder > 2}}) then {
_weaponHolder = createVehicle ["GroundWeaponHolder", [0, 0, 0], [], 0, "NONE"];
_weaponHolder setPosASL getPosASL _target;
};

View File

@ -50,9 +50,14 @@ if (_state) then {
detach _target;
_unit removeAction _actionID;
_unit setVariable [QGVAR(escortedUnit), objNull, true];
// Public event
[QGVAR(escortingCaptive), [_target, false, _unit]] call CBA_fnc_localEvent;
};
}, 0, [_unit, _target, _actionID]] call CBA_fnc_addPerFrameHandler;
// Public event
[QGVAR(escortingCaptive), [_target, true, _unit]] call CBA_fnc_localEvent;
} else {
_unit setVariable [QGVAR(isEscorting), false, true];
_unit setVariable [QGVAR(escortedUnit), objNull, true];

View File

@ -11,7 +11,7 @@
* The return value <BOOL>
*
* Example:
* [bob1, bob2] call ACE_captives_fnc_handlePlayerChange
* [bob1, bob2] call ACE_captives_fnc_handlePlayerChanged
*
* Public: No
*/

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