Merge branch 'master' into armake

This commit is contained in:
Thomas Kooi 2018-05-20 11:08:58 +02:00 committed by GitHub
commit 58f4ca4581
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
315 changed files with 5552 additions and 3350 deletions

View File

@ -21,9 +21,6 @@ script:
- make -j 3
- python3 tools/sqf_validator.py
- python3 tools/config_style_checker.py
- if [ -n "${GH_TOKEN}" ] && [ "${TRAVIS_BRANCH}" == "master" ] && [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then
python3 tools/deploy.py;
fi
env:
global:
- secure: cdxkn5cAx+s1C9Ne5m+odEhde1uuSg6XGMDgepN4DwSAJwtMnUv3ZmDebd5YJC1raZJdep+n09Cj0GoTNICQRkco50DxHKHYNad41wetY0tn0cs9gmPYzyFE5q4vuWiQ47dlGhQQ7IJDyX0nU++gG5E50/PhlZfebdedGSprN/4=

View File

@ -98,6 +98,7 @@ legman <juicemelon@msn.com>
Legolasindar "Viper" <legolasindar@gmail.com>
licht-im-Norden87 <lichtimnorden87@gmail.com>
looter <looter222@gmail.com>
Lugubrious Hatchling <thunderbra@gmail.com>
Luigi "Luigium" Myrini <luigium@outlook.fr>
Macusercom <macusercom@gmail.com>
MarcBook
@ -109,6 +110,7 @@ nic547 <nic547@outlook.com>
nikolauska <nikolauska1@gmail.com>
nomisum <nomisum@gmail.com>
OnkelDisMaster <onkeldismaster@gmail.com>
Orbis2358 <mgkid3310@naver.com>
oscarmolinadev
PaxJaromeMalues <seemax1991@gmail.com>
Phyma <sethramstrom@gmail.com>

View File

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

View File

@ -76,7 +76,7 @@
<Hungarian>Engedélyezi a fejlett ballisztikát</Hungarian>
<Russian>Включает продвинутую баллистику</Russian>
<Italian>Abilita Balistica Avanzata</Italian>
<Japanese>アドバンスド バリスティックス</Japanese>
<Japanese>アドバンスド バリスティックスを有効化</Japanese>
<Korean>고급 탄도학을 적용합니다</Korean>
<Chinese>啟用先進彈道系統</Chinese>
<Chinesesimp>启用先进弹道系统</Chinesesimp>
@ -87,13 +87,19 @@
<Japanese>銃口初速の変化</Japanese>
<Italian>Abilita Variazione Velocità Volata</Italian>
<Korean>총구속도 변화적용</Korean>
<Chinese>啟用槍口初速變化</Chinese>
<Chinesesimp>启用枪口初速变化</Chinesesimp>
<French>Activer les variations de la vitesse initiale</French>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_muzzleVelocityVariationEnabled_Description">
<English>Simulates slight variations in muzzle velocity between each shot</English>
<German>Simuliert leichte Variationen der Mündungsgeschwindigkeit zwischen jedem Schuss.</German>
<Japanese>発射毎に僅かな銃口初速の変化をシミュレートします</Japanese>
<Japanese>発射毎に銃口初速の僅かな変化をシミュレートします</Japanese>
<Italian>Simula lievi variazioni della velocità della volata tra un colpo e l'altro</Italian>
<Korean>각 사격 사이에 총구속도 변화를 시뮬레이션 합니다.</Korean>
<Chinese>模擬每發子彈的槍口初速都略有不同</Chinese>
<Chinesesimp>模拟每发子弹的枪口初速都略有不同</Chinesesimp>
<French>Simule les légères variations</French>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_DisplayName">
<English>Enable Ammo Temperature Simulation</English>
@ -266,7 +272,7 @@
<Russian>Этот модуль включает симуляцию продвинутой баллистики - при этом на траекторию полета снаряда влияют различные параметры, такие как температура воздуха, атмосферное давление, влажность, гравитация, тип боеприпаса и оружия, из которого произвели выстрел.</Russian>
<Spanish>Este módulo permite la simulación balística avanzada - es decir, la trayectoria de los proyectiles está influenciada por variables como la temperatura del aire, la presión atmosférica, la humedad, la gravedad, el tipo de municiones y el arma desde el que fue disparada.</Spanish>
<Italian>Questo modulo abilita la simulazione della Balistica Avanzata - cioè la traiettoria dei proiettili è influenzata da variabili come la temperatura dell'aria, pressione atmosferica, umidità, gravità, il tipo di munizione e l'arma da cui è sparata</Italian>
<Japanese>このモジュールはアドバンスド バリスティックスを有効化します。弾道は気温や気圧、湿度、重力、弾薬の種類、発射する武器から影響を受けるようになります。</Japanese>
<Japanese>アドバンスド バリスティックスを有効化します。弾道は気温や気圧、湿度、重力、弾薬の種類、発射する武器から影響を受けるようになります。</Japanese>
<Korean>이 모듈은 고급 탄도학을 적용시킵니다 - 이는 발사체의 궤적이 기온, 대기압, 습도, 중력, 탄환의 종류와 어느 무기에서 발사되는지에 따라 영향을 받습니다.</Korean>
<Chinese>該模塊實現先進的彈道仿真 - 這意味著子彈的軌跡是由空氣溫度、大氣壓力、濕度、重力、彈藥類型以及射擊的武器所影響</Chinese>
<Chinesesimp>该模块实现先进的弹道仿真 - 这意味着子弹的轨迹是由空气温度、大气压力、湿度、重力、弹药类型以及射击的武器所影响</Chinesesimp>

View File

@ -90,12 +90,12 @@ if (_overexhausted) then {
switch (stance _unit) do {
case ("CROUCH"): {
_unit setCustomAimCoef (1.0 + _fatigue ^ 2 * 0.1);
[_unit, QUOTE(ADDON), (1.0 + _fatigue ^ 2 * 0.1) * GVAR(swayFactor)] call EFUNC(common,setAimCoef);
};
case ("PRONE"): {
_unit setCustomAimCoef (1.0 + _fatigue ^ 2 * 2.0);
[_unit, QUOTE(ADDON), (1.0 + _fatigue ^ 2 * 2.0) * GVAR(swayFactor)] call EFUNC(common,setAimCoef);
};
default {
_unit setCustomAimCoef (1.5 + _fatigue ^ 2 * 3.0);
[_unit, QUOTE(ADDON), (1.5 + _fatigue ^ 2 * 3.0) * GVAR(swayFactor)] call EFUNC(common,setAimCoef);
};
};

View File

@ -57,3 +57,12 @@
[0, 2, 1, 1],
true
] call CBA_Settings_fnc_init;
[
QGVAR(swayFactor),
"SLIDER",
[LSTRING(SwayFactor), LSTRING(SwayFactor_Description)],
"ACE3 Advanced Fatigue",
[0, 2, 1, 1],
true
] call CBA_Settings_fnc_init;

View File

@ -35,7 +35,7 @@
<Key ID="STR_ACE_Advanced_Fatigue_PerformanceFactor_EdenDescription">
<English>Influences the overall performance of this unit. Higher means better.</English>
<German>Beinflusst die Leistungsfähigkeit dieser Einheit. Ein höherer Wert bedeutet bessere Leistung.</German>
<Japanese>このユニットの全体的な動作に影響させます。高いほど良い効果があります。</Japanese>
<Japanese>ユニットの全体的な動作に影響させます。高いほど良い効果があります。</Japanese>
<Polish>Wpływa na ogólną wydolność tej jednostki. Więcej znaczy lepiej.</Polish>
<Korean>모든 성능이 이 단위로 영향을 받습니다. 값이 클수록 더 나은 성능을 발휘합니다</Korean>
<French>Influence les performances générales de cette unité. Une valeur plus élevée implique de meilleures performances.</French>
@ -101,7 +101,7 @@
<Key ID="STR_ACE_Advanced_Fatigue_TerrainGradientFactor_Description">
<English>Sets how much steep terrain increases stamina loss. Higher means higher stamina loss.</English>
<German>Beeinflusst, wie stark Steigungen den Ausdauerverbrauch erhöhen. Ein höherer Wert erhöht den Ausdauerverbrauch.</German>
<Japanese>地形によって影響する体力の消費量を決定します。高数値ではより体力を消費します。</Japanese>
<Japanese>地形によって体力の消費量を決定します。高数値ではより体力を消費します。</Japanese>
<Polish>Wpływa na to w jakim stopniu stromy teren wpływa na utratę wytrzymałości. Więcej oznacza szybszą utratę wytrzymałości.</Polish>
<Korean>경사도에 따라 얼마나 피로해지는지를 정합니다. 값이 클수록 더 많은 피로를 유발합니다.</Korean>
<French>Configure l'influence de l'inclinaison du terrain sur la perte d'endurance. Une valeur plus élevée implique une perte d'endurance plus importante.</French>
@ -109,6 +109,12 @@
<Chinese>設定陡峭的地形將會影響多少體力的流失,值越高代表體力流失越快</Chinese>
<Chinesesimp>设定陡峭的地形将会影响多少体力的流,失值越高代表体力流失越快</Chinesesimp>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_SwayFactor">
<English>Sway factor</English>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_SwayFactor_Description">
<English>Influences the amount of weapon sway. Higher means more sway.</English>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
<English>Enabled</English>
<German>Aktiv</German>

View File

@ -7,50 +7,75 @@
{
if (_bool) then {
_x enableAI _section;
LOG_3("%1 enableAI %2 | ID: %3",_x,_section,clientOwner);
} else {
_x disableAI _section;
LOG_3("%1 disableAI %2 | ID: %3",_x,_section,clientOwner);
};
LOG(format [ARR_4("XEH_postInit: %1 disableAI %2 | ID %3", _x, _section, clientOwner)]);
} foreach (_units select {local _x});
} foreach _sections
} forEach (_units select {local _x});
} forEach _sections;
}] call CBA_fnc_addEventHandler;
[QGVAR(unGarrison), FUNC(unGarrison)] call CBA_fnc_addEventHandler;
[QGVAR(doMove), {
params ["_unitsArray"];
{
{
_x params ["_unit", "_pos"];
//_unit doFollow leader _unit;
_unit setDestination [_pos, "LEADER PLANNED", true];
_unit doMove _pos;
LOG(format [ARR_4("XEH_postInit: %1 doMove %2 | ID %3", _unit, _pos, clientOwner)]);
} foreach _unitsArray
LOG_3("%1 doMove %2 | ID: %3",_unit,_pos,clientOwner);
} forEach _unitsArray;
}] call CBA_fnc_addEventHandler;
[QGVAR(setBehaviour), {
params ["_groupsArray", "_behaviour"];
{
_x params ["_group"];
_group setBehaviour _behaviour;
LOG(format [ARR_4("XEH_postInit: %1 setBehaviour %2 | ID %3", _group, _behaviour, clientOwner)]);
} foreach _groupsArray
{
_x setBehaviour _behaviour;
LOG_3("%1 setBehaviour %2 | ID: %3",_x,_behaviour,clientOwner);
} forEach _groupsArray;
}] call CBA_fnc_addEventHandler;
[QGVAR(enableAttack), {
params ["_unitsArray", "_mode"];
{
_x params ["_unit"];
_unit enableAttack _mode;
LOG(format [ARR_4("XEH_postInit: %1 enableAttack %2 | ID %3", _unit, _mode, clientOwner)]);
} foreach _unitsArray
_x enableAttack _mode;
LOG_3("%1 enableAttack %2 | ID: %3",_x,_mode,clientOwner);
} forEach _unitsArray;
}] call CBA_fnc_addEventHandler;
[QGVAR(setUnitPos), {
params ["_unit", "_mode"];
_unit setUnitPos _mode;
}] call CBA_fnc_addEventHandler;
[QGVAR(setSpeedMode), {
params ["_unit", "_mode"];
_unit setSpeedMode _mode;
}] call CBA_fnc_addEventHandler;
[QGVAR(setCombatMode), {
params ["_unit", "_mode"];
_unit setCombatMode _mode;
}] call CBA_fnc_addEventHandler;
[QGVAR(allowFleeing), {
params ["_unit", "_cowardice"];
_unit allowFleeing _cowardice;
}] call CBA_fnc_addEventHandler;
[QGVAR(enableGunLights), {
params ["_unit", "_mode"];
_unit enableGunLights _mode;
}] call CBA_fnc_addEventHandler;
#ifdef DEBUG_MODE_FULL
addMissionEventHandler ["Draw3D", {
private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
{
_x params ["_unit", "_pos"];
switch true do {
switch (true) do {
case (surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLtoASL _pos), [1,0,0,1]];
@ -79,6 +104,6 @@
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
};
};
} foreach _unitMoveList;
} forEach _unitMoveList;
}];
#endif
#endif

View File

@ -2,8 +2,8 @@
#define COMPONENT_BEAUTIFIED AI
#include "\z\ace\addons\main\script_mod.hpp"
//#define DEBUG_MODE_FULL
//#define DISABLE_COMPILE_CACHE
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_AI

View File

@ -0,0 +1,104 @@
class GVAR(stats) {
class statBase {
scope = 1;
priority = 0;
stats[] = {};
displayName = "";
showBar = 0;
showText = 0;
barStatement = "";
textStatement = "";
condition = "true";
tabs[] = {{}, {}};
};
class ACE_bananaPotassium: statBase {
scope = 2;
displayName= CSTRING(statPotassium);
showBar = 1;
barStatement = "1";
condition = QUOTE((configName (_this select 1)) == 'ACE_Banana');
tabs[] = {{}, {7}};
};
class ACE_mass: statBase {
scope = 2;
displayName= "$STR_a3_rscdisplayarsenal_stat_weight";
showText = 1;
textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_mass));
tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}, {0,1,2,3,4,5,6,7}};
};
class ACE_rateOfFire: statBase {
scope = 2;
priority = 5;
stats[] = {"reloadTime"};
displayName= "$STR_a3_rscdisplayarsenal_stat_rof";
showBar = 1;
showText = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(-1.4, 0.31)], [ARR_2(1, 0.01)], true)])] call FUNC(statBarStatement_default));
textStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_2([ARR_2(-1.4, 0.31)], false)])] call FUNC(statTextStatement_rateOfFire));
tabs[] = {{0,1}, {}};
};
class ACE_accuracy: statBase {
scope = 2;
priority = 4;
stats[] = {"dispersion"};
displayName = "$STR_a3_rscdisplayarsenal_stat_dispersion";
showBar = 1;
showText = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(-4, -1.7)], [ARR_2(1, 0.01)], true)])] call FUNC(statBarStatement_default));
textStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_2([ARR_2(-4, -1.7)], false)])] call FUNC(statTextStatement_accuracy));
tabs[] = {{0,1}, {}};
};
class ACE_maxZeroing: statBase {
scope = 2;
priority = 3;
stats[] = {"maxZeroing"};
displayName = "$STR_a3_rscdisplayarsenal_stat_range";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 2500)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
tabs[] = {{0,1,2}, {}};
};
class ACE_impact: statBase {
scope = 2;
priority = 2;
stats[] = {"hit", "initSpeed"};
displayName = "$STR_a3_rscdisplayarsenal_stat_impact";
showBar = 1;
barStatement = QUOTE([ARR_3(_this select 0, _this select 1, [ARR_3([ARR_2(0, 3.2)], [ARR_2(-1, 1100)], 2006)])] call FUNC(statBarStatement_impact));
tabs[] = {{0,1,2}, {}};
};
class ACE_scopeMagnification: statBase {
scope = 2;
priority = 2;
displayName = CSTRING(statMagnification);
showText = 1;
textStatement = QUOTE(call FUNC(statTextStatement_scopeMag));
tabs[] = {{}, {0}};
};
class ACE_ballisticProtection: statBase {
scope = 2;
priority = 5;
stats[] = {"passthrough"};
displayName = "$STR_a3_rscdisplayarsenal_stat_passthrough";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 0.63)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
tabs[] = {{3,4,6}, {}};
};
class ACE_explosiveResistance: statBase {
scope = 2;
priority = 4;
stats[] = {"armor"};
displayName = "$STR_a3_rscdisplayarsenal_stat_armor";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 0.80)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
tabs[] = {{3,4,6}, {}};
};
class ACE_load: statBase {
scope = 2;
priority = 3;
stats[] = {"maximumLoad"};
displayName = "$STR_a3_rscdisplayarsenal_stat_load";
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 500)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
tabs[] = {{3,4,5}, {}};
};
};

View File

@ -1,4 +1,5 @@
PREP(addListBoxItem);
PREP(addStat);
PREP(addVirtualItems);
PREP(buttonCargo);
PREP(buttonClearAll);
@ -10,7 +11,10 @@ PREP(buttonLoadoutsLoad);
PREP(buttonLoadoutsRename);
PREP(buttonLoadoutsSave);
PREP(buttonLoadoutsShare);
PREP(buttonStats);
PREP(buttonStatsPage);
PREP(clearSearchbar);
PREP(compileStats);
PREP(fillLeftPanel);
PREP(fillLoadoutsList);
PREP(fillRightPanel);
@ -18,6 +22,7 @@ PREP(handleLoadoutsSearchbar);
PREP(handleMouse);
PREP(handleScrollWheel);
PREP(handleSearchbar);
PREP(handleStats);
PREP(initBox);
PREP(itemInfo);
PREP(loadoutsChangeTab);
@ -37,10 +42,17 @@ PREP(open3DEN);
PREP(openBox);
PREP(portVALoadouts);
PREP(removeBox);
PREP(removeStat);
PREP(removeVirtualItems);
PREP(scanConfig);
PREP(showItem);
PREP(sortPanel);
PREP(statBarStatement_default);
PREP(statBarStatement_impact);
PREP(statTextStatement_accuracy);
PREP(statTextStatement_mass);
PREP(statTextStatement_rateOfFire);
PREP(statTextStatement_scopeMag);
PREP(updateCamPos);
PREP(updateRightPanel);
PREP(updateUniqueItemsList);

View File

