mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge branch 'master' into nightvision-slotitemchanged-event
This commit is contained in:
commit
d302bf1bf1
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -23,14 +23,14 @@ All good? Then proceed and fill out the items below.
|
|||||||
**Mods (complete and add to the following information):**
|
**Mods (complete and add to the following information):**
|
||||||
- **Arma 3:** `x.xx` [e.g. 1.00 stable, rc, dev]
|
- **Arma 3:** `x.xx` [e.g. 1.00 stable, rc, dev]
|
||||||
- **CBA:** `3.x.x` [e.g. 3.0.0 stable, commit hash]
|
- **CBA:** `3.x.x` [e.g. 3.0.0 stable, commit hash]
|
||||||
- **ACE3:** `3.x.x` [eg. 3.0.0 stable, commit hash]
|
- **ACE3:** `3.x.x` [e.g. 3.0.0 stable, commit hash]
|
||||||
<!-- Make sure to reproduce the issue with only CBA and ACE3 on a newly created mission! -->
|
<!-- Make sure to reproduce the issue with only CBA and ACE3 on a newly created mission! -->
|
||||||
|
|
||||||
**Description:**
|
**Description:**
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
**Steps to reproduce:**
|
**Steps to reproduce:**
|
||||||
_Follow [https://ace3.acemod.org/img/wiki/user/issue_flowchart.webp](this flowchart)!_
|
_Follow [this flowchart](https://ace3.acemod.org/img/wiki/user/issue_flowchart.webp)!_
|
||||||
|
|
||||||
1. _Go to ..._
|
1. _Go to ..._
|
||||||
2. _Click ..._
|
2. _Click ..._
|
||||||
|
10
.github/release-drafter.yml
vendored
10
.github/release-drafter.yml
vendored
@ -11,11 +11,10 @@ sort-direction: ascending
|
|||||||
categories:
|
categories:
|
||||||
- title: '**ADDED:**'
|
- title: '**ADDED:**'
|
||||||
labels:
|
labels:
|
||||||
- 'kind/feature request'
|
- 'kind/feature'
|
||||||
- 'kind/added feature'
|
|
||||||
- title: '**FIXED:**'
|
- title: '**FIXED:**'
|
||||||
labels:
|
labels:
|
||||||
- 'kind/bug fix'
|
- 'kind/bug-fix'
|
||||||
- title: '**IMPROVED:**'
|
- title: '**IMPROVED:**'
|
||||||
labels:
|
labels:
|
||||||
- 'kind/enhancement'
|
- 'kind/enhancement'
|
||||||
@ -23,17 +22,16 @@ categories:
|
|||||||
- title: '**CHANGED:**'
|
- title: '**CHANGED:**'
|
||||||
labels:
|
labels:
|
||||||
- 'kind/cleanup'
|
- 'kind/cleanup'
|
||||||
- 'area/compatibility'
|
|
||||||
- 'kind/change'
|
- 'kind/change'
|
||||||
- title: '**SETTINGS:**'
|
- title: '**SETTINGS:**'
|
||||||
labels:
|
labels:
|
||||||
- 'kind/setting'
|
- 'kind/setting'
|
||||||
- title: '**TRANSLATIONS:**'
|
- title: '**TRANSLATIONS:**'
|
||||||
labels:
|
labels:
|
||||||
- 'area/translations'
|
- 'kind/translation'
|
||||||
|
|
||||||
exclude-labels:
|
exclude-labels:
|
||||||
- 'ignore changelog'
|
- 'ignore-changelog'
|
||||||
- 'dependencies'
|
- 'dependencies'
|
||||||
|
|
||||||
change-template: '- $TITLE (#$NUMBER)'
|
change-template: '- $TITLE (#$NUMBER)'
|
||||||
|
2
.github/workflows/arma.yml
vendored
2
.github/workflows/arma.yml
vendored
@ -48,7 +48,7 @@ jobs:
|
|||||||
- name: Rename build folder
|
- name: Rename build folder
|
||||||
run: mv .hemttout/build .hemttout/@ace
|
run: mv .hemttout/build .hemttout/@ace
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ace3-${{ github.sha }}-nobin
|
name: ace3-${{ github.sha }}-nobin
|
||||||
path: .hemttout/@*
|
path: .hemttout/@*
|
||||||
|
4
.github/workflows/documentation.yml
vendored
4
.github/workflows/documentation.yml
vendored
@ -47,7 +47,7 @@ jobs:
|
|||||||
destination: docs/_site/
|
destination: docs/_site/
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: jekyll-site
|
name: jekyll-site
|
||||||
path: docs/_site/
|
path: docs/_site/
|
||||||
@ -63,7 +63,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download Artifacts
|
- name: Download Artifacts
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: jekyll-site
|
name: jekyll-site
|
||||||
path: _site/
|
path: _site/
|
||||||
|
2
.github/workflows/extensions.yml
vendored
2
.github/workflows/extensions.yml
vendored
@ -23,7 +23,7 @@ jobs:
|
|||||||
cd build
|
cd build
|
||||||
cmake .. && cmake --build .
|
cmake .. && cmake --build .
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ace3_extensions-${{ matrix.os }}-debug
|
name: ace3_extensions-${{ matrix.os }}-debug
|
||||||
path: extensions/build
|
path: extensions/build
|
||||||
|
2
.github/workflows/hemtt.yml
vendored
2
.github/workflows/hemtt.yml
vendored
@ -38,7 +38,7 @@ jobs:
|
|||||||
- name: Rename build folder
|
- name: Rename build folder
|
||||||
run: mv .hemttout/build .hemttout/@ace
|
run: mv .hemttout/build .hemttout/@ace
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ace3-${{ github.sha }}
|
name: ace3-${{ github.sha }}
|
||||||
path: .hemttout/@*
|
path: .hemttout/@*
|
||||||
|
5
.github/workflows/pboproject.yml
vendored
5
.github/workflows/pboproject.yml
vendored
@ -67,18 +67,19 @@ jobs:
|
|||||||
xcopy /e /h /q z\ace\tools\pDummies\gm gm\
|
xcopy /e /h /q z\ace\tools\pDummies\gm gm\
|
||||||
xcopy /e /h /q z\ace\tools\pDummies\vn vn\
|
xcopy /e /h /q z\ace\tools\pDummies\vn vn\
|
||||||
xcopy /e /h /q z\ace\tools\pDummies\WW2 WW2\
|
xcopy /e /h /q z\ace\tools\pDummies\WW2 WW2\
|
||||||
|
xcopy /e /h /q z\ace\tools\pDummies\CUP CUP\
|
||||||
- name: Build
|
- name: Build
|
||||||
run: py P:\z\ace\tools\make.py ci
|
run: py P:\z\ace\tools\make.py ci
|
||||||
env:
|
env:
|
||||||
PYTHONUNBUFFERED: 1
|
PYTHONUNBUFFERED: 1
|
||||||
- name: Archive logs
|
- name: Archive logs
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
with:
|
with:
|
||||||
name: logs
|
name: logs
|
||||||
path: temp/*.log
|
path: temp/*.log
|
||||||
- name: Archive @ace
|
- name: Archive @ace
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: '@ace3-${{ github.sha }}'
|
name: '@ace3-${{ github.sha }}'
|
||||||
path: z\ace\release\@ace
|
path: z\ace\release\@ace
|
||||||
|
2
.github/workflows/release-drafter.yml
vendored
2
.github/workflows/release-drafter.yml
vendored
@ -11,6 +11,6 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Release Drafter
|
- name: Release Drafter
|
||||||
if: github.repository == 'acemod/ACE3'
|
if: github.repository == 'acemod/ACE3'
|
||||||
uses: release-drafter/release-drafter@v5
|
uses: release-drafter/release-drafter@v6
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
# request, preferably including an email address.
|
# request, preferably including an email address.
|
||||||
|
|
||||||
# CORE TEAM
|
# CORE TEAM
|
||||||
|
BaerMitUmlaut
|
||||||
Brett Mayson
|
Brett Mayson
|
||||||
bux578 <github@jonathandavid.de>
|
bux578 <github@jonathandavid.de>
|
||||||
commy2
|
commy2
|
||||||
@ -25,6 +26,7 @@ Kieran
|
|||||||
kymckay
|
kymckay
|
||||||
mharis001 <mhariszakar@gmail.com>
|
mharis001 <mhariszakar@gmail.com>
|
||||||
MikeMF
|
MikeMF
|
||||||
|
MiszczuZPolski
|
||||||
NouberNou
|
NouberNou
|
||||||
PabstMirror <pabstmirror@gmail.com>
|
PabstMirror <pabstmirror@gmail.com>
|
||||||
Ruthberg <ulteq@web.de>
|
Ruthberg <ulteq@web.de>
|
||||||
@ -56,7 +58,6 @@ Arcanum417 <lubos.len@gmail.com>
|
|||||||
Arkhir <wonsz666@gmail.com >
|
Arkhir <wonsz666@gmail.com >
|
||||||
ARV187 aka Spark23
|
ARV187 aka Spark23
|
||||||
Asgar Serran <piechottaf@web.de>
|
Asgar Serran <piechottaf@web.de>
|
||||||
BaerMitUmlaut
|
|
||||||
Bamse <bamsis@gmail.com>
|
Bamse <bamsis@gmail.com>
|
||||||
Barman75
|
Barman75
|
||||||
Bla1337
|
Bla1337
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/acemod/ACE3/releases/latest">
|
<a href="https://github.com/acemod/ACE3/releases/latest">
|
||||||
<img src="https://img.shields.io/badge/Version-3.16.3-blue.svg?style=flat-square" alt="ACE3 Version">
|
<img src="https://img.shields.io/github/release/acemod/ACE3.svg?style=flat-square&label=Version" alt="ACE3 Version">
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/acemod/ACE3/issues">
|
<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">
|
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat-square&label=Issues" alt="ACE3 Issues">
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
#include "initKeybinds.inc.sqf"
|
|
||||||
|
|
||||||
GVAR(currentbulletID) = -1;
|
GVAR(currentbulletID) = -1;
|
||||||
|
|
||||||
GVAR(Protractor) = false;
|
GVAR(Protractor) = false;
|
||||||
@ -11,6 +9,8 @@ GVAR(currentGrid) = 0;
|
|||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
|
#include "initKeybinds.inc.sqf"
|
||||||
|
|
||||||
["CBA_settingsInitialized", {
|
["CBA_settingsInitialized", {
|
||||||
//If not enabled, dont't add PFEH
|
//If not enabled, dont't add PFEH
|
||||||
if (!GVAR(enabled)) exitWith {};
|
if (!GVAR(enabled)) exitWith {};
|
||||||
@ -19,11 +19,11 @@ if (!hasInterface) exitWith {};
|
|||||||
[] call FUNC(initializeTerrainExtension);
|
[] call FUNC(initializeTerrainExtension);
|
||||||
|
|
||||||
// Register fire event handler
|
// Register fire event handler
|
||||||
["ace_firedPlayer", DFUNC(handleFired)] call CBA_fnc_addEventHandler;
|
["ace_firedPlayer", LINKFUNC(handleFired)] call CBA_fnc_addEventHandler;
|
||||||
["ace_firedPlayerNonLocal", DFUNC(handleFired)] call CBA_fnc_addEventHandler;
|
["ace_firedPlayerNonLocal", LINKFUNC(handleFired)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
// Register Perframe Handler
|
// Register Perframe Handler
|
||||||
[FUNC(handleFirePFH), GVAR(simulationInterval)] call CBA_fnc_addPerFrameHandler;
|
[LINKFUNC(handleFirePFH), GVAR(simulationInterval)] call CBA_fnc_addPerFrameHandler;
|
||||||
|
|
||||||
//Add warnings for missing compat PBOs (only if AB is on)
|
//Add warnings for missing compat PBOs (only if AB is on)
|
||||||
{
|
{
|
||||||
|
@ -44,6 +44,9 @@ if (!(_dragModel in [1, 2, 5, 6, 7, 8])) then {
|
|||||||
_dragModel = 1;
|
_dragModel = 1;
|
||||||
};
|
};
|
||||||
private _ballisticCoefficients = getArray(_ammoConfig >> "ACE_ballisticCoefficients");
|
private _ballisticCoefficients = getArray(_ammoConfig >> "ACE_ballisticCoefficients");
|
||||||
|
if (_ballisticCoefficients isEqualTo []) then {
|
||||||
|
_ballisticCoefficients = [0.5];
|
||||||
|
};
|
||||||
private _velocityBoundaries = getArray(_ammoConfig >> "ACE_velocityBoundaries");
|
private _velocityBoundaries = getArray(_ammoConfig >> "ACE_velocityBoundaries");
|
||||||
private _atmosphereModel = getText(_ammoConfig >> "ACE_standardAtmosphere");
|
private _atmosphereModel = getText(_ammoConfig >> "ACE_standardAtmosphere");
|
||||||
if (_atmosphereModel isEqualTo "") then {
|
if (_atmosphereModel isEqualTo "") then {
|
||||||
|
@ -2,35 +2,6 @@
|
|||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
["baseline", {
|
|
||||||
private _fatigue = ACE_player getVariable [QGVAR(aimFatigue), 0];
|
|
||||||
switch (stance ACE_player) do {
|
|
||||||
case ("CROUCH"): {
|
|
||||||
(1.0 + _fatigue ^ 2 * 0.1)
|
|
||||||
};
|
|
||||||
case ("PRONE"): {
|
|
||||||
(1.0 + _fatigue ^ 2 * 2.0)
|
|
||||||
};
|
|
||||||
default {
|
|
||||||
(1.5 + _fatigue ^ 2 * 3.0)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}, 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
|
// recheck weapon inertia after weapon swap, change of attachments or switching unit
|
||||||
["weapon", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler;
|
["weapon", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler;
|
||||||
["loadout", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler;
|
["loadout", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler;
|
||||||
@ -39,6 +10,21 @@ if (!hasInterface) exitWith {};
|
|||||||
["CBA_settingsInitialized", {
|
["CBA_settingsInitialized", {
|
||||||
if (!GVAR(enabled)) exitWith {};
|
if (!GVAR(enabled)) exitWith {};
|
||||||
|
|
||||||
|
["baseline", {
|
||||||
|
private _fatigue = ACE_player getVariable [QGVAR(aimFatigue), 0];
|
||||||
|
switch (stance ACE_player) do {
|
||||||
|
case ("CROUCH"): {
|
||||||
|
(1.0 + _fatigue ^ 2 * 0.1)
|
||||||
|
};
|
||||||
|
case ("PRONE"): {
|
||||||
|
(1.0 + _fatigue ^ 2 * 2.0)
|
||||||
|
};
|
||||||
|
default {
|
||||||
|
(1.5 + _fatigue ^ 2 * 3.0)
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor);
|
||||||
|
|
||||||
// - Post process effect ------------------------------------------------------
|
// - Post process effect ------------------------------------------------------
|
||||||
GVAR(ppeBlackout) = ppEffectCreate ["ColorCorrections", 4220];
|
GVAR(ppeBlackout) = ppEffectCreate ["ColorCorrections", 4220];
|
||||||
GVAR(ppeBlackout) ppEffectEnable true;
|
GVAR(ppeBlackout) ppEffectEnable true;
|
||||||
|
@ -80,30 +80,3 @@
|
|||||||
[0, 5, 1, 1],
|
[0, 5, 1, 1],
|
||||||
true
|
true
|
||||||
] call CBA_fnc_addSetting;
|
] call CBA_fnc_addSetting;
|
||||||
|
|
||||||
[
|
|
||||||
QGVAR(swayFactor),
|
|
||||||
"SLIDER",
|
|
||||||
[LSTRING(SwayFactor), LSTRING(SwayFactor_Description)],
|
|
||||||
LSTRING(DisplayName),
|
|
||||||
[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;
|
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
<Italian>Influenza la prestazione generale 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>
|
<Chinese>影響所有玩家的體力表現,值越高代表體力越好</Chinese>
|
||||||
<Chinesesimp>影响所有玩家的体力表现,值越高代表体力越好</Chinesesimp>
|
<Chinesesimp>影响所有玩家的体力表现,值越高代表体力越好</Chinesesimp>
|
||||||
<Russian>Влияет на общую производительность игроков, у которых не задано персональное значение.</Russian>
|
<Russian>Влияет на общую производительность игроков, у которых не задано персональное значение. Чем выше, тем лучше.</Russian>
|
||||||
<Portuguese>Influencia na performance geral de todos os jogadores sem nenhum fator personalizado. Quanto maior, melhor.</Portuguese>
|
<Portuguese>Influencia na performance geral de todos os jogadores sem nenhum fator personalizado. Quanto maior, melhor.</Portuguese>
|
||||||
<Czech>Ovlivňuje celkový výkon všech hráčů bez vlastního faktoru. Vyšší znamená lépe.</Czech>
|
<Czech>Ovlivňuje celkový výkon všech hráčů bez vlastního faktoru. Vyšší znamená lépe.</Czech>
|
||||||
</Key>
|
</Key>
|
||||||
@ -59,7 +59,7 @@
|
|||||||
<Italian>Influenza la prestazione personalizzata di questa unità. Maggiore significa migliore.</Italian>
|
<Italian>Influenza la prestazione personalizzata di questa unità. Maggiore significa migliore.</Italian>
|
||||||
<Chinese>影響這個單位的體力表現,值越高代表體力越好</Chinese>
|
<Chinese>影響這個單位的體力表現,值越高代表體力越好</Chinese>
|
||||||
<Chinesesimp>影响这个单位的体力表现,值越高代表体力越好</Chinesesimp>
|
<Chinesesimp>影响这个单位的体力表现,值越高代表体力越好</Chinesesimp>
|
||||||
<Russian>Влияет на общую производительность юнита.</Russian>
|
<Russian>Влияет на общую производительность юнита.Чем выше, тем лучше.</Russian>
|
||||||
<Portuguese>Influencia na performance geral dessa unidade. Quanto maior, melhor.</Portuguese>
|
<Portuguese>Influencia na performance geral dessa unidade. Quanto maior, melhor.</Portuguese>
|
||||||
<Czech>Ovlivňuje celkový výkon této jednotky. Vyšší znamená lépe.</Czech>
|
<Czech>Ovlivňuje celkový výkon této jednotky. Vyšší znamená lépe.</Czech>
|
||||||
</Key>
|
</Key>
|
||||||
@ -154,72 +154,6 @@
|
|||||||
<Portuguese>Define o quanto que um terreno íngrime aumenta na perda de estamina. Quanto maior, maior a perda de estamina.</Portuguese>
|
<Portuguese>Define o quanto que um terreno íngrime aumenta na perda de estamina. Quanto maior, maior a perda de estamina.</Portuguese>
|
||||||
<Czech>Nastavuje, o kolik strmý terén zvyšuje ztrátu výdrže. Vyšší znamená vyšší ztrátu výdrže.</Czech>
|
<Czech>Nastavuje, o kolik strmý terén zvyšuje ztrátu výdrže. Vyšší znamená vyšší ztrátu výdrže.</Czech>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Advanced_Fatigue_SwayFactor">
|
|
||||||
<English>Sway factor</English>
|
|
||||||
<Spanish>Factor de balanceo de mira</Spanish>
|
|
||||||
<German>Verwacklungsfaktor</German>
|
|
||||||
<Japanese>手ぶれ因数</Japanese>
|
|
||||||
<Chinesesimp>抖动系数</Chinesesimp>
|
|
||||||
<Chinese>抖動因素</Chinese>
|
|
||||||
<French>Facteur de tremblement</French>
|
|
||||||
<Italian>Fattore di Oscillazione</Italian>
|
|
||||||
<Polish>Czynnik kołysania</Polish>
|
|
||||||
<Russian>Фактор колебания прицела</Russian>
|
|
||||||
<Portuguese>Fator de Balanço de Mira</Portuguese>
|
|
||||||
<Czech>Faktor kývání</Czech>
|
|
||||||
<Korean>손떨림 정도</Korean>
|
|
||||||
</Key>
|
|
||||||
<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, 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'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">
|
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
|
||||||
<English>Enabled</English>
|
<English>Enabled</English>
|
||||||
<Spanish>Activada</Spanish>
|
<Spanish>Activada</Spanish>
|
||||||
@ -246,7 +180,7 @@
|
|||||||
<Italian>Abilita/Disabilita la Fatica Avanzata.</Italian>
|
<Italian>Abilita/Disabilita la Fatica Avanzata.</Italian>
|
||||||
<Chinese>啟用/關閉進階體力.</Chinese>
|
<Chinese>啟用/關閉進階體力.</Chinese>
|
||||||
<Chinesesimp>启用/关闭进阶体力。</Chinesesimp>
|
<Chinesesimp>启用/关闭进阶体力。</Chinesesimp>
|
||||||
<Russian>Включает / Отключает Продвинутую усталость</Russian>
|
<Russian>Включает/отключает Продвинутую усталость</Russian>
|
||||||
<Portuguese>Ativa/Desativa Fadiga Avançada.</Portuguese>
|
<Portuguese>Ativa/Desativa Fadiga Avançada.</Portuguese>
|
||||||
<Czech>Aktivuje / deaktivuje Pokročilou únavu.</Czech>
|
<Czech>Aktivuje / deaktivuje Pokročilou únavu.</Czech>
|
||||||
</Key>
|
</Key>
|
||||||
|
@ -2,20 +2,22 @@
|
|||||||
|
|
||||||
// Fired XEH
|
// Fired XEH
|
||||||
GVAR(ammoEventHandlers) = createHashMap;
|
GVAR(ammoEventHandlers) = createHashMap;
|
||||||
[QGVAR(throwFiredXEH), FUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
|
[QGVAR(throwFiredXEH), LINKFUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
// Exit on HC
|
// Exit on HC
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
|
// Temporary Wind Info indication
|
||||||
|
GVAR(tempWindInfo) = false;
|
||||||
|
|
||||||
// Ammo/Magazines look-up hash for correctness of initSpeed
|
// Ammo/Magazines look-up hash for correctness of initSpeed
|
||||||
GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
|
GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
private _ammo = getText (configFile >> "CfgMagazines" >> _x >> "ammo");
|
private _ammo = getText (configFile >> "CfgMagazines" >> _x >> "ammo");
|
||||||
if (_ammo != "") then { GVAR(ammoMagLookup) setVariable [_ammo, _x]; };
|
if (_ammo != "") then { GVAR(ammoMagLookup) setVariable [_ammo, _x]; };
|
||||||
} count (getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines"));
|
} forEach (getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines"));
|
||||||
nil
|
} forEach getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles");
|
||||||
} count getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles");
|
|
||||||
|
|
||||||
|
|
||||||
// Add keybinds
|
// Add keybinds
|
||||||
|
@ -19,7 +19,7 @@ params ["_unit"];
|
|||||||
|
|
||||||
if !(_unit getVariable [QGVAR(inHand), false]) exitWith {false};
|
if !(_unit getVariable [QGVAR(inHand), false]) exitWith {false};
|
||||||
|
|
||||||
if (vehicle _unit != _unit) exitWith {
|
if (!isNull objectParent _unit) exitWith {
|
||||||
private _startPos = eyePos _unit;
|
private _startPos = eyePos _unit;
|
||||||
private _aimLinePos = AGLToASL (positionCameraToWorld [0, 0, 1]);
|
private _aimLinePos = AGLToASL (positionCameraToWorld [0, 0, 1]);
|
||||||
private _intersections = lineIntersectsSurfaces [_startPos, _aimLinePos, _unit, objNull, false];
|
private _intersections = lineIntersectsSurfaces [_startPos, _aimLinePos, _unit, objNull, false];
|
||||||
|
@ -53,6 +53,12 @@ _unit setVariable [QGVAR(dropDistance), DROP_DISTANCE_DEFAULT];
|
|||||||
// Remove controls hint (check if ever enabled is inside the function)
|
// Remove controls hint (check if ever enabled is inside the function)
|
||||||
call EFUNC(interaction,hideMouseHint);
|
call EFUNC(interaction,hideMouseHint);
|
||||||
|
|
||||||
|
// Hide wind info after throw, if it was temporarily enabled for the throw
|
||||||
|
if (GVAR(tempWindInfo)) then {
|
||||||
|
EGVAR(weather,WindInfo) = false;
|
||||||
|
GVAR(tempWindInfo) = false;
|
||||||
|
};
|
||||||
|
|
||||||
// Remove throw action
|
// Remove throw action
|
||||||
[_unit, "DefaultAction", _unit getVariable [QGVAR(throwAction), -1]] call EFUNC(common,removeActionEventHandler);
|
[_unit, "DefaultAction", _unit getVariable [QGVAR(throwAction), -1]] call EFUNC(common,removeActionEventHandler);
|
||||||
|
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
params ["_magazineClassname"];
|
params ["_magazineClassname"];
|
||||||
|
|
||||||
_magazineClassname = toLower _magazineClassname;
|
_magazineClassname = toLowerANSI _magazineClassname;
|
||||||
private _throwMuzzles = getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles");
|
private _throwMuzzles = getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles");
|
||||||
|
|
||||||
_throwMuzzles = _throwMuzzles select {_magazineClassname in ((getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines")) apply {toLower _x})};
|
_throwMuzzles = _throwMuzzles select {_magazineClassname in ((getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines")) apply {toLowerANSI _x})};
|
||||||
|
|
||||||
[_throwMuzzles select 0, ""] select (_throwMuzzles isEqualTo [])
|
[_throwMuzzles select 0, ""] select (_throwMuzzles isEqualTo [])
|
||||||
|
@ -18,6 +18,15 @@
|
|||||||
params ["_unit"];
|
params ["_unit"];
|
||||||
TRACE_1("params",_unit);
|
TRACE_1("params",_unit);
|
||||||
|
|
||||||
|
// Temporarily enable wind info, to aid in throwing smoke grenades effectively
|
||||||
|
if (
|
||||||
|
GVAR(enableTempWindInfo) &&
|
||||||
|
{!(missionNamespace getVariable [QEGVAR(weather,WindInfo), false])}
|
||||||
|
) then {
|
||||||
|
[] call EFUNC(weather,displayWindInfo);
|
||||||
|
GVAR(tempWindInfo) = true;
|
||||||
|
};
|
||||||
|
|
||||||
// Select next throwable if one already in hand
|
// Select next throwable if one already in hand
|
||||||
if (_unit getVariable [QGVAR(inHand), false]) exitWith {
|
if (_unit getVariable [QGVAR(inHand), false]) exitWith {
|
||||||
TRACE_1("inHand",_unit);
|
TRACE_1("inHand",_unit);
|
||||||
|
@ -44,8 +44,7 @@
|
|||||||
_addedPickUpHelpers pushBack _pickUpHelper;
|
_addedPickUpHelpers pushBack _pickUpHelper;
|
||||||
_throwablesHelped pushBack _x;
|
_throwablesHelped pushBack _x;
|
||||||
};
|
};
|
||||||
nil
|
} forEach _nearThrowables;
|
||||||
} count _nearThrowables;
|
|
||||||
|
|
||||||
_args set [0, getPosASL ACE_player];
|
_args set [0, getPosASL ACE_player];
|
||||||
_args set [3, _nearThrowables];
|
_args set [3, _nearThrowables];
|
||||||
@ -56,11 +55,10 @@
|
|||||||
{
|
{
|
||||||
// Only handling with attachTo works nicely
|
// Only handling with attachTo works nicely
|
||||||
_x attachTo [_x getVariable [QGVAR(throwable), objNull], [0, 0, 0]];
|
_x attachTo [_x getVariable [QGVAR(throwable), objNull], [0, 0, 0]];
|
||||||
nil
|
} forEach _addedPickUpHelpers;
|
||||||
} count _addedPickUpHelpers;
|
|
||||||
} else {
|
} else {
|
||||||
TRACE_1("Cleaning Pick Up Helpers",count _addedPickUpHelpers);
|
TRACE_1("Cleaning Pick Up Helpers",count _addedPickUpHelpers);
|
||||||
{deleteVehicle _x} count _addedPickUpHelpers;
|
{deleteVehicle _x} forEach _addedPickUpHelpers;
|
||||||
[_idPFH] call CBA_fnc_removePerFrameHandler;
|
[_idPFH] call CBA_fnc_removePerFrameHandler;
|
||||||
};
|
};
|
||||||
}, 0, [(getPosASL ACE_player) vectorAdd [-100, 0, 0], [], [], []]] call CBA_fnc_addPerFrameHandler;
|
}, 0, [(getPosASL ACE_player) vectorAdd [-100, 0, 0], [], [], []]] call CBA_fnc_addPerFrameHandler;
|
||||||
|
@ -45,7 +45,7 @@ if (!(_unit getVariable [QGVAR(primed), false])) then {
|
|||||||
private _newVelocity = (_p1 vectorFromTo _p2) vectorMultiply _velocity;
|
private _newVelocity = (_p1 vectorFromTo _p2) vectorMultiply _velocity;
|
||||||
|
|
||||||
// Adjust for throwing from inside vehicles, where we have a vehicle-based velocity that can't be compensated for by a human
|
// Adjust for throwing from inside vehicles, where we have a vehicle-based velocity that can't be compensated for by a human
|
||||||
if (vehicle _unit != _unit) then {
|
if (!isNull objectParent _unit) then {
|
||||||
_newVelocity = _newVelocity vectorAdd (velocity (vehicle _unit));
|
_newVelocity = _newVelocity vectorAdd (velocity (vehicle _unit));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -40,3 +40,11 @@ private _category = format ["ACE %1", localize LSTRING(Category)];
|
|||||||
true,
|
true,
|
||||||
1
|
1
|
||||||
] call CBA_fnc_addSetting;
|
] call CBA_fnc_addSetting;
|
||||||
|
|
||||||
|
[
|
||||||
|
QGVAR(enableTempWindInfo), "CHECKBOX",
|
||||||
|
[LSTRING(EnableTempWindInfo_DisplayName), LSTRING(EnableTempWindInfo_Description)],
|
||||||
|
_category,
|
||||||
|
true,
|
||||||
|
0
|
||||||
|
] call CBA_fnc_addSetting;
|
||||||
|
@ -185,6 +185,22 @@
|
|||||||
<Portuguese>Permite que arremessáveis fixados em objetos sejam pegos.</Portuguese>
|
<Portuguese>Permite que arremessáveis fixados em objetos sejam pegos.</Portuguese>
|
||||||
<Czech>Zapíná schopnost zvednutí předmětů z objektů ke kterým jsou připnuté.</Czech>
|
<Czech>Zapíná schopnost zvednutí předmětů z objektů ke kterým jsou připnuté.</Czech>
|
||||||
</Key>
|
</Key>
|
||||||
|
<Key ID="STR_ACE_Advanced_Throwing_EnableTempWindInfo_DisplayName">
|
||||||
|
<English>Show Temporary Wind Info</English>
|
||||||
|
<German>Zeige temporäre Windinformationen</German>
|
||||||
|
<Italian>Mostra informazioni sul vento temporaneamente</Italian>
|
||||||
|
<Japanese>一時的に風の情報を表示</Japanese>
|
||||||
|
<Korean>바람 정보 임시로 표시</Korean>
|
||||||
|
<French>Afficher temporairement les informations sur le vent</French>
|
||||||
|
</Key>
|
||||||
|
<Key ID="STR_ACE_Advanced_Throwing_EnableTempWindInfo_Description">
|
||||||
|
<English>Temporarily display Wind Info while throwing, to aid in placing smoke grenades effectively.</English>
|
||||||
|
<German>Zeige während des werfens Windinformationen an, um Rauchgranaten effektiver zu platzieren.</German>
|
||||||
|
<Italian>Mostra le informazioni sul vento durante il lancio di granate, facilitando il piazzamento ottimale di fumogeni.</Italian>
|
||||||
|
<Japanese>投擲行動中に風向きの情報を一時的に表示し、発煙手榴弾の煙幕を効果的に展開しやすくします。</Japanese>
|
||||||
|
<Korean>연막탄을 효과적으로 배치하는 데 도움이 되도록 투척하는 동안 일시적으로 바람 정보를 표시합니다.</Korean>
|
||||||
|
<French>Affiche les informations sur le vent pendant le lancement pour placer les grenades fumigènes plus efficacement.</French>
|
||||||
|
</Key>
|
||||||
<Key ID="STR_ACE_Advanced_Throwing_Prepare">
|
<Key ID="STR_ACE_Advanced_Throwing_Prepare">
|
||||||
<English>Prepare/Change Throwable</English>
|
<English>Prepare/Change Throwable</English>
|
||||||
<Spanish>Preparar/Cambiar objetos lanzables</Spanish>
|
<Spanish>Preparar/Cambiar objetos lanzables</Spanish>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
} forEach _sections;
|
} forEach _sections;
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
[QGVAR(unGarrison), FUNC(unGarrison)] call CBA_fnc_addEventHandler;
|
[QGVAR(unGarrison), LINKFUNC(unGarrison)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
[QGVAR(doMove), {
|
[QGVAR(doMove), {
|
||||||
params ["_unitsArray"];
|
params ["_unitsArray"];
|
||||||
@ -73,6 +73,6 @@
|
|||||||
if (isServer) then {
|
if (isServer) then {
|
||||||
["CAManBase", "init", {
|
["CAManBase", "init", {
|
||||||
// wait for HMD to be assigned so `hmd _unit` works
|
// wait for HMD to be assigned so `hmd _unit` works
|
||||||
[FUNC(assignNVG), _this, 1] call CBA_fnc_waitAndExecute;
|
[LINKFUNC(assignNVG), _this, 1] call CBA_fnc_waitAndExecute;
|
||||||
}] call CBA_fnc_addClassEventHandler;
|
}] call CBA_fnc_addClassEventHandler;
|
||||||
};
|
};
|
||||||
|
@ -33,7 +33,7 @@ if (_startingPos isEqualTo [0,0,0]) exitWith {
|
|||||||
[LSTRING(GarrisonInvalidPosition)] call EFUNC(common,displayTextStructured);
|
[LSTRING(GarrisonInvalidPosition)] call EFUNC(common,displayTextStructured);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (count _unitsArray == 0 || {isNull (_unitsArray select 0)}) exitWith {
|
if (_unitsArray isEqualTo [] || {isNull (_unitsArray select 0)}) exitWith {
|
||||||
TRACE_1("fnc_garrison: Units error",_unitsArray);
|
TRACE_1("fnc_garrison: Units error",_unitsArray);
|
||||||
[LSTRING(GarrisonNoUnits)] call EFUNC(common,displayTextStructured);
|
[LSTRING(GarrisonNoUnits)] call EFUNC(common,displayTextStructured);
|
||||||
};
|
};
|
||||||
@ -43,7 +43,7 @@ if (_fillingRadius >= 50) then {
|
|||||||
_buildings = [_buildings] call CBA_fnc_shuffle;
|
_buildings = [_buildings] call CBA_fnc_shuffle;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (count _buildings == 0) exitWith {
|
if (_buildings isEqualTo []) exitWith {
|
||||||
TRACE_1("fnc_garrison: Building error",_buildings);
|
TRACE_1("fnc_garrison: Building error",_buildings);
|
||||||
[LSTRING(GarrisonNoBuilding)] call EFUNC(common,displayTextStructured);
|
[LSTRING(GarrisonNoBuilding)] call EFUNC(common,displayTextStructured);
|
||||||
};
|
};
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
<French>Equipement JVN automatique</French>
|
<French>Equipement JVN automatique</French>
|
||||||
<Portuguese>Equipar NVGs automaticamente</Portuguese>
|
<Portuguese>Equipar NVGs automaticamente</Portuguese>
|
||||||
<Japanese>暗視装置の自動装備</Japanese>
|
<Japanese>暗視装置の自動装備</Japanese>
|
||||||
|
<Russian>Автоматическое оснащение ПНВ</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_AI_AssignNVG_Description">
|
<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>
|
<English>Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory!</English>
|
||||||
@ -100,6 +101,7 @@
|
|||||||
<French>Equipe des JVN pendant la nuit et les déséquipe le jour.\nN'ajoute pas les JVN dans l'intenvaire !</French>
|
<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>
|
<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>
|
<Japanese>インベントリ内の暗視装置を夜間に装備し、日中は解除し収納します。\nこれはNVGをインベントリに追加しません。</Japanese>
|
||||||
|
<Russian>Экипирует ПНВ в ночное время и отключает его в дневное время.\nНе добавляет ПНВ в инвентарь!</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -30,6 +30,6 @@ _vehicle == vehicle _unit
|
|||||||
if (_unit == _x select FULLCREW_UNIT) exitWith {
|
if (_unit == _x select FULLCREW_UNIT) exitWith {
|
||||||
_ejectVarName = format [QGVAR(ejectAction_%1_%2), _x select FULLCREW_ROLE, _x select FULLCREW_TURRETPATH];
|
_ejectVarName = format [QGVAR(ejectAction_%1_%2), _x select FULLCREW_ROLE, _x select FULLCREW_TURRETPATH];
|
||||||
};
|
};
|
||||||
} count fullCrew _vehicle;
|
} forEach fullCrew _vehicle;
|
||||||
_vehicle getVariable [_ejectVarName, false]
|
_vehicle getVariable [_ejectVarName, false]
|
||||||
}
|
}
|
||||||
|
@ -17,13 +17,13 @@
|
|||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
|
||||||
params ["_vehicle", "_group", "_type", "_value"];
|
params ["_vehicle", "_group", "_type", "_value"];
|
||||||
TRACE_4("droneModifyWaypoint",_vehicle,_group,_type,_value);
|
TRACE_4("droneModifyWaypoint",_vehicle,_group,_type,_value);
|
||||||
|
|
||||||
private _index = (currentWaypoint _group) min count waypoints _group;
|
private _index = (currentWaypoint _group) min count waypoints _group;
|
||||||
private _waypoint = [_group, _index];
|
private _waypoint = [_group, _index];
|
||||||
switch (toLower _type) do {
|
switch (toLowerANSI _type) do {
|
||||||
case ("height"): {
|
case ("height"): {
|
||||||
private _pos = waypointPosition _waypoint;
|
private _pos = waypointPosition _waypoint;
|
||||||
_pos set [2, _value];
|
_pos set [2, _value];
|
||||||
|
@ -123,7 +123,9 @@ class GVAR(stats) {
|
|||||||
stats[] = {"maximumLoad"};
|
stats[] = {"maximumLoad"};
|
||||||
displayName = "$STR_a3_rscdisplayarsenal_stat_load";
|
displayName = "$STR_a3_rscdisplayarsenal_stat_load";
|
||||||
showBar = 1;
|
showBar = 1;
|
||||||
|
showText = 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));
|
||||||
|
textStatement = QUOTE(call FUNC(statTextStatement_load));
|
||||||
tabs[] = {{3,4,5}, {}};
|
tabs[] = {{3,4,5}, {}};
|
||||||
};
|
};
|
||||||
class ACE_smokeChemTTL: statBase {
|
class ACE_smokeChemTTL: statBase {
|
||||||
|
@ -110,7 +110,7 @@ class Cfg3DEN {
|
|||||||
h = QUOTE(65 * ATTRIBUTE_H);
|
h = QUOTE(65 * ATTRIBUTE_H);
|
||||||
drawSideArrows = 1;
|
drawSideArrows = 1;
|
||||||
disableOverflow = 1;
|
disableOverflow = 1;
|
||||||
columns[] = {0.05, 0.15, 0.85};
|
columns[] = {0.05, 0.15, 0.83, 0.87};
|
||||||
};
|
};
|
||||||
class ArrowLeft: ctrlButton {
|
class ArrowLeft: ctrlButton {
|
||||||
idc = IDC_ATTRIBUTE_LIST_LEFT;
|
idc = IDC_ATTRIBUTE_LIST_LEFT;
|
||||||
|
@ -16,6 +16,8 @@ PREP(attributeKeyDown);
|
|||||||
PREP(attributeLoad);
|
PREP(attributeLoad);
|
||||||
PREP(attributeMode);
|
PREP(attributeMode);
|
||||||
PREP(attributeSelect);
|
PREP(attributeSelect);
|
||||||
|
PREP(baseAttachment);
|
||||||
|
PREP(baseOptic);
|
||||||
PREP(baseWeapon);
|
PREP(baseWeapon);
|
||||||
PREP(buttonActionsPage);
|
PREP(buttonActionsPage);
|
||||||
PREP(buttonCargo);
|
PREP(buttonCargo);
|
||||||
@ -96,6 +98,7 @@ PREP(statBarStatement_rateOfFIre);
|
|||||||
PREP(statTextStatement_accuracy);
|
PREP(statTextStatement_accuracy);
|
||||||
PREP(statTextStatement_explosionTime);
|
PREP(statTextStatement_explosionTime);
|
||||||
PREP(statTextStatement_illuminators);
|
PREP(statTextStatement_illuminators);
|
||||||
|
PREP(statTextStatement_load);
|
||||||
PREP(statTextStatement_magCount);
|
PREP(statTextStatement_magCount);
|
||||||
PREP(statTextStatement_mass);
|
PREP(statTextStatement_mass);
|
||||||
PREP(statTextStatement_rateOfFire);
|
PREP(statTextStatement_rateOfFire);
|
||||||
|
@ -70,7 +70,7 @@ GVAR(lastSortDirectionRight) = DESCENDING;
|
|||||||
if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then {
|
if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then {
|
||||||
private _curSelData = _contentPanelCtrl lnbData [lnbCurSelRow _contentPanelCtrl, 1];
|
private _curSelData = _contentPanelCtrl lnbData [lnbCurSelRow _contentPanelCtrl, 1];
|
||||||
|
|
||||||
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"];
|
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsList", "_unavailableItemsList"];
|
||||||
_extendedLoadout params ["_loadout"];
|
_extendedLoadout params ["_loadout"];
|
||||||
|
|
||||||
private _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName];
|
private _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName];
|
||||||
@ -81,10 +81,10 @@ GVAR(lastSortDirectionRight) = DESCENDING;
|
|||||||
_contentPanelCtrl lnbSetData [[_newRow, 1], _playerName + _loadoutName];
|
_contentPanelCtrl lnbSetData [[_newRow, 1], _playerName + _loadoutName];
|
||||||
|
|
||||||
// Set color of row, depending if items are unavailable/missing
|
// Set color of row, depending if items are unavailable/missing
|
||||||
if (_nullItemsAmount > 0) then {
|
if (_nullItemsList isNotEqualTo []) then {
|
||||||
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]];
|
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]];
|
||||||
} else {
|
} else {
|
||||||
if (_unavailableItemsAmount > 0) then {
|
if (_unavailableItemsList isNotEqualTo []) then {
|
||||||
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]];
|
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -108,24 +108,16 @@ GVAR(lastSortDirectionRight) = DESCENDING;
|
|||||||
private _face = _extendedInfo getOrDefault [QGVAR(face), ""];
|
private _face = _extendedInfo getOrDefault [QGVAR(face), ""];
|
||||||
|
|
||||||
if (_face != "") then {
|
if (_face != "") then {
|
||||||
if (isMultiplayer) then {
|
private _id = [QGVAR(broadcastFace), [_unit, _face], QGVAR(centerFace_) + hashValue _unit] call CBA_fnc_globalEventJIP;
|
||||||
private _id = [QGVAR(broadcastFace), [_unit, _face], QGVAR(centerFace_) + netId _unit] call CBA_fnc_globalEventJIP;
|
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
|
||||||
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
|
|
||||||
} else {
|
|
||||||
_unit setFace _face;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set voice
|
// Set voice
|
||||||
private _voice = _extendedInfo getOrDefault [QGVAR(voice), ""];
|
private _voice = _extendedInfo getOrDefault [QGVAR(voice), ""];
|
||||||
|
|
||||||
if (_voice != "") then {
|
if (_voice != "") then {
|
||||||
if (isMultiplayer) then {
|
private _id = [QGVAR(broadcastVoice), [_unit, _voice], QGVAR(centerVoice_) + hashValue _unit] call CBA_fnc_globalEventJIP;
|
||||||
private _id = [QGVAR(broadcastVoice), [_unit, _voice], QGVAR(centerVoice_) + netId _unit] call CBA_fnc_globalEventJIP;
|
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
|
||||||
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
|
|
||||||
} else {
|
|
||||||
_unit setSpeaker _voice;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set insignia
|
// Set insignia
|
||||||
@ -147,7 +139,7 @@ GVAR(lastSortDirectionRight) = DESCENDING;
|
|||||||
|
|
||||||
// Set voice if enabled
|
// Set voice if enabled
|
||||||
if (GVAR(loadoutsSaveVoice)) then {
|
if (GVAR(loadoutsSaveVoice)) then {
|
||||||
_extendedInfo set [QGVAR(voice), speaker _unit];
|
_extendedInfo set [QGVAR(voice), (speaker _unit) call EFUNC(common,getConfigName)];
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set insignia if enabled
|
// Set insignia if enabled
|
||||||
|
@ -48,4 +48,47 @@ call FUNC(compileStats);
|
|||||||
// Setup Tools tab
|
// Setup Tools tab
|
||||||
[keys (uiNamespace getVariable [QGVAR(configItemsTools), createHashMap]), LLSTRING(toolsTab), TOOLS_TAB_ICON, -1, true] call FUNC(addRightPanelButton);
|
[keys (uiNamespace getVariable [QGVAR(configItemsTools), createHashMap]), LLSTRING(toolsTab), TOOLS_TAB_ICON, -1, true] call FUNC(addRightPanelButton);
|
||||||
|
|
||||||
|
// TODO: make IDCs able to match IDX with simple math?
|
||||||
|
GVAR(idxMap) = createHashMapFromArray [
|
||||||
|
[IDC_buttonPrimaryWeapon, IDX_VIRT_PRIMARY_WEAPONS],
|
||||||
|
[IDC_buttonHandgun, IDX_VIRT_HANDGUN_WEAPONS],
|
||||||
|
[IDC_buttonSecondaryWeapon, IDX_VIRT_SECONDARY_WEAPONS],
|
||||||
|
[IDC_buttonHeadgear, IDX_VIRT_HEADGEAR],
|
||||||
|
[IDC_buttonUniform, IDX_VIRT_UNIFORM],
|
||||||
|
[IDC_buttonVest, IDX_VIRT_VEST],
|
||||||
|
[IDC_buttonBackpack, IDX_VIRT_BACKPACK],
|
||||||
|
[IDC_buttonGoggles, IDX_VIRT_GOGGLES],
|
||||||
|
[IDC_buttonNVG, IDX_VIRT_NVG],
|
||||||
|
[IDC_buttonBinoculars, IDX_VIRT_BINO],
|
||||||
|
[IDC_buttonMap, IDX_VIRT_MAP],
|
||||||
|
[IDC_buttonGPS, IDX_VIRT_COMMS],
|
||||||
|
[IDC_buttonRadio, IDX_VIRT_RADIO],
|
||||||
|
[IDC_buttonCompass, IDX_VIRT_COMPASS],
|
||||||
|
[IDC_buttonWatch, IDX_VIRT_WATCH]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Make new hashmaps for face/voice/insignia so mission makers can disable them
|
||||||
|
// Copies of hashmaps aren't final
|
||||||
|
GVAR(faceCache) = +(uiNamespace getVariable QGVAR(faceCache));
|
||||||
|
GVAR(voiceCache) = +(uiNamespace getVariable QGVAR(voiceCache));
|
||||||
|
GVAR(insigniaCache) = +(uiNamespace getVariable QGVAR(insigniaCache));
|
||||||
|
|
||||||
|
// Get mission/campaign insignias
|
||||||
|
// BIS_fnc_setUnitInsignia will look in mission config, then campaign, then global config last, so overwrite accordingly
|
||||||
|
private _insigniaCondition = toString {
|
||||||
|
if (isNumber (_x >> "scope")) then {
|
||||||
|
getNumber (_x >> "scope") == 2
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Ref fnc_addListBoxItem, 0/nil = configFile, 1 = campaignConfigFile, 2 = missionConfigFile
|
||||||
|
{
|
||||||
|
GVAR(insigniaCache) set [_x, 1];
|
||||||
|
} forEach (_insigniaCondition configClasses (campaignConfigFile >> "CfgUnitInsignia"));
|
||||||
|
{
|
||||||
|
GVAR(insigniaCache) set [_x, 2];
|
||||||
|
} forEach (_insigniaCondition configClasses (missionConfigFile >> "CfgUnitInsignia"));
|
||||||
|
|
||||||
ADDON = true;
|
ADDON = true;
|
||||||
|
@ -270,6 +270,7 @@
|
|||||||
#define IDX_VIRT_UNIQUE_UNKNOWN_ITEMS 25
|
#define IDX_VIRT_UNIQUE_UNKNOWN_ITEMS 25
|
||||||
|
|
||||||
// Indexes of current items array
|
// Indexes of current items array
|
||||||
|
// Should match IDX_VIRT_X macros for any left panel tabs
|
||||||
#define IDX_CURR_PRIMARY_WEAPON 0
|
#define IDX_CURR_PRIMARY_WEAPON 0
|
||||||
#define IDX_CURR_SECONDARY_WEAPON 1
|
#define IDX_CURR_SECONDARY_WEAPON 1
|
||||||
#define IDX_CURR_HANDGUN_WEAPON 2
|
#define IDX_CURR_HANDGUN_WEAPON 2
|
||||||
@ -489,3 +490,6 @@ if (!isNil QGVAR(customRightPanelButtons)) then {\
|
|||||||
_contentPanelCtrl lnbSetPicture [[_newRow, 7], getText (configFile >> "CfgVehicles" >> (_loadout select IDX_LOADOUT_BACKPACK) select 0 >> "picture")];\
|
_contentPanelCtrl lnbSetPicture [[_newRow, 7], getText (configFile >> "CfgVehicles" >> (_loadout select IDX_LOADOUT_BACKPACK) select 0 >> "picture")];\
|
||||||
_contentPanelCtrl lnbSetPicture [[_newRow, 8], getText (_cfgWeapons >> _loadout select IDX_LOADOUT_HEADGEAR >> "picture")];\
|
_contentPanelCtrl lnbSetPicture [[_newRow, 8], getText (_cfgWeapons >> _loadout select IDX_LOADOUT_HEADGEAR >> "picture")];\
|
||||||
_contentPanelCtrl lnbSetPicture [[_newRow, 9], getText (configFile >> "CfgGlasses" >> _loadout select IDX_LOADOUT_GOGGLES >> "picture")];
|
_contentPanelCtrl lnbSetPicture [[_newRow, 9], getText (configFile >> "CfgGlasses" >> _loadout select IDX_LOADOUT_GOGGLES >> "picture")];
|
||||||
|
|
||||||
|
#define ACTION_TYPE_TEXT 0
|
||||||
|
#define ACTION_TYPE_BUTTON 1
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
#include "..\defines.hpp"
|
||||||
/*
|
/*
|
||||||
* Author: johnb43
|
* Author: johnb43
|
||||||
* Adds custom action buttons.
|
* Adds custom action buttons.
|
||||||
|
@ -6,9 +6,10 @@
|
|||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: Config category, must be "CfgWeapons", "CfgVehicles", "CfgMagazines", "CfgVoice" or "CfgUnitInsignia" <STRING>
|
* 0: Config category, must be "CfgWeapons", "CfgVehicles", "CfgMagazines", "CfgVoice" or "CfgUnitInsignia" <STRING>
|
||||||
* 1: Classname <STRING>
|
* 1: Classname (must be in config case) <STRING>
|
||||||
* 2: Panel control <CONTROL>
|
* 2: Panel control <CONTROL>
|
||||||
* 3: Name of the picture entry in that Cfg class <STRING> (default: "picture")
|
* 3: Name of the picture entry in that Cfg class <STRING> (default: "picture")
|
||||||
|
* 4: Config root <NUMBER> (default: 0 -> configFile)
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* None
|
* None
|
||||||
@ -19,9 +20,9 @@
|
|||||||
* Public: Yes
|
* Public: Yes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
params ["_configCategory", "_className", "_ctrlPanel", ["_pictureEntryName", "picture", [""]]];
|
params ["_configCategory", "_className", "_ctrlPanel", ["_pictureEntryName", "picture", [""]], ["_configRoot", 0, [0]]];
|
||||||
|
|
||||||
private _skip = GVAR(favoritesOnly) && {!(_className in GVAR(currentItems))} && {!((toLower _className) in GVAR(favorites))};
|
private _skip = GVAR(favoritesOnly) && {!(_className in GVAR(currentItems))} && {!((toLowerANSI _className) in GVAR(favorites))};
|
||||||
if (_skip) then {
|
if (_skip) then {
|
||||||
switch (GVAR(currentLeftPanel)) do {
|
switch (GVAR(currentLeftPanel)) do {
|
||||||
case IDC_buttonPrimaryWeapon: {
|
case IDC_buttonPrimaryWeapon: {
|
||||||
@ -41,10 +42,10 @@ if (_skip) then {
|
|||||||
|
|
||||||
if (_skip) exitWith {};
|
if (_skip) exitWith {};
|
||||||
|
|
||||||
// Sanitise key, as it's public; If not in cache, find info and cache it for later use
|
// If not in cache, find info and cache it for later use
|
||||||
((uiNamespace getVariable QGVAR(addListBoxItemCache)) getOrDefaultCall [_configCategory + _className, {
|
((uiNamespace getVariable QGVAR(addListBoxItemCache)) getOrDefaultCall [_configCategory + _className + str _configRoot, {
|
||||||
// Get classname (config case), display name, picture and DLC
|
// Get classname (config case), display name, picture and DLC
|
||||||
private _configPath = configFile >> _configCategory >> _className;
|
private _configPath = ([configFile, campaignConfigFile, missionConfigFile] select _configRoot) >> _configCategory >> _className;
|
||||||
private _dlcName = _configPath call EFUNC(common,getAddon);
|
private _dlcName = _configPath call EFUNC(common,getAddon);
|
||||||
|
|
||||||
// If _pictureEntryName is empty, then this item has no picture (e.g. faces)
|
// If _pictureEntryName is empty, then this item has no picture (e.g. faces)
|
||||||
@ -57,7 +58,7 @@ _ctrlPanel lbSetPicture [_lbAdd, _itemPicture];
|
|||||||
_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
|
_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
|
||||||
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]];
|
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]];
|
||||||
|
|
||||||
if ((toLower _className) in GVAR(favorites)) then {
|
if ((toLowerANSI _className) in GVAR(favorites)) then {
|
||||||
_ctrlPanel lbSetColor [_lbAdd, FAVORITES_COLOR];
|
_ctrlPanel lbSetColor [_lbAdd, FAVORITES_COLOR];
|
||||||
_ctrlPanel lbSetSelectColor [_lbAdd, FAVORITES_COLOR];
|
_ctrlPanel lbSetSelectColor [_lbAdd, FAVORITES_COLOR];
|
||||||
};
|
};
|
||||||
|
@ -66,7 +66,8 @@ _items = _items select {
|
|||||||
_x isKindOf ["CBA_MiscItem", _cfgWeapons] && {getNumber (_configItemInfo >> "type") in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD]} ||
|
_x isKindOf ["CBA_MiscItem", _cfgWeapons] && {getNumber (_configItemInfo >> "type") in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD]} ||
|
||||||
{getNumber (_configItemInfo >> "type") in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} ||
|
{getNumber (_configItemInfo >> "type") in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} ||
|
||||||
{getText (_cfgWeapons >> _x >> "simulation") == "ItemMineDetector"} ||
|
{getText (_cfgWeapons >> _x >> "simulation") == "ItemMineDetector"} ||
|
||||||
{getNumber (_cfgMagazines >> _x >> "ACE_isUnique") == 1}
|
{getNumber (_cfgMagazines >> _x >> "ACE_isUnique") == 1} ||
|
||||||
|
{getNumber (_cfgMagazines >> _x >> "ACE_asItem") == 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
GVAR(customRightPanelButtons) set [_position, [_items apply {_x call EFUNC(common,getConfigName)}, _picture, _tooltip, _moveOnOverwrite]];
|
GVAR(customRightPanelButtons) set [_position, [_items apply {_x call EFUNC(common,getConfigName)}, _picture, _tooltip, _moveOnOverwrite]];
|
||||||
|
@ -46,6 +46,7 @@ private _cfgWeapons = configFile >> "CfgWeapons";
|
|||||||
private _cfgMagazines = configFile >> "CfgMagazines";
|
private _cfgMagazines = configFile >> "CfgMagazines";
|
||||||
private _cfgVehicles = configFile >> "CfgVehicles";
|
private _cfgVehicles = configFile >> "CfgVehicles";
|
||||||
private _cfgGlasses = configFile >> "CfgGlasses";
|
private _cfgGlasses = configFile >> "CfgGlasses";
|
||||||
|
private _dlcName = "";
|
||||||
|
|
||||||
// Exit with current items (no specific category)
|
// Exit with current items (no specific category)
|
||||||
if (_category == IDX_CAT_ALL) exitWith {
|
if (_category == IDX_CAT_ALL) exitWith {
|
||||||
@ -73,6 +74,12 @@ if (_category == IDX_CAT_ALL) exitWith {
|
|||||||
_listbox lnbSetData [[_index, 1], _x];
|
_listbox lnbSetData [[_index, 1], _x];
|
||||||
_listbox lnbSetPicture [[_index, 0], getText (_config >> "picture")];
|
_listbox lnbSetPicture [[_index, 0], getText (_config >> "picture")];
|
||||||
_listbox lnbSetTooltip [[_index, 0], _x];
|
_listbox lnbSetTooltip [[_index, 0], _x];
|
||||||
|
|
||||||
|
_dlcName = _config call EFUNC(common,getAddon);
|
||||||
|
|
||||||
|
if (_dlcName != "") then {
|
||||||
|
_listbox lnbSetPicture [[_index, 2], (modParams [_dlcName, ["logo"]]) param [0, ""]];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
} forEach _attributeItems;
|
} forEach _attributeItems;
|
||||||
|
|
||||||
@ -130,12 +137,20 @@ private _config = _cfgClass;
|
|||||||
_alpha = 0.5;
|
_alpha = 0.5;
|
||||||
};
|
};
|
||||||
|
|
||||||
_index = _listbox lnbAddRow ["", _displayName, _symbol];
|
_index = _listbox lnbAddRow ["", _displayName, "", _symbol];
|
||||||
_listbox lnbSetData [[_index, 1], _x];
|
_listbox lnbSetData [[_index, 1], _x];
|
||||||
_listbox lnbSetPicture [[_index, 0], getText (_config >> _x >> "picture")];
|
_listbox lnbSetPicture [[_index, 0], getText (_config >> _x >> "picture")];
|
||||||
_listbox lnbSetTooltip [[_index, 0], _x];
|
_listbox lnbSetTooltip [[_index, 0], _x];
|
||||||
_listbox lnbSetColor [[_index, 1], [1, 1, 1, _alpha]];
|
_listbox lnbSetColor [[_index, 1], [1, 1, 1, _alpha]];
|
||||||
_listbox lnbSetColor [[_index, 2], [1, 1, 1, _alpha]];
|
_listbox lnbSetColor [[_index, 3], [1, 1, 1, _alpha]];
|
||||||
|
|
||||||
|
// Mod icon is in column 2
|
||||||
|
_dlcName = (_config >> _x) call EFUNC(common,getAddon);
|
||||||
|
|
||||||
|
if (_dlcName != "") then {
|
||||||
|
_listbox lnbSetPicture [[_index, 2], (modParams [_dlcName, ["logo"]]) param [0, ""]];
|
||||||
|
_listbox lnbSetPictureColor [[_index, 2], [1, 1, 1, _alpha]];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
} forEach (keys _categoryItems);
|
} forEach (keys _categoryItems);
|
||||||
|
|
||||||
|
@ -35,9 +35,10 @@ if (_addItem && {_itemIndex == -1}) exitWith {
|
|||||||
_attributeItems pushBack _itemClassname;
|
_attributeItems pushBack _itemClassname;
|
||||||
|
|
||||||
// Change symbol and increase alpha
|
// Change symbol and increase alpha
|
||||||
_listbox lnbSetText [[_currentRow, 2], [SYMBOL_ITEM_VIRTUAL, SYMBOL_ITEM_REMOVE] select _attributeMode];
|
_listbox lnbSetText [[_currentRow, 3], [SYMBOL_ITEM_VIRTUAL, SYMBOL_ITEM_REMOVE] select _attributeMode];
|
||||||
_listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 1]];
|
_listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 1]];
|
||||||
_listbox lnbSetColor [[_currentRow, 2], [1, 1, 1, 1]];
|
_listbox lnbSetPictureColor [[_currentRow, 2], [1, 1, 1, 1]]; // mod icon is in column 2
|
||||||
|
_listbox lnbSetColor [[_currentRow, 3], [1, 1, 1, 1]];
|
||||||
};
|
};
|
||||||
|
|
||||||
// Remove item if in list
|
// Remove item if in list
|
||||||
@ -45,7 +46,8 @@ if (!_addItem && {_itemIndex != -1}) exitWith {
|
|||||||
_attributeItems deleteAt _itemIndex;
|
_attributeItems deleteAt _itemIndex;
|
||||||
|
|
||||||
// Change symbol and reduce alpha
|
// Change symbol and reduce alpha
|
||||||
_listbox lnbSetText [[_currentRow, 2], SYMBOL_ITEM_NONE];
|
_listbox lnbSetText [[_currentRow, 3], SYMBOL_ITEM_NONE];
|
||||||
_listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 0.5]];
|
_listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 0.5]];
|
||||||
_listbox lnbSetColor [[_currentRow, 2], [1, 1, 1, 0.5]];
|
_listbox lnbSetPictureColor [[_currentRow, 2], [1, 1, 1, 0.5]]; // mod icon is in column 2
|
||||||
|
_listbox lnbSetColor [[_currentRow, 3], [1, 1, 1, 0.5]];
|
||||||
};
|
};
|
||||||
|
59
addons/arsenal/functions/fnc_baseAttachment.sqf
Normal file
59
addons/arsenal/functions/fnc_baseAttachment.sqf
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
/*
|
||||||
|
* Author: Jonpas, LinkIsGrim
|
||||||
|
* Returns base attachment for CBA scripted attachment
|
||||||
|
* Adapted from CBA_fnc_switchableAttachments
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Attachment <STRING>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* Base attachment <STRING>
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* "ACE_acc_pointer_green_IR" call ace_arsenal_fnc_baseAttachment
|
||||||
|
*
|
||||||
|
* Public: Yes
|
||||||
|
*/
|
||||||
|
|
||||||
|
params [["_item", "", [""]]];
|
||||||
|
|
||||||
|
TRACE_1("looking up base attachment",_item);
|
||||||
|
|
||||||
|
private _switchableClasses = [];
|
||||||
|
|
||||||
|
private _cfgWeapons = configfile >> "CfgWeapons";
|
||||||
|
private _config = _cfgWeapons >> _item;
|
||||||
|
_item = configName _config;
|
||||||
|
|
||||||
|
// If the switch config entries are inherited, ignore
|
||||||
|
if (
|
||||||
|
(inheritsFrom (_config >> "MRT_SwitchItemNextClass") isNotEqualTo _config) ||
|
||||||
|
{inheritsFrom (_config >> "MRT_SwitchItemPrevClass") isNotEqualTo _config}
|
||||||
|
) exitWith {
|
||||||
|
_item // return
|
||||||
|
};
|
||||||
|
|
||||||
|
while {
|
||||||
|
_config = _cfgWeapons >> getText (_config >> "MRT_SwitchItemNextClass");
|
||||||
|
isClass _config && {_switchableClasses pushBackUnique configName _config != -1}
|
||||||
|
} do {};
|
||||||
|
|
||||||
|
_config = _cfgWeapons >> _item;
|
||||||
|
private _backward = [];
|
||||||
|
while {
|
||||||
|
_config = _cfgWeapons >> getText (_config >> "MRT_SwitchItemPrevClass");
|
||||||
|
isClass _config && {_backward pushBackUnique configName _config != -1}
|
||||||
|
} do {};
|
||||||
|
|
||||||
|
_switchableClasses append _backward;
|
||||||
|
_switchableClasses = _switchableClasses arrayIntersect _switchableClasses;
|
||||||
|
|
||||||
|
{
|
||||||
|
if (getNumber (_cfgWeapons >> _x >> "scope") == 2) exitWith {
|
||||||
|
TRACE_2("found class",_item,_x);
|
||||||
|
_item = _x;
|
||||||
|
};
|
||||||
|
} forEach _switchableClasses;
|
||||||
|
|
||||||
|
_item
|
32
addons/arsenal/functions/fnc_baseOptic.sqf
Normal file
32
addons/arsenal/functions/fnc_baseOptic.sqf
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
/*
|
||||||
|
* Author: Jonpas, LinkIsGrim
|
||||||
|
* Returns base optic for CBA scripted optics (PIP and 2D)
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Optic <STRING>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* Base optic <STRING>
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* "CUP_optic_Elcan_SpecterDR_black_PIP" call ace_arsenal_fnc_baseOptic
|
||||||
|
*
|
||||||
|
* Public: Yes
|
||||||
|
*/
|
||||||
|
|
||||||
|
params [["_optic", "", [""]]];
|
||||||
|
|
||||||
|
// PIP
|
||||||
|
private _baseClasses = configProperties [configFile >> "CBA_PIPItems", "getText _x == _optic"];
|
||||||
|
|
||||||
|
// Carry Handle
|
||||||
|
{
|
||||||
|
_baseClasses append (configProperties [_x, "getText _x == _optic"]);
|
||||||
|
} forEach configProperties [configFile >> "CBA_CarryHandleTypes"];
|
||||||
|
|
||||||
|
if (_baseClasses isNotEqualTo []) then {
|
||||||
|
_optic = configName (_baseClasses select 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
_optic
|
@ -19,7 +19,7 @@
|
|||||||
params [["_weapon", "", [""]]];
|
params [["_weapon", "", [""]]];
|
||||||
|
|
||||||
// Check if item is cached
|
// Check if item is cached
|
||||||
(uiNamespace getVariable QGVAR(baseWeaponNameCache)) getOrDefaultCall [toLower _weapon, {
|
(uiNamespace getVariable QGVAR(baseWeaponNameCache)) getOrDefaultCall [toLowerANSI _weapon, {
|
||||||
private _cfgWeapons = configfile >> "CfgWeapons";
|
private _cfgWeapons = configfile >> "CfgWeapons";
|
||||||
private _config = _cfgWeapons >> _weapon;
|
private _config = _cfgWeapons >> _weapon;
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
#include "..\defines.hpp"
|
||||||
/*
|
/*
|
||||||
* Author: Brett Mayson
|
* Author: Brett Mayson
|
||||||
* Create the internal actions arrays when needed for the first time.
|
* Create the internal actions arrays when needed for the first time.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
#include "..\defines.hpp"
|
#include "..\defines.hpp"
|
||||||
/*
|
/*
|
||||||
* Author: Alganthe, johnb43
|
* Author: Alganthe, johnb43, LinkIsGrim
|
||||||
* Fills left panel.
|
* Fills left panel.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
@ -17,21 +17,28 @@
|
|||||||
|
|
||||||
params ["_display", "_control", ["_animate", true]];
|
params ["_display", "_control", ["_animate", true]];
|
||||||
|
|
||||||
|
private _ctrlIDC = ctrlIDC _control;
|
||||||
|
private _ctrlPanel = _display displayCtrl IDC_leftTabContent;
|
||||||
|
private _idxVirt = GVAR(idxMap) getOrDefault [_ctrlIDC, -1, true];
|
||||||
|
|
||||||
// Fade old control background
|
// Fade old control background
|
||||||
if (!isNil QGVAR(currentLeftPanel)) then {
|
if (!isNil QGVAR(currentLeftPanel)) then {
|
||||||
private _previousCtrlBackground = _display displayCtrl (GVAR(currentLeftPanel) - 1);
|
private _previousCtrlBackground = _display displayCtrl (GVAR(currentLeftPanel) - 1);
|
||||||
_previousCtrlBackground ctrlSetFade 1;
|
_previousCtrlBackground ctrlSetFade 1;
|
||||||
_previousCtrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
|
_previousCtrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
|
||||||
|
|
||||||
|
// When switching tabs, clear searchbox
|
||||||
|
if (GVAR(currentLeftPanel) != _ctrlIDC) then {
|
||||||
|
(_display displayCtrl IDC_leftSearchbar) ctrlSetText "";
|
||||||
|
(_display displayCtrl IDC_rightSearchbar) ctrlSetText "";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Show new control background
|
// Show new control background
|
||||||
private _ctrlIDC = ctrlIDC _control;
|
|
||||||
private _ctrlBackground = _display displayCtrl (_ctrlIDC - 1);
|
private _ctrlBackground = _display displayCtrl (_ctrlIDC - 1);
|
||||||
_ctrlBackground ctrlSetFade 0;
|
_ctrlBackground ctrlSetFade 0;
|
||||||
_ctrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
|
_ctrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
|
||||||
|
|
||||||
private _ctrlPanel = _display displayCtrl IDC_leftTabContent;
|
|
||||||
|
|
||||||
// Force a "refresh" animation of the panel
|
// Force a "refresh" animation of the panel
|
||||||
if (_animate) then {
|
if (_animate) then {
|
||||||
_ctrlPanel ctrlSetFade 1;
|
_ctrlPanel ctrlSetFade 1;
|
||||||
@ -41,212 +48,82 @@ if (_animate) then {
|
|||||||
};
|
};
|
||||||
|
|
||||||
_ctrlPanel lbSetCurSel -1;
|
_ctrlPanel lbSetCurSel -1;
|
||||||
|
// Purge old data
|
||||||
|
lbClear _ctrlPanel;
|
||||||
|
|
||||||
// Handle icons and filling
|
// For every left tab except faces and voices, add "Empty" entry
|
||||||
private _selectedItem = switch (true) do {
|
if !(_ctrlIDC in [IDC_buttonFace, IDC_buttonVoice]) then {
|
||||||
// Primary weapons, secondary weapons, handgun weapons
|
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
|
||||||
case (_ctrlIDC in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon]): {
|
_ctrlPanel lbSetValue [_addEmpty, -1];
|
||||||
// Purge old data
|
|
||||||
lbClear _ctrlPanel;
|
|
||||||
|
|
||||||
// Add "Empty" entry
|
|
||||||
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
|
|
||||||
_ctrlPanel lbSetValue [_addEmpty, -1];
|
|
||||||
|
|
||||||
// Add selected tab's weapons
|
|
||||||
private _index = [IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find _ctrlIDC;
|
|
||||||
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys ((GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _index));
|
|
||||||
|
|
||||||
GVAR(currentItems) select _index
|
|
||||||
};
|
|
||||||
// Uniforms, vests, backpacks
|
|
||||||
case (_ctrlIDC in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]): {
|
|
||||||
// Purge old data
|
|
||||||
lbClear _ctrlPanel;
|
|
||||||
|
|
||||||
// Add "Empty" entry
|
|
||||||
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
|
|
||||||
_ctrlPanel lbSetValue [_addEmpty, -1];
|
|
||||||
|
|
||||||
switch (_ctrlIDC) do {
|
|
||||||
// Add uniforms
|
|
||||||
case IDC_buttonUniform: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIFORM));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_UNIFORM
|
|
||||||
};
|
|
||||||
// Add vests
|
|
||||||
case IDC_buttonVest: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_VEST));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_VEST
|
|
||||||
};
|
|
||||||
// Add backpacks
|
|
||||||
case IDC_buttonBackpack: {
|
|
||||||
{
|
|
||||||
["CfgVehicles", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_BACKPACK));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_BACKPACK
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
// Other
|
|
||||||
default {
|
|
||||||
// Don't reset right panel selection if left tab is binos
|
|
||||||
if (_ctrlIDC != IDC_buttonBinoculars) then {
|
|
||||||
GVAR(currentRightPanel) = nil;
|
|
||||||
};
|
|
||||||
|
|
||||||
lbClear _ctrlPanel;
|
|
||||||
|
|
||||||
// For every left tab except faces and voices, add "Empty" entry
|
|
||||||
if !(_ctrlIDC in [IDC_buttonFace, IDC_buttonVoice]) then {
|
|
||||||
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
|
|
||||||
_ctrlPanel lbSetValue [_addEmpty, -1];
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (_ctrlIDC) do {
|
|
||||||
// Headgear
|
|
||||||
case IDC_buttonHeadgear: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_HEADGEAR));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_HEADGEAR
|
|
||||||
};
|
|
||||||
// Facewear
|
|
||||||
case IDC_buttonGoggles: {
|
|
||||||
{
|
|
||||||
["CfgGlasses", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_GOGGLES));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_GOGGLES
|
|
||||||
};
|
|
||||||
// NVGs
|
|
||||||
case IDC_buttonNVG: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_NVG));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_NVG
|
|
||||||
};
|
|
||||||
// Binoculars
|
|
||||||
case IDC_buttonBinoculars: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_BINO));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_BINO
|
|
||||||
};
|
|
||||||
// Maps
|
|
||||||
case IDC_buttonMap: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_MAP));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_MAP
|
|
||||||
};
|
|
||||||
// Compasses
|
|
||||||
case IDC_buttonCompass: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_COMPASS));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_COMPASS
|
|
||||||
};
|
|
||||||
// Radios
|
|
||||||
case IDC_buttonRadio: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_RADIO));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_RADIO
|
|
||||||
};
|
|
||||||
// Watches
|
|
||||||
case IDC_buttonWatch: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_WATCH));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_WATCH
|
|
||||||
};
|
|
||||||
// GPS and UAV Terminals
|
|
||||||
case IDC_buttonGPS: {
|
|
||||||
{
|
|
||||||
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
|
|
||||||
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_COMMS));
|
|
||||||
|
|
||||||
GVAR(currentItems) select IDX_CURR_COMMS
|
|
||||||
};
|
|
||||||
// Faces
|
|
||||||
case IDC_buttonFace: {
|
|
||||||
private _lbAdd = -1;
|
|
||||||
|
|
||||||
{
|
|
||||||
_y params ["_displayName", "_modPicture"];
|
|
||||||
|
|
||||||
_lbAdd = _ctrlPanel lbAdd _displayName;
|
|
||||||
_ctrlPanel lbSetData [_lbAdd, _x];
|
|
||||||
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _x]];
|
|
||||||
_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
|
|
||||||
} forEach (uiNamespace getVariable QGVAR(faceCache));
|
|
||||||
|
|
||||||
GVAR(currentFace)
|
|
||||||
};
|
|
||||||
// Voices
|
|
||||||
case IDC_buttonVoice: {
|
|
||||||
{
|
|
||||||
["CfgVoice", _x, _ctrlPanel, "icon"] call FUNC(addListBoxItem);
|
|
||||||
} forEach (uiNamespace getVariable QGVAR(voiceCache));
|
|
||||||
|
|
||||||
GVAR(currentVoice)
|
|
||||||
};
|
|
||||||
// Insignia
|
|
||||||
case IDC_buttonInsignia: {
|
|
||||||
// Insignia from config
|
|
||||||
{
|
|
||||||
["CfgUnitInsignia", _x, _ctrlPanel, "texture"] call FUNC(addListBoxItem);
|
|
||||||
} forEach (uiNamespace getVariable QGVAR(insigniaCache));
|
|
||||||
|
|
||||||
private _displayName = "";
|
|
||||||
private _className = "";
|
|
||||||
private _lbAdd = -1;
|
|
||||||
|
|
||||||
// Insignia from mission file
|
|
||||||
{
|
|
||||||
_className = configName _x;
|
|
||||||
_displayName = getText (_x >> "displayName");
|
|
||||||
_lbAdd = _ctrlPanel lbAdd _displayName;
|
|
||||||
|
|
||||||
_ctrlPanel lbSetData [_lbAdd, _className];
|
|
||||||
_ctrlPanel lbSetPicture [_lbAdd, getText (_x >> "texture")];
|
|
||||||
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]];
|
|
||||||
} forEach ("(if (isNumber (_x >> 'scope')) then {getNumber (_x >> 'scope')} else {2}) == 2" configClasses (missionConfigFile >> "CfgUnitInsignia"));
|
|
||||||
|
|
||||||
GVAR(currentInsignia)
|
|
||||||
};
|
|
||||||
// Unknown
|
|
||||||
default {""};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// When switching tabs, clear searchbox
|
// Don't reset the current right panel for weapons, binos and containers
|
||||||
if (GVAR(currentLeftPanel) != _ctrlIDC) then {
|
if !(_idxVirt in [IDX_VIRT_PRIMARY_WEAPONS, IDX_VIRT_SECONDARY_WEAPONS, IDX_VIRT_HANDGUN_WEAPONS, IDX_VIRT_BINO, IDX_VIRT_UNIFORM, IDX_VIRT_VEST, IDX_VIRT_BACKPACK]) then {
|
||||||
(_display displayCtrl IDC_leftSearchbar) ctrlSetText "";
|
GVAR(currentRightPanel) = nil;
|
||||||
(_display displayCtrl IDC_rightSearchbar) ctrlSetText "";
|
};
|
||||||
|
GVAR(currentLeftPanel) = _ctrlIDC;
|
||||||
|
|
||||||
|
// Add items to the listbox
|
||||||
|
private _selectedItem = if (_idxVirt != -1) then { // Items
|
||||||
|
private _configParent = switch (_idxVirt) do {
|
||||||
|
case IDX_VIRT_GOGGLES: {"CfgGlasses"};
|
||||||
|
case IDX_VIRT_BACKPACK: {"CfgVehicles"};
|
||||||
|
default {"CfgWeapons"};
|
||||||
|
};
|
||||||
|
|
||||||
|
private _items = if (_idxVirt < IDX_VIRT_HEADGEAR) then {
|
||||||
|
keys ((GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _idxVirt)
|
||||||
|
} else {
|
||||||
|
keys (GVAR(virtualItems) get _idxVirt)
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
[_configParent, _x, _ctrlPanel] call FUNC(addListBoxItem);
|
||||||
|
} forEach _items;
|
||||||
|
|
||||||
|
GVAR(currentItems) select _idxVirt
|
||||||
|
} else { // Special cases
|
||||||
|
switch (_ctrlIDC) do {
|
||||||
|
// Faces
|
||||||
|
case IDC_buttonFace: {
|
||||||
|
private _lbAdd = -1; // micro-optimization
|
||||||
|
// Faces need to be added like this because their config path is
|
||||||
|
// configFile >> "CfgFaces" >> face category >> className
|
||||||
|
{
|
||||||
|
_y params ["_displayName", "_modPicture"];
|
||||||
|
_lbAdd = _ctrlPanel lbAdd _displayName;
|
||||||
|
_ctrlPanel lbSetData [_lbAdd, _x];
|
||||||
|
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _x]];
|
||||||
|
_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
|
||||||
|
} forEach GVAR(faceCache); // HashMap, not array
|
||||||
|
|
||||||
|
GVAR(currentFace)
|
||||||
|
};
|
||||||
|
// Voices
|
||||||
|
case IDC_buttonVoice: {
|
||||||
|
{
|
||||||
|
["CfgVoice", _x, _ctrlPanel, "icon"] call FUNC(addListBoxItem);
|
||||||
|
} forEach (keys GVAR(voiceCache));
|
||||||
|
|
||||||
|
GVAR(currentVoice)
|
||||||
|
};
|
||||||
|
// Insignia
|
||||||
|
case IDC_buttonInsignia: {
|
||||||
|
{
|
||||||
|
["CfgUnitInsignia", _x, _ctrlPanel, "texture", _y] call FUNC(addListBoxItem);
|
||||||
|
} forEach GVAR(insigniaCache);
|
||||||
|
|
||||||
|
GVAR(currentInsignia)
|
||||||
|
};
|
||||||
|
// Unknown
|
||||||
|
default {
|
||||||
|
WARNING_1("Unknown arsenal left panel with IDC %1, update ace_arsenal_idxMap and relevant macros if adding a new tab",_ctrlIDC);
|
||||||
|
""
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Trigger event
|
// Trigger event
|
||||||
GVAR(currentLeftPanel) = _ctrlIDC;
|
|
||||||
[QGVAR(leftPanelFilled), [_display, _ctrlIDC, GVAR(currentRightPanel)]] call CBA_fnc_localEvent;
|
[QGVAR(leftPanelFilled), [_display, _ctrlIDC, GVAR(currentRightPanel)]] call CBA_fnc_localEvent;
|
||||||
|
|
||||||
// Sort
|
// Sort
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
#include "..\defines.hpp"
|
#include "..\defines.hpp"
|
||||||
/*
|
/*
|
||||||
* Author: Alganthe, johnb43
|
* Author: Alganthe, johnb43, LinkIsGrim
|
||||||
* Fill loadouts list.
|
* Fill loadouts list over multiple frames. LOADOUTS_PER_FRAME macro does what it says on the tin.
|
||||||
|
* Should only ever be called by display load (with optional params as default) and by itself.
|
||||||
|
* Listen to ace_arsenal_loadoutsListFilled event if you need to iterate over the loadouts list.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: Loadouts display <DISPLAY>
|
* 0: Loadouts display <DISPLAY>
|
||||||
* 1: Tab control <CONTROL>
|
* 1: Tab control <CONTROL>
|
||||||
|
* 2: Current frame filling loadouts list <NUMBER> (default: 0)
|
||||||
|
* 3: Frames necessary to fill loadouts list <NUMBER> (default: -1)
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* None
|
* None
|
||||||
@ -14,29 +18,46 @@
|
|||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
|
||||||
params ["_display", "_control"];
|
// Can just be modified directly, no further setup needed
|
||||||
|
#define LOADOUTS_PER_FRAME 10
|
||||||
|
|
||||||
(_display displayCtrl IDC_textEditBox) ctrlSetText "";
|
params ["_display", "_control", ["_currentFrame", 0], ["_framesToFill", -1]];
|
||||||
|
|
||||||
|
if (isNull _display) exitWith {
|
||||||
|
TRACE_2("display closed, aborting",_currentFrame,_framesToFill);
|
||||||
|
};
|
||||||
|
|
||||||
private _contentPanelCtrl = _display displayCtrl IDC_contentPanel;
|
private _contentPanelCtrl = _display displayCtrl IDC_contentPanel;
|
||||||
|
if (_currentFrame == 0) then {
|
||||||
|
(_display displayCtrl IDC_textEditBox) ctrlSetText "";
|
||||||
|
|
||||||
// Force a "refresh" animation of the panel
|
// Force a "refresh" animation of the panel
|
||||||
_contentPanelCtrl ctrlSetFade 1;
|
_contentPanelCtrl ctrlSetFade 1;
|
||||||
_contentPanelCtrl ctrlCommit 0;
|
_contentPanelCtrl ctrlCommit 0;
|
||||||
_contentPanelCtrl ctrlSetFade 0;
|
_contentPanelCtrl ctrlSetFade 0;
|
||||||
_contentPanelCtrl ctrlCommit FADE_DELAY;
|
_contentPanelCtrl ctrlCommit FADE_DELAY;
|
||||||
|
|
||||||
_contentPanelCtrl lnbSetCurSelRow -1;
|
_contentPanelCtrl lnbSetCurSelRow -1;
|
||||||
lnbClear _contentPanelCtrl;
|
lnbClear _contentPanelCtrl;
|
||||||
|
};
|
||||||
|
|
||||||
private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars);
|
private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars);
|
||||||
private _cfgWeapons = configFile >> "CfgWeapons";
|
private _cfgWeapons = configFile >> "CfgWeapons"; // Used by ADD_LOADOUTS_LIST_PICTURES macro, do not remove
|
||||||
private _newRow = -1;
|
private _newRow = -1;
|
||||||
|
|
||||||
if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
|
if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
|
||||||
private _loadoutNameAndTab = "";
|
private _loadoutNameAndTab = "";
|
||||||
private _loadoutCachedInfo = "";
|
private _loadoutCachedInfo = "";
|
||||||
private _sharingEnabled = GVAR(allowSharedLoadouts) && {isMultiplayer};
|
private _sharingEnabled = GVAR(allowSharedLoadouts) && {isMultiplayer};
|
||||||
|
private _loadouts = [
|
||||||
|
profileNamespace getVariable [QGVAR(saved_loadouts), []],
|
||||||
|
GVAR(defaultLoadoutsList)
|
||||||
|
] select (ctrlIDC _control == IDC_buttonDefaultLoadouts);
|
||||||
|
if (_currentFrame == 0) then {
|
||||||
|
_framesToFill = floor ((count _loadouts) / LOADOUTS_PER_FRAME);
|
||||||
|
TRACE_2("filling loadouts list",_currentFrame,_framesToFill);
|
||||||
|
_this set [3, _framesToFill];
|
||||||
|
};
|
||||||
|
|
||||||
// Add all loadouts to loadout list
|
// Add all loadouts to loadout list
|
||||||
{
|
{
|
||||||
@ -50,15 +71,16 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
|
|||||||
_loadoutCachedInfo = [_loadoutData] call FUNC(verifyLoadout);
|
_loadoutCachedInfo = [_loadoutData] call FUNC(verifyLoadout);
|
||||||
_contentPanelCtrl setVariable [_loadoutNameAndTab, _loadoutCachedInfo];
|
_contentPanelCtrl setVariable [_loadoutNameAndTab, _loadoutCachedInfo];
|
||||||
|
|
||||||
_loadoutCachedInfo params ["", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"];
|
_loadoutCachedInfo params ["", "_nullItemsList", "_unavailableItemsList", "_missingExtendedInfo"];
|
||||||
|
|
||||||
// Log missing / nil items to RPT (only once per arsenal session)
|
// Log missing / nil items to RPT (only once per arsenal session)
|
||||||
if (GVAR(EnableRPTLog) && {(_nullItemsAmount > 0) || {_unavailableItemsAmount > 0}}) then {
|
if (GVAR(EnableRPTLog) && {(_nullItemsList isNotEqualTo []) || {_unavailableItemsList isNotEqualTo [] || {_missingExtendedInfo isNotEqualTo []}}}) then {
|
||||||
private _printComponent = "ACE_Arsenal - Loadout:";
|
private _printComponent = "ACE_Arsenal - Loadout:";
|
||||||
private _printNullItemsList = ["Missing items:", str _nullItemsList] joinString " ";
|
private _printNullItemsList = ["Missing items:", str _nullItemsList] joinString " ";
|
||||||
private _printUnavailableItemsList = ["Unavailable items:", str _unavailableItemsList] joinString " ";
|
private _printUnavailableItemsList = ["Unavailable items:", str _unavailableItemsList] joinString " ";
|
||||||
|
private _printMissingExtendedInfo = ["Missing extended loadout:", str _missingExtendedInfo] joinString " ";
|
||||||
|
|
||||||
diag_log text (format ["%1%5 %2%5 %3%5 %4", _printComponent, "Name: " + _loadoutName, _printNullItemsList, _printUnavailableItemsList, endl]);
|
diag_log text (format ["%1%6 %2%6 %3%6 %4%6 %5", _printComponent, "Name: " + _loadoutName, _printNullItemsList, _printUnavailableItemsList, _printMissingExtendedInfo, endl]);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -69,18 +91,18 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
|
|||||||
_contentPanelCtrl lnbSetColumnsPos [0, 0.05, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90];
|
_contentPanelCtrl lnbSetColumnsPos [0, 0.05, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90];
|
||||||
};
|
};
|
||||||
|
|
||||||
_loadoutCachedInfo params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"];
|
_loadoutCachedInfo params ["_extendedLoadout", "_nullItemsList", "_unavailableItemsList"];
|
||||||
_extendedLoadout params ["_loadout"];
|
_extendedLoadout params ["_loadout"]; // Used by ADD_LOADOUTS_LIST_PICTURES macro, do not remove
|
||||||
|
|
||||||
_newRow = _contentPanelCtrl lnbAddRow ["", _loadoutName];
|
_newRow = _contentPanelCtrl lnbAddRow ["", _loadoutName];
|
||||||
|
|
||||||
ADD_LOADOUTS_LIST_PICTURES
|
ADD_LOADOUTS_LIST_PICTURES
|
||||||
|
|
||||||
// Change color on loadout lines that have items that aren't available or don't exist
|
// Change color on loadout lines that have items that aren't available or don't exist
|
||||||
if (_nullItemsAmount > 0) then {
|
if (_nullItemsList isNotEqualTo []) then {
|
||||||
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
|
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
|
||||||
} else {
|
} else {
|
||||||
if (_unavailableItemsAmount > 0) then {
|
if (_unavailableItemsList isNotEqualTo []) then {
|
||||||
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
|
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -90,10 +112,16 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
|
|||||||
_contentPanelCtrl lnbSetPicture [[_newRow, 0], QPATHTOF(data\iconPublic.paa)];
|
_contentPanelCtrl lnbSetPicture [[_newRow, 0], QPATHTOF(data\iconPublic.paa)];
|
||||||
_contentPanelCtrl lnbSetValue [[_newRow, 0], 1];
|
_contentPanelCtrl lnbSetValue [[_newRow, 0], 1];
|
||||||
};
|
};
|
||||||
} forEach ([profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (ctrlIDC _control == IDC_buttonDefaultLoadouts));
|
} forEach (_loadouts select [_currentFrame * LOADOUTS_PER_FRAME, [LOADOUTS_PER_FRAME, count _loadouts] select is3DEN]);
|
||||||
} else {
|
} else {
|
||||||
private _allPlayerNames = allPlayers apply {name _x};
|
private _allPlayerNames = allPlayers apply {name _x};
|
||||||
|
private _loadouts = _sharedLoadoutsVars apply {GVAR(sharedLoadoutsNamespace) getVariable _x};
|
||||||
private _loadoutVar = "";
|
private _loadoutVar = "";
|
||||||
|
if (_currentFrame == 0) then {
|
||||||
|
_framesToFill = floor ((count _loadouts) / LOADOUTS_PER_FRAME);
|
||||||
|
TRACE_2("filling loadouts list",_currentFrame,_framesToFill);
|
||||||
|
_this set [3, _framesToFill];
|
||||||
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
_x params ["_playerName", "_loadoutName", "_loadoutData"];
|
_x params ["_playerName", "_loadoutName", "_loadoutData"];
|
||||||
@ -107,8 +135,8 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
|
|||||||
|
|
||||||
[QGVAR(loadoutUnshared), [_contentPanelCtrl, profileName, _loadoutName]] call CBA_fnc_remoteEvent;
|
[QGVAR(loadoutUnshared), [_contentPanelCtrl, profileName, _loadoutName]] call CBA_fnc_remoteEvent;
|
||||||
} else {
|
} else {
|
||||||
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"];
|
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsList", "_unavailableItemsList"];
|
||||||
_extendedLoadout params ["_loadout"];
|
_extendedLoadout params ["_loadout"]; // Used by ADD_LOADOUTS_LIST_PICTURES macro, do not remove
|
||||||
|
|
||||||
_contentPanelCtrl lnbSetColumnsPos [0, 0.15, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90];
|
_contentPanelCtrl lnbSetColumnsPos [0, 0.15, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90];
|
||||||
_newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName];
|
_newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName];
|
||||||
@ -118,17 +146,23 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
|
|||||||
_contentPanelCtrl lnbSetData [[_newRow, 1], _loadoutVar];
|
_contentPanelCtrl lnbSetData [[_newRow, 1], _loadoutVar];
|
||||||
|
|
||||||
// Change color on loadout lines that have items that aren't available or don't exist
|
// Change color on loadout lines that have items that aren't available or don't exist
|
||||||
if (_nullItemsAmount > 0) then {
|
if (_nullItemsList isNotEqualTo []) then {
|
||||||
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
|
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
|
||||||
} else {
|
} else {
|
||||||
if (_unavailableItemsAmount > 0) then {
|
if (_unavailableItemsList isNotEqualTo []) then {
|
||||||
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
|
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} forEach (_sharedLoadoutsVars apply {GVAR(sharedLoadoutsNamespace) getVariable _x});
|
} forEach (_loadouts select [_currentFrame * LOADOUTS_PER_FRAME, [LOADOUTS_PER_FRAME, count _loadouts] select is3DEN]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!is3DEN && _currentFrame != _framesToFill) exitWith {
|
||||||
|
_this set [2, _currentFrame + 1];
|
||||||
|
[FUNC(fillLoadoutsList), _this] call CBA_fnc_execNextFrame;
|
||||||
|
};
|
||||||
|
TRACE_3("finished",_currentFrame,_framesToFill,lnbSize _contentPanelCtrl);
|
||||||
|
|
||||||
[QGVAR(loadoutsListFilled), [_display, _control]] call CBA_fnc_localEvent;
|
[QGVAR(loadoutsListFilled), [_display, _control]] call CBA_fnc_localEvent;
|
||||||
|
|
||||||
// Sort loadouts alphabetically
|
// Sort loadouts alphabetically
|
||||||
|
@ -53,7 +53,7 @@ if (GVAR(favoritesOnly)) then {
|
|||||||
private _fnc_fillRightContainer = {
|
private _fnc_fillRightContainer = {
|
||||||
params ["_configCategory", "_className", ["_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 {};
|
if (GVAR(favoritesOnly) && {!(_className in _currentCargo)} && {!((toLowerANSI _className) in GVAR(favorites))}) exitWith {};
|
||||||
|
|
||||||
// If item is not in the arsenal, it must be unique
|
// If item is not in the arsenal, it must be unique
|
||||||
if (!_isUnique && {!(_className in GVAR(virtualItemsFlat))}) then {
|
if (!_isUnique && {!(_className in GVAR(virtualItemsFlat))}) then {
|
||||||
@ -89,7 +89,7 @@ private _fnc_fillRightContainer = {
|
|||||||
_ctrlPanel lnbSetPicture [[_lbAdd, 0], _picture];
|
_ctrlPanel lnbSetPicture [[_lbAdd, 0], _picture];
|
||||||
_ctrlPanel lnbSetValue [[_lbAdd, 2], parseNumber _isUnique];
|
_ctrlPanel lnbSetValue [[_lbAdd, 2], parseNumber _isUnique];
|
||||||
_ctrlPanel lnbSetTooltip [[_lbAdd, 0], format ["%1\n%2", _displayName, _className]];
|
_ctrlPanel lnbSetTooltip [[_lbAdd, 0], format ["%1\n%2", _displayName, _className]];
|
||||||
if ((toLower _className) in GVAR(favorites)) then {
|
if ((toLowerANSI _className) in GVAR(favorites)) then {
|
||||||
_ctrlPanel lnbSetColor [[_lbAdd, 1], FAVORITES_COLOR];
|
_ctrlPanel lnbSetColor [[_lbAdd, 1], FAVORITES_COLOR];
|
||||||
_ctrlPanel lnbSetColorRight [[_lbAdd, 1], FAVORITES_COLOR];
|
_ctrlPanel lnbSetColorRight [[_lbAdd, 1], FAVORITES_COLOR];
|
||||||
};
|
};
|
||||||
|
@ -47,7 +47,7 @@ private _groups = (GVAR(actionList) select _panel) select {
|
|||||||
private _show = _groups isNotEqualTo [];
|
private _show = _groups isNotEqualTo [];
|
||||||
private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox;
|
private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox;
|
||||||
_actionsBoxCtrl ctrlShow _show;
|
_actionsBoxCtrl ctrlShow _show;
|
||||||
_actionsBoxCtrl ctrlCommit 0.15;
|
_actionsBoxCtrl ctrlCommit FADE_DELAY;
|
||||||
|
|
||||||
if (!_show) exitWith {};
|
if (!_show) exitWith {};
|
||||||
|
|
||||||
@ -77,7 +77,6 @@ private _items = _group select 3 select {
|
|||||||
};
|
};
|
||||||
|
|
||||||
_actionsCurrentPageCtrl ctrlSetText (_group select 1);
|
_actionsCurrentPageCtrl ctrlSetText (_group select 1);
|
||||||
_actionsCurrentPageCtrl ctrlSetFade 0;
|
|
||||||
_actionsCurrentPageCtrl ctrlShow true;
|
_actionsCurrentPageCtrl ctrlShow true;
|
||||||
_actionsCurrentPageCtrl ctrlCommit 0;
|
_actionsCurrentPageCtrl ctrlCommit 0;
|
||||||
|
|
||||||
@ -85,36 +84,22 @@ private _activeCtrls = [];
|
|||||||
{
|
{
|
||||||
_x params ["", "_type", "_label", "_statement"];
|
_x params ["", "_type", "_label", "_statement"];
|
||||||
|
|
||||||
private _idc = IDC_actionsText1 + _forEachIndex * 2;
|
private _idc = IDC_actionsText1 + _type + _forEachIndex * 2;
|
||||||
private _actionTextCtrl = _display displayCtrl _idc;
|
private _actionCtrl = _display displayCtrl _idc;
|
||||||
private _actionButtonCtrl = _display displayCtrl (_idc + 1);
|
|
||||||
|
|
||||||
switch (_type) do {
|
switch (_type) do {
|
||||||
case ACTION_TYPE_BUTTON: {
|
case ACTION_TYPE_BUTTON: {
|
||||||
_actionButtonCtrl ctrlRemoveAllEventHandlers "ButtonClick";
|
_actionCtrl ctrlRemoveAllEventHandlers "ButtonClick";
|
||||||
_actionButtonCtrl ctrlAddEventHandler ["ButtonClick", {
|
_actionCtrl ctrlAddEventHandler ["ButtonClick", {
|
||||||
if (is3DEN) exitWith {[true] call FUNC(refresh)};
|
if (is3DEN) exitWith {[true] call FUNC(refresh)};
|
||||||
[{
|
[{
|
||||||
[true] call FUNC(refresh);
|
[true] call FUNC(refresh);
|
||||||
}] call CBA_fnc_execNextFrame;
|
}] call CBA_fnc_execNextFrame;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
if (_activeCtrls isNotEqualTo []) then {
|
_actionCtrl ctrlAddEventHandler ["ButtonClick", _statement];
|
||||||
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
|
_actionCtrl ctrlSetText _label;
|
||||||
_actionButtonCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
|
_actionCtrl ctrlEnable true;
|
||||||
} else {
|
|
||||||
_actionButtonCtrl ctrlSetPositionY (6 * GRID_H);
|
|
||||||
};
|
|
||||||
|
|
||||||
_actionButtonCtrl ctrlAddEventHandler ["ButtonClick", _statement];
|
|
||||||
_actionButtonCtrl ctrlSetText _label;
|
|
||||||
_actionButtonCtrl ctrlSetFade 0;
|
|
||||||
_actionButtonCtrl ctrlEnable true;
|
|
||||||
_actionButtonCtrl ctrlCommit 0;
|
|
||||||
_actionTextCtrl ctrlSetFade 1;
|
|
||||||
_actionTextCtrl ctrlEnable false;
|
|
||||||
_actionTextCtrl ctrlCommit 0;
|
|
||||||
_activeCtrls pushBack _actionButtonCtrl;
|
|
||||||
};
|
};
|
||||||
case ACTION_TYPE_TEXT: {
|
case ACTION_TYPE_TEXT: {
|
||||||
private _text = call _statement;
|
private _text = call _statement;
|
||||||
@ -125,47 +110,35 @@ private _activeCtrls = [];
|
|||||||
if (_text isEqualType []) then {
|
if (_text isEqualType []) then {
|
||||||
_text = _text joinString endl;
|
_text = _text joinString endl;
|
||||||
};
|
};
|
||||||
if (_activeCtrls isNotEqualTo []) then {
|
|
||||||
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
|
|
||||||
_actionTextCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
|
|
||||||
} else {
|
|
||||||
_actionTextCtrl ctrlSetPositionY (5 * GRID_H);
|
|
||||||
};
|
|
||||||
|
|
||||||
_actionTextCtrl ctrlSetText _text;
|
_actionCtrl ctrlSetText _text;
|
||||||
_actionTextCtrl ctrlSetPositionH (ctrlTextHeight _actionTextCtrl);
|
_actionCtrl ctrlSetPositionH (ctrlTextHeight _actionCtrl);
|
||||||
_actionTextCtrl ctrlSetFade 0;
|
_actionCtrl ctrlEnable false;
|
||||||
_actionTextCtrl ctrlEnable false;
|
|
||||||
_actionTextCtrl ctrlCommit 0;
|
|
||||||
_actionButtonCtrl ctrlSetFade 1;
|
|
||||||
_actionButtonCtrl ctrlEnable false;
|
|
||||||
_actionButtonCtrl ctrlCommit 0;
|
|
||||||
_activeCtrls pushBack _actionTextCtrl;
|
|
||||||
};
|
|
||||||
default {
|
|
||||||
_actionTextCtrl ctrlSetFade 1;
|
|
||||||
_actionTextCtrl ctrlCommit 0;
|
|
||||||
_actionButtonCtrl ctrlSetFade 1;
|
|
||||||
_actionButtonCtrl ctrlEnable false;
|
|
||||||
_actionButtonCtrl ctrlCommit 0;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (_activeCtrls isNotEqualTo []) then {
|
||||||
|
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
|
||||||
|
_actionCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
|
||||||
|
} else {
|
||||||
|
_actionCtrl ctrlSetPositionY ((5 + _type) * GRID_H);
|
||||||
|
};
|
||||||
|
|
||||||
|
_actionCtrl ctrlShow true;
|
||||||
|
_actionCtrl ctrlCommit 0;
|
||||||
|
_activeCtrls pushBack _actionCtrl;
|
||||||
} forEach _items;
|
} forEach _items;
|
||||||
|
|
||||||
private _actionCount = count _items;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
private _idc = IDC_actionsText1 + _x * 2;
|
private _idc = ctrlIDC _x;
|
||||||
private _actionTextCtrl = _display displayCtrl _idc;
|
if (_idc < IDC_actionsText1 || _idc > IDC_actionsButton5) then {continue};
|
||||||
private _actionButtonCtrl = _display displayCtrl (_idc + 1);
|
|
||||||
|
|
||||||
_actionTextCtrl ctrlSetFade 1;
|
_x ctrlShow false;
|
||||||
_actionTextCtrl ctrlCommit 0;
|
_x ctrlEnable false;
|
||||||
_actionButtonCtrl ctrlSetFade 1;
|
_x ctrlSetPositionY 0;
|
||||||
_actionButtonCtrl ctrlCommit 0;
|
_x ctrlCommit 0;
|
||||||
} forEach ([0, 1, 2, 3, 4] select [_actionCount, 5]);
|
} forEach ((allControls _actionsBoxCtrl) select {!(_x in _activeCtrls)});
|
||||||
|
|
||||||
private _pos = ctrlPosition _actionsBoxCtrl;
|
|
||||||
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
|
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
|
||||||
private _actionsBoxHeight = _lastPosY + _lastPosH + GRID_H;
|
private _actionsBoxHeight = _lastPosY + _lastPosH + GRID_H;
|
||||||
_actionsBoxCtrl ctrlSetPositionH _actionsBoxHeight;
|
_actionsBoxCtrl ctrlSetPositionH _actionsBoxHeight;
|
||||||
|
@ -78,10 +78,10 @@ if (!isNull curatorCamera) then {
|
|||||||
|
|
||||||
// Make face and voice selection JIP compatible; 3DEN doesn't need this though
|
// Make face and voice selection JIP compatible; 3DEN doesn't need this though
|
||||||
if (isMultiplayer && {!is3DEN}) then {
|
if (isMultiplayer && {!is3DEN}) then {
|
||||||
private _id = [QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(centerFace_) + netId GVAR(center)] call CBA_fnc_globalEventJIP;
|
private _id = [QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(centerFace_) + hashValue GVAR(center)] call CBA_fnc_globalEventJIP;
|
||||||
[_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP;
|
[_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP;
|
||||||
|
|
||||||
_id = [QGVAR(broadcastVoice), [GVAR(center), GVAR(currentVoice)], QGVAR(centerVoice_) + netId GVAR(center)] call CBA_fnc_globalEventJIP;
|
_id = [QGVAR(broadcastVoice), [GVAR(center), GVAR(currentVoice)], QGVAR(centerVoice_) + hashValue GVAR(center)] call CBA_fnc_globalEventJIP;
|
||||||
[_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP;
|
[_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ if (isNil QGVAR(virtualItems)) then {
|
|||||||
GVAR(virtualItemsFlatAll) = +GVAR(virtualItemsFlat);
|
GVAR(virtualItemsFlatAll) = +GVAR(virtualItemsFlat);
|
||||||
|
|
||||||
GVAR(currentFace) = face GVAR(center);
|
GVAR(currentFace) = face GVAR(center);
|
||||||
GVAR(currentVoice) = speaker GVAR(center);
|
GVAR(currentVoice) = (speaker GVAR(center)) call EFUNC(common,getConfigName);
|
||||||
GVAR(currentInsignia) = GVAR(center) call BIS_fnc_getUnitInsignia;
|
GVAR(currentInsignia) = GVAR(center) call BIS_fnc_getUnitInsignia;
|
||||||
|
|
||||||
GVAR(currentAction) = "Stand";
|
GVAR(currentAction) = "Stand";
|
||||||
|
@ -27,9 +27,9 @@ private _favorited = false;
|
|||||||
// Favorites/blacklist will always be lowercase to handle configCase changes
|
// Favorites/blacklist will always be lowercase to handle configCase changes
|
||||||
private _item = "";
|
private _item = "";
|
||||||
if (_isLnB) then {
|
if (_isLnB) then {
|
||||||
_item = toLower (_control lnbData [_curSel, 0]);
|
_item = toLowerANSI (_control lnbData [_curSel, 0]);
|
||||||
} else {
|
} else {
|
||||||
_item = toLower (_control lbData _curSel);
|
_item = toLowerANSI (_control lbData _curSel);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (_item in GVAR(favorites)) then {
|
if (_item in GVAR(favorites)) then {
|
||||||
|
@ -683,14 +683,19 @@ switch (GVAR(currentLeftPanel)) do {
|
|||||||
|
|
||||||
TOGGLE_RIGHT_PANEL_HIDE
|
TOGGLE_RIGHT_PANEL_HIDE
|
||||||
|
|
||||||
private _unitInsigniaConfig = configFile >> "CfgUnitInsignia" >> _item;
|
// Check for correct config: First mission, then campaign and finally regular config
|
||||||
|
private _itemCfg = missionConfigFile >> "CfgUnitInsignia" >> _item;
|
||||||
|
|
||||||
|
if (isNull _itemCfg) then {
|
||||||
|
_itemCfg = campaignConfigFile >> "CfgUnitInsignia" >> _item;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isNull _itemCfg) then {
|
||||||
|
_itemCfg = configFile >> "CfgUnitInsignia" >> _item;
|
||||||
|
};
|
||||||
|
|
||||||
// Display new items's info on the bottom right
|
// Display new items's info on the bottom right
|
||||||
if (isNull _unitInsigniaConfig) then {
|
[_display, _control, _curSel, _itemCfg] call FUNC(itemInfo);
|
||||||
[_display, _control, _curSel, missionConfigFile >> "CfgUnitInsignia" >> _item] call FUNC(itemInfo);
|
|
||||||
} else {
|
|
||||||
[_display, _control, _curSel, _unitInsigniaConfig] call FUNC(itemInfo);
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ private _tabToChange = [];
|
|||||||
_stringCount = count _currentID;
|
_stringCount = count _currentID;
|
||||||
|
|
||||||
// Make sure to keep at least 1 sort per category, so make default sort not deletable
|
// Make sure to keep at least 1 sort per category, so make default sort not deletable
|
||||||
if ("ace_alphabetically" in toLower (_currentID select [0, _stringCount - 3])) then {
|
if ("ace_alphabetically" in toLowerANSI (_currentID select [0, _stringCount - 3])) then {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -25,7 +25,6 @@ if (count _loadout == 2) then {
|
|||||||
|
|
||||||
if (count _loadout != 10) exitWith {[]};
|
if (count _loadout != 10) exitWith {[]};
|
||||||
|
|
||||||
private _weapon = "";
|
|
||||||
private _weaponsInfo = [];
|
private _weaponsInfo = [];
|
||||||
private _uniqueBaseCfgText = "";
|
private _uniqueBaseCfgText = "";
|
||||||
private _cfgWeapons = configFile >> "CfgWeapons";
|
private _cfgWeapons = configFile >> "CfgWeapons";
|
||||||
@ -43,7 +42,7 @@ private _cfgVehicles = configFile >> "CfgVehicles";
|
|||||||
|
|
||||||
// Check weapon & weapon attachments
|
// Check weapon & weapon attachments
|
||||||
{
|
{
|
||||||
// Magazines
|
// Magazines in weapons have 2 entries: Name and ammo count
|
||||||
if (_forEachIndex in [4, 5]) then {
|
if (_forEachIndex in [4, 5]) then {
|
||||||
_x params [["_magazine", ""], "_count"];
|
_x params [["_magazine", ""], "_count"];
|
||||||
|
|
||||||
@ -69,23 +68,69 @@ private _cfgVehicles = configFile >> "CfgVehicles";
|
|||||||
_x params [["_containerClass", ""], ["_items", []]];
|
_x params [["_containerClass", ""], ["_items", []]];
|
||||||
|
|
||||||
if (_containerClass != "") then {
|
if (_containerClass != "") then {
|
||||||
_uniqueBaseCfgText = (getText ([_cfgWeapons, _cfgVehicles] select (_forEachIndex == IDX_LOADOUT_BACKPACK) >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
|
if (_forEachIndex == IDX_LOADOUT_BACKPACK) then {
|
||||||
|
// Check for non-preset first
|
||||||
|
_uniqueBaseCfgText = [_containerClass, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
|
||||||
|
|
||||||
if (_uniqueBaseCfgText != "") then {
|
if (_uniqueBaseCfgText != "") then {
|
||||||
(_x select 0) set [0, _uniqueBaseCfgText];
|
_containerClass = _uniqueBaseCfgText;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check if non-preset backpack has a unique base
|
||||||
|
_uniqueBaseCfgText = (getText (_cfgVehicles >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
|
||||||
|
|
||||||
|
if (_uniqueBaseCfgText != "") then {
|
||||||
|
_containerClass = _uniqueBaseCfgText;
|
||||||
|
};
|
||||||
|
|
||||||
|
_x set [0, _containerClass];
|
||||||
|
} else {
|
||||||
|
_uniqueBaseCfgText = (getText (_cfgWeapons >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
|
||||||
|
|
||||||
|
if (_uniqueBaseCfgText != "") then {
|
||||||
|
_x set [0, _uniqueBaseCfgText];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check if container has items that need replacing with a defined base
|
// Check if container has items that need replacing with a defined base
|
||||||
{
|
{
|
||||||
switch (true) do {
|
switch (true) do {
|
||||||
// Containers have 2 entries: Name and isBackpack
|
// Containers have 2 entries: Name and isBackpack
|
||||||
case (_x isEqualTypeArray ["", false]);
|
case (_x isEqualTypeArray ["", false]): {
|
||||||
|
_x params ["_containerClass", "_isBackpack"];
|
||||||
|
|
||||||
|
if (_containerClass != "") then {
|
||||||
|
if (_isBackpack) then {
|
||||||
|
// Check for non-preset first
|
||||||
|
_uniqueBaseCfgText = [_containerClass, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
|
||||||
|
|
||||||
|
if (_uniqueBaseCfgText != "") then {
|
||||||
|
_containerClass = _uniqueBaseCfgText;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check if non-preset backpack has a unique base
|
||||||
|
_uniqueBaseCfgText = (getText (_cfgVehicles >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
|
||||||
|
|
||||||
|
if (_uniqueBaseCfgText != "") then {
|
||||||
|
_containerClass = _uniqueBaseCfgText;
|
||||||
|
};
|
||||||
|
|
||||||
|
_x set [0, _containerClass];
|
||||||
|
} else {
|
||||||
|
_uniqueBaseCfgText = (getText (_cfgWeapons >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
|
||||||
|
|
||||||
|
if (_uniqueBaseCfgText != "") then {
|
||||||
|
_x set [0, _uniqueBaseCfgText];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
// Misc. items have 2 entries: Name and amount
|
// Misc. items have 2 entries: Name and amount
|
||||||
case (_x isEqualTypeArray ["", 0]): {
|
case (_x isEqualTypeArray ["", 0]): {
|
||||||
_x params ["_item", "_arg"];
|
_x params ["_item"];
|
||||||
|
|
||||||
if (_item != "") then {
|
if (_item != "") then {
|
||||||
_uniqueBaseCfgText = (getText ([_cfgWeapons, _cfgVehicles] select ((_arg isEqualType false) && {_arg}) >> _item >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
|
_uniqueBaseCfgText = (getText (_cfgWeapons >> _item >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
|
||||||
|
|
||||||
if (_uniqueBaseCfgText != "") then {
|
if (_uniqueBaseCfgText != "") then {
|
||||||
_x set [0, _uniqueBaseCfgText];
|
_x set [0, _uniqueBaseCfgText];
|
||||||
@ -94,7 +139,7 @@ private _cfgVehicles = configFile >> "CfgVehicles";
|
|||||||
};
|
};
|
||||||
// Weapons have 2 entries: Weapon info array and amount
|
// Weapons have 2 entries: Weapon info array and amount
|
||||||
case (_x isEqualTypeArray [[], 0]): {
|
case (_x isEqualTypeArray [[], 0]): {
|
||||||
_weaponsInfo = _x select 0;
|
_x params ["_weaponsInfo"];
|
||||||
|
|
||||||
// Check weapon & weapon attachments
|
// Check weapon & weapon attachments
|
||||||
{
|
{
|
||||||
|
@ -160,7 +160,7 @@ private _magazineMiscItems = createHashMap;
|
|||||||
|
|
||||||
{
|
{
|
||||||
_magazineMiscItems set [configName _x, nil];
|
_magazineMiscItems set [configName _x, nil];
|
||||||
} forEach ((toString {getNumber (_x >> "ACE_isUnique") == 1}) configClasses _cfgMagazines);
|
} forEach ((toString {getNumber (_x >> "ACE_isUnique") == 1 || getNumber (_x >> "ACE_asItem") == 1}) configClasses _cfgMagazines);
|
||||||
|
|
||||||
// Remove invalid/non-existent entries
|
// Remove invalid/non-existent entries
|
||||||
_grenadeList deleteAt "";
|
_grenadeList deleteAt "";
|
||||||
@ -282,11 +282,42 @@ uiNamespace setVariable [QGVAR(CBAdisposableLaunchers), compileFinal _launchers]
|
|||||||
uiNamespace setVariable [QGVAR(configItemsTools), compileFinal _toolList];
|
uiNamespace setVariable [QGVAR(configItemsTools), compileFinal _toolList];
|
||||||
|
|
||||||
// Compatibility: Override baseWeapon for RHS optics
|
// Compatibility: Override baseWeapon for RHS optics
|
||||||
// No good way to do this via script for other attachments, needs manual compat
|
// No good way to do this via script for other RHS attachments, needs manual compat
|
||||||
private _baseWeaponCache = uiNamespace getVariable QGVAR(baseWeaponNameCache);
|
private _baseWeaponCache = uiNamespace getVariable QGVAR(baseWeaponNameCache);
|
||||||
{
|
{
|
||||||
private _baseAttachment = configName (_cfgWeapons >> getText (_x >> "rhs_optic_base"));
|
private _baseAttachment = configName (_cfgWeapons >> getText (_x >> "rhs_optic_base"));
|
||||||
if (_baseAttachment != "") then {
|
if (_baseAttachment != "") then {
|
||||||
_baseWeaponCache set [toLower configName _x, _baseAttachment];
|
_baseWeaponCache set [toLowerANSI configName _x, _baseAttachment];
|
||||||
};
|
};
|
||||||
} forEach ("getText (_x >> 'rhs_optic_base') != ''" configClasses _cfgWeapons);
|
} forEach ("getText (_x >> 'rhs_optic_base') != ''" configClasses _cfgWeapons);
|
||||||
|
|
||||||
|
// Compatibility: Override baseWeapon for CBA Scripted Optics
|
||||||
|
// Adapted from https://github.com/Theseus-Aegis/Mods/blob/master/addons/armory/functions/fnc_getBaseVariant.sqf
|
||||||
|
private _isScriptedOptic = toString {
|
||||||
|
isClass (_x >> "CBA_ScriptedOptic") ||
|
||||||
|
{(getText (_x >> "weaponInfoType")) regexMatch "CBA_scriptedOptic.*?"}
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
private _xClass = toLowerANSI configName _x;
|
||||||
|
private _baseOptic = _xClass call FUNC(baseOptic);
|
||||||
|
if (_baseOptic != "" && {_baseOptic != _xClass}) then {
|
||||||
|
TRACE_2("updating baseOptic",_xClass,_baseOptic);
|
||||||
|
_baseWeaponCache set [_xClass, _baseOptic];
|
||||||
|
};
|
||||||
|
} forEach (_isScriptedOptic configClasses _cfgWeapons);
|
||||||
|
|
||||||
|
// Compatibility: Override baseWeapon for CBA Scripted Attachments
|
||||||
|
private _isScriptedAttachment = toString {
|
||||||
|
getText (_x >> "MRT_SwitchItemNextClass") != "" ||
|
||||||
|
{getText (_x >> "MRT_SwitchItemPrevClass") != ""}
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
private _xClass = toLowerANSI configName _x;
|
||||||
|
private _baseAttachment = _xClass call FUNC(baseAttachment);
|
||||||
|
if (_baseAttachment != "" && {_baseAttachment != _xClass}) then {
|
||||||
|
TRACE_2("updating baseAttachment",_xClass,_baseAttachment);
|
||||||
|
_baseWeaponCache set [_xClass, _baseAttachment];
|
||||||
|
};
|
||||||
|
} forEach (_isScriptedAttachment configClasses _cfgWeapons);
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
|
|
||||||
params ["_control"];
|
params ["_control"];
|
||||||
|
|
||||||
|
// https://community.bistudio.com/wiki/toString, see comment
|
||||||
|
// However, using 55295 did not work as expected, 55291 was found by trial and error
|
||||||
|
#define HIGHEST_VALUE_CHAR 55291
|
||||||
|
|
||||||
// When filling the sorting panel, FUNC(sortPanel) is called twice, so ignore first call
|
// When filling the sorting panel, FUNC(sortPanel) is called twice, so ignore first call
|
||||||
if (GVAR(ignoreFirstSortPanelCall)) exitWith {
|
if (GVAR(ignoreFirstSortPanelCall)) exitWith {
|
||||||
GVAR(ignoreFirstSortPanelCall) = false;
|
GVAR(ignoreFirstSortPanelCall) = false;
|
||||||
@ -29,6 +33,7 @@ private _sortDirectionCtrl = _display displayCtrl ([IDC_sortLeftTabDirection, ID
|
|||||||
private _cfgMagazines = configFile >> "CfgMagazines";
|
private _cfgMagazines = configFile >> "CfgMagazines";
|
||||||
private _cfgFaces = configFile >> "CfgFaces";
|
private _cfgFaces = configFile >> "CfgFaces";
|
||||||
private _cfgUnitInsignia = configFile >> "CfgUnitInsignia";
|
private _cfgUnitInsignia = configFile >> "CfgUnitInsignia";
|
||||||
|
private _cfgUnitInsigniaCampaign = campaignConfigFile >> "CfgUnitInsignia";
|
||||||
private _cfgUnitInsigniaMission = missionConfigFile >> "CfgUnitInsignia";
|
private _cfgUnitInsigniaMission = missionConfigFile >> "CfgUnitInsignia";
|
||||||
|
|
||||||
if (_rightSort) then {
|
if (_rightSort) then {
|
||||||
@ -126,7 +131,6 @@ private _selected = if (_right) then {
|
|||||||
_panel lbData _curSel
|
_panel lbData _curSel
|
||||||
};
|
};
|
||||||
|
|
||||||
private _originalNames = createHashMap;
|
|
||||||
private _item = "";
|
private _item = "";
|
||||||
private _quantity = "";
|
private _quantity = "";
|
||||||
private _itemCfg = configNull;
|
private _itemCfg = configNull;
|
||||||
@ -136,12 +140,8 @@ private _fillerChar = toString [1];
|
|||||||
|
|
||||||
private _magazineMiscItems = uiNamespace getVariable QGVAR(magazineMiscItems);
|
private _magazineMiscItems = uiNamespace getVariable QGVAR(magazineMiscItems);
|
||||||
private _sortCache = uiNamespace getVariable QGVAR(sortCache);
|
private _sortCache = uiNamespace getVariable QGVAR(sortCache);
|
||||||
|
private _faceCache = uiNamespace getVariable QGVAR(faceCache);
|
||||||
private _faceCache = if (_cfgClass == _cfgFaces) then {
|
private _insigniaCache = uiNamespace getVariable QGVAR(insigniaCache);
|
||||||
uiNamespace getVariable [QGVAR(faceCache), createHashMap]
|
|
||||||
} else {
|
|
||||||
createHashMap
|
|
||||||
};
|
|
||||||
|
|
||||||
private _countColumns = if (_right) then {
|
private _countColumns = if (_right) then {
|
||||||
count lnbGetColumnsPosition _panel
|
count lnbGetColumnsPosition _panel
|
||||||
@ -150,9 +150,9 @@ private _countColumns = if (_right) then {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private _for = if (_right) then {
|
private _for = if (_right) then {
|
||||||
for '_i' from 0 to (lnbSize _panel select 0) - 1
|
for "_i" from 0 to (lnbSize _panel select 0) - 1
|
||||||
} else {
|
} else {
|
||||||
for '_i' from 0 to (lbSize _panel) - 1
|
for "_i" from 0 to (lbSize _panel) - 1
|
||||||
};
|
};
|
||||||
|
|
||||||
_for do {
|
_for do {
|
||||||
@ -163,6 +163,14 @@ _for do {
|
|||||||
_panel lbData _i
|
_panel lbData _i
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Check if entry is "Empty"
|
||||||
|
if (!_right && {(_panel lbValue _i) == -1}) then {
|
||||||
|
// Set to lowest/highest lexicographical value, so that "Empty" is always at the top
|
||||||
|
_panel lbSetTextRight [_i, ["", toString [HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR]] select (_sortDirection == ASCENDING)];
|
||||||
|
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
// Get item's count
|
// Get item's count
|
||||||
_quantity = if (_right) then {
|
_quantity = if (_right) then {
|
||||||
parseNumber (_panel lnbText [_i, 2])
|
parseNumber (_panel lnbText [_i, 2])
|
||||||
@ -179,18 +187,22 @@ _for do {
|
|||||||
_itemCfg = if !(_cfgClass in [_cfgFaces, _cfgUnitInsignia]) then {
|
_itemCfg = if !(_cfgClass in [_cfgFaces, _cfgUnitInsignia]) then {
|
||||||
_cfgClass >> _item
|
_cfgClass >> _item
|
||||||
} else {
|
} else {
|
||||||
// If insignia, check both config and mission file
|
// If insignia, check for correct config: First mission, then campaign and finally regular config
|
||||||
if (_cfgClass == _cfgUnitInsignia) then {
|
if (_cfgClass == _cfgUnitInsignia) then {
|
||||||
_itemCfg = _cfgClass >> _item;
|
_itemCfg = _cfgUnitInsigniaMission >> _item;
|
||||||
|
|
||||||
if (isNull _itemCfg) then {
|
if (isNull _itemCfg) then {
|
||||||
_itemCfg = _cfgUnitInsigniaMission >> _item;
|
_itemCfg = _cfgUnitInsigniaCampaign >> _item;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isNull _itemCfg) then {
|
||||||
|
_itemCfg = _cfgUnitInsignia >> _item;
|
||||||
};
|
};
|
||||||
|
|
||||||
_itemCfg
|
_itemCfg
|
||||||
} else {
|
} else {
|
||||||
// If face, check correct category
|
// If face, check correct category
|
||||||
_cfgClass >> (_faceCache get _item) param [2, "Man_A3"] >> _item
|
_cfgClass >> (_faceCache getOrDefault [_item, []]) param [2, "Man_A3"] >> _item
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -216,37 +228,29 @@ _for do {
|
|||||||
_value
|
_value
|
||||||
}, true];
|
}, true];
|
||||||
|
|
||||||
// Save the current row's item's name in a cache and set text to it's sorting value
|
// Set the right text temporarily, so it can be used for sorting
|
||||||
if (_right) then {
|
if (_right) then {
|
||||||
_name = _panel lnbText [_i, 1];
|
|
||||||
_originalNames set [_item, _name];
|
|
||||||
|
|
||||||
// Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed
|
// Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed
|
||||||
// Filler char has lowest lexicographical order possible
|
// Filler char has lowest lexicographical value possible
|
||||||
_panel lnbSetText [[_i, 1], format ["%1%2%4%3", _value, _name, _item, _fillerChar]];
|
_panel lnbSetTextRight [[_i, 1], format ["%1%2%4%3", _value, _panel lnbText [_i, 1], _item, _fillerChar]];
|
||||||
} else {
|
} else {
|
||||||
if (_item != "") then {
|
if (_item != "") then {
|
||||||
_name = _panel lbText _i;
|
|
||||||
_originalNames set [_item, _name];
|
|
||||||
|
|
||||||
// Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed
|
// Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed
|
||||||
// Filler char has lowest lexicographical order possible
|
// Filler char has lowest lexicographical value possible
|
||||||
_panel lbSetText [_i, format ["%1%2%4%3", _value, _name, _item, _fillerChar]];
|
_panel lbSetTextRight [_i, format ["%1%2%4%3", _value, _panel lbText _i, _item, _fillerChar]];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Sort alphabetically, find the previously selected item, select it again and reset text to original text
|
// Sort alphabetically, find the previously selected item and select it again
|
||||||
if (_right) then {
|
if (_right) then {
|
||||||
_panel lnbSort [1, _sortDirection == ASCENDING];
|
[_panel, 1] lnbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, true]; // do not support unicode, as it's much more performance intensive (~3x more)
|
||||||
|
|
||||||
_for do {
|
_for do {
|
||||||
_item = _panel lnbData [_i, 0];
|
// Remove sorting text, as it blocks the item name otherwise
|
||||||
|
_panel lnbSetTextRight [[_i, 1], ""];
|
||||||
|
|
||||||
_panel lnbSetText [[_i, 1], _originalNames get _item];
|
if (_curSel != -1 && {(_panel lnbData [_i, 0]) == _selected}) then {
|
||||||
|
|
||||||
// Set selection after text, otherwise item info box on the right side shows invalid name
|
|
||||||
if (_curSel != -1 && {_item == _selected}) then {
|
|
||||||
_panel lnbSetCurSelRow _i;
|
_panel lnbSetCurSelRow _i;
|
||||||
|
|
||||||
// To avoid unnecessary checks after previsouly selected item was found
|
// To avoid unnecessary checks after previsouly selected item was found
|
||||||
@ -254,17 +258,17 @@ if (_right) then {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
lbSort [_panel, ["DESC", "ASC"] select _sortDirection];
|
_panel lbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, true]; // do not support unicode, as it's much more performance intensive (~3x more)
|
||||||
|
|
||||||
_for do {
|
_for do {
|
||||||
_item = _panel lbData _i;
|
_item = _panel lbData _i;
|
||||||
|
|
||||||
// Check if valid item (problems can be caused when searching)
|
// Check if valid item (problems can be caused when searching)
|
||||||
if (_item != "") then {
|
if (_item != "") then {
|
||||||
_panel lbSetText [_i, _originalNames get _item];
|
// Remove sorting text, as it blocks the item name otherwise
|
||||||
|
_panel lbSetTextRight [_i, ""];
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set selection after text, otherwise item info box on the right side shows invalid name
|
|
||||||
if (_curSel != -1 && {_item == _selected}) then {
|
if (_curSel != -1 && {_item == _selected}) then {
|
||||||
_panel lbSetCurSel _i;
|
_panel lbSetCurSel _i;
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ params ["", "_config"];
|
|||||||
TRACE_1("statTextStatement_binoVisionMode",_config);
|
TRACE_1("statTextStatement_binoVisionMode",_config);
|
||||||
|
|
||||||
private _text = [];
|
private _text = [];
|
||||||
private _visionModes = getArray (_config >> "visionMode") apply {toLower _x};
|
private _visionModes = getArray (_config >> "visionMode") apply {toLowerANSI _x};
|
||||||
{
|
{
|
||||||
if (_x in _visionModes) then {
|
if (_x in _visionModes) then {
|
||||||
_text pushBack (localize ([LSTRING(VisionNormal), LSTRING(VisionNight), LSTRING(VisionThermal)] select _forEachIndex));
|
_text pushBack (localize ([LSTRING(VisionNormal), LSTRING(VisionNight), LSTRING(VisionThermal)] select _forEachIndex));
|
||||||
|
26
addons/arsenal/functions/fnc_statTextStatement_load.sqf
Normal file
26
addons/arsenal/functions/fnc_statTextStatement_load.sqf
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
/*
|
||||||
|
* Author: PabstMirror
|
||||||
|
* Text statement for the load stat.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Stats <ARRAY>
|
||||||
|
* 1: Item config path <CONFIG>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* Stat Text <STRING>
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
|
||||||
|
params ["_stats", "_config"];
|
||||||
|
TRACE_2("statTextStatement_load",_stats,_config);
|
||||||
|
|
||||||
|
if (!isNull (_config >> "ItemInfo" >> "containerClass")) then { // Uniform/Vest
|
||||||
|
_config = configfile >> "CfgVehicles" >> getText (_config >> "ItemInfo" >> "containerClass");
|
||||||
|
};
|
||||||
|
|
||||||
|
private _load = getNumber (_config >> (_stats # 0));
|
||||||
|
|
||||||
|
if (_load <= 0) exitWith { LELSTRING(common,none) };
|
||||||
|
format ["%1kg (%2lb)", (_load * 0.1 * (1 / 2.2046)) toFixed 2, (_load * 0.1) toFixed 2]
|
@ -17,7 +17,7 @@ params ["", "_config"];
|
|||||||
TRACE_1("statTextStatement_scopeVisionMode",_config);
|
TRACE_1("statTextStatement_scopeVisionMode",_config);
|
||||||
|
|
||||||
private _opticsModes = ("true" configClasses (_config >> "ItemInfo" >> "OpticsModes")) apply {
|
private _opticsModes = ("true" configClasses (_config >> "ItemInfo" >> "OpticsModes")) apply {
|
||||||
private _visionMode = getArray (_x >> "visionMode") apply {toLower _x};
|
private _visionMode = getArray (_x >> "visionMode") apply {toLowerANSI _x};
|
||||||
[
|
[
|
||||||
getNumber (_x >> "useModelOptics") == 1, // Is in optics
|
getNumber (_x >> "useModelOptics") == 1, // Is in optics
|
||||||
_visionMode isEqualTo [], // Optional NVG
|
_visionMode isEqualTo [], // Optional NVG
|
||||||
|
@ -63,8 +63,12 @@ private _indexCurrentItems = -1;
|
|||||||
};
|
};
|
||||||
// Backpack
|
// Backpack
|
||||||
case IDX_LOADOUT_BACKPACK: {
|
case IDX_LOADOUT_BACKPACK: {
|
||||||
GVAR(currentItems) set [IDX_CURR_BACKPACK, _x param [0, ""]];
|
_x params [["_backpack", ""], ["_items", []]];
|
||||||
GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, _x param [1, []]];
|
if (_backpack != "") then {
|
||||||
|
_backpack = [_backpack, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
|
||||||
|
};
|
||||||
|
GVAR(currentItems) set [IDX_CURR_BACKPACK, _backpack];
|
||||||
|
GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, _items];
|
||||||
};
|
};
|
||||||
// Helmet
|
// Helmet
|
||||||
case IDX_LOADOUT_HEADGEAR: {
|
case IDX_LOADOUT_HEADGEAR: {
|
||||||
|
@ -101,6 +101,11 @@ private _fnc_uniqueEquipment = {
|
|||||||
case IDX_LOADOUT_BACKPACK: {
|
case IDX_LOADOUT_BACKPACK: {
|
||||||
_x params [["_containerClass", ""]];
|
_x params [["_containerClass", ""]];
|
||||||
|
|
||||||
|
// Handle preset (loaded/AI) backpacks
|
||||||
|
if (_containerClass != "" && _forEachIndex == IDX_LOADOUT_BACKPACK) then {
|
||||||
|
_containerClass = [_containerClass, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
|
||||||
|
};
|
||||||
|
|
||||||
// Remove all unique equipment in tab; Add container as a unique equipment
|
// Remove all unique equipment in tab; Add container as a unique equipment
|
||||||
[GVAR(virtualItems) get (_forEachIndex + 1), _containerClass] call _fnc_uniqueEquipment;
|
[GVAR(virtualItems) get (_forEachIndex + 1), _containerClass] call _fnc_uniqueEquipment;
|
||||||
};
|
};
|
||||||
|
@ -13,285 +13,97 @@
|
|||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define NOT_IN_ARSENAL !(_name in GVAR(virtualItemsFlat))
|
||||||
|
|
||||||
params ["_loadout"];
|
params ["_loadout"];
|
||||||
|
|
||||||
private _extendedInfo = createHashMap;
|
private _extendedInfo = createHashMap;
|
||||||
|
|
||||||
// Check if the provided loadout is a CBA extended loadout
|
// Check if the provided loadout is a CBA extended loadout
|
||||||
if (count _loadout == 2) then {
|
if (count _loadout == 2) then {
|
||||||
_extendedInfo = _loadout select 1;
|
_extendedInfo = +(_loadout select 1); // Copy the hashmap to prevent events from modifiyng the profileNamespace extendedInfo
|
||||||
|
if (_extendedInfo isEqualType []) then { // Hashmaps are serialized as arrays, convert back to hashmap
|
||||||
|
_extendedInfo = createHashMapFromArray _extendedInfo;
|
||||||
|
_loadout set [1, _extendedInfo]; // Also fix source variable, technically not needed but doesn't hurt
|
||||||
|
};
|
||||||
_loadout = _loadout select 0;
|
_loadout = _loadout select 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
private _cfgWeapons = configFile >> "CfgWeapons";
|
|
||||||
private _cfgMagazines = configFile >> "CfgMagazines";
|
|
||||||
private _cfgVehicles = configFile >> "CfgVehicles";
|
|
||||||
private _cfgGlasses = configFile >> "CfgGlasses";
|
|
||||||
|
|
||||||
private _weapons = GVAR(virtualItems) get IDX_VIRT_WEAPONS;
|
|
||||||
private _attachments = GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS;
|
|
||||||
|
|
||||||
private _name = "";
|
private _name = "";
|
||||||
private _nullItemsAmount = 0;
|
private _itemArray = [];
|
||||||
private _unavailableItemsAmount = 0;
|
|
||||||
private _nullItemsList = [];
|
private _nullItemsList = [];
|
||||||
private _unavailableItemsList = [];
|
private _unavailableItemsList = [];
|
||||||
|
private _missingExtendedInfo = [];
|
||||||
|
|
||||||
// Search for all items and turn them into config case; Don't touch other value types
|
// Search for all items and check their availability
|
||||||
private _fnc_toConfigCase = {
|
private _fnc_filterLoadout = {
|
||||||
_this apply {
|
_this apply {
|
||||||
if (_x isEqualType "") then {
|
if (_x isEqualType "" && {_x != ""}) then {
|
||||||
if (_x != "") then {
|
_name = _x call EFUNC(common,getConfigName);
|
||||||
_name = _x call EFUNC(common,getConfigName);
|
|
||||||
|
|
||||||
// If item doesn't exist in config, "" is returned
|
// If item doesn't exist in config, "" is returned
|
||||||
// Just return unaltered item name in that case, so it can be documented as being unavailable
|
if (_name == "") then {
|
||||||
[_x, _name] select (_name != "");
|
_nullItemsList pushBack _x;
|
||||||
} else {
|
} else {
|
||||||
_x
|
// Check if item or its base weapon exist in the arsenal
|
||||||
|
if NOT_IN_ARSENAL then {
|
||||||
|
_name = _name call FUNC(baseWeapon);
|
||||||
|
if NOT_IN_ARSENAL then {
|
||||||
|
// This could be a backpack
|
||||||
|
private _temp = [_name, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
|
||||||
|
if (_temp == "") then { // It's not
|
||||||
|
_unavailableItemsList pushBack _name;
|
||||||
|
_name = "";
|
||||||
|
} else { // It is
|
||||||
|
_name = _temp;
|
||||||
|
// Check if it's available again
|
||||||
|
if NOT_IN_ARSENAL then {
|
||||||
|
_unavailableItemsList pushBack _name;
|
||||||
|
_name = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_name
|
||||||
} else {
|
} else {
|
||||||
// Handle arrays
|
// Handle arrays
|
||||||
if (_x isEqualType []) then {
|
if (_x isEqualType []) then {
|
||||||
_x call _fnc_toConfigCase
|
_itemArray = _x call _fnc_filterLoadout;
|
||||||
|
// If "" is given as a container, an error is thrown, therefore, filter out all unavailable/null containers
|
||||||
|
if (count _itemArray == 2 && {(_itemArray select 0) isEqualTo ""} && {(_itemArray select 1) isEqualType []}) then {
|
||||||
|
_itemArray = [];
|
||||||
|
};
|
||||||
|
_itemArray
|
||||||
} else {
|
} else {
|
||||||
// All other types
|
// All other types and empty strings
|
||||||
_x
|
_x
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Convert loadout to config case
|
// Convert loadout to config case and replace null/unavailable items
|
||||||
// Loadout might come from a different modpack, which might have different config naming
|
// Loadout might come from a different modpack, which might have different config naming
|
||||||
_loadout = _loadout call _fnc_toConfigCase;
|
_loadout = _loadout call _fnc_filterLoadout;
|
||||||
|
|
||||||
// Check a weapon, with its attachments and magazines, if items are available
|
{
|
||||||
private _fnc_weaponCheck = {
|
private _class = _extendedInfo getOrDefault [_x, ""];
|
||||||
params ["_weaponArray", ["_index", -1]];
|
private _cache = missionNamespace getVariable (_x + "Cache");
|
||||||
|
|
||||||
{
|
// Previously voices were stored in lower case (speaker command returns lower case), so this is to make old loadouts compatible
|
||||||
// Weapons and attachments
|
if (_class != "" && {_x == QGVAR(voice)}) then {
|
||||||
if (_x isEqualType "") then {
|
_class = _class call EFUNC(common,getConfigName);
|
||||||
if (_x != "") then {
|
|
||||||
// Check if item exists
|
|
||||||
if (isClass (_cfgWeapons >> _x)) then {
|
|
||||||
// Get base weapon
|
|
||||||
_x = _x call FUNC(baseWeapon);
|
|
||||||
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(
|
|
||||||
// Weapon class name is at the very start of the array
|
|
||||||
if (_forEachIndex == 0) then {
|
|
||||||
// If the type of weapon is known, only look through that array
|
|
||||||
if (_index != -1) then {
|
|
||||||
// If binos, choose differently
|
|
||||||
if (_index == IDX_LOADOUT_BINO) then {
|
|
||||||
_x in (GVAR(virtualItems) get IDX_VIRT_BINO)
|
|
||||||
} else {
|
|
||||||
_x in (_weapons get _index)
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_x in (_weapons get IDX_VIRT_PRIMARY_WEAPONS) ||
|
|
||||||
{_x in (_weapons get IDX_VIRT_SECONDARY_WEAPONS)} ||
|
|
||||||
{_x in (_weapons get IDX_VIRT_HANDGUN_WEAPONS)} ||
|
|
||||||
{_x in (GVAR(virtualItems) get IDX_VIRT_BINO)}
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_x in (_attachments get IDX_VIRT_OPTICS_ATTACHMENTS) ||
|
|
||||||
{_x in (_attachments get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)} ||
|
|
||||||
{_x in (_attachments get IDX_VIRT_MUZZLE_ATTACHMENTS)} ||
|
|
||||||
{_x in (_attachments get IDX_VIRT_BIPOD_ATTACHMENTS)}
|
|
||||||
}
|
|
||||||
) then {
|
|
||||||
_unavailableItemsList pushBackUnique _x;
|
|
||||||
_weaponArray set [_forEachIndex, ""];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _x;
|
|
||||||
_weaponArray set [_forEachIndex, ""];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
// Magazines
|
|
||||||
if (_x isNotEqualTo []) then {
|
|
||||||
_x params ["_magazine"];
|
|
||||||
|
|
||||||
// Check if item exists
|
|
||||||
if (isClass (_cfgMagazines >> _magazine)) then {
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(_magazine in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) then {
|
|
||||||
_unavailableItemsList pushBackUnique _magazine;
|
|
||||||
_weaponArray set [_forEachIndex, []];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _magazine;
|
|
||||||
_weaponArray set [_forEachIndex, []];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} forEach _weaponArray;
|
|
||||||
};
|
|
||||||
|
|
||||||
private _item = "";
|
|
||||||
|
|
||||||
// Go through entire loadout to check if items are available in current arsenal
|
|
||||||
for "_dataIndex" from IDX_LOADOUT_PRIMARY_WEAPON to IDX_LOADOUT_ASSIGNEDITEMS do {
|
|
||||||
switch (_dataIndex) do {
|
|
||||||
// Primary weapon, Secondary weapon, Handgun weapon, Binoculars
|
|
||||||
case IDX_LOADOUT_PRIMARY_WEAPON;
|
|
||||||
case IDX_LOADOUT_SECONDARY_WEAPON;
|
|
||||||
case IDX_LOADOUT_HANDGUN_WEAPON;
|
|
||||||
case IDX_LOADOUT_BINO: {
|
|
||||||
[_loadout select _dataIndex, _dataIndex] call _fnc_weaponCheck;
|
|
||||||
};
|
|
||||||
// Uniform, vest, backpack
|
|
||||||
case IDX_LOADOUT_UNIFORM;
|
|
||||||
case IDX_LOADOUT_VEST;
|
|
||||||
case IDX_LOADOUT_BACKPACK: {
|
|
||||||
(_loadout select _dataIndex) params [["_item", ""], ["_containerItems", []]];
|
|
||||||
|
|
||||||
if (_item != "") then {
|
|
||||||
// Check if item exists
|
|
||||||
if (isClass (_cfgVehicles >> _item) || {isClass (_cfgWeapons >> _item)}) then {
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(_item in (GVAR(virtualItems) get (_dataIndex + 1))) then {
|
|
||||||
_unavailableItemsList pushBackUnique _item;
|
|
||||||
_loadout set [_dataIndex, []];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
} else {
|
|
||||||
{
|
|
||||||
switch (true) do {
|
|
||||||
// Magazines have each 3 entries: Name, number of magazines and ammo count
|
|
||||||
case (_x isEqualTypeArray ["", 0, 0]): {
|
|
||||||
_x params ["_item"];
|
|
||||||
|
|
||||||
// Check if item exists
|
|
||||||
if (isClass (_cfgMagazines >> _item)) then {
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(
|
|
||||||
_item in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL) ||
|
|
||||||
{_item in (GVAR(virtualItems) get IDX_VIRT_GRENADES)} ||
|
|
||||||
{_item in (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES)} ||
|
|
||||||
{_item in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)}
|
|
||||||
) then {
|
|
||||||
_unavailableItemsList pushBackUnique _item;
|
|
||||||
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _item;
|
|
||||||
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
// Weapons have 2 entries: Weapon info array and amount
|
|
||||||
case (_x isEqualTypeArray [[], 0]): {
|
|
||||||
[_x select 0] call _fnc_weaponCheck;
|
|
||||||
};
|
|
||||||
// Misc. items have 2 entries: Name and amount, containers have 2 entries: Name and isBackpack
|
|
||||||
default {
|
|
||||||
_x params ["_item"];
|
|
||||||
|
|
||||||
// Check if item exists
|
|
||||||
if (
|
|
||||||
isClass (_cfgWeapons >> _item) ||
|
|
||||||
{isClass (_cfgMagazines >> _item)} ||
|
|
||||||
{isClass (_cfgGlasses >> _item)} ||
|
|
||||||
{isClass (_cfgVehicles >> _item)}
|
|
||||||
) then {
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(_item in GVAR(virtualItemsFlat)) then {
|
|
||||||
_unavailableItemsList pushBackUnique _item;
|
|
||||||
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _item;
|
|
||||||
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
} forEach _containerItems;
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _item;
|
|
||||||
_loadout set [_dataIndex, []];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
// Headgear
|
|
||||||
case IDX_LOADOUT_HEADGEAR: {
|
|
||||||
_item = _loadout select _dataIndex;
|
|
||||||
|
|
||||||
if (_item != "") then {
|
|
||||||
// Check if item exists
|
|
||||||
if (isClass (_cfgWeapons >> _item)) then {
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(_item in (GVAR(virtualItems) get IDX_VIRT_HEADGEAR)) then {
|
|
||||||
_unavailableItemsList pushBackUnique _item;
|
|
||||||
_loadout set [_dataIndex, ""];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _item;
|
|
||||||
_loadout set [_dataIndex, ""];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
// Facewear
|
|
||||||
case IDX_LOADOUT_GOGGLES: {
|
|
||||||
_item = _loadout select _dataIndex;
|
|
||||||
|
|
||||||
if (_item != "") then {
|
|
||||||
// Check if item exists
|
|
||||||
if (isClass (_cfgGlasses >> _item)) then {
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(_item in (GVAR(virtualItems) get IDX_VIRT_GOGGLES)) then {
|
|
||||||
_unavailableItemsList pushBackUnique _item;
|
|
||||||
_loadout set [_dataIndex, ""];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _item;
|
|
||||||
_loadout set [_dataIndex, ""];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
// Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs
|
|
||||||
case IDX_LOADOUT_ASSIGNEDITEMS: {
|
|
||||||
private _assignedItems = _loadout select _dataIndex;
|
|
||||||
|
|
||||||
for "_subIndex" from 0 to 5 do {
|
|
||||||
_item = _assignedItems select _subIndex;
|
|
||||||
|
|
||||||
if (_item != "") then {
|
|
||||||
// Check if item exists
|
|
||||||
if (isClass (_cfgWeapons >> _item)) then {
|
|
||||||
// Check if item is available in arsenal
|
|
||||||
if !(_item in (GVAR(virtualItems) get (IDX_VIRT_NVG + ([2, 6, 4, 3, 5, 0] select _subIndex)))) then {
|
|
||||||
_unavailableItemsList pushBackUnique _item;
|
|
||||||
_assignedItems set [_subIndex, ""];
|
|
||||||
INC(_unavailableItemsAmount);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
_nullItemsList pushBackUnique _item;
|
|
||||||
_assignedItems set [_subIndex, ""];
|
|
||||||
INC(_nullItemsAmount);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
if (_class != "" && {!(_class in _cache)}) then {
|
||||||
|
_missingExtendedInfo pushBack [_x, _class];
|
||||||
|
_extendedInfo deleteAt _x;
|
||||||
|
};
|
||||||
|
} forEach [QGVAR(insignia), QGVAR(face), QGVAR(voice)];
|
||||||
|
|
||||||
[[_loadout, _extendedInfo], _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]
|
// Raise event for 3rd party: mostly for handling extended info
|
||||||
|
// Pass all items, including duplicates
|
||||||
|
[QGVAR(loadoutVerified), [_loadout, _extendedInfo, _nullItemsList, _unavailableItemsList, _missingExtendedInfo]] call CBA_fnc_localEvent;
|
||||||
|
|
||||||
|
[[_loadout, _extendedInfo], _nullItemsList arrayIntersect _nullItemsList, _unavailableItemsList arrayIntersect _unavailableItemsList, _missingExtendedInfo]
|
||||||
|
@ -15,6 +15,3 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "\z\ace\addons\main\script_macros.hpp"
|
#include "\z\ace\addons\main\script_macros.hpp"
|
||||||
|
|
||||||
#define ACTION_TYPE_BUTTON 0
|
|
||||||
#define ACTION_TYPE_TEXT 1
|
|
||||||
|
@ -1191,7 +1191,7 @@
|
|||||||
<Chinesesimp>支持夜视仪</Chinesesimp>
|
<Chinesesimp>支持夜视仪</Chinesesimp>
|
||||||
<Czech>Podpora nočního vidění</Czech>
|
<Czech>Podpora nočního vidění</Czech>
|
||||||
<Turkish>Gece Görüş Desteği</Turkish>
|
<Turkish>Gece Görüş Desteği</Turkish>
|
||||||
<Korean>야간투시 지원여부</Korean>
|
<Korean>야간투시 지원</Korean>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_statVisionMode_supPrim">
|
<Key ID="STR_ACE_Arsenal_statVisionMode_supPrim">
|
||||||
<English>Primary supported</English>
|
<English>Primary supported</English>
|
||||||
@ -1206,7 +1206,7 @@
|
|||||||
<Chinese>主武器支援</Chinese>
|
<Chinese>主武器支援</Chinese>
|
||||||
<Chinesesimp>主镜支持</Chinesesimp>
|
<Chinesesimp>主镜支持</Chinesesimp>
|
||||||
<Czech>Hlavní část hledí podporuje</Czech>
|
<Czech>Hlavní část hledí podporuje</Czech>
|
||||||
<Korean>주무기 지원여부</Korean>
|
<Korean>주무기 지원</Korean>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_statVisionMode_supSec">
|
<Key ID="STR_ACE_Arsenal_statVisionMode_supSec">
|
||||||
<English>Secondary supported</English>
|
<English>Secondary supported</English>
|
||||||
@ -1221,7 +1221,7 @@
|
|||||||
<Chinese>次要武器支援</Chinese>
|
<Chinese>次要武器支援</Chinese>
|
||||||
<Chinesesimp>副镜支持</Chinesesimp>
|
<Chinesesimp>副镜支持</Chinesesimp>
|
||||||
<Czech>Vedlejší část hledí podporuje</Czech>
|
<Czech>Vedlejší část hledí podporuje</Czech>
|
||||||
<Korean>보조무기 지원여부</Korean>
|
<Korean>보조무기 지원</Korean>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrim">
|
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrim">
|
||||||
<English>Primary integrated</English>
|
<English>Primary integrated</English>
|
||||||
@ -1236,15 +1236,23 @@
|
|||||||
<Chinese>整合主武器</Chinese>
|
<Chinese>整合主武器</Chinese>
|
||||||
<Chinesesimp>主镜内置</Chinesesimp>
|
<Chinesesimp>主镜内置</Chinesesimp>
|
||||||
<Czech>Integrováno do hlavní části hledí</Czech>
|
<Czech>Integrováno do hlavní části hledí</Czech>
|
||||||
<Korean>주무기 내장여부</Korean>
|
<Korean>주무기 내장</Korean>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_statVisionMode_ti">
|
<Key ID="STR_ACE_Arsenal_statVisionMode_ti">
|
||||||
<English>Thermal integrated</English>
|
<English>Thermal integrated</English>
|
||||||
|
<Italian>Termico integrato</Italian>
|
||||||
<Japanese>熱画像装置内蔵</Japanese>
|
<Japanese>熱画像装置内蔵</Japanese>
|
||||||
|
<Russian>Интегрирован тепловизор.</Russian>
|
||||||
|
<Korean>열화상 내장</Korean>
|
||||||
|
<French>Thermique intégrée</French>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrimTi">
|
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrimTi">
|
||||||
<English>Thermal & Primary integrated</English>
|
<English>Thermal & Primary integrated</English>
|
||||||
|
<Italian>Termico e Primario integrato</Italian>
|
||||||
<Japanese>熱画像装置内蔵・プライマリに内蔵</Japanese>
|
<Japanese>熱画像装置内蔵・プライマリに内蔵</Japanese>
|
||||||
|
<Russian>Интегрирован тепловизор и осн.прицел.</Russian>
|
||||||
|
<Korean>열화상과 주무기 내장</Korean>
|
||||||
|
<French>Thermique et primaire intégrés</French>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_statVisionMode_NoSup">
|
<Key ID="STR_ACE_Arsenal_statVisionMode_NoSup">
|
||||||
<English>Not Supported</English>
|
<English>Not Supported</English>
|
||||||
@ -1600,6 +1608,7 @@
|
|||||||
<Korean>내림차순</Korean>
|
<Korean>내림차순</Korean>
|
||||||
<French>Décroissant</French>
|
<French>Décroissant</French>
|
||||||
<Portuguese>Decrescente</Portuguese>
|
<Portuguese>Decrescente</Portuguese>
|
||||||
|
<Russian>Нисходящий</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_sortAscending">
|
<Key ID="STR_ACE_Arsenal_sortAscending">
|
||||||
<English>Ascending</English>
|
<English>Ascending</English>
|
||||||
@ -1610,6 +1619,7 @@
|
|||||||
<Korean>오름차순</Korean>
|
<Korean>오름차순</Korean>
|
||||||
<French>Croissant</French>
|
<French>Croissant</French>
|
||||||
<Portuguese>Crescente</Portuguese>
|
<Portuguese>Crescente</Portuguese>
|
||||||
|
<Russian>Восходящий</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_toolsTab">
|
<Key ID="STR_ACE_Arsenal_toolsTab">
|
||||||
<English>Tools</English>
|
<English>Tools</English>
|
||||||
@ -1636,6 +1646,7 @@
|
|||||||
<Korean>장탄 수</Korean>
|
<Korean>장탄 수</Korean>
|
||||||
<French>Nombre de munitions</French>
|
<French>Nombre de munitions</French>
|
||||||
<Portuguese>Quantidade de munição</Portuguese>
|
<Portuguese>Quantidade de munição</Portuguese>
|
||||||
|
<Russian>Количество боеприпасов</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_statIlluminators">
|
<Key ID="STR_ACE_Arsenal_statIlluminators">
|
||||||
<English>Illuminators</English>
|
<English>Illuminators</English>
|
||||||
@ -1645,6 +1656,7 @@
|
|||||||
<Korean>조명</Korean>
|
<Korean>조명</Korean>
|
||||||
<Portuguese>Iluminadores</Portuguese>
|
<Portuguese>Iluminadores</Portuguese>
|
||||||
<Japanese>イルミネーター</Japanese>
|
<Japanese>イルミネーター</Japanese>
|
||||||
|
<Russian>Осветители</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_defaultToFavoritesSetting">
|
<Key ID="STR_ACE_Arsenal_defaultToFavoritesSetting">
|
||||||
<English>Default to Favorites</English>
|
<English>Default to Favorites</English>
|
||||||
@ -1655,6 +1667,7 @@
|
|||||||
<Korean>즐겨찾기 기본값</Korean>
|
<Korean>즐겨찾기 기본값</Korean>
|
||||||
<French>Favoris par défaut</French>
|
<French>Favoris par défaut</French>
|
||||||
<Portuguese>Favoritos por padrão</Portuguese>
|
<Portuguese>Favoritos por padrão</Portuguese>
|
||||||
|
<Russian>По умолчанию - Избранное</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_defaultToFavoritesTooltip">
|
<Key ID="STR_ACE_Arsenal_defaultToFavoritesTooltip">
|
||||||
<English>Controls whether the ACE Arsenal defaults to showing all items or favorites.</English>
|
<English>Controls whether the ACE Arsenal defaults to showing all items or favorites.</English>
|
||||||
@ -1665,6 +1678,7 @@
|
|||||||
<Korean>ACE 아스널이 기본적으로 모든 아이템 또는 즐겨찾기를 표시할 지 여부를 조정합니다.</Korean>
|
<Korean>ACE 아스널이 기본적으로 모든 아이템 또는 즐겨찾기를 표시할 지 여부를 조정합니다.</Korean>
|
||||||
<French>Contrôle si l'arsenal ACE affiche par défaut tous les éléments ou les favoris.</French>
|
<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>
|
<Portuguese>Controla se o Arsenal ACE exibe por padrão todos os itens ou favoritos.</Portuguese>
|
||||||
|
<Russian>Определяет, будет ли в арсенале ACE по умолчанию отображаться все предметы или избранное.</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_favoritesColorSetting">
|
<Key ID="STR_ACE_Arsenal_favoritesColorSetting">
|
||||||
<English>Favorites Color</English>
|
<English>Favorites Color</English>
|
||||||
@ -1675,6 +1689,7 @@
|
|||||||
<Korean>즐겨찾기 색상</Korean>
|
<Korean>즐겨찾기 색상</Korean>
|
||||||
<French>Couleurs favorites</French>
|
<French>Couleurs favorites</French>
|
||||||
<Portuguese>Cor dos favoritos</Portuguese>
|
<Portuguese>Cor dos favoritos</Portuguese>
|
||||||
|
<Russian>Избранный цвет</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_favoritesColorTooltip">
|
<Key ID="STR_ACE_Arsenal_favoritesColorTooltip">
|
||||||
<English>Highlight color for favorited items.</English>
|
<English>Highlight color for favorited items.</English>
|
||||||
@ -1685,6 +1700,7 @@
|
|||||||
<Korean>즐겨찾기한 아이템을 색상으로 강조합니다.</Korean>
|
<Korean>즐겨찾기한 아이템을 색상으로 강조합니다.</Korean>
|
||||||
<French>Met en surbrillance les éléments favoris.</French>
|
<French>Met en surbrillance les éléments favoris.</French>
|
||||||
<Portuguese>Cor de destaque para itens favoritados.</Portuguese>
|
<Portuguese>Cor de destaque para itens favoritados.</Portuguese>
|
||||||
|
<Russian>Выделите цветом любимые предметы.</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_buttonFavoritesTooltip">
|
<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>
|
<English>Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item.</English>
|
||||||
@ -1695,6 +1711,7 @@
|
|||||||
<Korean>모든 아이템을 표시하거나 즐겨찾기를 표시할 때 전환합니다\nShift 키를 누른 상태에서 두 번 클릭하여 아이템을 추가하거나 제거합니다.</Korean>
|
<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>
|
<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>
|
<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>
|
||||||
|
<Russian>Переключайтесь между отображением всех элементов или ваших избранных.\nДважды щелкните, удерживая Shift, чтобы добавить или удалить элемент.</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Arsenal_buttonSearchTooltip">
|
<Key ID="STR_ACE_Arsenal_buttonSearchTooltip">
|
||||||
<English>Search\nCTRL + Click to enable live results</English>
|
<English>Search\nCTRL + Click to enable live results</English>
|
||||||
@ -1702,6 +1719,8 @@
|
|||||||
<Italian>Cerca\nCTRL + Click per modificare i risultati mentre scrivi</Italian>
|
<Italian>Cerca\nCTRL + Click per modificare i risultati mentre scrivi</Italian>
|
||||||
<Japanese>検索\nCTRL + クリックで検索結果の即時表示を有効化</Japanese>
|
<Japanese>検索\nCTRL + クリックで検索結果の即時表示を有効化</Japanese>
|
||||||
<Korean>검색\nCtrl + 클릭으로 실시간 검색 결과를 활성화</Korean>
|
<Korean>검색\nCtrl + 클릭으로 실시간 검색 결과를 활성화</Korean>
|
||||||
|
<Russian>Поиск\nCtrl + Click для включения результатов в реальном времени</Russian>
|
||||||
|
<French>Recherche\nCTRL + clic pour modifier les résultats tout en écrivant</French>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -467,7 +467,6 @@ class GVAR(display) {
|
|||||||
};
|
};
|
||||||
class actionsText1: RscTextMulti {
|
class actionsText1: RscTextMulti {
|
||||||
idc = IDC_actionsText1;
|
idc = IDC_actionsText1;
|
||||||
fade = 1;
|
|
||||||
x = QUOTE(0 * GRID_W);
|
x = QUOTE(0 * GRID_W);
|
||||||
y = QUOTE(5 * GRID_H);
|
y = QUOTE(5 * GRID_H);
|
||||||
w = QUOTE(45 * GRID_W);
|
w = QUOTE(45 * GRID_W);
|
||||||
@ -479,8 +478,6 @@ class GVAR(display) {
|
|||||||
};
|
};
|
||||||
class actionsButton1: ctrlButton {
|
class actionsButton1: ctrlButton {
|
||||||
idc = IDC_actionsButton1;
|
idc = IDC_actionsButton1;
|
||||||
onMouseEnter = QUOTE(ctrlSetFocus (_this select 0));
|
|
||||||
fade = 1;
|
|
||||||
text = "";
|
text = "";
|
||||||
x = QUOTE(1 * GRID_W);
|
x = QUOTE(1 * GRID_W);
|
||||||
y = QUOTE(6 * GRID_H);
|
y = QUOTE(6 * GRID_H);
|
||||||
@ -567,6 +564,7 @@ class GVAR(display) {
|
|||||||
colorSelect[] = {1,1,1,1};
|
colorSelect[] = {1,1,1,1};
|
||||||
colorSelect2[] = {1,1,1,1};
|
colorSelect2[] = {1,1,1,1};
|
||||||
colorPictureRightSelected[] = {1,1,1,1};
|
colorPictureRightSelected[] = {1,1,1,1};
|
||||||
|
colorTextRight[] = {0.5, 0.5, 0.5, 0};
|
||||||
onLBSelChanged = QUOTE(_this call FUNC(onSelChangedLeft));
|
onLBSelChanged = QUOTE(_this call FUNC(onSelChangedLeft));
|
||||||
onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick));
|
onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick));
|
||||||
onSetFocus = QUOTE(GVAR(leftTabFocus) = true);
|
onSetFocus = QUOTE(GVAR(leftTabFocus) = true);
|
||||||
@ -597,6 +595,7 @@ class GVAR(display) {
|
|||||||
colorSelect[] = {1,1,1,1};
|
colorSelect[] = {1,1,1,1};
|
||||||
colorSelect2[] = {1,1,1,1};
|
colorSelect2[] = {1,1,1,1};
|
||||||
colorPictureRightSelected[] = {1,1,1,1};
|
colorPictureRightSelected[] = {1,1,1,1};
|
||||||
|
colorTextRight[] = {0.5, 0.5, 0.5, 0};
|
||||||
columns[] = {0.07, 0.15, 0.75};
|
columns[] = {0.07, 0.15, 0.75};
|
||||||
idcLeft = IDC_arrowMinus;
|
idcLeft = IDC_arrowMinus;
|
||||||
idcRIght = IDC_arrowPlus;
|
idcRIght = IDC_arrowPlus;
|
||||||
|
@ -1 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
@ -22,10 +22,10 @@ private _ctrlElevationHigh = _dialog displayCtrl IDC_BUTTON_ELEV_HIGH;
|
|||||||
private _ctrlElevationLow = _dialog displayCtrl IDC_BUTTON_ELEV_LOW;
|
private _ctrlElevationLow = _dialog displayCtrl IDC_BUTTON_ELEV_LOW;
|
||||||
|
|
||||||
GVAR(lastElevationMode) = param [0, GVAR(lastElevationMode)]; // update if passed a new value
|
GVAR(lastElevationMode) = param [0, GVAR(lastElevationMode)]; // update if passed a new value
|
||||||
GVAR(lastCharge) = lbCurSel _ctrlChargeList;
|
GVAR(lastTablePage) = lbCurSel _ctrlChargeList;
|
||||||
|
|
||||||
// get data for currently selected mag/mode combo:
|
// get data for currently selected mag/mode combo:
|
||||||
(GVAR(magModeData) select GVAR(lastCharge)) params [["_muzzleVelocity", -1], ["_airFriction", 0]];
|
(GVAR(magModeData) select GVAR(lastTablePage)) params [["_muzzleVelocity", -1], ["_airFriction", 0]];
|
||||||
private _elevMin = _dialog getVariable [QGVAR(elevMin), 0];
|
private _elevMin = _dialog getVariable [QGVAR(elevMin), 0];
|
||||||
private _elevMax = _dialog getVariable [QGVAR(elevMax), 0];
|
private _elevMax = _dialog getVariable [QGVAR(elevMax), 0];
|
||||||
_ctrlElevationHigh ctrlSetTextColor ([[0.25,0.25,0.25,1],[1,1,1,1]] select GVAR(lastElevationMode));
|
_ctrlElevationHigh ctrlSetTextColor ([[0.25,0.25,0.25,1],[1,1,1,1]] select GVAR(lastElevationMode));
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
#include "initKeybinds.inc.sqf"
|
#include "initKeybinds.inc.sqf"
|
||||||
|
|
||||||
GVAR(active) = false;
|
GVAR(active) = false;
|
||||||
GVAR(initialised) = false;
|
GVAR(initialised) = false;
|
||||||
|
|
||||||
[QEGVAR(vector,rangefinderData), {_this call FUNC(sord)}] call CBA_fnc_addEventHandler;
|
[QEGVAR(vector,rangefinderData), LINKFUNC(sord)] call CBA_fnc_addEventHandler;
|
||||||
|
@ -57,7 +57,7 @@ if (!_isChemlight) then {
|
|||||||
_unit addItem _itemName;
|
_unit addItem _itemName;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then {
|
if (toLowerANSI _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then {
|
||||||
// Hack for dealing with X_IR_Grenade effect not dissapearing on deleteVehicle
|
// Hack for dealing with X_IR_Grenade effect not dissapearing on deleteVehicle
|
||||||
detach _attachedObject;
|
detach _attachedObject;
|
||||||
_attachedObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]);
|
_attachedObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]);
|
||||||
|
@ -3539,6 +3539,7 @@
|
|||||||
<Korean>인공지능 사용</Korean>
|
<Korean>인공지능 사용</Korean>
|
||||||
<French>Utilisation de l'IA</French>
|
<French>Utilisation de l'IA</French>
|
||||||
<Portuguese>Utilização por IA</Portuguese>
|
<Portuguese>Utilização por IA</Portuguese>
|
||||||
|
<Russian>Использование ИИ</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Ballistics_ammoUsageShort_illumination">
|
<Key ID="STR_ACE_Ballistics_ammoUsageShort_illumination">
|
||||||
<English>Illum</English>
|
<English>Illum</English>
|
||||||
@ -3549,6 +3550,7 @@
|
|||||||
<Korean>조명탄</Korean>
|
<Korean>조명탄</Korean>
|
||||||
<French>Fusées éclairantes</French>
|
<French>Fusées éclairantes</French>
|
||||||
<Portuguese>Sinalizadoras</Portuguese>
|
<Portuguese>Sinalizadoras</Portuguese>
|
||||||
|
<Russian>Осветители</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Ballistics_ammoUsageShort_concealment">
|
<Key ID="STR_ACE_Ballistics_ammoUsageShort_concealment">
|
||||||
<English>Smoke</English>
|
<English>Smoke</English>
|
||||||
@ -3559,6 +3561,7 @@
|
|||||||
<Korean>연막탄</Korean>
|
<Korean>연막탄</Korean>
|
||||||
<French>Fumigènes</French>
|
<French>Fumigènes</French>
|
||||||
<Portuguese>Fumígenas</Portuguese>
|
<Portuguese>Fumígenas</Portuguese>
|
||||||
|
<Russian>Дым</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Ballistics_ammoUsageShort_infantry">
|
<Key ID="STR_ACE_Ballistics_ammoUsageShort_infantry">
|
||||||
<English>Inf</English>
|
<English>Inf</English>
|
||||||
@ -3569,6 +3572,7 @@
|
|||||||
<Korean>보병</Korean>
|
<Korean>보병</Korean>
|
||||||
<French>Infanterie</French>
|
<French>Infanterie</French>
|
||||||
<Portuguese>Infantaria</Portuguese>
|
<Portuguese>Infantaria</Portuguese>
|
||||||
|
<Russian>Пехота</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Ballistics_ammoUsageShort_lightVehicle">
|
<Key ID="STR_ACE_Ballistics_ammoUsageShort_lightVehicle">
|
||||||
<English>Veh</English>
|
<English>Veh</English>
|
||||||
@ -3579,6 +3583,7 @@
|
|||||||
<Korean>차량</Korean>
|
<Korean>차량</Korean>
|
||||||
<French>Véhicule</French>
|
<French>Véhicule</French>
|
||||||
<Portuguese>Veículo</Portuguese>
|
<Portuguese>Veículo</Portuguese>
|
||||||
|
<Russian>Техника</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Ballistics_ammoUsageShort_armor">
|
<Key ID="STR_ACE_Ballistics_ammoUsageShort_armor">
|
||||||
<English>Armor</English>
|
<English>Armor</English>
|
||||||
@ -3589,6 +3594,7 @@
|
|||||||
<Korean>기갑</Korean>
|
<Korean>기갑</Korean>
|
||||||
<French>Blindage</French>
|
<French>Blindage</French>
|
||||||
<Portuguese>Blindagem</Portuguese>
|
<Portuguese>Blindagem</Portuguese>
|
||||||
|
<Russian>Бронетехника</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Ballistics_ammoUsageShort_aircraft">
|
<Key ID="STR_ACE_Ballistics_ammoUsageShort_aircraft">
|
||||||
<English>Air</English>
|
<English>Air</English>
|
||||||
@ -3599,6 +3605,7 @@
|
|||||||
<Korean>항공</Korean>
|
<Korean>항공</Korean>
|
||||||
<French>Aviation</French>
|
<French>Aviation</French>
|
||||||
<Portuguese>Aeronaves</Portuguese>
|
<Portuguese>Aeronaves</Portuguese>
|
||||||
|
<Russian>Авиация</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -25,14 +25,14 @@ if (isServer) then {
|
|||||||
};
|
};
|
||||||
|
|
||||||
["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler;
|
["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler;
|
||||||
[QGVAR(moveInCaptive), FUNC(vehicleCaptiveMoveIn)] call CBA_fnc_addEventHandler;
|
[QGVAR(moveInCaptive), LINKFUNC(vehicleCaptiveMoveIn)] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(moveOutCaptive), FUNC(vehicleCaptiveMoveOut)] call CBA_fnc_addEventHandler;
|
[QGVAR(moveOutCaptive), LINKFUNC(vehicleCaptiveMoveOut)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
[QGVAR(setHandcuffed), FUNC(setHandcuffed)] call CBA_fnc_addEventHandler;
|
[QGVAR(setHandcuffed), LINKFUNC(setHandcuffed)] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(setSurrendered), FUNC(setSurrendered)] call CBA_fnc_addEventHandler;
|
[QGVAR(setSurrendered), LINKFUNC(setSurrendered)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
//Medical Integration Events
|
//Medical Integration Events
|
||||||
["ace_unconscious", FUNC(handleOnUnconscious)] call CBA_fnc_addEventHandler;
|
["ace_unconscious", LINKFUNC(handleOnUnconscious)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ if (_isUnconc) then {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
//Woke up: if handcuffed, goto animation
|
//Woke up: if handcuffed, goto animation
|
||||||
if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then {
|
if (_unit getVariable [QGVAR(isHandcuffed), false] && {isNull objectParent _unit}) then {
|
||||||
[_unit] call EFUNC(common,fixLoweredRifleAnimation);
|
[_unit] call EFUNC(common,fixLoweredRifleAnimation);
|
||||||
[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
|
[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
|
||||||
};
|
};
|
||||||
|
@ -145,6 +145,7 @@
|
|||||||
<Polish>Załóż opaskę na oczy</Polish>
|
<Polish>Załóż opaskę na oczy</Polish>
|
||||||
<Korean>포로 눈 가리기</Korean>
|
<Korean>포로 눈 가리기</Korean>
|
||||||
<Japanese>目隠しをする</Japanese>
|
<Japanese>目隠しをする</Japanese>
|
||||||
|
<Russian>Завязать глаза пленному</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Captives_RemoveBlindfoldCaptive">
|
<Key ID="STR_ACE_Captives_RemoveBlindfoldCaptive">
|
||||||
<English>Remove blindfold</English>
|
<English>Remove blindfold</English>
|
||||||
@ -154,6 +155,7 @@
|
|||||||
<Polish>Zdejmij opaskę z oczu</Polish>
|
<Polish>Zdejmij opaskę z oczu</Polish>
|
||||||
<Korean>눈가리개 풀기</Korean>
|
<Korean>눈가리개 풀기</Korean>
|
||||||
<Japanese>目隠しを外す</Japanese>
|
<Japanese>目隠しを外す</Japanese>
|
||||||
|
<Russian>Снять повязку с глаз</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Captives_CableTie">
|
<Key ID="STR_ACE_Captives_CableTie">
|
||||||
<English>Cable Tie</English>
|
<English>Cable Tie</English>
|
||||||
@ -484,7 +486,7 @@
|
|||||||
<Chinesesimp>设置在光标下的单位成俘虏状态。</Chinesesimp>
|
<Chinesesimp>设置在光标下的单位成俘虏状态。</Chinesesimp>
|
||||||
<Korean>커서의 병력을 포박합니다.</Korean>
|
<Korean>커서의 병력을 포박합니다.</Korean>
|
||||||
<Polish>Ustawia jednostkę pod kursorem jako jeniec.</Polish>
|
<Polish>Ustawia jednostkę pod kursorem jako jeniec.</Polish>
|
||||||
<Russian>Арестовывает указанный курсором юнит</Russian>
|
<Russian>Арестовывает указанный курсором юнит.</Russian>
|
||||||
<Portuguese>Torna a unidade sob o cursor um prisioneiro</Portuguese>
|
<Portuguese>Torna a unidade sob o cursor um prisioneiro</Portuguese>
|
||||||
<French>Capture l'unité sous le curseur.</French>
|
<French>Capture l'unité sous le curseur.</French>
|
||||||
<Czech>Nastaví jednotku pod kurzorem jako zajatce.</Czech>
|
<Czech>Nastaví jednotku pod kurzorem jako zajatce.</Czech>
|
||||||
|
@ -22,11 +22,11 @@ private _type = typeOf _vehicle;
|
|||||||
private _config = configOf _vehicle;
|
private _config = configOf _vehicle;
|
||||||
|
|
||||||
// If vehicle had space given to it via eden/public, then override config hasCargo setting
|
// If vehicle had space given to it via eden/public, then override config hasCargo setting
|
||||||
private _hasCargoPublic = _item getVariable QGVAR(hasCargo);
|
private _hasCargoPublic = _vehicle getVariable QGVAR(hasCargo);
|
||||||
private _hasCargoPublicDefined = !isNil "_canLoadPublic";
|
private _hasCargoPublicDefined = !isNil "_canLoadPublic";
|
||||||
|
|
||||||
if (_hasCargoPublicDefined && {!(_hasCargoPublic isEqualType false)}) then {
|
if (_hasCargoPublicDefined && {!(_hasCargoPublic isEqualType false)}) then {
|
||||||
WARNING_4("%1[%2] - Variable %3 is %4 - Should be bool",_item,_type,QGVAR(hasCargo),_hasCargoPublic);
|
WARNING_4("%1[%2] - Variable %3 is %4 - Should be bool",_vehicle,_type,QGVAR(hasCargo),_hasCargoPublic);
|
||||||
};
|
};
|
||||||
|
|
||||||
private _hasCargoConfig = getNumber (_config >> QGVAR(hasCargo)) == 1;
|
private _hasCargoConfig = getNumber (_config >> QGVAR(hasCargo)) == 1;
|
||||||
|
@ -35,6 +35,11 @@
|
|||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_deployObject">
|
<Key ID="STR_ACE_Cargo_deployObject">
|
||||||
<English>Deploy</English>
|
<English>Deploy</English>
|
||||||
|
<Italian>Piazza</Italian>
|
||||||
|
<Russian>Разместить</Russian>
|
||||||
|
<Japanese>配置する</Japanese>
|
||||||
|
<Korean>배치하기</Korean>
|
||||||
|
<French>Déployer</French>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_ScrollAction">
|
<Key ID="STR_ACE_Cargo_ScrollAction">
|
||||||
<English>Raise/Lower | (Ctrl + Scroll) Rotate</English>
|
<English>Raise/Lower | (Ctrl + Scroll) Rotate</English>
|
||||||
@ -61,7 +66,7 @@
|
|||||||
<Italian>Bloccato</Italian>
|
<Italian>Bloccato</Italian>
|
||||||
<German>Blockiert</German>
|
<German>Blockiert</German>
|
||||||
<French>Bloqué</French>
|
<French>Bloqué</French>
|
||||||
<Japanese>取り付け不可</Japanese>
|
<Japanese>配置不可</Japanese>
|
||||||
<Korean>막힘</Korean>
|
<Korean>막힘</Korean>
|
||||||
<Chinesesimp>断开</Chinesesimp>
|
<Chinesesimp>断开</Chinesesimp>
|
||||||
<Chinese>斷開</Chinese>
|
<Chinese>斷開</Chinese>
|
||||||
@ -277,12 +282,20 @@
|
|||||||
<Key ID="STR_ACE_Cargo_LoadingItem">
|
<Key ID="STR_ACE_Cargo_LoadingItem">
|
||||||
<English>Loading %1 into %2...</English>
|
<English>Loading %1 into %2...</English>
|
||||||
<Spanish>Cargando %1 en %2...</Spanish>
|
<Spanish>Cargando %1 en %2...</Spanish>
|
||||||
|
<Italian>Caricando %1 in %2...</Italian>
|
||||||
<Japanese>%1 を %2 に積み込んでいます・・・</Japanese>
|
<Japanese>%1 を %2 に積み込んでいます・・・</Japanese>
|
||||||
|
<Russian>Загружаем %1 в %2...</Russian>
|
||||||
|
<Korean>%1을(를) %2에 싣는 중...</Korean>
|
||||||
|
<French>Chargement %1 dans %2...</French>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_UnloadingItem">
|
<Key ID="STR_ACE_Cargo_UnloadingItem">
|
||||||
<English>Unloading %1 from %2...</English>
|
<English>Unloading %1 from %2...</English>
|
||||||
<Spanish>Descargando %1 de %2...</Spanish>
|
<Spanish>Descargando %1 de %2...</Spanish>
|
||||||
|
<Italian>Scaricando %1 da %2...</Italian>
|
||||||
<Japanese>%1 を %2 から降ろしています・・・</Japanese>
|
<Japanese>%1 を %2 から降ろしています・・・</Japanese>
|
||||||
|
<Russian>Выгружаем %1 из %2...</Russian>
|
||||||
|
<Korean>%1을(를) %2(으)로부터 내리는 중...</Korean>
|
||||||
|
<French>Déchargement %1 de %2...</French>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_LoadingFailed">
|
<Key ID="STR_ACE_Cargo_LoadingFailed">
|
||||||
<English>%1<br/>could not be loaded</English>
|
<English>%1<br/>could not be loaded</English>
|
||||||
@ -323,6 +336,7 @@
|
|||||||
<French>Ne peut pas être déchargé</French>
|
<French>Ne peut pas être déchargé</French>
|
||||||
<Japanese>荷降ろし不可能です</Japanese>
|
<Japanese>荷降ろし不可能です</Japanese>
|
||||||
<Korean>하역할 수가 없습니다</Korean>
|
<Korean>하역할 수가 없습니다</Korean>
|
||||||
|
<Russian>Не может быть выгружен</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_SizeMenu">
|
<Key ID="STR_ACE_Cargo_SizeMenu">
|
||||||
<English>Cargo Size: %1</English>
|
<English>Cargo Size: %1</English>
|
||||||
@ -331,6 +345,7 @@
|
|||||||
<French>Encombrement fret: %1</French>
|
<French>Encombrement fret: %1</French>
|
||||||
<Japanese>貨物のサイズ: %1</Japanese>
|
<Japanese>貨物のサイズ: %1</Japanese>
|
||||||
<Korean>화물 크기: %1</Korean>
|
<Korean>화물 크기: %1</Korean>
|
||||||
|
<Russian>Размер груза: %1</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_customName_edenName">
|
<Key ID="STR_ACE_Cargo_customName_edenName">
|
||||||
<English>Custom Name</English>
|
<English>Custom Name</English>
|
||||||
@ -501,7 +516,7 @@
|
|||||||
<Japanese>貨物の積み込み/積み下ろしに掛かる時間を変更します。\n時間 (秒) は、貨物のサイズにこの値を掛けたものです。</Japanese>
|
<Japanese>貨物の積み込み/積み下ろしに掛かる時間を変更します。\n時間 (秒) は、貨物のサイズにこの値を掛けたものです。</Japanese>
|
||||||
<Polish>Modyfikuje, jak długo zajmuje załadowywanie/wyładowywanie przedmiotów. \nCzasem, w sekundach, jest wielkość przedmiotu razy jego wartość.</Polish>
|
<Polish>Modyfikuje, jak długo zajmuje załadowywanie/wyładowywanie przedmiotów. \nCzasem, w sekundach, jest wielkość przedmiotu razy jego wartość.</Polish>
|
||||||
<Italian>Modifica il tempo impiegato per caricare o scaricare gli oggetti.\nIl tempo, in secondi, equivale alla dimensione dell'oggetto moltiplicata per questo valore</Italian>
|
<Italian>Modifica il tempo impiegato per caricare o scaricare gli oggetti.\nIl tempo, in secondi, equivale alla dimensione dell'oggetto moltiplicata per questo valore</Italian>
|
||||||
<Russian>Изменяет время для загрузки/выгрузки предметов. \n Время (сек) - это размер предмета, умноженный на это значение.</Russian>
|
<Russian>Изменяет время для загрузки/выгрузки предметов. \nВремя (сек) - это размер предмета, умноженный на это значение.</Russian>
|
||||||
<Portuguese>Coeficiente de quanto tempo leva para carregar/descarregar itens.\nTempo, em segundos, é o tamanho do objeto multiplicado por esse valor.</Portuguese>
|
<Portuguese>Coeficiente de quanto tempo leva para carregar/descarregar itens.\nTempo, em segundos, é o tamanho do objeto multiplicado por esse valor.</Portuguese>
|
||||||
<French>Modifie le temps nécessaire pour charger/décharger des objets.\nLe temps, en secondes, est calculé en multipliant la taille de l'élément par ce coefficient.</French>
|
<French>Modifie le temps nécessaire pour charger/décharger des objets.\nLe temps, en secondes, est calculé en multipliant la taille de l'élément par ce coefficient.</French>
|
||||||
<Chinese>修改要花多長時間來裝載/卸載物品。\n時間,以秒為單位,而物品的大小數值與這個係數成比。</Chinese>
|
<Chinese>修改要花多長時間來裝載/卸載物品。\n時間,以秒為單位,而物品的大小數值與這個係數成比。</Chinese>
|
||||||
@ -564,9 +579,19 @@
|
|||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_enableDeploy">
|
<Key ID="STR_ACE_Cargo_enableDeploy">
|
||||||
<English>Enable deploy</English>
|
<English>Enable deploy</English>
|
||||||
|
<Italian>Abilita Piazzamento</Italian>
|
||||||
|
<Russian>Включить размещение</Russian>
|
||||||
|
<Japanese>配置機能を有効化</Japanese>
|
||||||
|
<Korean>배치 활성화</Korean>
|
||||||
|
<French>Permettre le placement</French>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_Cargo_enableDeploy_description">
|
<Key ID="STR_ACE_Cargo_enableDeploy_description">
|
||||||
<English>Controls whether cargo items can be unloaded via the deploy method.</English>
|
<English>Controls whether cargo items can be unloaded via the deploy method.</English>
|
||||||
|
<Italian>Determina se oggetti in carico possono essere scaricati e piazzati direttamente.</Italian>
|
||||||
|
<Russian>Определяет, можно ли выгружать грузы с помощью метода размещения.</Russian>
|
||||||
|
<Japanese>配置機能を介して貨物アイテムを降ろすことが出来るかどうかを制御します。</Japanese>
|
||||||
|
<Korean>배치 방법을 통해 화물 아이템을 내릴 수 있는지 여부를 제어합니다.</Korean>
|
||||||
|
<French>Contrôler si les éléments de cargaison peuvent être déchargés via la méthode de déploiement.</French>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
6
addons/casings/CfgVehicles.hpp
Normal file
6
addons/casings/CfgVehicles.hpp
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
class CfgVehicles {
|
||||||
|
class FxCartridge;
|
||||||
|
class FxCartridge_65_caseless: FxCartridge {
|
||||||
|
GVAR(model) = ""; // note: the vanilla 6.5 caseless don't actually use this, just being safe
|
||||||
|
};
|
||||||
|
};
|
@ -4,4 +4,4 @@ if (!hasInterface || !GVAR(enabled)) exitWith {};
|
|||||||
|
|
||||||
GVAR(cachedCasings) = createHashMap;
|
GVAR(cachedCasings) = createHashMap;
|
||||||
GVAR(casings) = [];
|
GVAR(casings) = [];
|
||||||
["CAManBase", "FiredMan", {call FUNC(createCasing)}] call CBA_fnc_addClassEventHandler;
|
["CAManBase", "FiredMan", LINKFUNC(createCasing)] call CBA_fnc_addClassEventHandler;
|
||||||
|
@ -15,3 +15,4 @@ class CfgPatches {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#include "CfgEventHandlers.hpp"
|
#include "CfgEventHandlers.hpp"
|
||||||
|
#include "CfgVehicles.hpp"
|
||||||
|
@ -20,31 +20,30 @@ params ["_unit", "", "", "", "_ammo"];
|
|||||||
|
|
||||||
if (!isNull objectParent _unit) exitWith {};
|
if (!isNull objectParent _unit) exitWith {};
|
||||||
|
|
||||||
private _modelPath = GVAR(cachedCasings) get _ammo;
|
|
||||||
|
|
||||||
if (isNil "_modelPath") then {
|
private _modelPath = GVAR(cachedCasings) getOrDefaultCall [_ammo, {
|
||||||
private _cartridge = getText (configFile >> "CfgAmmo" >> _ammo >> "cartridge");
|
private _cartridge = getText (configFile >> "CfgAmmo" >> _ammo >> "cartridge");
|
||||||
//Default cartridge is a 5.56mm model
|
if (_cartridge == "") then { // return (note: can't use exitWith)
|
||||||
_modelPath = switch (_cartridge) do {
|
""
|
||||||
case "FxCartridge_9mm": { "A3\Weapons_f\ammo\cartridge_small.p3d" };
|
} else {
|
||||||
case "FxCartridge_65": { "A3\weapons_f\ammo\cartridge_65.p3d" };
|
private _cartridgeConfig = configFile >> "CfgVehicles" >> _cartridge;
|
||||||
case "FxCartridge_762": { "A3\weapons_f\ammo\cartridge_762.p3d" };
|
|
||||||
case "FxCartridge_762x39": { "A3\weapons_f_enoch\ammo\cartridge_762x39.p3d" };
|
// if explicitly defined, use ACE's config
|
||||||
case "FxCartridge_93x64_Ball": { "A3\Weapons_F_Mark\Ammo\cartridge_93x64.p3d" };
|
if (isText (_cartridgeConfig >> QGVAR(model))) exitWith {
|
||||||
case "FxCartridge_338_Ball": { "A3\Weapons_F_Mark\Ammo\cartridge_338_LM.p3d" };
|
getText (_cartridgeConfig >> QGVAR(model))
|
||||||
case "FxCartridge_338_NM": { "A3\Weapons_F_Mark\Ammo\cartridge_338_NM.p3d" };
|
};
|
||||||
case "FxCartridge_127": { "A3\weapons_f\ammo\cartridge_127.p3d" };
|
// use casing's default model
|
||||||
case "FxCartridge_127x54": { "A3\Weapons_F_Mark\Ammo\cartridge_127x54.p3d" };
|
private _model = getText (_cartridgeConfig >> "model");
|
||||||
case "FxCartridge_slug": { "A3\weapons_f\ammo\cartridge_slug.p3d" };
|
if ("a3\weapons_f\empty" in toLowerANSI _model) exitWith { "" };
|
||||||
case "FxCartridge_12Gauge_HE_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_he_lxws.p3d" };
|
|
||||||
case "FxCartridge_12Gauge_Slug_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_slug_lxws.p3d" };
|
// Add file extension if missing (fileExists needs file extension)
|
||||||
case "FxCartridge_12Gauge_Smoke_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_smoke_lxws.p3d" };
|
if ((_model select [count _model - 4]) != ".p3d") then {
|
||||||
case "FxCartridge_12Gauge_Pellet_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_pellet_lxws.p3d" };
|
_model = _model + ".p3d";
|
||||||
case "": { "" };
|
};
|
||||||
default { "A3\Weapons_f\ammo\cartridge.p3d" };
|
|
||||||
|
["", _model] select (fileExists _model)
|
||||||
};
|
};
|
||||||
GVAR(cachedCasings) set [_ammo, _modelPath];
|
}, true];
|
||||||
};
|
|
||||||
|
|
||||||
if (_modelPath isEqualTo "") exitWith {};
|
if (_modelPath isEqualTo "") exitWith {};
|
||||||
|
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
["ace_firedPlayer", DFUNC(throwEH)] call CBA_fnc_addEventHandler;
|
["ace_firedPlayer", LINKFUNC(throwEH)] call CBA_fnc_addEventHandler;
|
||||||
// ["ace_firedPlayerNonLocal", DFUNC(throwEH)] call CBA_fnc_addEventHandler;
|
// ["ace_firedPlayerNonLocal", LINKFUNC(throwEH)] call CBA_fnc_addEventHandler;
|
||||||
// ["ace_firedNonPlayer", DFUNC(throwEH)] call CBA_fnc_addEventHandler;
|
// ["ace_firedNonPlayer", LINKFUNC(throwEH)] call CBA_fnc_addEventHandler;
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
class CfgMovesBasic {
|
class CfgMovesBasic {
|
||||||
class Default;
|
// Idle affects legs when weapon switching - fixes units sliding when holstering weapons
|
||||||
|
class Default {
|
||||||
|
idle = "";
|
||||||
|
};
|
||||||
|
|
||||||
// From ACRE
|
// From ACRE
|
||||||
class ManActions {
|
class ManActions {
|
||||||
GVAR(stop) = QGVAR(stop);
|
GVAR(stop) = QGVAR(stop);
|
||||||
|
@ -13,6 +13,7 @@ PREP(addLineToDebugDraw);
|
|||||||
PREP(addSwayFactor);
|
PREP(addSwayFactor);
|
||||||
PREP(addToInventory);
|
PREP(addToInventory);
|
||||||
PREP(addWeapon);
|
PREP(addWeapon);
|
||||||
|
PREP(adjustMagazineAmmo);
|
||||||
PREP(assignedItemFix);
|
PREP(assignedItemFix);
|
||||||
PREP(assignObjectsInList);
|
PREP(assignObjectsInList);
|
||||||
PREP(ambientBrightness);
|
PREP(ambientBrightness);
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
//Status Effect EHs:
|
//Status Effect EHs:
|
||||||
[QGVAR(setStatusEffect), {_this call FUNC(statusEffect_set)}] call CBA_fnc_addEventHandler;
|
[QGVAR(setStatusEffect), LINKFUNC(statusEffect_set)] call CBA_fnc_addEventHandler;
|
||||||
["forceWalk", false, ["ace_advanced_fatigue", "ACE_SwitchUnits", "ACE_Attach", "ace_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_Sandbag", "ACE_refuel", "ACE_rearm", "ACE_Trenches", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
|
["forceWalk", false, ["ace_advanced_fatigue", "ACE_SwitchUnits", "ACE_Attach", "ace_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_Sandbag", "ACE_refuel", "ACE_rearm", "ACE_Trenches", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
|
||||||
["blockSprint", false, ["ace_advanced_fatigue", "ace_dragging", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
|
["blockSprint", false, ["ace_advanced_fatigue", "ace_dragging", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
|
||||||
["setCaptive", true, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered)]] call FUNC(statusEffect_addType);
|
["setCaptive", true, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered)]] call FUNC(statusEffect_addType);
|
||||||
@ -145,8 +145,7 @@ if (isServer) then {
|
|||||||
INFO_3("[%1] DC - Was Zeus [%2] while controlling unit [%3] - manually clearing `bis_fnc_moduleRemoteControl_owner`",[_x] call FUNC(getName),_dcPlayer,_x);
|
INFO_3("[%1] DC - Was Zeus [%2] while controlling unit [%3] - manually clearing `bis_fnc_moduleRemoteControl_owner`",[_x] call FUNC(getName),_dcPlayer,_x);
|
||||||
_x setVariable ["bis_fnc_moduleRemoteControl_owner", nil, true];
|
_x setVariable ["bis_fnc_moduleRemoteControl_owner", nil, true];
|
||||||
};
|
};
|
||||||
nil
|
} forEach (curatorEditableObjects _zeusLogic);
|
||||||
} count (curatorEditableObjects _zeusLogic);
|
|
||||||
};
|
};
|
||||||
}];
|
}];
|
||||||
};
|
};
|
||||||
@ -157,9 +156,9 @@ if (isServer) then {
|
|||||||
INFO_2("Headbug Used: Name: %1, Animation: %2",_profileName,_animation);
|
INFO_2("Headbug Used: Name: %1, Animation: %2",_profileName,_animation);
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
[QGVAR(fixCollision), FUNC(fixCollision)] call CBA_fnc_addEventHandler;
|
[QGVAR(fixCollision), LINKFUNC(fixCollision)] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(fixFloating), FUNC(fixFloating)] call CBA_fnc_addEventHandler;
|
[QGVAR(fixFloating), LINKFUNC(fixFloating)] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(fixPosition), FUNC(fixPosition)] call CBA_fnc_addEventHandler;
|
[QGVAR(fixPosition), LINKFUNC(fixPosition)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
["ace_loadPersonEvent", LINKFUNC(loadPersonLocal)] call CBA_fnc_addEventHandler;
|
["ace_loadPersonEvent", LINKFUNC(loadPersonLocal)] call CBA_fnc_addEventHandler;
|
||||||
["ace_unloadPersonEvent", LINKFUNC(unloadPersonLocal)] call CBA_fnc_addEventHandler;
|
["ace_unloadPersonEvent", LINKFUNC(unloadPersonLocal)] call CBA_fnc_addEventHandler;
|
||||||
@ -209,8 +208,8 @@ if (isServer) then {
|
|||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
// Request framework
|
// Request framework
|
||||||
[QGVAR(requestCallback), FUNC(requestCallback)] call CBA_fnc_addEventHandler;
|
[QGVAR(requestCallback), LINKFUNC(requestCallback)] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(receiveRequest), FUNC(receiveRequest)] call CBA_fnc_addEventHandler;
|
[QGVAR(receiveRequest), LINKFUNC(receiveRequest)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
[QGVAR(systemChatGlobal), {systemChat _this}] call CBA_fnc_addEventHandler;
|
[QGVAR(systemChatGlobal), {systemChat _this}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
@ -219,7 +218,7 @@ if (isServer) then {
|
|||||||
[QGVAR(enableSimulationGlobal), {(_this select 0) enableSimulationGlobal (_this select 1)}] call CBA_fnc_addEventHandler;
|
[QGVAR(enableSimulationGlobal), {(_this select 0) enableSimulationGlobal (_this select 1)}] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(setShotParents), {(_this select 0) setShotParents [_this select 1, _this select 2]}] call CBA_fnc_addEventHandler;
|
[QGVAR(setShotParents), {(_this select 0) setShotParents [_this select 1, _this select 2]}] call CBA_fnc_addEventHandler;
|
||||||
["ace_setOwner", {(_this select 0) setOwner (_this select 1)}] call CBA_fnc_addEventHandler;
|
["ace_setOwner", {(_this select 0) setOwner (_this select 1)}] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(serverLog), FUNC(serverLog)] call CBA_fnc_addEventHandler;
|
[QGVAR(serverLog), LINKFUNC(serverLog)] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(claimSafe), LINKFUNC(claimSafeServer)] call CBA_fnc_addEventHandler;
|
[QGVAR(claimSafe), LINKFUNC(claimSafeServer)] call CBA_fnc_addEventHandler;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -236,14 +235,14 @@ if (!isServer) then {
|
|||||||
["ACEa", [player]] call CBA_fnc_serverEvent;
|
["ACEa", [player]] call CBA_fnc_serverEvent;
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
} else {
|
} else {
|
||||||
["ACEa", FUNC(_handleRequestAllSyncedEvents)] call CBA_fnc_addEventHandler;
|
["ACEa", LINKFUNC(_handleRequestAllSyncedEvents)] call CBA_fnc_addEventHandler;
|
||||||
};
|
};
|
||||||
|
|
||||||
["ACEe", FUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
|
["ACEe", LINKFUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
|
||||||
["ACEs", FUNC(_handleRequestSyncedEvent)] call CBA_fnc_addEventHandler;
|
["ACEs", LINKFUNC(_handleRequestSyncedEvent)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
if (isServer) then {
|
if (isServer) then {
|
||||||
[FUNC(syncedEventPFH), 0.5, []] call CBA_fnc_addPerFrameHandler;
|
[LINKFUNC(syncedEventPFH), 0.5, []] call CBA_fnc_addPerFrameHandler;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -361,7 +360,7 @@ addMissionEventHandler ["PlayerViewChanged", {
|
|||||||
private _position = [player] call FUNC(getUavControlPosition);
|
private _position = [player] call FUNC(getUavControlPosition);
|
||||||
private _seatAI = objNull;
|
private _seatAI = objNull;
|
||||||
private _turret = [];
|
private _turret = [];
|
||||||
switch (toLower _position) do {
|
switch (toLowerANSI _position) do {
|
||||||
case (""): {
|
case (""): {
|
||||||
_UAV = objNull; // set to objNull if not actively controlling
|
_UAV = objNull; // set to objNull if not actively controlling
|
||||||
};
|
};
|
||||||
@ -392,8 +391,8 @@ addMissionEventHandler ["PlayerViewChanged", {
|
|||||||
// Eventhandlers for player controlled machines
|
// Eventhandlers for player controlled machines
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
[QGVAR(displayTextStructured), {_this call FUNC(displayTextStructured)}] call CBA_fnc_addEventHandler;
|
[QGVAR(displayTextStructured), LINKFUNC(displayTextStructured)] call CBA_fnc_addEventHandler;
|
||||||
[QGVAR(displayTextPicture), {_this call FUNC(displayTextPicture)}] call CBA_fnc_addEventHandler;
|
[QGVAR(displayTextPicture), LINKFUNC(displayTextPicture)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
["ace_unconscious", {
|
["ace_unconscious", {
|
||||||
params ["_unit", "_isUnconscious"];
|
params ["_unit", "_isUnconscious"];
|
||||||
@ -403,7 +402,7 @@ addMissionEventHandler ["PlayerViewChanged", {
|
|||||||
};
|
};
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
["ace_useItem", DFUNC(useItem)] call CBA_fnc_addEventHandler;
|
["ace_useItem", LINKFUNC(useItem)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
@ -499,10 +498,24 @@ GVAR(reloadMutex_lastMagazines) = [];
|
|||||||
// Start the sway loop
|
// Start the sway loop
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
["CBA_settingsInitialized", {
|
["CBA_settingsInitialized", {
|
||||||
|
["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 FUNC(addSwayFactor);
|
||||||
|
|
||||||
[{
|
[{
|
||||||
// frame after settingsInitialized to ensure all other addons have added their factors
|
// frame after settingsInitialized to ensure all other addons have added their factors
|
||||||
if ((GVAR(swayFactorsBaseline) + GVAR(swayFactorsMultiplier)) isNotEqualTo []) then {
|
if (GVAR(enableSway)) then {
|
||||||
call FUNC(swayLoop)
|
call FUNC(swayLoop);
|
||||||
};
|
};
|
||||||
// check for pre-3.16 sway factors being added
|
// check for pre-3.16 sway factors being added
|
||||||
if (!isNil {missionNamespace getVariable "ACE_setCustomAimCoef"}) then {
|
if (!isNil {missionNamespace getVariable "ACE_setCustomAimCoef"}) then {
|
||||||
|
@ -13,7 +13,7 @@ private _allPatches = "(configName _x) select [0,3] == 'ace'" configClasses (con
|
|||||||
// Get all units[]
|
// Get all units[]
|
||||||
private _allUnits = [];
|
private _allUnits = [];
|
||||||
{
|
{
|
||||||
_allUnits append ((getArray (_x >> "units")) apply { toLower _x });
|
_allUnits append ((getArray (_x >> "units")) apply { toLowerANSI _x });
|
||||||
} forEach _allPatches;
|
} forEach _allPatches;
|
||||||
{
|
{
|
||||||
private _class = configFile >> "CfgVehicles" >> _x;
|
private _class = configFile >> "CfgVehicles" >> _x;
|
||||||
@ -31,7 +31,7 @@ private _allUnits = [];
|
|||||||
// Get all weapons[]
|
// Get all weapons[]
|
||||||
private _allWeapons = [];
|
private _allWeapons = [];
|
||||||
{
|
{
|
||||||
_allWeapons append ((getArray (_x >> "weapons")) apply { toLower _x });
|
_allWeapons append ((getArray (_x >> "weapons")) apply { toLowerANSI _x });
|
||||||
} forEach _allPatches;
|
} forEach _allPatches;
|
||||||
{
|
{
|
||||||
private _class = configFile >> "CfgWeapons" >> _x;
|
private _class = configFile >> "CfgWeapons" >> _x;
|
||||||
@ -50,7 +50,7 @@ private _allWeapons = [];
|
|||||||
private _vics = "(configName _x) select [0,3] == 'ace'" configClasses (configFile >> "CfgVehicles");
|
private _vics = "(configName _x) select [0,3] == 'ace'" configClasses (configFile >> "CfgVehicles");
|
||||||
{
|
{
|
||||||
if (((getNumber (_x >> "scope")) == 2) || {((getNumber (_x >> "scopeCurator")) == 2)}) then {
|
if (((getNumber (_x >> "scope")) == 2) || {((getNumber (_x >> "scopeCurator")) == 2)}) then {
|
||||||
if (!((toLower configName _x) in _allUnits)) then {
|
if (!((toLowerANSI configName _x) in _allUnits)) then {
|
||||||
WARNING_2("Not in any units[] - %1 from %2",configName _x,configSourceMod _x);
|
WARNING_2("Not in any units[] - %1 from %2",configName _x,configSourceMod _x);
|
||||||
_testPass = false;
|
_testPass = false;
|
||||||
};
|
};
|
||||||
@ -60,9 +60,9 @@ private _vics = "(configName _x) select [0,3] == 'ace'" configClasses (configFil
|
|||||||
// Check if all public weapons are defined in a cfgPatch
|
// Check if all public weapons are defined in a cfgPatch
|
||||||
private _weapons = "(configName _x) select [0,3] == 'ace'" configClasses (configFile >> "CfgWeapons");
|
private _weapons = "(configName _x) select [0,3] == 'ace'" configClasses (configFile >> "CfgWeapons");
|
||||||
{
|
{
|
||||||
private _type = toLower configName _x;
|
private _type = toLowerANSI configName _x;
|
||||||
if (((getNumber (_x >> "scope")) == 2) || {((getNumber (_x >> "scopeCurator")) == 2)}) then {
|
if (((getNumber (_x >> "scope")) == 2) || {((getNumber (_x >> "scopeCurator")) == 2)}) then {
|
||||||
if (!((toLower configName _x) in _allWeapons)) then {
|
if (!((toLowerANSI configName _x) in _allWeapons)) then {
|
||||||
WARNING_2("Not in any weapons[] - %1 from %2",configName _x,configSourceMod _x);
|
WARNING_2("Not in any weapons[] - %1 from %2",configName _x,configSourceMod _x);
|
||||||
_testPass = false;
|
_testPass = false;
|
||||||
};
|
};
|
||||||
|
@ -14,7 +14,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
|
|||||||
private _glassesConfig = configFile >> "CfgGlasses" >> _name;
|
private _glassesConfig = configFile >> "CfgGlasses" >> _name;
|
||||||
if (((!isClass _weaponConfig) || {(getNumber (_weaponConfig >> "type")) in [1,2,4]}) && {!isClass _glassesConfig}) then {
|
if (((!isClass _weaponConfig) || {(getNumber (_weaponConfig >> "type")) in [1,2,4]}) && {!isClass _glassesConfig}) then {
|
||||||
diag_log text format ["%1 -> TransportItems -> %2 = Bad", _vehType, _name];
|
diag_log text format ["%1 -> TransportItems -> %2 = Bad", _vehType, _name];
|
||||||
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
|
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} forEach (configProperties [_x >> "TransportItems", "isClass _x", true]);
|
} forEach (configProperties [_x >> "TransportItems", "isClass _x", true]);
|
||||||
@ -23,7 +23,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
|
|||||||
private _weaponConfig = configFile >> "CfgWeapons" >> _name;
|
private _weaponConfig = configFile >> "CfgWeapons" >> _name;
|
||||||
if ((!isClass _weaponConfig) || {!((getNumber (_weaponConfig >> "type")) in [1,2,4])}) then {
|
if ((!isClass _weaponConfig) || {!((getNumber (_weaponConfig >> "type")) in [1,2,4])}) then {
|
||||||
diag_log text format ["%1 -> TransportWeapons -> %2 = Bad", _vehType, _name];
|
diag_log text format ["%1 -> TransportWeapons -> %2 = Bad", _vehType, _name];
|
||||||
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
|
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
|
||||||
};
|
};
|
||||||
} forEach (configProperties [_x >> "TransportWeapons", "isClass _x", true]);
|
} forEach (configProperties [_x >> "TransportWeapons", "isClass _x", true]);
|
||||||
{
|
{
|
||||||
@ -31,7 +31,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
|
|||||||
private _magConfig = configFile >> "CfgMagazines" >> _name;
|
private _magConfig = configFile >> "CfgMagazines" >> _name;
|
||||||
if ((!isClass _magConfig)) then {
|
if ((!isClass _magConfig)) then {
|
||||||
diag_log text format ["%1 -> TransportMagazines -> %2 = Bad", _vehType, _name];
|
diag_log text format ["%1 -> TransportMagazines -> %2 = Bad", _vehType, _name];
|
||||||
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
|
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
|
||||||
};
|
};
|
||||||
} forEach (configProperties [_x >> "TransportMagazines", "isClass _x", true]);
|
} forEach (configProperties [_x >> "TransportMagazines", "isClass _x", true]);
|
||||||
{
|
{
|
||||||
@ -39,7 +39,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
|
|||||||
private _vehConfig = configFile >> "CfgVehicles" >> _name;
|
private _vehConfig = configFile >> "CfgVehicles" >> _name;
|
||||||
if ((!isClass _vehConfig)) then {
|
if ((!isClass _vehConfig)) then {
|
||||||
diag_log text format ["%1 -> TransportBackpacks -> %2 = Bad", _vehType, _name];
|
diag_log text format ["%1 -> TransportBackpacks -> %2 = Bad", _vehType, _name];
|
||||||
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
|
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
|
||||||
};
|
};
|
||||||
} forEach (configProperties [_x >> "TransportBackpacks", "isClass _x", true]);
|
} forEach (configProperties [_x >> "TransportBackpacks", "isClass _x", true]);
|
||||||
} forEach _vehicles;
|
} forEach _vehicles;
|
||||||
|
@ -43,8 +43,7 @@ if (isServer) then {
|
|||||||
{
|
{
|
||||||
_x params ["", "_eventArgs","_ttl"];
|
_x params ["", "_eventArgs","_ttl"];
|
||||||
[_eventName, _eventArgs, _ttl] call FUNC(_handleSyncedEvent);
|
[_eventName, _eventArgs, _ttl] call FUNC(_handleSyncedEvent);
|
||||||
false
|
} forEach _eventLog;
|
||||||
} count _eventLog;
|
|
||||||
|
|
||||||
INFO_1("[%1] synchronized",_eventName);
|
INFO_1("[%1] synchronized",_eventName);
|
||||||
};
|
};
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
params ["_conditionName", "_conditionFunc"];
|
params ["_conditionName", "_conditionFunc"];
|
||||||
|
|
||||||
_conditionName = toLower _conditionName;
|
_conditionName = toLowerANSI _conditionName;
|
||||||
|
|
||||||
private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]];
|
private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]];
|
||||||
_conditions params ["_conditionNames", "_conditionFuncs"];
|
_conditions params ["_conditionNames", "_conditionFuncs"];
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
params ["_type", "_code", "_id"];
|
params ["_type", "_code", "_id"];
|
||||||
|
|
||||||
_type = toLower _type;
|
_type = toLowerANSI _type;
|
||||||
|
|
||||||
if !(_type in ["baseline", "multiplier"]) exitWith { ERROR_2("%1-%2 type unsupported",_type,_id); false };
|
if !(_type in ["baseline", "multiplier"]) exitWith { ERROR_2("%1-%2 type unsupported",_type,_id); false };
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ if (_name in GVAR(syncedEvents)) exitWith {
|
|||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
private _eventId = [_name, FUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
|
private _eventId = [_name, LINKFUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
|
||||||
private _data = [_handler, [], _ttl, _eventId];
|
private _data = [_handler, [], _ttl, _eventId];
|
||||||
|
|
||||||
GVAR(syncedEvents) set [_name, _data];
|
GVAR(syncedEvents) set [_name, _data];
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
/*
|
/*
|
||||||
* Author: Garth 'L-H' de Wet
|
* Author: Garth 'L-H' de Wet
|
||||||
* Adds an item, weapon, or magazine to the unit's inventory or places it in a weaponHolder if no space.
|
* Adds an item, weapon, or magazine to the unit's inventory or places it in a weapon holder if no space.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: Unit <OBJECT>
|
* 0: Unit <OBJECT>
|
||||||
@ -11,10 +11,10 @@
|
|||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: Added to player <BOOL>
|
* 0: Added to player <BOOL>
|
||||||
* 1: weaponholder <OBJECT>
|
* 1: Weapon holder item was placed in <OBJECT>
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* [bob, "classname", "", 5] call ace_common_fnc_addToInventory
|
* [player, "30Rnd_65x39_caseless_mag", "", 5] call ace_common_fnc_addToInventory
|
||||||
*
|
*
|
||||||
* Public: Yes
|
* Public: Yes
|
||||||
*/
|
*/
|
||||||
@ -26,6 +26,7 @@ private _type = _classname call FUNC(getItemType);
|
|||||||
private _canAdd = false;
|
private _canAdd = false;
|
||||||
private _canFitWeaponSlot = false;
|
private _canFitWeaponSlot = false;
|
||||||
private _addedToUnit = false;
|
private _addedToUnit = false;
|
||||||
|
private _weaponHolder = _unit;
|
||||||
|
|
||||||
switch (_container) do {
|
switch (_container) do {
|
||||||
case "vest": {
|
case "vest": {
|
||||||
@ -94,11 +95,13 @@ switch (_type select 0) do {
|
|||||||
} else {
|
} else {
|
||||||
_addedToUnit = false;
|
_addedToUnit = false;
|
||||||
|
|
||||||
private _pos = _unit modelToWorldVisual [0,1,0.05];
|
_weaponHolder = nearestObject [_unit, "WeaponHolder"];
|
||||||
|
|
||||||
_unit = createVehicle ["WeaponHolder_Single_F", _pos, [], 0, "NONE"];
|
if (isNull _weaponHolder || {_unit distance _weaponHolder > 2}) then {
|
||||||
_unit addWeaponCargoGlobal [_classname, 1];
|
_weaponHolder = createVehicle ["GroundWeaponHolder", _unit, [], 0, "CAN_COLLIDE"];
|
||||||
_unit setPosATL _pos;
|
};
|
||||||
|
|
||||||
|
_weaponHolder addWeaponCargoGlobal [_classname, 1];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -112,13 +115,13 @@ switch (_type select 0) do {
|
|||||||
|
|
||||||
switch (_container) do {
|
switch (_container) do {
|
||||||
case "vest": {
|
case "vest": {
|
||||||
_unit addItemToVest _classname; //@todo Bug! A full magazine, ignoring ammo. No such command.
|
(vestContainer _unit) addMagazineAmmoCargo [_classname, 1, _ammoCount];
|
||||||
};
|
};
|
||||||
case "backpack": {
|
case "backpack": {
|
||||||
_unit addItemToBackpack _classname; //@todo Bug! A full magazine, ignoring ammo. No such command.
|
(backpackContainer _unit) addMagazineAmmoCargo [_classname, 1, _ammoCount];
|
||||||
};
|
};
|
||||||
case "uniform": {
|
case "uniform": {
|
||||||
_unit addItemToUniform _classname; //@todo Bug! A full magazine, ignoring ammo. No such command.
|
(uniformContainer _unit) addMagazineAmmoCargo [_classname, 1, _ammoCount];
|
||||||
};
|
};
|
||||||
default {
|
default {
|
||||||
_unit addMagazine [_classname, _ammoCount];
|
_unit addMagazine [_classname, _ammoCount];
|
||||||
@ -127,11 +130,13 @@ switch (_type select 0) do {
|
|||||||
} else {
|
} else {
|
||||||
_addedToUnit = false;
|
_addedToUnit = false;
|
||||||
|
|
||||||
private _pos = _unit modelToWorldVisual [0,1,0.05];
|
_weaponHolder = nearestObject [_unit, "WeaponHolder"];
|
||||||
|
|
||||||
_unit = createVehicle ["WeaponHolder_Single_F", _pos, [], 0, "NONE"];
|
if (isNull _weaponHolder || {_unit distance _weaponHolder > 2}) then {
|
||||||
_unit addMagazineCargoGlobal [_classname, 1/*_ammoCount*/]; //@todo Bug! This isn't really the ammo, but magazine count. No such command.
|
_weaponHolder = createVehicle ["GroundWeaponHolder", _unit, [], 0, "CAN_COLLIDE"];
|
||||||
_unit setPosATL _pos;
|
};
|
||||||
|
|
||||||
|
_weaponHolder addMagazineAmmoCargo [_classname, 1, _ammoCount];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -156,11 +161,13 @@ switch (_type select 0) do {
|
|||||||
} else {
|
} else {
|
||||||
_addedToUnit = false;
|
_addedToUnit = false;
|
||||||
|
|
||||||
private _pos = _unit modelToWorldVisual [0,1,0.05];
|
_weaponHolder = nearestObject [_unit, "WeaponHolder"];
|
||||||
|
|
||||||
_unit = createVehicle ["WeaponHolder_Single_F", _pos, [], 0, "NONE"];
|
if (isNull _weaponHolder || {_unit distance _weaponHolder > 2}) then {
|
||||||
_unit addItemCargoGlobal [_classname, 1];
|
_weaponHolder = createVehicle ["GroundWeaponHolder", _unit, [], 0, "CAN_COLLIDE"];
|
||||||
_unit setPosATL _pos;
|
};
|
||||||
|
|
||||||
|
_weaponHolder addItemCargoGlobal [_classname, 1];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -170,4 +177,4 @@ switch (_type select 0) do {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
[_addedToUnit, _unit]
|
[_addedToUnit, _weaponHolder]
|
||||||
|
107
addons/common/functions/fnc_adjustMagazineAmmo.sqf
Normal file
107
addons/common/functions/fnc_adjustMagazineAmmo.sqf
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
/*
|
||||||
|
* Author: Katalam, Blue, Brett Mayson, johnb43
|
||||||
|
* Handle adjusting a magazine's ammo
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Vehicle or Unit <OBJECT>
|
||||||
|
* 1: Item <STRING>
|
||||||
|
* 2: Ammo to adjust by <NUMBER> (default: -1)
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* How much the ammo was adjusted by <NUMBER>
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [player, "30Rnd_556x45_Stanag", 1] call ace_common_fnc_adjustMagazineAmmo;
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
|
||||||
|
params ["_unit", "_magazine", ["_count", -1]];
|
||||||
|
|
||||||
|
if (_count == 0) exitWith {0};
|
||||||
|
|
||||||
|
private _containers = if (_unit isKindOf "CAManBase") then {
|
||||||
|
[uniformContainer _unit, vestContainer _unit, backpackContainer _unit]
|
||||||
|
} else {
|
||||||
|
[_unit]
|
||||||
|
};
|
||||||
|
|
||||||
|
scopeName "main";
|
||||||
|
|
||||||
|
private _originalCount = _count;
|
||||||
|
private _container = objNull;
|
||||||
|
private _magazinesContainer = [];
|
||||||
|
private _newAmmoCount = 0;
|
||||||
|
private _removeAmmo = _count < 0;
|
||||||
|
private _maxMagazineAmmo = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count");
|
||||||
|
|
||||||
|
{
|
||||||
|
_container = _x;
|
||||||
|
|
||||||
|
// Get all magazines of _magazine type
|
||||||
|
_magazinesContainer = (magazinesAmmoCargo _container) select {_x select 0 == _magazine};
|
||||||
|
|
||||||
|
// Get the ammo count, filter out magazines with 0 ammo
|
||||||
|
_magazinesContainer = (_magazinesContainer apply {_x select 1}) select {_x != 0};
|
||||||
|
|
||||||
|
// If there are none, skip to next container
|
||||||
|
if (_magazinesContainer isEqualTo []) then {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Sort, smallest first when removing, largest first when adding
|
||||||
|
_magazinesContainer sort _removeAmmo;
|
||||||
|
|
||||||
|
if (_removeAmmo) then {
|
||||||
|
{
|
||||||
|
_count = _x + _count;
|
||||||
|
|
||||||
|
_container addMagazineAmmoCargo [_magazine, -1, _x];
|
||||||
|
|
||||||
|
if (_count >= 0) then {
|
||||||
|
// Only add magazine back if it's not empty
|
||||||
|
if (_count != 0) then {
|
||||||
|
_container addMagazineAmmoCargo [_magazine, 1, _count];
|
||||||
|
};
|
||||||
|
|
||||||
|
_originalCount breakOut "main";
|
||||||
|
};
|
||||||
|
} forEach _magazinesContainer;
|
||||||
|
} else {
|
||||||
|
// This loop only fills up partially filled magazines
|
||||||
|
{
|
||||||
|
// Fill the magazine to either its max or until all ammo has been added
|
||||||
|
_newAmmoCount = (_x + _count) min _maxMagazineAmmo;
|
||||||
|
|
||||||
|
if (_newAmmoCount <= _maxMagazineAmmo) then {
|
||||||
|
_container addMagazineAmmoCargo [_magazine, -1, _x];
|
||||||
|
_container addMagazineAmmoCargo [_magazine, 1, _newAmmoCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove the ammo that was added
|
||||||
|
_count = _count - (_newAmmoCount - _x);
|
||||||
|
|
||||||
|
if (_count <= 0) then {
|
||||||
|
_originalCount breakOut "main";
|
||||||
|
};
|
||||||
|
} forEach (_magazinesContainer select {_x < _maxMagazineAmmo});
|
||||||
|
};
|
||||||
|
} forEach _containers;
|
||||||
|
|
||||||
|
// If there is still remaining ammo to add, try add it after having iterated through all containers
|
||||||
|
if (!_removeAmmo && _count > 0) then {
|
||||||
|
{
|
||||||
|
while {_count > 0 && {_x canAdd [_magazine, 1/* 2.18 , true*/]}} do {
|
||||||
|
_x addMagazineAmmoCargo [_magazine, 1, _count];
|
||||||
|
|
||||||
|
_count = _count - _maxMagazineAmmo;
|
||||||
|
};
|
||||||
|
} forEach _containers;
|
||||||
|
|
||||||
|
if (_count <= 0) then {
|
||||||
|
_originalCount breakOut "main";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
_originalCount - _count
|
@ -28,18 +28,13 @@ if (_list isEqualType "") then {
|
|||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
if (!isNil "_x") then {
|
if (!isNil "_x" && {_x isEqualType objNull} && {local _x}) then {
|
||||||
if (_x isEqualType objNull) then {
|
if (_vehicle) then {
|
||||||
if (local _x) then {
|
(vehicle _x) setVariable [_variable, _setting, _global];
|
||||||
if (_vehicle) then {
|
TRACE_6("Set variable vehicle",_x,vehicle _x,typeOf (vehicle _x),_variable,_setting,_global);
|
||||||
(vehicle _x) setVariable [_variable, _setting, _global];
|
} else {
|
||||||
TRACE_6("Set variable vehicle",_x,vehicle _x,typeOf (vehicle _x),_variable,_setting,_global);
|
_x setVariable [_variable, _setting, _global];
|
||||||
} else {
|
TRACE_5("Set variable",_x,typeOf _x,_variable,_setting,_global);
|
||||||
_x setVariable [_variable, _setting, _global];
|
|
||||||
TRACE_5("Set variable",_x,typeOf _x,_variable,_setting,_global);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
false
|
} forEach _list;
|
||||||
} count _list;
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* 2: Namespace to store the cache on <NAMESPACE>
|
* 2: Namespace to store the cache on <NAMESPACE>
|
||||||
* 3: Cache uid <STRING>
|
* 3: Cache uid <STRING>
|
||||||
* 4: Max duration of the cache <NUMBER>
|
* 4: Max duration of the cache <NUMBER>
|
||||||
* 5: Event that clears the cache (default: nil) <STRING>
|
* 5: Events that clear the cache (default: nil) <STRING or ARRAY of STRING>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* Result of the function <ANY>
|
* Result of the function <ANY>
|
||||||
@ -20,41 +20,46 @@
|
|||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
|
||||||
params ["_params", "_function", "_namespace", "_uid", "_duration", "_event"];
|
params ["_params", "_function", "_namespace", "_uid", "_duration", "_events"];
|
||||||
|
|
||||||
if ((_namespace getVariable [_uid, [-99999]]) select 0 < diag_tickTime) then {
|
if ((_namespace getVariable [_uid, [-99999]]) select 0 < diag_tickTime) then {
|
||||||
_namespace setVariable [_uid, [diag_tickTime + _duration, _params call _function]];
|
_namespace setVariable [_uid, [diag_tickTime + _duration, _params call _function]];
|
||||||
|
|
||||||
// Does the cache need to be cleared on an event?
|
// Does the cache need to be cleared on an event?
|
||||||
if (!isNil "_event") then {
|
if (!isNil "_events") then {
|
||||||
private _varName = format [QGVAR(clearCache_%1), _event];
|
if (_events isEqualType "") then {
|
||||||
private _cacheList = missionNamespace getVariable _varName;
|
_events = [_events];
|
||||||
|
|
||||||
// If there was no EH to clear these caches, add one
|
|
||||||
if (isNil "_cacheList") then {
|
|
||||||
_cacheList = [];
|
|
||||||
missionNamespace setVariable [_varName, _cacheList];
|
|
||||||
|
|
||||||
[_event, {
|
|
||||||
#ifdef DEBUG_MODE_FULL
|
|
||||||
INFO_1("Clear cached variables on event: %1",_eventName);
|
|
||||||
#endif
|
|
||||||
// Get the list of caches to clear
|
|
||||||
//IGNORE_PRIVATE_WARNING ["_eventName"];
|
|
||||||
// _eventName is defined on the function that calls the event
|
|
||||||
private _varName = format [QGVAR(clearCache_%1), _eventName];
|
|
||||||
private _cacheList = missionNamespace getVariable [_varName, []];
|
|
||||||
// Erase all the cached results
|
|
||||||
{
|
|
||||||
_x call FUNC(eraseCache);
|
|
||||||
} forEach _cacheList;
|
|
||||||
// Empty the list
|
|
||||||
missionNamespace setVariable [_varName, []];
|
|
||||||
}] call CBA_fnc_addEventHandler;
|
|
||||||
};
|
};
|
||||||
|
{
|
||||||
|
private _event = _x;
|
||||||
|
private _varName = format [QGVAR(clearCache_%1), _event];
|
||||||
|
private _cacheList = missionNamespace getVariable _varName;
|
||||||
|
|
||||||
// Add this cache to the list of the event
|
// If there was no EH to clear these caches, add one
|
||||||
_cacheList pushBack [_namespace, _uid];
|
if (isNil "_cacheList") then {
|
||||||
|
_cacheList = [];
|
||||||
|
missionNamespace setVariable [_varName, _cacheList];
|
||||||
|
|
||||||
|
[_event, {
|
||||||
|
#ifdef DEBUG_MODE_FULL
|
||||||
|
INFO_1("Clear cached variables on event: %1",_eventName);
|
||||||
|
#endif
|
||||||
|
// Get the list of caches to clear
|
||||||
|
//IGNORE_PRIVATE_WARNING ["_eventName"];
|
||||||
|
// _eventName is defined on the function that calls the event
|
||||||
|
private _varName = format [QGVAR(clearCache_%1), _eventName];
|
||||||
|
private _cacheList = missionNamespace getVariable [_varName, []];
|
||||||
|
// Erase all the cached results
|
||||||
|
{
|
||||||
|
_x call FUNC(eraseCache);
|
||||||
|
} forEach _cacheList;
|
||||||
|
// Empty the list
|
||||||
|
missionNamespace setVariable [_varName, []];
|
||||||
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
};
|
||||||
|
// Add this cache to the list of the event
|
||||||
|
_cacheList pushBack [_namespace, _uid];
|
||||||
|
} forEach _events;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef DEBUG_MODE_FULL
|
#ifdef DEBUG_MODE_FULL
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
params ["_unit", "_vehicle", "_position", ["_checkDistance", false], ["_index", -1]];
|
params ["_unit", "_vehicle", "_position", ["_checkDistance", false], ["_index", -1]];
|
||||||
|
|
||||||
_position = toLower _position;
|
_position = toLowerANSI _position;
|
||||||
|
|
||||||
// general
|
// general
|
||||||
if (!alive _vehicle || {locked _vehicle > 1}) exitWith {false};
|
if (!alive _vehicle || {locked _vehicle > 1}) exitWith {false};
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
params ["_unit", "_target", ["_exceptions", []]];
|
params ["_unit", "_target", ["_exceptions", []]];
|
||||||
|
|
||||||
_exceptions = _exceptions apply {toLower _x};
|
_exceptions = _exceptions apply {toLowerANSI _x};
|
||||||
|
|
||||||
private _owner = _target getVariable [QGVAR(owner), objNull];
|
private _owner = _target getVariable [QGVAR(owner), objNull];
|
||||||
|
|
||||||
|
@ -66,8 +66,7 @@ GVAR(settingsMovedToSQF) = [];
|
|||||||
INFO_1("%1 delayed functions running.",count GVAR(runAtSettingsInitialized));
|
INFO_1("%1 delayed functions running.",count GVAR(runAtSettingsInitialized));
|
||||||
{
|
{
|
||||||
(_x select 1) call (_x select 0);
|
(_x select 1) call (_x select 0);
|
||||||
false
|
} forEach GVAR(runAtSettingsInitialized);
|
||||||
} count GVAR(runAtSettingsInitialized);
|
|
||||||
GVAR(runAtSettingsInitialized) = nil; //cleanup
|
GVAR(runAtSettingsInitialized) = nil; //cleanup
|
||||||
|
|
||||||
#ifdef DEBUG_MODE_FULL
|
#ifdef DEBUG_MODE_FULL
|
||||||
@ -104,7 +103,7 @@ TRACE_1("Reading settings from missionConfigFile",_countOptions);
|
|||||||
for "_index" from 0 to (_countOptions - 1) do {
|
for "_index" from 0 to (_countOptions - 1) do {
|
||||||
private _optionEntry = _missionSettingsConfig select _index;
|
private _optionEntry = _missionSettingsConfig select _index;
|
||||||
private _settingName = configName _optionEntry;
|
private _settingName = configName _optionEntry;
|
||||||
if ((toLower _settingName) in GVAR(cbaSettings_forcedSettings)) then {
|
if ((toLowerANSI _settingName) in GVAR(cbaSettings_forcedSettings)) then {
|
||||||
WARNING_1("Setting [%1] - Already Forced - ignoring missionConfig",_varName);
|
WARNING_1("Setting [%1] - Already Forced - ignoring missionConfig",_varName);
|
||||||
} else {
|
} else {
|
||||||
if ((isNil _settingName) && {(getNumber (_settingsConfig >> _settingName >> "movedToSQF")) == 0}) then {
|
if ((isNil _settingName) && {(getNumber (_settingsConfig >> _settingName >> "movedToSQF")) == 0}) then {
|
||||||
|
@ -44,7 +44,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x
|
|||||||
|
|
||||||
private _cbaIsGlobal = (!_isClientSettable) || _isForced;
|
private _cbaIsGlobal = (!_isClientSettable) || _isForced;
|
||||||
private _warnIfChangedMidMission = _cbaIsGlobal && {(getNumber (_config >> "canBeChanged")) == 0};
|
private _warnIfChangedMidMission = _cbaIsGlobal && {(getNumber (_config >> "canBeChanged")) == 0};
|
||||||
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLower _varName);};
|
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLowerANSI _varName);};
|
||||||
|
|
||||||
// Basic handling of setting types CBA doesn't support:
|
// Basic handling of setting types CBA doesn't support:
|
||||||
if (_typeName == "ARRAY") exitWith {
|
if (_typeName == "ARRAY") exitWith {
|
||||||
|
@ -34,7 +34,7 @@ private _category = getText (_config >> "category");
|
|||||||
|
|
||||||
private _cbaIsGlobal = (!_isClientSettable) || _isForced;
|
private _cbaIsGlobal = (!_isClientSettable) || _isForced;
|
||||||
private _warnIfChangedMidMission = _cbaIsGlobal && {(getNumber (_config >> "canBeChanged")) == 0};
|
private _warnIfChangedMidMission = _cbaIsGlobal && {(getNumber (_config >> "canBeChanged")) == 0};
|
||||||
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLower _varName);};
|
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLowerANSI _varName);};
|
||||||
|
|
||||||
// Basic handling of setting types CBA doesn't support:
|
// Basic handling of setting types CBA doesn't support:
|
||||||
if (_typeName == "ARRAY") exitWith {
|
if (_typeName == "ARRAY") exitWith {
|
||||||
@ -103,4 +103,3 @@ private _return = [_varName, _cbaSettingType, [_localizedName, _localizedDescrip
|
|||||||
TRACE_1("returned",_return);
|
TRACE_1("returned",_return);
|
||||||
if ((isNil "_return") || {!_return}) then {ERROR_1("Setting [%1] - CBA Error",_varName);};
|
if ((isNil "_return") || {!_return}) then {ERROR_1("Setting [%1] - CBA Error",_varName);};
|
||||||
_return
|
_return
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ if ([_cbaRequiredAr, _cbaVersionAr] call cba_versioning_fnc_version_compare) the
|
|||||||
};
|
};
|
||||||
|
|
||||||
//private _addons = activatedAddons; // broken with High-Command module, see #2134
|
//private _addons = activatedAddons; // broken with High-Command module, see #2134
|
||||||
private _addons = (cba_common_addons select {(_x select [0,4]) == "ace_"}) apply {toLower _x};
|
private _addons = (cba_common_addons select {(_x select [0,4]) == "ace_"}) apply {toLowerANSI _x};
|
||||||
private _oldAddons = [];
|
private _oldAddons = [];
|
||||||
private _oldSources = [];
|
private _oldSources = [];
|
||||||
private _oldCompats = [];
|
private _oldCompats = [];
|
||||||
@ -87,7 +87,7 @@ if (_oldCompats isNotEqualTo []) then {
|
|||||||
///////////////
|
///////////////
|
||||||
// check extensions
|
// check extensions
|
||||||
///////////////
|
///////////////
|
||||||
private _platform = toLower (productVersion select 6);
|
private _platform = toLowerANSI (productVersion select 6);
|
||||||
if (!isServer && {_platform in ["linux", "osx"]}) then {
|
if (!isServer && {_platform in ["linux", "osx"]}) then {
|
||||||
// Linux and OSX client ports do not support extensions at all
|
// Linux and OSX client ports do not support extensions at all
|
||||||
INFO("Operating system does not support extensions");
|
INFO("Operating system does not support extensions");
|
||||||
|
@ -25,7 +25,7 @@ params ["_mode", ["_checkAll", false], ["_whitelist", "", [""]]];
|
|||||||
TRACE_3("params",_mode,_checkAll,_whitelist);
|
TRACE_3("params",_mode,_checkAll,_whitelist);
|
||||||
|
|
||||||
//lowercase and convert whiteList String into array of strings:
|
//lowercase and convert whiteList String into array of strings:
|
||||||
_whitelist = toLower _whitelist;
|
_whitelist = toLowerANSI _whitelist;
|
||||||
_whitelist = _whitelist splitString "[,""']";
|
_whitelist = _whitelist splitString "[,""']";
|
||||||
TRACE_1("Array",_whitelist);
|
TRACE_1("Array",_whitelist);
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user