Merge branch 'acemod:master' into master

This commit is contained in:
lambdatiger 2024-02-20 20:32:46 -06:00 committed by GitHub
commit 776c1f72b2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
70 changed files with 812 additions and 691 deletions

View File

@ -192,6 +192,7 @@
<German>Verwacklungsfaktor, wenn aufgelegt</German>
<Italian>Fattore di Oscillazione Appoggiato</Italian>
<Japanese>静止時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания в состоянии покоя</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RestedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is rested.</English>
@ -201,6 +202,7 @@
<German>Beeinflusst, wie ruhig man die Waffe hält, während sie aufgelegt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è appoggiata.</Italian>
<Japanese>静止している時の武器の手ぶれの量に影響します。</Japanese>
<Russian>Влияет на величину колебания оружия в состоянии покоя.</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_DeployedSwayFactor">
<English>Deployed sway factor</English>
@ -210,6 +212,7 @@
<German>Verwacklungsfaktor, wenn Zweibein aufgestellt ist.</German>
<Italian>Fattore di Oscillazione su Bipode</Italian>
<Japanese>展開時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания при развертывании</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_DeployedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is deployed.</English>
@ -219,6 +222,7 @@
<German>Beeinflusst, wie ruhig man die Waffen hält, während das Zweibein aufgestellt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è stabilizzata usando il bipode.</Italian>
<Japanese>武器の展開(Cキー)時の武器の手ぶれの量に影響します。</Japanese>
<Russian>Влияет на величину колебания оружия при его развертывании.</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
<English>Enabled</English>

View File

@ -90,6 +90,7 @@
<French>Equipement JVN automatique</French>
<Portuguese>Equipar NVGs automaticamente</Portuguese>
<Japanese>暗視装置の自動装備</Japanese>
<Russian>Автоматическое оснащение ПНВ</Russian>
</Key>
<Key ID="STR_ACE_AI_AssignNVG_Description">
<English>Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory!</English>
@ -100,6 +101,7 @@
<French>Equipe des JVN pendant la nuit et les déséquipe le jour.\nN'ajoute pas les JVN dans l'intenvaire !</French>
<Portuguese>Equipa o NVG do inventário durante a noite e desequipa durante o dia.\nNão adiciona NVGs ao inventário!</Portuguese>
<Japanese>インベントリ内の暗視装置を夜間に装備し、日中は解除し収納します。\nこれはNVGをインベントリに追加しません。</Japanese>
<Russian>Оснащает ПНВ в инвентаре в ночное время и отключает его в дневное время.\nНе добавляет ПНВ в инвентарь!</Russian>
</Key>
</Package>
</Project>

View File

@ -110,7 +110,7 @@ class Cfg3DEN {
h = QUOTE(65 * ATTRIBUTE_H);
drawSideArrows = 1;
disableOverflow = 1;
columns[] = {0.05, 0.15, 0.85};
columns[] = {0.05, 0.15, 0.83, 0.87};
};
class ArrowLeft: ctrlButton {
idc = IDC_ATTRIBUTE_LIST_LEFT;

View File

@ -70,7 +70,7 @@ GVAR(lastSortDirectionRight) = DESCENDING;
if (!isNil QGVAR(currentLoadoutsTab) && {GVAR(currentLoadoutsTab) == IDC_buttonSharedLoadouts}) then {
private _curSelData = _contentPanelCtrl lnbData [lnbCurSelRow _contentPanelCtrl, 1];
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"];
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsList", "_unavailableItemsList"];
_extendedLoadout params ["_loadout"];
private _newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName];
@ -81,10 +81,10 @@ GVAR(lastSortDirectionRight) = DESCENDING;
_contentPanelCtrl lnbSetData [[_newRow, 1], _playerName + _loadoutName];
// Set color of row, depending if items are unavailable/missing
if (_nullItemsAmount > 0) then {
if (_nullItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]];
} else {
if (_unavailableItemsAmount > 0) then {
if (_unavailableItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]];
};
};
@ -108,24 +108,16 @@ GVAR(lastSortDirectionRight) = DESCENDING;
private _face = _extendedInfo getOrDefault [QGVAR(face), ""];
if (_face != "") then {
if (isMultiplayer) then {
private _id = [QGVAR(broadcastFace), [_unit, _face], QGVAR(centerFace_) + netId _unit] call CBA_fnc_globalEventJIP;
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
} else {
_unit setFace _face;
};
private _id = [QGVAR(broadcastFace), [_unit, _face], QGVAR(centerFace_) + hashValue _unit] call CBA_fnc_globalEventJIP;
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
};
// Set voice
private _voice = _extendedInfo getOrDefault [QGVAR(voice), ""];
if (_voice != "") then {
if (isMultiplayer) then {
private _id = [QGVAR(broadcastVoice), [_unit, _voice], QGVAR(centerVoice_) + netId _unit] call CBA_fnc_globalEventJIP;
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
} else {
_unit setSpeaker _voice;
};
private _id = [QGVAR(broadcastVoice), [_unit, _voice], QGVAR(centerVoice_) + hashValue _unit] call CBA_fnc_globalEventJIP;
[_id, _unit] call CBA_fnc_removeGlobalEventJIP;
};
// Set insignia
@ -147,7 +139,7 @@ GVAR(lastSortDirectionRight) = DESCENDING;
// Set voice if enabled
if (GVAR(loadoutsSaveVoice)) then {
_extendedInfo set [QGVAR(voice), speaker _unit];
_extendedInfo set [QGVAR(voice), (speaker _unit) call EFUNC(common,getConfigName)];
};
// Set insignia if enabled

View File

@ -48,4 +48,47 @@ call FUNC(compileStats);
// Setup Tools tab
[keys (uiNamespace getVariable [QGVAR(configItemsTools), createHashMap]), LLSTRING(toolsTab), TOOLS_TAB_ICON, -1, true] call FUNC(addRightPanelButton);
// TODO: make IDCs able to match IDX with simple math?
GVAR(idxMap) = createHashMapFromArray [
[IDC_buttonPrimaryWeapon, IDX_VIRT_PRIMARY_WEAPONS],
[IDC_buttonHandgun, IDX_VIRT_HANDGUN_WEAPONS],
[IDC_buttonSecondaryWeapon, IDX_VIRT_SECONDARY_WEAPONS],
[IDC_buttonHeadgear, IDX_VIRT_HEADGEAR],
[IDC_buttonUniform, IDX_VIRT_UNIFORM],
[IDC_buttonVest, IDX_VIRT_VEST],
[IDC_buttonBackpack, IDX_VIRT_BACKPACK],
[IDC_buttonGoggles, IDX_VIRT_GOGGLES],
[IDC_buttonNVG, IDX_VIRT_NVG],
[IDC_buttonBinoculars, IDX_VIRT_BINO],
[IDC_buttonMap, IDX_VIRT_MAP],
[IDC_buttonGPS, IDX_VIRT_COMMS],
[IDC_buttonRadio, IDX_VIRT_RADIO],
[IDC_buttonCompass, IDX_VIRT_COMPASS],
[IDC_buttonWatch, IDX_VIRT_WATCH]
];
// Make new hashmaps for face/voice/insignia so mission makers can disable them
// Copies of hashmaps aren't final
GVAR(faceCache) = +(uiNamespace getVariable QGVAR(faceCache));
GVAR(voiceCache) = +(uiNamespace getVariable QGVAR(voiceCache));
GVAR(insigniaCache) = +(uiNamespace getVariable QGVAR(insigniaCache));
// Get mission/campaign insignias
// BIS_fnc_setUnitInsignia will look in mission config, then campaign, then global config last, so overwrite accordingly
private _insigniaCondition = toString {
if (isNumber (_x >> "scope")) then {
getNumber (_x >> "scope") == 2
} else {
true
};
};
// Ref fnc_addListBoxItem, 0/nil = configFile, 1 = campaignConfigFile, 2 = missionConfigFile
{
GVAR(insigniaCache) set [_x, 1];
} forEach (_insigniaCondition configClasses (campaignConfigFile >> "CfgUnitInsignia"));
{
GVAR(insigniaCache) set [_x, 2];
} forEach (_insigniaCondition configClasses (missionConfigFile >> "CfgUnitInsignia"));
ADDON = true;

View File

@ -270,6 +270,7 @@
#define IDX_VIRT_UNIQUE_UNKNOWN_ITEMS 25
// Indexes of current items array
// Should match IDX_VIRT_X macros for any left panel tabs
#define IDX_CURR_PRIMARY_WEAPON 0
#define IDX_CURR_SECONDARY_WEAPON 1
#define IDX_CURR_HANDGUN_WEAPON 2
@ -489,3 +490,6 @@ if (!isNil QGVAR(customRightPanelButtons)) then {\
_contentPanelCtrl lnbSetPicture [[_newRow, 7], getText (configFile >> "CfgVehicles" >> (_loadout select IDX_LOADOUT_BACKPACK) select 0 >> "picture")];\
_contentPanelCtrl lnbSetPicture [[_newRow, 8], getText (_cfgWeapons >> _loadout select IDX_LOADOUT_HEADGEAR >> "picture")];\
_contentPanelCtrl lnbSetPicture [[_newRow, 9], getText (configFile >> "CfgGlasses" >> _loadout select IDX_LOADOUT_GOGGLES >> "picture")];
#define ACTION_TYPE_TEXT 0
#define ACTION_TYPE_BUTTON 1

View File

@ -1,4 +1,5 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: johnb43
* Adds custom action buttons.

View File

@ -6,9 +6,10 @@
*
* Arguments:
* 0: Config category, must be "CfgWeapons", "CfgVehicles", "CfgMagazines", "CfgVoice" or "CfgUnitInsignia" <STRING>
* 1: Classname <STRING>
* 1: Classname (must be in config case) <STRING>
* 2: Panel control <CONTROL>
* 3: Name of the picture entry in that Cfg class <STRING> (default: "picture")
* 4: Config root <NUMBER> (default: 0 -> configFile)
*
* Return Value:
* None
@ -19,7 +20,7 @@
* Public: Yes
*/
params ["_configCategory", "_className", "_ctrlPanel", ["_pictureEntryName", "picture", [""]]];
params ["_configCategory", "_className", "_ctrlPanel", ["_pictureEntryName", "picture", [""]], ["_configRoot", 0, [0]]];
private _skip = GVAR(favoritesOnly) && {!(_className in GVAR(currentItems))} && {!((toLower _className) in GVAR(favorites))};
if (_skip) then {
@ -41,10 +42,10 @@ if (_skip) then {
if (_skip) exitWith {};
// Sanitise key, as it's public; If not in cache, find info and cache it for later use
((uiNamespace getVariable QGVAR(addListBoxItemCache)) getOrDefaultCall [_configCategory + _className, {
// If not in cache, find info and cache it for later use
((uiNamespace getVariable QGVAR(addListBoxItemCache)) getOrDefaultCall [_configCategory + _className + str _configRoot, {
// Get classname (config case), display name, picture and DLC
private _configPath = configFile >> _configCategory >> _className;
private _configPath = ([configFile, campaignConfigFile, missionConfigFile] select _configRoot) >> _configCategory >> _className;
private _dlcName = _configPath call EFUNC(common,getAddon);
// If _pictureEntryName is empty, then this item has no picture (e.g. faces)

View File

@ -46,6 +46,7 @@ private _cfgWeapons = configFile >> "CfgWeapons";
private _cfgMagazines = configFile >> "CfgMagazines";
private _cfgVehicles = configFile >> "CfgVehicles";
private _cfgGlasses = configFile >> "CfgGlasses";
private _dlcName = "";
// Exit with current items (no specific category)
if (_category == IDX_CAT_ALL) exitWith {
@ -73,6 +74,12 @@ if (_category == IDX_CAT_ALL) exitWith {
_listbox lnbSetData [[_index, 1], _x];
_listbox lnbSetPicture [[_index, 0], getText (_config >> "picture")];
_listbox lnbSetTooltip [[_index, 0], _x];
_dlcName = _config call EFUNC(common,getAddon);
if (_dlcName != "") then {
_listbox lnbSetPicture [[_index, 2], (modParams [_dlcName, ["logo"]]) param [0, ""]];
};
};
} forEach _attributeItems;
@ -130,12 +137,20 @@ private _config = _cfgClass;
_alpha = 0.5;
};
_index = _listbox lnbAddRow ["", _displayName, _symbol];
_index = _listbox lnbAddRow ["", _displayName, "", _symbol];
_listbox lnbSetData [[_index, 1], _x];
_listbox lnbSetPicture [[_index, 0], getText (_config >> _x >> "picture")];
_listbox lnbSetTooltip [[_index, 0], _x];
_listbox lnbSetColor [[_index, 1], [1, 1, 1, _alpha]];
_listbox lnbSetColor [[_index, 2], [1, 1, 1, _alpha]];
_listbox lnbSetColor [[_index, 3], [1, 1, 1, _alpha]];
// Mod icon is in column 2
_dlcName = (_config >> _x) call EFUNC(common,getAddon);
if (_dlcName != "") then {
_listbox lnbSetPicture [[_index, 2], (modParams [_dlcName, ["logo"]]) param [0, ""]];
_listbox lnbSetPictureColor [[_index, 2], [1, 1, 1, _alpha]];
};
};
} forEach (keys _categoryItems);

View File

@ -35,9 +35,10 @@ if (_addItem && {_itemIndex == -1}) exitWith {
_attributeItems pushBack _itemClassname;
// Change symbol and increase alpha
_listbox lnbSetText [[_currentRow, 2], [SYMBOL_ITEM_VIRTUAL, SYMBOL_ITEM_REMOVE] select _attributeMode];
_listbox lnbSetText [[_currentRow, 3], [SYMBOL_ITEM_VIRTUAL, SYMBOL_ITEM_REMOVE] select _attributeMode];
_listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 1]];
_listbox lnbSetColor [[_currentRow, 2], [1, 1, 1, 1]];
_listbox lnbSetPictureColor [[_currentRow, 2], [1, 1, 1, 1]]; // mod icon is in column 2
_listbox lnbSetColor [[_currentRow, 3], [1, 1, 1, 1]];
};
// Remove item if in list
@ -45,7 +46,8 @@ if (!_addItem && {_itemIndex != -1}) exitWith {
_attributeItems deleteAt _itemIndex;
// Change symbol and reduce alpha
_listbox lnbSetText [[_currentRow, 2], SYMBOL_ITEM_NONE];
_listbox lnbSetText [[_currentRow, 3], SYMBOL_ITEM_NONE];
_listbox lnbSetColor [[_currentRow, 1], [1, 1, 1, 0.5]];
_listbox lnbSetColor [[_currentRow, 2], [1, 1, 1, 0.5]];
_listbox lnbSetPictureColor [[_currentRow, 2], [1, 1, 1, 0.5]]; // mod icon is in column 2
_listbox lnbSetColor [[_currentRow, 3], [1, 1, 1, 0.5]];
};

View File

@ -1,4 +1,5 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Brett Mayson
* Create the internal actions arrays when needed for the first time.

View File

@ -1,7 +1,7 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Alganthe, johnb43
* Author: Alganthe, johnb43, LinkIsGrim
* Fills left panel.
*
* Arguments:
@ -17,21 +17,28 @@
params ["_display", "_control", ["_animate", true]];
private _ctrlIDC = ctrlIDC _control;
private _ctrlPanel = _display displayCtrl IDC_leftTabContent;
private _idxVirt = GVAR(idxMap) getOrDefault [_ctrlIDC, -1, true];
// Fade old control background
if (!isNil QGVAR(currentLeftPanel)) then {
private _previousCtrlBackground = _display displayCtrl (GVAR(currentLeftPanel) - 1);
_previousCtrlBackground ctrlSetFade 1;
_previousCtrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
// When switching tabs, clear searchbox
if (GVAR(currentLeftPanel) != _ctrlIDC) then {
(_display displayCtrl IDC_leftSearchbar) ctrlSetText "";
(_display displayCtrl IDC_rightSearchbar) ctrlSetText "";
};
};
// Show new control background
private _ctrlIDC = ctrlIDC _control;
private _ctrlBackground = _display displayCtrl (_ctrlIDC - 1);
_ctrlBackground ctrlSetFade 0;
_ctrlBackground ctrlCommit ([0, FADE_DELAY] select _animate);
private _ctrlPanel = _display displayCtrl IDC_leftTabContent;
// Force a "refresh" animation of the panel
if (_animate) then {
_ctrlPanel ctrlSetFade 1;
@ -41,212 +48,82 @@ if (_animate) then {
};
_ctrlPanel lbSetCurSel -1;
// Purge old data
lbClear _ctrlPanel;
// Handle icons and filling
private _selectedItem = switch (true) do {
// Primary weapons, secondary weapons, handgun weapons
case (_ctrlIDC in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon]): {
// Purge old data
lbClear _ctrlPanel;
// Add "Empty" entry
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
_ctrlPanel lbSetValue [_addEmpty, -1];
// Add selected tab's weapons
private _index = [IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find _ctrlIDC;
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys ((GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _index));
GVAR(currentItems) select _index
};
// Uniforms, vests, backpacks
case (_ctrlIDC in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]): {
// Purge old data
lbClear _ctrlPanel;
// Add "Empty" entry
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
_ctrlPanel lbSetValue [_addEmpty, -1];
switch (_ctrlIDC) do {
// Add uniforms
case IDC_buttonUniform: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_UNIFORM));
GVAR(currentItems) select IDX_CURR_UNIFORM
};
// Add vests
case IDC_buttonVest: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_VEST));
GVAR(currentItems) select IDX_CURR_VEST
};
// Add backpacks
case IDC_buttonBackpack: {
{
["CfgVehicles", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_BACKPACK));
GVAR(currentItems) select IDX_CURR_BACKPACK
};
};
};
// Other
default {
// Don't reset right panel selection if left tab is binos
if (_ctrlIDC != IDC_buttonBinoculars) then {
GVAR(currentRightPanel) = nil;
};
lbClear _ctrlPanel;
// For every left tab except faces and voices, add "Empty" entry
if !(_ctrlIDC in [IDC_buttonFace, IDC_buttonVoice]) then {
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
_ctrlPanel lbSetValue [_addEmpty, -1];
};
switch (_ctrlIDC) do {
// Headgear
case IDC_buttonHeadgear: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_HEADGEAR));
GVAR(currentItems) select IDX_CURR_HEADGEAR
};
// Facewear
case IDC_buttonGoggles: {
{
["CfgGlasses", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_GOGGLES));
GVAR(currentItems) select IDX_CURR_GOGGLES
};
// NVGs
case IDC_buttonNVG: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_NVG));
GVAR(currentItems) select IDX_CURR_NVG
};
// Binoculars
case IDC_buttonBinoculars: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_BINO));
GVAR(currentItems) select IDX_CURR_BINO
};
// Maps
case IDC_buttonMap: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_MAP));
GVAR(currentItems) select IDX_CURR_MAP
};
// Compasses
case IDC_buttonCompass: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_COMPASS));
GVAR(currentItems) select IDX_CURR_COMPASS
};
// Radios
case IDC_buttonRadio: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_RADIO));
GVAR(currentItems) select IDX_CURR_RADIO
};
// Watches
case IDC_buttonWatch: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_WATCH));
GVAR(currentItems) select IDX_CURR_WATCH
};
// GPS and UAV Terminals
case IDC_buttonGPS: {
{
["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach (keys (GVAR(virtualItems) get IDX_VIRT_COMMS));
GVAR(currentItems) select IDX_CURR_COMMS
};
// Faces
case IDC_buttonFace: {
private _lbAdd = -1;
{
_y params ["_displayName", "_modPicture"];
_lbAdd = _ctrlPanel lbAdd _displayName;
_ctrlPanel lbSetData [_lbAdd, _x];
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _x]];
_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
} forEach (uiNamespace getVariable QGVAR(faceCache));
GVAR(currentFace)
};
// Voices
case IDC_buttonVoice: {
{
["CfgVoice", _x, _ctrlPanel, "icon"] call FUNC(addListBoxItem);
} forEach (uiNamespace getVariable QGVAR(voiceCache));
GVAR(currentVoice)
};
// Insignia
case IDC_buttonInsignia: {
// Insignia from config
{
["CfgUnitInsignia", _x, _ctrlPanel, "texture"] call FUNC(addListBoxItem);
} forEach (uiNamespace getVariable QGVAR(insigniaCache));
private _displayName = "";
private _className = "";
private _lbAdd = -1;
// Insignia from mission file
{
_className = configName _x;
_displayName = getText (_x >> "displayName");
_lbAdd = _ctrlPanel lbAdd _displayName;
_ctrlPanel lbSetData [_lbAdd, _className];
_ctrlPanel lbSetPicture [_lbAdd, getText (_x >> "texture")];
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]];
} forEach ("(if (isNumber (_x >> 'scope')) then {getNumber (_x >> 'scope')} else {2}) == 2" configClasses (missionConfigFile >> "CfgUnitInsignia"));
GVAR(currentInsignia)
};
// Unknown
default {""};
};
};
// For every left tab except faces and voices, add "Empty" entry
if !(_ctrlIDC in [IDC_buttonFace, IDC_buttonVoice]) then {
private _addEmpty = _ctrlPanel lbAdd format [" <%1>", localize "str_empty"];
_ctrlPanel lbSetValue [_addEmpty, -1];
};
// When switching tabs, clear searchbox
if (GVAR(currentLeftPanel) != _ctrlIDC) then {
(_display displayCtrl IDC_leftSearchbar) ctrlSetText "";
(_display displayCtrl IDC_rightSearchbar) ctrlSetText "";
// Don't reset the current right panel for weapons, binos and containers
if !(_idxVirt in [IDX_VIRT_PRIMARY_WEAPONS, IDX_VIRT_SECONDARY_WEAPONS, IDX_VIRT_HANDGUN_WEAPONS, IDX_VIRT_BINO, IDX_VIRT_UNIFORM, IDX_VIRT_VEST, IDX_VIRT_BACKPACK]) then {
GVAR(currentRightPanel) = nil;
};
GVAR(currentLeftPanel) = _ctrlIDC;
// Add items to the listbox
private _selectedItem = if (_idxVirt != -1) then { // Items
private _configParent = switch (_idxVirt) do {
case IDX_VIRT_GOGGLES: {"CfgGlasses"};
case IDX_VIRT_BACKPACK: {"CfgVehicles"};
default {"CfgWeapons"};
};
private _items = if (_idxVirt < IDX_VIRT_HEADGEAR) then {
keys ((GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _idxVirt)
} else {
keys (GVAR(virtualItems) get _idxVirt)
};
{
[_configParent, _x, _ctrlPanel] call FUNC(addListBoxItem);
} forEach _items;
GVAR(currentItems) select _idxVirt
} else { // Special cases
switch (_ctrlIDC) do {
// Faces
case IDC_buttonFace: {
private _lbAdd = -1; // micro-optimization
// Faces need to be added like this because their config path is
// configFile >> "CfgFaces" >> face category >> className
{
_y params ["_displayName", "_modPicture"];
_lbAdd = _ctrlPanel lbAdd _displayName;
_ctrlPanel lbSetData [_lbAdd, _x];
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _x]];
_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
} forEach GVAR(faceCache); // HashMap, not array
GVAR(currentFace)
};
// Voices
case IDC_buttonVoice: {
{
["CfgVoice", _x, _ctrlPanel, "icon"] call FUNC(addListBoxItem);
} forEach (keys GVAR(voiceCache));
GVAR(currentVoice)
};
// Insignia
case IDC_buttonInsignia: {
{
["CfgUnitInsignia", _x, _ctrlPanel, "texture", _y] call FUNC(addListBoxItem);
} forEach GVAR(insigniaCache);
GVAR(currentInsignia)
};
// Unknown
default {
WARNING_1("Unknown arsenal left panel with IDC %1, update ace_arsenal_idxMap and relevant macros if adding a new tab",_ctrlIDC);
""
};
};
};
// Trigger event
GVAR(currentLeftPanel) = _ctrlIDC;
[QGVAR(leftPanelFilled), [_display, _ctrlIDC, GVAR(currentRightPanel)]] call CBA_fnc_localEvent;
// Sort

View File