@ -1,4 +1,5 @@
#include "script_component.hpp"
#include "defines.hpp"
ADDON = false;
@ -12,10 +13,51 @@ GVAR(modList) = ["","curator","kart","heli","mark","expansion","expansionpremium
[QGVAR(camInverted), "CHECKBOX", localize LSTRING(invertCameraSetting), localize LSTRING(settingCategory), false] call CBA_Settings_fnc_init;
[QGVAR(enableModIcons), "CHECKBOX", [LSTRING(modIconsSetting), LSTRING(modIconsTooltip)], localize LSTRING(settingCategory), true] call CBA_Settings_fnc_init;
[QGVAR(fontHeight), "SLIDER", [LSTRING(fontHeightSetting), LSTRING(fontHeightTooltip)], localize LSTRING(settingCategory), [1, 10, 4.5, 1]] call CBA_Settings_fnc_init;
[QGVAR(enableIdentityTabs), "CHECKBOX", localize LSTRING(enableIdentityTabsSettings), localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init;
// Arsenal loadouts
[QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init;
[QGVAR(allowSharedLoadouts), "CHECKBOX", localize LSTRING(allowSharingSetting), localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init;
[QGVAR(EnableRPTLog), "CHECKBOX", [LSTRING(printToRPTSetting), LSTRING(printToRPTTooltip)], localize LSTRING(settingCategory), false, false] call CBA_Settings_fnc_init;
[QGVAR(statsToggle), {
params ["_display", "_showStats"];
private _statsCtrlGroupCtrl = _display displayCtrl IDC_statsBox;
private _statsPreviousPageCtrl = _display displayCtrl IDC_statsPreviousPage;
private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage;
private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage;
private _statsButtonCtrl = _display displayCtrl IDC_statsButton;
private _statsButtonCloseCtrl = _display displayCtrl IDC_statsButtonClose;
{
_x ctrlShow (GVAR(showStats) && {_showStats});
} forEach [
_statsCtrlGroupCtrl,
_statsPreviousPageCtrl,
_statsNextPageCtrl,
_statsCurrentPageCtrl,
_statsButtonCloseCtrl
];
_statsButtonCtrl ctrlShow (!GVAR(showStats) && {_showStats})
}] call CBA_fnc_addEventHandler;
[QGVAR(statsButton), {
_this call FUNC(buttonStats);
}] call CBA_fnc_addEventHandler;
[QGVAR(statsChangePage), {
_this call FUNC(buttonStatsPage);
}] call CBA_fnc_addEventHandler;
[QGVAR(displayStats), {
_this call FUNC(handleStats);
}] call CBA_fnc_addEventHandler;
call FUNC(compileStats);
ADDON = true;

View File

@ -39,3 +39,4 @@ class Cfg3DEN {
#include "ui\RscAttributes.hpp"
#include "CfgEventHandlers.hpp"
#include "RscDisplayMain.hpp"
#include "ACE_Arsenal_Stats.hpp"

View File

@ -104,6 +104,32 @@
#define IDC_buttonMisc 38
#define IDC_buttonRemoveAllSelected 39
#define IDC_buttonRemoveAll 40
#define IDC_statsBox 51
#define IDC_statsTitle1 5101
#define IDC_statsBackground1 5102
#define IDC_statsBar1 5103
#define IDC_statsText1 5104
#define IDC_statsTitle2 5105
#define IDC_statsBackground2 5106
#define IDC_statsBar2 5107
#define IDC_statsText2 5108
#define IDC_statsTitle3 5109
#define IDC_statsBackground3 5110
#define IDC_statsBar3 5111
#define IDC_statsText3 5112
#define IDC_statsTitle4 5113
#define IDC_statsBackground4 5114
#define IDC_statsBar4 5115
#define IDC_statsText4 5116
#define IDC_statsTitle5 5117
#define IDC_statsBackground5 5118
#define IDC_statsBar5 5119
#define IDC_statsText5 5120
#define IDC_statsPreviousPage 52
#define IDC_statsNextPage 53
#define IDC_statsCurrentPage 54
#define IDC_statsButton 55
#define IDC_statsButtonClose 56
#define IDD_loadouts_display 1127002
#define IDC_centerBox 3
@ -200,6 +226,21 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
IDC_rightTabContentListnBox,\
RIGHT_PANEL_ITEMS_BACKGROUND_IDCS,\
IDC_buttonRemoveAll\
];\
{\
_x = _display displayCtrl _x;\
_x ctrlSetPosition [\
safezoneX + safezoneW - 93 * GRID_W,\
safezoneY + 14 * GRID_H,\
80 * GRID_W,\
safezoneH - 28 * GRID_H\
];\
_x ctrlCommit 0;\
} foreach [\
IDC_rightTabContent,\
IDC_rightTabContentListnBox,\
IDC_blockRightFrame,\
IDC_blockRighttBackground\
];
#define TOGGLE_RIGHT_PANEL_CONTAINER\
@ -232,6 +273,21 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
IDC_buttonCurrentMag2,\
IDC_iconBackgroundCurrentMag,\
IDC_iconBackgroundCurrentMag2\
];\
{\
_x = _display displayCtrl _x;\
_x ctrlSetPosition [\
safezoneX + safezoneW - 93 * GRID_W,\
safezoneY + 14 * GRID_H,\
80 * GRID_W,\
safezoneH - 34 * GRID_H\
];\
_x ctrlCommit 0;\
} foreach [\
IDC_rightTabContent,\
IDC_rightTabContentListnBox,\
IDC_blockRightFrame,\
IDC_blockRighttBackground\
];
#define TOGGLE_RIGHT_PANEL_HIDE\
@ -283,27 +339,27 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
]
#define CHECK_WEAPON_OR_ACC\
_item in (_weaponsArray select 0) ||\
{_item in (_weaponsArray select 1)} ||\
{_item in (_weaponsArray select 2)} ||\
{_item in (GVAR(virtualItems) select 9)} ||\
{_item in (_accsArray select 0)} ||\
{_item in (_accsArray select 1)} ||\
{_item in (_accsArray select 2)} ||\
{_item in (_accsArray select 3)}
(_weaponsArray select 0) findIf {_x == _item} > -1 ||\
{(_weaponsArray select 1) findIf {_x == _item} > -1} ||\
{(_weaponsArray select 2) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 9) findIf {_x == _item} > -1} ||\
{(_accsArray select 0) findIf {_x == _item} > -1} ||\
{(_accsArray select 1 findIf {_x == _item} > -1)} ||\
{(_accsArray select 2) findIf {_x == _item} > -1} ||\
{(_accsArray select 3) findIf {_x == _item} > -1}
#define CHECK_ASSIGNED_ITEMS\
_item in (GVAR(virtualItems) select 10) ||\
{_item in (GVAR(virtualItems) select 11)} ||\
{_item in (GVAR(virtualItems) select 12)} ||\
{_item in (GVAR(virtualItems) select 13)} ||\
{_item in (GVAR(virtualItems) select 14)} ||\
{_item in (GVAR(virtualItems) select 8)}
(GVAR(virtualItems) select 10) findIf {_x == _item} > -1 ||\
{(GVAR(virtualItems) select 11) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 12) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 13) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 14) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 8) findIf {_x == _item} > -1}
#define CHECK_CONTAINER\
_item in (GVAR(virtualItems) select 4) ||\
{_item in (GVAR(virtualItems) select 5)} ||\
{_item in (GVAR(virtualItems) select 6)}
(GVAR(virtualItems) select 4) findIf {_x == _item} > -1 ||\
{(GVAR(virtualItems) select 5) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 6) findIf {_x == _item} > -1}
#define CLASS_CHECK_ITEM\
isClass (_weaponCfg >> _item) ||\
@ -312,24 +368,24 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
{isClass (_magCfg >> _item)}
#define CHECK_CONTAINER_ITEMS\
_item in (GVAR(virtualItems) select 3) ||\
{_item in (_accsArray select 0)} ||\
{_item in (_accsArray select 1)} ||\
{_item in (_accsArray select 2)} ||\
{_item in (_accsArray select 3)} ||\
{_item in (GVAR(virtualItems) select 4)} ||\
{_item in (GVAR(virtualItems) select 5)} ||\
{_item in (GVAR(virtualItems) select 6)} ||\
{_item in (GVAR(virtualItems) select 7)} ||\
{_item in (GVAR(virtualItems) select 8)} ||\
{_item in (GVAR(virtualItems) select 10)} ||\
{_item in (GVAR(virtualItems) select 11)} ||\
{_item in (GVAR(virtualItems) select 12)} ||\
{_item in (GVAR(virtualItems) select 13)} ||\
{_item in (GVAR(virtualItems) select 14)} ||\
{_item in (GVAR(virtualItems) select 15)} ||\
{_item in (GVAR(virtualItems) select 16)} ||\
{_item in (GVAR(virtualItems) select 17)}
(GVAR(virtualItems) select 3) findIf {_x == _item} > -1 ||\
{(_accsArray select 0) findIf {_x == _item} > -1} ||\
{(_accsArray select 1) findIf {_x == _item} > -1} ||\
{(_accsArray select 2) findIf {_x == _item} > -1} ||\
{(_accsArray select 3) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 4) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 5) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 6) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 7) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 8) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 10) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 11) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 12) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 13) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 14) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 15) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 16) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 17) findIf {_x == _item} > -1}
#define ADD_LOADOUTS_LIST_PICTURES\
_contentPanelCtrl lnbSetPicture [[_newRow, 2], getText (configFile >> "cfgWeapons" >> ((_loadout select 0) select 0) >> "picture")];\

View File

@ -0,0 +1,99 @@
/*
* Author: Alganthe
* Add a stat to ACE Arsenal.
*
* Arguments:
* 0: Tabs to add the stat to (ARRAY of ARRAYS)
* 0.1: Left tab indexes (ARRAY of NUMBERS)
* 0.2 Right tab indexes (ARRAY of NUMBERS)
* 1: Stat class (STRING) (A unique string for each stat)
* 2: Config entries to pass (ARRAY of STRINGS)
* 3: Title (STRING)
* 4: Show bar / show text bools (ARRAY of BOOLS)
* 4.1 Show bar (BOOL)
* 4.2 Show text (BOOL)
* 5: Array of statements (ARRAY of ARRAYS)
* 5.1: Bar code (CODE)
* 5.2 Text code (CODE)
* 5.3 Condition code (CODE)
* 6: Priority (NUMBER) (Optional)
*
* Return Value:
* 0: Array of IDs (ARRAY of STRINGS)
*
* Example:
* [[[0,1,2], [7]], "scopeStat", ["scope"], "Scope", [false, true], [{}, {
params ["_statsArray", "_itemCfg"];
getNumber (_itemCfg >> _statsArray select 0)
}, {true}]] call ACE_arsenal_fnc_addStat
*
* Public: Yes
*/
#include "script_component.hpp"
params [
["_tabs", [[], []], [[]], 2],
["_class", "", [""]],
["_stats", [], [[]]],
["_title", "", [""]],
["_bools", [false, false], [[]], 2],
["_statements", [{}, {}, {true}], [[]], 3],
["_priority", 0, [0]]
];
_tabs params [
["_leftTabs", [], [[]]],
["_rightTabs", [], [[]]]
];
_bools params [["_showBar", false, [false]], ["_showText", false, [false]]];
_statements params [
["_barStatement", {}, [{}]],
["_textStatement", {}, [{}]],
["_condition", {true}, [{}]]
];
call FUNC(compileStats);
private _returnArray = [];
private _fnc_addToTabs = {
params ["_tabsList", "_tabsToAddTo", "_sideString", "_returnIndex"];
{
private _currentTab = _tabsList select _x;
private _finalID = [_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString "";
if ({{_x select 0 == _finalID} count _x > 0} count _currentTab > 0) then {
TRACE_1("A stat with this ID already exists", _finalID);
} else {
private _arrayToSave = +_finalArray;
_arrayToSave set [0, _finalID];
_returnArray pushBack _finalID;
// Add to existing page if there's enough space, otherwise create a new page
if ({count _x < 5} count _currentTab > 0) then {
{
if (count _x < 5) exitWith {
(_currentTab select _forEachIndex) append [_arrayToSave];
};
} foreach _currentTab;
} else {
_currentTab pushBack [_arrayToSave];
};
};
} foreach _tabsToAddTo;
};
private _finalArray = ["", _stats, _title, [_showBar, _showText], [_barStatement, _textStatement, _condition], _priority];
if (count _leftTabs > 0) then {
[GVAR(statsListLeftPanel), _leftTabs, "L", 0] call _fnc_addToTabs;
};
if (count _rightTabs > 0) then {
[GVAR(statsListRightPanel), _rightTabs, "R", 1] call _fnc_addToTabs;
};
_returnArray

View File

@ -49,3 +49,5 @@ if (GVAR(shiftState)) then {
[_display, localize LSTRING(exportCurrent)] call FUNC(message);
};
[QGVAR(loadoutExported), [_display, GVAR(shiftState)]] call CBA_fnc_localEvent;

View File

@ -48,5 +48,12 @@ private _showToggle = !ctrlShown (_display displayCtrl IDC_menuBar);
IDC_buttonCurrentMag,
IDC_buttonCurrentMag2,
IDC_iconBackgroundCurrentMag,
IDC_iconBackgroundCurrentMag2
IDC_iconBackgroundCurrentMag2,
IDC_statsButton,
IDC_statsPreviousPage,
IDC_statsNextPage,
IDC_statsCurrentPage,
IDC_statsButtonClose
];
[QGVAR(statsToggle), [_display, _showToggle]] call CBA_fnc_localEvent;

View File

@ -109,3 +109,5 @@ if (GVAR(shiftState) && {is3DEN}) then {
[_display, localize LSTRING(importedCurrent)] call FUNC(message);
};
};
[QGVAR(loadoutImported), [_display, (GVAR(shiftState) && {is3DEN})]] call CBA_fnc_localEvent;

View File

@ -88,3 +88,5 @@ call FUNC(updateUniqueItemsList);
[GVAR(center), GVAR(currentInsignia)] call bis_fnc_setUnitInsignia;
[(findDisplay IDD_ace_arsenal), [localize LSTRING(loadoutLoaded), _loadoutName] joinString " "] call FUNC(message);
[QGVAR(onLoadoutLoad), [_loadout, _loadoutName]] call CBA_fnc_localEvent;

View File

@ -0,0 +1,31 @@
/*
* Author: Alganthe
* Toggle the stats control group
*
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Button control <CONTROL>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
#include "..\defines.hpp"
params ["_display"];
(_display displayCtrl IDC_statsButton) ctrlShow GVAR(showStats);
GVAR(showStats) = !GVAR(showStats);
{
(_display displayCtrl _x) ctrlShow GVAR(showStats);
} foreach [
IDC_statsBox,
IDC_statsPreviousPage,
IDC_statsNextPage,
IDC_statsCurrentPage,
IDC_statsButtonClose
];

View File

@ -0,0 +1,29 @@
/*
* Author: Alganthe
* Handles the previous / next page buttons for stats
*
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Previous or next <BOOL> (false = previous, true = next)
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
#include "..\defines.hpp"
params ["_display", "_control", "_nextPage"];
TRACE_1("control enabled", ctrlEnabled _control);
if !(ctrlEnabled _control) exitWith {};
GVAR(statsInfo) params ["_isLeftPanel", "_statsIndex", "_panelControl", "_curSel", "_itemCfg"];
private _pageList = [GVAR(statsPagesRight), GVAR(statsPagesLeft)] select (_isLeftPanel);
private _newPageNumber = [(_pageList select _statsIndex) - 1, (_pageList select _statsIndex) + 1] select _nextPage;
_pageList set [_statsIndex, _newPageNumber];
[QGVAR(displayStats), [_display, _panelControl, _curSel, _itemCfg]] call CBA_fnc_localEvent;

View File

@ -0,0 +1,135 @@
/*
* Author: Alganthe
* Create the internal stats arrays when needed for the first time
*
* Arguments:
* None
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
if (!isNil QGVAR(statsListLeftPanel)) exitWith {};
private _fnc_addToTabs = {
params ["_tabsList", "_tabsToAddTo", "_sideString"];
{
private _currentTab = _tabsList select _x;
private _availablePagesCount = {count _x < 5} count _currentTab;
private _arrayToSave = +_finalArray;
_arrayToSave set [0, ([_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString "")];
if (_availablePagesCount > 0) then {
{
if (count _x < 5) exitWith {
(_currentTab select _forEachIndex) append [_arrayToSave];
};
} foreach _currentTab;
} else {
_currentTab pushBack [_arrayToSave];
};
} foreach _tabsToAddTo;
};
private _fnc_sortLists = {
params ["_tabsList"];
{
private _page = _x;
{
{
reverse _x;
} foreach _x;
_x sort false;
{
reverse _x;
} foreach _x;
} foreach _page;
} foreach _tabsList;
};
private _statsListLeftPanel = [
[[]], // Primary 0
[[]], // Handgun 1
[[]], // Launcher 2
[[]], // Uniform 3
[[]], // Vests 4
[[]], // Backpacks 5
[[]], // Headgear 6
[[]], // Goggles 7
[[]], // NVGs 8
[[]], // Binoculars 9
[[]], // Map 10
[[]], // GPS 11
[[]], // Radio 12
[[]], // Compass 13
[[]] // Watch 14
];
private _statsListRightPanel = [
[[]], // Optics 0
[[]], // Side accs 1
[[]], // Muzzle 2
[[]], // Bipod 3
[[]], // Mag 4
[[]], // Throw 5
[[]], // Put 6
[[]] // Misc 7
];
//------------------------- Config handling
private _configEntries = "(getNumber (_x >> 'scope')) == 2" configClasses (configFile >> QGVAR(stats));
{
private _finalArray = [];
private _class = configName _x;
private _stats = getArray (_x >> "stats");
private _displayName = getText (_x >> "displayName");
private _showBar = getNumber (_x >> "showBar") == 1;
private _showText = getNumber (_x >> "showText") == 1;
private _condition = getText (_x >> "condition");
private _priority = getNumber (_x >> "priority");
(getArray (_x >> "tabs")) params ["_leftTabsList", "_rightTabsList"];
if (_condition != "") then {
_condition = compile _condition;
};
_finalArray = ["", _stats, _displayName, [_showBar, _showText], [{}, {}, _condition], _priority];
if (_showBar) then {
private _barStatement = compile (getText (_x >> "barStatement"));
(_finalArray select 4) set [0, _barStatement];
};
if (_showText) then {
private _textStatement = compile (getText (_x >> "textStatement"));
(_finalArray select 4) set [1, _textStatement];
};
TRACE_3("stats array", _finalArray, _leftTabsList, _rightTabsList);
if (count _leftTabsList > 0) then {
[_statsListLeftPanel, _leftTabsList, "L"] call _fnc_addToTabs;
};
if (count _rightTabsList > 0) then {
[_statsListRightPanel, _rightTabsList, "R"] call _fnc_addToTabs;
};
} foreach _configEntries;
[_statsListLeftPanel] call _fnc_sortLists;
[_statsListRightPanel] call _fnc_sortLists;
//------------------------- Config Handling
missionNamespace setVariable [QGVAR(statsListLeftPanel), _statsListLeftPanel];
missionNamespace setVariable [QGVAR(statsListRightPanel), _statsListRightPanel];

View File

@ -44,11 +44,6 @@ if (count _LMB > 0) then {
_helperPos set [2,(_helperPos select 2) max ((boundingboxreal GVAR(center) select 0 select 2) + 0.2)];
//--- Do not let target go below ground
private _posZmin = 0.1;
private _targetWorldPosZ = (GVAR(center) modeltoworldvisual _helperPos) select 2;
if (_targetWorldPosZ < _posZmin) then {_helperPos set [2,(_helperPos select 2) - _targetWorldPosZ + _posZmin];};
GVAR(cameraPosition) set [3,_helperPos];
};

View File

@ -0,0 +1,244 @@
/*
* Author: Alganthe
* Handles the stats control group
*
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Current panel control <CONTROL>
* 2: Current panel selection <SCALAR>
* 3: Item config entry <CONFIG>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
#include "..\defines.hpp"
params ["_display", "_control", "_curSel", "_itemCfg"];
private _statsBoxCtrl = _display displayCtrl IDC_statsBox;
private _statsPreviousPageCtrl = _display displayCtrl IDC_statsPreviousPage;
private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage;
private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage;
private _hideUnusedFnc = {
params ["_numbers"];
{
private _statsTitleCtrl = _display displayCtrl (5101 + ((_x - 1) * 4));
private _statsTitleIDC = ctrlIDC _statsTitleCtrl;
private _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1);
private _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2);
private _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3);
{
_x ctrlSetFade 1;
_x ctrlCommit 0;
} forEach [
_statsTitleCtrl,
_statsBackgroundCtrl,
_statsBarCtrl,
_statsTextCtrl
];
} forEach _numbers;
};
if !(isNil "_itemCfg") then {
private _handleStatsFnc = {
params ["_statsIndex", "_leftPanel"];
// Get the proper list and page
if (_leftPanel) then {
[true, (GVAR(statsListLeftPanel)) select _statsIndex, GVAR(statsPagesLeft) select _statsIndex]
} else {
[false, (GVAR(statsListRightPanel)) select _statsIndex, GVAR(statsPagesRight) select _statsIndex]
} params ["_isLeftPanel", "_statsArray", "_currentPage"];
private _statsList = _statsArray select _currentPage;
private _statsCount = 0;
// Handle titles, bars and text
_statsList = _statsList select [0, 5];
if !(_statsList isEqualTo []) then {
{
_x params ["_ID", "_configEntry", "_title", "_bools", "_statements"];
_bools params ["_showBar", "_showText"];
_statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]];
private _statsTitleCtrl = _display displayCtrl (5101 + _forEachIndex * 4);
private _statsTitleIDC = ctrlIDC _statsTitleCtrl;
private _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1);
private _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2);
private _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3);
_statsCount = _statsCount + 1;
_statsTitleCtrl ctrlSetText _title;
_statsTitleCtrl ctrlSetFade 0;
// Handle bars
if (_showBar) then {
_statsBarCtrl progressSetPosition ([_configEntry, _itemCfg] call _barStatement);
_statsBackgroundCtrl ctrlSetFade 0;
_statsBarCtrl ctrlSetFade 0;
} else {
_statsBackgroundCtrl ctrlSetFade 1;
_statsBarCtrl ctrlSetFade 1;
};
// Handle text entries
if (_showText) then {
private _textStatementResult = [_configEntry, _itemCfg] call _textStatement;
if (_textStatementResult isEqualtype "") then {
_statsTextCtrl ctrlSetText _textStatementResult;
} else {
_statsTextCtrl ctrlSetText (str _textStatementResult);
};
_statsTextCtrl ctrlSetTextColor ([[1,1,1,1], [0,0,0,1]] select (_showBar));
_statsTextCtrl ctrlSetFade 0;
} else {
_statsTextCtrl ctrlSetFade 1;
};
{
_x ctrlCommit 0;
} forEach [
_statsTitleCtrl,
_statsBackgroundCtrl,
_statsBarCtrl,
_statsTextCtrl
];
} forEach (_statsList select {
_x params ["_ID","_configEntry", "_title", "_bools", "_statements"];
_statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]];
([_configEntry, _itemCfg] call _condition)
});
};
// Resize the window
[[1, 2, 3, 4, 5] select [_statsCount, 5]] call _hideUnusedFnc;
_statsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
safezoneY + 1.8 * GRID_H,
47 * GRID_W,
([11, (10 * _statsCount) + 5] select (_statsCount > 0)) * GRID_H
];
_statsBoxCtrl ctrlCommit 0;
GVAR(statsInfo) = [_isLeftPanel, _statsIndex, _control, _curSel, _itemCfg];
// Toggle page buttons
_statsPreviousPageCtrl ctrlEnable !(_currentPage == 0);
_statsNextPageCtrl ctrlEnable !(_currentPage + 1 >= count _statsArray);
_statsCurrentPageCtrl ctrlSetText ([localize LSTRING(page), str (_currentPage + 1)] joinString " ");
{
_x ctrlSetFade 0;
_x ctrlCommit 0;
} forEach [
_statsPreviousPageCtrl,
_statsNextPageCtrl,
_statsCurrentPageCtrl
];
};
if (ctrlIDC _control == IDC_leftTabContent) then {
if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsigna] find GVAR(currentLeftPanel) > -1) then {
[[1, 2, 3, 4, 5]] call _hideUnusedFnc;
_statsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
safezoneY + 1.8 * GRID_H,
47 * GRID_W,
11 * GRID_H
];
_statsBoxCtrl ctrlCommit 0;
{
_x ctrlSetFade 1;
_x ctrlCommit 0;
} forEach [
_statsPreviousPageCtrl,
_statsNextPageCtrl,
_statsCurrentPageCtrl
];
} else {
[[
IDC_buttonPrimaryWeapon,
IDC_buttonHandgun,
IDC_buttonSecondaryWeapon,
IDC_buttonUniform,
IDC_buttonVest,
IDC_buttonBackpack,
IDC_buttonHeadgear,
IDC_buttonGoggles,
IDC_buttonNVG,
IDC_buttonBinoculars,
IDC_buttonMap,
IDC_buttonGPS,
IDC_buttonRadio,
IDC_buttonCompass,
IDC_buttonWatch
] find GVAR(currentLeftPanel), true] call _handleStatsFnc;
};
} else {
switch (GVAR(currentRightPanel)) do {
case IDC_buttonOptic: {
[0, false] call _handleStatsFnc;
};
case IDC_buttonItemAcc: {
[1, false] call _handleStatsFnc;
};
case IDC_buttonMuzzle: {
[2, false] call _handleStatsFnc;
};
case IDC_buttonBipod: {
[3, false] call _handleStatsFnc;
};
case IDC_buttonCurrentMag;
case IDC_buttonCurrentMag2;
case IDC_buttonMag;
case IDC_buttonMagALL: {
[4, false] call _handleStatsFnc;
};
case IDC_buttonThrow: {
[5, false] call _handleStatsFnc;
};
case IDC_buttonPut: {
[6, false] call _handleStatsFnc;
};
case IDC_buttonMisc: {
[7, false] call _handleStatsFnc;
};
};
};
} else {
[[1, 2, 3, 4, 5]] call _hideUnusedFnc;
_statsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
safezoneY + 1.8 * GRID_H,
47 * GRID_W,
11 * GRID_H
];
_statsBoxCtrl ctrlCommit 0;
{
_x ctrlSetFade 1;
_x ctrlCommit 0;
} forEach [
_statsPreviousPageCtrl,
_statsNextPageCtrl,
_statsCurrentPageCtrl
];
};

View File

@ -49,7 +49,7 @@ if (_global && {isMultiplayer} && {{_object in _x} count GVAR(EHIDArray) == 0})
{
params ["_target", "_player"];
[_player, _target, ["isNotSwimming", "isNotCarrying", "isNotDragging", "notOnMap", "isNotEscorting", "isNotOnLadder"]] call EFUNC(common,canInteractWith)
[_player, _target] call EFUNC(common,canInteractWith)
},
{},
[]

View File

@ -25,6 +25,8 @@ if (isClass _itemCfg) then {
_ctrlInfo ctrlSetFade 0;
_ctrlInfo ctrlCommit FADE_DELAY;
[QGVAR(displayStats), [_display, _control, _curSel, _itemCfg]] call CBA_fnc_localEvent;
// Name + author
private _ctrlInfoName = _display displayCtrl IDC_infoName;
_ctrlInfoName ctrlSetText ([_control lbText _curSel, _control lnbText [_curSel, 1]] select (ctrlType _control == 102));
@ -70,6 +72,8 @@ if (isClass _itemCfg) then {
_ctrlDLCBackground ctrlcommit 0;
} else {
[QGVAR(displayStats), [_display, _control, -1, nil]] call CBA_fnc_localEvent;
_ctrlInfo ctrlSetFade 1;
_ctrlInfo ctrlCommit FADE_DELAY;
};

View File

@ -14,19 +14,11 @@
(_this select 1) params ["", "_exitCode"];
GVAR(camera) cameraEffect ["terminate", "back"];
private _cameraData = [getposAtl GVAR(camera), (getposAtl GVAR(camera)) vectorFromTo (getposAtl GVAR(cameraHelper))];
[QGVAR(displayClosed), []] call CBA_fnc_localEvent;
removeMissionEventHandler ["draw3D", GVAR(camPosUpdateHandle)];
GVAR(camera) cameraEffect ["terminate","back"];
player switchCamera GVAR(cameraView);
deleteVehicle GVAR(cameraHelper);
camDestroy GVAR(camera);
if (is3DEN) then {
private _centerOriginParent = objectParent GVAR(centerOrigin);
@ -62,8 +54,18 @@ if (is3DEN) then {
case 1: {GVAR(center) selectWeapon secondaryWeapon GVAR(center);};
case 2: {GVAR(center) selectWeapon handgunWeapon GVAR(center);};
};
if (!(isnull curatorCamera) && {ACE_player == player}) then {
curatorcamera cameraEffect ["internal","back"];
} else {
GVAR(camera) cameraEffect ["terminate","back"];
ACE_player switchCamera GVAR(cameraView);
};
};
deleteVehicle GVAR(cameraHelper);
camDestroy GVAR(camera);
if (isMultiplayer) then {
[QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(center) + "_face"] call CBA_fnc_globalEventJIP;
@ -73,10 +75,6 @@ if (isMultiplayer) then {
[QGVAR(center) + "_voice", GVAR(center)] call CBA_fnc_removeGlobalEventJIP;
};
if !(isnull curatorCamera) then {
curatorcamera cameraEffect ["internal","back"];
};
GVAR(camera) = nil;
GVAR(cameraHelper) = nil;
@ -98,6 +96,12 @@ GVAR(currentVoice) = nil;
GVAR(currentInsignia) = nil;
GVAR(currentAction) = nil;
GVAR(showStats) = nil;
GVAR(statsPagesLeft) = nil;
GVAR(statsPagesRight) = nil;
GVAR(statsInfo) = nil;
GVAR(center) = nil;
GVAR(centerNotPlayer) = nil;
showHUD true;

View File

@ -55,6 +55,11 @@ GVAR(currentInsignia) = GVAR(center) param [0, objNull, [objNull]] getVariable [
GVAR(currentAction) = "Stand";
GVAR(shiftState) = false;
GVAR(showStats) = true;
GVAR(statsPagesLeft) = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
GVAR(statsPagesRight) = [0, 0, 0, 0, 0, 0, 0, 0];
GVAR(statsInfo) = [true, 0, controlNull, nil, nil];
// Add the items the player has to virtualItems
for "_index" from 0 to 10 do {
switch (_index) do {
@ -87,8 +92,8 @@ for "_index" from 0 to 10 do {
if (_x != "") then {
(GVAR(virtualItems) select _index) select ([2, 1, 0, 3] select _forEachIndex) pushBackUnique _x;
};
} foreach _x;
} foreach _accsArray;
} forEach _x;
} forEach _accsArray;
{
if !(_x isEqualTo []) then {
@ -101,7 +106,7 @@ for "_index" from 0 to 10 do {
(GVAR(virtualItems) select 2) pushBackUnique (_x select 1);
};
};
} foreach _magsArray;
} forEach _magsArray;
};
// Inventory items
@ -113,7 +118,7 @@ for "_index" from 0 to 10 do {
default {
private _array = (LIST_DEFAULTS select _index) select {!(_x isEqualTo "")};
if !(_array isEqualTo []) then {
{(GVAR(virtualItems) select _index) pushBackUnique _x} foreach _array;
{(GVAR(virtualItems) select _index) pushBackUnique _x} forEach _array;
};
};
};
@ -163,7 +168,7 @@ for "_index" from 0 to 15 do {
private _index = 10 + (["itemmap", "itemcompass", "itemradio", "itemwatch", "itemgps"] find (tolower _simulationType));
GVAR(currentItems) set [_index, _x];
} foreach (assignedItems GVAR(center));
} forEach (assignedItems GVAR(center));
GVAR(currentWeaponType) = switch true do {
case (currentWeapon GVAR(center) == GVAR(currentItems) select 0): {0};
@ -172,7 +177,7 @@ GVAR(currentWeaponType) = switch true do {
default {-1};
};
[QGVAR(displayOpened), []] call CBA_fnc_localEvent;
[QGVAR(displayOpened), [_display]] call CBA_fnc_localEvent;
//--------------- Fade out unused elements
private _mouseBlockCtrl = _display displayCtrl IDC_mouseBlock;
@ -184,7 +189,7 @@ _mouseBlockCtrl ctrlEnable false;
_x ctrlSetFade 1;
_x ctrlShow false;
_x ctrlCommit 0;
} foreach [
} forEach [
IDC_blockRightFrame,
IDC_blockRighttBackground,
IDC_loadIndicator,
@ -199,6 +204,20 @@ _mouseBlockCtrl ctrlEnable false;
IDC_rightSearchbar
];
// Handle stats
private _statsBoxCtrl = _display displayCtrl IDC_statsBox;
_statsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
safezoneY + 1.8 * GRID_H,
47 * GRID_W,
11 * GRID_H
];
_statsBoxCtrl ctrlEnable false;
_statsBoxCtrl ctrlCommit 0;
(_display displayCtrl IDC_statsButton) ctrlShow false;
// Disable import in MP
if (isMultiplayer) then {
private _importButtonCtrl = _display displayCtrl IDC_buttonImport;
_importButtonCtrl ctrlEnable false;
@ -258,8 +277,8 @@ if (is3DEN) then {
private _ctrl = _display displayctrl _x;
_ctrl ctrlEnable false;
_ctrl ctrlSetFade 0.6;
_ctrl ctrlcommit 0;
} foreach [
_ctrl ctrlCommit 0;
} forEach [
IDC_buttonFace,
IDC_buttonVoice,
IDC_buttonInsigna
@ -267,6 +286,19 @@ if (is3DEN) then {
_buttonCloseCtrl = _display displayCtrl IDC_menuBarClose;
_buttonCloseCtrl ctrlSetText (localize "str_ui_debug_but_apply");
} else {
GVAR(centerNotPlayer) = (GVAR(center) != player);
{
private _ctrl = _display displayCtrl _x;
_ctrl ctrlEnable GVAR(enableIdentityTabs);
_ctrl ctrlSetFade ([0.6, 0] select GVAR(enableIdentityTabs));
_ctrl ctrlCommit 0;
} forEach [
IDC_buttonFace,
IDC_buttonVoice,
IDC_buttonInsigna
];
};
//--------------- Prepare the left panel
@ -282,7 +314,7 @@ GVAR(rightTabLnBFocus) = false;
private _panel = _display displayCtrl _x;
_panel ctrlSetFontHeight (GVAR(fontHeight) * GRID_H);
_panel ctrlCommit 0;
} foreach [IDC_leftTabContent, IDC_rightTabContent, IDC_rightTabContentListnBox];
} forEach [IDC_leftTabContent, IDC_rightTabContent, IDC_rightTabContentListnBox];
[_display, _display displayCtrl IDC_buttonPrimaryWeapon] call FUNC(fillLeftPanel);

View File

@ -85,9 +85,31 @@ if !(_loadoutsDisplay isEqualTo displayNull) then {
case (_keyPressed == DIK_BACKSPACE): {
[_display] call FUNC(buttonHide);
};
// Export button
// Export button / export classname
case (_keyPressed == DIK_C && {_ctrlState}): {
[_display] call FUNC(buttonExport);
if (GVAR(leftTabFocus) || {GVAR(rightTabFocus)} || {GVAR(rightTabLnBFocus)}) then {
switch true do {
case (GVAR(leftTabFocus)): {
private _control = (_display displayCtrl IDC_leftTabContent);
_control lbData (lbCurSel _control)
};
case (GVAR(rightTabFocus)): {
private _control = (_display displayCtrl IDC_rightTabContent);
_control lbData (lbCurSel _control)
};
case (GVAR(rightTabLnBFocus)): {
private _control = (_display displayCtrl IDC_rightTabContentListnBox);
_control lnbData [(lnbCurSelRow _control), 0]
};
} params ["_className"];
"ace_clipboard" callExtension (_className + ";");
"ace_clipboard" callExtension "--COMPLETE--";
[_display, localize LSTRING(exportedClassnameText)] call FUNC(message);
} else {
[_display] call FUNC(buttonExport);
};
};
// Import button
case (_keyPressed == DIK_V && {_ctrlState}): {
@ -124,6 +146,18 @@ if !(_loadoutsDisplay isEqualTo displayNull) then {
playsound ["RscDisplayCurator_visionMode",true];
};
// Panel up down
case (_keyPressed in [DIK_UP, DIK_DOWN]): {
if (GVAR(leftTabFocus) || {GVAR(rightTabFocus)} || {GVAR(rightTabLnBFocus)}) then {
_return = false;
};
};
// Right panel lnb + and - buttons
case (_keyPressed in [DIK_LEFT, DIK_RIGHT]): {
if (GVAR(rightTabLnBFocus)) then {
[_display, [1, 0] select (_keyPressed == DIK_LEFT)] call FUNC(buttonCargo);
};
};
};
} else {
switch true do {
@ -167,22 +201,6 @@ if !(_loadoutsDisplay isEqualTo displayNull) then {
};
};
};
if (GVAR(leftTabFocus) && {_keyPressed in [DIK_UP, DIK_DOWN]}) then {
_return = false;
};
if (GVAR(rightTabFocus) && {_keyPressed in [DIK_UP, DIK_DOWN]}) then {
_return = false;
};
if (GVAR(rightTabLnBFocus) && {_keyPressed in [DIK_UP, DIK_DOWN]}) then {
_return = false;
};
if (GVAR(rightTabLnBFocus) && {_keyPressed in [DIK_LEFT, DIK_RIGHT]}) then {
[_display, [1, 0] select (_keyPressed == DIK_LEFT)] call FUNC(buttonCargo);
};
};
_return

View File

@ -22,7 +22,7 @@ params [["_object", objNull, [objNull]], ["_center", objNull, [objNull]], ["_mod
if (
isNull _object ||
{isNull _center} ||
{!(_center isKindOf "Man")} ||
{!(_center isKindOf "CAManBase")} ||
{!(isNull objectParent _center) && {!is3DEN}}
) exitWith {};

View File

@ -0,0 +1,66 @@
/*
* Author: Alganthe
* Remove a stat from ACE Arsenal.
*
* Arguments:
* 0: Array of IDs (ARRAY)
*
* Return Value:
* None
*
* Example:
* [["scopeStatL00","scopeStatL01","scopeStatL02","scopeStatR07"]] call ace_arsenal_fnc_removeStat;
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_IDList"];
call FUNC(compileStats);
{
private _currentID = _x;
private _stringCount = count _currentID;
private _side = _currentID select [_stringCount - 3, 1];
private _tab = _currentID select [_stringCount - 2, 2];
_tab = parseNumber _tab;
private _tabToChange = if (_side == "R") then {
GVAR(statsListRightPanel) select _tab
} else {
GVAR(statsListLeftPanel) select _tab
};
{
private _currentPage = _x;
{
if (_x select 0 == _currentID) then {
_currentPage deleteAt _forEachIndex;
};
} foreach _currentPage;
} foreach _tabToChange;
} foreach _IDList;
// Clear empty pages
private _fnc_deleteEmptyPage = {
params ["_list"];
{
private _evaluatedTab = _forEachIndex;
{
if (count _x == 0) then {
_markedForDeletion pushBack [_evaluatedTab, _forEachIndex];
};
} foreach _x;
{
(_list select (_x select 0)) deleteAt (_x select 1);
} foreach _markedForDeletion;
} foreach (_this select 0);
};
private _markedForDeletion = [];
[GVAR(statsListLeftPanel)] call _fnc_deleteEmptyPage;
[GVAR(statsListRightPanel)] call _fnc_deleteEmptyPage;

View File

@ -13,7 +13,7 @@
#include "script_component.hpp"
#include "..\defines.hpp"
if (GVAR(centerNotPlayer)) exitWith {};
private _nextAction = switch (GVAR(currentLeftPanel)) do {

View File

@ -0,0 +1,30 @@
/*
* Author: Alganthe
* Generic bar statement for stats.
*
* Arguments:
* 0: stat (STRING)
* 1: item config path (CONFIG)
* 2: Args for configExtreme
* 2.1: Stat limits (ARRAY of BOOL)
* 2.2: Bar limits (ARRAY of SCALAR)
* 2.3: Evaluate as a logarithmic number (BOOL)
*
* Return Value:
* Number
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_stat", "_config", "_args"];
_args params ["_statMinMax", "_barLimits", "_configExtremeBool"];
private _statValues = [
[_config],
[_stat],
[_configExtremeBool],
[_statMinMax select 0]
] call BIS_fnc_configExtremes;
linearConversion [_statMinMax select 0, _statMinMax select 1, (_statValues select 1) select 0, _barLimits select 0, _barLimits select 1]

View File

@ -0,0 +1,34 @@
/*
* Author: Alganthe
* Impact bar statement.
*
* Arguments:
* 0: stats array (ARRAY)
* 1: item config path (CONFIG)
* 2: Args for configExtreme
* 2.1: Stat limits (ARRAY of BOOL)
* 2.2: Bar limits (ARRAY of SCALAR)
* 2.3: Evaluate as a logarithmic number (BOOL)
*
* Return Value:
* Number
*
* Public: No
*/
#include "script_component.hpp"
params ["_stats", "_config", "_args"];
_args params ["_hitMinMax", "_initSpeedMinMax", "_launcherTabIDC"];
private _statValues = [
[_config],
_stats,
[true, false],
[_hitMinMax select 0, _initSpeedMinMax select 0]
] call BIS_fnc_configExtremes;
(_statValues select 1) params ["_hit", "_initSpeed"];
_hit = linearConversion [_hitMinMax select 0, _hitMinMax select 1, _hit, 0.01, 1];
_initSpeed = linearConversion [_initSpeedMinMax select 0, _initSpeedMinMax select 1, _initSpeed, 0.01, 1];
[sqrt(_hit^2 * _initSpeed), _hit] select (GVAR(currentLeftPanel) == _launcherTabIDC)

View File

@ -0,0 +1,31 @@
/*
* Author: Alganthe
* Accuracy text statement.
*
* Arguments:
* 0: stat (STRING)
* 1: item config path (CONFIG)
* 2: Args for configExtreme
* 2.1: Stat limits (ARRAY of BOOL)
* 2.2: Evaluate as a logarithmic number (BOOL)
*
* Return Value:
* Number
*
* Public: No
*/
#include "script_component.hpp"
params ["_stat", "_config", "_args"];
_args params ["_statMinMax", "_configExtremeBool"];
private _statValues = [
[_config],
[_stat],
[_configExtremeBool],
[_statMinMax select 0]
] call BIS_fnc_configExtremes;
private _dispersion = (_statValues select 1) select 0;
format ["%1 MIL (%2 MOA)", (_dispersion * 1000) toFixed 2, (_dispersion / pi * 10800) ToFixed 1];

View File

@ -0,0 +1,28 @@
/*
* Author: Alganthe
* Text statement for the mass stat.
*
* Arguments:
* 0: not used
* 1: item config path (CONFIG)
*
* Return Value:
* String to display
*
* Public: No
*/
#include "script_component.hpp"
params ["", "_config"];
private _mass = getNumber (_config >> "mass");
if (_mass == 0 && {isClass (_config >> "itemInfo")}) then {
_mass = getNumber (_config >> "itemInfo" >> "mass");
};
if (_mass == 0 && {isClass (_config >> "WeaponSlotsInfo")}) then {
_mass = getNumber (_config >> "WeaponSlotsInfo" >> "mass");
};
format ["%1kg (%2lb)",((_mass * 0.1 * (1/2.2046) * 100) / 100) ToFixed 2, ((_mass * 0.1 * 100) / 100) ToFixed 2]

View File

@ -0,0 +1,29 @@
/*
* Author: Alganthe
* ROF text statement.
*
* Arguments:
* 0: stat (STRING)
* 1: item config path (CONFIG)
* 2: Args for configExtreme
* 2.1: Stat limits (ARRAY of BOOL)
* 2.2: Evaluate as a logarithmic number (BOOL)
*
* Return Value:
* Number
*
* Public: No
*/
#include "script_component.hpp"
params ["_stat", "_config", "_args"];
_args params ["_statMinMax", "_configExtremeBool"];
private _statValues = [
[_config],
[_stat],
[_configExtremeBool],
[_statMinMax select 0]
] call BIS_fnc_configExtremes;
format ["%1 rpm", round (60 / ((_statValues select 1) select 0))]

View File

@ -0,0 +1,26 @@
/*
* Author: PabstMirror
* Text statement for the scope magnification stat.
*
* Arguments:
* 0: not used
* 1: item config path (CONFIG)
*
* Return Value:
* String to display
*
* Public: No
*/
#include "script_component.hpp"
params ["", "_config"];
TRACE_1("statTextStatement_scopeMag",_config);
private _minZoom = 999; // FOV, so smaller is more zoomed in
{
_minZoom = _minZoom min (getNumber (_x >> "opticsZoomMin"));
} forEach configProperties [_config >> "ItemInfo" >> "OpticsModes"];
if (_minZoom in [0, 999]) exitWith {"?"};
format ["%1x", (0.25/_minZoom) toFixed 1]

View File