@ -1,12 +1,16 @@
#include "..\script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Alganthe, johnb43
* Fill loadouts list.
* Author: Alganthe, johnb43, LinkIsGrim
* Fill loadouts list over multiple frames. LOADOUTS_PER_FRAME macro does what it says on the tin.
* Should only ever be called by display load (with optional params as default) and by itself.
* Listen to ace_arsenal_loadoutsListFilled event if you need to iterate over the loadouts list.
*
* Arguments:
* 0: Loadouts display <DISPLAY>
* 1: Tab control <CONTROL>
* 2: Current frame filling loadouts list <NUMBER> (default: 0)
* 3: Frames necessary to fill loadouts list <NUMBER> (default: -1)
*
* Return Value:
* None
@ -14,29 +18,46 @@
* Public: No
*/
params ["_display", "_control"];
// Can just be modified directly, no further setup needed
#define LOADOUTS_PER_FRAME 10
(_display displayCtrl IDC_textEditBox) ctrlSetText "";
params ["_display", "_control", ["_currentFrame", 0], ["_framesToFill", -1]];
if (isNull _display) exitWith {
TRACE_2("display closed, aborting",_currentFrame,_framesToFill);
};
private _contentPanelCtrl = _display displayCtrl IDC_contentPanel;
if (_currentFrame == 0) then {
(_display displayCtrl IDC_textEditBox) ctrlSetText "";
// Force a "refresh" animation of the panel
_contentPanelCtrl ctrlSetFade 1;
_contentPanelCtrl ctrlCommit 0;
_contentPanelCtrl ctrlSetFade 0;
_contentPanelCtrl ctrlCommit FADE_DELAY;
// Force a "refresh" animation of the panel
_contentPanelCtrl ctrlSetFade 1;
_contentPanelCtrl ctrlCommit 0;
_contentPanelCtrl ctrlSetFade 0;
_contentPanelCtrl ctrlCommit FADE_DELAY;
_contentPanelCtrl lnbSetCurSelRow -1;
lnbClear _contentPanelCtrl;
_contentPanelCtrl lnbSetCurSelRow -1;
lnbClear _contentPanelCtrl;
};
private _sharedLoadoutsVars = GVAR(sharedLoadoutsNamespace) getVariable QGVAR(sharedLoadoutsVars);
private _cfgWeapons = configFile >> "CfgWeapons";
private _cfgWeapons = configFile >> "CfgWeapons"; // Used by ADD_LOADOUTS_LIST_PICTURES macro, do not remove
private _newRow = -1;
if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
private _loadoutNameAndTab = "";
private _loadoutCachedInfo = "";
private _sharingEnabled = GVAR(allowSharedLoadouts) && {isMultiplayer};
private _loadouts = [
profileNamespace getVariable [QGVAR(saved_loadouts), []],
GVAR(defaultLoadoutsList)
] select (ctrlIDC _control == IDC_buttonDefaultLoadouts);
if (_currentFrame == 0) then {
_framesToFill = floor ((count _loadouts) / LOADOUTS_PER_FRAME);
TRACE_2("filling loadouts list",_currentFrame,_framesToFill);
_this set [3, _framesToFill];
};
// Add all loadouts to loadout list
{
@ -50,15 +71,16 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
_loadoutCachedInfo = [_loadoutData] call FUNC(verifyLoadout);
_contentPanelCtrl setVariable [_loadoutNameAndTab, _loadoutCachedInfo];
_loadoutCachedInfo params ["", "_nullItemsAmount", "_unavailableItemsAmount", "_nullItemsList", "_unavailableItemsList"];
_loadoutCachedInfo params ["", "_nullItemsList", "_unavailableItemsList", "_missingExtendedInfo"];
// Log missing / nil items to RPT (only once per arsenal session)
if (GVAR(EnableRPTLog) && {(_nullItemsAmount > 0) || {_unavailableItemsAmount > 0}}) then {
if (GVAR(EnableRPTLog) && {(_nullItemsList isNotEqualTo []) || {_unavailableItemsList isNotEqualTo [] || {_missingExtendedInfo isNotEqualTo []}}}) then {
private _printComponent = "ACE_Arsenal - Loadout:";
private _printNullItemsList = ["Missing items:", str _nullItemsList] joinString " ";
private _printUnavailableItemsList = ["Unavailable items:", str _unavailableItemsList] joinString " ";
private _printMissingExtendedInfo = ["Missing extended loadout:", str _missingExtendedInfo] joinString " ";
diag_log text (format ["%1%5 %2%5 %3%5 %4", _printComponent, "Name: " + _loadoutName, _printNullItemsList, _printUnavailableItemsList, endl]);
diag_log text (format ["%1%6 %2%6 %3%6 %4%6 %5", _printComponent, "Name: " + _loadoutName, _printNullItemsList, _printUnavailableItemsList, _printMissingExtendedInfo, endl]);
};
};
@ -69,18 +91,18 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
_contentPanelCtrl lnbSetColumnsPos [0, 0.05, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90];
};
_loadoutCachedInfo params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"];
_extendedLoadout params ["_loadout"];
_loadoutCachedInfo params ["_extendedLoadout", "_nullItemsList", "_unavailableItemsList"];
_extendedLoadout params ["_loadout"]; // Used by ADD_LOADOUTS_LIST_PICTURES macro, do not remove
_newRow = _contentPanelCtrl lnbAddRow ["", _loadoutName];
ADD_LOADOUTS_LIST_PICTURES
// Change color on loadout lines that have items that aren't available or don't exist
if (_nullItemsAmount > 0) then {
if (_nullItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
} else {
if (_unavailableItemsAmount > 0) then {
if (_unavailableItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
};
};
@ -90,10 +112,16 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
_contentPanelCtrl lnbSetPicture [[_newRow, 0], QPATHTOF(data\iconPublic.paa)];
_contentPanelCtrl lnbSetValue [[_newRow, 0], 1];
};
} forEach ([profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (ctrlIDC _control == IDC_buttonDefaultLoadouts));
} forEach (_loadouts select [_currentFrame * LOADOUTS_PER_FRAME, [LOADOUTS_PER_FRAME, count _loadouts] select is3DEN]);
} else {
private _allPlayerNames = allPlayers apply {name _x};
private _loadouts = _sharedLoadoutsVars apply {GVAR(sharedLoadoutsNamespace) getVariable _x};
private _loadoutVar = "";
if (_currentFrame == 0) then {
_framesToFill = floor ((count _loadouts) / LOADOUTS_PER_FRAME);
TRACE_2("filling loadouts list",_currentFrame,_framesToFill);
_this set [3, _framesToFill];
};
{
_x params ["_playerName", "_loadoutName", "_loadoutData"];
@ -107,8 +135,8 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
[QGVAR(loadoutUnshared), [_contentPanelCtrl, profileName, _loadoutName]] call CBA_fnc_remoteEvent;
} else {
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsAmount", "_unavailableItemsAmount"];
_extendedLoadout params ["_loadout"];
([_loadoutData] call FUNC(verifyLoadout)) params ["_extendedLoadout", "_nullItemsList", "_unavailableItemsList"];
_extendedLoadout params ["_loadout"]; // Used by ADD_LOADOUTS_LIST_PICTURES macro, do not remove
_contentPanelCtrl lnbSetColumnsPos [0, 0.15, 0.40, 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90];
_newRow = _contentPanelCtrl lnbAddRow [_playerName, _loadoutName];
@ -118,17 +146,23 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
_contentPanelCtrl lnbSetData [[_newRow, 1], _loadoutVar];
// Change color on loadout lines that have items that aren't available or don't exist
if (_nullItemsAmount > 0) then {
if (_nullItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
} else {
if (_unavailableItemsAmount > 0) then {
if (_unavailableItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
};
};
};
} forEach (_sharedLoadoutsVars apply {GVAR(sharedLoadoutsNamespace) getVariable _x});
} forEach (_loadouts select [_currentFrame * LOADOUTS_PER_FRAME, [LOADOUTS_PER_FRAME, count _loadouts] select is3DEN]);
};
if (!is3DEN && _currentFrame != _framesToFill) exitWith {
_this set [2, _currentFrame + 1];
[FUNC(fillLoadoutsList), _this] call CBA_fnc_execNextFrame;
};
TRACE_3("finished",_currentFrame,_framesToFill,lnbSize _contentPanelCtrl);
[QGVAR(loadoutsListFilled), [_display, _control]] call CBA_fnc_localEvent;
// Sort loadouts alphabetically

View File

@ -47,7 +47,7 @@ private _groups = (GVAR(actionList) select _panel) select {
private _show = _groups isNotEqualTo [];
private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox;
_actionsBoxCtrl ctrlShow _show;
_actionsBoxCtrl ctrlCommit 0.15;
_actionsBoxCtrl ctrlCommit FADE_DELAY;
if (!_show) exitWith {};
@ -77,7 +77,6 @@ private _items = _group select 3 select {
};
_actionsCurrentPageCtrl ctrlSetText (_group select 1);
_actionsCurrentPageCtrl ctrlSetFade 0;
_actionsCurrentPageCtrl ctrlShow true;
_actionsCurrentPageCtrl ctrlCommit 0;
@ -85,36 +84,22 @@ private _activeCtrls = [];
{
_x params ["", "_type", "_label", "_statement"];
private _idc = IDC_actionsText1 + _forEachIndex * 2;
private _actionTextCtrl = _display displayCtrl _idc;
private _actionButtonCtrl = _display displayCtrl (_idc + 1);
private _idc = IDC_actionsText1 + _type + _forEachIndex * 2;
private _actionCtrl = _display displayCtrl _idc;
switch (_type) do {
case ACTION_TYPE_BUTTON: {
_actionButtonCtrl ctrlRemoveAllEventHandlers "ButtonClick";
_actionButtonCtrl ctrlAddEventHandler ["ButtonClick", {
_actionCtrl ctrlRemoveAllEventHandlers "ButtonClick";
_actionCtrl ctrlAddEventHandler ["ButtonClick", {
if (is3DEN) exitWith {[true] call FUNC(refresh)};
[{
[true] call FUNC(refresh);
}] call CBA_fnc_execNextFrame;
}];
if (_activeCtrls isNotEqualTo []) then {
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
_actionButtonCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
} else {
_actionButtonCtrl ctrlSetPositionY (6 * GRID_H);
};
_actionButtonCtrl ctrlAddEventHandler ["ButtonClick", _statement];
_actionButtonCtrl ctrlSetText _label;
_actionButtonCtrl ctrlSetFade 0;
_actionButtonCtrl ctrlEnable true;
_actionButtonCtrl ctrlCommit 0;
_actionTextCtrl ctrlSetFade 1;
_actionTextCtrl ctrlEnable false;
_actionTextCtrl ctrlCommit 0;
_activeCtrls pushBack _actionButtonCtrl;
_actionCtrl ctrlAddEventHandler ["ButtonClick", _statement];
_actionCtrl ctrlSetText _label;
_actionCtrl ctrlEnable true;
};
case ACTION_TYPE_TEXT: {
private _text = call _statement;
@ -125,47 +110,35 @@ private _activeCtrls = [];
if (_text isEqualType []) then {
_text = _text joinString endl;
};
if (_activeCtrls isNotEqualTo []) then {
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
_actionTextCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
} else {
_actionTextCtrl ctrlSetPositionY (5 * GRID_H);
};
_actionTextCtrl ctrlSetText _text;
_actionTextCtrl ctrlSetPositionH (ctrlTextHeight _actionTextCtrl);
_actionTextCtrl ctrlSetFade 0;
_actionTextCtrl ctrlEnable false;
_actionTextCtrl ctrlCommit 0;
_actionButtonCtrl ctrlSetFade 1;
_actionButtonCtrl ctrlEnable false;
_actionButtonCtrl ctrlCommit 0;
_activeCtrls pushBack _actionTextCtrl;
};
default {
_actionTextCtrl ctrlSetFade 1;
_actionTextCtrl ctrlCommit 0;
_actionButtonCtrl ctrlSetFade 1;
_actionButtonCtrl ctrlEnable false;
_actionButtonCtrl ctrlCommit 0;
_actionCtrl ctrlSetText _text;
_actionCtrl ctrlSetPositionH (ctrlTextHeight _actionCtrl);
_actionCtrl ctrlEnable false;
};
};
if (_activeCtrls isNotEqualTo []) then {
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
_actionCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
} else {
_actionCtrl ctrlSetPositionY ((5 + _type) * GRID_H);
};
_actionCtrl ctrlShow true;
_actionCtrl ctrlCommit 0;
_activeCtrls pushBack _actionCtrl;
} forEach _items;
private _actionCount = count _items;
{
private _idc = IDC_actionsText1 + _x * 2;
private _actionTextCtrl = _display displayCtrl _idc;
private _actionButtonCtrl = _display displayCtrl (_idc + 1);
private _idc = ctrlIDC _x;
if (_idc < IDC_actionsText1 || _idc > IDC_actionsButton5) then {continue};
_actionTextCtrl ctrlSetFade 1;
_actionTextCtrl ctrlCommit 0;
_actionButtonCtrl ctrlSetFade 1;
_actionButtonCtrl ctrlCommit 0;
} forEach ([0, 1, 2, 3, 4] select [_actionCount, 5]);
_x ctrlShow false;
_x ctrlEnable false;
_x ctrlSetPositionY 0;
_x ctrlCommit 0;
} forEach ((allControls _actionsBoxCtrl) select {!(_x in _activeCtrls)});
private _pos = ctrlPosition _actionsBoxCtrl;
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
private _actionsBoxHeight = _lastPosY + _lastPosH + GRID_H;
_actionsBoxCtrl ctrlSetPositionH _actionsBoxHeight;

View File

@ -68,7 +68,7 @@ if (isNil QGVAR(virtualItems)) then {
GVAR(virtualItemsFlatAll) = +GVAR(virtualItemsFlat);
GVAR(currentFace) = face GVAR(center);
GVAR(currentVoice) = speaker GVAR(center);
GVAR(currentVoice) = (speaker GVAR(center)) call EFUNC(common,getConfigName);
GVAR(currentInsignia) = GVAR(center) call BIS_fnc_getUnitInsignia;
GVAR(currentAction) = "Stand";

View File

@ -683,14 +683,19 @@ switch (GVAR(currentLeftPanel)) do {
TOGGLE_RIGHT_PANEL_HIDE
private _unitInsigniaConfig = configFile >> "CfgUnitInsignia" >> _item;
// Check for correct config: First mission, then campaign and finally regular config
private _itemCfg = missionConfigFile >> "CfgUnitInsignia" >> _item;
if (isNull _itemCfg) then {
_itemCfg = campaignConfigFile >> "CfgUnitInsignia" >> _item;
};
if (isNull _itemCfg) then {
_itemCfg = configFile >> "CfgUnitInsignia" >> _item;
};
// Display new items's info on the bottom right
if (isNull _unitInsigniaConfig) then {
[_display, _control, _curSel, missionConfigFile >> "CfgUnitInsignia" >> _item] call FUNC(itemInfo);
} else {
[_display, _control, _curSel, _unitInsigniaConfig] call FUNC(itemInfo);
};
[_display, _control, _curSel, _itemCfg] call FUNC(itemInfo);
};
};

View File

@ -15,6 +15,10 @@
params ["_control"];
// https://community.bistudio.com/wiki/toString, see comment
// However, using 55295 did not work as expected, 55291 was found by trial and error
#define HIGHEST_VALUE_CHAR 55291
// When filling the sorting panel, FUNC(sortPanel) is called twice, so ignore first call
if (GVAR(ignoreFirstSortPanelCall)) exitWith {
GVAR(ignoreFirstSortPanelCall) = false;
@ -29,6 +33,7 @@ private _sortDirectionCtrl = _display displayCtrl ([IDC_sortLeftTabDirection, ID
private _cfgMagazines = configFile >> "CfgMagazines";
private _cfgFaces = configFile >> "CfgFaces";
private _cfgUnitInsignia = configFile >> "CfgUnitInsignia";
private _cfgUnitInsigniaCampaign = campaignConfigFile >> "CfgUnitInsignia";
private _cfgUnitInsigniaMission = missionConfigFile >> "CfgUnitInsignia";
if (_rightSort) then {
@ -126,7 +131,6 @@ private _selected = if (_right) then {
_panel lbData _curSel
};
private _originalNames = createHashMap;
private _item = "";
private _quantity = "";
private _itemCfg = configNull;
@ -136,12 +140,8 @@ private _fillerChar = toString [1];
private _magazineMiscItems = uiNamespace getVariable QGVAR(magazineMiscItems);
private _sortCache = uiNamespace getVariable QGVAR(sortCache);
private _faceCache = if (_cfgClass == _cfgFaces) then {
uiNamespace getVariable [QGVAR(faceCache), createHashMap]
} else {
createHashMap
};
private _faceCache = uiNamespace getVariable QGVAR(faceCache);
private _insigniaCache = uiNamespace getVariable QGVAR(insigniaCache);
private _countColumns = if (_right) then {
count lnbGetColumnsPosition _panel
@ -150,9 +150,9 @@ private _countColumns = if (_right) then {
};
private _for = if (_right) then {
for '_i' from 0 to (lnbSize _panel select 0) - 1
for "_i" from 0 to (lnbSize _panel select 0) - 1
} else {
for '_i' from 0 to (lbSize _panel) - 1
for "_i" from 0 to (lbSize _panel) - 1
};
_for do {
@ -163,6 +163,14 @@ _for do {
_panel lbData _i
};
// Check if entry is "Empty"
if (!_right && {(_panel lbValue _i) == -1}) then {
// Set to lowest/highest lexicographical value, so that "Empty" is always at the top
_panel lbSetTextRight [_i, ["", toString [HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR, HIGHEST_VALUE_CHAR]] select (_sortDirection == ASCENDING)];
continue;
};
// Get item's count
_quantity = if (_right) then {
parseNumber (_panel lnbText [_i, 2])
@ -179,18 +187,22 @@ _for do {
_itemCfg = if !(_cfgClass in [_cfgFaces, _cfgUnitInsignia]) then {
_cfgClass >> _item
} else {
// If insignia, check both config and mission file
// If insignia, check for correct config: First mission, then campaign and finally regular config
if (_cfgClass == _cfgUnitInsignia) then {
_itemCfg = _cfgClass >> _item;
_itemCfg = _cfgUnitInsigniaMission >> _item;
if (isNull _itemCfg) then {
_itemCfg = _cfgUnitInsigniaMission >> _item;
_itemCfg = _cfgUnitInsigniaCampaign >> _item;
};
if (isNull _itemCfg) then {
_itemCfg = _cfgUnitInsignia >> _item;
};
_itemCfg
} else {
// If face, check correct category
_cfgClass >> (_faceCache get _item) param [2, "Man_A3"] >> _item
_cfgClass >> (_faceCache getOrDefault [_item, []]) param [2, "Man_A3"] >> _item
};
};
@ -216,37 +228,29 @@ _for do {
_value
}, true];
// Save the current row's item's name in a cache and set text to it's sorting value
// Set the right text temporarily, so it can be used for sorting
if (_right) then {
_name = _panel lnbText [_i, 1];
_originalNames set [_item, _name];
// Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed
// Filler char has lowest lexicographical order possible
_panel lnbSetText [[_i, 1], format ["%1%2%4%3", _value, _name, _item, _fillerChar]];
// Filler char has lowest lexicographical value possible
_panel lnbSetTextRight [[_i, 1], format ["%1%2%4%3", _value, _panel lnbText [_i, 1], _item, _fillerChar]];
} else {
if (_item != "") then {
_name = _panel lbText _i;
_originalNames set [_item, _name];
// Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed
// Filler char has lowest lexicographical order possible
_panel lbSetText [_i, format ["%1%2%4%3", _value, _name, _item, _fillerChar]];
// Filler char has lowest lexicographical value possible
_panel lbSetTextRight [_i, format ["%1%2%4%3", _value, _panel lbText _i, _item, _fillerChar]];
};
};
};
// Sort alphabetically, find the previously selected item, select it again and reset text to original text
// Sort alphabetically, find the previously selected item and select it again
if (_right) then {
_panel lnbSort [1, _sortDirection == ASCENDING];
[_panel, 1] lnbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, false];
_for do {
_item = _panel lnbData [_i, 0];
// Remove sorting text, as it blocks the item name otherwise
_panel lnbSetTextRight [[_i, 1], ""];
_panel lnbSetText [[_i, 1], _originalNames get _item];
// Set selection after text, otherwise item info box on the right side shows invalid name
if (_curSel != -1 && {_item == _selected}) then {
if (_curSel != -1 && {(_panel lnbData [_i, 0]) == _selected}) then {
_panel lnbSetCurSelRow _i;
// To avoid unnecessary checks after previsouly selected item was found
@ -254,17 +258,17 @@ if (_right) then {
};
};
} else {
lbSort [_panel, ["DESC", "ASC"] select _sortDirection];
_panel lbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, false];
_for do {
_item = _panel lbData _i;
// Check if valid item (problems can be caused when searching)
if (_item != "") then {
_panel lbSetText [_i, _originalNames get _item];
// Remove sorting text, as it blocks the item name otherwise
_panel lbSetTextRight [_i, ""];
};
// Set selection after text, otherwise item info box on the right side shows invalid name
if (_curSel != -1 && {_item == _selected}) then {
_panel lbSetCurSel _i;

View File

@ -19,279 +19,74 @@ private _extendedInfo = createHashMap;
// Check if the provided loadout is a CBA extended loadout
if (count _loadout == 2) then {
_extendedInfo = _loadout select 1;
_extendedInfo = +(_loadout select 1); // Copy the hashmap to prevent events from modifiyng the profileNamespace extendedInfo
_loadout = _loadout select 0;
};
private _cfgWeapons = configFile >> "CfgWeapons";
private _cfgMagazines = configFile >> "CfgMagazines";
private _cfgVehicles = configFile >> "CfgVehicles";
private _cfgGlasses = configFile >> "CfgGlasses";
private _weapons = GVAR(virtualItems) get IDX_VIRT_WEAPONS;
private _attachments = GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS;
private _name = "";
private _nullItemsAmount = 0;
private _unavailableItemsAmount = 0;
private _itemArray = [];
private _nullItemsList = [];
private _unavailableItemsList = [];
private _missingExtendedInfo = [];
// Search for all items and turn them into config case; Don't touch other value types
private _fnc_toConfigCase = {
// Search for all items and check their availability
private _fnc_filterLoadout = {
_this apply {
if (_x isEqualType "") then {
if (_x != "") then {
_name = _x call EFUNC(common,getConfigName);
if (_x isEqualType "" && {_x != ""}) then {
_name = _x call EFUNC(common,getConfigName);
// If item doesn't exist in config, "" is returned
// Just return unaltered item name in that case, so it can be documented as being unavailable
[_x, _name] select (_name != "");
// If item doesn't exist in config, "" is returned
if (_name == "") then {
_nullItemsList pushBack _x;
} else {
_x
// Check if item or its base weapon exist in the arsenal
if !(_name in GVAR(virtualItemsFlat)) then {
_name = _name call FUNC(baseWeapon);
if !(_name in GVAR(virtualItemsFlat)) then {
_unavailableItemsList pushBack _name;
_name = "";
};
};
};
_name
} else {
// Handle arrays
if (_x isEqualType []) then {
_x call _fnc_toConfigCase
_itemArray = _x call _fnc_filterLoadout;
// If "" is given as a container, an error is thrown, therefore, filter out all unavailable/null containers
if (count _itemArray == 2 && {(_itemArray select 0) isEqualTo ""} && {(_itemArray select 1) isEqualType []}) then {
_itemArray = [];
};
_itemArray
} else {
// All other types
// All other types and empty strings
_x
};
};
};
};
// Convert loadout to config case
// Convert loadout to config case and replace null/unavailable items
// Loadout might come from a different modpack, which might have different config naming
_loadout = _loadout call _fnc_toConfigCase;
_loadout = _loadout call _fnc_filterLoadout;
// Check a weapon, with its attachments and magazines, if items are available
private _fnc_weaponCheck = {
params ["_weaponArray", ["_index", -1]];
{
private _class = _extendedInfo getOrDefault [_x, ""];
private _cache = missionNamespace getVariable (_x + "Cache");
{
// Weapons and attachments
if (_x isEqualType "") then {
if (_x != "") then {
// Check if item exists
if (isClass (_cfgWeapons >> _x)) then {
// Get base weapon
_x = _x call FUNC(baseWeapon);
// Check if item is available in arsenal
if !(
// Weapon class name is at the very start of the array
if (_forEachIndex == 0) then {
// If the type of weapon is known, only look through that array
if (_index != -1) then {
// If binos, choose differently
if (_index == IDX_LOADOUT_BINO) then {
_x in (GVAR(virtualItems) get IDX_VIRT_BINO)
} else {
_x in (_weapons get _index)
};
} else {
_x in (_weapons get IDX_VIRT_PRIMARY_WEAPONS) ||
{_x in (_weapons get IDX_VIRT_SECONDARY_WEAPONS)} ||
{_x in (_weapons get IDX_VIRT_HANDGUN_WEAPONS)} ||
{_x in (GVAR(virtualItems) get IDX_VIRT_BINO)}
};
} else {
_x in (_attachments get IDX_VIRT_OPTICS_ATTACHMENTS) ||
{_x in (_attachments get IDX_VIRT_FLASHLIGHT_ATTACHMENTS)} ||
{_x in (_attachments get IDX_VIRT_MUZZLE_ATTACHMENTS)} ||
{_x in (_attachments get IDX_VIRT_BIPOD_ATTACHMENTS)}
}
) then {
_unavailableItemsList pushBackUnique _x;
_weaponArray set [_forEachIndex, ""];
INC(_unavailableItemsAmount);
};
} else {
_nullItemsList pushBackUnique _x;
_weaponArray set [_forEachIndex, ""];
INC(_nullItemsAmount);
};
};
} else {
// Magazines
if (_x isNotEqualTo []) then {
_x params ["_magazine"];
// Check if item exists
if (isClass (_cfgMagazines >> _magazine)) then {
// Check if item is available in arsenal
if !(_magazine in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) then {
_unavailableItemsList pushBackUnique _magazine;
_weaponArray set [_forEachIndex, []];
INC(_unavailableItemsAmount);
};
} else {
_nullItemsList pushBackUnique _magazine;
_weaponArray set [_forEachIndex, []];
INC(_nullItemsAmount);
};
};
};
} forEach _weaponArray;
};
private _item = "";
// Go through entire loadout to check if items are available in current arsenal
for "_dataIndex" from IDX_LOADOUT_PRIMARY_WEAPON to IDX_LOADOUT_ASSIGNEDITEMS do {
switch (_dataIndex) do {
// Primary weapon, Secondary weapon, Handgun weapon, Binoculars
case IDX_LOADOUT_PRIMARY_WEAPON;
case IDX_LOADOUT_SECONDARY_WEAPON;
case IDX_LOADOUT_HANDGUN_WEAPON;
case IDX_LOADOUT_BINO: {
[_loadout select _dataIndex, _dataIndex] call _fnc_weaponCheck;
};
// Uniform, vest, backpack
case IDX_LOADOUT_UNIFORM;
case IDX_LOADOUT_VEST;
case IDX_LOADOUT_BACKPACK: {
(_loadout select _dataIndex) params [["_item", ""], ["_containerItems", []]];
if (_item != "") then {
// Check if item exists
if (isClass (_cfgVehicles >> _item) || {isClass (_cfgWeapons >> _item)}) then {
// Check if item is available in arsenal
if !(_item in (GVAR(virtualItems) get (_dataIndex + 1))) then {
_unavailableItemsList pushBackUnique _item;
_loadout set [_dataIndex, []];
INC(_unavailableItemsAmount);
} else {
{
switch (true) do {
// Magazines have each 3 entries: Name, number of magazines and ammo count
case (_x isEqualTypeArray ["", 0, 0]): {
_x params ["_item"];
// Check if item exists
if (isClass (_cfgMagazines >> _item)) then {
// Check if item is available in arsenal
if !(
_item in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL) ||
{_item in (GVAR(virtualItems) get IDX_VIRT_GRENADES)} ||
{_item in (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES)} ||
{_item in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)}
) then {
_unavailableItemsList pushBackUnique _item;
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
INC(_unavailableItemsAmount);
};
} else {
_nullItemsList pushBackUnique _item;
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
INC(_nullItemsAmount);
};
};
// Weapons have 2 entries: Weapon info array and amount
case (_x isEqualTypeArray [[], 0]): {
[_x select 0] call _fnc_weaponCheck;
};
// Misc. items have 2 entries: Name and amount, containers have 2 entries: Name and isBackpack
default {
_x params ["_item"];
// Check if item exists
if (
isClass (_cfgWeapons >> _item) ||
{isClass (_cfgMagazines >> _item)} ||
{isClass (_cfgGlasses >> _item)} ||
{isClass (_cfgVehicles >> _item)}
) then {
// Check if item is available in arsenal
if !(_item in GVAR(virtualItemsFlat)) then {
_unavailableItemsList pushBackUnique _item;
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
INC(_unavailableItemsAmount);
};
} else {
_nullItemsList pushBackUnique _item;
((_loadout select _dataIndex) select 1) set [_forEachIndex, []];
INC(_nullItemsAmount);
};
};
};
} forEach _containerItems;
};
} else {
_nullItemsList pushBackUnique _item;
_loadout set [_dataIndex, []];
INC(_nullItemsAmount);
};
};
};
// Headgear
case IDX_LOADOUT_HEADGEAR: {
_item = _loadout select _dataIndex;
if (_item != "") then {
// Check if item exists
if (isClass (_cfgWeapons >> _item)) then {
// Check if item is available in arsenal
if !(_item in (GVAR(virtualItems) get IDX_VIRT_HEADGEAR)) then {
_unavailableItemsList pushBackUnique _item;
_loadout set [_dataIndex, ""];
INC(_unavailableItemsAmount);
};
} else {
_nullItemsList pushBackUnique _item;
_loadout set [_dataIndex, ""];
INC(_nullItemsAmount);
};
};
};
// Facewear
case IDX_LOADOUT_GOGGLES: {
_item = _loadout select _dataIndex;
if (_item != "") then {
// Check if item exists
if (isClass (_cfgGlasses >> _item)) then {
// Check if item is available in arsenal
if !(_item in (GVAR(virtualItems) get IDX_VIRT_GOGGLES)) then {
_unavailableItemsList pushBackUnique _item;
_loadout set [_dataIndex, ""];
INC(_unavailableItemsAmount);
};
} else {
_nullItemsList pushBackUnique _item;
_loadout set [_dataIndex, ""];
INC(_nullItemsAmount);
};
};
};
// Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs
case IDX_LOADOUT_ASSIGNEDITEMS: {
private _assignedItems = _loadout select _dataIndex;
for "_subIndex" from 0 to 5 do {
_item = _assignedItems select _subIndex;
if (_item != "") then {
// Check if item exists
if (isClass (_cfgWeapons >> _item)) then {
// Check if item is available in arsenal
if !(_item in (GVAR(virtualItems) get (IDX_VIRT_NVG + ([2, 6, 4, 3, 5, 0] select _subIndex)))) then {
_unavailableItemsList pushBackUnique _item;
_assignedItems set [_subIndex, ""];
INC(_unavailableItemsAmount);
};
} else {
_nullItemsList pushBackUnique _item;
_assignedItems set [_subIndex, ""];
INC(_nullItemsAmount);
};
};
};
};
// Previously voices were stored in lower case (speaker command returns lower case), so this is to make old loadouts compatible
if (_class != "" && {_x == QGVAR(voice)}) then {
_class = _class call EFUNC(common,getConfigName);
};
};
if (_class != "" && {!(_class in _cache)}) then {
_missingExtendedInfo pushBack [_x, _class];
_extendedInfo deleteAt _x;
};
} forEach [QGVAR(insignia), QGVAR(face), QGVAR(voice)];
[[_loadout, _extendedInfo], _nullItemsAmount, _unavailableItemsAmount, _nullItemsList, _unavailableItemsList]
// Raise event for 3rd party: mostly for handling extended info
// Pass all items, including duplicates
[QGVAR(loadoutVerified), [_loadout, _extendedInfo, _nullItemsList, _unavailableItemsList, _missingExtendedInfo]] call CBA_fnc_localEvent;
[[_loadout, _extendedInfo], _nullItemsList arrayIntersect _nullItemsList, _unavailableItemsList arrayIntersect _unavailableItemsList, _missingExtendedInfo]

View File

@ -15,6 +15,3 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#define ACTION_TYPE_BUTTON 0
#define ACTION_TYPE_TEXT 1

View File

@ -1241,10 +1241,12 @@
<Key ID="STR_ACE_Arsenal_statVisionMode_ti">
<English>Thermal integrated</English>
<Japanese>熱画像装置内蔵</Japanese>
<Russian>Интегрирован в тепловизор.</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrimTi">
<English>Thermal &amp; Primary integrated</English>
<Japanese>熱画像装置内蔵・プライマリに内蔵</Japanese>
<Russian>Интегрирован в тепловизор и осн.прицел.</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_NoSup">
<English>Not Supported</English>
@ -1600,6 +1602,7 @@
<Korean>내림차순</Korean>
<French>Décroissant</French>
<Portuguese>Decrescente</Portuguese>
<Russian>Нисходящий</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_sortAscending">
<English>Ascending</English>
@ -1610,6 +1613,7 @@
<Korean>오름차순</Korean>
<French>Croissant</French>
<Portuguese>Crescente</Portuguese>
<Russian>Восходящий</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_toolsTab">
<English>Tools</English>
@ -1636,6 +1640,7 @@
<Korean>장탄 수</Korean>
<French>Nombre de munitions</French>
<Portuguese>Quantidade de munição</Portuguese>
<Russian>Количество боеприпасов</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_statIlluminators">
<English>Illuminators</English>
@ -1645,6 +1650,7 @@
<Korean>조명</Korean>
<Portuguese>Iluminadores</Portuguese>
<Japanese>イルミネーター</Japanese>
<Russian>Осветители</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesSetting">
<English>Default to Favorites</English>
@ -1655,6 +1661,7 @@
<Korean>즐겨찾기 기본값</Korean>
<French>Favoris par défaut</French>
<Portuguese>Favoritos por padrão</Portuguese>
<Russian>По умолчанию - Избранное</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesTooltip">
<English>Controls whether the ACE Arsenal defaults to showing all items or favorites.</English>
@ -1665,6 +1672,7 @@
<Korean>ACE 아스널이 기본적으로 모든 아이템 또는 즐겨찾기를 표시할 지 여부를 조정합니다.</Korean>
<French>Contrôle si l'arsenal ACE affiche par défaut tous les éléments ou les favoris.</French>
<Portuguese>Controla se o Arsenal ACE exibe por padrão todos os itens ou favoritos.</Portuguese>
<Russian>Определяет, будет ли в арсенале ACE по умолчанию отображаться все предметы или избранное.</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorSetting">
<English>Favorites Color</English>
@ -1675,6 +1683,7 @@
<Korean>즐겨찾기 색상</Korean>
<French>Couleurs favorites</French>
<Portuguese>Cor dos favoritos</Portuguese>
<Russian>Избранный цвет</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorTooltip">
<English>Highlight color for favorited items.</English>
@ -1685,6 +1694,7 @@
<Korean>즐겨찾기한 아이템을 색상으로 강조합니다.</Korean>
<French>Met en surbrillance les éléments favoris.</French>
<Portuguese>Cor de destaque para itens favoritados.</Portuguese>
<Russian>Выделите цветом любимые предметы.</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_buttonFavoritesTooltip">
<English>Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item.</English>
@ -1695,6 +1705,7 @@
<Korean>모든 아이템을 표시하거나 즐겨찾기를 표시할 때 전환합니다\nShift 키를 누른 상태에서 두 번 클릭하여 아이템을 추가하거나 제거합니다.</Korean>
<French>Change entre l'affichage de tous les éléments ou de vos favoris.\nDouble-cliquez en maintenant la touche Maj enfoncée pour ajouter ou supprimer un élément.</French>
<Portuguese>Alterna entre a exibição de todos os itens ou seus favoritos.\nClique duas vezes enquanto mantém pressionada a tecla Shift para adicionar ou remover um item.</Portuguese>
<Russian>Переключайтесь между отображением всех элементов или ваших избранных.\nДважды щелкните, удерживая Shift, чтобы добавить или удалить элемент.</Russian>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSearchTooltip">
<English>Search\nCTRL + Click to enable live results</English>
@ -1702,6 +1713,7 @@
<Italian>Cerca\nCTRL + Click per modificare i risultati mentre scrivi</Italian>
<Japanese>検索\nCTRL + クリックで検索結果の即時表示を有効化</Japanese>
<Korean>검색\nCtrl + 클릭으로 실시간 검색 결과를 활성화</Korean>
<Russian>Поиск\nCtrl + Click для включения результатов в реальном времени</Russian>
</Key>
</Package>
</Project>

View File

@ -467,7 +467,6 @@ class GVAR(display) {
};
class actionsText1: RscTextMulti {
idc = IDC_actionsText1;
fade = 1;
x = QUOTE(0 * GRID_W);
y = QUOTE(5 * GRID_H);
w = QUOTE(45 * GRID_W);
@ -479,8 +478,6 @@ class GVAR(display) {
};
class actionsButton1: ctrlButton {
idc = IDC_actionsButton1;
onMouseEnter = QUOTE(ctrlSetFocus (_this select 0));
fade = 1;
text = "";
x = QUOTE(1 * GRID_W);
y = QUOTE(6 * GRID_H);
@ -567,6 +564,7 @@ class GVAR(display) {
colorSelect[] = {1,1,1,1};
colorSelect2[] = {1,1,1,1};
colorPictureRightSelected[] = {1,1,1,1};
colorTextRight[] = {0.5, 0.5, 0.5, 0};
onLBSelChanged = QUOTE(_this call FUNC(onSelChangedLeft));
onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick));
onSetFocus = QUOTE(GVAR(leftTabFocus) = true);
@ -597,6 +595,7 @@ class GVAR(display) {
colorSelect[] = {1,1,1,1};
colorSelect2[] = {1,1,1,1};
colorPictureRightSelected[] = {1,1,1,1};
colorTextRight[] = {0.5, 0.5, 0.5, 0};
columns[] = {0.07, 0.15, 0.75};
idcLeft = IDC_arrowMinus;
idcRIght = IDC_arrowPlus;

View File

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

View File

@ -3539,6 +3539,7 @@
<Korean>인공지능 사용</Korean>
<French>Utilisation de l'IA</French>
<Portuguese>Utilização por IA</Portuguese>
<Russian>Использование ИИ</Russian>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_illumination">
<English>Illum</English>
@ -3549,6 +3550,7 @@
<Korean>조명탄</Korean>
<French>Fusées éclairantes</French>
<Portuguese>Sinalizadoras</Portuguese>
<Russian>Осветители</Russian>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_concealment">
<English>Smoke</English>
@ -3559,6 +3561,7 @@
<Korean>연막탄</Korean>
<French>Fumigènes</French>
<Portuguese>Fumígenas</Portuguese>
<Russian>Дым</Russian>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_infantry">
<English>Inf</English>
@ -3569,6 +3572,7 @@
<Korean>보병</Korean>
<French>Infanterie</French>
<Portuguese>Infantaria</Portuguese>
<Russian>Пехота</Russian>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_lightVehicle">
<English>Veh</English>
@ -3579,6 +3583,7 @@
<Korean>차량</Korean>
<French>Véhicule</French>
<Portuguese>Veículo</Portuguese>
<Russian>Техника</Russian>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_armor">
<English>Armor</English>
@ -3589,6 +3594,7 @@
<Korean>기갑</Korean>
<French>Blindage</French>
<Portuguese>Blindagem</Portuguese>
<Russian>Бронетехника</Russian>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_aircraft">
<English>Air</English>
@ -3599,6 +3605,7 @@
<Korean>항공</Korean>
<French>Aviation</French>
<Portuguese>Aeronaves</Portuguese>
<Russian>Авиация</Russian>
</Key>
</Package>
</Project>

View File

@ -145,6 +145,7 @@
<Polish>Załóż opaskę na oczy</Polish>
<Korean>포로 눈 가리기</Korean>
<Japanese>目隠しをする</Japanese>
<Russian>Завязать глаза пленному</Russian>
</Key>
<Key ID="STR_ACE_Captives_RemoveBlindfoldCaptive">
<English>Remove blindfold</English>
@ -154,6 +155,7 @@
<Polish>Zdejmij opaskę z oczu</Polish>
<Korean>눈가리개 풀기</Korean>
<Japanese>目隠しを外す</Japanese>
<Russian>Снять повязку с глаз</Russian>
</Key>
<Key ID="STR_ACE_Captives_CableTie">
<English>Cable Tie</English>

View File

@ -35,6 +35,7 @@
</Key>
<Key ID="STR_ACE_Cargo_deployObject">
<English>Deploy</English>
<Russian>Разместить</Russian>
</Key>
<Key ID="STR_ACE_Cargo_ScrollAction">
<English>Raise/Lower | (Ctrl + Scroll) Rotate</English>
@ -278,11 +279,13 @@
<English>Loading %1 into %2...</English>
<Spanish>Cargando %1 en %2...</Spanish>
<Japanese>%1 を %2 に積み込んでいます・・・</Japanese>
<Russian>Загружаем %1 в %2...</Russian>
</Key>
<Key ID="STR_ACE_Cargo_UnloadingItem">
<English>Unloading %1 from %2...</English>
<Spanish>Descargando %1 de %2...</Spanish>
<Japanese>%1 を %2 から降ろしています・・・</Japanese>
<Russian>Выгружаем %1 из %2...</Russian>
</Key>
<Key ID="STR_ACE_Cargo_LoadingFailed">
<English>%1&lt;br/&gt;could not be loaded</English>
@ -323,6 +326,7 @@
<French>Ne peut pas être déchargé</French>
<Japanese>荷降ろし不可能です</Japanese>
<Korean>하역할 수가 없습니다</Korean>
<Russian>Не может быть выгружен</Russian>
</Key>
<Key ID="STR_ACE_Cargo_SizeMenu">
<English>Cargo Size: %1</English>
@ -331,6 +335,7 @@
<French>Encombrement fret: %1</French>
<Japanese>貨物のサイズ: %1</Japanese>
<Korean>화물 크기: %1</Korean>
<Russian>Размер груза: %1</Russian>
</Key>
<Key ID="STR_ACE_Cargo_customName_edenName">
<English>Custom Name</English>
@ -564,9 +569,11 @@
</Key>
<Key ID="STR_ACE_Cargo_enableDeploy">
<English>Enable deploy</English>
<Russian>Включить размещение</Russian>
</Key>
<Key ID="STR_ACE_Cargo_enableDeploy_description">
<English>Controls whether cargo items can be unloaded via the deploy method.</English>
<Russian>Определяет, можно ли выгружать грузы с помощью метода размещения.</Russian>
</Key>
</Package>
</Project>

View File

@ -9,7 +9,7 @@
* 2: Namespace to store the cache on <NAMESPACE>
* 3: Cache uid <STRING>
* 4: Max duration of the cache <NUMBER>
* 5: Event that clears the cache (default: nil) <STRING>
* 5: Events that clear the cache (default: nil) <STRING or ARRAY of STRING>
*
* Return Value:
* Result of the function <ANY>
@ -20,41 +20,46 @@
* Public: No
*/
params ["_params", "_function", "_namespace", "_uid", "_duration", "_event"];
params ["_params", "_function", "_namespace", "_uid", "_duration", "_events"];
if ((_namespace getVariable [_uid, [-99999]]) select 0 < diag_tickTime) then {
_namespace setVariable [_uid, [diag_tickTime + _duration, _params call _function]];
// 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;
// If there was no EH to clear these caches, add one
if (isNil "_cacheList") then {
_cacheList = [];
missionNamespace setVariable [_varName, _cacheList];
[_event, {
#ifdef DEBUG_MODE_FULL
INFO_1("Clear cached variables on event: %1",_eventName);
#endif
// Get the list of caches to clear
//IGNORE_PRIVATE_WARNING ["_eventName"];
// _eventName is defined on the function that calls the event
private _varName = format [QGVAR(clearCache_%1), _eventName];
private _cacheList = missionNamespace getVariable [_varName, []];
// Erase all the cached results
{
_x call FUNC(eraseCache);
} forEach _cacheList;
// Empty the list
missionNamespace setVariable [_varName, []];
}] call CBA_fnc_addEventHandler;
if (!isNil "_events") then {
if (_events isEqualType "") then {
_events = [_events];
};
{
private _event = _x;
private _varName = format [QGVAR(clearCache_%1), _event];
private _cacheList = missionNamespace getVariable _varName;
// Add this cache to the list of the event
_cacheList pushBack [_namespace, _uid];
// If there was no EH to clear these caches, add one
if (isNil "_cacheList") then {
_cacheList = [];
missionNamespace setVariable [_varName, _cacheList];
[_event, {
#ifdef DEBUG_MODE_FULL
INFO_1("Clear cached variables on event: %1",_eventName);
#endif
// Get the list of caches to clear
//IGNORE_PRIVATE_WARNING ["_eventName"];
// _eventName is defined on the function that calls the event
private _varName = format [QGVAR(clearCache_%1), _eventName];
private _cacheList = missionNamespace getVariable [_varName, []];
// Erase all the cached results
{
_x call FUNC(eraseCache);
} forEach _cacheList;
// Empty the list
missionNamespace setVariable [_varName, []];
}] call CBA_fnc_addEventHandler;
};
// Add this cache to the list of the event
_cacheList pushBack [_namespace, _uid];
} forEach _events;
};
#ifdef DEBUG_MODE_FULL

View File

@ -95,7 +95,7 @@ if (_state) then {
// Check if the necessary keys were pressed for a keybind
_return = _comboDikPressed &&
{_mainDevice == "KEYBOARD"} &&
{((GVAR(keyboardInputMain) getOrDefault [_mainDik, [false, 0]]) select 1) > ([0, 1] select _isDoubleTap)}; // check how many times the main key was pressed
{((GVAR(keyboardInputMain) getOrDefault [_mainDik, [false, 0]]) select 1) > (parseNumber _isDoubleTap)}; // check how many times the main key was pressed
// Keybind was detected
if (_return) exitWith {

View File

@ -17,7 +17,7 @@
params ["_className"];
(uiNamespace getVariable QGVAR(configNames)) getOrDefaultCall [toLower _className, {
(uiNamespace getVariable QGVAR(configNames)) getOrDefaultCall [toLowerANSI _className, {
private _config = configNull;
{

View File

@ -7,6 +7,7 @@
<German>AA12</German>
<Italian>AA12</Italian>
<Japanese>AA12</Japanese>
<Russian>AA12</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_AA40_Tan_Name">
<English>AA12 (Sand)</English>
@ -14,6 +15,7 @@
<German>AA12 (Sand)</German>
<Italian>AA12 (Sabbia)</Italian>
<Japanese>AA12 (サンド)</Japanese>
<Russian>AA12 (Песочный)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_AA40_Snake_Name">
<English>AA12 (Snake)</English>
@ -21,6 +23,7 @@
<German>AA12 (Schlange)</German>
<Italian>AA12 (Serpe)</Italian>
<Japanese>AA12 (ヘビ柄)</Japanese>
<Russian>AA12 (Змея)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Galat_Name">
<English>Galil ARM</English>
@ -28,6 +31,7 @@
<German>Galil ARM</German>
<Italian>Galil ARM</Italian>
<Japanese>ガリル ARM</Japanese>
<Russian>Galil ARM</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Galat_Old_Name">
<English>Galil ARM (Old)</English>
@ -35,6 +39,7 @@
<German>Galil ARM (Alt)</German>
<Italian>Galil ARM (Vecchio)</Italian>
<Japanese>ガリル ARM (使い古し)</Japanese>
<Russian>Galil ARM (Старый)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Name">
<English>GLX 160</English>
@ -42,6 +47,7 @@
<German>GLX 160</German>
<Italian>GLX-160</Italian>
<Japanese>GLX 160</Japanese>
<Russian>GLX 160</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Snake_Name">
<English>GLX 160 (Snake)</English>
@ -49,6 +55,7 @@
<German>GLX 160 (Schlange)</German>
<Italian>GLX-160 (Serpe)</Italian>
<Japanese>GLX 160 (ヘビ柄)</Japanese>
<Russian>GLX 160 (Змея)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Hex_Name">
<English>GLX 160 (Hex)</English>
@ -56,6 +63,7 @@
<German>GLX 160 (Hex)</German>
<Italian>GLX-160 (Hex)</Italian>
<Japanese>GLX 160 (六角形迷彩)</Japanese>
<Russian>GLX 160 (Гекс)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_GreenHex_Name">
<English>GLX 160 (Green Hex)</English>
@ -63,6 +71,7 @@
<German>GLX 160 (Grün Hex)</German>
<Italian>GLX-160 (Hex Verde)</Italian>
<Japanese>GLX 160 (緑六角形迷彩)</Japanese>
<Russian>GLX 160 (Зеленый Гекс)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Camo_Name">
<English>GLX 160 (Camo)</English>
@ -70,6 +79,7 @@
<German>GLX 160 (Tarn)</German>
<Italian>GLX-160 (Mimetica)</Italian>
<Japanese>GLX 160 (迷彩)</Japanese>
<Russian>GLX 160 (Камуфляж)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Tan_Name">
<English>GLX 160 (Sand)</English>
@ -77,6 +87,7 @@
<German>GLX 160 (Sand)</German>
<Italian>GLX-160 (Sabbia)</Italian>
<Japanese>GLX 160 (サンド)</Japanese>
<Russian>GLX 160 (Песочный)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_EBR_Black_Name">
<English>Mk14 Mod 1 EBR (Black)</English>
@ -84,6 +95,7 @@
<German>Mk14 Mod 1 EBR (Schwarz)</German>
<Italian>Mk14 Mod 1 EBR (Nero)</Italian>
<Japanese>Mk14 Mod 1 EBR (ブラック)</Japanese>
<Russian>Mk14 Mod 1 EBR (Черный)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_EBR_Snake_Name">
<English>Mk14 Mod 1 EBR (Snake)</English>
@ -91,12 +103,14 @@
<German>Mk14 Mod 1 EBR (Schlange)</German>
<Italian>Mk14 Mod 1 EBR (Serpe)</Italian>
<Japanese>Mk14 Mod 1 EBR (ヘビ柄)</Japanese>
<Russian>Mk14 Mod 1 EBR (Змея)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Name">
<English>Vektor SS-77</English>
<Korean>벡터 SS-77</Korean>
<German>Vektor SS-77</German>
<Japanese>ヴェクター SS-77</Japanese>
<Russian>Vektor SS-77</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_AAF_Name">
<English>Vektor SS-77 (Camo)</English>
@ -104,6 +118,7 @@
<German>Vektor SS-77 (Tarn)</German>
<Italian>Vektor SS-77 (Mimetica)</Italian>
<Japanese>ヴェクター SS-77 (迷彩)</Japanese>
<Russian>Vektor SS-77 (Камуфляж)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Hex_Name">
<English>Vektor SS-77 (Hex)</English>
@ -111,6 +126,7 @@
<German>Vektor SS-77 (Hex)</German>
<Italian>Vektor SS-77 (Hex)</Italian>
<Japanese>ヴェクター SS-77 (六角形迷彩)</Japanese>
<Russian>Vektor SS-77 (гекс)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_GreenHex_Name">
<English>Vektor SS-77 (Green Hex)</English>
@ -118,6 +134,7 @@
<German>Vektor SS-77 (Grün Hex)</German>
<Italian>Vektor SS-77 (Hex Verde)</Italian>
<Japanese>ヴェクター SS-77 (緑六角形迷彩)</Japanese>
<Russian>Vektor SS-77 (зеленый гекс)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Desert_Name">
<English>Vektor SS-77 (Desert)</English>
@ -125,6 +142,7 @@
<German>Vektor SS-77 (Wüste)</German>
<Italian>Vektor SS-77 (Deserto)</Italian>
<Japanese>ヴェクター SS-77 (砂漠迷彩)</Japanese>
<Russian>Vektor SS-77 (песочныйt)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Compact_Name">
<English>Vektor SS-77 Compact</English>
@ -132,6 +150,7 @@
<German>Vektor SS-77 Kompakt</German>
<Italian>Vektor SS-77 Compatto</Italian>
<Japanese>ヴェクター SS-77 コンパクト</Japanese>
<Russian>Vektor SS-77 Compact</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Compact_Snake_Name">
<English>Vektor SS-77 Compact (Snake)</English>
@ -139,6 +158,7 @@
<German>Vektor SS-77 Compact (Schlange)</German>
<Italian>Vektor SS-77 Compatto (Serpe)</Italian>
<Japanese>ヴェクター SS-77 コンパクト (ヘビ柄)</Japanese>
<Russian>Vektor SS-77 Compact (змея)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Wood_Name">
<English>FN FAL 50.00 (Wood)</English>
@ -146,6 +166,7 @@
<German>FN FAL 50.00 (Holz)</German>
<Italian>FN FAL 50.00 (Legno)</Italian>
<Japanese>FN FAL 50.00 (森林迷彩)</Japanese>
<Russian>FN FAL 50.00 (лесной)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_GL_Wood_Name">
<English>FN FAL 50.00 GL (Wood)</English>
@ -153,6 +174,7 @@
<German>FN FAL 50.00 GL (Holz)</German>
<Italian>FN FAL 50.00 GL (Legno)</Italian>
<Japanese>FN FAL 50.00 GL (森林迷彩)</Japanese>
<Russian>FN FAL 50.00 GL (лесной)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Name">
<English>FN FAL 50.00</English>
@ -160,6 +182,7 @@
<German>FN FAL 50.00</German>
<Italian>FN FAL 50.00</Italian>
<Japanese>FN FAL 50.00</Japanese>
<Russian>FN FAL 50.00</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_GL_Name">
<English>FN FAL 50.00 GL</English>
@ -167,6 +190,7 @@
<German>FN FAL 50.00 GL</German>
<Italian>FN FAL 50.00 GL</Italian>
<Japanese>FN FAL 50.00 GL</Japanese>
<Russian>FN FAL 50.00 GL</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Desert_Name">
<English>FN FAL 50.00 (Desert)</English>
@ -174,6 +198,7 @@
<German>FN FAL 50.00 (Wüstet)</German>
<Italian>FN FAL 50.00 (Deserto)</Italian>
<Japanese>FN FAL 50.00 (砂漠迷彩)</Japanese>
<Russian>FN FAL 50.00 (песочный)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Camo_Name">
<English>FN FAL 50.00 (Jungle)</English>
@ -181,6 +206,7 @@
<German>FN FAL 50,00 (Dschungel)</German>
<Italian>FN FAL 50,00 (Giungla)</Italian>
<Japanese>FN FAL 50.00 (熱帯迷彩)</Japanese>
<Russian>FN FAL 50.00 (джунгли)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R4_Name">
<English>Vektor R4</English>
@ -188,6 +214,7 @@
<German>Vektor R4</German>
<Italian>Vektor R4</Italian>
<Japanese>ヴェクター R5</Japanese>
<Russian>Vektor R4</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_Name">
<English>Vektor R5 Carbine</English>
@ -195,6 +222,7 @@
<German>Vektor R5 Carbine</German>
<Italian>Vektor R5 Carabina</Italian>
<Japanese>ヴェクター R5 カービン</Japanese>
<Russian>Vektor R5 Carbine</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_GL_Name">
<English>Vektor R5 Carbine GL</English>
@ -202,6 +230,7 @@
<German>Vektor R5 Carbine GL</German>
<Italian>Vektor R5 Carabina GL</Italian>
<Japanese>ヴェクター R5 カービン GL</Japanese>
<Russian>Vektor R5 Carbine GL</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_Snake_Name">
<English>Vektor R5 Carbine (Snake)</English>
@ -209,6 +238,7 @@
<German>Vektor R5 Carbine (Schlange)</German>
<Italian>Vektor R5 Carabina (Serpe)</Italian>
<Japanese>ヴェクター R5 カービン (ヘビ柄)</Japanese>
<Russian>Vektor R5 Carbine (Змея)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_GL_Snake_Name">
<English>Vektor R5 Carbine GL (Snake)</English>
@ -216,6 +246,7 @@
<German>Vektor R5 Carbine GL (Schlange)</German>
<Italian>Vektor R5 Carabina GL (Serpe)</Italian>
<Japanese>ヴェクター R5 カービン GL (ヘビ柄)</Japanese>
<Russian>Vektor R5 Carbine GL (Змея)</Russian>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_Name">
<English>XMS</English>

View File

@ -188,6 +188,7 @@
<Korean>쿡오프 후 차량이 항상 파괴되는지 여부를 조정합니다.</Korean>
<French>Contrôle si les véhicules seront toujours détruits après l'auto-inflammation.</French>
<Portuguese>Define se os veículos serão sempre destruídos após cozinhamento.</Portuguese>
<Russian>Определяет, всегда ли транспортные средства будут уничтожаться после детонации.</Russian>
</Key>
<Key ID="STR_ACE_CookOff_enableFire_name">
<English>Enable Cook-Off Vehicle Fire</English>

View File

@ -166,6 +166,7 @@
<Korean>가벼운 개체 들고 달리기 허용</Korean>
<French>Autoriser la course avec des objets légers</French>
<Portuguese>Permitir corrida com objetos leves</Portuguese>
<Russian>Позволяет работать с легкими объектами</Russian>
</Key>
<Key ID="STR_ACE_Dragging_allowRunWithLightweight_Description">
<English>Allow the player to run when carrying lightweight objects.</English>
@ -176,6 +177,7 @@
<Korean>가벼운 개체를 들고 다닐 때 플레이어가 뛸 수 있도록 허용합니다.</Korean>
<French>Autorise le joueur à courir lorsqu'il porte un objet léger.</French>
<Portuguese>Permite ao jogador correr enquanto carrega objetos leves.</Portuguese>
<Russian>Разрешите игроку бегать при переноске легких предметов.</Russian>
</Key>
<Key ID="STR_ACE_Dragging_skipContainerWeight_DisplayName">
<English>Skip Object Weight</English>
@ -186,6 +188,7 @@
<Korean>개체 무게 무시</Korean>
<French>Ignorer le poids de l'objet</French>
<Portuguese>Ignorar Peso do Objeto</Portuguese>
<Russian>Игнорировать вес объекта</Russian>
</Key>
<Key ID="STR_ACE_Dragging_skipContainerWeight_Description">
<English>Determines whether object's weight is added onto weight calculations.</English>
@ -196,6 +199,7 @@
<Korean>무게 계산에 개체의 무게를 추가할 지 여부를 결정합니다.</Korean>
<French>Défini si le poids d'un objet est ajouté aux calculs du poids.</French>
<Portuguese>Determina se o peso do objeto é adicionado aos cálculos de peso.</Portuguese>
<Russian>Определяет, добавляется ли вес объекта при расчете веса.</Russian>
</Key>
<Key ID="STR_ACE_Dragging_weightCoefficient_DisplayName">
<English>Max Weight Coefficient</English>
@ -205,6 +209,7 @@
<Portuguese>Coeficiente Máximo de Peso</Portuguese>
<German>Maximaler Gewichtskoeffizient</German>
<Japanese>最大重量係数</Japanese>
<Russian>Максимальный коэффициент веса</Russian>
</Key>
<Key ID="STR_ACE_Dragging_weightCoefficient_Description">
<English>Modifies weight limit calculations. Set to 0 to ignore.</English>
@ -214,6 +219,7 @@
<Portuguese>Modifica os cálculos do limite de peso. Defina como 0 para ignorar.</Portuguese>
<German>Ändert die Berechnung der Gewichtsbegrenzung. Zum Ignorieren auf 0 setzen.</German>
<Japanese>重量制限の計算を変更します。 無視するには 0 に設定します。</Japanese>
<Russian>Изменяет расчеты предельного веса. Установите значение 0 для игнорирования.</Russian>
</Key>
</Package>
</Project>

View File

@ -72,21 +72,25 @@
<English>Detonate All on Active Clacker</English>
<German>Alle auf Standardzünder zünden</German>
<Italian>Detona Tutti sul Detonatore Attivo</Italian>
<Russian>Подрыв всех на активном детонаторе</Russian>
</Key>
<Key ID="STR_ACE_Explosives_SetActiveTrigger">
<English>Set Active Clacker</English>
<German>Als Standardzünder wählen</German>
<Italian>Imposta Detonatore Attivo</Italian>
<Russian>Установить активный детонатор</Russian>
</Key>
<Key ID="STR_ACE_Explosives_CycleActiveTrigger">
<English>Cycle Active Clacker</English>
<German>Standardzünder wechseln</German>
<Italian>Cambia Detonatore Attivo</Italian>
<Russian>Цикл активного детонатора</Russian>
</Key>
<Key ID="STR_ACE_Explosives_ActiveTrigger">
<English>Active Clacker</English>
<German>Standardzünder</German>
<Italian>Detonatore Attivo</Italian>
<Russian>Активный детонатор</Russian>
</Key>
<Key ID="STR_ACE_Explosives_DetonateCode">
<English>Explosive code: %1</English>

View File

@ -324,6 +324,7 @@
<Korean>FRIES 로프 자동 장착</Korean>
<French>Equipement automatique FRIES</French>
<Portuguese>Auto-equipar FRIES</Portuguese>
<Russian>Авто-подготовка канатов</Russian>
</Key>
<Key ID="STR_ACE_Fastroping_setting_autoAddFRIES_description">
<English>Automatically add FRIES to helicopters that support them.</English>
@ -334,6 +335,7 @@
<Korean>로프를 지원하는 헬기에 자동으로 FRIES 로프를 추가합니다.</Korean>
<French>Ajoute automatiquement des FRIES aux hélicoptères qui les supportent.</French>
<Portuguese>Adiciona automaticamente FRIES a helicópteros que os suportam.</Portuguese>
<Russian>Автоматически добавляйте канаты в вертолеты, которые их поддерживают.</Russian>
</Key>
</Package>
</Project>

View File

@ -26,6 +26,7 @@
<Italian>Fame</Italian>
<German>Hunger</German>
<Japanese>空腹</Japanese>
<Russian>Голод</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Field_Rations_Hunger_Description">
<English>%3Hunger%4 increases linearly with soldier's movement speed. Restore by eating food.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Pick up food.&lt;br/&gt;%2Use [%3%12%4] and select %3Survival%4.&lt;br/&gt;%2Choose an item to consume.</English>
@ -35,6 +36,7 @@
<German>%3Hunger%4 steigt linear mit der Bewegungsgeschwindigkeit des Soldaten. Regeneriert sich, indem Nahrung zu sich genommen wird.&lt;br/&gt;&lt;br/&gt;%3Verwende:%4&lt;br/&gt;%2Nahrung einsammeln.&lt;br/&gt;%2Verwende [%3%12%4] und wählen %3Überleben%4.&lt;br /&gt;%2Wähle einen Gegenstand zum Verzehr aus.</German>
<Italian>%3Fame%4 aumenta linearmente con la velocità di movimento del soldato. Si rigenera consumando cibo.&lt;br/&gt;&lt;br/&gt;%3Usa:%4&lt;br/&gt;%2Raccogli cibo.&lt;br/&gt;%2Usa [%3%12%4] e scegli %3sopravvivenza%4.&lt;br /&gt;%2Scegli un articolo da mangiare.</Italian>
<Japanese>%3空腹度%4は兵士の移動速度に比例して増加します。食べ物を食べることで回復します。&lt;br/&gt;&lt;br/&gt;%3使用方法:%4&lt;br/&gt;%2食べ物を持つ。&lt;br/&gt;%2[%3%12%4] を使って%3サバイバル%4を選択。&lt;br/&gt;%2食べたいものを選ぶ。</Japanese>
<Russian>%3Голод%4 линейно увеличивается со скоростью передвижения солдата. Восстанавливайтесь, употребляя пищу.&lt;br/&gt;&lt;br/&gt;%3 Использование:%4&lt;br/&gt;%2Возьмите еду.&lt;br/&gt;%2Используйте [%3%12%4] и выберите %3Выживание% 4.&lt;br/&gt;%2Выберите продукт для потребления.</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Field_Rations_Thirst_DisplayName">
<English>Thirst</English>
@ -44,6 +46,7 @@
<Italian>Sete</Italian>
<German>Durst</German>
<Japanese>渇き</Japanese>
<Russian>Жажда</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Field_Rations_Thirst_Description">
<English>%3Thirst%4 increases linearly with soldier's movement speed. Restore by drinking liquids.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Pick up a drink.&lt;br/&gt;%2Use [%3%12%4] and select %3Survival%4.&lt;br/&gt;%2Choose an item to consume.</English>
@ -53,6 +56,7 @@
<German>%3Durst%4 steigt linear mit der Bewegungsgeschwindigkeit des Soldaten. Regeneriert sich durch das Trinken von Flüssigkeiten.&lt;br/&gt;&lt;br/&gt;%3Verwende:%4&lt;br/&gt;%2Holen ein Getränk.&lt;br/&gt;%2Verwende [%3%12%4] und wähle %3Überleben%4.&lt; br/&gt;%2Wähle einen Gegenstand zum Verzehr aus.</German>
<Italian>%3Sete%4 aumenta linearmente con la velocità di movimento del soldato. Si rigenera bevendo liquidi.&lt;br/&gt;&lt;br/&gt;%3Usa:%4&lt;br/&gt;%2Raccogli bevanda.&lt;br/&gt;%2Usa [%3%12%4] e scegli %3sopravvivenza%4.&lt;br /&gt;%2Scegli un articolo da bere.</Italian>
<Japanese>%3喉の渇き%4は兵士の移動速度に比例して増加します。飲み物を飲むことで回復します。&lt;br/&gt;&lt;br/&gt;%3使用方法:%4&lt;br/&gt;%2飲み物を持つ。&lt;br/&gt;%2[%3%12%4] を使って%3サバイバル%4を選択。&lt;br/&gt;%2飲みたいものを選ぶ。</Japanese>
<Russian>%3Жажда%4 линейно увеличивается со скоростью передвижения солдата. Восстанавливайтесь, употребляя напитки.&lt;br/&gt;&lt;br/&gt;%3 Использование:%4&lt;br/&gt;%2Возьмите напиток.&lt;br/&gt;%2Используйте [%3%12%4] и выберите %3Выживание% 4.&lt;br/&gt;%2Выберите напиток для потребления.</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_DisplayName">
<English>Medical Treatment</English>
@ -62,6 +66,7 @@
<German>Medizinische Behandlung</German>
<Italian>Cure Mediche</Italian>
<Japanese>治療</Japanese>
<Russian>Медицинское лечение</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Adenosine_ShortName">
<English>Decrease Heart Rate</English>
@ -71,6 +76,7 @@
<German>Verringere Herzfrequenz</German>
<Italian>Rallenta ritmo cardiaco</Italian>
<Japanese>心拍数を下げる</Japanese>
<Russian>Уменьшить частоту сердечных сокращений</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Adenosine_Description">
<English>%3Adenosine%4 is used to decrease heart rate.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an appendage.&lt;br/&gt;%2Inject %3Adenosine%4.</English>
@ -80,6 +86,7 @@
<German>%3Adenosin%4 wird verwendet, um die Herzfrequenz zu senken.&lt;br/&gt;&lt;br/&gt;%3Verwende:%4&lt;br/&gt;%2Verwende [%3%13%4] oder [%3%14%4] und wählen ein Körperteil aus.&lt;br/&gt;%2Injiziere %3Adenosin%4.</German>
<Italian>%3Adenosina%4 è usata per rallentare il ritmo cardiaco.&lt;br/&gt;&lt;br/&gt;%3Utilizzo:%4&lt;br/&gt;%2Usa [%3%13%4] o [%3%14%4] e seleziona un arto.&lt;br/&gt;%2Inject %3Adenosina%4.</Italian>
<Japanese>%3アデシン%4は心拍数を下げるのに使われます。&lt;br/&gt;&lt;br/&gt;%3使用方法:%4&lt;br/&gt;%2[%3%13%4] または [%3%14%4] を使って四肢を選択します。&lt;br/&gt;%2そして%3アデシン%4を注射します。</Japanese>
<Russian>%3Аденозин%4 используется для снижения частоты сердечных сокращений.&lt;br/&gt;&lt;br/&gt;%3Применение:%4&lt;br/&gt;%2Используйте [%3%13%4] или [%3%14%4] и выберите конечность.&lt;br/&gt;%2Введите %3Аденозин%4.</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Bandages_DisplayName">
<English>Bandages</English>
@ -89,6 +96,7 @@
<German>Bandagen</German>
<Italian>Bende</Italian>
<Japanese>包帯</Japanese>
<Russian>Бинты</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Bandages_ShortName">
<English>Close Wounds</English>
@ -98,6 +106,7 @@
<German>Wunden schließen</German>
<Italian>Chiudi ferite</Italian>
<Japanese>傷口をふさぐ</Japanese>
<Russian>Закрыть раны</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Bandages_Description">
<English>%3Bandages%4 stop bleeding and close wounds. Depending on your settings, bandages may reopen if surgery is not performed.&lt;br/&gt;&lt;br/&gt;%2%3Field Dressing:%4&lt;br/&gt;%11&lt;t color='#D9D900'&gt;Average&lt;/t&gt; In All Categories&lt;br/&gt;%2%3Packing Bandage:%4&lt;br/&gt;%11&lt;t color='#D9D900'&gt;Average&lt;/t&gt; Treatment&lt;br/&gt;%11&lt;t color='#E60000'&gt;Higher&lt;/t&gt; Reopen Chance&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Longer&lt;/t&gt; Reopen Delay&lt;br/&gt;%2%3Elastic Bandage:%4&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Higher&lt;/t&gt; Treatment&lt;br/&gt;%11&lt;t color='#E60000'&gt;Higher&lt;/t&gt; Reopen Chance&lt;br/&gt;%11&lt;t color='#E60000'&gt;Shorter&lt;/t&gt; Reopen Delay&lt;br/&gt;%2%3Quickclot:%4&lt;br/&gt;%11&lt;t color='#E60000'&gt;Lower&lt;/t&gt; Treatment&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Lower&lt;/t&gt; Reopen Chance&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Longer&lt;/t&gt; Reopening Delay&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select a injured body part.&lt;br/&gt;%2Bandage body part by selecting desired %3Bandage%4 type.</English>
@ -125,6 +134,7 @@
<German>Blutvolumen wiederherstellen</German>
<Italian>Ristorano Volume di Sangue</Italian>
<Japanese>血液量を回復する</Japanese>
<Russian>Внутривенные жидкости</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_IVFluids_Description">
<English>%3IV fluids%4 restore lost blood volume. Blood, Plasma, and Saline are functionally the same.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an appendage.&lt;br/&gt;%2Restore blood volume by selecting desired %3IV Fluid%4 type.</English>
@ -143,6 +153,7 @@
<German>Herzfrequenz erhöhen | Wache schneller auf</German>
<Italian>Aumenta ritmo cardiaco | Accelera rinvenimento </Italian>
<Japanese>心拍数を上げる | はやく起こす</Japanese>
<Russian>Увеличьте частоту сердечных сокращений | просыпайтесь быстрее</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Epinephrine_Description">
<English>%3Epinephrine%4 increases a patient's pulse as well as potentially decreasing the time between consciousnesss checks (effectively reducing the time needed for the patient to wake up).&lt;br/&gt;&lt;br/&gt;%3Usage%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an appendage.&lt;br/&gt;%2Inject %3Epinephrine%4.</English>
@ -161,6 +172,7 @@
<German>Wie neu wiederherstellen</German>
<Italian>Cura completa</Italian>
<Japanese>生まれたてのように回復する</Japanese>
<Russian>Лечение тела</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_PAK_Description">
<English>The %3Personal Aid Kit%4 is an item that allows a soldier to be fully healed. Independent of %3ACE Settings%4, it requires that the patient is in %3Stable Condition%4 before use.&lt;br/&gt;&lt;br/&gt;%3Stable Condition%4 qualifies as:&lt;br/&gt;%2Unit is %3Alive%4.&lt;br/&gt;%2Unit is %3Conscious%4.&lt;br/&gt;%2Unit has no active %3Bleeding%4.&lt;br/&gt;%2Heart Rate &gt;= 40.&lt;br/&gt;%2Systolic BP &gt;= 60.&lt;br/&gt;%2Diastolic BP &gt;= 50.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Move to appropriate location depending on %3ACE Settings%4.&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select %3Advanced Treatments%4&lt;br/&gt;%2Select %3Use Personal Aid Kit%4.</English>
@ -179,6 +191,7 @@
<German>Brüche richten</German>
<Italian>Risolvi frattura</Italian>
<Japanese>骨折を治す</Japanese>
<Russian>Исправлять переломы</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Splint_Description">
<English>A %3Splint%4 is used to fix fractures. The %3Splint%4 is consumed when used.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an affected appendage.&lt;br/&gt;%2Select %3Apply Splint%4.</English>
@ -196,6 +209,7 @@
<Portuguese>Prevenir Reabertura de Feridas</Portuguese>
<Italian>Impedisce la riapertura di ferite</Italian>
<Japanese>傷口が開くのを防ぐ</Japanese>
<Russian>Предотвратить повторное открытие ран</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_SurgicalKit_Description">
<English>A %3Surgical Kit%4 is used to prevent wounds from reopening after being bandaged. Depending on settings, it can also clear trauma and may require additional %3Sutures%4 to close wounds. Sutures are consumable, much like bandages, and are not a replacement for the Surgical Kit.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select %3Advanced Treatment%4.&lt;br/&gt;%2Select %3Use Surgical Kit%4.</English>
@ -212,6 +226,7 @@
<Portuguese>Parar o Sangramento</Portuguese>
<Italian>Ferma emorragia</Italian>
<Japanese>出血を止める</Japanese>
<Russian>Остановить кровотечение</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_CAT_Description">
<English>A %3Tourniquet%4 stops bleeding temporarily so that a wound(s) can be bandaged. Can only be used on limbs.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an affected appendage.&lt;br/&gt;%2Select %3Apply Tourniquet%4.</English>
@ -354,6 +369,7 @@
<Korean>내비게이션입니다</Korean>
<Italian>Naviga</Italian>
<Japanese>測位</Japanese>
<Russian>Навигация</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DAGR_Description">
<English>The %3DAGR%4 is a simpler version of the %3MicroDAGR GPS%4. It has similar features but lacks the topographic and satellite imaging functions of the %3MicroDAGR GPS%4.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3DAGR%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Configure%4 or %3Toggle%4.&lt;br/&gt;&lt;br/&gt;The following menus are available when configuring your %3DAGR:%4&lt;br/&gt;%11%2Data View: WIP&lt;br/&gt;%11%2GoTo WP: Select a waypoint to track.&lt;br/&gt;%11%2WP List: Add/Edit/Remove waypoints.&lt;br/&gt;%11%2Connect To: Connect %3DAGR%4 to the %3Vector 21 Rangefinder%4.&lt;br/&gt;%11%2Options</English>
@ -368,6 +384,7 @@
<Korean>'폭발'적인 복수입니다</Korean>
<Italian>Vendetta Esplosiva</Italian>
<Japanese>爆発的な復讐</Japanese>
<Russian>Взрывная месть</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DeadManSwitch_Description">
<English>The %3Dead Man's Switch%4 is a device that allows a soldier to detonate an %3Explosive%4 when the soldier dies.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Explosives%4.&lt;br/&gt;%2Select %3Dead Man's Switch%4 and connect the desired %3Explosive%4.&lt;br/&gt;%2Repeat the process and disconnect to reverse.</English>
@ -389,6 +406,7 @@
<Korean>폭발물을 해체합니다</Korean>
<Italian>Disinnesca Esplosivi</Italian>
<Japanese>爆発物の解除</Japanese>
<Russian>Обезвреживание взрывчатки</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_EarPlugs_ShortName">
<English>Protect Your Hearing</English>
@ -396,6 +414,7 @@
<Korean>청력을 보호합니다</Korean>
<Italian>Proteggi il tuo Udito</Italian>
<Japanese>聴覚の保護</Japanese>
<Russian>Защитите свой слух</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_EarPlugs_Description">
<English>%3Ear Plugs%4 help prevent hearing damage from repeat loud noises near a soldier. Insert %3Ear Plugs%4 to lower volume of a soldier's environment and prevent %3Combat Deafness%4.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Insert %3Ear Plugs%4.</English>
@ -410,6 +429,7 @@
<Korean>엄폐하십시오</Korean>
<Italian>Mettiti in Copertura</Italian>
<Japanese>遮蔽を造り出す</Japanese>
<Russian>Добраться до укрытия</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_EntrenchingTool_Description">
<English>The %3Entrenching Tool%4 allows soldiers to dig trenches to help defend their position. The soldier must be on soil in order to dig a trench.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip an %3Entrenching Tool%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select the type of trench you wish to build.</English>
@ -424,6 +444,7 @@
<Italian>Torce</Italian>
<Korean>손전등</Korean>
<Japanese>フラッシュライト</Japanese>
<Russian>Фонари</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Flashlights_ShortName">
<English>Illuminate Your Map</English>
@ -431,6 +452,7 @@
<Italian>Illumina la tua Mappa</Italian>
<Korean>지도를 밝혀줍니다</Korean>
<Japanese>地図に光あれ</Japanese>
<Russian>Осветите свою карту</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Flashlights_Description">
<English>%3Flashlights%4 give you the ability to read your map, even in dark environments. However, when using %3Flashlights%4, you will have a slight glow around you.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2On the map screen, use [%3%12%4] and select %3Flashlights%4.&lt;br/&gt;%2Select the %3Flashlight%4 you want to use and select %3On%4.&lt;br/&gt;&lt;br/&gt;%3Available Flashlight Items%4:&lt;br/&gt;%2 Fulton MX-991&lt;br/&gt;%2 KSF-1&lt;br/&gt;%2 Maglite XL50&lt;br/&gt;&lt;br/&gt;%3NOTE:%4&lt;br/&gt;Flashlight states are persistent.</English>
@ -445,6 +467,7 @@
<Italian>Osserva dal Cielo</Italian>
<Korean>하늘에서 관측합니다</Korean>
<Japanese>空から戦場を見てみよう</Japanese>
<Russian>Наблюдайте с Небес</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_HuntIR_Monitor_Description">
<English>The %3High-Altitude Unit Navigated Tactical Imaging Round (HuntIR)%4 is designed to be fired from a grenade launcher. After being fired in the air, the built-in parachute will be deployed and the IR CMOS camera will activate, providing a video stream until it touches the ground or is shot down.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3HuntIR Monitor%4 and compatible ammunition.&lt;br/&gt;%2Fire the %3HuntIR Round%4 as high as possible over the area you want to observe.&lt;br/&gt;%2Open the %3HuntIR Monitor%4.&lt;br/&gt;%2Use [%3%12%4], select %3Equipment%4.&lt;br/&gt;%2Select %3Activate HuntIR Monitor%4.</English>
@ -459,6 +482,7 @@
<Italian>Traccia la tua squadra con discrezione</Italian>
<Korean>은신하여 팀을 찾아냅니다</Korean>
<Japanese>自分の部隊を追う</Japanese>
<Russian>Следите за своей командой незаметно</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_IR_Strobe_Description">
<English>The %3IR Strobe%4 is a throwable that emits an IR light pulse intermittently. The %3IR Strobe%4 can also be attached to a soldier, making it useful for tracking teammates under night vision devices.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3Attach%4 and select the %3IR Strobe%4.</English>
@ -473,6 +497,7 @@
<Italian>Stazione Meteo Tascabile</Italian>
<Korean>휴대용 기상 관측 장비입니다</Korean>
<Japanese>携帯気象予報所</Japanese>
<Russian>Карманная метеостанция</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Kestrel4500_Description">
<English>The %3Kestrel 4500 Pocket Weather Tracker%4 is a mini weather station useful for collecting the the following weather data:&lt;br/&gt;%2Heading and wind direction&lt;br/&gt;%2Crosswind and headwind&lt;br/&gt;%2Altitude and barometric pressure&lt;br/&gt;%2Wet bulb temperature&lt;br/&gt;%2Humidity and dewpoint&lt;br/&gt;%2Density altitude&lt;br/&gt;%2Wind chill and temperature&lt;br/&gt;%2Time and date&lt;br/&gt;%2Minimum, maximum, and average values&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Kestrel%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3Open%4.</English>
@ -487,6 +512,7 @@
<Italian>Triangola la tua posizione</Italian>
<Korean>위치를 삼각측량합니다</Korean>
<Japanese>三角測量で位置を特定</Japanese>
<Russian>Передавайте свое местоположение</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_MapTools_Description">
<English>The %3Map Tools%4 are a set of tools that allows a soldier to measure distances and angles. Useful for land, and calculating firing solutions for artillery.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Open %3Map%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Map Tools%4.&lt;br/&gt;%2 The Tool can be moved by dragging with [%3Left-Click%4] while holding [%3ALT%4].</English>
@ -501,6 +527,7 @@
<Italian>DAGR Avanzato</Italian>
<Korean>고급형 DAGR입니다</Korean>
<Japanese>より高度なDAGR</Japanese>
<Russian>Продвинутый DAGR</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_MicroDAGR_Description">
<English>The %3MicroDAGR GPS%4 is an advanced version of the %3DAGR%4. It provides position, navigation, and timing (PNT) data to include:&lt;br/&gt;%2Compass and heading&lt;br/&gt;%2Date and hour synced to the mission&lt;br/&gt;%2Elevation (relative to sea level)&lt;br/&gt;%2Current speed&lt;br/&gt;%2GPS with topographic and satellite view&lt;br/&gt;%2Creating, naming, and deleting waypoints&lt;br/&gt;%2Friendly identification (Requires ACE BLUFOR Tracker Setting)&lt;br/&gt;Connection to the Vector-21 Rangefinder for data import (waypoint creation and grid reference of ranged targets)&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2For usage instructions, please visit the dedicated %3MicroDAGR%4 wiki.</English>
@ -515,6 +542,7 @@
<Italian>Tavole di Tiro</Italian>
<Korean>사거리표</Korean>
<Japanese>射表</Japanese>
<Russian>Таблицы диапазонов</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_RangeTables_ShortName">
<English>Get A Firing Solution</English>
@ -522,6 +550,7 @@
<Italian>Per una soluzione di tiro</Italian>
<Korean>사격 솔루션을 제공합니다</Korean>
<Japanese>撃ち方の解を得る</Japanese>
<Russian>Получите расчёт</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_RangeTables_Description">
<English>%3Range Tables%4 allow for a soldier to estimate accurate shot placement on direct or indirect targets (depending on asset). The %3Range Table%4 will automatically fill depending on the soldiers selected weapon/vehicle.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select the desired %3Range Table%4.</English>
@ -536,6 +565,7 @@
<Italian>Corde</Italian>
<Korean>로프</Korean>
<Japanese>ロープ</Japanese>
<Russian>Канаты</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Ropes_ShortName">
<English>Tow With Ease</English>
@ -543,6 +573,7 @@
<Italian>Rimorchia con facilità</Italian>
<Korean>쉽게 견인을 할 수 있습니다</Korean>
<Japanese>楽々けん引</Japanese>
<Russian>Буксируйте с легкостью</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Ropes_Description">
<English>%3Ropes%4 have multiple uses including %3Towing%4 vehicles and %3Fast Roping%4 from helicopters.&lt;br/&gt;&lt;br/&gt;%3Towing:%4&lt;br/&gt;%2Approach a vehicle.&lt;br/&gt;%2Use [%3%13%4] and select %3Towing%4.&lt;br/&gt;%2Select rope length.&lt;br/&gt;%2Select attachment point on towing vehicle.&lt;br/&gt;%2Select attachment on towed vehicle.&lt;br/&gt;&lt;br/&gt;%3Available Rope Lengths:%4&lt;br/&gt;%2 3.2 meters&lt;br/&gt;%2 6.2 meters&lt;br/&gt;%2 12.2 meters&lt;br/&gt;%2 15.2 meters&lt;br/&gt;%2 18.3 meters&lt;br/&gt;%2 27.4 meters&lt;br/&gt;%2 36.6 meters</English>
@ -557,6 +588,7 @@
<Italian>Espandi le tue Fortificazioni</Italian>
<Korean>당신의 요새를 확장합니다</Korean>
<Japanese>要塞を拡張する</Japanese>
<Russian>Расширить свои укрепления</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Sandbag_Description">
<English>%3Sandbags%4 are sacks made of sturdy material, filled with sand, used for a variety of purposes such as creating barriers or providing stability in construction projects. Useful in expanding larger placed fortifications.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Sandbag (Empty)%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Deploy Sandbag%4.&lt;br/&gt;%2Follow on-screen instructions for placement.</English>
@ -571,6 +603,7 @@
<Italian>Raffredda l'Arma</Italian>
<Korean>총기의 온도를 낮춥니다</Korean>
<Japanese>銃の熱を冷ます</Japanese>
<Russian>Понизьте температуру оружия</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SpareBarrels_Description">
<English>%3Spare Barrels%4 allow a soldier to reduce their weapon's heat significantly. After a short delay, the weapon's barrel will be swapped and its heat reduced. A soldier may also check the temperature of any barrels within their inventory. Not all weapons support swapping barrels.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3Swap Barrel%4.&lt;br/&gt;%2Resume operation after barrel swap is complete.</English>
@ -585,6 +618,7 @@
<Italian>Bomboletta Spray</Italian>
<Korean>스프레이 페인트</Korean>
<Japanese>ペイントスプレー</Japanese>
<Russian>Аэрозольная краска</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SprayPaint_ShortName">
<English>Tag Your Territory</English>
@ -592,6 +626,7 @@
<Italian>Marca il tuo territorio</Italian>
<Korean>당신의 영역을 지정합니다</Korean>
<Japanese>自分のテリトリーをマーキング</Japanese>
<Russian>Пометьте свою территорию</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SprayPaint_Description">
<English>%3Spray Paint%4 is used to tag surfaces with various symbols.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Move close to a surface (wall, vehicle, ground, etc).&lt;br/&gt;%2Use [%3%12%4] and select %3Tag%4.&lt;br/&gt;%2Choose a symbol.&lt;br/&gt;&lt;br/&gt;%3Available Colors:%4&lt;br/&gt;%2Black&lt;br/&gt;%2Blue&lt;br/&gt;%2Green&lt;br/&gt;%2Red</English>
@ -606,6 +641,7 @@
<Italian>Stabilizzati Ovunque</Italian>
<Korean>어느 곳에나 지지대를 배치할 수 있습니다</Korean>
<Japanese>どこでも支持器</Japanese>
<Russian>Опора может быть установлена в любом месте</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Tripod_Description">
<English>The %3SSWT Kit%4 is a deployable tripod that allows a soldier to brace their aim when deployed. Use it when you need an elevated shooting position and there are no other objects around.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3SSWT Kit%4 and follow the on screen prompts to place.</English>
@ -620,6 +656,7 @@
<Italian>Tieni gli occhi nel cielo</Italian>
<Korean>하늘에서 계속 내려다봅니다</Korean>
<Japanese>空の目を維持する</Japanese>
<Russian>Не Отрывай Глаз От Неба</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_UAVBattery_Description">
<English>%3UAV Batteries%4 are used to recharge a UAV's energy storage. Especially useful for small UAVs.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3UAV Battery%4&lt;br/&gt;%2Approach a %3UAV%4 with its %3Engine Off%4.&lt;br/&gt;%2Use [%3%13%4] and select %3Recharge%4.</English>
@ -634,6 +671,7 @@
<Italian>Fai un'entrata</Italian>
<Korean>진입로를 만듭니다</Korean>
<Japanese>堂々入場する</Japanese>
<Russian>Создание собственного входа</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Wirecutter_Description">
<English>%3Wirecutters%4 are a tool that allows a soldier to bypass wired fencing. Useful for creating backdoor entrances into secure areas.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Move close to a fence.&lt;br/&gt;%2Use [%3%12%4] and select %3Cut Fence%4.</English>
@ -664,6 +702,7 @@
<Italian>ACE3</Italian>
<Korean>ACE3</Korean>
<Japanese>ACE 3</Japanese>
<Russian>ACE3</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_FortifyTool_ShortName">
<English>Build Fortifications</English>
@ -671,6 +710,7 @@
<Italian>Costruisci Fortificazioni</Italian>
<Korean>요새를 건설합니다</Korean>
<Japanese>要塞を構築する</Japanese>
<Russian>Стройте укрепления</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_FortifyTool_Description">
<English>The %3Fortify Tool%4 allows soldiers to build fortifications provided by their mission creator.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Pick up a %3Fortify Tool%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Fortify%4.&lt;br/&gt;%2Select an available fortification and follow the on screen prompts for placement.</English>
@ -685,6 +725,7 @@
<Italian>Effrazione</Italian>
<Korean>침입용 도구입니다</Korean>
<Japanese>破壊して乗り込む</Japanese>
<Russian>Взлом и проникновение</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Lockpick_Description">
<English>%3Lockpicks%4 are used to gain access to locked vehicles.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Lockpick%4.&lt;br/&gt;%2Approach a %3Locked%4 vehicle.&lt;br/&gt;Use [%3%13%4] and select %3Lockpick Vehicle%4.&lt;br/&gt;&lt;br/&gt;&lt;t underline='1'&gt;%3Note:%4&lt;/t&gt; Lockpicks and keys are only available via scripting or ACE Vehicle Key modules.</English>
@ -699,6 +740,7 @@
<Italian>Chiavi dei Veicoli</Italian>
<Korean>차량 열쇠</Korean>
<Japanese>車両キー</Japanese>
<Russian>Взлом и проникновение</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_VehicleKey_ShortName">
<English>Lock/Unlock Vehicles</English>
@ -706,6 +748,7 @@
<Italian>Blocco/Sblocco di Veicoli</Italian>
<Korean>차량을 잠그거나 해제합니다</Korean>
<Japanese>車両のロック/ロック解除</Japanese>
<Russian>Взлом и проникновение</Russian>
</Key>
<Key ID="STR_ACE_FieldManual_Items_VehicleKey_Description">
<English>%3Vehicle Keys%4 are used to lock/unlock your vehicles. Vehicle keys can exist for the whole side, or keys can be created for a particular vehicle itself.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Vehicle Key%4.&lt;br/&gt;%2Approach the vehicle that the key belongs to.&lt;br/&gt;Use [%3%13%4] and select %3Lock/Unlock Vehicle%4.&lt;br/&gt;&lt;br/&gt;&lt;t underline='1'&gt;%3Note:%4&lt;/t&gt; Lockpicks and keys are only available via scripting or ACE Vehicle Key modules.</English>

View File

@ -63,6 +63,7 @@ _affected = _affected - [ACE_player];
if (_flashReactionDebounce < CBA_missionTime) then {
// Not used interally but could be useful for other mods
_unit setVariable [QGVAR(flashStrength), _strength, true];
[QGVAR(flashbangedAI), [_unit, _strength, _grenadePosASL]] call CBA_fnc_localEvent;
{
_unit setSkill [_x, (_unit skill _x) / 50];
} forEach SUBSKILLS;
@ -162,5 +163,7 @@ if (hasInterface && {!isNull ACE_player} && {alive ACE_player}) then {
private _maxFlinch = linearConversion [0.2, 1, _strength, 0, 95, true];
private _flinch = (_minFlinch + random (_maxFlinch - _minFlinch)) * selectRandom [-1, 1];
ACE_player setDir (getDir ACE_player + _flinch);
[QGVAR(flashbangedPlayer), [_strength, _grenadePosASL]] call CBA_fnc_localEvent;
};
true

View File

@ -26,17 +26,41 @@ PREP_RECOMPILE_END;
}, _this] call CBA_fnc_execNextFrame;
}] call CBA_fnc_addClassEventHandler;
[QEGVAR(arsenal,loadoutVerified), {
params ["_loadout", "_extendedInfo", "", "", "_missingExtendedInfo"];
private _gunbagInfo = _extendedInfo getOrDefault [QGVAR(gunbagWeapon), []];
if (_gunbagInfo isEqualTo []) exitWith {};
private _weapon = (_gunbagInfo select 0) call EFUNC(arsenal,baseWeapon);
if !(_weapon in EGVAR(arsenal,virtualItemsFlat)) exitWith {
_missingExtendedInfo pushBack [QGVAR(gunbagWeapon), _weapon];
_extendedInfo deleteAt QGVAR(gunbagWeapon);
};
private _missingItems = [];
private _attachments = _gunbagInfo select 1;
{
if (_x != "" && {!(_x call EFUNC(arsenal,baseWeapon) in EGVAR(arsenal,virtualItemsFlat))}) then {
_missingItems pushBack _x;
_attachments set [_forEachIndex, ""];
};
} forEach _attachments;
private _magazines = _gunbagInfo select 2;
{
private _class = _x param [0, ""];
if !(_class != "" && {_class in EGVAR(arsenal,virtualItemsFlat)}) then {
_missingItems pushBack _class;
_magazines set [_forEachIndex, ["", 0]];
};
} forEach _magazines;
if (_missingItems isNotEqualTo []) then {
_missingExtendedInfo pushBack [QGVAR(gunbagWeapon), _missingItems];
};
}] call CBA_fnc_addEventHandler;
["CBA_loadoutSet", {
params ["_unit", "_loadout", "_extendedInfo"];
private _gunbagWeapon = _extendedInfo getOrDefault [QGVAR(gunbagWeapon), []];
if (_gunbagWeapon isNotEqualTo []) then {
if (!isNil QEGVAR(arsenal,virtualItemsFlatAll)) then {
private _weapon = (_gunbagWeapon select 0) call EFUNC(arsenal,baseWeapon);
if !(_weapon in EGVAR(arsenal,virtualItemsFlatAll)) then {
INFO_1("removing [%1] from loadout",_gunbagWeapon);
_gunbagWeapon = [];
};
};
(backpackContainer _unit) setVariable [QGVAR(gunbagWeapon), _gunbagWeapon, true];
};
}] call CBA_fnc_addEventHandler;

View File

@ -21,10 +21,6 @@ uiNamespace setVariable [QGVAR(backpackKeyCache), compileFinal createHashMapFrom
if (_picture select [0, 1] == "\") then {
_picture = _picture select [1];
};
if (count _picture > 0 && !(_picture regexMatch ".*?\.paa")) then { // handle missing file extension
if (!fileExists (_picture + ".paa")) exitWith {};
_picture = _picture + ".paa";
};
// Handle missing file extension, as inventory returns path with extension
if (count _picture > 0 && !(_picture regexMatch ".*?\.paa")) then {

View File

@ -10,6 +10,7 @@
<French>DBAL-A3 (rouge)</French>
<Portuguese>DBAL-A3 (vermelho)</Portuguese>
<Japanese>DBAL-A3 (赤)</Japanese>
<Russian>DBAL-A3 (красный)</Russian>
</Key>
<Key ID="STR_ACE_IRLight_DBAL_A3_Green">
<English>DBAL-A3 (green)</English>
@ -20,6 +21,7 @@
<French>DBAL-A3 (vert)</French>
<Portuguese>DBAL-A3 (verde)</Portuguese>
<Japanese>DBAL-A3 (緑)</Japanese>
<Russian>DBAL-A3 (зеленый)</Russian>
</Key>
<Key ID="STR_ACE_IRLight_DBAL_A3_DescriptionUse">
<English>&lt;t color='#9cf953'&gt;Use: &lt;/t&gt;Turn Laser ON/OFF&lt;br&gt;Double click to switch mode</English>
@ -30,6 +32,7 @@
<French>&lt;t color='#9cf953'&gt;Utilisation: &lt;/t&gt;Allumer/Eteindre le laser&lt;br&gt;Double clic pour changer de mode</French>
<Portuguese>&lt;t color='#9cf953'&gt;Uso: &lt;/t&gt;Ligar/Desligar Laser&lt;br&gt;Duplo clique para mudar o modo</Portuguese>
<Japanese>&lt;t color='#9cf953'&gt;使用方法: &lt;/t&gt;レーザーのオン/オフ切り替え&lt;br&gt;ダブルクリックでモード切り替え</Japanese>
<Russian>&lt;t color='#9cf953'&gt;Использование: &lt;/t&gt;Включение / выключение лазера &lt;br&gt;Двойной щелчок для переключения режима</Russian>
</Key>
<Key ID="STR_ACE_IRLight_DBAL_A3_DescriptionShort">
<English>Dual Beam Aiming Laser</English>
@ -40,6 +43,7 @@
<French>Viseur laser à double faisceau</French>
<Portuguese>Laser de Pontaria de Duplo Feixe</Portuguese>
<Japanese>複合ビーム照準レーザー</Japanese>
<Russian>Двухлучевой прицельный лазер</Russian>
</Key>
<Key ID="STR_ACE_IRLight_Mode_VisiblePointer">
<English>Visible Laser</English>
@ -50,6 +54,7 @@
<French>Laser visible</French>
<Portuguese>Laser Visível</Portuguese>
<Japanese>可視光レーザー</Japanese>
<Russian>Видимый лазер</Russian>
</Key>
<Key ID="STR_ACE_IRLight_Mode_IRPointer">
<English>IR Laser</English>
@ -60,6 +65,7 @@
<French>Laser IR</French>
<Portuguese>Laser IR</Portuguese>
<Japanese>IRレーザー</Japanese>
<Russian>ИК-лазер</Russian>
</Key>
<Key ID="STR_ACE_IRLight_Mode_IRIlluminator">
<English>IR Illuminator</English>
@ -70,6 +76,7 @@
<French>Illuminateur IR</French>
<Portuguese>Iluminador IR</Portuguese>
<Japanese>IRイルミネーター</Japanese>
<Russian>ИК-осветитель</Russian>
</Key>
<Key ID="STR_ACE_IRLight_Mode_IRDual">
<English>IR Laser and Illuminator</English>
@ -80,6 +87,7 @@
<French>Illuminateur et laser IR</French>
<Portuguese>Laser e Iluminador IR</Portuguese>
<Japanese>IRレーザーとイルミネーター</Japanese>
<Russian>ИК-лазер и осветитель</Russian>
</Key>
<Key ID="STR_ACE_IRLight_Mode_Wide">
<English>Wide Beam</English>
@ -90,6 +98,7 @@
<French>Faisceau large</French>
<Portuguese>Feixe Largo</Portuguese>
<Japanese>広角ビーム</Japanese>
<Russian>Широкий луч</Russian>
</Key>
<Key ID="STR_ACE_IRLight_Mode_Medium">
<English>Medium Beam</English>
@ -100,6 +109,7 @@
<French>Faisceau moyen</French>
<Portuguese>Feixe Médio</Portuguese>
<Japanese>標準ビーム</Japanese>
<Russian>Средний луч</Russian>
</Key>
<Key ID="STR_ACE_IRLight_Mode_Narrow">
<English>Narrow Beam</English>
@ -110,6 +120,7 @@
<French>Faisceau étroit</French>
<Portuguese>Feixe Estreito</Portuguese>
<Japanese>狭角ビーム</Japanese>
<Russian>Узкий луч</Russian>
</Key>
<Key ID="STR_ACE_IRLight_SPIR_DescriptionUse">
<English>&lt;t color='#9cf953'&gt;Use: &lt;/t&gt;Turn Light ON/OFF&lt;br&gt;Double click to switch mode</English>
@ -120,6 +131,7 @@
<French>&lt;t color='#9cf953'&gt;Utilisation: &lt;/t&gt;Allumer/Eteindre la lumière&lt;br&gt;Double clic pour changer de mode</French>
<Portuguese>&lt;t color='#9cf953'&gt;Uso: &lt;/t&gt;Ligar/Desligar Iluminador&lt;br&gt;Duplo clique para mudar o modo</Portuguese>
<Japanese>&lt;t color='#9cf953'&gt;使用方法: &lt;/t&gt;ライトのオン/オフ&lt;br&gt;ダブルクリックでモード切り替え</Japanese>
<Russian>&lt;t color='#9cf953'&gt;Использование: &lt;/t&gt;Включение / выключение освещения &lt;br&gt;Двойной щелчок для переключения режима</Russian>
</Key>
<Key ID="STR_ACE_IRLight_SPIR_DescriptionShort">
<English>Special Purpose IR LED Illuminator</English>
@ -130,6 +142,7 @@
<French>Illuminateur LED IR à usage spécial</French>
<Portuguese>Iluminador LED IR de Uso Especial</Portuguese>
<Japanese>特殊用途のIR LEDイルミネーター</Japanese>
<Russian>ИК-светодиодный осветитель специального назначения</Russian>
</Key>
<Key ID="STR_ACE_IRLight_MomentarySwitch">
<English>Illuminator / Laser Momentary Switch</English>
@ -140,6 +153,7 @@
<French>Commutateur temporaire illuminateur/laser</French>
<Portuguese>Interruptor Momentâneo Iluminador/Laser</Portuguese>
<Japanese>イルミネーター/レーザーモーメンタリースイッチ</Japanese>
<Russian>Мгновенный переключатель осветителя/лазера</Russian>
</Key>
</Package>
</Project>

View File

@ -1,3 +1,9 @@
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
};
};
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));

View File

@ -136,7 +136,9 @@ GVAR(killCount) = 0;
_unitName = format ["*AI* - %1", getText ((configOf _unit) >> "displayName")];
};
};
TRACE_3("send kill event",_killer,_unitName,_killInfo);
[QGVAR(kill), [_unitName, _killInfo], _killer] call CBA_fnc_targetEvent;
if (_unitIsPlayer || GVAR(trackAI)) then {
TRACE_3("send kill event",_killer,_unitName,_killInfo);
[QGVAR(kill), [_unitName, _killInfo], _killer] call CBA_fnc_targetEvent;
};
};
}] call CBA_fnc_addEventHandler;

View File

@ -0,0 +1,7 @@
#include "script_component.hpp"
ADDON = false;
#include "initSettings.inc.sqf"
ADDON = true;

View File

@ -0,0 +1,8 @@
[
QGVAR(trackAI),
"CHECKBOX",
[LSTRING(TrackAI_DisplayName), LSTRING(TrackAI_Description)],
LSTRING(Category),
true,
1
] call CBA_fnc_addSetting;

View File

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="KillTracker">
<Key ID="STR_ACE_KillTracker_Category">
<English>ACE Kill Tracker</English>
<Czech>ACE Kill Tracker</Czech>
<Russian>ACE Отслеживание убийств</Russian>
</Key>
<Key ID="STR_ACE_KillTracker_Title">
<English>ACE Killed Events</English>
<Japanese>ACE キルトラッカー</Japanese>
@ -86,5 +91,15 @@
<Japanese>同士討ち</Japanese>
<Turkish>Dost Atışı</Turkish>
</Key>
<Key ID="STR_ACE_KillTracker_TrackAI_DisplayName">
<English>Track AI units killed by player</English>
<Czech>Sledovat AI zabité hráči</Czech>
<Russian>Отслеживание юнитов ИИ, убитых игроком</Russian>
</Key>
<Key ID="STR_ACE_KillTracker_TrackAI_Description">
<English>Defines if killed AIs will be shown in the kill tracker during mission debriefing.</English>
<Czech>Udává zdali se zabité AI budou ukazovat v kill trackeru v průběhu debriefingu po misi.</Czech>
<Russian>Определяет, убит ИИ, как будет показано в трекере убийств во время разбора миссии.</Russian>
</Key>
</Package>
</Project>

View File

@ -128,6 +128,7 @@
<Korean>레이저 스팟 추적기: 켬</Korean>
<French>Traqueur laser : activé</French>
<Portuguese>Rastreador a Laser: Ligado</Portuguese>
<Russian>Лазерный точечный трекер: Включен</Russian>
</Key>
<Key ID="STR_ACE_Laser_LSTOff">
<English>Laser Spot Tracker: Off</English>
@ -138,6 +139,7 @@
<Korean>레이저 스팟 추적기: 끔</Korean>
<French>Traqueur laser : désactivé</French>
<Portuguese>Rastreador a Laser: Desligado</Portuguese>
<Russian>Лазерный точечный трекер: выключен</Russian>
</Key>
<Key ID="STR_ACE_Laser_showLaserOnMap">
<English>Draw Laser on Map</English>

View File

@ -39,11 +39,13 @@
<English>Plotting Board</English>
<Korean>플로팅 보드</Korean>
<Japanese>標定盤</Japanese>
<Russian>Графическая доска</Russian>
</Key>
<Key ID="STR_ACE_MapTools_PlottingBoard_Description">
<English>The Plotting Board is a map tool designed for use in the directing of short range indirect fires.</English>
<Korean>플로팅 보드는 단거리 간접 사격을 지시하는 데 사용하도록 설계된 독도용 도구입니다.</Korean>
<Japanese>標定盤(プロッティング・ボード)は、短距離の間接射撃の指示に使用するために設計されたマップツールです。</Japanese>
<Russian>Графическая доска - это картографический инструмент, предназначенный для использования при ведении непрямого огня с малой дистанции.</Russian>
</Key>
<Key ID="STR_ACE_MapTools_MapTools_Menu">
<English>Map Tools</English>
@ -266,71 +268,85 @@
<English>Allow Plotting Board Drawing channels</English>
<Japanese>標定盤への書き込みを許可するチャンネル</Japanese>
<Korean>플로팅 보드 그리기 채널 허용</Korean>
<Russian>Разрешить создание каналов для рисования на графической плате</Russian>
</Key>
<Key ID="STR_ACE_MapTools_allowChannelDrawing_description">
<English>Channels in which plotting board drawing is enabled.</English>
<Japanese>どのチャンネルで標定盤の書き込みを有効化するか。</Japanese>
<Korean>플로팅 보드 그리기가 활성화된 채널입니다.</Korean>
<Russian>Каналы, в которых включено рисование на графической плате.</Russian>
</Key>
<Key ID="STR_ACE_MapTools_allowDirectCommsOnly">
<English>Allow Direct Comms Only (Polylines Only)</English>
<Japanese>直接チャンネルのみ許可 (線のみ)</Japanese>
<Korean>직접교신만 허용 (선 긋기만)</Korean>
<Russian>Разрешать только прямую связь (только полилинии)</Russian>
</Key>
<Key ID="STR_ACE_MapTools_allowDirectGroupComms">
<English>Allow Direct/Group Comms (Polylines and Group Markers)</English>
<Japanese>直接/グループチャンネルを許可 (線とグループマーカー)</Japanese>
<Korean>직접교신/그룹무전망 허용 (선 긋기와 그룹 마커)</Korean>
<Russian>Разрешить прямую/групповую связь (полилинии и групповые маркеры)</Russian>
</Key>
<Key ID="STR_ACE_MapTools_PlottingBoardLabel">
<English>Plotting Board</English>
<Japanese>標定盤</Japanese>
<Korean>플로팅 보드</Korean>
<Russian>Графическая доска</Russian>
</Key>
<Key ID="STR_ACE_MapTools_PlottingBoardAcrylicLabel">
<English>Plotting Board Acrylic</English>
<Japanese>標定盤の アクリル板</Japanese>
<Korean>플로팅 보드 (아크릴)</Korean>
<Russian>Графическая доска акрилловая</Russian>
</Key>
<Key ID="STR_ACE_MapTools_PlottingBoardRulerLabel">
<English>Plotting Board Ruler</English>
<Japanese>標定盤の 定規</Japanese>
<Korean>플로팅 보드 (자)</Korean>
<Russian>Линейка для черчения на доске</Russian>
</Key>
<Key ID="STR_ACE_MapTools_ToPlottingBoardLabel">
<English>To Plotting Board</English>
<Japanese>標定盤に</Japanese>
<Korean>플로팅 보드에</Korean>
<Russian>К чертежной доске</Russian>
</Key>
<Key ID="STR_ACE_MapTools_ToPlottingBoardAcrylicLabel">
<English>To Plotting Board Acrylic</English>
<Japanese>標定盤の アクリル板に</Japanese>
<Korean>플로팅 보드 (아크릴)에</Korean>
<Russian>К чертежной доске акрилловой</Russian>
</Key>
<Key ID="STR_ACE_MapTools_ToPlottingBoardRulerLabel">
<English>To Plotting Board Ruler</English>
<Japanese>標定盤の 定規に</Japanese>
<Korean>플로팅 보드 (자)에</Korean>
<Russian>К линейке для построения чертежной доски</Russian>
</Key>
<Key ID="STR_ACE_MapTools_WipeBoard">
<English>Wipe all markers off Plotting Board</English>
<Japanese>標定盤の 全マーカーを 拭き消す</Japanese>
<Korean>플로팅 보드에 있는 모든 마커 지우기</Korean>
<Russian>Сотрите все маркеры с доски для черчения</Russian>
</Key>
<Key ID="STR_ACE_MapTools_ShowPlottingBoard">
<English>Show Plotting Board</English>
<Japanese>標定盤を 表示</Japanese>
<Korean>플로팅 보드 보이기</Korean>
<Russian>Скрыть графическую доску</Russian>
</Key>
<Key ID="STR_ACE_MapTools_HidePlottingBoard">
<English>Hide Plotting Board</English>
<Japanese>標定盤を 隠す</Japanese>
<Korean>플로팅 보드 숨기기</Korean>
<Russian>Переключение линейки для построения графической доски</Russian>
</Key>
<Key ID="STR_ACE_MapTools_TogglePlottingBoardRuler">
<English>Toggle Plotting Board Ruler</English>
<Japanese>標定盤の 定規を 表示切替</Japanese>
<Korean>플로팅 보드 (자) 토글</Korean>
<Russian>Переключение линейки для построения графической доски</Russian>
</Key>
<Key ID="STR_ACE_MapTools_AlignTo">
<English>Align</English>
@ -378,11 +394,13 @@
<English>Up</English>
<Japanese>上に</Japanese>
<Korean>위로</Korean>
<Russian>Вверх</Russian>
</Key>
<Key ID="STR_ACE_MapTools_ToMapToolLabel">
<English>To Maptool</English>
<Japanese>マップツールに</Japanese>
<Korean>독도용 도구로</Korean>
<Russian>К инструментам карты</Russian>
</Key>
</Package>
</Project>

View File

@ -410,6 +410,7 @@
<Portuguese>"MS" - Milissegundos (de 0 a 59)</Portuguese>
<Korean>"MS" - 밀리초 (0부터 59까지)</Korean>
<Japanese>"MM" - ミリ秒 (0から59)</Japanese>
<Russian>"ММ" - миллисекунды (от 0 до 59)</Russian>
</Key>
<Key ID="STR_ACE_Markers_TimestampFormatDescription5">
<English>"mmm" - Milliseconds (from 0 to 999)</English>
@ -418,6 +419,7 @@
<Portuguese>"mmm" - Milissegundos (de 0 a 999)</Portuguese>
<Korean>"mmm" - 밀리초 (0부터 999까지)</Korean>
<Japanese>"mmm" - ミリ秒 (0から599)</Japanese>
<Russian>"ммм" - миллисекунды (от 0 до 999)</Russian>
</Key>
<Key ID="STR_ACE_Markers_TimestampHourFormat">
<English>Timestamp Hour Format</English>

View File

@ -57,6 +57,7 @@
<French>Items requis</French>
<Portuguese>Exigir Itens</Portuguese>
<Japanese>アイテムを要求</Japanese>
<Russian>Требуемые предметы</Russian>
</Key>
<Key ID="STR_ACE_Medical_AI_requireItems_desc">
<English>AI will only perform medical treatment if they have the necessary items in their inventory.</English>
@ -67,6 +68,7 @@
<French>Les IA n'effectueront un traitement médical que si elles ont le matériel nécessaire dans leur inventaire.</French>
<Portuguese>A IA só irá realizar tratamento médico se tiver os itens necessários em seu inventário.</Portuguese>
<Japanese>AIのインベントリに必要なアイテムがある場合にのみ治療を実行します。</Japanese>
<Russian>Искусственный интеллект будет оказывать медицинскую помощь только в том случае, если в его инвентаре есть необходимые предметы.</Russian>
</Key>
<Key ID="STR_ACE_Medical_AI_requireItems_autoReplaceItems">
<English>Auto Convert Items for AI</English>
@ -77,6 +79,7 @@
<Italian>Conversione automatica di risorse mediche per IA</Italian>
<Portuguese>Conversão automática de itens para IA</Portuguese>
<Japanese>AIのアイテムを自動変換</Japanese>
<Russian>Автоматическое преобразование элементов для ИИ</Russian>
</Key>
</Package>
</Project>

View File

@ -53,7 +53,8 @@
#define BLOOD_VOLUME_CLASS_2_HEMORRHAGE 5.100 // lost more than 15% blood, Class II Hemorrhage
#define BLOOD_VOLUME_CLASS_3_HEMORRHAGE 4.200 // lost more than 30% blood, Class III Hemorrhage
#define BLOOD_VOLUME_CLASS_4_HEMORRHAGE 3.600 // lost more than 40% blood, Class IV Hemorrhage
#define BLOOD_VOLUME_FATAL 3.0 // Lost more than 50% blood, Unrecoverable
// Lost more than 50% blood, Unrecoverable
#define BLOOD_VOLUME_FATAL 3.0
// Minimum blood volume, in liters, for a patient to have the chance to wake up
#define MINIMUM_BLOOD_FOR_STABLE_VITALS EGVAR(medical,const_stableVitalsBloodThreshold)

View File

@ -36,6 +36,7 @@
<Italian>Fattore di Trapasso Armatura</Italian>
<Portuguese>Efeito de Penetração de Blindagem</Portuguese>
<Japanese>装甲貫通効果</Japanese>
<Russian>Эффект сквозного прохождения брони</Russian>
</Key>
<Key ID="STR_ACE_Medical_Engine_damagePassThroughEffect_description">
<English>Controls effect of armor 'passThrough' on final damage. Makes high armor values, like ones used in GL rigs, less effective.\nUse 0% for pre 3.16.0 armor behavior.\nOnly touch this if you know what you're doing!</English>
@ -46,6 +47,7 @@
<Italian>Determina l'effetto di danni sul corpo che 'trapassano' l'armatura. Rende alti valori di protezione, come quelli su corpetti GL, meno efficaci.\nUtilizza 0% per il comportamento prima di v3.16.0.\nModifica questo valore solo se sai cosa stai facendo!</Italian>
<Portuguese>Controla o efeito de penetração (passThrough) da blindagem no dano final. Torna valores de blindagem altos, como os usados em coletes GL, menos eficazes.\nUse 0% para o comportamento de blindagem anterior à versão 3.16.0.\nSó mexa nisso se souber o que está fazendo!</Portuguese>
<Japanese>ボディアーマーの'passThrough'値が最終的な身体ダメージに与える影響を調整します。擲弾兵リグで使用されるような高い装甲値では効果が低くなります。\n3.16.0以前の挙動にするには0%にしてください。\nこれが何かわからない場合は変更しないことをお勧めします。</Japanese>
<Russian>Контролирует эффект "прохождения" брони при нанесении конечного урона. Делает высокие значения брони, подобные тем, которые используются в GL rigs, менее эффективными.n\используйте 0% для поведения брони до версии 3.16.0.n\прикасайтесь к этому, только если знаете, что делаете!</Russian>
</Key>
</Package>
</Project>

View File

@ -292,6 +292,7 @@
<Italian>Sbircia Info Mediche</Italian>
<German>Medizinische Info anzeigen</German>
<Japanese>医療情報一時表示</Japanese>
<Russian>Просмотрите медицинскую информацию</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalInfoReleaseDelay_DisplayName">
<English>Medical Peek Duration</English>
@ -301,6 +302,7 @@
<Italian>Durata di sbirciamento di info mediche</Italian>
<German>Dauer zum Anzeigen der medizinischen Info</German>
<Japanese>医療情報一時表示の表示時間</Japanese>
<Russian>Продолжительность медицинского осмотра</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalInfoReleaseDelay_Description">
<English>How long the medical info peek remains open after releasing the key.</English>
@ -310,6 +312,7 @@
<German>Wie lange die medizinische Info-Anzeige nach dem Loslassen der Taste geöffnet bleibt.</German>
<Italian>Durata di visualizzazione delle Info Mediche dopo aver rilasciato il tasto.</Italian>
<Japanese>医療情報一時表示キーを放してからどれだけ長く情報表示するか。</Japanese>
<Russian>Как долго окно просмотра медицинской информации остается открытым после отпускания клавиши.</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_LoadPatient">
<English>Load Patient</English>
@ -562,6 +565,7 @@
<German>Wechseln zu selbst</German>
<Italian>Passa a te stesso</Italian>
<Japanese>自分に切り替え</Japanese>
<Russian>Переключиться на себя </Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_ToggleToOther">
<English>Switch to target</English>
@ -571,6 +575,7 @@
<German>Wechseln zu Ziel</German>
<Italian>Passa al paziente</Italian>
<Japanese>相手に切り替え</Japanese>
<Russian>Переключиться на цель</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_Head">
<English>Head</English>
@ -996,6 +1001,7 @@
<German>Keine Blutung</German>
<Italian>Nessuna emorragia</Italian>
<Japanese>出血はしていない</Japanese>
<Russian>Кровотечения нет</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate1">
<English>Slow bleeding</English>
@ -1005,6 +1011,7 @@
<German>Langsame Blutung</German>
<Italian>Debole emorragia</Italian>
<Japanese>出血は穏やか</Japanese>
<Russian>Медленное кровотечение</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate2">
<English>Moderate bleeding</English>
@ -1014,6 +1021,7 @@
<German>Mäßige Blutung</German>
<Italian>Emorraggia moderata</Italian>
<Japanese>出血はそこそこ速い</Japanese>
<Russian>Умеренное кровотечение</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate3">
<English>Severe bleeding</English>
@ -1023,6 +1031,7 @@
<German>Schwere Blutung</German>
<Italian>Forte emorragia</Italian>
<Japanese>出血は激しい</Japanese>
<Russian>Сильное кровотечение</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate4">
<English>Massive bleeding</English>
@ -1032,6 +1041,7 @@
<German>Massive Blutung</German>
<Italian>Gravissima emorragia</Italian>
<Japanese>出血は酷く多い</Japanese>
<Russian>Сильное кровотечение</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_STATUS_PAIN">
<English>in Pain</English>
@ -1105,6 +1115,7 @@
<German>Kein Blutverlust</German>
<Italian>Nessuna perdita di sangue</Italian>
<Japanese>失血なし</Japanese>
<Russian>Потери крови нет</Russian>
</Key>
<!--Strings above match Blood2 but seem to differ in some languages, determine which is best to use-->
<Key ID="STR_ACE_Medical_GUI_Lost_Blood1">
@ -1355,6 +1366,7 @@
<Italian>Mostra info mediche se colpito</Italian>
<German>Zeige medizinische Info beim Treffer an</German>
<Japanese>被弾時の医療情報一時表示</Japanese>
<Russian>Просмотрите медицинскую информацию о попадании</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalOnHit_Description">
<English>Temporarily show medical info when injured.</English>
@ -1365,6 +1377,7 @@
<Italian>Mostra temporaneamente le info mediche quando si viene feriti.</Italian>
<German>Bei Verletzungen vorübergehend medizinische Info anzeigen.</German>
<Japanese>被弾時に医療情報を一時的に表示します。</Japanese>
<Russian>Временно показывать медицинскую информацию при травме.</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalOnHitDuration_DisplayName">
<English>Medical Peek Duration on Hit</English>
@ -1375,6 +1388,7 @@
<Italian>Durata di info mediche quando colpito</Italian>
<German>Dauer der Anzeige bei einem Treffer.</German>
<Japanese>被弾時の医療情報一時表示の表示時間</Japanese>
<Russian>Продолжительность медицинского осмотра при попадании</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalOnHitDuration_Description">
<English>How long the medical info peek remains open after being injured.</English>
@ -1385,6 +1399,7 @@
<Italian>Quanto tempo verranno visualizzate le info mediche quando si viene feriti.</Italian>
<German>Wie lange die medizinische Info nach einer Verletzung angezeigt wird.</German>
<Japanese>被弾時の医療情報の一時表示をどれだけ長く表示するか。</Japanese>
<Russian>Как долго окно просмотра медицинской информации остается открытым после получения травмы.</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_showDamageEntry_DisplayName">
<English>Show Trauma Sustained</English>
@ -1396,6 +1411,7 @@
<Korean>외상 지속 표시</Korean>
<Chinesesimp>显示遭受的创伤</Chinesesimp>
<French>Afficher les traumatismes subis</French>
<Russian>Показать полученную травму</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_showDamageEntry_Description">
<English>Show trauma sustained in the injury list.</English>
@ -1407,6 +1423,7 @@
<Korean>부상 목록에 발생한 외상을 표시합니다.</Korean>
<Chinesesimp>在伤情表上显示创伤</Chinesesimp>
<French>Afficher les traumatismes subis dans la liste des blessures.</French>
<Russian>Показать полученную травму в списке травм.</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_bodyPartOutlineColor_DisplayName">
<English>Body Part Outline Color</English>
@ -1417,6 +1434,7 @@
<Italian>Colore del contorno di parti del corpo</Italian>
<German>Umrissfarbe des Körperteils</German>
<Japanese>身体部位の輪郭表示の色</Japanese>
<Russian>Цвет контура части тела</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_bodyPartOutlineColor_Description">
<English>Color of outline around selected body part.</English>
@ -1427,6 +1445,7 @@
<Italian>Colore del contorno della parte del corpo selezionata.</Italian>
<German>Farbe des Umrisses um das ausgewählten Körperteil.</German>
<Japanese>選択した身体部位の輪郭表示の色。</Japanese>
<Russian>Цвет контура вокруг выбранной части тела.</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained1">
<English>Minor Trauma</English>
@ -1438,6 +1457,7 @@
<Korean>약한 외상</Korean>
<Chinesesimp>轻微创伤</Chinesesimp>
<French>Traumatisme mineur</French>
<Russian>Незначительная травма</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained2">
<English>Major Trauma</English>
@ -1449,6 +1469,7 @@
<Korean>중간 외상</Korean>
<Chinesesimp>中度创伤</Chinesesimp>
<French>Traumatisme majeur</French>
<Russian>Серьезная травма</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained3">
<English>Severe Trauma</English>
@ -1460,6 +1481,7 @@
<Korean>강한 외상</Korean>
<Chinesesimp>重度创伤</Chinesesimp>
<French>Traumatisme grave</French>
<Russian>Тяжелая травма</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained4">
<English>Chronic Trauma</English>
@ -1471,6 +1493,7 @@
<Korean>심각한 외상</Korean>
<Chinesesimp>慢性创伤</Chinesesimp>
<French>Traumatisme chronique</French>
<Russian>Хроническая травма</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_BodyLabelLeft">
<English>L</English>
@ -1481,6 +1504,7 @@
<Italian>Sx</Italian>
<German>L</German>
<Japanese></Japanese>
<Russian>Лево</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_BodyLabelRight">
<English>R</English>
@ -1491,6 +1515,7 @@
<Italian>Dx</Italian>
<German>R</German>
<Japanese></Japanese>
<Russian>Право</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_TreatmentItemCount_Medic">
<English>in your inventory</English>
@ -1501,6 +1526,7 @@
<Italian>Nel proprio inventario</Italian>
<German>im Inventar</German>
<Japanese>個あなたが保有</Japanese>
<Russian>в вашем инвентаре</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_TreatmentItemCount_Patient">
<English>in patient's inventory</English>
@ -1511,6 +1537,7 @@
<Italian>Nell'inventario del paziente</Italian>
<German>im Inventar des Patienten</German>
<Japanese>個患者が保有</Japanese>
<Russian>в инвентаре пациента</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_TreatmentItemCount_Vehicle">
<English>in vehicle's inventory</English>
@ -1521,6 +1548,7 @@
<German>im Inventar des Fahrzeuges</German>
<Italian>Nell'inventario del veicolo</Italian>
<Japanese>個車両内に保有</Japanese>
<Russian>в инвентаре транспорта</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_TourniquetWarning">
<English>No effect until tourniquet removed</English>
@ -1530,6 +1558,7 @@
<German>Keine Wirkung, bis das Tourniquet entfernt wurde</German>
<Italian>Nessun effetto fino alla rimozione del laccio emostatico</Italian>
<Japanese>止血帯を外すまで効果を発揮しません</Japanese>
<Russian>Никакого эффекта до тех пор, пока жгут не будет снят</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_TourniquetWarning_DisplayName">
<English>Show Tourniquet Warning</English>
@ -1539,6 +1568,7 @@
<German>Tourniquet-Warnung anzeigen</German>
<Italian>Mostra avviso di laccio emostatico</Italian>
<Japanese>止血帯の警告を表示</Japanese>
<Russian>Показать предупреждение о наложении жгута</Russian>
</Key>
<Key ID="STR_ACE_Medical_GUI_TourniquetWarning_Description">
<English>Show a warning tooltip when a tourniquet will interfere with a medical action.</English>
@ -1548,6 +1578,7 @@
<German>Zeigt einen Hinweis an, wenn ein Tourniquet eine medizinische Maßnahme beeinträchtigt.</German>
<Italian>Mostra un avviso se un laccio emostatico impedisce un trattamento medico.</Italian>
<Japanese>止血帯が医療行為を妨げる場合には、警告ツールチップを表示します。</Japanese>
<Russian>Показать всплывающую подсказку с предупреждением, когда жгут помешает медицинскому вмешательству.</Russian>
</Key>
</Package>
</Project>

View File

@ -125,6 +125,7 @@
<Korean>무기 떨어뜨릴 확률</Korean>
<French>Risque de perte d'arme</French>
<Japanese>武器を落とす確率</Japanese>
<Russian>Шанс выпадения оружия</Russian>
</Key>
<Key ID="STR_ACE_Medical_Status_DropWeaponUnconsciousChance_Description">
<English>Chance for a player to drop their weapon when going unconscious.\nHas no effect on AI.</English>
@ -134,6 +135,7 @@
<Korean>플레이어가 기절할 때 무기를 떨어뜨릴 확률입니다.\nAI는 영향을 받지 않습니다.</Korean>
<French>Pourcentage de chances pour un joueur de lâcher son arme lorsqu'il perd connaissance.\nAucun effet sur les IA.</French>
<Japanese>プレーヤーが意識を失ったときに武器を落とす可能性。\nAI には影響しません。</Japanese>
<Russian>Шанс для игрока выронить свое оружие, когда он теряет сознание.n\Не влияет на ИИ</Russian>
</Key>
</Package>
</Project>

View File

@ -565,8 +565,11 @@ class ADDON {
timeInSystem = 120;
// How long until the maximum effect is reached
timeTillMaxEffect = 30;
// How many of this type of medication can be in the system before the patient overdoses?
// How many of this type of medication can be in the system before the patient can possibly overdose?
maxDose = 4;
// The number of doses over maxDose where there is a chance to overdose.
// Example with maxDose = 4 and maxDoseDeviation = 2: Dose 4: Safe | Dose 5 and 6: Possible overdose | Dose 7: Guaranteed overdose
maxDoseDeviation = 2;
// Function to execute upon overdose. Arguments passed to call back are 0: unit <OBJECT>, 1: medicationClassName <STRING>
onOverDose = "";
// The viscosity of a fluid is a measure of its resistance to gradual deformation by shear stress or tensile stress. For liquids, it corresponds to the informal concept of "thickness". This value will increase/decrease the viscoty of the blood with the percentage given. Where 100 = max. Using the minus will decrease viscosity
@ -591,7 +594,7 @@ class ADDON {
hrIncreaseHigh[] = {10, 40};
timeInSystem = 120;
timeTillMaxEffect = 10;
maxDose = 10;
maxDose = 9;
incompatibleMedication[] = {};
};
class Adenosine {
@ -601,7 +604,7 @@ class ADDON {
hrIncreaseHigh[] = {-15, -35};
timeInSystem = 120;
timeTillMaxEffect = 15;
maxDose = 6;
maxDose = 5;
incompatibleMedication[] = {};
};
class PainKillers {
@ -611,7 +614,7 @@ class ADDON {
hrIncreaseHigh[] = {-5, -17};
timeInSystem = 420;
timeTillMaxEffect = 60;
maxDose = 6;
maxDose = 5;
incompatibleMedication[] = {};
viscosityChange = 5;
};

View File

@ -59,6 +59,7 @@ private _painReduce = GET_NUMBER(_medicationConfig >> "painReduce",g
private _timeInSystem = GET_NUMBER(_medicationConfig >> "timeInSystem",getNumber (_defaultConfig >> "timeInSystem"));
private _timeTillMaxEffect = GET_NUMBER(_medicationConfig >> "timeTillMaxEffect",getNumber (_defaultConfig >> "timeTillMaxEffect"));
private _maxDose = GET_NUMBER(_medicationConfig >> "maxDose",getNumber (_defaultConfig >> "maxDose"));
private _maxDoseDeviation = GET_NUMBER(_medicationConfig >> "maxDoseDeviation",getNumber (_defaultConfig >> "maxDoseDeviation"));
private _viscosityChange = GET_NUMBER(_medicationConfig >> "viscosityChange",getNumber (_defaultConfig >> "viscosityChange"));
private _hrIncreaseLow = GET_ARRAY(_medicationConfig >> "hrIncreaseLow",getArray (_defaultConfig >> "hrIncreaseLow"));
private _hrIncreaseNormal = GET_ARRAY(_medicationConfig >> "hrIncreaseNormal",getArray (_defaultConfig >> "hrIncreaseNormal"));
@ -75,4 +76,4 @@ TRACE_3("adjustments",_heartRateChange,_painReduce,_viscosityChange);
[_patient, _className, _timeTillMaxEffect, _timeInSystem, _heartRateChange, _painReduce, _viscosityChange] call EFUNC(medical_status,addMedicationAdjustment);
// Check for medication compatiblity
[_patient, _className, _maxDose, _incompatibleMedication] call FUNC(onMedicationUsage);
[_patient, _className, _maxDose, _maxDoseDeviation, _incompatibleMedication] call FUNC(onMedicationUsage);

View File

@ -6,27 +6,33 @@
* Arguments:
* 0: The patient <OBJECT>
* 1: Medication Treatment classname <STRING>
* 2: Max dosage (0 to ignore) <NUMBER>
* 2: Max dose (0 to ignore) <NUMBER>
* 3: Max dose deviation <NUMBER>
* 3: Incompatable medication <ARRAY<STRING>>
*
* Return Value:
* None
*
* Example:
* [player, "morphine", 4, [["x", 1]]] call ace_medical_treatment_fnc_onMedicationUsage
* [player, "morphine", 4, 2, [["x", 1]]] call ace_medical_treatment_fnc_onMedicationUsage
*
* Public: No
*/
params ["_target", "_className", "_maxDosage", "_incompatibleMedication"];
TRACE_4("onMedicationUsage",_target,_className,_maxDosage,_incompatibleMedication);
params ["_target", "_className", "_maxDose", "_maxDoseDeviation", "_incompatibleMedication"];
TRACE_5("onMedicationUsage",_target,_className,_maxDose,_maxDoseDeviation,_incompatibleMedication);
private _overdosedMedications = [];
// Check for overdose from current medication
if (_maxDosage > 0) then {
if (_maxDose > 0) then {
private _currentDose = [_target, _className] call EFUNC(medical_status,getMedicationCount);
if (_currentDose >= floor (_maxDosage + round(random(2)))) then {
// Because both {floor random 0} and {floor random 1} return 0
if (_maxDoseDeviation > 0) then {
_maxDoseDeviation = _maxDoseDeviation + 1;
};
if (_currentDose > _maxDose + (floor random _maxDoseDeviation)) then {
TRACE_1("exceeded max dose",_currentDose);
_overdosedMedications pushBackUnique _className;
};

View File

@ -438,6 +438,7 @@
<German>Zeit zum Graben von Gräbern</German>
<Italian>Tempo di scavo tomba</Italian>
<Japanese>墓掘りの所要時間</Japanese>
<Russian>Время рытья могилы</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_TreatmentTimeGrave_Description">
<English>Time, in seconds, required to dig a grave for a body.</English>
@ -447,6 +448,7 @@
<German>Zeit (in Sekunden), die benötigt wird, um ein Grab für einen Leichnam auszuheben.</German>
<Italian>Tempo in secondi richiesto per seppellire un morto.</Italian>
<Japanese>遺体の墓を掘るのに掛かる時間 (秒) を決定します。</Japanese>
<Russian>Время в секундах, необходимое для того, чтобы выкопать могилу для тела.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_MedicEpinephrine_DisplayName">
<English>Allow Epinephrine</English>
@ -760,6 +762,7 @@
<Polish>Co powinno zostać zużyte po zastosowaniu.</Polish>
<Korean>봉합키트를 1회성 소모품으로 설정할 지 여부를 결정합니다.</Korean>
<French>Ce qui doit être consommé après l'utilisation.</French>
<Russian>Решите, следует ли использовать набор для наложения швов в качестве одноразового расходного материала.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_AllowSelfStitch_DisplayName">
<English>Self Stitching</English>
@ -878,6 +881,7 @@
<Spanish>Permitir cavar tumbas</Spanish>
<French>Autoriser le creusement de tombes</French>
<Japanese>墓掘りを許可</Japanese>
<Russian>Разрешить рытье могил</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_AllowGraveDigging_Description">
<English>Enables digging graves to dispose of corpses.</English>
@ -888,6 +892,7 @@
<Spanish>Habilita cavar tumbas para deshacerse de los cadáveres.</Spanish>
<French>Active la possibilité de creuser des tombes pour enterrer les cadavres.</French>
<Japanese>墓を掘って死体を処理できるようになります。</Japanese>
<Russian>Позволяет рыть могилы для захоронения трупов.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_AllowGraveDigging_graveOnlyDead">
<English>Only if dead</English>
@ -898,6 +903,7 @@
<Spanish>Solo si está muerto</Spanish>
<French>Uniquement s'il est mort</French>
<Japanese>死体のみ</Japanese>
<Russian>Только если мертв</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_GraveDiggingMarker_DisplayName">
<English>Create Grave Markers</English>
@ -908,6 +914,7 @@
<Korean>무덤 마커 생성</Korean>
<French>Créer des pierres tombales</French>
<Japanese>墓標を作成</Japanese>
<Russian>Создайте надгробные знаки</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_GraveDiggingMarker_Description">
<English>Enables the creation of grave markers when digging graves.</English>
@ -918,6 +925,7 @@
<Korean>무덤을 파낼 때 무덤 마커를 표시할 수 있습니다.</Korean>
<French>Active la création de pierres tombales lors de l'enterrement de cadavres.</French>
<Japanese>墓を掘った際、墓標を作成できるようにします。</Japanese>
<Russian>Позволяет создавать надгробные знаки при рытье могил.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_MedicIV_DisplayName">
<English>Allow IV Transfusion</English>
@ -2435,6 +2443,7 @@
<Polish>Szew</Polish>
<Korean>봉합술</Korean>
<French>Suture</French>
<Russian>Нить</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_Suture_Desc_Short">
<English>Surgical Suture for stitching injuries.</English>
@ -2445,6 +2454,7 @@
<Polish>Szew chirurgiczny do zszywania ran.</Polish>
<Korean>상처를 꿰메는 수술용 봉합술.</Korean>
<French>Suture chirurgicale pour suturer les blessures.</French>
<Russian>Хирургическая нить для зашивания травм.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_Suture_Desc_Use">
<English>Surgical Suture for stitching injuries.</English>
@ -2455,6 +2465,7 @@
<Polish>Szew chirurgiczny do zszywania ran.</Polish>
<Korean>상처를 꿰메는 수술용 봉합술.</Korean>
<French>Suture chirurgicale pour suturer les blessures.</French>
<Russian>Хирургическая нить для зашивания травм.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_Bodybag_Display">
<English>Bodybag</English>
@ -3494,6 +3505,7 @@
<Italian>Nessun dolore</Italian>
<German>Kein Schmerz</German>
<Japanese>痛みはない</Japanese>
<Russian>Нет боли</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_Status_MildPain">
<English>In mild pain</English>
@ -3582,6 +3594,7 @@
<Italian>Nessuna Flebo EV</Italian>
<German>Kein IV</German>
<Japanese>IV なし</Japanese>
<Russian>Нет капельницы</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_Check_Bloodpressure">
<English>Blood Pressure</English>
@ -4558,6 +4571,7 @@
<Turkish>Vücudu siyah ceset torbasına yerleştir</Turkish>
<Japanese>遺体袋 (黒) に入れる</Japanese>
<Korean>시체를 검은 시체가방에 놓기</Korean>
<Russian>Положите тело в черный мешок для тела</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_PlaceInBodyBagBlue">
<English>Place body in blue bodybag</English>
@ -4570,6 +4584,7 @@
<Turkish>Vücudu mavi ceset torbasına yerleştir</Turkish>
<Japanese>遺体袋 (青) に入れる</Japanese>
<Korean>시체를 파란 시체가방에 놓기</Korean>
<Russian>Положите тело в синий мешок для тела</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_PlaceInBodyBagWhite">
<English>Place body in white bodybag</English>
@ -4582,6 +4597,7 @@
<Turkish>Vücudu beyaz ceset torbasına yerleştir</Turkish>
<Japanese>遺体袋 (白) に入れる</Japanese>
<Korean>시체를 흰 시체가방에 놓기</Korean>
<Russian>Положите тело в белый мешок для тела</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_PlacingInBodyBag">
<English>Placing body in bodybag...</English>
@ -4608,6 +4624,7 @@
<German>Grabe ein Grab für den Leichnam</German>
<Italian>Scava tomba per cadavere</Italian>
<Japanese>墓を掘る</Japanese>
<Russian>Выкопать могилу для тела</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_DiggingGrave">
<English>Digging grave for body...</English>
@ -4617,6 +4634,7 @@
<German>Grab für Leichnam ausheben ...</German>
<Italian>Scavando tomba per cadavere...</Italian>
<Japanese>墓を掘っています</Japanese>
<Russian>Рою могилу для тела...</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_Activity_bandagedPatient">
<English>%1 has bandaged patient</English>
@ -4868,6 +4886,7 @@
<German>Überprüfe Name auf dem Grabstein</German>
<Italian>Controlla nome sulla lapide</Italian>
<Japanese>墓石の名前を確認</Japanese>
<Russian>Проверьте имя на надгробии</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_bandageRollover_DisplayName">
<English>Bandage Rollover</English>
@ -4877,6 +4896,7 @@
<French>Pansement de plaies multiples</French>
<Italian>Srotolamento Bendaggi</Italian>
<Japanese>包帯の繰り越し</Japanese>
<Russian>Переворачивание бинта</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_bandageRollover_Description">
<English>If enabled, bandages can close different types of wounds on the same body part.\nBandaging multiple injuries will scale bandaging time accordingly.</English>
@ -4886,6 +4906,7 @@
<French>Si activé, les bandages peuvent fermer plusieurs types de blessures sur la même partie du corps.\nPanser de multiples blessures modifiera la durée d'application en conséquence.</French>
<Italian>Se attivo, un singolo bendaggio potrà chiudere più ferite sulla stessa parte del corpo.\nBendare più ferite di conseguenza richiederà più tempo.</Italian>
<Japanese>有効にすると、体の同じ部分にある別の種類の傷を一つの包帯で閉じることができます。\n複数の傷に包帯を巻くと、それに応じて包帯時間が変動します。</Japanese>
<Russian>Если эта функция включена, бинты могут закрывать различные типы ран на одной и той же части тела.n\При перевязке нескольких повреждений время перевязки будет увеличено соответствующим образом.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_bandageEffectiveness_DisplayName">
<English>Bandage Effectiveness Coefficient</English>
@ -4895,6 +4916,7 @@
<French>Coefficient d'efficacité des bandages</French>
<Italian>Coefficiente di efficacia bendaggi</Italian>
<Japanese>包帯有効性係数</Japanese>
<Russian>Коэффициент эффективности повязки</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_bandageEffectiveness_Description">
<English>Determines how effective bandages are at closing wounds.</English>
@ -4904,6 +4926,7 @@
<French>Défini l'efficacité des bandages à refermer des plaies.</French>
<Italian>Determina quanto i bendaggi sono efficaci nel chiudere le ferite.</Italian>
<Japanese>包帯が傷をふさぐのにどれだけ効果的かを決定します。</Japanese>
<Russian>Определяет, насколько эффективны бинты при закрытии ран.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_medicalTab">
<English>Medical Items</English>
@ -4925,6 +4948,7 @@
<German>Zeit-Koeffizient für Zeus Behandlungen</German>
<Japanese>Zeus治療時間係数</Japanese>
<Korean>제우스 치료 시간 계수</Korean>
<Russian>Коэффициент времени обработки Zeus</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_TreatmentTimeCoeffZeus_Description">
<English>Multiply all treatment times with this coefficient when in Zeus.</English>
@ -4932,6 +4956,7 @@
<German>Dauer von Behandlungen als Zeus wird mit diesem Koeffizienten multipliziert.</German>
<Japanese>Zeus操作中は、すべての治療時間にこの係数を掛けます。</Japanese>
<Korean>제우스일 때 모든 치료 시간에 이 계수를 곱합니다.</Korean>
<Russian>Умножьте все время лечения на этот коэффициент, когда вы находитесь в Zeus.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_painkillers_Display">
<English>Painkillers</English>
@ -4951,15 +4976,19 @@
</Key>
<Key ID="STR_ACE_Medical_Treatment_Administer_Painkillers">
<English>Administer Painkillers</English>
<Russian>Вводите обезболивающие</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_Administering_Painkillers">
<English>Administering Painkillers...</English>
<Russian>Ввод обезболивающего...</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_painkillers_Desc_Short">
<English>Over-the-counter analgesic used to combat light to moderate pain experiences.</English>
<Russian>Безрецептурный анальгетик, используемый для борьбы с легкими и умеренными болевыми ощущениями.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Treatment_painkillers_Desc_Use">
<English>Over-the-counter analgesic used to combat light to moderate pain experiences.</English>
<Russian>Безрецептурный анальгетик, используемый для борьбы с легкими и умеренными болевыми ощущениями.</Russian>
</Key>
</Package>
</Project>

View File

@ -4,12 +4,15 @@
<Key ID="STR_ACE_Medical_Vitals_SubCategory">
<English>Vitals</English>
<Portuguese>Vitais</Portuguese>
<Russian>Жизненно важные органы</Russian>
</Key>
<Key ID="STR_ACE_Medical_Vitals_simulateSpO2_DisplayName">
<English>Enable SpO2 Simulation</English>
<Russian>Включить имитацию SpO2</Russian>
</Key>
<Key ID="STR_ACE_Medical_Vitals_simulateSpO2_Description">
<English>Enables oxygen saturation simulation, providing variable heart rate and oxygen demand based on physical activity and altitude. Required for Airway Management.</English>
<Russian>Позволяет имитировать насыщение кислородом, обеспечивая переменную частоту сердечных сокращений и потребность в кислороде в зависимости от физической активности и высоты над уровнем моря. Требуется для управления дыхательными путями.</Russian>
</Key>
</Package>
</Project>

View File

@ -8,4 +8,7 @@ PREP_RECOMPILE_END;
#include "initSettings.inc.sqf"
// #9781 - register effects layer ASAP
QGVAR(display) cutText ["", "PLAIN"];
ADDON = true;

View File

@ -48,10 +48,9 @@ if (GVAR(fogScaling) > 0) then {
};
};
// Note: Using BIS_fnc_rscLayer because of bug with string syntax - https://feedback.bistudio.com/T120768
(QGVAR(display) call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; // Cleanup Old Display
QGVAR(display) cutText ["", "PLAIN"]; // Cleanup Old Display
if (_activated) then { // Create New Display
(QGVAR(display) call BIS_fnc_rscLayer) cutRsc [QGVAR(title), "PLAIN", 0, false, false]; // draw under HUD
QGVAR(display) cutRsc [QGVAR(title), "PLAIN", 0, false, false]; // draw under HUD
};
// Cleanup Old PP Effects

View File

@ -131,6 +131,7 @@
<German>NS-Brille (3. Generation, Braun, WP)</German>
<Korean>야투경 (3세대, 갈색, 백색광)</Korean>
<French>JVN (Gen3, marron, WP)</French>
<Russian>ПНВ (Gen3, Коричневый, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_WP_desc">
<English>Night Vision Goggles, White Phosphor</English>
@ -140,6 +141,7 @@
<German>Nachtsichtbrille, weißer Phosphor</German>
<Korean>백색광 야투경</Korean>
<French>Jumelles Vision Nocturne, Phosphore blanc</French>
<Russian>Очки ночного видения, белый фосфор</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Gen3_green">
<English>NV Goggles (Gen3, Green)</English>
@ -166,6 +168,7 @@
<German>NS-Brille (3. Generation, Grün, WP)</German>
<Korean>야투경 (3세대, 녹색, 백색광)</Korean>
<French>JVN (Gen3, vertes, WP)</French>
<Russian>ПНВ (Gen3, Зелёный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Gen3_black">
<English>NV Goggles (Gen3, Black)</English>
@ -192,6 +195,7 @@
<German>NS-Brille (3. Generation, Schwarz, WP)</German>
<Korean>야투경 (3세대, 검정, 백색광)</Korean>
<French>JVN (Gen3, noires, WP)</French>
<Russian>ПНВ (Gen3, Чёрный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Gen4_brown">
<English>NV Goggles (Gen4, Brown)</English>
@ -213,6 +217,7 @@
<German>NS-Brille (4. Generation, Braun, WP)</German>
<Korean>야투경 (4세대, 갈색, 백색광)</Korean>
<French>JVN (Gen4, marron, WP)</French>
<Russian>ПНВ (Gen4, Коричневый, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Gen4_black">
<English>NV Goggles (Gen4, Black)</English>
@ -234,6 +239,7 @@
<German>NS-Brille (4. Generation, Schwarz, WP)</German>
<Korean>야투경 (4세대, 검정, 백색광)</Korean>
<French>JVN (Gen4, noires, WP)</French>
<Russian>ПНВ (Gen4, Чёрный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Gen4_green">
<English>NV Goggles (Gen4, Green)</English>
@ -255,6 +261,7 @@
<German>NS-Brille (4. Generation, Grün, WP)</German>
<Korean>야투경 (4세대, 녹색, 백색광)</Korean>
<French>JVN (Gen4, vertes, WP)</French>
<Russian>ПНВ (Gen4, Зелёный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Wide_brown">
<English>NV Goggles (Wide, Brown)</English>
@ -276,6 +283,7 @@
<German>NS-Brille (Weit, Braun, WP)</German>
<Korean>야투경 (넓음, 갈색, 백색광)</Korean>
<French>JVN (Large, marron, WP)</French>
<Russian>ПНВ (Широкий, Коричневый, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Wide_black">
<English>NV Goggles (Wide, Black)</English>
@ -297,6 +305,7 @@
<German>NS-Brille (Weit, Schwarz, WP)</German>
<Korean>야투경 (넓음, 검정, 백색광)</Korean>
<French>JVN (Large, noires, WP)</French>
<Russian>ПНВ (Широкий, Чёрный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVG_Wide_green">
<English>NV Goggles (Wide, Green)</English>
@ -318,6 +327,7 @@
<German>NS-Brille (Weit, Grün, WP)</German>
<Korean>야투경 (넓음, 녹색, 백색광)</Korean>
<French>JVN (Large, vertes, WP)</French>
<Russian>ПНВ (Широкий, Зелёный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_NightVision_NVGBrightness">
<English>Brightness: %1</English>
@ -576,6 +586,7 @@
<German>Nachtsicht-Generation</German>
<Korean>야투경 세대</Korean>
<French>Génération de jumelles de vision nocturne</French>
<Russian>Генерация ночного видения</Russian>
</Key>
<Key ID="STR_ACE_NightVision_statGen">
<English>Gen %1</English>
@ -585,6 +596,7 @@
<German>Gen %1</German>
<Korean>%1세대</Korean>
<French>Gen %1</French>
<Russian>Генерация %1</Russian>
</Key>
</Package>
</Project>

View File

@ -879,31 +879,37 @@
<English>Bolt Type</English>
<Japanese>遊底(ボルト)形式</Japanese>
<Korean>노리쇠 방식</Korean>
<Russian>Тип болта</Russian>
</Key>
<Key ID="STR_ACE_Overheating_statBoltType_openBolt">
<English>Open Bolt</English>
<Japanese>オープンボルト</Japanese>
<Korean>오픈 볼트</Korean>
<Russian>Открыть болт</Russian>
</Key>
<Key ID="STR_ACE_Overheating_statBoltType_closedBolt">
<English>Closed Bolt</English>
<Japanese>クローズドボルト</Japanese>
<Korean>클로즈드 볼트</Korean>
<Russian>Закрыть болт</Russian>
</Key>
<Key ID="STR_ACE_Overheating_statBarrelType">
<English>Barrel Type</English>
<Japanese>銃身形式</Japanese>
<Korean>총열 방식</Korean>
<Russian>Тип ствола</Russian>
</Key>
<Key ID="STR_ACE_Overheating_statBarrelType_nonRemoveable">
<English>Non-Removeable</English>
<Japanese>取り外し不可</Japanese>
<Korean>제거 불가</Korean>
<Russian>Несъемный</Russian>
</Key>
<Key ID="STR_ACE_Overheating_statBarrelType_removeable">
<English>Quick Change</English>
<Japanese>即時交換可</Japanese>
<Korean>신속 교체</Korean>
<Russian>Быстросъемный</Russian>
</Key>
</Package>
</Project>

View File

@ -29,6 +29,7 @@
#define TO_COMPARTMENT_STRING(var) if !(var isEqualType "") then {var = format [ARR_2("Compartment%1",var)]}
// if unit isn't moved to new seat in TAKEN_SEAT_TIMEOUT, we move him back to his seat
#pragma hemtt suppress pw3_padded_arg file
#define WAIT_IN_OR_MOVE_BACK \
[ARR_5( \
{!isNull objectParent (_this select 0)}, \

View File

@ -58,6 +58,7 @@
<Polish>Prędkość Tankowania Ładunku</Polish>
<German>Frachtflussrate</German>
<French>Vitesse de ravitaillement</French>
<Russian>Скорость заполнения груза</Russian>
</Key>
<Key ID="STR_ACE_Refuel_RefuelSettings_speedCargo_Description">
<English>How fast should a fuel source's tank be filled?</English>
@ -68,6 +69,7 @@
<Polish>Jak szybko zbiornik paliwa powinien być napełniany?</Polish>
<German>Wie schnell sollte der Tank einer Kraftstoffquelle gefüllt werden?</German>
<French>A quelle vitesse le réservoir de carburant doit-il être rempli ?</French>
<Russian>Как быстро должен заполняться бак источника топлива?</Russian>
</Key>
<Key ID="STR_ACE_Refuel_Refuel">
<English>Refuel</English>
@ -318,6 +320,7 @@
<Japanese>給油を始める (コンテナ)</Japanese>
<Polish>Rozpocznij tankowanie (zbiornik)</Polish>
<French>Commencer le ravitaillement (container)</French>
<Russian>Начать заправку топливом (контейнер)</Russian>
</Key>
<Key ID="STR_ACE_Refuel_CouldNotTurnOn">
<English>Couldn't turn on fuel nozzle</English>
@ -501,6 +504,7 @@
<Italian>Raccogli contenitore di carburante</Italian>
<Japanese>燃料キャニスターを持つ</Japanese>
<Korean>연료통 집어들기</Korean>
<Russian>Взять канистру с топливом</Russian>
</Key>
<Key ID="STR_ACE_Refuel_TakeFuelCanisterAction">
<English>Picking fuel canister up...</English>
@ -508,6 +512,7 @@
<Italian>Raccogliendo contenitore di carburante...</Italian>
<Japanese>燃料キャニスターを持ち上げています・・・</Japanese>
<Korean>연료통 집어드는 중...</Korean>
<Russian>Поднимаю канистру с топливом...</Russian>
</Key>
<Key ID="STR_ACE_Refuel_ConnectFuelCanister">
<English>Connect fuel canister</English>
@ -515,6 +520,7 @@
<Italian>Collega contenitore di carburante</Italian>
<Japanese>燃料キャニスターを接続する</Japanese>
<Korean>연료통 꽂기</Korean>
<Russian>Подсоединить канистру с топливом</Russian>
</Key>
<Key ID="STR_ACE_Refuel_ConnectFuelCanisterAction">
<English>Connecting fuel canister...</English>
@ -522,6 +528,7 @@
<Italian>Collegando contenitore di carburante...</Italian>
<Japanese>燃料キャニスターを接続しています・・・</Japanese>
<Korean>연료통 꽂는 중...</Korean>
<Russian>Подсоединение топливной канистры...</Russian>
</Key>
<Key ID="STR_ACE_Refuel_DisconnectFuelCanister">
<English>Disconnect fuel canister</English>
@ -529,6 +536,7 @@
<Italian>Scollega contenitore di carburante</Italian>
<Japanese>燃料キャニスターを外します</Japanese>
<Korean>연료통 빼기</Korean>
<Russian>Отсоединить канистру с топливом</Russian>
</Key>
<Key ID="STR_ACE_Refuel_RefuelSettings_hoseLength_DisplayName">
<English>Refuel hose length</English>

View File

@ -137,6 +137,7 @@
<Japanese>ベルトがリンクされた</Japanese>
<Polish>Taśma została połączona</Polish>
<Korean>탄띠가 연결되었습니다</Korean>
<Russian>Ремень был пристегнут</Russian>
</Key>
<Key ID="STR_ACE_Reload_BeltNotLinked">
<English>Belt could not be linked</English>
@ -146,6 +147,7 @@
<Japanese>ベルトはリンクされなかった</Japanese>
<Polish>Taśma nie mogła być połączona</Polish>
<Korean>탄띠를 연결할 수 없습니다</Korean>
<Russian>Ремень не удалось пристегнуть</Russian>
</Key>
</Package>
</Project>

View File

@ -9,6 +9,7 @@
<Italian>Mostra avviso di ricarica da parte del coppio</Italian>
<Korean>동료의 장전에 대한 알림 표시</Korean>
<French>Affichage de notifications lors d'une rechargement par un ami</French>
<Russian>Отображает уведомления о загрузке помощника</Russian>
</Key>
<Key ID="STR_ACE_ReloadLaunchers_SettingDisplayStatusTextDesc">
<English>Displays notifications when an assistant loads a gunner's launcher.</English>
@ -18,6 +19,7 @@
<Italian>Mostra un avviso quando un assistente sta ricaricando il proprio lanciatore.</Italian>
<Korean>부사수가 사수의 발사기를 장전할 때 알림을 표시합니다.</Korean>
<French>Affiche une notofication lorsqu'un assistant recharge l'arme du tireur.</French>
<Russian>Отображает уведомления, когда помощник загружает пусковую установку стрелка.</Russian>
</Key>
<Key ID="STR_ACE_ReloadLaunchers_LoadLauncher">
<English>Load launcher</English>
@ -44,6 +46,7 @@
<Japanese>%1 がランチャーを装填しています</Japanese>
<Polish>%1 ładuje twoją wyrzutnię</Polish>
<Korean>%1이(가) 당신의 발사기를 장전했습니다.</Korean>
<Russian>%1 загружает Вашу установку</Russian>
</Key>
<Key ID="STR_ACE_ReloadLaunchers_LoadingAborted">
<English>%1 stopped loading your launcher</English>
@ -53,6 +56,7 @@
<Japanese>%1 がランチャーの装填を中断しました</Japanese>
<Polish>%1 przestał ładować twoją wyrzutnię</Polish>
<Korean>%1이(가) 당신의 발사기 장전을 멈췄습니다.</Korean>
<Russian>%1 прекратил загружать Вашу установку</Russian>
</Key>
<Key ID="STR_ACE_ReloadLaunchers_LoadingLauncher">
<English>Loading launcher...</English>
@ -113,6 +117,7 @@
<Japanese>ランチャーを装填できませんでした</Japanese>
<Polish>Wyrzutnia nie mogła być załadowana</Polish>
<Korean>발사기를 장전할 수 없습니다.</Korean>
<Russian>Не удалось загрузить пусковую установку</Russian>
</Key>
<Key ID="STR_ACE_ReloadLaunchers_featureDescription">
<English>Buddy Loading</English>
@ -122,6 +127,7 @@
<French>Chargement par un ami</French>
<German>Nachladen durch Kamerad</German>
<Japanese>バディローディング</Japanese>
<Russian>Перезарядка помощником</Russian>
</Key>
</Package>
</Project>

View File

@ -44,6 +44,7 @@
<Italian>Ruota</Italian>
<Korean>바퀴</Korean>
<French>Roue</French>
<Russian>Колесо</Russian>
</Key>
<Key ID="STR_ACE_Repair_ReplaceWheel">
<English>Change Wheel</English>
@ -279,6 +280,7 @@
<Italian>Coefficiente di riparazione completa</Italian>
<Korean>전체 수리 시간 계수</Korean>
<French>Coefficient du temps de réparation complète</French>
<Russian>Коэффициент времени полного ремонта</Russian>
</Key>
<Key ID="STR_ACE_Repair_timeCoefficientFullRepair_description">
<English>Modifies how long it takes to perform a Full Repair.\nThe repair time is based on the amount of repairs needed for each part, including those normally inaccessible.</English>
@ -288,6 +290,7 @@
<German>Ändert, wie lange es dauert, eine vollständige Reparatur durchzuführen.\nDie Reparaturzeit basiert auf der Menge der erforderlichen Reparaturen für jedes Teil, einschließlich derjenigen, die normalerweise nicht zugänglich sind.</German>
<Korean>전체적인 수리를 수행하는 데 걸리는 시간을 수정합니다.\n수리 시간은 일반적으로 접근할 수 없는 부품을 포함하여 각 부품에 필요한 수리 시간을 기준으로 합니다.</Korean>
<French>Modifie la durée que prend une réparation complète.\nLe temps de réparation est basé sur la quantité de réparations requises pour chaque partie, incluant celles qui sont normalement inaccessibles.</French>
<Russian>Изменяет время, необходимое для выполнения полного ремонта.\nВремя ремонта зависит от объема ремонтных работ, необходимых для каждой детали, включая те, которые обычно недоступны.</Russian>
</Key>
<Key ID="STR_ACE_Repair_LocationsBoostTraining_Description">
<English>Boost engineer training when in repair vehicles or facilities. Untrained becomes engineer, engineer becomes advanced engineer.</English>
@ -1283,6 +1286,7 @@
<Polish>Zezwól na Łatanie Kół</Polish>
<Korean>바퀴 수리 허용</Korean>
<French>Autoriser le rafistolage des roues</French>
<Russian>Разрешить починить колесо</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelEnabled_description">
<English>Who can patch wheels?</English>
@ -1292,6 +1296,7 @@
<Polish>Kto może łatać koła?</Polish>
<Korean>누가 바퀴를 수리할 수 있습니까?</Korean>
<French>Qui peut rafistoler les roues ?</French>
<Russian>Кто может починить колеса?</Russian>
</Key>
<Key ID="STR_ACE_Repair_engineerSetting_Repair_name">
<English>Allow Repair</English>
@ -1951,6 +1956,7 @@
<Polish>Wymagania do Łatania Koła</Polish>
<Korean>바퀴 수리 아이템 필요</Korean>
<French>Exigences pour rafistoler une roue</French>
<Russian>Требования для починки колеса</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelRequiredItems_Description">
<English>Items required to patch a wheel.</English>
@ -1960,6 +1966,7 @@
<Polish>Przedmioty wymagane do załatania koła</Polish>
<Korean>바퀴를 수리하기 위해 아이템이 필요합니다.</Korean>
<French>Equipements requis pour rafistoler une roue.</French>
<Russian>Предметы, необходимые для починки колеса.</Russian>
</Key>
<Key ID="STR_ACE_Repair_MiscRepairRequiredItems_DisplayName">
<English>Misc Repair Requirements</English>
@ -2134,6 +2141,7 @@
<German>Teilreparaturzeit</German>
<Korean>부품 수리 시간</Korean>
<French>Temps de réparation des pièces</French>
<Russian>Время ремонта детали</Russian>
</Key>
<Key ID="STR_ACE_Repair_miscRepairTime_description">
<English>Time in seconds to complete a repair.</English>
@ -2143,6 +2151,7 @@
<German>Zeit in Sekunden, um eine Reparatur abzuschließen.</German>
<Korean>수리를 완료하는 시간(초 단위)</Korean>
<French>Durée en secondes pour terminer une réparation.</French>
<Russian>Время завершения ремонта в секундах.</Russian>
</Key>
<Key ID="STR_ACE_Repair_wheelChangeTime_name">
<English>Wheel Change Time</English>
@ -2152,6 +2161,7 @@
<German>Radwechselzeit</German>
<Korean>바퀴 교체 시간</Korean>
<French>Temps de changement d'une roue</French>
<Russian>Время замены колеса</Russian>
</Key>
<Key ID="STR_ACE_Repair_wheelChangeTime_description">
<English>Time in seconds to remove or change a wheel.</English>
@ -2161,6 +2171,7 @@
<German>Zeit in Sekunden, um ein Rad zu entfernen oder zu wechseln.</German>
<Korean>바퀴를 제거하거나 교체하는 데 걸리는 시간(초 단위)</Korean>
<French>Durée en seconde pour enlever ou changer une roue.</French>
<Russian>Время в секундах на снятие или замену колеса.</Russian>
</Key>
<Key ID="STR_ACE_Repair_PatchWheel">
<English>Patch Wheel</English>
@ -2170,6 +2181,7 @@
<Polish>Załataj Koło</Polish>
<Korean>바퀴 수리</Korean>
<French>Rafistoler la roue</French>
<Russian>Чинить колесо</Russian>
</Key>
<Key ID="STR_ACE_Repair_PatchingWheel">
<English>Patching Wheel...</English>
@ -2179,6 +2191,7 @@
<Polish>Łatanie Koła...</Polish>
<Korean>바퀴 수리 중...</Korean>
<French>Rafistolage de la roue...</French>
<Russian>Починка колеса...</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelTime_DisplayName">
<English>Wheel Patch Time</English>
@ -2188,6 +2201,7 @@
<German>Zeit um Räder zu flicken</German>
<Korean>바퀴 수리 시간</Korean>
<French>Temps de rafistolage d'une roue</French>
<Russian>Время починки полеса</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelTime_Description">
<English>Time it takes to patch a wheel by 5%.</English>
@ -2197,6 +2211,7 @@
<German>Zeit, die benötigt wird, um ein Rad um 5 % zu flicken.</German>
<Korean>바퀴를 5% 수리하는 데 걸리는 시간(초 단위)</Korean>
<French>Durée pour rafistoler une roue de 5%.</French>
<Russian>Время, необходимое для починки колеса, сокращается на 5%.</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelMaximumRepair_DisplayName">
<English>Patch Wheel Threshold</English>
@ -2206,6 +2221,7 @@
<German>Rad flicken Schwellenwert</German>
<Korean>바퀴 수리 한계점</Korean>
<French>Seuil de rafistolage d'une roue</French>
<Russian>Порог починки колеса</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelMaximumRepair_Description">
<English>Maximum level to which a wheel can be patched.</English>
@ -2215,6 +2231,7 @@
<German>Maximales Level, bis zu dem ein Rad geflickt werden kann.</German>
<Korean>바퀴를 수리할 수 있는 최대 레벨입니다.</Korean>
<French>Niveau maximum de rafistolage d'une roue.</French>
<Russian>Максимальный уровень, до которого колесо может быть починено.</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelLocation_DisplayName">
<English>Wheel Patch Location</English>
@ -2224,6 +2241,7 @@
<German>Räder Flick Ort</German>
<Korean>바퀴 수리 장소</Korean>
<French>Lieu de rafistolage des roues</French>
<Russian>Место починки колеса</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelLocation_Description">
<English>Where the wheel can be patched.</English>
@ -2233,6 +2251,7 @@
<German>Wo das Rad geflickt werden kann.</German>
<Korean>바퀴를 수리할 수 있는 곳입니다.</Korean>
<French>Lieu où les roues peuvent être rafistolées.</French>
<Russian>Где колесо можно починить.</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelOnGround">
<English>On the ground</English>
@ -2242,6 +2261,7 @@
<Polish>Na ziemi</Polish>
<Korean>지면 위</Korean>
<French>Sur le terrain</French>
<Russian>На земле</Russian>
</Key>
<Key ID="STR_ACE_Repair_patchWheelOnVehicle">
<English>On a vehicle</English>
@ -2251,6 +2271,7 @@
<Polish>Na pojeździe</Polish>
<Korean>차량</Korean>
<French>Sur un véhicule</French>
<Russian>На транспорте</Russian>
</Key>
</Package>
</Project>

View File

@ -383,6 +383,7 @@
<Italian>Marcatore identificativo sui veicoli</Italian>
<Korean>차량 ID 마킹</Korean>
<French>Marquage ID des véhicules</French>
<Russian>Идентификационная маркировка транспортного средства</Russian>
</Key>
<Key ID="STR_ACE_Tagging_stencilVehicle_tooltip">
<English>Replaces clan tag with stenciled text</English>
@ -392,6 +393,7 @@
<Italian>Sostituisce l'icona del clan con testo in stampatello</Italian>
<Korean>클랜 태그를 스텐실 텍스트로 바꿉니다.</Korean>
<French>Remplace le tag du clan par un texte au pochoir</French>
<Russian>Заменяет тег клана трафаретным текстом</Russian>
</Key>
</Package>
</Project>

View File

@ -1320,6 +1320,7 @@
<Italian>Scarica dal carico</Italian>
<Japanese>貨物室から降ろす</Japanese>
<Korean>화물 내리기</Korean>
<Russian>Выгрузить из отсека</Russian>
</Key>
<Key ID="STR_ACE_Zeus_ModuleToggleNVG_DisplayName">
<English>Toggle NVGs</English>
@ -1964,6 +1965,7 @@
<Italian>Il Menù Medico è disabilitato</Italian>
<Japanese>医療メニューは無効になっています</Japanese>
<Korean>의료 메뉴가 비활성화되었습니다</Korean>
<Russian>Медицинское меню отключено</Russian>
</Key>
<Key ID="STR_ACE_Zeus_ModuleLayTrenchline_DisplayName">
<English>Lay Trenchline</English>
@ -1973,6 +1975,7 @@
<German>Grabenlinie legen</German>
<Italian>Piazza Trincea</Italian>
<Japanese>塹壕溝線を敷設</Japanese>
<Russian>Проложить траншею</Russian>
</Key>
<Key ID="STR_ACE_Zeus_ModuleLayTrenchline_Tooltip">
<English>+SHIFT to force (Can only lay N/S or E/W)</English>
@ -1982,6 +1985,7 @@
<German>+SHIFT zum Erzwingen (Kann nur nach N/S oder E/W legen)</German>
<Italian>+SHIFT per forzare (Può piazzare solo N/S o E/O</Italian>
<Japanese>+SHIFTキー で強制的に敷設 (北/南または東/西方向にのみ配置可能)</Japanese>
<Russian>+SHIFT на принудительное (может укладываться только на Север/Юг или Восток/Запад)</Russian>
</Key>
</Package>
</Project>

View File

@ -63,28 +63,28 @@ Horus ATragMX software considers atmospheric conditions, gun data, ammunition, r
- Update the `Atmsphr` column and `Done`. Requirement: [Kestrel 4500]({{ site.baseurl }}/wiki/feature/kestrel4500.html).
- *Check the new `Muzzle Velocity` in the `Gun` column.*
- Update the `Target` column and `Done`. Requirement: [wind arrow]({{ site.baseurl }}/wiki/feature/weather.html), [Protractor]({{ site.baseurl }}/wiki/feature/advanced-ballistics#22-protractor.html), [Map Tools]({{ site.baseurl }}/wiki/feature/maptools.html). For advanced tools: [ACE3 Equipment]({{ site.baseurl }}/wiki/feature.html).
- Update the `Target` column and `Done`. Requirement: [Wind arrow]({{ site.baseurl }}/wiki/feature/weather.html), [Protractor]({{ site.baseurl }}/wiki/feature/advanced-ballistics#22-protractor), [Map Tools]({{ site.baseurl }}/wiki/feature/maptools.html). For advanced tools: [ACE3 Equipment]({{ site.baseurl }}/wiki/feature.html).
- `Latitude`: *[ACE3 Github]({{ site.ace.githubUrl }}/blob/master/addons/common/functions/fnc_getMapData.sqf) or Eden Editor's Extended Debug Console: Watch:* `ace_common_maplatitude`.
- `Dir of Fire (deg from N)`: *The value is therefore given as the direction of the barrel axis from true north.* **[Horus manual p.14]**
- `Wind speed (m/s)`: *Two wind speed values (low and high) may be entered on the target screen,[...] Lead/Wind2 button on the screen.* **[Horus manual p.32]**
- *Wind takes into account geographic location, season, time of day, obstacles, altitude and surface roughness: [Wind Profile](https://wind-data.ch/tools/profile.php?lng=en).*
- `Wind Direction (clock)`: *Wind Direction is expressed in clock points.[...], wind is always described in terms of where it is coming from.* **[Horus manual p.16]**
- `Inclination Angle`: *The degrees field is marked with a “d” and the cosine field with a “c”.* **[Horus manual p.33]**
- `Target Speed`: *Target Speed Assist* **[Horus manual p.21]**
- `Target Range (meters)`: *Parameter Limits minimum and maximum values: 25 - 3700 meters.* **[Horus manual p.17]**
- `Dir of Fire (deg from N)`: *The value is therefore given as the direction of the barrel axis from true north.* [Horus manual p.14]
- `Wind speed (m/s)`: *Two wind speed values (low and high) may be entered on the target screen,[...] Lead/Wind2 button on the screen.* [Horus manual p.32]
- Wind takes into account geographic location, season, time of day, obstacles, altitude and surface roughness: [Wind Profile](https://wind-data.ch/tools/profile.php?lng=en).
- `Wind Direction (clock)`: *Wind Direction is expressed in clock points.[...], wind is always described in terms of where it is coming from.* [Horus manual p.16]
- `Inclination Angle`: *The degrees field is marked with a “d” and the cosine field with a “c”.* [Horus manual p.33]
- `Target Speed`: *Target Speed Assist* [Horus manual p.21]
- `Target Range (meters)`: *Parameter Limits minimum and maximum values: 25 - 3700 meters.* [Horus manual p.17]
- Apply vertical (Page Up and Down keys as default) and horizontal (Left Ctrl + Page Up and Down keys as default) elevations to the [scope]({{ site.baseurl }}/wiki/feature/scopes.html).
- Hold Breath (Left Shift as default) and Fire (Prim. Mouse. Btn. as default).
### 3.3 Example with Truing tool
> This process is called “Truing Drop”, or simply “Truing”. It involves taking 2 or 3 real flight data points (finding bullet drop at 2 or 3 places along its flight) and feeding it into the calculation parameters. **[Horus manual p.23]**
> This process is called “Truing Drop”, or simply “Truing”. It involves taking 2 or 3 real flight data points (finding bullet drop at 2 or 3 places along its flight) and feeding it into the calculation parameters. [Horus manual p.23]
> The Truing Drop function is opened from ATrags main screen by selecting “Options” [...], then selecting “Truing Drop” from the menu that appears. **[Horus manual p.23]**
> The Truing Drop function is opened from ATrags main screen by selecting “Options” [...], then selecting “Truing Drop” from the menu that appears. [Horus manual p.23]
> With C1, you can also insert the new BC into the C1 table (with the target range value), or you can replace the C1 table with the following values:
> 1. first entry: Zero Range, original C1.
> 2. second entry: range at 75% of distance between transonic start and subsonic start, with original C1.
> 3. third entry: range 200 (y/m) beyond subsonic start, with new calculated C1. **[Horus manual p.24]**
> 3. third entry: range 200 (y/m) beyond subsonic start, with new calculated C1. [Horus manual p.24]
- Basic example with ammunition 7.62x51mm G7 ballistic coefficient.
- Open the AtragMx and the `Atmsphr` column, select `Default` and `Done`.
@ -149,13 +149,13 @@ Horus ATragMX software considers atmospheric conditions, gun data, ammunition, r
### 3.6 Connecting AtragMx with Vector 21 and DAGR
- Requirement: [Vector]({{ site.baseurl }}/wiki/framework/vector.html) and [DAGR]({{ site.baseurl }}/wiki/framework/dagr.html).
- Requirement: [Vector]({{ site.baseurl }}/wiki/feature/vector.html) and [DAGR]({{ site.baseurl }}/wiki/feature/dagr.html).
- Open the self interaction menu <kbd>Ctrl</kbd> + <kbd>&nbsp;Win</kbd>.
- Select `Equipment`.
- Select `Configure DAGR` and `CONNECT TO` (DOWN and HELP/SEL) `Vector 21`(HELP/SEL).
- Equip and use the Vector (B key as default).
- Check target's [slope distance and azimuth]({{ site.baseurl }}/wiki/feature/vector#23-slope-distance-and-azimuth.html) (hold both R and Tab keys as default).
- Open the [AtragMx properly configured before]({{ site.baseurl }}/wiki/feature/atragmx#32-example-with-m14-and-default-762mm-20rnd-mag.html) according to current rifle and ammunition.
- Check target's [slope distance and azimuth]({{ site.baseurl }}/wiki/feature/vector#23-slope-distance-and-azimuth) (hold both R and Tab keys as default).
- Open the [AtragMx properly configured before](#32-example-with-m14-and-default-762mm-20rnd-mag) according to current rifle and ammunition.
- Open the `Target` column: `Dir of Fire (deg from N)`, `Inclination Angle` and `Target Range (meters)` updated with Vector's values.
### 3.7 Adding AtragMx Presets
@ -205,13 +205,13 @@ Horus ATragMX software considers atmospheric conditions, gun data, ammunition, r
**In position:**
- **Do not update the `Atmsphr` column.** Default ballistic doesn't take into account temperature, pressure and humidity.
- Update the `Target` column and `Done`. Requirement: [wind arrow]({{ site.baseurl }}/wiki/feature/weather.html), [Protractor]({{ site.baseurl }}/wiki/feature/advanced-ballistics#22-protractor.html), [Map Tools]({{ site.baseurl }}/wiki/feature/maptools.html). For advanced tools: [ACE3 Equipment]({{ site.baseurl }}/wiki/feature.html).
- `Wind speed (m/s)`: *Two wind speed values (low and high) may be entered on the target screen,[...] Lead/Wind2 button on the screen.* **[Horus manual p.32]**
- *Wind takes into account geographic location, season, time of day and obstacles.*
- `Wind Direction (clock)`: *Wind Direction is expressed in clock points.[...], wind is always described in terms of where it is coming from.* **[Horus manual p.16]**
- `Inclination Angle`: *The degrees field is marked with a “d” and the cosine field with a “c”.* **[Horus manual p.33]**
- `Target Speed`: *Target Speed Assist* **[Horus manual p.21]**
- `Target Range (meters)`: *Parameter Limits minimum and maximum values: 25 - 3700 meters.* **[Horus manual p.17]**
- Update the `Target` column and `Done`. Requirement: [Wind arrow]({{ site.baseurl }}/wiki/feature/weather.html), [Protractor]({{ site.baseurl }}/wiki/feature/advanced-ballistics#22-protractor), [Map Tools]({{ site.baseurl }}/wiki/feature/maptools.html). For advanced tools: [ACE3 Equipment]({{ site.baseurl }}/wiki/feature.html).
- `Wind speed (m/s)`: *Two wind speed values (low and high) may be entered on the target screen,[...] Lead/Wind2 button on the screen.* [Horus manual p.32]
- Wind takes into account geographic location, season, time of day and obstacles.
- `Wind Direction (clock)`: *Wind Direction is expressed in clock points.[...], wind is always described in terms of where it is coming from.* [Horus manual p.16]
- `Inclination Angle`: *The degrees field is marked with a “d” and the cosine field with a “c”.* [Horus manual p.33]
- `Target Speed`: *Target Speed Assist* [Horus manual p.21]
- `Target Range (meters)`: *Parameter Limits minimum and maximum values: 25 - 3700 meters.* [Horus manual p.17]
- Apply vertical (Page Up and Down keys as default) and horizontal (Left Ctrl + Page Up and Down keys as default) elevations to the [scope]({{ site.baseurl }}/wiki/feature/scopes.html).
- Hold Breath (Left Shift as default) and Fire (Prim. Mouse. Btn. as default).

View File

@ -511,6 +511,7 @@ All are local.
| ace_arsenal_loadoutsDisplayClosed | None | 3.12.3 |
| ace_arsenal_loadoutsTabChanged | loadouts screen display (DISPLAY), tab control (CONTROL) | 3.12.3 |
| ace_arsenal_loadoutsListFilled | loadouts screen display (DISPLAY), tab control (CONTROL) | 3.12.3 |
| ace_arsenal_loadoutVerified | loadout data (ARRAY), loadout CBA extended data (HASHMAP), null items (ARRAY), unavailable items (ARRAY), unavailable extended data (ARRAY) | 3.17.0 |
| ace_arsenal_weaponItemChanged | weapon classname (STRING), item classname (STRING), item index (NUMBER, 0-5: muzzle, side, optic, bipod, magazine, underbarrel) | 3.16.0 |
## 9. Custom sub item categories

View File

@ -68,3 +68,13 @@ The average amount of time in seconds, after `explosionTime` has passed, between
### 2.4 ace_grenades_flashbangIntervalMaxDeviation
The amount of randomness in the fuse time.
## 3. Events
### 3.1 Listenable
Event Name | Description | Passed Parameter(s) | Locality
---------- | ----------- | ------------------- | --------
`ace_flashbangExploded` | A flashbang exploded | `[_grenadePosASL]` | Global
`ace_grenades_flashbangedAI` | A local AI was affected by a flashbang | `[_unit, _strength, _grenadePosASL]` | Local
`ace_grenades_flashbangedPlayer` | The local player was affected by a flashbang | `[_strength, _grenadePosASL]` | Local