@ -19,9 +19,3 @@ GVAR(cameraHelper) attachTo [GVAR(center), GVAR(cameraPosition) select 3, ""]; /
GVAR(camera) setPos (GVAR(cameraHelper) modelToWorld [0, -_distance, 0]);
GVAR(camera) setVectorDirAndUp [vectorDir GVAR(cameraHelper), vectorUp GVAR(cameraHelper)];
//--- Make sure the camera is not underground
if ((getPosAsl GVAR(camera) select 2) < (getPosAsl GVAR(center) select 2)) then {
private _disCoef = ((getPosAsl GVAR(cameraHelper) select 2) - (getPosAsl GVAR(center) select 2)) / ((getPosAsl GVAR(cameraHelper) select 2) - (getPosAsl GVAR(camera) select 2) + 0.001);
GVAR(camera) setPos (GVAR(cameraHelper) modelToWorldVisual [0, -_distance * _disCoef, 0]);
};

View File

@ -60,13 +60,13 @@ private _fnc_weaponCheck = {
if (isClass (_magCfg >> _mag)) then {
if !(_mag in (GVAR(virtualItems) select 2)) then {
_unavailableItemsList pushBackUnique _item;
_unavailableItemsList pushBackUnique _mag;
_dataPath set [_forEachIndex, []];
_unavailableItemsAmount = _unavailableItemsAmount + 1;
};
} else {
_nullItemsList pushBackUnique _item;
_nullItemsList pushBackUnique _mag;
_dataPath set [_forEachIndex, []];
_nullItemsAmount = _nullItemsAmount + 1;
};

View File

@ -9,6 +9,8 @@
<Japanese>非表示</Japanese>
<Italian>Nascondere</Italian>
<Korean>숨김</Korean>
<Chinese>隱藏</Chinese>
<Chinesesimp>隐藏</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonHideTooltip">
<English>Hide interface</English>
@ -18,6 +20,8 @@
<Japanese>インターフェイスを隠す</Japanese>
<Italian>Nascondi interfaccia</Italian>
<Korean>인터페이스 숨기기</Korean>
<Chinese>隱藏介面</Chinese>
<Chinesesimp>隐藏介面</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonLoadoutsText">
<English>Loadouts</English>
@ -27,6 +31,8 @@
<Japanese>装備</Japanese>
<Italian>Equipaggiamenti</Italian>
<Korean>로드아웃</Korean>
<Chinese>裝備</Chinese>
<Chinesesimp>装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonExportText">
<English>Export</English>
@ -36,6 +42,8 @@
<Japanese>出力</Japanese>
<Italian>Esporta</Italian>
<Korean>내보내기</Korean>
<Chinese>匯出</Chinese>
<Chinesesimp>汇出</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonImportText">
<English>Import</English>
@ -45,6 +53,8 @@
<Japanese>取込</Japanese>
<Italian>Importa</Italian>
<Korean>가져오기</Korean>
<Chinese>匯入</Chinese>
<Chinesesimp>汇入</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonCloseText">
<English>Close</English>
@ -54,6 +64,8 @@
<Japanese>閉じる</Japanese>
<Italian>Chiudi</Italian>
<Korean>닫기</Korean>
<Chinese>關閉</Chinese>
<Chinesesimp>关闭</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_noVirtualItems">
<English>No virtual item available</English>
@ -63,6 +75,8 @@
<Japanese>利用可能なバーチャル アイテムは無し</Japanese>
<Italian>Nessun oggetto virtuale disponibile</Italian>
<Korean>가상장비 사용 불가</Korean>
<Chinese>沒有可用的虛擬物品</Chinese>
<Chinesesimp>没有可用的虚拟物品</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSaveText">
<English>Save</English>
@ -72,6 +86,8 @@
<Japanese>保存</Japanese>
<Italian>Salva</Italian>
<Korean>저장</Korean>
<Chinese>保存</Chinese>
<Chinesesimp>保存</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSaveTooltip">
<English>Save the current loadout</English>
@ -81,6 +97,8 @@
<Japanese>現在の装備を保存します</Japanese>
<Italian>Salva l'equipaggiamento corrente</Italian>
<Korean>현재 로드아웃 저장</Korean>
<Chinese>保存當前的裝備</Chinese>
<Chinesesimp>保存当前的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonRenameText">
<English>Rename</English>
@ -90,15 +108,19 @@
<Japanese>改名</Japanese>
<Italian>Rinomina</Italian>
<Korean>이름바꾸기</Korean>
<Chinese>重新命名</Chinese>
<Chinesesimp>重新命名</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonRenameTooltip">
<English>Rename the selected loadout</English>
<French>Renomme l'équipement sélectionné</French>
<German>Ausgewählte Ausrüstung umbenennen</German>
<Polish>Zmień nazwę wybranego zestawu</Polish>
<Japanese>現在選択中の装備を改名します</Japanese>
<Japanese>選択中の装備を改名します</Japanese>
<Italian>Rinomina l'equipaggiamento selezionato</Italian>
<Korean>선택한 로드아웃의 이름 바꾸기</Korean>
<Chinese>重新命名當前選擇的裝備</Chinese>
<Chinesesimp>重新命名当前选择的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonLoadText">
<English>Load</English>
@ -108,15 +130,19 @@
<Japanese>読み込む</Japanese>
<Italian>Carica</Italian>
<Korean>불러오기</Korean>
<Chinese>載入</Chinese>
<Chinesesimp>载入</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonLoadTooltip">
<English>Load the selected loadout</English>
<French>Charger l'équipement sélectionné</French>
<German>Ausgewählte Ausrüstung laden</German>
<Polish>Wczytaj wybrany zestaw</Polish>
<Japanese>現在選択中の装備を読み込みます</Japanese>
<Japanese>選択中の装備を読み込みます</Japanese>
<Italian>Carica l'equipaggiamento selezionato</Italian>
<Korean>선택한 로드아웃 불러오기</Korean>
<Chinese>載入當前選擇的裝備</Chinese>
<Chinesesimp>载入当前选择的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonDeleteText">
<English>Delete</English>
@ -126,15 +152,19 @@
<Japanese>削除</Japanese>
<Italian>Elimina</Italian>
<Korean>삭제</Korean>
<Chinese>刪除</Chinese>
<Chinesesimp>删除</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonDeleteTooltip">
<English>Delete the selected loadout</English>
<French>Supprimer l'équipement sélectionné</French>
<German>Ausgewählte Ausrüstung entfernen</German>
<Polish>Skasuj wybrany zestaw</Polish>
<Japanese>現在選択中の装備を削除します</Japanese>
<Japanese>選択中の装備を削除します</Japanese>
<Italian>Elimina l'equipaggiamento selezionato</Italian>
<Korean>선택한 로드아웃 삭제하기</Korean>
<Chinese>刪除當前選擇的裝備</Chinese>
<Chinesesimp>删除当前选择的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_tabMyLoadoutsText">
<English>My loadouts</English>
@ -144,15 +174,19 @@
<Japanese>自分の装備</Japanese>
<Italian>I miei equipaggiamenti</Italian>
<Korean>내 로드아웃</Korean>
<Chinese>我的裝備</Chinese>
<Chinesesimp>我的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_tabMyLoadoutsTooltip">
<English>Loadouts saved in your profile</English>
<French>Équipements enregistrés dans votre profil</French>
<German>Ausrüstungen, die in deinem Profil gespeichert sind</German>
<Polish>Zestawy zapisane w Twoim profilu</Polish>
<Japanese>プロフィールに保存された装備です</Japanese>
<Japanese>プロフィールに保存された装備です</Japanese>
<Italian>Gli equipaggiamenti salvati nel tuo profilo</Italian>
<Korean>프로필에 저장된 로드아웃</Korean>
<Chinese>裝備已保存到你的設定檔中</Chinese>
<Chinesesimp>装备已保存到你的设定档中</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_tabDefaultLoadoutsText">
<English>Default loadouts</English>
@ -162,6 +196,8 @@
<Japanese>標準の装備</Japanese>
<Italian>Equipaggiamenti standard</Italian>
<Korean>기본 로드아웃</Korean>
<Chinese>預設裝備</Chinese>
<Chinesesimp>预设装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_tabDefaultLoadoutsTooltip">
<English>Loadouts made available by the mission maker</English>
@ -171,6 +207,8 @@
<Japanese>装備はミッション著者によって利用できます</Japanese>
<Italian>Equipaggiamenti resi disponibili dal creatore della missione</Italian>
<Korean>미션메이커가 허용한 로드아웃</Korean>
<Chinese>任務作者提供的預設裝備</Chinese>
<Chinesesimp>任务作者提供的预设装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_tabSharedLoadoutsText">
<English>Public loadouts</English>
@ -180,6 +218,8 @@
<Japanese>公開装備</Japanese>
<Italian>Equipaggiamenti pubblici</Italian>
<Korean>공용 로드아웃</Korean>
<Chinese>公用裝備</Chinese>
<Chinesesimp>公用装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_tabSharedLoadoutsTooltip">
<English>Loadouts shared by you and other players</English>
@ -189,6 +229,8 @@
<Japanese>自分か他人によって共有された装備です</Japanese>
<Italian>Equipaggiamenti condivisi da te e da altri giocatori</Italian>
<Korean>플레이어들이 공유하는 로드아웃</Korean>
<Chinese>由你與其他玩家分享的裝備配置</Chinese>
<Chinesesimp>由你与其他玩家分享的装备配置</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_sortByWeightText">
<English>Sort by weight</English>
@ -198,6 +240,8 @@
<Japanese>重量で並び替え</Japanese>
<Italian>Ordina per peso</Italian>
<Korean>무게로 정렬</Korean>
<Chinese>以重量排序</Chinese>
<Chinesesimp>以重量排序</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_sortByAmountText">
<English>Sort by amount</English>
@ -207,6 +251,8 @@
<Japanese>量で並び替え</Japanese>
<Italian>Ordina per quantitativo</Italian>
<Korean>갯수로 정렬</Korean>
<Chinese>以數量排序</Chinese>
<Chinesesimp>以数量排序</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonShareTooltip">
<English>Share or stop sharing the selected loadout</English>
@ -216,6 +262,8 @@
<Japanese>選択した装備の共有設定</Japanese>
<Italian>Condividi o smetti di condividere l'equipaggiamento selezionato</Italian>
<Korean>선택한 로드아웃 공유 혹은 공유중지</Korean>
<Chinese>開始/停止分享當前選擇的裝備</Chinese>
<Chinesesimp>开始/停止分享当前选择的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSharePrivateText">
<English>Private</English>
@ -225,6 +273,8 @@
<Japanese>非公開</Japanese>
<Italian>Privato</Italian>
<Korean>개인</Korean>
<Chinese>私用</Chinese>
<Chinesesimp>私用</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSharePublicText">
<English>Public</English>
@ -234,6 +284,8 @@
<Japanese>公開</Japanese>
<Italian>Pubblico</Italian>
<Korean>공용</Korean>
<Chinese>公用</Chinese>
<Chinesesimp>公用</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_exportDefaultError">
<English>The default loadouts list is empty!</English>
@ -243,6 +295,8 @@
<Japanese>標準の装備一欄が空です!</Japanese>
<Italian>La lista degli equipaggiamenti standard è vuota!</Italian>
<Korean>기본 로드아웃 목록이 비어있습니다!</Korean>
<Chinese>沒有預設的裝備清單!</Chinese>
<Chinesesimp>没有预设的装备清单!</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_exportDefault">
<English>Default loadouts list exported to clipboard</English>
@ -252,6 +306,8 @@
<Japanese>標準の装備一欄はクリップボードへ出力されました</Japanese>
<Italian>La lista degli equipaggiamenti standard è stata esportata negli appunti</Italian>
<Korean>클립보드에 기본 로드아웃 목록 내보내기</Korean>
<Chinese>預設的裝備清單已匯出到剪貼簿中</Chinese>
<Chinesesimp>预设的装备清单已汇出到剪贴簿中</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_exportCurrent">
<English>Current loadout exported to clipboard</English>
@ -261,6 +317,8 @@
<Japanese>現在の装備はクリップボードへ出力されました</Japanese>
<Italian>Equipaggiamento corrente esportato negli appunti</Italian>
<Korean>현재 로드아웃을 클립보드로 내보냈습니다.</Korean>
<Chinese>當前的裝備已匯出到剪貼簿中</Chinese>
<Chinesesimp>当前的装备已汇出到剪贴簿中</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_importFormatError">
<English>Wrong format provided</English>
@ -270,6 +328,8 @@
<Japanese>間違ったフォーマットが入力されました</Japanese>
<Italian>Formato fornito sbagliato</Italian>
<Korean>잘못된 형식 입력됨</Korean>
<Chinese>提供的格式錯誤</Chinese>
<Chinesesimp>提供的格式错误</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_importedDefault">
<English>Default loadouts list imported from clipboard</English>
@ -279,6 +339,8 @@
<Japanese>標準の装備一欄はクリップボードから取込されました</Japanese>
<Italian>La lista degli equipaggiamenti standard è stata importata dagli appunti</Italian>
<Korean>클립보드에서 기본 로드아웃 가져오기</Korean>
<Chinese>預設的裝備清單已從剪貼簿中匯入</Chinese>
<Chinesesimp>预设的装备清单已从剪贴簿中汇入</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_importedCurrent">
<English>Loadout imported from clipboard</English>
@ -288,6 +350,8 @@
<Japanese>装備はクリップボードから取込されました</Japanese>
<Italian>Equipaggiamento importato dagli appunti</Italian>
<Korean>클립보드에서 로드아웃을 가져왔습니다.</Korean>
<Chinese>裝備已從剪貼簿中匯入</Chinese>
<Chinesesimp>装备已从剪贴簿中汇入</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutDeleted">
<English>The following loadout was deleted:</English>
@ -297,6 +361,8 @@
<Japanese>次の装備は削除されました:</Japanese>
<Italian>Il seguente equipaggiamento è stato eliminato:</Italian>
<Korean>다음 로드아웃이 삭제됨 :</Korean>
<Chinese>以下的裝備已被刪除:</Chinese>
<Chinesesimp>以下的装备已被删除:</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutUnshared">
<English>The following loadout is not public anymore:</English>
@ -306,6 +372,8 @@
<Japanese>次の装備は非公開になりました:</Japanese>
<Italian>Il seguente eequipaggiamento non è più pubblico:</Italian>
<Korean>다음 로드아웃이 더이상 공용이 아님:</Korean>
<Chinese>以下的裝備已不再被分享:</Chinese>
<Chinesesimp>以下的装备已不再被分享:</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_saveEmptyNameBox">
<English>The name field is empty!</English>
@ -315,6 +383,8 @@
<Japanese>名前欄が空白です!</Japanese>
<Italian>Il campo del nome è vuoto!</Italian>
<Korean>이름칸이 비었습니다!</Korean>
<Chinese>名稱欄位為空!</Chinese>
<Chinesesimp>名称栏位为空!</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_saveAuthorError">
<English>You are the author of this loadout</English>
@ -324,6 +394,8 @@
<Japanese>あなたはこの装備の作者です</Japanese>
<Italian>Sei l'autore di questo equipaggiamento</Italian>
<Korean>이 로드아웃의 제작자입니다.</Korean>
<Chinese>你是這個裝備的作者</Chinese>
<Chinesesimp>你是这个装备的作者</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_saveSharedError">
<English>A loadout of yours with the same name is public</English>
@ -333,6 +405,8 @@
<Japanese>あなたの装備は既に公開されているものと同名です</Japanese>
<Italian>Un tuo equipaggiamento con lo stesso nome è pubblico</Italian>
<Korean>같은 이름의 로드아웃이 공용에 있습니다.</Korean>
<Chinese>已有相同名稱的裝備在公用分享區</Chinese>
<Chinesesimp>已有相同名称的装备在公用分享区</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutSaved">
<English>The following loadout was saved:</English>
@ -342,6 +416,8 @@
<Japanese>次の装備は保存されました:</Japanese>
<Italian>Il seguente equipaggiamento è stato salvato:</Italian>
<Korean>다음 로드아웃이 저장됨:</Korean>
<Chinese>以下的裝備已被保存:</Chinese>
<Chinesesimp>以下的装备已被保存:</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutLoaded">
<English>The following loadout was loaded:</English>
@ -351,6 +427,8 @@
<Japanese>次の装備が読み込みされました:</Japanese>
<Italian>Il seguente equipaggiamento è stato caricato:</Italian>
<Korean>다음 로드아웃을 불러옴:</Korean>
<Chinese>以下的裝備已被載入:</Chinese>
<Chinesesimp>以下的装备已被载入:</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_renameExistError">
<English>A loadout with the same name already exist!</English>
@ -360,6 +438,8 @@
<Japanese>既にその名前は装備に使われています!</Japanese>
<Italian>Un equipaggiamento con lo stesso nome è gia esistente!</Italian>
<Korean>같은 이름의 로드아웃이 이미 존재합니다!</Korean>
<Chinese>已有相同名稱的裝備!</Chinese>
<Chinesesimp>已有相同名称的装备!</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_loadoutRenamed">
<English>was renamed to</English>
@ -369,6 +449,8 @@
<Japanese>次の名前に改名されました</Japanese>
<Italian>E' stato rinominato in</Italian>
<Korean>이름이 다음과 같이 변경됨:</Korean>
<Chinese>已被改名為</Chinese>
<Chinesesimp>已被改名为</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_invertCameraSetting">
<English>Invert camera controls</English>
@ -378,6 +460,8 @@
<Japanese>カメラ操作を反転</Japanese>
<Italian>Inverti comandi camera</Italian>
<Korean>카메라 조종 반전</Korean>
<Chinese>反轉攝影機控制</Chinese>
<Chinesesimp>反转摄影机控制</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_modIconsSetting">
<English>Enable mod icons</English>
@ -387,6 +471,8 @@
<Japanese>MOD アイコンを表示</Japanese>
<Italian>Abilita icone mod</Italian>
<Korean>모드 아이콘 허가</Korean>
<Chinese>啟用模組圖示</Chinese>
<Chinesesimp>启用模组图示</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_fontHeightSetting">
<English>Panel font height</English>
@ -396,6 +482,8 @@
<Japanese>パネルにあるフォントの高さ</Japanese>
<Italian>Altezza carattere del pannello</Italian>
<Korean>패널 폰트 높이</Korean>
<Chinese>面板字體高度</Chinese>
<Chinesesimp>面板字体高度</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_allowDefaultLoadoutsSetting">
<English>Allow default loadouts</English>
@ -405,6 +493,8 @@
<Japanese>標準の装備を許可</Japanese>
<Italian>Consenti equipaggiamenti standard</Italian>
<Korean>기본 로드아웃 허용</Korean>
<Chinese>允許預設裝備</Chinese>
<Chinesesimp>允许预设装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_allowSharingSetting">
<English>Allow loadout sharing</English>
@ -414,6 +504,8 @@
<Japanese>装備の共有を許可</Japanese>
<Italian>Consenti condivisione equipaggiamenti</Italian>
<Korean>로드아웃 공유 허용</Korean>
<Chinese>允許分享裝備</Chinese>
<Chinesesimp>允许分享装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_printToRPTSetting">
<English>Log missing / unavailable items</English>
@ -423,6 +515,8 @@
<Japanese>欠落 / 利用不可アイテムを記録</Japanese>
<Italian>Log mancante / oggetto non disponibile</Italian>
<Korean>누락 된 항목 / 사용 할 수 없는 항목 기록</Korean>
<Chinese>記錄遺失/無法使用的項目</Chinese>
<Chinesesimp>记录遗失/无法使用的项目</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonCurrentMagTooltip">
<English>Primary magazine</English>
@ -432,6 +526,8 @@
<Italian>Caricatore primario</Italian>
<Korean>주무기 탄약</Korean>
<German>Primärmagazin</German>
<Chinese>主要武器彈匣</Chinese>
<Chinesesimp>主要武器弹匣</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonCurrentMag2Tooltip">
<English>Secondary magazine</English>
@ -441,6 +537,8 @@
<Italian>Caricatore secondario</Italian>
<Korean>보조무기 탄약</Korean>
<German>Sekundärmagazin</German>
<Chinese>次要武器彈匣</Chinese>
<Chinesesimp>次要武器弹匣</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_settingCategory">
<English>ACE Arsenal</English>
@ -450,6 +548,8 @@
<Japanese>ACE 武器庫</Japanese>
<Italian>Arsenale ACE</Italian>
<Korean>ACE 아스날</Korean>
<Chinese>ACE虛擬軍火庫</Chinese>
<Chinesesimp>ACE虚拟军火库</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_defaultLoadoutsTooltip">
<English>Allow the use of the default loadouts tab</English>
@ -459,6 +559,8 @@
<Italian>Consenti l'uso della sezione per gli equipaggiamenti standard</Italian>
<Korean>기본 로드아웃 탭 사용 허가</Korean>
<German>Erlaube die Nutzung des Standardausrüstungsreiters</German>
<Chinese>允許使用預設的裝備</Chinese>
<Chinesesimp>允许使用预设的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_modIconsTooltip">
<English>Show / hide mod icons for the left panel</English>
@ -468,6 +570,8 @@
<Italian>Mostra / nascondi le icone delle mod dal pannello sinistro</Italian>
<Korean>왼쪽 패널의 모드 아이콘 표시 / 숨기기</Korean>
<German>Zeigt/Versteckt Mod-Symbole in der linken Leiste</German>
<Chinese>在左面板中顯示/隱藏模組圖示</Chinese>
<Chinesesimp>在左面板中显示/隐藏模组图示</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_fontHeightTooltip">
<English>Change the font height for text in the left / right panels</English>
@ -477,6 +581,8 @@
<Italian>Cambia l'altezza del font per il testo sul pannello sinistro / destro</Italian>
<Korean>왼쪽 / 오른쪽 패널 텍스트의 글꼴 높이 변경</Korean>
<German>Ändert die Schriftgröße für die linke/rechte Leiste</German>
<Chinese>變更左/右面板中的字體高度</Chinese>
<Chinesesimp>变更左/右面板中的字体高度</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_printToRPTTooltip">
<English>Log missing / unavailable items in the RPT</English>
@ -486,6 +592,8 @@
<Italian>Log mancante / oggetto non disponibile nell' RPT</Italian>
<Korean>RPT에 누락 된 항목 / 사용할 수없는 항목 기록</Korean>
<German>Fehlende Gegenstände werden in der RPT aufgezeichnet</German>
<Chinese>記錄遺失/無法使用的項目到RPT檔案中</Chinese>
<Chinesesimp>记录遗失/无法使用的项目到RPT档案中</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_CantOpenDisplay">
<English>Unable to open ACE arsenal</English>
@ -494,6 +602,8 @@
<Italian>Impossibile aprire l'arsenale ACE</Italian>
<Japanese>ACE 武器庫を開けません</Japanese>
<Korean>ACE 아스날을 열 수 없음</Korean>
<Chinese>無法開啟ACE虛擬軍火庫</Chinese>
<Chinesesimp>无法开启ACE虚拟军火库</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_portLoadoutsText">
<English>Import BI VA loadouts to ACE Arsenal</English>
@ -501,13 +611,17 @@
<German>Importiert die BI-VA-Ausrüstungen in das ACE-Arsenal</German>
<Japanese>標準の VA 装備から ACE 武器庫へ取り込み</Japanese>
<Korean>바닐라 로드아웃을 ace 아스날로 가져오기</Korean>
<Chinese>匯入BI原廠虛擬軍火庫的裝備到ACE虛擬軍火庫中</Chinese>
<Chinesesimp>汇入BI原厂虚拟军火库的装备到ACE虚拟军火库中</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_portLoadoutsPlayerError">
<English>No player unit available! Place a unit and mark it as "Player".</English>
<French>Aucune unité joueur disponible ! Placez une unité et marquez la en tant que "joueur".</French>
<German>Keine Spielereinheit verfügbar. Setze eine Einheit und markiere sie als "Spieler".</German>
<Japanese>プレイヤー ユニットがありません!ユニットを設置しそれを"Player"と名付けてください。</Japanese>
<Japanese>プレイヤー ユニットがありません!ユニットを設置し"Player"と名付けてください。</Japanese>
<Korean>플레이어 유닛을 사용할 수 없습니다! 유닛을 놓고 "플레이어"라고 표시하십시오.</Korean>
<Chinese>沒有可用的玩家單位!請擺放一個單位並設定成"玩家"。</Chinese>
<Chinesesimp>没有可用的玩家单位!请摆放一个单位并设定成"玩家"。</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_portLoadoutsLoadoutError">
<English>No loadouts to import.</English>
@ -515,42 +629,102 @@
<German>Keine Ausrüstungen zum Importieren</German>
<Japanese>取り込みする装備がありません。</Japanese>
<Korean>가져올 로드 아웃이 없습니다.</Korean>
<Chinese>沒有裝備被匯入。</Chinese>
<Chinesesimp>没有装备被汇入。</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_Mission">
<English>ACE Arsenal</English>
<German>ACE-Arsenal</German>
<Japanese>ACE 武器庫</Japanese>
<Korean>ACE 아스날</Korean>
<Chinese>ACE虛擬軍火庫</Chinese>
<Chinesesimp>ACE虚拟军火库</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_ReturnToArsenal">
<English>Return to ACE Arsenal.</English>
<German>Zurück zum ACE-Arsenal.</German>
<Japanese>ACE 武器庫へ戻ります。</Japanese>
<Korean>ACE 아스날로 돌아가기</Korean>
<Chinese>返回到ACE虛擬軍火庫。</Chinese>
<Chinesesimp>返回到ACE虚拟军火库。</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_Mission_tooltip">
<English>Use ACE Arsenal to try out different weapons and equipment.</English>
<German>Verwende ACE-Arsenal und sieh dir verschiedene Waffen und Ausrüstung an und probiere sie aus.</German>
<Japanese>さまざまな武器と装備を試せるよう ACE 武器庫を使用します。</Japanese>
<Korean>ACE Arsenal을 사용하여 다른 무기와 장비를 시험해보십시오.</Korean>
<Chinese>使用ACE虛擬軍火庫來嘗試不同的武器與裝備。</Chinese>
<Chinesesimp>使用ACE虚拟军火库来尝试不同的武器与装备。</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_Mission_overview">
<English>Try weapons and equipment and create your own loadouts.</English>
<German>Probiere verschiedene Waffen und Ausrüstung aus und stelle dir eigene Ausrüstungsprofile zusammen.</German>
<Japanese>さまざまな武器と装備を試して、あなただけの装備を作成してください。</Japanese>
<Korean>무기와 장비를 사용해보고 자신의 로드아웃을 만듭니다.</Korean>
<Chinese>嘗試不同的武器與裝備來組合你個人的裝備配置。</Chinese>
<Chinesesimp>尝试不同的武器与装备来组合你个人的装备配置。</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonLoadoutsTooltip">
<English>Open the loadouts screen</English>
<French>Affiche la page des équipements</French>
<Chinese>開啟裝備選單</Chinese>
<Chinesesimp>开启装备选单</Chinesesimp>
<Japanese>装備画面を開く</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_buttonExportTooltip">
<English>Export current / default loadouts</English>
<French>Exporte l'équipement actuel ou la liste d'équipements de base</French>
<Chinese>匯出當前/預設的裝備</Chinese>
<Chinesesimp>汇出当前/预设的装备</Chinesesimp>
<Japanese>現在 / 標準装備を出力</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_buttonImportTooltip">
<English>Import current / default loadouts</English>
<French>Importer l'équipement actuel ou la liste d'équipements de base</French>
<Chinese>匯入當前/預設的裝備</Chinese>
<Chinesesimp>汇入当前/预设的装备</Chinesesimp>
<Japanese>現在 / 標準装備を取込</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_statPotassium">
<English>Potassium levels</English>
<French>Taux de potassium</French>
<Japanese>カリウム レベル</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_statMagnification">
<English>Magnification</English>
<Chinese>放大倍率</Chinese>
<French>Grossissement</French>
<Spanish>Aumento</Spanish>
<Italian>Ingrandimento</Italian>
<Polish>Powiększenie</Polish>
<Russian>Увеличение</Russian>
<German>Vergrößerung</German>
<Czech>Zvětšení</Czech>
<Portuguese>Aumentox</Portuguese>
<Korean>배율</Korean>
<Chinesesimp>放大倍数</Chinesesimp>
<Japanese>拡大倍率</Japanese>
<Turkish>Büyütme</Turkish>
</Key>
<Key ID="STR_ACE_Arsenal_page">
<English>Page</English>
<French>Page</French>
<Japanese>ページ</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_enableIdentityTabsSettings">
<English>Enable the faces / voices / insignias tabs</English>
<French>Activer les onglets faces / voix / insignes</French>
<Japanese>顔 / 声 / 記章タブを有効化</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_buttonClearContainerTooltip">
<English>Empty the selected container</English>
<French>Vider le conteneur selectionné</French>
<Japanese>選択されたコンテナは空です</Japanese>
</Key>
<Key ID="STR_ACE_Arsenal_exportedClassnameText">
<English>Exported class name to clipboard</English>
<French>Nom de classe exporté dans le presse papier</French>
<Japanese>クリップボードへクラスネームを出力</Japanese>
</Key>
</Package>
</Project>

View File

@ -42,7 +42,7 @@ class GVAR(display) {
idc = IDC_arrowMinus;
text = "-";
colorBackground[]={0,0,0,0.8};
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), -1)] call FUNC(buttonCargo));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), -1)] call FUNC(buttonCargo));
fade = 1;
enable = 0;
x = 0.5;
@ -53,7 +53,7 @@ class GVAR(display) {
};
class ArrowRight: ArrowLeft {
idc = IDC_arrowPlus;
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), 1)] call FUNC(buttonCargo));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), 1)] call FUNC(buttonCargo));
text="+";
};
class blockLeftFrame: RscFrame {
@ -177,7 +177,7 @@ class GVAR(display) {
sizeEx = QUOTE(5 * GRID_H);
shortcuts[] = {"0x0E"};
tooltip = CSTRING(buttonHideTooltip);
onButtonClick = QUOTE([ctrlparent (_this select 0)] call FUNC(buttonHide));
onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(buttonHide));
};
class buttonLoadouts: buttonHide {
idc = IDC_buttonLoadouts;
@ -191,14 +191,14 @@ class GVAR(display) {
x = QUOTE(3 * WIDTH_GAP + 2 * WIDTH_SINGLE);
text = CSTRING(buttonExportText);
tooltip = CSTRING(buttonExportTooltip);
onButtonClick = QUOTE([ctrlparent (_this select 0)] call FUNC(buttonExport));
onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(buttonExport));
};
class buttonImport: buttonHide {
idc = IDC_buttonImport;
x = QUOTE(4 * WIDTH_GAP + 3 * WIDTH_SINGLE);
text = CSTRING(buttonImportText);
tooltip = CSTRING(buttonImportTooltip);
onButtonClick = QUOTE([ctrlparent (_this select 0)] call FUNC(buttonImport));
onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(buttonImport));
};
class buttonClose: ctrlButtonOK {
idc = IDC_menuBarClose;
@ -209,7 +209,7 @@ class GVAR(display) {
h = QUOTE(7 * GRID_H);
text = CSTRING(buttonCloseText);
sizeEx = QUOTE(5 * GRID_H);
onButtonClick = QUOTE(ctrlparent (_this select 0) closeDisplay 1);
onButtonClick = QUOTE(ctrlParent (_this select 0) closeDisplay 1);
};
};
};
@ -268,6 +268,194 @@ class GVAR(display) {
};
};
};
class statsBox: RscControlsGroupNoScrollbars {
idc = IDC_statsBox;
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(47 * GRID_W);
h = QUOTE(55 * GRID_H);
class controls {
class statsStaticBackground1: ctrlStaticBackground {
idc = -1;
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(47 * GRID_W);
h = QUOTE(55 * GRID_H);
colorBackground[]={0.1,0.1,0.1,0.5};
};
class statsStaticBackground2: ctrlStaticBackground {
idc = -1;
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(47 * GRID_W);
h = QUOTE(5 * GRID_H);
colorBackground[]={0.1,0.1,0.1,0.8};
};
class statsTitle1: RscText {
idc = IDC_statsTitle1;
fade = 1;
x = QUOTE(0 * GRID_W);
y = QUOTE(5 * GRID_H);
w = QUOTE(45 * GRID_W);
h = QUOTE(5 * GRID_H);
colorBackground[]={0,0,0,0};
colorText[]={0.7,0.7,0.7,1};
sizeEx = QUOTE(5 * GRID_H);
text = "";
};
class statsBackground1: ctrlStaticBackground {
idc = IDC_statsBackground1;
fade = 1;
x = QUOTE(1 * GRID_W);
y = QUOTE(10 * GRID_H);
w = QUOTE(45 * GRID_W);
h = QUOTE(4 * GRID_H);
colorBackground[]={1,1,1,0.15};
};
class statsBar1: ctrlProgress {
idc = IDC_statsBar1;
fade = 1;
style = 0;
texture = "#(argb,8,8,3)color(1,1,1,1)";
colorBar[] = {1,1,1,1};
colorFrame[] = {0,0,0,0};
x = QUOTE(1 * GRID_W);
y = QUOTE(10 * GRID_H);
w = QUOTE(45 * GRID_W);
h = QUOTE(4 * GRID_H);
};
class statsText1: RscText {
idc = IDC_statsText1;
shadow=0;
fade = 1;
colorShadow[]={1,1,1,1};
colorText[]={0,0,0,1};
x = QUOTE(0 * GRID_W);
y = QUOTE(10 * GRID_H);
w = QUOTE(45 * GRID_W);
h = QUOTE(4 * GRID_H);
sizeEx = QUOTE(5 * GRID_H);
text = "";
};
class statsTitle2: statsTitle1 {
idc = IDC_statsTitle2;
y = QUOTE(15 * GRID_H);
};
class statsBackground2: statsBackground1 {
idc = IDC_statsBackground2;
y = QUOTE(20 * GRID_H);
};
class statsBar2: statsBar1 {
idc = IDC_statsBar2;
y = QUOTE(20 * GRID_H);
};
class statsText2: statsText1 {
idc = IDC_statsText2;
y = QUOTE(20 * GRID_H);
};
class statsTitle3: statsTitle1 {
idc = IDC_statsTitle3;
y = QUOTE(25 * GRID_H);
};
class statsBackground3: statsBackground1 {
idc = IDC_statsBackground3;
y = QUOTE(30 * GRID_H);
};
class statsBar3: statsBar1 {
idc = IDC_statsBar3;
y = QUOTE(30 * GRID_H);
};
class statsText3: statsText1 {
idc = IDC_statsText3;
y = QUOTE(30 * GRID_H);
};
class statsTitle4: statsTitle1 {
idc = IDC_statsTitle4;
y = QUOTE(35 * GRID_H);
};
class statsBackground4: statsBackground1 {
idc = IDC_statsBackground4;
y = QUOTE(40 * GRID_H);
};
class statsBar4: statsBar1 {
idc = IDC_statsBar4;
y = QUOTE(40 * GRID_H);
};
class statsText4: statsText1 {
idc = IDC_statsText4;
y = QUOTE(40 * GRID_H);
};
class statsTitle5: statsTitle1 {
idc = IDC_statsTitle5;
y = QUOTE(45 * GRID_H);
};
class statsBackground5: statsBackground1 {
idc = IDC_statsBackground5;
y = QUOTE(50 * GRID_H);
};
class statsBar5: statsBar1 {
idc = IDC_statsBar5;
y = QUOTE(50 * GRID_H);
colorBackground[]={1,1,1,0.15};
};
class statsText5: statsText1 {
idc = IDC_statsText5;
y = QUOTE(50 * GRID_H);
};
};
};
class statsButton: ctrlButton {
idc = IDC_statsButton;
style= 2;
text=">";
onButtonClick = QUOTE(ARR_2([QQGVAR(statsButton), [ctrlParent (_this select 0)]]) call CBA_fnc_localEvent);
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(6 * GRID_W);
h = QUOTE(6 * GRID_H);
sizeEx = QUOTE(5 * GRID_H);
};
class statsPreviousPage: ctrlButton {
idc = IDC_statsPreviousPage;
style= 2;
text="<";
colorBackground[]={0,0,0,0};
colorBackgroundDisabled[]= {0,0,0,0};
onButtonClick = QUOTE(ARR_2([QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, false)]]) call CBA_fnc_localEvent);
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(5 * GRID_W);
h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(5.5 * GRID_H);
};
class statsNextPage: statsPreviousPage {
idc = IDC_statsNextPage;
text = ">";
onButtonClick = QUOTE(ARR_2([QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, true)]]) call CBA_fnc_localEvent);
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 30 * GRID_W);
};
class statsCurrentPage: RscText {
idc = IDC_statsCurrentPage;
style = ST_CENTER;
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 5 * GRID_W);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(25 * GRID_W);
h = QUOTE(5 * GRID_H);
colorBackground[]={0,0,0,0};
shadow=2;
sizeEx = QUOTE(5 * GRID_H);
text = "";
};
class statsButtonClose: ctrlButtonPicture {
idc = IDC_statsButtonClose;
colorBackground[]={0,0,0,0};
text="\a3\3DEN\Data\Displays\Display3DEN\search_end_ca.paa";
onButtonClick = QUOTE(ARR_2([QQGVAR(statsButton), [ctrlParent (_this select 0)]]) call CBA_fnc_localEvent);
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 42 * GRID_W);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(5 * GRID_W);
h = QUOTE(5 * GRID_H);
};
class mouseBlock: RscText {
idc = IDC_mouseBlock;
style = 16;
@ -371,12 +559,13 @@ class GVAR(display) {
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(74 * GRID_W);
h = QUOTE(6 * GRID_H);
sizeEx = QUOTE(6 * GRID_H);
};
class leftSearchbarButton: ctrlButtonPicture {
idc = IDC_leftSearchbarButton;
text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa";
colorBackground[]={0,0,0,0.5};
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), ctrlparent (_this select 0) displayCtrl IDC_leftSearchbar)] call FUNC(handleSearchbar));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_leftSearchbar)] call FUNC(handleSearchbar));
x = QUOTE(safezoneX + 87 * GRID_W);
y = QUOTE(safezoneY + 1.8 * GRID_H);
w = QUOTE(6 * GRID_W);
@ -390,7 +579,7 @@ class GVAR(display) {
};
class rightSearchbarButton: leftSearchbarButton {
idc = IDC_rightSearchbarButton;
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), ctrlparent (_this select 0) displayCtrl IDC_rightSearchbar)] call FUNC(handleSearchbar));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_rightSearchbar)] call FUNC(handleSearchbar));
x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
};
class tabLeft: RscControlsGroupNoScrollbars {
@ -414,7 +603,7 @@ class GVAR(display) {
idc = IDC_buttonPrimaryWeapon;
text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\PrimaryWeapon_ca.paa";
tooltip="$STR_A3_RscDisplayArsenal_tab_PrimaryWeapon";
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(fillLeftPanel));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillLeftPanel));
colorBackground[]={0,0,0,0.5};
x = QUOTE(0 * GRID_W);
y = QUOTE(0 * GRID_H);
@ -607,7 +796,7 @@ class GVAR(display) {
idc = IDC_buttonOptic;
tooltip="$STR_A3_RscDisplayArsenal_tab_ItemOptic";
text="\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemOptic_ca.paa";
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(fillRightPanel));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(fillRightPanel));
colorBackground[]={0,0,0,0.5};
x = QUOTE(safezoneW + safezoneX - 10 * GRID_W);
y = QUOTE(safezoneY + 8 * GRID_H);
@ -717,6 +906,7 @@ class GVAR(display) {
class buttonRemoveAll: ctrlButtonPicture {
idc = IDC_buttonRemoveAll;
text = QPATHTOF(data\iconClearContainer.paa);
tooltip = CSTRING(buttonClearContainerTooltip);
colorBackground[]={0,0,0,0.5};
onButtonClick = QUOTE(ctrlParent (_this select 0) call FUNC(buttonClearAll));
fade=1;
@ -775,7 +965,7 @@ class GVAR(loadoutsDisplay) {
onSetFocus = QUOTE(GVAR(loadoutsPanelFocus) = true);
onKillFocus = QUOTE(GVAR(loadoutsPanelFocus) = false);
onLBSelChanged = QUOTE([ARR_3(ctrlParent (_this select 0), _this select 0, _this select 1)] call FUNC(onSelChangedLoadouts));
onLBDblClick = QUOTE([ARR_2(ctrlparent (_this select 0), (ctrlParent (_this select 0)) displayCtrl IDC_buttonLoad)] call FUNC(buttonLoadoutsLoad));
onLBDblClick = QUOTE([ARR_2(ctrlParent (_this select 0), (ctrlParent (_this select 0)) displayCtrl IDC_buttonLoad)] call FUNC(buttonLoadoutsLoad));
x = QUOTE(0);
y = QUOTE(5 * GRID_H);
w = QUOTE(160 * GRID_W);
@ -798,6 +988,7 @@ class GVAR(loadoutsDisplay) {
y = QUOTE(safezoneH - (51 * GRID_H));
w = QUOTE(65 * GRID_W);
h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(6 * GRID_H);
};
class loadoutsSearchbar: ctrlEdit {
idc = IDC_loadoutsSearchbar;
@ -808,12 +999,13 @@ class GVAR(loadoutsDisplay) {
y = QUOTE(safezoneH - (51 * GRID_H));
w = QUOTE(72 * GRID_W);
h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(6 * GRID_H);
};
class loadoutsSearchbarButton: ctrlButtonPicture {
idc = -1;
text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa";
colorBackground[]={0,0,0,0.5};
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), ctrlparent (_this select 0) displayCtrl IDC_loadoutsSearchbar)] call FUNC(handleLoadoutsSearchbar));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), ctrlParent (_this select 0) displayCtrl IDC_loadoutsSearchbar)] call FUNC(handleLoadoutsSearchbar));
x = QUOTE(155 * GRID_W);
y = QUOTE(safezoneH - (51 * GRID_H));
w = QUOTE(5 * GRID_W);
@ -828,7 +1020,7 @@ class GVAR(loadoutsDisplay) {
text= CSTRING(buttonSaveText);
tooltip= CSTRING(buttonSaveTooltip);
sizeEx = QUOTE(5 * GRID_H);
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsSave));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsSave));
colorBackground[] = {0,0,0,0.8};
};
class buttonRename: buttonSave {
@ -836,21 +1028,21 @@ class GVAR(loadoutsDisplay) {
x = QUOTE(32.5 * GRID_W);
text= CSTRING(buttonRenameText);
tooltip= CSTRING(buttonRenameTooltip);
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsRename));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsRename));
};
class buttonLoad: buttonSave {
idc = IDC_buttonLoad;
x = QUOTE(65 * GRID_W);
text= CSTRING(buttonLoadText);
tooltip= CSTRING(buttonLoadTooltip);
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsLoad));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsLoad));
};
class buttonShare: buttonSave {
idc = IDC_buttonShare;
x = QUOTE(97.5 * GRID_W);
text= CSTRING(buttonSharePrivateText);
tooltip= CSTRING(buttonShareTooltip);
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsShare));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsShare));
};
class buttonDelete: buttonSave {
idc = IDC_buttonDelete;
@ -858,11 +1050,10 @@ class GVAR(loadoutsDisplay) {
text= CSTRING(buttonDeleteText);
tooltip= CSTRING(buttonDeleteTooltip);
colorBackgroundActive[] = {0.5,0,0,1};
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsDelete));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(buttonLoadoutsDelete));
};
};
};
class buttonClose: ctrlButton {
idc = -1;
x = QUOTE(safezoneW + safezoneX - 32 * GRID_W);
@ -873,7 +1064,7 @@ class GVAR(loadoutsDisplay) {
text= CSTRING(buttonCloseText);
shortcuts[]= {"0x01"};
tooltip= "";
onButtonClick = QUOTE(ctrlparent (_this select 0) closeDisplay 2);
onButtonClick = QUOTE(ctrlParent (_this select 0) closeDisplay 2);
};
class buttonBar: ctrlControlsGroupNoScrollbars {
idc = -1;
@ -900,7 +1091,7 @@ class GVAR(loadoutsDisplay) {
sizeEx = QUOTE(5 * GRID_H);
text= CSTRING(tabMyLoadoutsText);
tooltip= CSTRING(tabMyLoadoutsTooltip);
onButtonClick = QUOTE([ARR_2(ctrlparent (_this select 0), _this select 0)] call FUNC(loadoutsChangeTab));
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), _this select 0)] call FUNC(loadoutsChangeTab));
};
class buttonDefaultLoadoutsBackground: buttonMyLoadoutsBackground {
idc = IDC_buttonDefaultLoadoutsBackground;

View File

@ -271,6 +271,17 @@ class Display3DEN {
class ContextMenu :ctrlMenu {
class Items {
class Arsenal {
items[]= {"aceArsenal", "virtualArsenal"};
};
class virtualArsenal {
text = "BI Virtual Arsenal";
action= QUOTE(['arsenal'] call bis_fnc_3DENEntityMenu);
value=0;
data="Arsenal";
opensNewWindow=1;
};
class aceArsenal: virtualArsenal {
text = "ACE Arsenal";
action= QUOTE(call FUNC(open3DEN));
};
};

View File

@ -60,7 +60,7 @@
<Italian>Strobo IR attaccata</Italian>
<Hungarian>Infravörös jeladó hozzácsatolva</Hungarian>
<Russian>ИК-маяк прикреплён</Russian>
<Japanese>赤外線ストロボを取り付け</Japanese>
<Japanese>赤外線ストロボを取り付けました</Japanese>
<Korean>적외선 스트로브 부착됨</Korean>
<Chinese>已附掛紅外線頻閃器</Chinese>
<Chinesesimp>已附挂红外线频闪器</Chinesesimp>
@ -76,7 +76,7 @@
<Italian>Strobo IR staccata</Italian>
<Hungarian>Infravörös jeladó lecsatolva</Hungarian>
<Russian>ИК-маяк отсоединён</Russian>
<Japanese>赤外線ストロボを外</Japanese>
<Japanese>赤外線ストロボを外しました</Japanese>
<Korean>적외선 스트로브 분리됨</Korean>
<Chinese>已取下紅外線頻閃器</Chinese>
<Chinesesimp>已取下红外线频闪器</Chinesesimp>
@ -92,7 +92,7 @@
<Italian>Granata IR attaccata</Italian>
<Hungarian>Infravörös gránát hozzácsatolva</Hungarian>
<Russian>ИК-граната прикреплена</Russian>
<Japanese>赤外線グレネードを取り付け</Japanese>
<Japanese>赤外線グレネードを取り付けました</Japanese>
<Korean>적외선 수류탄 부착됨</Korean>
<Chinese>已附掛紅外線手榴彈</Chinese>
<Chinesesimp>已附挂红外线手榴弹</Chinesesimp>
@ -108,7 +108,7 @@
<Italian>Granata IR staccata</Italian>
<Hungarian>Infravörös gránát lecsatolva</Hungarian>
<Russian>ИК-граната отсоединена</Russian>
<Japanese>赤外線グレネードを外</Japanese>
<Japanese>赤外線グレネードを外しました</Japanese>
<Korean>적외선 수류탄 분리됨</Korean>
<Chinese>已取下紅外線手榴彈</Chinese>
<Chinesesimp>已取下红外线手榴弹</Chinesesimp>
@ -124,7 +124,7 @@
<Italian>Chemlight attaccata</Italian>
<Hungarian>Chemlight hozzácsatolva</Hungarian>
<Russian>Химсвет прикреплён</Russian>
<Japanese>ケミライトを取り付け</Japanese>
<Japanese>ケミライトを取り付けました</Japanese>
<Korean>켐라이트 부착됨</Korean>
<Chinese>已附掛螢光棒</Chinese>
<Chinesesimp>已附挂萤光棒</Chinesesimp>
@ -140,7 +140,7 @@
<Italian>Chemlight staccata</Italian>
<Hungarian>Chemlight hozzácsatolva</Hungarian>
<Russian>Химсвет отсоединён</Russian>
<Japanese>ケミライトを外</Japanese>
<Japanese>ケミライトを外しました</Japanese>
<Korean>켐라이트 분리됨</Korean>
<Chinese>已取下螢光棒</Chinese>
<Chinesesimp>已取下萤光棒</Chinesesimp>
@ -236,7 +236,7 @@
<Polish>Przyczepianie nie powiodło się</Polish>
<Hungarian>Hozzácsatolás sikertelen</Hungarian>
<Italian>Non si attacca</Italian>
<Japanese>取り付けに失敗した</Japanese>
<Japanese>取り付けに失敗しまし</Japanese>
<Korean>부착 실패</Korean>
<Chinese>附掛失敗</Chinese>
<Chinesesimp>附挂失败</Chinesesimp>
@ -252,7 +252,7 @@
<Italian>%1&lt;br/&gt;attaccata</Italian>
<Hungarian>%1&lt;br/&gt;hozzácsatolva</Hungarian>
<Russian>%1&lt;br/&gt;присоединен(-а)</Russian>
<Japanese>%1&lt;br/&gt;を取り付けた</Japanese>
<Japanese>%1&lt;br/&gt;を取り付けまし</Japanese>
<Korean>%1&lt;br/&gt;부착됨</Korean>
<Chinese>%1&lt;br/&gt;已附掛</Chinese>
<Chinesesimp>%1&lt;br/&gt;已附挂</Chinesesimp>
@ -268,7 +268,7 @@
<Italian>%1&lt;br/&gt;staccata</Italian>
<Hungarian>%1&lt;br/&gt;lecsatolva</Hungarian>
<Russian>%1&lt;br/&gt;отсоединен(-а)</Russian>
<Japanese>%1&lt;br/&gt;を外した</Japanese>
<Japanese>%1&lt;br/&gt;を外しまし</Japanese>
<Korean>%1&lt;br/&gt;분리됨</Korean>
<Chinese>%1&lt;br/&gt;已取下</Chinese>
<Chinesesimp>%1&lt;br/&gt;已取下</Chinesesimp>

View File

@ -0,0 +1,69 @@
class EGVAR(arsenal,stats) {
class statBase;
class ACE_barrelTwist: statBase {
scope = 2;
priority = 1;
stats[] = {"ACE_barrelTwist"};
displayName= CSTRING(statBarrelTwist);
showText = 1;
textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _barrelTwist = getNumber (_config >> _stat select 0); format [ARR_3('%1mm (%2in)',_barrelTwist toFixed 0, (_barrelTwist / 25.4) toFixed 1)]);
tabs[] = {{0,1}, {}};
};
class ACE_barrelLength: statBase {
scope = 2;
priority = 0;
stats[] = {"ACE_barrelLength"};
displayName = CSTRING(statBarrelLength);
showText = 1;
textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _barrelLength = getNumber (_config >> _stat select 0); format [ARR_3('%1mm (%2in)',_barrelLength toFixed 0, (_barrelLength / 25.4) toFixed 1)]);
tabs[] = {{0,1}, {}};
};
class ACE_ammo: statBase {
scope = 2;
priority = 5;
stats[] = {"ammo", "displayName"};
displayName = "$STR_dn_ammo";
showText = 1;
textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _ammoDisplayName = getText (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 1); [ARR_2(_ammoDisplayName, getText (_config >> _stat select 0))] select (_ammoDisplayName == ''));
tabs[] = {{}, {4}};
};
class ACE_ballisticCoef: statBase {
scope = 2;
priority = 4;
stats[] = {"ACE_dragModel","ACE_ballisticCoefficients", "ACE_standardAtmosphere"};
displayName= CSTRING(statBallisticCoef);
showText= 1;
textStatement = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); private _ballisticCoef = getArray (_ammoCfg >> _stat select 1); _ballisticCoef sort false; format [ARR_4('%1 G%2 (%3)', _ballisticCoef select 0 ,getNumber (_ammoCfg >> _stat select 0), getText (_ammoCfg >> _stat select 2))]);
condition = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); !(getArray (_ammoCfg >> _stat select 1) isEqualTo []));
tabs[] ={{}, {4}};
};
class ACE_bulletMass: statBase {
scope = 2;
priority = 3;
stats[] = {"ACE_bulletMass"};
displayName = CSTRING(statBulletMass);
showText = 1;
textStatement = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoWeight = getNumber (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 0); format [ARR_3('%1g (%2gr)', _ammoWeight toFixed 1, (_ammoWeight * 15.43) toFixed 1)]);
condition = QUOTE(params[ARR_2('_stat', '_config')]; getNumber (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 0) > 0);
tabs[] = {{}, {4}};
};
class ACE_magMuzzleVelocity: statBase {
scope = 2;
priority = 3;
stats[] = {"initSpeed"};
displayName= CSTRING(statMuzzleVelocity);
showText= 1;
textStatement = QUOTE(params[ARR_2('_stat', '_config')]; private _initSpeed = getNumber (_config >> _stat select 0); format [ARR_3('%1 m/s (%2 ft/s)', _initSpeed, (_initSpeed * 3.28084) toFixed 0)]);
condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0);
tabs[] = {{}, {4}};
};
class ACE_weaponMuzzleVelocity: statBase {
scope = 2;
priority = 3;
stats[] = {"initSpeed"};
displayName= CSTRING(statMuzzleVelocity);
showText = 1;
textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_weaponMuzzleVelocity));
tabs[] = {{0,1}, {}};
};
};

View File

@ -0,0 +1,11 @@
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_FILE(XEH_preStart));
};
};
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_FILE(XEH_preInit));
};
};

View File

@ -0,0 +1 @@
PREP(statTextStatement_weaponMuzzleVelocity);

View File

@ -0,0 +1,7 @@
#include "script_component.hpp"
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;

View File

@ -0,0 +1,3 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"

View File

@ -14,7 +14,9 @@ class CfgPatches {
};
};
#include "CfgEventHandlers.hpp"
#include "CfgAmmo.hpp"
#include "CfgMagazines.hpp"
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"
#include "ACE_Arsenal_Stats.hpp"

View File

@ -0,0 +1,45 @@
/*
* Author: Alganthe
* Text statement for the weapon muzzle velocity stat
*
* Arguments:
* 0: Not used
* 1: item config path (CONFIG)
*
* Return Value:
* String to display
*
* Public: No
*/
#include "script_component.hpp"
params ["", "_config"];
if (EGVAR(arsenal,currentLeftPanel) == 2002) then {
private _primaryMag = primaryWeaponMagazine EGVAR(arsenal,center);
[primaryWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
} else {
private _primaryMag = handgunMagazine EGVAR(arsenal,center);
[handgunWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
} params ["_weapon", "_magazine"];
private _initSpeed = getNumber (_config >> "initSpeed");
if (_magazine isEqualTo "") then {
_initSpeed
} else {
private _ammoCfg = (configFile >> "CfgAmmo" >> (getText (configFile >> "CfgMagazines" >> _magazine >> "ammo")));
private _barrelLength = getNumber (_config >> "ACE_barrelLength");
private _muzzleVelocityTable = getArray (_ammoCfg >> "ACE_muzzleVelocities");
private _barrelLengthTable = getArray (_ammoCfg >> "ACE_barrelLengths");
if (_barrelLength != 0 && {count _muzzleVelocityTable > 0} && {count _barrelLengthTable > 0}) then {
private _muzzleVelocity = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
format ["%1 m/s (%2 ft/s)", _muzzleVelocity toFixed 0, (_muzzleVelocity * 3.28084) toFixed 0]
} else {
_initSpeed
};
};

View File

@ -0,0 +1 @@
#include "\z\ace\addons\ballistics\script_component.hpp"

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Ballistics">
<!-- QBU -->
@ -2006,6 +2006,8 @@
<Hungarian>.338 Scenar</Hungarian>
<Japanese>338 Scenar</Japanese>
<Korean>.338 Scenar</Korean>
<Chinese>.338 Scenar</Chinese>
<Chinesesimp>.338 Scenar</Chinesesimp>
</Key>
<Key ID="STR_ACE_Ballistics_10Rnd_338_300gr_HPBT_Mag_Description">
<English>Caliber: 8.6x70mm (300gr Lapua Scenar)&lt;br /&gt;Rounds: 10</English>
@ -2279,5 +2281,29 @@
<Chinese>[ACE] 彈藥補給箱</Chinese>
<Chinesesimp>[ACE] 弹药补给箱</Chinesesimp>
</Key>
<Key ID="STR_ACE_Ballistics_statBarrelTwist">
<English>Barrel twist</English>
<Japanese>銃身の転度</Japanese>
</Key>
<Key ID="STR_ACE_Ballistics_statBarrelLength">
<English>Barrel length</English>
<French>Longueur du canon</French>
<Japanese>銃身長</Japanese>
</Key>
<Key ID="STR_ACE_Ballistics_statBallisticCoef">
<English>Ballistic coefficient</English>
<French>Coefficient ballistique</French>
<Japanese>弾道係数</Japanese>
</Key>
<Key ID="STR_ACE_Ballistics_statBulletMass">
<English>Bullet mass</English>
<French>Masse d'une balle</French>
<Japanese>弾丸重量</Japanese>
</Key>
<Key ID="STR_ACE_Ballistics_statMuzzleVelocity">
<English>Muzzle velocity</English>
<French>Vitesse à la bouche</French>
<Japanese>銃口初速</Japanese>
</Key>
</Package>
</Project>

View File

@ -85,7 +85,7 @@
<Portuguese>Você deve tomá-lo como prisioneiro primeiro!</Portuguese>
<Hungarian>Először foglyul kell ejtened őt!</Hungarian>
<Russian>Вы должны сначала взять его в плен!</Russian>
<Japanese>あなたは先に捕虜を取る必要があります。</Japanese>
<Japanese>捕虜を取っている必要があります!</Japanese>
<Korean>먼저 포로로 만들어야합니다!</Korean>
<Chinese>你必須先逮捕他!</Chinese>
<Chinesesimp>你必须先逮捕他!</Chinesesimp>

View File

@ -330,6 +330,9 @@ class CfgVehicles {
GVAR(size) = 2; // 1 = small, 2 = large
GVAR(canLoad) = 1;
};
class Land_RepairDepot_01_base_F: ReammoBox_F { // TanksDLC - Repair Depo Thing (probably too big to safely unload)
GVAR(canLoad) = 0;
};
//"Supply Box" - Small Pallets
class B_supplyCrate_F: ReammoBox_F {
GVAR(size) = 6;
@ -421,7 +424,6 @@ class CfgVehicles {
};
// objects
class Lamps_base_F;
class RoadCone_F: ThingX {
GVAR(size) = 1;
GVAR(canLoad) = 1;
@ -429,10 +431,22 @@ class CfgVehicles {
class RoadBarrier_F: RoadCone_F {
GVAR(size) = 2;
};
class Lamps_base_F;
class Land_PortableLight_single_F: Lamps_base_F {
GVAR(size) = 1;
GVAR(size) = 2;
GVAR(canLoad) = 1;
};
class FloatingStructure_F;
class Land_Camping_Light_F: FloatingStructure_F {
GVAR(size) = 0.2;
GVAR(canLoad) = 1;
};
class Land_Camping_Light_off_F: ThingX {
GVAR(size) = 0.2;
GVAR(canLoad) = 1;
};
class Scrapyard_base_F;
class Land_PaperBox_closed_F: Scrapyard_base_F {
@ -569,16 +583,6 @@ class CfgVehicles {
GVAR(size) = 50;
};
class Ruins_F;
class Land_Cargo20_military_ruins_F: Ruins_F {
class EventHandlers {
class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
};
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_orange_F: Cargo_base_F {
class EventHandlers {
class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
@ -685,15 +689,6 @@ class CfgVehicles {
GVAR(size) = 100;
};
class Land_Cargo40_military_ruins_F: Ruins_F {
class EventHandlers {
class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
};
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_orange_F: Cargo_base_F {
class EventHandlers {
class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};

View File

@ -61,23 +61,91 @@
[QGVAR(initObject), DFUNC(initObject)] call CBA_fnc_addEventHandler;
[QGVAR(initVehicle), DFUNC(initVehicle)] call CBA_fnc_addEventHandler;
// Add all the vehicle init EHs (require initPost for set/get variables)
["LandVehicle", "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler;
["Air", "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler;
["Ship_F", "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler;
// Add all the object init EHs
["StaticWeapon", "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler;
["Land_PortableLight_single_F", "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler;
["ACE_ConcertinaWireCoil", "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler;
GVAR(vehicleAction) = [
QGVAR(openMenu), localize LSTRING(openMenu), "",
{
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
GVAR(interactionVehicle) = _target;
GVAR(interactionParadrop) = false;
createDialog QGVAR(menu);
},
{
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
GVAR(enable) &&
{(_target getVariable [QGVAR(hasCargo), getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(hasCargo)) == 1])} &&
{locked _target < 2} &&
{([_player, _target] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE} &&
{alive _target} &&
{[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)}
}
] call EFUNC(interact_menu,createAction);
// Add all the vehicle/object init EHs
["ThingX", "initPost", {
_this call DFUNC(initObject); _this call DFUNC(initVehicle);
}, nil, nil, true] call CBA_fnc_addClassEventHandler;
["Land_PaperBox_closed_F", "initPost", {
_this call DFUNC(initObject); _this call DFUNC(initVehicle);
}, nil, nil, true] call CBA_fnc_addClassEventHandler;
["PlasticCase_01_base_F", "initPost", {
_this call DFUNC(initObject); _this call DFUNC(initVehicle);
}, nil, nil, true] call CBA_fnc_addClassEventHandler;
GVAR(objectAction) = [
QGVAR(load), localize LSTRING(loadObject), "a3\ui_f\data\IGUI\Cfg\Actions\loadVehicle_ca.paa",
{
params ["_target", "_player"];
[_player, _target] call FUNC(startLoadIn);
},
{
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
GVAR(enable) &&
{(_target getVariable [QGVAR(canLoad), getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(canLoad))]) in [true, 1]} &&
{locked _target < 2} &&
{alive _target} &&
{[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)} &&
{0 < {
private _type = typeOf _x;
private _hasCargoPublic = _x getVariable [QGVAR(hasCargo), false];
private _hasCargoConfig = getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) == 1;
(_hasCargoPublic || _hasCargoConfig) && {_x != _target} &&
{([_target, _x] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}
} count (nearestObjects [_player, GVAR(cargoHolderTypes), (MAX_LOAD_DISTANCE + 10)])}
},
LINKFUNC(addCargoVehiclesActions)
] call EFUNC(interact_menu,createAction);
private _initVehicleClasses = ["ThingX", "LandVehicle", "Air", "Ship_F"];
private _initObjectClasses = ["ThingX", "StaticWeapon"];
{
[_x, "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler;
} forEach _initVehicleClasses;
{
[_x, "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler;
} forEach _initObjectClasses;
// find all remaining configured classes and init them
{
private _class = configName _x;
// init vehicle
if (
1 == getNumber (_x >> QGVAR(hasCargo))
&& {{if (_class isKindOf _x) exitWith {false}; true} forEach _initVehicleClasses}
) then {
if (_class isKindOf "Static") then {
if (2 == getNumber (_x >> "scope")) then {
[_class, 0, ["ACE_MainActions"], GVAR(vehicleAction)] call EFUNC(interact_menu,addActionToClass);
GVAR(initializedVehicleClasses) pushBack _class;
};
} else {
[_class, "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler;
_initVehicleClasses pushBack _class;
};
};
// init object
if (
1 == getNumber (_x >> QGVAR(canLoad))
&& {{if (_class isKindOf _x) exitWith {false}; true} forEach _initObjectClasses}
) then {
if (_class isKindOf "Static") then {
if (2 == getNumber (_x >> "scope")) then {
[_class, 0, ["ACE_MainActions"], GVAR(objectAction)] call EFUNC(interact_menu,addActionToClass);
GVAR(initializedItemClasses) pushBack _class;
};
} else {
[_class, "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler;
_initObjectClasses pushBack _class;
};
};
} forEach ("true" configClasses (configFile >> "CfgVehicles"));

View File

@ -41,38 +41,9 @@ if (_object getVariable [QGVAR(initObject),false]) exitWith {};
if (_canLoadConfig) then {
GVAR(initializedItemClasses) pushBack _type;
TRACE_1("Adding load cargo action to class", _type);
[_type, 0, ["ACE_MainActions"], GVAR(objectAction)] call EFUNC(interact_menu,addActionToClass);
} else {
_object setVariable [QGVAR(initObject),true];
TRACE_1("Adding load cargo action to object", _object);
[_object, 0, ["ACE_MainActions"], GVAR(objectAction)] call EFUNC(interact_menu,addActionToObject);
};
// Vehicles with passengers inside are prevented from being loaded in `fnc_canLoadItemIn`
private _condition = {
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
GVAR(enable) &&
{(_target getVariable [QGVAR(canLoad), getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(canLoad))]) in [true, 1]} &&
{locked _target < 2} &&
{alive _target} &&
{[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)} &&
{0 < {
private _type = typeOf _x;
private _hasCargoPublic = _x getVariable [QGVAR(hasCargo), false];
private _hasCargoConfig = getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) == 1;
(_hasCargoPublic || _hasCargoConfig) && {_x != _target} &&
{([_target, _x] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}
} count (nearestObjects [_player, GVAR(cargoHolderTypes), (MAX_LOAD_DISTANCE + 10)])}
};
private _statement = {
params ["_target", "_player"];
[_player, _target] call FUNC(startLoadIn);
};
private _text = localize LSTRING(loadObject);
private _icon = "a3\ui_f\data\IGUI\Cfg\Actions\loadVehicle_ca.paa";
private _action = [QGVAR(load), _text, _icon, _statement, _condition, {call FUNC(addCargoVehiclesActions)}] call EFUNC(interact_menu,createAction);
if (_canLoadConfig) then {
[_type, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToClass);
} else {
[_object, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToObject);
};

View File

@ -61,34 +61,11 @@ if (_vehicle getVariable [QGVAR(initVehicle),false]) exitWith {};
if (_hasCargoConfig) then {
GVAR(initializedVehicleClasses) pushBack _type;
TRACE_1("Adding unload cargo action to class", _type);
[_type, 0, ["ACE_MainActions"], GVAR(vehicleAction)] call EFUNC(interact_menu,addActionToClass);
} else {
_vehicle setVariable [QGVAR(initVehicle),true];
TRACE_1("Adding unload cargo action to object", _vehicle);
};
private _condition = {
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
GVAR(enable) &&
{(_target getVariable [QGVAR(hasCargo), getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(hasCargo)) == 1])} &&
{locked _target < 2} &&
{([_player, _target] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE} &&
{alive _target} &&
{[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)}
};
private _statement = {
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
GVAR(interactionVehicle) = _target;
GVAR(interactionParadrop) = false;
createDialog QGVAR(menu);
};
private _text = localize LSTRING(openMenu);
private _icon = "";
private _action = [QGVAR(openMenu), _text, _icon, _statement, _condition] call EFUNC(interact_menu,createAction);
if (_hasCargoConfig) then {
[_type, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToClass);
} else {
[_vehicle, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToObject);
[_vehicle, 0, ["ACE_MainActions"], GVAR(vehicleAction)] call EFUNC(interact_menu,addActionToObject);
};
// Add the paradrop self interaction for planes and helicopters

View File

@ -65,7 +65,7 @@ _itemObject setVelocity ((velocity _vehicle) vectorAdd ((vectorNormalized (vecto
private _velocity = velocity _item;
_item attachTo [_parachute, [0,0,-1]];
_item attachTo [_parachute, [0,0,1]];
_parachute setVelocity _velocity;
private _light = "Chemlight_yellow" createVehicle [0,0,0];

View File

@ -147,7 +147,7 @@
<Italian>%1&lt;br/&gt;caricato su&lt;br/&gt;%2</Italian>
<Hungarian>%1&lt;br/&gt;berakodva ide:&lt;br/&gt;%2</Hungarian>
<Russian>%1&lt;br/&gt;загружен в&lt;br/&gt;%2</Russian>
<Japanese>%1&lt;br/&gt;&lt;br/&gt;%2へ積み込まれた</Japanese>
<Japanese>%1&lt;br/&gt;&lt;br/&gt;%2へ積み込まれまし</Japanese>
<Korean>%1&lt;br/&gt;&lt;br/&gt;%2 에 실림</Korean>
<Chinese>%1&lt;br/&gt;裝載至&lt;br/&gt;%2</Chinese>
<Chinesesimp>%1&lt;br/&gt;装载至&lt;br/&gt;%2</Chinesesimp>
@ -163,7 +163,7 @@
<Italian>Hai scaricato&lt;br/&gt;%1 da&lt;br/&gt;%2</Italian>
<Hungarian>1%&lt;br/&gt;kirakodva ebből:&lt;br/&gt;%2</Hungarian>
<Russian>%1&lt;br/&gt;разгружен из&lt;br/&gt;%2</Russian>
<Japanese>&lt;br/&gt;%1が&lt;br/&gt;%2から降ろされた</Japanese>
<Japanese>&lt;br/&gt;%1が&lt;br/&gt;%2から降ろされまし</Japanese>
<Korean>%1&lt;br/&gt;&lt;br/&gt;%2 에서 내려짐</Korean>
<Chinese>&lt;br/&gt;%2卸載&lt;br/&gt;%1</Chinese>
<Chinesesimp>&lt;br/&gt;%2卸载&lt;br/&gt;%1</Chinesesimp>
@ -178,7 +178,7 @@
<Italian>Caricando</Italian>
<Spanish>Cargando</Spanish>
<French>Chargement de la cargaison</French>
<Japanese>カーゴへ積み込んでい</Japanese>
<Japanese>カーゴへ積み込んでいます</Japanese>
<Korean>화물 싣기</Korean>
<Chinese>裝載貨物中</Chinese>
<Chinesesimp>装载货物中</Chinesesimp>
@ -193,7 +193,7 @@
<Italian>Scaricando</Italian>
<Spanish>Descargando</Spanish>
<French>Déchargement de la cargaison</French>
<Japanese>カーゴから降ろしてい</Japanese>
<Japanese>カーゴから降ろしています</Japanese>
<Korean>화물 내리기</Korean>
<Chinese>卸載貨物中</Chinese>
<Chinesesimp>卸载货物中</Chinesesimp>
@ -208,7 +208,7 @@
<Italian>%1&lt;br/&gt;non può essere caricato</Italian>
<Spanish>%1&lt;br/&gt;no pudo ser cargado</Spanish>
<French>%1&lt;br /&gt; n'a pas pu être chargé</French>
<Japanese>%1&lt;br/&gt;は積み込めなかっ</Japanese>
<Japanese>%1&lt;br/&gt;は積み込めませんでし</Japanese>
<Korean>%1&lt;br/&gt;이 실릴 수가 없습니다</Korean>
<Chinese>%1&lt;br/&gt;無法被裝載</Chinese>
<Chinesesimp>%1&lt;br/&gt;无法被装载</Chinesesimp>
@ -223,7 +223,7 @@
<Italian>%1&lt;br/&gt;non può essere scaricato</Italian>
<Spanish>%1&lt;br/&gt;no pudo ser descargado</Spanish>
<French>%1&lt;br /&gt; n'a pas pu être déchargé</French>
<Japanese>%1&lt;br/&gt;は降ろせなかっ</Japanese>
<Japanese>%1&lt;br/&gt;は降ろせませんでし</Japanese>
<Korean>%1&lt;br/&gt;이 내려질 수가 없습니다</Korean>
<Chinese>%1&lt;br/&gt;無法被卸載</Chinese>
<Chinesesimp>%1&lt;br/&gt;无法被卸载</Chinesesimp>

View File

@ -0,0 +1,20 @@
class CfgUIGrids {
class IGUI {
class Presets {
class Arma3 {
class Variables {
grid_ACE_displayText[] = {{((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)),safeZoneY + 0.175 * safezoneH, (10 *(((safezoneW / safezoneH) min 1.2) / 40)), (3 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"};
};
};
};
class Variables {
class grid_ACE_displayText {
displayName = "ACE Hint";
description = "Textual in game feedback to the player.";
preview = QPATHTOF(UI\ACE_Hint_Preview_ca.paa);
saveToProfile[] = {0,1};
};
};
};
};

Binary file not shown.

View File

@ -113,7 +113,6 @@ PREP(isMedic);
PREP(isModLoaded);
PREP(isPlayer);
PREP(isSwimming);
PREP(isUnderwater);
PREP(lightIntensityFromObject);
PREP(loadPerson);
PREP(loadPersonLocal);
@ -146,6 +145,7 @@ PREP(runTests);
PREP(sanitizeString);
PREP(sendRequest);
PREP(serverLog);
PREP(setAimCoef);
PREP(setApproximateVariablePublic);
PREP(setDefinedVariable);
PREP(setDisableUserInputStatus);

View File

@ -48,7 +48,8 @@
[QGVAR(setHidden), {
params ["_object", "_set"];
TRACE_2("setHidden EH",_object,_set);
private _vis = _object getUnitTrait "camouflageCoef";
// May report nil. Default to factor 1.
private _vis = [_object getUnitTrait "camouflageCoef"] param [0, 1];
if (_set > 0) then {
if (_vis != 0) then {
_object setVariable [QGVAR(oldVisibility), _vis];

View File

@ -65,27 +65,7 @@ class ACE_Rsc_Control_Base {
#include <HintConfig.hpp>
#include <RscInfoType.hpp>
#include "CompassControl.hpp"
class CfgUIGrids {
class IGUI {
class Presets {
class Arma3 {
class Variables {
grid_ACE_displayText[] = {{((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)),safeZoneY + 0.175 * safezoneH, (10 *(((safezoneW / safezoneH) min 1.2) / 40)), (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"};
};
};
};
class Variables {
class grid_ACE_displayText {
displayName = "ACE Hint";
description = "Textual in game feedback to the player.";
preview = "\a3\Ui_f\data\GUI\Cfg\UIGrids\grid_hint_ca.paa";
saveToProfile[] = {0,1};
};
};
};
};
#include "CfgUIGrids.hpp"
class ACE_Extensions {
extensions[] = {};

View File

@ -15,11 +15,11 @@
*/
#include "script_component.hpp"
ACE_isMapEnabled = call {private _config = missionConfigFile >> "showMap"; !isNumber _config || {getNumber _config == 1}}; // default value is 1, so do isNumber check first
ACE_isCompassEnabled = call {private _config = missionConfigFile >> "showCompass"; !isNumber _config || {getNumber _config == 1}};
ACE_isWatchEnabled = call {private _config = missionConfigFile >> "showWatch"; !isNumber _config || {getNumber _config == 1}};
ACE_isRadioEnabled = call {private _config = missionConfigFile >> "showRadio"; !isNumber _config || {getNumber _config == 1}};
ACE_isGPSEnabled = call {private _config = missionConfigFile >> "showGPS"; !isNumber _config || {getNumber _config == 1}};
ACE_isMapEnabled = getMissionConfigValue ["showMap", 1] in [true, 1];
ACE_isCompassEnabled = getMissionConfigValue ["showCompass", 1] in [true, 1];
ACE_isWatchEnabled = getMissionConfigValue ["showWatch", 1] in [true, 1];
ACE_isRadioEnabled = getMissionConfigValue ["showRadio", 1] in [true, 1];
ACE_isGPSEnabled = getMissionConfigValue ["showGPS", 1] in [true, 1];
GVAR(AssignedItems) = [];
GVAR(AssignedItemsInfo) = [];

View File

@ -25,7 +25,7 @@ params ["_params", "_function", "_namespace", "_uid", "_duration", "_event"];
if ((_namespace getVariable [_uid, [-99999]]) select 0 < diag_tickTime) then {
_namespace setVariable [_uid, [diag_tickTime + _duration, _params call _function]];
// Does the cache needs to be cleared on an event?
// Does the cache need to be cleared on an event?
if (!isNil "_event") then {
private _varName = format [QGVAR(clearCache_%1), _event];
private _cacheList = missionNamespace getVariable _varName;

View File

@ -85,17 +85,18 @@ for "_index" from 0 to (_countOptions - 1) do {
};
};
_settingsConfig = missionConfigFile >> "ACE_Settings";
_countOptions = count _settingsConfig;
private _missionSettingsConfig = missionConfigFile >> "ACE_Settings";
_countOptions = count _missionSettingsConfig;
TRACE_1("Reading settings from missionConfigFile",_countOptions);
for "_index" from 0 to (_countOptions - 1) do {
private _optionEntry = _settingsConfig select _index;
private _optionEntry = _missionSettingsConfig select _index;
private _settingName = configName _optionEntry;
if ((toLower _settingName) in GVAR(cbaSettings_forcedSettings)) then {
WARNING_1("Setting [%1] - Already Forced - ignoring missionConfig",_varName);
} else {
if ((isNil _settingName) && {(getNumber (_settingsConfig >> _settingName >> "movedToSQF")) == 0}) then {
// New setting, that was first defined in missionConfigFile
INFO_1("Creating new CBA setting for ace_setting from mission config [%1]",_settingName);
[_optionEntry] call FUNC(cbaSettings_loadFromConfig);
} else {
private _value = (_optionEntry >> "value") call BIS_fnc_getCfgData;

View File

@ -67,6 +67,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x
_valueTitles pushBack (if ((_x select [0, 1]) == "$") then {localize (_x select [1]);} else {_x});
} forEach (getArray (_config >> "values"));
_cbaValueInfo = [_values, _valueTitles, getNumber (_config >> "value")];
_cbaValueInfoHint = "[values, titles, defaultIndex]";
} else {
_cbaSettingType = "SLIDER"; // [_min, _max, _default, _trailingDecimals]
_cbaValueInfo = if (isArray (_config >> "sliderSettings")) then {
@ -116,7 +117,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x
_output pushBack format [" %1, // %2", _cbaValueInfo, _cbaValueInfoHint];
_output pushBack format [" %1, // isGlobal", _cbaIsGlobal];
if ((_varName select [0, 4]) == "ACE_") then {
_output pushBack format [" {[QGVAR(%1), _this] call EFUNC(common,cbaSettings_settingChanged)}] call CBA_settings_fnc_init;", _gvarName];
_output pushBack format [" {[QGVAR(%1), _this] call EFUNC(common,cbaSettings_settingChanged)}", _gvarName];
} else {
_output pushBack format [" {[""%1"", _this] call ace_common_fnc_cbaSettings_settingChanged}", _varName];
};

View File

@ -49,25 +49,23 @@ private _ctrlHint = uiNamespace getVariable "ACE_ctrlHint";
_ctrlHint ctrlSetBackgroundColor GVAR(displayTextColor);
_ctrlHint ctrlSetTextColor GVAR(displayTextFontColor);
/*
// This does not function at the moment. Has been disabled until it fixed.
// Use profile settings from CfgUIGrids.hpp
private _xPos = profilenamespace getVariable ["IGUI_GRID_ACE_displayText_X", ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40))];
private _yPos = profilenamespace getVariable ["IGUI_GRID_ACE_displayText_Y", safeZoneY + 0.175 * safezoneH];
private _wPos = profilenamespace getVariable ["IGUI_GRID_ACE_displayText_W", (10 *(((safezoneW / safezoneH) min 1.2) / 40))];
private _hPos = profilenamespace getVariable ["IGUI_GRID_ACE_displayText_H", (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))];
*/
private _xPos = ((safezoneX + safezoneW) - (_width *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40));
private _yPos = safeZoneY + 0.175 * safezoneH;
private _wPos = (_width *(((safezoneW / safezoneH) min 1.2) / 40));
private _hPos = (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25));
private _hPos = _size * (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25));
// Ensure still in bounds for large width/height
_xPos = safezoneX max (_xPos min (safezoneX + safezoneW - _wPos));
_yPos = safeZoneY max (_yPos min (safeZoneY + safezoneH - _hPos));
// Zeus Interface Open and Display would be under the "CREATE" list
if (!isNull curatorCamera) then {
_xPos = _xPos min ((safezoneX + safezoneW - 12.5 * (((safezoneW / safezoneH) min 1.2) / 40)) - _wPos);
};
private _position = [_xPos, _yPos, _wPos, _size * _hPos];
private _position = [_xPos, _yPos, _wPos, _hPos];
_ctrlHint ctrlSetPosition _position;
_ctrlHint ctrlCommit 0;

View File

@ -27,6 +27,7 @@
!(
isNull curatorCamera && // Curator
{!GETMVAR(EGVAR(spectator,isSet),false)} && // ACE Spectator
{GETMVAR(EGVAR(huntir,stop),true)} && // ACE Hunt IR
{isNull GETMVAR(BIS_EGSpectatorCamera_camera, objNull)} && // BIS Nexus Spectator
{isNull GETUVAR(BIS_fnc_arsenal_cam, objNull)} && // Arsenal camera
{isNull GETMVAR(BIS_fnc_establishingShot_fakeUAV, objNull)} && // Establishing shot camera

View File

@ -1,32 +0,0 @@
/*
* Author: Glowbal
* Check if unit's head is underwater
*
* Arguments:
* 0: Unit <OBJECT>
*
* Return Value:
* If unit's head is underwater <BOOL>
*
* Example:
* [bob] call ace_common_fnc_isUnderwater
*
* Public: Yes
*/
#include "script_component.hpp"
ACE_DEPRECATED(QFUNC(isUnderwater),"3.13.0","underwater OBJECT");
params [["_unit", objNull, [objNull]]];
private _return = false;
if (surfaceIsWater getPosASL _unit) then {
private _pos = _unit modelToWorldVisual (_unit selectionPosition "head");
if (_pos select 2 < 0) then {
_return = true;
};
};
_return

View File

@ -79,6 +79,21 @@ if (_lightSource isKindOf "CAManBase") then {
} forEach _lights;
if (isCollisionLightOn _lightSource) then {
private _markerLights = [
_lightSource,
{configProperties [configFile >> "CfgVehicles" >> typeOf _this >> "MarkerLights", "isClass _x", true]},
uiNamespace,
format [QEGVAR(cache,MarkerLights_%1), typeOf _lightSource],
1E11
] call FUNC(cachedCall);
{
private _position = _lightSource modelToWorld (_lightSource selectionPosition getText (_x >> "name"));
private _distance = _unitPos distance _position;
_lightLevel = _lightLevel max (linearConversion [0, 10, _distance, 1, 0, true] * linearConversion [0, 1300, getNumber (_x >> "intensity"), 0, 1, true]);
} forEach _markerLights;
};
// handle campfires
if (inflamed _lightSource) then {
private _distance = _unitPos distance position _lightSource;

View File

@ -0,0 +1,51 @@
/*
* Author: xrufix, Glowbal
* Handle set AimCoef calls. Will use the highest available setting.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Unique ID <STRING>
* 2: Aim coefficient (a higher value causes more shaking) <NUMBER>
* 3: Add (true) or remove (false) <BOOL> (default: true)
*
* Return Value:
* None
*
* Example:
* [player, "ace_advanced_fatigue", 1, true] call ace_common_fnc_setAimCoef
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_unit", "_id", "_setting", ["_add", true]];
private _exists = false;
private _highestCoef = 1;
private _map = _unit getVariable [QGVAR(setAimCoefMap), []];
_map = _map select {
_x params ["_xID", "_xSetting"];
if (_id == _xID) then {
_exists = true;
if (_add) then {
_x set [1, _setting];
_highestCoef = _highestCoef max _setting;
true
} else {
false
};
} else {
_highestCoef = _highestCoef max _xSetting;
true
};
};
if (!_exists && _add) then {
_highestCoef = _highestCoef max _setting;
_map pushBack [_id, _setting];
};
// Update the value
_unit setVariable [QGVAR(setAimCoefMap), _map];
_unit setCustomAimCoef _highestCoef;

View File

@ -3,9 +3,9 @@
* Handle set volume calls. Will use the lowest available volume setting.
*
* Arguments:
* 0: id <STRING>
* 1: settings <NUMBER>
* 2: add [true] OR remove [false] (default: true) <BOOL>
* 0: ID <STRING>
* 1: Settings <NUMBER>
* 2: Add (true) or remove (false) <BOOL> (default: true)
*
* Return Value:
* None

View File

@ -4,7 +4,7 @@
*
* Arguments:
* 0: Text <ANY>
* 1: Color <ARRAY>
* 1: Color <ARRAY, STRING>
*
* Return Value:
* Text <STRING>
@ -20,12 +20,14 @@ params ["_string", "_color"];
_string = format ["%1", _string];
_color = (
[255 * (_color select 0), 2] call FUNC(toHex)
) + (
[255 * (_color select 1), 2] call FUNC(toHex)
) + (
[255 * (_color select 2), 2] call FUNC(toHex)
);
if (_color isEqualType []) then {
_color = "#" + (
[255 * (_color select 0), 2] call FUNC(toHex)
) + (
[255 * (_color select 1), 2] call FUNC(toHex)
) + (
[255 * (_color select 2), 2] call FUNC(toHex)
);
};
parseText format ["<t align='center' color='#%2' >%1</t>", _string, _color]
parseText format ["<t align='center' color='%1' >%2</t>", _color, _string]

View File

@ -20,9 +20,10 @@ params ["_enabled"];
if (!_enabled) exitWith {
if (isNil QGVAR(laserKeyDownEH)) exitWith {};
["KeyDown", GVAR(laserKeyDownEH)] call CBA_fnc_removeDisplayHandler;
["weapon", GVAR(laserWeaponEH)] call CBA_fnc_removePlayerEventHandler;
["loadout", GVAR(laserLoadoutEH)] call CBA_fnc_removePlayerEventHandler;
["turret", GVAR(laserTurretEH)] call CBA_fnc_removePlayerEventHandler;
["vehicle", GVAR(laserVehicleEH)] call CBA_fnc_removePlayerEventHandler;
["weapon", GVAR(laserWeaponEH)] call CBA_fnc_removePlayerEventHandler;
};
GVAR(laserKeyDownEH) = ["KeyDown", {
@ -42,7 +43,7 @@ GVAR(laserKeyDownEH) = ["KeyDown", {
}] call CBA_fnc_addDisplayHandler;
private _laserEH = {
if (sunOrMoon > 0.5) exitWith {};
if (sunOrMoon == 1) exitWith {};
params ["_player"];
private _weaponIndex = [_player, currentWeapon _player] call FUNC(getWeaponIndex);
if (
@ -60,6 +61,7 @@ private _laserEH = {
] call CBA_fnc_waitUntilAndExecute;
};
GVAR(laserWeaponEH) = ["weapon", _laserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserLoadoutEH) = ["loadout", _laserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserTurretEH) = ["turret", _laserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserVehicleEH) = ["vehicle", _laserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserWeaponEH) = ["weapon", _laserEH] call CBA_fnc_addPlayerEventHandler;

View File

@ -634,6 +634,8 @@
<Italian>Laser/torcia dell'arma costantemente accesi</Italian>
<Korean>무기 레이저 포인터 / 손전등 지속</Korean>
<German>Kontinuität des Laserpointers/Taktischen Lichts</German>
<Chinese>保持武器雷射/手電筒的狀態</Chinese>
<Chinesesimp>保持武器雷射/手电筒的状态</Chinesesimp>
</Key>
<Key ID="STR_ACE_Common_SettingPersistentLaserDesc">
<English>Enable gunlight after weapon switch or vehicle enter/exit if it was previously enabled.</English>
@ -642,6 +644,8 @@
<Italian>Abilita la torcia/laser dopo il cambio dell'arma o l'entrata/uscita del veicolo se precedentemente attiva.</Italian>
<Korean>무기를 바꾸거나 차량에 승하차 할 때 이전에 스위치 켜고 끔을 유지합니다.</Korean>
<German>Aktiviert Laserpointer/Taktisches Licht nach einem Waffenwechsel oder dem Auf-/Absitzen, falls es zuvor aktiv war.</German>
<Chinese>保存武器雷射/手電筒的開關狀態,使玩家切換武器或進出載具時能保持之前的的狀態。</Chinese>
<Chinesesimp>保存武器雷射/手电筒的开关状态,使玩家切换武器或进出载具时能保持之前的的状态。</Chinesesimp>
</Key>
<Key ID="STR_ACE_Common_bananaDisplayName">
<English>Banana</English>
@ -1163,11 +1167,17 @@
<English>Allow turning down music</English>
<German>Erlaube Musik leiser stellen</German>
<Korean>음악 끄기 허용</Korean>
<Chinese>允許調低音樂音量</Chinese>
<Chinesesimp>允许调低音乐音量</Chinesesimp>
<Japanese>音楽の音量低下を許可</Japanese>
</Key>
<Key ID="STR_ACE_Common_AllowFadeMusicTooltip">
<English>Allow ACE scripts to turn down the music.</English>
<German>Erlaube ACE-Skripten, die Musik leiser zu stellen.</German>
<Korean>ACE 스크립트가 음악을 끌 수 있습니다.</Korean>
<Chinese>允許ACE腳本去控制音樂的音量。</Chinese>
<Chinesesimp>允许ACE脚本去控制音乐的音量。</Chinesesimp>
<Japanese>ACE スプリントへ音量低下を許可します。</Japanese>
</Key>
</Package>
</Project>

View File

@ -4,7 +4,7 @@ class ACE_Settings {
category = CSTRING(displayName);
displayName = CSTRING(enable_name);
description = CSTRING(enable_tooltip);
value = 1;
value = 0;
typeName = "BOOL";
};
class GVAR(enableAmmobox) {

View File

@ -112,7 +112,7 @@
<German>Faktor für die Munitionsdurchzündungsdauer [0 zum Deaktivieren]</German>
<French>Multiplicateur de la durée du cook-off des munitions [Une valeur de 0 désactive l'effet]</French>
<Polish>Mnożnik decydujący jak długo ma trwać samozapłon amunicji [Ustawienie na 0 spowoduje wyłącznie samozapłonu]</Polish>
<Japanese>誘爆の持続時間を乗数で設定。[0 に設定で誘爆を無効化]</Japanese>
<Japanese>誘爆の持続時間を乗数で設定します。[0 に設定で誘爆を無効化]</Japanese>
<Italian>Moltiplicatore della durata dell'esplosione [Impostare 0 disabiliterà l'esplosione delle munizioni]</Italian>
<Chinese>設定彈藥殉爆效果會持續多久時間 [輸入0來關閉殉爆效果]</Chinese>
<Chinesesimp>设定弹药殉爆效果会持续多久时间 [输入0来关闭殉爆效果]</Chinesesimp>
@ -123,12 +123,16 @@
<Japanese>誘爆の可能性係数</Japanese>
<Italian>Coefficiente probabilità esplosione</Italian>
<German>Faktor für Wahrscheinlichkeit der Durchzündung</German>
<Chinese>殉爆發生機率係數</Chinese>
<Chinesesimp>殉爆发生机率系数</Chinesesimp>
</Key>
<Key ID="STR_ACE_CookOff_probabilityCoef_tooltip">
<English>Multiplier for cook-off probability. Higher value results in higher cook-off probability</English>
<Japanese>誘爆する可能性の乗数。高い値では誘爆する可能性が高まります。</Japanese>
<Italian>Moltiplicatore per la probabilità dell'esplosione. Un valore più alto aumenta la probabilità dell'esplosione</Italian>
<German>Faktor für Wahrscheinlichkeit der Durchzündung. Ein höherer Wert führt zu höherer Durchzündungswahrscheinlichkeit.</German>
<Chinese>調整殉爆發生機率係數。值越高代表越容易發生殉爆。</Chinese>
<Chinesesimp>调整殉爆发生机率系数。值越高代表越容易发生殉爆。</Chinesesimp>
</Key>
</Package>
</Project>

View File

@ -71,7 +71,7 @@
<Polish>Ktoś już zabrał ten nieśmiertelnik...</Polish>
<Russian>Кто-то уже забрал жетон...</Russian>
<Czech>Někdo jiný už vzal identifikační známku...</Czech>
<Japanese>すでに誰かがドッグ タグを取っていったようだ・・・</Japanese>
<Japanese>すでにドッグ タグは取られています・・・</Japanese>
<German>Jemand anderes hat bereits die Hundemarke genommen ...</German>
<Korean>누군가 이미 군번줄을 회수해갔습니다...</Korean>
<French>Quelqu'un d'autre a déjâ pris les plaques d'identification...</French>

View File

@ -38,6 +38,11 @@ class Extended_Init_EventHandlers {
init = QUOTE(_this call DFUNC(initObject));
};
};
class Land_Camping_Light_F {
class ADDON {
init = QUOTE(_this call DFUNC(initObject));
};
};
};
class Extended_Killed_EventHandlers {

View File

@ -249,4 +249,24 @@ class CfgVehicles {
GVAR(dragPosition)[] = {0,1.2,0};
GVAR(dragDirection) = 180;
};
class FloatingStructure_F;
class Land_Camping_Light_F: FloatingStructure_F {
GVAR(canCarry) = 1;
// if y < 0.9 player gets damage
GVAR(carryPosition)[] = {0,0.9,1};
GVAR(carryDirection) = 0;
GVAR(canDrag) = 1;
GVAR(dragPosition)[] = {0,0.7,0};
GVAR(dragDirection) = 0;
};
class Land_Camping_Light_off_F: ThingX {
GVAR(canCarry) = 1;
GVAR(carryPosition)[] = {0,0.9,1};
GVAR(carryDirection) = 0;
GVAR(canDrag) = 1;
GVAR(dragPosition)[] = {0,0.7,0};
GVAR(dragDirection) = 0;
};
};

View File

@ -60,7 +60,7 @@
<Russian>Предмет слишком тяжёлый</Russian>
<Czech>Předmět je moc těžký</Czech>
<Hungarian>Az objektum túl nehéz</Hungarian>
<Japanese>アイテムが重すぎ</Japanese>
<Japanese>アイテムが重すぎます</Japanese>
<Korean>물체가 너무 무겁습니다</Korean>
<Chinese>此物品過重</Chinese>
<Chinesesimp>此物品过重</Chinesesimp>

View File

@ -0,0 +1,13 @@
class EGVAR(arsenal,stats) {
class statBase;
class ACE_explosiveRange: statBase {
scope = 2;
priority = 1;
stats[] = {QGVAR(Range)};
displayName= CSTRING(statExploRange);
showText = 1;
textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _exploRangeStat = getNumber (_config >> _stat select 0); format [ARR_3('%1m (%2ft)', _exploRangeStat, (_exploRangeStat / 0.3048) toFixed 1)]);
condition = QUOTE(params [ARR_2('', '_config')]; (getNumber (_config >> QQGVAR(Detonator))) > 0);
tabs[] = {{}, {7}};
};
};

View File

@ -24,7 +24,7 @@ class Extended_Killed_EventHandlers {
class Extended_Take_EventHandlers {
class CAManBase {
GVAR(takeHandler) = QUOTE([ARR_3(_this select 0, _this select 1, _this select 2)] call FUNC(onInventoryChanged));
GVAR(takeHandler) = QUOTE(call FUNC(onInventoryChanged));
};
};
class Extended_Put_EventHandlers {

View File

@ -27,6 +27,7 @@ class CfgPatches {
#include "ACE_Triggers.hpp"
#include "ExplosivesUI.hpp"
#include "GUI_VirtualAmmo.hpp"
#include "ACE_Arsenal_Stats.hpp"
class CfgActions {
class None;

View File

@ -122,7 +122,7 @@
<Italian>Bloccato</Italian>
<German>Blockiert</German>
<French>Bloqué</French>
<Japanese>取り付けできない</Japanese>
<Japanese>取り付け不可</Japanese>
<Korean>막힘</Korean>
<Chinesesimp>断开</Chinesesimp>
<Chinese>斷開</Chinese>
@ -698,7 +698,7 @@
<Portuguese>Usado para detonar remotamente o explosivo quando solto.</Portuguese>
<Russian>Используется для дистанционного подрыва, после смерти оператора.</Russian>
<Italian>Usato per attivare a distanza esplosivi al momento del rilascio</Italian>
<Japanese>点火装置を離すと遠隔で起爆したいときに使います。</Japanese>
<Japanese>点火装置を遠隔から離すと起爆したいときに使います。</Japanese>
<Korean>압력이 해제될때 원격으로 폭발시킵니다.</Korean>
<Chinesesimp>当放开按钮时, 将会引爆炸弹.</Chinesesimp>
<Chinese>當放開按鈕時, 將會引爆炸彈.</Chinese>
@ -842,7 +842,7 @@
<Russian>Этот модуль управляет настройками, связанными со взрывными устройствами</Russian>
<Spanish>Este módulo ajusta las configuraciones relacionadas con explosivos.</Spanish>
<Italian>Questo modulo cambia le impostazioni relative agli esplosivi</Italian>
<Japanese>このモジュールを調節し爆発物に設定を反映させます。</Japanese>
<Japanese>モジュールを調節し爆発物に設定を反映させます。</Japanese>
<Korean>이 모듈은 폭발물에 관한 설정을 수정할 수 있게합니다.</Korean>
<Chinesesimp>此模块用来调整炸药的相关设定</Chinesesimp>
<Chinese>此模塊用來調整炸藥的相關設定</Chinese>
@ -1019,5 +1019,10 @@
<Chinesesimp>类型: 绊线闪光地雷 - 触发后产生非致命性的强光.&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 地面</Chinesesimp>
<Chinese>類型: 絆線閃光地雷 - 觸發後產生非致命性的強光.&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 地面</Chinese>
</Key>
<Key ID="STR_ACE_Explosives_statExploRange">
<English>Explosive range</English>
<French>Portée du détonateur</French>
<Japanese>爆発範囲</Japanese>
</Key>
</Package>
</Project>

View File

@ -22,5 +22,5 @@ private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []];
((driver _vehicle != _unit) &&
{!(_deployedRopes isEqualTo [])} &&
{{!(_x select 5)} count (_deployedRopes) > 0} &&
{{!(_x select 5) && !(_x select 6)} count (_deployedRopes) > 0} &&
{getPos _vehicle select 2 > 2})

View File

@ -45,8 +45,8 @@ private _hookAttachment = _vehicle getVariable [QGVAR(FRIES), _vehicle];
_ropeTop addEventHandler ["RopeBreak", {[_this, "top"] call FUNC(onRopeBreak)}];
_ropeBottom addEventHandler ["RopeBreak", {[_this, "bottom"] call FUNC(onRopeBreak)}];
//deployedRopes format: attachment point, top part of the rope, bottom part of the rope, attachTo helper object, occupied
_deployedRopes pushBack [_ropeOrigin, _ropeTop, _ropeBottom, _dummy, _hook, false];
//deployedRopes format: attachment point, top part of the rope, bottom part of the rope, attachTo helper object, occupied, broken
_deployedRopes pushBack [_ropeOrigin, _ropeTop, _ropeBottom, _dummy, _hook, false, false];
false
} count _ropeOrigins;

View File

@ -23,7 +23,7 @@ private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []];
private _usableRope = _deployedRopes select 0;
private _usableRopeIndex = 0;
{
if !(_x select 5) exitWith {
if (!(_x select 5) && !(_x select 6)) exitWith {
_usableRope = _x;
_usableRopeIndex = _forEachIndex;
};

View File

@ -85,7 +85,7 @@ if (
//Update deployedRopes array
private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []];
_deployedRopes set [_ropeIndex, [_attachmentPoint, _ropeTop, _ropeBottom, _dummy, _hook, false]];
_deployedRopes set [_ropeIndex, [_attachmentPoint, _ropeTop, _ropeBottom, _dummy, _hook, false, false]];
_vehicle setVariable [QGVAR(deployedRopes), _deployedRopes, true];
[_pfhHandle] call CBA_fnc_removePerFrameHandler;

View File

@ -36,7 +36,7 @@ private _brokenRope = [];
_brokenRope = _x;
};
} forEach _deployedRopes;
_brokenRope set [5, true];
_brokenRope set [6, true];
_vehicle setVariable [QGVAR(deployedRopes), _deployedRopes, true];
private _unit = {

View File

@ -97,35 +97,4 @@ class CfgVehicles {
};
};
};
// AIR VEHICLES
class Air: AllVehicles {};
class Helicopter: Air {
class Turrets {
class MainTurret;
};
};
class Helicopter_Base_F: Helicopter {};
class Heli_Attack_01_base_F: Helicopter_Base_F {
class Turrets: Turrets {
class MainTurret: MainTurret {
GVAR(Enabled) = 1;
discreteDistance[] = {};
discreteDistanceInitIndex = 0;
};
};
};
class Heli_Attack_02_base_F: Helicopter_Base_F {
class Turrets: Turrets {
class MainTurret: MainTurret {
GVAR(Enabled) = 1;
discreteDistance[] = {};
discreteDistanceInitIndex = 0;
};
};
};
};

View File

@ -92,7 +92,7 @@
<Portuguese>FCS reiniciado.</Portuguese>
<Italian>L'FCS è stato azzerato</Italian>
<Russian>СУО обнулен.</Russian>
<Japanese>FCS は初期化された</Japanese>
<Japanese>FCS は初期化されまし</Japanese>
<Korean>사통장치 초기화됨</Korean>
<Chinesesimp>火控系统已被重置</Chinesesimp>
<Chinese>火控系統已被重置</Chinese>

View File

@ -37,7 +37,7 @@
<Spanish>Muestra el indicador para el jugador que apunta. Esta opción no afecta si los otros jugadores verían el indicador</Spanish>
<Czech>Zobrazit infikátor, když ukážete prstem. Tato volba nemá vliv, zda ostatní hráči uvidí indikátor nebo ne.</Czech>
<Italian>Mostra puntatore per il giocatore indicato. Questa opzione non influisce la possibilità che gli altri giocatori vedano il puntatore</Italian>
<Japanese>プレイヤーへの指差し表記を描画します。このオプションは他のプレイヤーの表記に影響しません。</Japanese>
<Japanese>プレイヤーへ指差し表記を描画します。これは他のプレイヤーの表記に影響しません。</Japanese>
<Korean>대상이 가리키는곳을 보이게 합니다.</Korean>
<Chinesesimp>显示指向指示器给玩家自己。此选项设定并不影响其他玩家能否看到指示器</Chinesesimp>
<Chinese>顯示指向指示器給玩家自己。此選項設定並不影響其他玩家能否看到指示器</Chinese>
@ -101,7 +101,7 @@
<Spanish>Señala y muestra un marcador virtual donde ustás apuntando para las unidades cercanas. Puede ser mantenido.</Spanish>
<Czech>Ukazuje virtuální značku kruhu ve směru, kterým se díváte pro všechny blízké jednotky.</Czech>
<Italian>Punta e mostra un marker virtuale di dove stai guardando alle unità vicine. Può essere tenuto premuto.</Italian>
<Japanese>指差しが出すマーカー表記は自ユニットの近くにいると表記されます。これは押しっぱなしにできます。</Japanese>
<Japanese>指差し表記は自ユニットの近くにいる人のみに表記されます。また押しっぱなしにできます。</Japanese>
<Korean>당신이 보는것을 가상의 마커로 표시함으로서 다른 인원이 볼 수 있게 합니다. 누른채로 유지할 수 있습니다.</Korean>
<Chinesesimp>当按下此按键后,你附近的单位即可看见一个虚拟图示,标明你正在指向的位置。此按键可以被按住来持续显示。</Chinesesimp>
<Chinese>當按下此按鍵後,你附近的單位即可看見一個虛擬圖示,標明你正在指向的位置。此按鍵可以被按住來持續顯示。</Chinese>

View File

@ -0,0 +1,13 @@
class EGVAR(arsenal,stats) {
class statBase;
class ACE_flashlightColor: statBase {
scope = 2;
priority = 1;
stats[] = {"ACE_Flashlight_Colour"};
displayName = CSTRING(statMapLightColor);
showText = 1;
textStatement = QUOTE(getText (_this select 1 >> 'itemInfo' >> 'FlashLight' >> (_this select 0) select 0));
condition = QUOTE(getText (_this select 1 >> 'itemInfo' >> 'FlashLight' >> (_this select 0) select 0) != '');
tabs[] = {{}, {1,7}};
};
};

View File

@ -17,3 +17,4 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"
#include "CfgWeapons.hpp"
#include "ACE_Arsenal_Stats.hpp"

View File

@ -91,5 +91,10 @@
<Chinesesimp>拥有红色滤光片的手电筒。用来照亮地图。</Chinesesimp>
<Chinese>擁有紅色濾光片的手電筒。用來照亮地圖。</Chinese>
</Key>
<Key ID="STR_ACE_Flashlights_statMapLightColor">
<English>Map light color</English>
<French>Couleur de la lampe sur carte</French>
<Japanese>光の色</Japanese>
</Key>
</Package>
</Project>

View File

@ -5,8 +5,8 @@
class CfgAmmo {
// ~~~~ Bombs:
class LaserBombCore;
class Bo_GBU12_LGB: LaserBombCore {
class ammo_Bomb_LaserGuidedBase;
class Bo_GBU12_LGB: ammo_Bomb_LaserGuidedBase {
GVAR(enabled) = 1;
GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
@ -15,7 +15,7 @@ class CfgAmmo {
GVAR(gurney_c) = 2320;
GVAR(gurney_k) = 1/2;
};
class Bomb_04_F: LaserBombCore {
class Bomb_04_F: ammo_Bomb_LaserGuidedBase {
GVAR(enabled) = 1;
GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};

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