Merge branch 'master' into pr/9273

This commit is contained in:
johnb432 2024-04-01 16:06:12 +02:00
commit 1a20df808e
336 changed files with 1834 additions and 839 deletions

View File

@ -11,11 +11,10 @@ sort-direction: ascending
categories:
- title: '**ADDED:**'
labels:
- 'kind/feature request'
- 'kind/added feature'
- 'kind/feature'
- title: '**FIXED:**'
labels:
- 'kind/bug fix'
- 'kind/bug-fix'
- title: '**IMPROVED:**'
labels:
- 'kind/enhancement'
@ -23,17 +22,16 @@ categories:
- title: '**CHANGED:**'
labels:
- 'kind/cleanup'
- 'area/compatibility'
- 'kind/change'
- title: '**SETTINGS:**'
labels:
- 'kind/setting'
- title: '**TRANSLATIONS:**'
labels:
- 'area/translations'
- 'kind/translation'
exclude-labels:
- 'ignore changelog'
- 'ignore-changelog'
- 'dependencies'
change-template: '- $TITLE (#$NUMBER)'

View File

@ -6,6 +6,7 @@
# request, preferably including an email address.
# CORE TEAM
BaerMitUmlaut
Brett Mayson
bux578 <github@jonathandavid.de>
commy2
@ -25,6 +26,7 @@ Kieran
kymckay
mharis001 <mhariszakar@gmail.com>
MikeMF
MiszczuZPolski
NouberNou
PabstMirror <pabstmirror@gmail.com>
Ruthberg <ulteq@web.de>
@ -56,7 +58,6 @@ Arcanum417 <lubos.len@gmail.com>
Arkhir <wonsz666@gmail.com >
ARV187 aka Spark23
Asgar Serran <piechottaf@web.de>
BaerMitUmlaut
Bamse <bamsis@gmail.com>
Barman75
Bla1337

View File

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

View File

@ -1,7 +1,5 @@
#include "script_component.hpp"
#include "initKeybinds.inc.sqf"
GVAR(currentbulletID) = -1;
GVAR(Protractor) = false;
@ -11,6 +9,8 @@ GVAR(currentGrid) = 0;
if (!hasInterface) exitWith {};
#include "initKeybinds.inc.sqf"
["CBA_settingsInitialized", {
//If not enabled, dont't add PFEH
if (!GVAR(enabled)) exitWith {};
@ -19,11 +19,11 @@ if (!hasInterface) exitWith {};
[] call FUNC(initializeTerrainExtension);
// Register fire event handler
["ace_firedPlayer", DFUNC(handleFired)] call CBA_fnc_addEventHandler;
["ace_firedPlayerNonLocal", DFUNC(handleFired)] call CBA_fnc_addEventHandler;
["ace_firedPlayer", LINKFUNC(handleFired)] call CBA_fnc_addEventHandler;
["ace_firedPlayerNonLocal", LINKFUNC(handleFired)] call CBA_fnc_addEventHandler;
// Register Perframe Handler
[FUNC(handleFirePFH), GVAR(simulationInterval)] call CBA_fnc_addPerFrameHandler;
[LINKFUNC(handleFirePFH), GVAR(simulationInterval)] call CBA_fnc_addPerFrameHandler;
//Add warnings for missing compat PBOs (only if AB is on)
{

View File

@ -44,6 +44,9 @@ if (!(_dragModel in [1, 2, 5, 6, 7, 8])) then {
_dragModel = 1;
};
private _ballisticCoefficients = getArray(_ammoConfig >> "ACE_ballisticCoefficients");
if (_ballisticCoefficients isEqualTo []) then {
_ballisticCoefficients = [0.5];
};
private _velocityBoundaries = getArray(_ammoConfig >> "ACE_velocityBoundaries");
private _atmosphereModel = getText(_ammoConfig >> "ACE_standardAtmosphere");
if (_atmosphereModel isEqualTo "") then {

View File

@ -2,35 +2,6 @@
if (!hasInterface) exitWith {};
["baseline", {
private _fatigue = ACE_player getVariable [QGVAR(aimFatigue), 0];
switch (stance ACE_player) do {
case ("CROUCH"): {
(1.0 + _fatigue ^ 2 * 0.1)
};
case ("PRONE"): {
(1.0 + _fatigue ^ 2 * 2.0)
};
default {
(1.5 + _fatigue ^ 2 * 3.0)
};
};
}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor);
["multiplier", {
switch (true) do {
case (isWeaponRested ACE_player): {
GVAR(swayFactor) * GVAR(restedSwayFactor)
};
case (isWeaponDeployed ACE_player): {
GVAR(swayFactor) * GVAR(deployedSwayFactor)
};
default {
GVAR(swayFactor)
};
};
}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor);
// recheck weapon inertia after weapon swap, change of attachments or switching unit
["weapon", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler;
["loadout", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler;
@ -39,6 +10,21 @@ if (!hasInterface) exitWith {};
["CBA_settingsInitialized", {
if (!GVAR(enabled)) exitWith {};
["baseline", {
private _fatigue = ACE_player getVariable [QGVAR(aimFatigue), 0];
switch (stance ACE_player) do {
case ("CROUCH"): {
(1.0 + _fatigue ^ 2 * 0.1)
};
case ("PRONE"): {
(1.0 + _fatigue ^ 2 * 2.0)
};
default {
(1.5 + _fatigue ^ 2 * 3.0)
};
};
}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor);
// - Post process effect ------------------------------------------------------
GVAR(ppeBlackout) = ppEffectCreate ["ColorCorrections", 4220];
GVAR(ppeBlackout) ppEffectEnable true;

View File

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

View File

@ -44,7 +44,7 @@
<Italian>Influenza la prestazione generale di tutti i giocatori smuniti di un fattore personalizzato. Maggiore significa migliore.</Italian>
<Chinese>影響所有玩家的體力表現,值越高代表體力越好</Chinese>
<Chinesesimp>影响所有玩家的体力表现,值越高代表体力越好</Chinesesimp>
<Russian>Влияет на общую производительность игроков, у которых не задано персональное значение.</Russian>
<Russian>Влияет на общую производительность игроков, у которых не задано персональное значение. Чем выше, тем лучше.</Russian>
<Portuguese>Influencia na performance geral de todos os jogadores sem nenhum fator personalizado. Quanto maior, melhor.</Portuguese>
<Czech>Ovlivňuje celkový výkon všech hráčů bez vlastního faktoru. Vyšší znamená lépe.</Czech>
</Key>
@ -59,7 +59,7 @@
<Italian>Influenza la prestazione personalizzata di questa unità. Maggiore significa migliore.</Italian>
<Chinese>影響這個單位的體力表現,值越高代表體力越好</Chinese>
<Chinesesimp>影响这个单位的体力表现,值越高代表体力越好</Chinesesimp>
<Russian>Влияет на общую производительность юнита.</Russian>
<Russian>Влияет на общую производительность юнита.Чем выше, тем лучше.</Russian>
<Portuguese>Influencia na performance geral dessa unidade. Quanto maior, melhor.</Portuguese>
<Czech>Ovlivňuje celkový výkon této jednotky. Vyšší znamená lépe.</Czech>
</Key>
@ -154,76 +154,6 @@
<Portuguese>Define o quanto que um terreno íngrime aumenta na perda de estamina. Quanto maior, maior a perda de estamina.</Portuguese>
<Czech>Nastavuje, o kolik strmý terén zvyšuje ztrátu výdrže. Vyšší znamená vyšší ztrátu výdrže.</Czech>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_SwayFactor">
<English>Sway factor</English>
<Spanish>Factor de balanceo de mira</Spanish>
<German>Verwacklungsfaktor</German>
<Japanese>手ぶれ因数</Japanese>
<Chinesesimp>抖动系数</Chinesesimp>
<Chinese>抖動因素</Chinese>
<French>Facteur de tremblement</French>
<Italian>Fattore di Oscillazione</Italian>
<Polish>Czynnik kołysania</Polish>
<Russian>Фактор колебания прицела</Russian>
<Portuguese>Fator de Balanço de Mira</Portuguese>
<Czech>Faktor kývání</Czech>
<Korean>손떨림 정도</Korean>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_SwayFactor_Description">
<English>Influences the amount of weapon sway. Higher means more sway.</English>
<Spanish>Afecta al la estabilidad de la mira. Más alto significa más balanceo</Spanish>
<German>Beeinflusst, wie ruhig man eine Waffe halten kann. Ein höherer Wert bedeutet weniger Stabilisierung.</German>
<Japanese>武器の手ぶれの量に影響します。値が高いほど、手ぶれが強くなります。</Japanese>
<Chinesesimp>影响手持武器的晃动程度,数值越高,抖动的越厉害。</Chinesesimp>
<Chinese>影響手持武器晃動程度,數值越高抖動越厲害</Chinese>
<French>Influe sur l'amplitude du tremblement de l'arme. Une valeur plus élevée signifie plus de tremblement.</French>
<Italian>Influenza l'aumento di oscillazione dell'arma quando affaticato. Maggiore significa più oscillazione.</Italian>
<Polish>Wpływa na poziom kołysania broni. Większa ilość znaczy większe kołysanie.</Polish>
<Russian>Влияет на колебания прицела оружия. Чем выше - тем больше.</Russian>
<Portuguese>Influencia a quantidade de balanço da mira da arma. Quanto maior, mais balanço.</Portuguese>
<Czech>Ovlivňuje množství kývání zbraní. Vyšší znamená více kývání.</Czech>
<Korean>손떨림의 정도를 정합니다. 높을 수록 많이 휘적입니다.</Korean>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RestedSwayFactor">
<English>Rested sway factor</English>
<French>Facteur de balancement au repos</French>
<Korean>휴식 시 손떨림 정도</Korean>
<Portuguese>Fator de balanço de mira em repouso</Portuguese>
<German>Verwacklungsfaktor, wenn aufgelegt</German>
<Italian>Fattore di Oscillazione Appoggiato</Italian>
<Japanese>静止時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания в состоянии покоя</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_RestedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is rested.</English>
<French>Influence le degré de balancement de l'arme au repos.</French>
<Korean>무기가 아무런 행동도 하지 않는 동안 무기가 흔들리는 정도를 정합니다.</Korean>
<Portuguese>Influencia a quantidade de balanço de mira enquanto a arma está em repouso.</Portuguese>
<German>Beeinflusst, wie ruhig man die Waffe hält, während sie aufgelegt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è appoggiata.</Italian>
<Japanese>静止している時の武器の手ぶれの量に影響します。</Japanese>
<Russian>Влияет на величину колебания оружия в состоянии покоя.</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_DeployedSwayFactor">
<English>Deployed sway factor</English>
<French>Facteur de balancement déployé</French>
<Korean>거치 시 손떨림 정도</Korean>
<Portuguese>Fator de balanço de mira em posição de tiro</Portuguese>
<German>Verwacklungsfaktor, wenn Zweibein aufgestellt ist.</German>
<Italian>Fattore di Oscillazione su Bipode</Italian>
<Japanese>展開時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания при развертывании</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_DeployedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is deployed.</English>
<French>Influence le degré de balancement de l'arme déployée.</French>
<Korean>무기를 거치하는 동안 무기를 흔드는 정도를 정합니다.</Korean>
<Portuguese>Influencia a quantidade de balanço de mira enquanto a arma está em posição de tiro.</Portuguese>
<German>Beeinflusst, wie ruhig man die Waffen hält, während das Zweibein aufgestellt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è stabilizzata usando il bipode.</Italian>
<Japanese>武器の展開(Cキー)時の武器の手ぶれの量に影響します。</Japanese>
<Russian>Влияет на величину колебания оружия при его развертывании.</Russian>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
<English>Enabled</English>
<Spanish>Activada</Spanish>
@ -250,7 +180,7 @@
<Italian>Abilita/Disabilita la Fatica Avanzata.</Italian>
<Chinese>啟用/關閉進階體力.</Chinese>
<Chinesesimp>启用/关闭进阶体力。</Chinesesimp>
<Russian>Включает / Отключает Продвинутую усталость</Russian>
<Russian>Включает/отключает Продвинутую усталость</Russian>
<Portuguese>Ativa/Desativa Fadiga Avançada.</Portuguese>
<Czech>Aktivuje / deaktivuje Pokročilou únavu.</Czech>
</Key>

View File

@ -2,11 +2,14 @@
// Fired XEH
GVAR(ammoEventHandlers) = createHashMap;
[QGVAR(throwFiredXEH), FUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
[QGVAR(throwFiredXEH), LINKFUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
// Exit on HC
if (!hasInterface) exitWith {};
// Temporary Wind Info indication
GVAR(tempWindInfo) = false;
// Ammo/Magazines look-up hash for correctness of initSpeed
GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
{

View File

@ -19,7 +19,7 @@ params ["_unit"];
if !(_unit getVariable [QGVAR(inHand), false]) exitWith {false};
if (vehicle _unit != _unit) exitWith {
if (!isNull objectParent _unit) exitWith {
private _startPos = eyePos _unit;
private _aimLinePos = AGLToASL (positionCameraToWorld [0, 0, 1]);
private _intersections = lineIntersectsSurfaces [_startPos, _aimLinePos, _unit, objNull, false];

View File

@ -53,6 +53,12 @@ _unit setVariable [QGVAR(dropDistance), DROP_DISTANCE_DEFAULT];
// Remove controls hint (check if ever enabled is inside the function)
call EFUNC(interaction,hideMouseHint);
// Hide wind info after throw, if it was temporarily enabled for the throw
if (GVAR(tempWindInfo)) then {
EGVAR(weather,WindInfo) = false;
GVAR(tempWindInfo) = false;
};
// Remove throw action
[_unit, "DefaultAction", _unit getVariable [QGVAR(throwAction), -1]] call EFUNC(common,removeActionEventHandler);

View File

@ -17,9 +17,9 @@
params ["_magazineClassname"];
_magazineClassname = toLower _magazineClassname;
_magazineClassname = toLowerANSI _magazineClassname;
private _throwMuzzles = getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles");
_throwMuzzles = _throwMuzzles select {_magazineClassname in ((getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines")) apply {toLower _x})};
_throwMuzzles = _throwMuzzles select {_magazineClassname in ((getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines")) apply {toLowerANSI _x})};
[_throwMuzzles select 0, ""] select (_throwMuzzles isEqualTo [])

View File

@ -18,6 +18,15 @@
params ["_unit"];
TRACE_1("params",_unit);
// Temporarily enable wind info, to aid in throwing smoke grenades effectively
if (
GVAR(enableTempWindInfo) &&
{!(missionNamespace getVariable [QEGVAR(weather,WindInfo), false])}
) then {
[] call EFUNC(weather,displayWindInfo);
GVAR(tempWindInfo) = true;
};
// Select next throwable if one already in hand
if (_unit getVariable [QGVAR(inHand), false]) exitWith {
TRACE_1("inHand",_unit);

View File

@ -45,7 +45,7 @@ if (!(_unit getVariable [QGVAR(primed), false])) then {
private _newVelocity = (_p1 vectorFromTo _p2) vectorMultiply _velocity;
// Adjust for throwing from inside vehicles, where we have a vehicle-based velocity that can't be compensated for by a human
if (vehicle _unit != _unit) then {
if (!isNull objectParent _unit) then {
_newVelocity = _newVelocity vectorAdd (velocity (vehicle _unit));
};

View File

@ -40,3 +40,11 @@ private _category = format ["ACE %1", localize LSTRING(Category)];
true,
1
] call CBA_fnc_addSetting;
[
QGVAR(enableTempWindInfo), "CHECKBOX",
[LSTRING(EnableTempWindInfo_DisplayName), LSTRING(EnableTempWindInfo_Description)],
_category,
true,
0
] call CBA_fnc_addSetting;

View File

@ -185,6 +185,20 @@
<Portuguese>Permite que arremessáveis fixados em objetos sejam pegos.</Portuguese>
<Czech>Zapíná schopnost zvednutí předmětů z objektů ke kterým jsou připnuté.</Czech>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnableTempWindInfo_DisplayName">
<English>Show Temporary Wind Info</English>
<German>Zeige temporäre Windinformationen</German>
<Italian>Mostra informazioni sul vento temporaneamente</Italian>
<Japanese>一時的に風の情報を表示</Japanese>
<Korean>바람 정보 임시로 표시</Korean>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnableTempWindInfo_Description">
<English>Temporarily display Wind Info while throwing, to aid in placing smoke grenades effectively.</English>
<German>Zeige während des werfens Windinformationen an, um Rauchgranaten effektiver zu platzieren.</German>
<Italian>Mostra le informazioni sul vento durante il lancio di granate, facilitando il piazzamento ottimale di fumogeni.</Italian>
<Japanese>投擲行動中に風向きの情報を一時的に表示し、発煙手榴弾の煙幕を効果的に展開しやすくします。</Japanese>
<Korean>연막탄을 효과적으로 배치하는 데 도움이 되도록 투척하는 동안 일시적으로 바람 정보를 표시합니다.</Korean>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Prepare">
<English>Prepare/Change Throwable</English>
<Spanish>Preparar/Cambiar objetos lanzables</Spanish>

View File

@ -16,7 +16,7 @@
} forEach _sections;
}] call CBA_fnc_addEventHandler;
[QGVAR(unGarrison), FUNC(unGarrison)] call CBA_fnc_addEventHandler;
[QGVAR(unGarrison), LINKFUNC(unGarrison)] call CBA_fnc_addEventHandler;
[QGVAR(doMove), {
params ["_unitsArray"];
@ -73,6 +73,6 @@
if (isServer) then {
["CAManBase", "init", {
// wait for HMD to be assigned so `hmd _unit` works
[FUNC(assignNVG), _this, 1] call CBA_fnc_waitAndExecute;
[LINKFUNC(assignNVG), _this, 1] call CBA_fnc_waitAndExecute;
}] call CBA_fnc_addClassEventHandler;
};

View File

@ -101,7 +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>
<Russian>Экипирует ПНВ в ночное время и отключает его в дневное время.\nНе добавляет ПНВ в инвентарь!</Russian>
</Key>
</Package>
</Project>

View File

@ -17,13 +17,13 @@
*
* Public: No
*/
params ["_vehicle", "_group", "_type", "_value"];
TRACE_4("droneModifyWaypoint",_vehicle,_group,_type,_value);
private _index = (currentWaypoint _group) min count waypoints _group;
private _waypoint = [_group, _index];
switch (toLower _type) do {
switch (toLowerANSI _type) do {
case ("height"): {
private _pos = waypointPosition _waypoint;
_pos set [2, _value];

View File

@ -123,7 +123,9 @@ class GVAR(stats) {
stats[] = {"maximumLoad"};
displayName = "$STR_a3_rscdisplayarsenal_stat_load";
showBar = 1;
showText = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(0,500)],[ARR_2(0.01,1)],false)])] call FUNC(statBarStatement_default));
textStatement = QUOTE(call FUNC(statTextStatement_load));
tabs[] = {{3,4,5}, {}};
};
class ACE_smokeChemTTL: statBase {

View File

@ -16,6 +16,8 @@ PREP(attributeKeyDown);
PREP(attributeLoad);
PREP(attributeMode);
PREP(attributeSelect);
PREP(baseAttachment);
PREP(baseOptic);
PREP(baseWeapon);
PREP(buttonActionsPage);
PREP(buttonCargo);
@ -96,6 +98,7 @@ PREP(statBarStatement_rateOfFIre);
PREP(statTextStatement_accuracy);
PREP(statTextStatement_explosionTime);
PREP(statTextStatement_illuminators);
PREP(statTextStatement_load);
PREP(statTextStatement_magCount);
PREP(statTextStatement_mass);
PREP(statTextStatement_rateOfFire);

View File

@ -22,7 +22,7 @@
params ["_configCategory", "_className", "_ctrlPanel", ["_pictureEntryName", "picture", [""]], ["_configRoot", 0, [0]]];
private _skip = GVAR(favoritesOnly) && {!(_className in GVAR(currentItems))} && {!((toLower _className) in GVAR(favorites))};
private _skip = GVAR(favoritesOnly) && {!(_className in GVAR(currentItems))} && {!((toLowerANSI _className) in GVAR(favorites))};
if (_skip) then {
switch (GVAR(currentLeftPanel)) do {
case IDC_buttonPrimaryWeapon: {
@ -58,7 +58,7 @@ _ctrlPanel lbSetPicture [_lbAdd, _itemPicture];
_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]];
if ((toLower _className) in GVAR(favorites)) then {
if ((toLowerANSI _className) in GVAR(favorites)) then {
_ctrlPanel lbSetColor [_lbAdd, FAVORITES_COLOR];
_ctrlPanel lbSetSelectColor [_lbAdd, FAVORITES_COLOR];
};

View File

@ -66,7 +66,8 @@ _items = _items select {
_x isKindOf ["CBA_MiscItem", _cfgWeapons] && {getNumber (_configItemInfo >> "type") in [TYPE_MUZZLE, TYPE_OPTICS, TYPE_FLASHLIGHT, TYPE_BIPOD]} ||
{getNumber (_configItemInfo >> "type") in [TYPE_FIRST_AID_KIT, TYPE_MEDIKIT, TYPE_TOOLKIT]} ||
{getText (_cfgWeapons >> _x >> "simulation") == "ItemMineDetector"} ||
{getNumber (_cfgMagazines >> _x >> "ACE_isUnique") == 1}
{getNumber (_cfgMagazines >> _x >> "ACE_isUnique") == 1} ||
{getNumber (_cfgMagazines >> _x >> "ACE_asItem") == 1}
};
GVAR(customRightPanelButtons) set [_position, [_items apply {_x call EFUNC(common,getConfigName)}, _picture, _tooltip, _moveOnOverwrite]];

View File

@ -0,0 +1,51 @@
#include "..\script_component.hpp"
/*
* Author: Jonpas, LinkIsGrim
* Returns base attachment for CBA scripted attachment
* Adapted from CBA_fnc_switchableAttachments
*
* Arguments:
* 0: Attachment <STRING>
*
* Return Value:
* Base attachment <STRING>
*
* Example:
* "ACE_acc_pointer_green_IR" call ace_arsenal_fnc_baseAttachment
*
* Public: Yes
*/
params [["_item", "", [""]]];
TRACE_1("looking up base attachment",_item);
private _switchableClasses = [];
private _cfgWeapons = configfile >> "CfgWeapons";
private _config = _cfgWeapons >> _item;
_item = configName _config;
while {
_config = _cfgWeapons >> getText (_config >> "MRT_SwitchItemNextClass");
isClass _config && {_switchableClasses pushBackUnique configName _config != -1}
} do {};
_config = _cfgWeapons >> _item;
private _backward = [];
while {
_config = _cfgWeapons >> getText (_config >> "MRT_SwitchItemPrevClass");
isClass _config && {_backward pushBackUnique configName _config != -1}
} do {};
_switchableClasses append _backward;
_switchableClasses = _switchableClasses arrayIntersect _switchableClasses;
{
if (getNumber (_cfgWeapons >> _x >> "scope") == 2) exitWith {
TRACE_2("found class",_item,_x);
_item = _x;
};
} forEach _switchableClasses;
_item

View File

@ -0,0 +1,32 @@
#include "..\script_component.hpp"
/*
* Author: Jonpas, LinkIsGrim
* Returns base optic for CBA scripted optics (PIP and 2D)
*
* Arguments:
* 0: Optic <STRING>
*
* Return Value:
* Base optic <STRING>
*
* Example:
* "CUP_optic_Elcan_SpecterDR_black_PIP" call ace_arsenal_fnc_baseOptic
*
* Public: Yes
*/
params [["_optic", "", [""]]];
// PIP
private _baseClasses = configProperties [configFile >> "CBA_PIPItems", "getText _x == _optic"];
// Carry Handle
{
_baseClasses append (configProperties [_x, "getText _x == _optic"]);
} forEach configProperties [configFile >> "CBA_CarryHandleTypes"];
if (_baseClasses isNotEqualTo []) then {
_optic = configName (_baseClasses select 0);
};
_optic

View File

@ -19,7 +19,7 @@
params [["_weapon", "", [""]]];
// Check if item is cached
(uiNamespace getVariable QGVAR(baseWeaponNameCache)) getOrDefaultCall [toLower _weapon, {
(uiNamespace getVariable QGVAR(baseWeaponNameCache)) getOrDefaultCall [toLowerANSI _weapon, {
private _cfgWeapons = configfile >> "CfgWeapons";
private _config = _cfgWeapons >> _weapon;

View File

@ -53,7 +53,7 @@ if (GVAR(favoritesOnly)) then {
private _fnc_fillRightContainer = {
params ["_configCategory", "_className", ["_isUnique", false, [false]], ["_unknownOrigin", false, [false]]];
if (GVAR(favoritesOnly) && {!(_className in _currentCargo)} && {!((toLower _className) in GVAR(favorites))}) exitWith {};
if (GVAR(favoritesOnly) && {!(_className in _currentCargo)} && {!((toLowerANSI _className) in GVAR(favorites))}) exitWith {};
// If item is not in the arsenal, it must be unique
if (!_isUnique && {!(_className in GVAR(virtualItemsFlat))}) then {
@ -89,7 +89,7 @@ private _fnc_fillRightContainer = {
_ctrlPanel lnbSetPicture [[_lbAdd, 0], _picture];
_ctrlPanel lnbSetValue [[_lbAdd, 2], parseNumber _isUnique];
_ctrlPanel lnbSetTooltip [[_lbAdd, 0], format ["%1\n%2", _displayName, _className]];
if ((toLower _className) in GVAR(favorites)) then {
if ((toLowerANSI _className) in GVAR(favorites)) then {
_ctrlPanel lnbSetColor [[_lbAdd, 1], FAVORITES_COLOR];
_ctrlPanel lnbSetColorRight [[_lbAdd, 1], FAVORITES_COLOR];
};

View File

@ -78,10 +78,10 @@ if (!isNull curatorCamera) then {
// Make face and voice selection JIP compatible; 3DEN doesn't need this though
if (isMultiplayer && {!is3DEN}) then {
private _id = [QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(centerFace_) + netId GVAR(center)] call CBA_fnc_globalEventJIP;
private _id = [QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(centerFace_) + hashValue GVAR(center)] call CBA_fnc_globalEventJIP;
[_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP;
_id = [QGVAR(broadcastVoice), [GVAR(center), GVAR(currentVoice)], QGVAR(centerVoice_) + netId GVAR(center)] call CBA_fnc_globalEventJIP;
_id = [QGVAR(broadcastVoice), [GVAR(center), GVAR(currentVoice)], QGVAR(centerVoice_) + hashValue GVAR(center)] call CBA_fnc_globalEventJIP;
[_id, GVAR(center)] call CBA_fnc_removeGlobalEventJIP;
};

View File

@ -27,9 +27,9 @@ private _favorited = false;
// Favorites/blacklist will always be lowercase to handle configCase changes
private _item = "";
if (_isLnB) then {
_item = toLower (_control lnbData [_curSel, 0]);
_item = toLowerANSI (_control lnbData [_curSel, 0]);
} else {
_item = toLower (_control lbData _curSel);
_item = toLowerANSI (_control lbData _curSel);
};
if (_item in GVAR(favorites)) then {

View File

@ -31,7 +31,7 @@ private _tabToChange = [];
_stringCount = count _currentID;
// Make sure to keep at least 1 sort per category, so make default sort not deletable
if ("ace_alphabetically" in toLower (_currentID select [0, _stringCount - 3])) then {
if ("ace_alphabetically" in toLowerANSI (_currentID select [0, _stringCount - 3])) then {
continue;
};

View File

@ -25,7 +25,6 @@ if (count _loadout == 2) then {
if (count _loadout != 10) exitWith {[]};
private _weapon = "";
private _weaponsInfo = [];
private _uniqueBaseCfgText = "";
private _cfgWeapons = configFile >> "CfgWeapons";
@ -43,7 +42,7 @@ private _cfgVehicles = configFile >> "CfgVehicles";
// Check weapon & weapon attachments
{
// Magazines
// Magazines in weapons have 2 entries: Name and ammo count
if (_forEachIndex in [4, 5]) then {
_x params [["_magazine", ""], "_count"];
@ -69,23 +68,69 @@ private _cfgVehicles = configFile >> "CfgVehicles";
_x params [["_containerClass", ""], ["_items", []]];
if (_containerClass != "") then {
_uniqueBaseCfgText = (getText ([_cfgWeapons, _cfgVehicles] select (_forEachIndex == IDX_LOADOUT_BACKPACK) >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
if (_forEachIndex == IDX_LOADOUT_BACKPACK) then {
// Check for non-preset first
_uniqueBaseCfgText = [_containerClass, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
if (_uniqueBaseCfgText != "") then {
(_x select 0) set [0, _uniqueBaseCfgText];
if (_uniqueBaseCfgText != "") then {
_containerClass = _uniqueBaseCfgText;
};
// Check if non-preset backpack has a unique base
_uniqueBaseCfgText = (getText (_cfgVehicles >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
if (_uniqueBaseCfgText != "") then {
_containerClass = _uniqueBaseCfgText;
};
_x set [0, _containerClass];
} else {
_uniqueBaseCfgText = (getText (_cfgWeapons >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
if (_uniqueBaseCfgText != "") then {
_x set [0, _uniqueBaseCfgText];
};
};
// Check if container has items that need replacing with a defined base
{
switch (true) do {
// Containers have 2 entries: Name and isBackpack
case (_x isEqualTypeArray ["", false]);
case (_x isEqualTypeArray ["", false]): {
_x params ["_containerClass", "_isBackpack"];
if (_containerClass != "") then {
if (_isBackpack) then {
// Check for non-preset first
_uniqueBaseCfgText = [_containerClass, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
if (_uniqueBaseCfgText != "") then {
_containerClass = _uniqueBaseCfgText;
};
// Check if non-preset backpack has a unique base
_uniqueBaseCfgText = (getText (_cfgVehicles >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
if (_uniqueBaseCfgText != "") then {
_containerClass = _uniqueBaseCfgText;
};
_x set [0, _containerClass];
} else {
_uniqueBaseCfgText = (getText (_cfgWeapons >> _containerClass >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
if (_uniqueBaseCfgText != "") then {
_x set [0, _uniqueBaseCfgText];
};
};
};
};
// Misc. items have 2 entries: Name and amount
case (_x isEqualTypeArray ["", 0]): {
_x params ["_item", "_arg"];
_x params ["_item"];
if (_item != "") then {
_uniqueBaseCfgText = (getText ([_cfgWeapons, _cfgVehicles] select ((_arg isEqualType false) && {_arg}) >> _item >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
_uniqueBaseCfgText = (getText (_cfgWeapons >> _item >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName);
if (_uniqueBaseCfgText != "") then {
_x set [0, _uniqueBaseCfgText];
@ -94,7 +139,7 @@ private _cfgVehicles = configFile >> "CfgVehicles";
};
// Weapons have 2 entries: Weapon info array and amount
case (_x isEqualTypeArray [[], 0]): {
_weaponsInfo = _x select 0;
_x params ["_weaponsInfo"];
// Check weapon & weapon attachments
{

View File

@ -160,7 +160,7 @@ private _magazineMiscItems = createHashMap;
{
_magazineMiscItems set [configName _x, nil];
} forEach ((toString {getNumber (_x >> "ACE_isUnique") == 1}) configClasses _cfgMagazines);
} forEach ((toString {getNumber (_x >> "ACE_isUnique") == 1 || getNumber (_x >> "ACE_asItem") == 1}) configClasses _cfgMagazines);
// Remove invalid/non-existent entries
_grenadeList deleteAt "";
@ -282,11 +282,42 @@ uiNamespace setVariable [QGVAR(CBAdisposableLaunchers), compileFinal _launchers]
uiNamespace setVariable [QGVAR(configItemsTools), compileFinal _toolList];
// Compatibility: Override baseWeapon for RHS optics
// No good way to do this via script for other attachments, needs manual compat
// No good way to do this via script for other RHS attachments, needs manual compat
private _baseWeaponCache = uiNamespace getVariable QGVAR(baseWeaponNameCache);
{
private _baseAttachment = configName (_cfgWeapons >> getText (_x >> "rhs_optic_base"));
if (_baseAttachment != "") then {
_baseWeaponCache set [toLower configName _x, _baseAttachment];
_baseWeaponCache set [toLowerANSI configName _x, _baseAttachment];
};
} forEach ("getText (_x >> 'rhs_optic_base') != ''" configClasses _cfgWeapons);
// Compatibility: Override baseWeapon for CBA Scripted Optics
// Adapted from https://github.com/Theseus-Aegis/Mods/blob/master/addons/armory/functions/fnc_getBaseVariant.sqf
private _isScriptedOptic = toString {
isClass (_x >> "CBA_ScriptedOptic") ||
{(getText (_x >> "weaponInfoType")) regexMatch "CBA_scriptedOptic.*?"}
};
{
private _xClass = toLowerANSI configName _x;
private _baseOptic = _xClass call FUNC(baseOptic);
if (_baseOptic != "" && {_baseOptic != _xClass}) then {
TRACE_2("updating baseOptic",_xClass,_baseOptic);
_baseWeaponCache set [_xClass, _baseOptic];
};
} forEach (_isScriptedOptic configClasses _cfgWeapons);
// Compatibility: Override baseWeapon for CBA Scripted Attachments
private _isScriptedAttachment = toString {
getText (_x >> "MRT_SwitchItemNextClass") != "" ||
{getText (_x >> "MRT_SwitchItemPrevClass") != ""}
};
{
private _xClass = toLowerANSI configName _x;
private _baseAttachment = _xClass call FUNC(baseAttachment);
if (_baseAttachment != "" && {_baseAttachment != _xClass}) then {
TRACE_2("updating baseAttachment",_xClass,_baseAttachment);
_baseWeaponCache set [_xClass, _baseAttachment];
};
} forEach (_isScriptedAttachment configClasses _cfgWeapons);

View File

@ -244,7 +244,7 @@ _for do {
// Sort alphabetically, find the previously selected item and select it again
if (_right) then {
[_panel, 1] lnbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, false];
[_panel, 1] lnbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, true]; // do not support unicode, as it's much more performance intensive (~3x more)
_for do {
// Remove sorting text, as it blocks the item name otherwise
@ -258,7 +258,7 @@ if (_right) then {
};
};
} else {
_panel lbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, false];
_panel lbSortBy ["TEXT", _sortDirection == ASCENDING, false, true, true]; // do not support unicode, as it's much more performance intensive (~3x more)
_for do {
_item = _panel lbData _i;

View File

@ -17,7 +17,7 @@ params ["", "_config"];
TRACE_1("statTextStatement_binoVisionMode",_config);
private _text = [];
private _visionModes = getArray (_config >> "visionMode") apply {toLower _x};
private _visionModes = getArray (_config >> "visionMode") apply {toLowerANSI _x};
{
if (_x in _visionModes) then {
_text pushBack (localize ([LSTRING(VisionNormal), LSTRING(VisionNight), LSTRING(VisionThermal)] select _forEachIndex));

View File

@ -0,0 +1,26 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
* Text statement for the load stat.
*
* Arguments:
* 0: Stats <ARRAY>
* 1: Item config path <CONFIG>
*
* Return Value:
* Stat Text <STRING>
*
* Public: No
*/
params ["_stats", "_config"];
TRACE_2("statTextStatement_load",_stats,_config);
if (!isNull (_config >> "ItemInfo" >> "containerClass")) then { // Uniform/Vest
_config = configfile >> "CfgVehicles" >> getText (_config >> "ItemInfo" >> "containerClass");
};
private _load = getNumber (_config >> (_stats # 0));
if (_load <= 0) exitWith { LELSTRING(common,none) };
format ["%1kg (%2lb)", (_load * 0.1 * (1 / 2.2046)) toFixed 2, (_load * 0.1) toFixed 2]

View File

@ -17,7 +17,7 @@ params ["", "_config"];
TRACE_1("statTextStatement_scopeVisionMode",_config);
private _opticsModes = ("true" configClasses (_config >> "ItemInfo" >> "OpticsModes")) apply {
private _visionMode = getArray (_x >> "visionMode") apply {toLower _x};
private _visionMode = getArray (_x >> "visionMode") apply {toLowerANSI _x};
[
getNumber (_x >> "useModelOptics") == 1, // Is in optics
_visionMode isEqualTo [], // Optional NVG

View File

@ -63,8 +63,12 @@ private _indexCurrentItems = -1;
};
// Backpack
case IDX_LOADOUT_BACKPACK: {
GVAR(currentItems) set [IDX_CURR_BACKPACK, _x param [0, ""]];
GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, _x param [1, []]];
_x params [["_backpack", ""], ["_items", []]];
if (_backpack != "") then {
_backpack = [_backpack, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
};
GVAR(currentItems) set [IDX_CURR_BACKPACK, _backpack];
GVAR(currentItems) set [IDX_CURR_BACKPACK_ITEMS, _items];
};
// Helmet
case IDX_LOADOUT_HEADGEAR: {

View File

@ -101,6 +101,11 @@ private _fnc_uniqueEquipment = {
case IDX_LOADOUT_BACKPACK: {
_x params [["_containerClass", ""]];
// Handle preset (loaded/AI) backpacks
if (_containerClass != "" && _forEachIndex == IDX_LOADOUT_BACKPACK) then {
_containerClass = [_containerClass, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
};
// Remove all unique equipment in tab; Add container as a unique equipment
[GVAR(virtualItems) get (_forEachIndex + 1), _containerClass] call _fnc_uniqueEquipment;
};

View File

@ -13,6 +13,8 @@
* Public: No
*/
#define NOT_IN_ARSENAL !(_name in GVAR(virtualItemsFlat))
params ["_loadout"];
private _extendedInfo = createHashMap;
@ -40,11 +42,22 @@ private _fnc_filterLoadout = {
_nullItemsList pushBack _x;
} else {
// Check if item or its base weapon exist in the arsenal
if !(_name in GVAR(virtualItemsFlat)) then {
if NOT_IN_ARSENAL then {
_name = _name call FUNC(baseWeapon);
if !(_name in GVAR(virtualItemsFlat)) then {
_unavailableItemsList pushBack _name;
_name = "";
if NOT_IN_ARSENAL then {
// This could be a backpack
private _temp = [_name, "CfgVehicles"] call CBA_fnc_getNonPresetClass;
if (_temp == "") then { // It's not
_unavailableItemsList pushBack _name;
_name = "";
} else { // It is
_name = _temp;
// Check if it's available again
if NOT_IN_ARSENAL then {
_unavailableItemsList pushBack _name;
_name = "";
};
};
};
};
};

View File

@ -1191,7 +1191,7 @@
<Chinesesimp>支持夜视仪</Chinesesimp>
<Czech>Podpora nočního vidění</Czech>
<Turkish>Gece Görüş Desteği</Turkish>
<Korean>야간투시 지원여부</Korean>
<Korean>야간투시 지원</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_supPrim">
<English>Primary supported</English>
@ -1206,7 +1206,7 @@
<Chinese>主武器支援</Chinese>
<Chinesesimp>主镜支持</Chinesesimp>
<Czech>Hlavní část hledí podporuje</Czech>
<Korean>주무기 지원여부</Korean>
<Korean>주무기 지원</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_supSec">
<English>Secondary supported</English>
@ -1221,7 +1221,7 @@
<Chinese>次要武器支援</Chinese>
<Chinesesimp>副镜支持</Chinesesimp>
<Czech>Vedlejší část hledí podporuje</Czech>
<Korean>보조무기 지원여부</Korean>
<Korean>보조무기 지원</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrim">
<English>Primary integrated</English>
@ -1236,17 +1236,21 @@
<Chinese>整合主武器</Chinese>
<Chinesesimp>主镜内置</Chinesesimp>
<Czech>Integrováno do hlavní části hledí</Czech>
<Korean>주무기 내장여부</Korean>
<Korean>주무기 내장</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_ti">
<English>Thermal integrated</English>
<Italian>Termico integrato</Italian>
<Japanese>熱画像装置内蔵</Japanese>
<Russian>Интегрирован в тепловизор.</Russian>
<Russian>Интегрирован тепловизор.</Russian>
<Korean>열화상 내장</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrimTi">
<English>Thermal &amp; Primary integrated</English>
<Italian>Termico e Primario integrato</Italian>
<Japanese>熱画像装置内蔵・プライマリに内蔵</Japanese>
<Russian>Интегрирован в тепловизор и осн.прицел.</Russian>
<Russian>Интегрирован тепловизор и осн.прицел.</Russian>
<Korean>열화상과 주무기 내장</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_NoSup">
<English>Not Supported</English>

View File

@ -22,10 +22,10 @@ private _ctrlElevationHigh = _dialog displayCtrl IDC_BUTTON_ELEV_HIGH;
private _ctrlElevationLow = _dialog displayCtrl IDC_BUTTON_ELEV_LOW;
GVAR(lastElevationMode) = param [0, GVAR(lastElevationMode)]; // update if passed a new value
GVAR(lastCharge) = lbCurSel _ctrlChargeList;
GVAR(lastTablePage) = lbCurSel _ctrlChargeList;
// get data for currently selected mag/mode combo:
(GVAR(magModeData) select GVAR(lastCharge)) params [["_muzzleVelocity", -1], ["_airFriction", 0]];
(GVAR(magModeData) select GVAR(lastTablePage)) params [["_muzzleVelocity", -1], ["_airFriction", 0]];
private _elevMin = _dialog getVariable [QGVAR(elevMin), 0];
private _elevMax = _dialog getVariable [QGVAR(elevMax), 0];
_ctrlElevationHigh ctrlSetTextColor ([[0.25,0.25,0.25,1],[1,1,1,1]] select GVAR(lastElevationMode));

View File

@ -1,8 +1,10 @@
#include "script_component.hpp"
if (!hasInterface) exitWith {};
#include "initKeybinds.inc.sqf"
GVAR(active) = false;
GVAR(initialised) = false;
[QEGVAR(vector,rangefinderData), {_this call FUNC(sord)}] call CBA_fnc_addEventHandler;
[QEGVAR(vector,rangefinderData), LINKFUNC(sord)] call CBA_fnc_addEventHandler;

View File

@ -57,7 +57,7 @@ if (!_isChemlight) then {
_unit addItem _itemName;
};
if (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then {
if (toLowerANSI _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then {
// Hack for dealing with X_IR_Grenade effect not dissapearing on deleteVehicle
detach _attachedObject;
_attachedObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]);

View File

@ -25,14 +25,14 @@ if (isServer) then {
};
["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler;
[QGVAR(moveInCaptive), FUNC(vehicleCaptiveMoveIn)] call CBA_fnc_addEventHandler;
[QGVAR(moveOutCaptive), FUNC(vehicleCaptiveMoveOut)] call CBA_fnc_addEventHandler;
[QGVAR(moveInCaptive), LINKFUNC(vehicleCaptiveMoveIn)] call CBA_fnc_addEventHandler;
[QGVAR(moveOutCaptive), LINKFUNC(vehicleCaptiveMoveOut)] call CBA_fnc_addEventHandler;
[QGVAR(setHandcuffed), FUNC(setHandcuffed)] call CBA_fnc_addEventHandler;
[QGVAR(setSurrendered), FUNC(setSurrendered)] call CBA_fnc_addEventHandler;
[QGVAR(setHandcuffed), LINKFUNC(setHandcuffed)] call CBA_fnc_addEventHandler;
[QGVAR(setSurrendered), LINKFUNC(setSurrendered)] call CBA_fnc_addEventHandler;
//Medical Integration Events
["ace_unconscious", FUNC(handleOnUnconscious)] call CBA_fnc_addEventHandler;
["ace_unconscious", LINKFUNC(handleOnUnconscious)] call CBA_fnc_addEventHandler;
if (!hasInterface) exitWith {};

View File

@ -27,7 +27,7 @@ if (_isUnconc) then {
};
} else {
//Woke up: if handcuffed, goto animation
if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then {
if (_unit getVariable [QGVAR(isHandcuffed), false] && {isNull objectParent _unit}) then {
[_unit] call EFUNC(common,fixLoweredRifleAnimation);
[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
};

View File

@ -486,7 +486,7 @@
<Chinesesimp>设置在光标下的单位成俘虏状态。</Chinesesimp>
<Korean>커서의 병력을 포박합니다.</Korean>
<Polish>Ustawia jednostkę pod kursorem jako jeniec.</Polish>
<Russian>Арестовывает указанный курсором юнит</Russian>
<Russian>Арестовывает указанный курсором юнит.</Russian>
<Portuguese>Torna a unidade sob o cursor um prisioneiro</Portuguese>
<French>Capture l'unité sous le curseur.</French>
<Czech>Nastaví jednotku pod kurzorem jako zajatce.</Czech>

View File

@ -35,8 +35,10 @@
</Key>
<Key ID="STR_ACE_Cargo_deployObject">
<English>Deploy</English>
<Italian>Piazza</Italian>
<Russian>Разместить</Russian>
<Japanese>配置する</Japanese>
<Korean>배치하기</Korean>
</Key>
<Key ID="STR_ACE_Cargo_ScrollAction">
<English>Raise/Lower | (Ctrl + Scroll) Rotate</English>
@ -279,14 +281,18 @@
<Key ID="STR_ACE_Cargo_LoadingItem">
<English>Loading %1 into %2...</English>
<Spanish>Cargando %1 en %2...</Spanish>
<Italian>Caricando %1 in %2...</Italian>
<Japanese>%1 を %2 に積み込んでいます・・・</Japanese>
<Russian>Загружаем %1 в %2...</Russian>
<Korean>%1을(를) %2에 싣는 중...</Korean>
</Key>
<Key ID="STR_ACE_Cargo_UnloadingItem">
<English>Unloading %1 from %2...</English>
<Spanish>Descargando %1 de %2...</Spanish>
<Italian>Scaricando %1 da %2...</Italian>
<Japanese>%1 を %2 から降ろしています・・・</Japanese>
<Russian>Выгружаем %1 из %2...</Russian>
<Korean>%1을(를) %2(으)로부터 내리는 중...</Korean>
</Key>
<Key ID="STR_ACE_Cargo_LoadingFailed">
<English>%1&lt;br/&gt;could not be loaded</English>
@ -507,7 +513,7 @@
<Japanese>貨物の積み込み/積み下ろしに掛かる時間を変更します。\n時間 (秒) は、貨物のサイズにこの値を掛けたものです。</Japanese>
<Polish>Modyfikuje, jak długo zajmuje załadowywanie/wyładowywanie przedmiotów. \nCzasem, w sekundach, jest wielkość przedmiotu razy jego wartość.</Polish>
<Italian>Modifica il tempo impiegato per caricare o scaricare gli oggetti.\nIl tempo, in secondi, equivale alla dimensione dell'oggetto moltiplicata per questo valore</Italian>
<Russian>Изменяет время для загрузки/выгрузки предметов. \n Время (сек) - это размер предмета, умноженный на это значение.</Russian>
<Russian>Изменяет время для загрузки/выгрузки предметов. \nВремя (сек) - это размер предмета, умноженный на это значение.</Russian>
<Portuguese>Coeficiente de quanto tempo leva para carregar/descarregar itens.\nTempo, em segundos, é o tamanho do objeto multiplicado por esse valor.</Portuguese>
<French>Modifie le temps nécessaire pour charger/décharger des objets.\nLe temps, en secondes, est calculé en multipliant la taille de l'élément par ce coefficient.</French>
<Chinese>修改要花多長時間來裝載/卸載物品。\n時間以秒為單位而物品的大小數值與這個係數成比。</Chinese>
@ -570,13 +576,17 @@
</Key>
<Key ID="STR_ACE_Cargo_enableDeploy">
<English>Enable deploy</English>
<Italian>Abilita Piazzamento</Italian>
<Russian>Включить размещение</Russian>
<Japanese>配置機能を有効化</Japanese>
<Korean>배치 활성화</Korean>
</Key>
<Key ID="STR_ACE_Cargo_enableDeploy_description">
<English>Controls whether cargo items can be unloaded via the deploy method.</English>
<Italian>Determina se oggetti in carico possono essere scaricati e piazzati direttamente.</Italian>
<Russian>Определяет, можно ли выгружать грузы с помощью метода размещения.</Russian>
<Japanese>配置機能を介して貨物アイテムを降ろすことが出来るかどうかを制御します。</Japanese>
<Korean>배치 방법을 통해 화물 아이템을 내릴 수 있는지 여부를 제어합니다.</Korean>
</Key>
</Package>
</Project>

View File

@ -4,4 +4,4 @@ if (!hasInterface || !GVAR(enabled)) exitWith {};
GVAR(cachedCasings) = createHashMap;
GVAR(casings) = [];
["CAManBase", "FiredMan", {call FUNC(createCasing)}] call CBA_fnc_addClassEventHandler;
["CAManBase", "FiredMan", LINKFUNC(createCasing)] call CBA_fnc_addClassEventHandler;

View File

@ -40,6 +40,8 @@ if (isNil "_modelPath") then {
case "FxCartridge_12Gauge_Slug_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_slug_lxws.p3d" };
case "FxCartridge_12Gauge_Smoke_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_smoke_lxws.p3d" };
case "FxCartridge_12Gauge_Pellet_lxWS": { "lxWS\weapons_1_f_lxws\Ammo\cartridge_pellet_lxws.p3d" };
case "CUP_FxCartridge_545": { "CUP\Weapons\CUP_Weapons_Ammunition\magazines\cartridge545.p3d" };
case "CUP_FxCartridge_939": { "CUP\Weapons\CUP_Weapons_Ammunition\magazines\cartridge939.p3d" };
case "": { "" };
default { "A3\Weapons_f\ammo\cartridge.p3d" };
};

View File

@ -2,6 +2,6 @@
if (!hasInterface) exitWith {};
["ace_firedPlayer", DFUNC(throwEH)] call CBA_fnc_addEventHandler;
// ["ace_firedPlayerNonLocal", DFUNC(throwEH)] call CBA_fnc_addEventHandler;
// ["ace_firedNonPlayer", DFUNC(throwEH)] call CBA_fnc_addEventHandler;
["ace_firedPlayer", LINKFUNC(throwEH)] call CBA_fnc_addEventHandler;
// ["ace_firedPlayerNonLocal", LINKFUNC(throwEH)] call CBA_fnc_addEventHandler;
// ["ace_firedNonPlayer", LINKFUNC(throwEH)] call CBA_fnc_addEventHandler;

View File

@ -1,5 +1,9 @@
class CfgMovesBasic {
class Default;
// Idle affects legs when weapon switching - fixes units sliding when holstering weapons
class Default {
idle = "";
};
// From ACRE
class ManActions {
GVAR(stop) = QGVAR(stop);

View File

@ -13,6 +13,7 @@ PREP(addLineToDebugDraw);
PREP(addSwayFactor);
PREP(addToInventory);
PREP(addWeapon);
PREP(adjustMagazineAmmo);
PREP(assignedItemFix);
PREP(assignObjectsInList);
PREP(ambientBrightness);

View File

@ -18,7 +18,7 @@
//////////////////////////////////////////////////
//Status Effect EHs:
[QGVAR(setStatusEffect), {_this call FUNC(statusEffect_set)}] call CBA_fnc_addEventHandler;
[QGVAR(setStatusEffect), LINKFUNC(statusEffect_set)] call CBA_fnc_addEventHandler;
["forceWalk", false, ["ace_advanced_fatigue", "ACE_SwitchUnits", "ACE_Attach", "ace_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_Sandbag", "ACE_refuel", "ACE_rearm", "ACE_Trenches", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
["blockSprint", false, ["ace_advanced_fatigue", "ace_dragging", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
["setCaptive", true, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered)]] call FUNC(statusEffect_addType);
@ -162,9 +162,9 @@ if (isServer) then {
INFO_2("Headbug Used: Name: %1, Animation: %2",_profileName,_animation);
}] call CBA_fnc_addEventHandler;
[QGVAR(fixCollision), FUNC(fixCollision)] call CBA_fnc_addEventHandler;
[QGVAR(fixFloating), FUNC(fixFloating)] call CBA_fnc_addEventHandler;
[QGVAR(fixPosition), FUNC(fixPosition)] call CBA_fnc_addEventHandler;
[QGVAR(fixCollision), LINKFUNC(fixCollision)] call CBA_fnc_addEventHandler;
[QGVAR(fixFloating), LINKFUNC(fixFloating)] call CBA_fnc_addEventHandler;
[QGVAR(fixPosition), LINKFUNC(fixPosition)] call CBA_fnc_addEventHandler;
["ace_loadPersonEvent", LINKFUNC(loadPersonLocal)] call CBA_fnc_addEventHandler;
["ace_unloadPersonEvent", LINKFUNC(unloadPersonLocal)] call CBA_fnc_addEventHandler;
@ -214,8 +214,8 @@ if (isServer) then {
}] call CBA_fnc_addEventHandler;
// Request framework
[QGVAR(requestCallback), FUNC(requestCallback)] call CBA_fnc_addEventHandler;
[QGVAR(receiveRequest), FUNC(receiveRequest)] call CBA_fnc_addEventHandler;
[QGVAR(requestCallback), LINKFUNC(requestCallback)] call CBA_fnc_addEventHandler;
[QGVAR(receiveRequest), LINKFUNC(receiveRequest)] call CBA_fnc_addEventHandler;
[QGVAR(systemChatGlobal), {systemChat _this}] call CBA_fnc_addEventHandler;
@ -224,7 +224,7 @@ if (isServer) then {
[QGVAR(enableSimulationGlobal), {(_this select 0) enableSimulationGlobal (_this select 1)}] call CBA_fnc_addEventHandler;
[QGVAR(setShotParents), {(_this select 0) setShotParents [_this select 1, _this select 2]}] call CBA_fnc_addEventHandler;
["ace_setOwner", {(_this select 0) setOwner (_this select 1)}] call CBA_fnc_addEventHandler;
[QGVAR(serverLog), FUNC(serverLog)] call CBA_fnc_addEventHandler;
[QGVAR(serverLog), LINKFUNC(serverLog)] call CBA_fnc_addEventHandler;
[QGVAR(claimSafe), LINKFUNC(claimSafeServer)] call CBA_fnc_addEventHandler;
};
@ -241,14 +241,14 @@ if (!isServer) then {
["ACEa", [player]] call CBA_fnc_serverEvent;
}] call CBA_fnc_addEventHandler;
} else {
["ACEa", FUNC(_handleRequestAllSyncedEvents)] call CBA_fnc_addEventHandler;
["ACEa", LINKFUNC(_handleRequestAllSyncedEvents)] call CBA_fnc_addEventHandler;
};
["ACEe", FUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
["ACEs", FUNC(_handleRequestSyncedEvent)] call CBA_fnc_addEventHandler;
["ACEe", LINKFUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
["ACEs", LINKFUNC(_handleRequestSyncedEvent)] call CBA_fnc_addEventHandler;
if (isServer) then {
[FUNC(syncedEventPFH), 0.5, []] call CBA_fnc_addPerFrameHandler;
[LINKFUNC(syncedEventPFH), 0.5, []] call CBA_fnc_addPerFrameHandler;
};
@ -366,7 +366,7 @@ addMissionEventHandler ["PlayerViewChanged", {
private _position = [player] call FUNC(getUavControlPosition);
private _seatAI = objNull;
private _turret = [];
switch (toLower _position) do {
switch (toLowerANSI _position) do {
case (""): {
_UAV = objNull; // set to objNull if not actively controlling
};
@ -397,8 +397,8 @@ addMissionEventHandler ["PlayerViewChanged", {
// Eventhandlers for player controlled machines
//////////////////////////////////////////////////
[QGVAR(displayTextStructured), {_this call FUNC(displayTextStructured)}] call CBA_fnc_addEventHandler;
[QGVAR(displayTextPicture), {_this call FUNC(displayTextPicture)}] call CBA_fnc_addEventHandler;
[QGVAR(displayTextStructured), LINKFUNC(displayTextStructured)] call CBA_fnc_addEventHandler;
[QGVAR(displayTextPicture), LINKFUNC(displayTextPicture)] call CBA_fnc_addEventHandler;
["ace_unconscious", {
params ["_unit", "_isUnconscious"];
@ -408,7 +408,7 @@ addMissionEventHandler ["PlayerViewChanged", {
};
}] call CBA_fnc_addEventHandler;
["ace_useItem", DFUNC(useItem)] call CBA_fnc_addEventHandler;
["ace_useItem", LINKFUNC(useItem)] call CBA_fnc_addEventHandler;
//////////////////////////////////////////////////
@ -504,10 +504,24 @@ GVAR(reloadMutex_lastMagazines) = [];
// Start the sway loop
//////////////////////////////////////////////////
["CBA_settingsInitialized", {
["multiplier", {
switch (true) do {
case (isWeaponRested ACE_player): {
GVAR(swayFactor) * GVAR(restedSwayFactor)
};
case (isWeaponDeployed ACE_player): {
GVAR(swayFactor) * GVAR(deployedSwayFactor)
};
default {
GVAR(swayFactor)
};
};
}, QUOTE(ADDON)] call FUNC(addSwayFactor);
[{
// frame after settingsInitialized to ensure all other addons have added their factors
if ((GVAR(swayFactorsBaseline) + GVAR(swayFactorsMultiplier)) isNotEqualTo []) then {
call FUNC(swayLoop)
if (GVAR(enableSway)) then {
call FUNC(swayLoop);
};
// check for pre-3.16 sway factors being added
if (!isNil {missionNamespace getVariable "ACE_setCustomAimCoef"}) then {

View File

@ -13,7 +13,7 @@ private _allPatches = "(configName _x) select [0,3] == 'ace'" configClasses (con
// Get all units[]
private _allUnits = [];
{
_allUnits append ((getArray (_x >> "units")) apply { toLower _x });
_allUnits append ((getArray (_x >> "units")) apply { toLowerANSI _x });
} forEach _allPatches;
{
private _class = configFile >> "CfgVehicles" >> _x;
@ -31,7 +31,7 @@ private _allUnits = [];
// Get all weapons[]
private _allWeapons = [];
{
_allWeapons append ((getArray (_x >> "weapons")) apply { toLower _x });
_allWeapons append ((getArray (_x >> "weapons")) apply { toLowerANSI _x });
} forEach _allPatches;
{
private _class = configFile >> "CfgWeapons" >> _x;
@ -50,7 +50,7 @@ private _allWeapons = [];
private _vics = "(configName _x) select [0,3] == 'ace'" configClasses (configFile >> "CfgVehicles");
{
if (((getNumber (_x >> "scope")) == 2) || {((getNumber (_x >> "scopeCurator")) == 2)}) then {
if (!((toLower configName _x) in _allUnits)) then {
if (!((toLowerANSI configName _x) in _allUnits)) then {
WARNING_2("Not in any units[] - %1 from %2",configName _x,configSourceMod _x);
_testPass = false;
};
@ -60,9 +60,9 @@ private _vics = "(configName _x) select [0,3] == 'ace'" configClasses (configFil
// Check if all public weapons are defined in a cfgPatch
private _weapons = "(configName _x) select [0,3] == 'ace'" configClasses (configFile >> "CfgWeapons");
{
private _type = toLower configName _x;
private _type = toLowerANSI configName _x;
if (((getNumber (_x >> "scope")) == 2) || {((getNumber (_x >> "scopeCurator")) == 2)}) then {
if (!((toLower configName _x) in _allWeapons)) then {
if (!((toLowerANSI configName _x) in _allWeapons)) then {
WARNING_2("Not in any weapons[] - %1 from %2",configName _x,configSourceMod _x);
_testPass = false;
};

View File

@ -14,7 +14,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
private _glassesConfig = configFile >> "CfgGlasses" >> _name;
if (((!isClass _weaponConfig) || {(getNumber (_weaponConfig >> "type")) in [1,2,4]}) && {!isClass _glassesConfig}) then {
diag_log text format ["%1 -> TransportItems -> %2 = Bad", _vehType, _name];
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
};
};
} forEach (configProperties [_x >> "TransportItems", "isClass _x", true]);
@ -23,7 +23,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
private _weaponConfig = configFile >> "CfgWeapons" >> _name;
if ((!isClass _weaponConfig) || {!((getNumber (_weaponConfig >> "type")) in [1,2,4])}) then {
diag_log text format ["%1 -> TransportWeapons -> %2 = Bad", _vehType, _name];
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
};
} forEach (configProperties [_x >> "TransportWeapons", "isClass _x", true]);
{
@ -31,7 +31,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
private _magConfig = configFile >> "CfgMagazines" >> _name;
if ((!isClass _magConfig)) then {
diag_log text format ["%1 -> TransportMagazines -> %2 = Bad", _vehType, _name];
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
};
} forEach (configProperties [_x >> "TransportMagazines", "isClass _x", true]);
{
@ -39,7 +39,7 @@ private _vehicles = configProperties [configFile >> "CfgVehicles", "(isClass _x)
private _vehConfig = configFile >> "CfgVehicles" >> _name;
if ((!isClass _vehConfig)) then {
diag_log text format ["%1 -> TransportBackpacks -> %2 = Bad", _vehType, _name];
if ("ace" in toLower (_vehType + _name)) then { _testPass = false; };
if ("ace" in toLowerANSI (_vehType + _name)) then { _testPass = false; };
};
} forEach (configProperties [_x >> "TransportBackpacks", "isClass _x", true]);
} forEach _vehicles;

View File

@ -18,7 +18,7 @@
params ["_conditionName", "_conditionFunc"];
_conditionName = toLower _conditionName;
_conditionName = toLowerANSI _conditionName;
private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]];
_conditions params ["_conditionNames", "_conditionFuncs"];

View File

@ -18,7 +18,7 @@
*/
params ["_type", "_code", "_id"];
_type = toLower _type;
_type = toLowerANSI _type;
if !(_type in ["baseline", "multiplier"]) exitWith { ERROR_2("%1-%2 type unsupported",_type,_id); false };

View File

@ -24,7 +24,7 @@ if (_name in GVAR(syncedEvents)) exitWith {
false
};
private _eventId = [_name, FUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
private _eventId = [_name, LINKFUNC(_handleSyncedEvent)] call CBA_fnc_addEventHandler;
private _data = [_handler, [], _ttl, _eventId];
GVAR(syncedEvents) set [_name, _data];

View File

@ -112,13 +112,13 @@ switch (_type select 0) do {
switch (_container) do {
case "vest": {
_unit addItemToVest _classname; //@todo Bug! A full magazine, ignoring ammo. No such command.
(vestContainer _unit) addMagazineAmmoCargo [_classname, 1, _ammoCount];
};
case "backpack": {
_unit addItemToBackpack _classname; //@todo Bug! A full magazine, ignoring ammo. No such command.
(backpackContainer _unit) addMagazineAmmoCargo [_classname, 1, _ammoCount];
};
case "uniform": {
_unit addItemToUniform _classname; //@todo Bug! A full magazine, ignoring ammo. No such command.
(uniformContainer _unit) addMagazineAmmoCargo [_classname, 1, _ammoCount];
};
default {
_unit addMagazine [_classname, _ammoCount];
@ -130,7 +130,7 @@ switch (_type select 0) do {
private _pos = _unit modelToWorldVisual [0,1,0.05];
_unit = createVehicle ["WeaponHolder_Single_F", _pos, [], 0, "NONE"];
_unit addMagazineCargoGlobal [_classname, 1/*_ammoCount*/]; //@todo Bug! This isn't really the ammo, but magazine count. No such command.
_unit addMagazineAmmoCargo [_classname, 1, _ammoCount];
_unit setPosATL _pos;
};
};

View File

@ -0,0 +1,107 @@
#include "..\script_component.hpp"
/*
* Author: Katalam, Blue, Brett Mayson, johnb43
* Handle adjusting a magazine's ammo
*
* Arguments:
* 0: Vehicle or Unit <OBJECT>
* 1: Item <STRING>
* 2: Ammo to adjust by <NUMBER> (default: -1)
*
* Return Value:
* How much the ammo was adjusted by <NUMBER>
*
* Example:
* [player, "30Rnd_556x45_Stanag", 1] call ace_common_fnc_adjustMagazineAmmo;
*
* Public: No
*/
params ["_unit", "_magazine", ["_count", -1]];
if (_count == 0) exitWith {0};
private _containers = if (_unit isKindOf "CAManBase") then {
[uniformContainer _unit, vestContainer _unit, backpackContainer _unit]
} else {
[_unit]
};
scopeName "main";
private _originalCount = _count;
private _container = objNull;
private _magazinesContainer = [];
private _newAmmoCount = 0;
private _removeAmmo = _count < 0;
private _maxMagazineAmmo = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count");
{
_container = _x;
// Get all magazines of _magazine type
_magazinesContainer = (magazinesAmmoCargo _container) select {_x select 0 == _magazine};
// Get the ammo count, filter out magazines with 0 ammo
_magazinesContainer = (_magazinesContainer apply {_x select 1}) select {_x != 0};
// If there are none, skip to next container
if (_magazinesContainer isEqualTo []) then {
continue;
};
// Sort, smallest first when removing, largest first when adding
_magazinesContainer sort _removeAmmo;
if (_removeAmmo) then {
{
_count = _x + _count;
_container addMagazineAmmoCargo [_magazine, -1, _x];
if (_count >= 0) then {
// Only add magazine back if it's not empty
if (_count != 0) then {
_container addMagazineAmmoCargo [_magazine, 1, _count];
};
_originalCount breakOut "main";
};
} forEach _magazinesContainer;
} else {
// This loop only fills up partially filled magazines
{
// Fill the magazine to either its max or until all ammo has been added
_newAmmoCount = (_x + _count) min _maxMagazineAmmo;
if (_newAmmoCount <= _maxMagazineAmmo) then {
_container addMagazineAmmoCargo [_magazine, -1, _x];
_container addMagazineAmmoCargo [_magazine, 1, _newAmmoCount];
};
// Remove the ammo that was added
_count = _count - (_newAmmoCount - _x);
if (_count <= 0) then {
_originalCount breakOut "main";
};
} forEach (_magazinesContainer select {_x < _maxMagazineAmmo});
};
} forEach _containers;
// If there is still remaining ammo to add, try add it after having iterated through all containers
if (!_removeAmmo && _count > 0) then {
{
while {_count > 0 && {_x canAdd [_magazine, 1/* 2.18 , true*/]}} do {
_x addMagazineAmmoCargo [_magazine, 1, _count];
_count = _count - _maxMagazineAmmo;
};
} forEach _containers;
if (_count <= 0) then {
_originalCount breakOut "main";
};
};
_originalCount - _count

View File

@ -24,7 +24,7 @@
params ["_unit", "_vehicle", "_position", ["_checkDistance", false], ["_index", -1]];
_position = toLower _position;
_position = toLowerANSI _position;
// general
if (!alive _vehicle || {locked _vehicle > 1}) exitWith {false};

View File

@ -19,7 +19,7 @@
params ["_unit", "_target", ["_exceptions", []]];
_exceptions = _exceptions apply {toLower _x};
_exceptions = _exceptions apply {toLowerANSI _x};
private _owner = _target getVariable [QGVAR(owner), objNull];

View File

@ -104,7 +104,7 @@ TRACE_1("Reading settings from missionConfigFile",_countOptions);
for "_index" from 0 to (_countOptions - 1) do {
private _optionEntry = _missionSettingsConfig select _index;
private _settingName = configName _optionEntry;
if ((toLower _settingName) in GVAR(cbaSettings_forcedSettings)) then {
if ((toLowerANSI _settingName) in GVAR(cbaSettings_forcedSettings)) then {
WARNING_1("Setting [%1] - Already Forced - ignoring missionConfig",_varName);
} else {
if ((isNil _settingName) && {(getNumber (_settingsConfig >> _settingName >> "movedToSQF")) == 0}) then {

View File

@ -44,7 +44,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x
private _cbaIsGlobal = (!_isClientSettable) || _isForced;
private _warnIfChangedMidMission = _cbaIsGlobal && {(getNumber (_config >> "canBeChanged")) == 0};
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLower _varName);};
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLowerANSI _varName);};
// Basic handling of setting types CBA doesn't support:
if (_typeName == "ARRAY") exitWith {

View File

@ -34,7 +34,7 @@ private _category = getText (_config >> "category");
private _cbaIsGlobal = (!_isClientSettable) || _isForced;
private _warnIfChangedMidMission = _cbaIsGlobal && {(getNumber (_config >> "canBeChanged")) == 0};
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLower _varName);};
if (_isForced) then {GVAR(cbaSettings_forcedSettings) pushBack (toLowerANSI _varName);};
// Basic handling of setting types CBA doesn't support:
if (_typeName == "ARRAY") exitWith {
@ -103,4 +103,3 @@ private _return = [_varName, _cbaSettingType, [_localizedName, _localizedDescrip
TRACE_1("returned",_return);
if ((isNil "_return") || {!_return}) then {ERROR_1("Setting [%1] - CBA Error",_varName);};
_return

View File

@ -40,7 +40,7 @@ if ([_cbaRequiredAr, _cbaVersionAr] call cba_versioning_fnc_version_compare) the
};
//private _addons = activatedAddons; // broken with High-Command module, see #2134
private _addons = (cba_common_addons select {(_x select [0,4]) == "ace_"}) apply {toLower _x};
private _addons = (cba_common_addons select {(_x select [0,4]) == "ace_"}) apply {toLowerANSI _x};
private _oldAddons = [];
private _oldSources = [];
private _oldCompats = [];
@ -87,7 +87,7 @@ if (_oldCompats isNotEqualTo []) then {
///////////////
// check extensions
///////////////
private _platform = toLower (productVersion select 6);
private _platform = toLowerANSI (productVersion select 6);
if (!isServer && {_platform in ["linux", "osx"]}) then {
// Linux and OSX client ports do not support extensions at all
INFO("Operating system does not support extensions");

View File

@ -25,7 +25,7 @@ params ["_mode", ["_checkAll", false], ["_whitelist", "", [""]]];
TRACE_3("params",_mode,_checkAll,_whitelist);
//lowercase and convert whiteList String into array of strings:
_whitelist = toLower _whitelist;
_whitelist = toLowerANSI _whitelist;
_whitelist = _whitelist splitString "[,""']";
TRACE_1("Array",_whitelist);

View File

@ -17,6 +17,6 @@
params ["_unit"];
if (currentWeapon _unit != "" && {currentWeapon _unit == primaryWeapon _unit} && {weaponLowered _unit} && {stance _unit == "STAND"} && {vehicle _unit == _unit}) then {
if (currentWeapon _unit != "" && {currentWeapon _unit == primaryWeapon _unit} && {weaponLowered _unit} && {stance _unit == "STAND"} && {isNull objectParent _unit}) then {
[_unit, "amovpercmstpsraswrfldnon", 0] call FUNC(doAnimation);
};

View File

@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
* Author: Dedmen
* Author: Dedmen, Blue, johnb43
* Return how many items of type _itemType the player has in his containers (Uniform, Vest, Backpack)
* Doesn't count assignedItems, weapons, weapon attachments, magazines in weapons
*
@ -19,13 +19,17 @@
params ["_unit", "_itemType"];
private _countItemsInContainer = {
(getItemCargo _this) params ["_itemTypes", "_itemCounts"];
private _count = 0;
private _isMagazine = isClass (configFile >> "CfgMagazines" >> _itemType);
private _index = _itemTypes find _itemType;
_itemCounts param [_index, 0]
};
{
(if (_isMagazine) then {
getMagazineCargo _x
} else {
getItemCargo _x
}) params ["_itemTypes", "_itemCounts"];
((uniformContainer _unit) call _countItemsInContainer) +
((vestContainer _unit) call _countItemsInContainer) +
((backpackContainer _unit) call _countItemsInContainer)
_count = _count + (_itemCounts param [_itemTypes find _itemType, 0]);
} forEach [uniformContainer _unit, vestContainer _unit, backpackContainer _unit];
_count

View File

@ -29,7 +29,7 @@ private _unitActionsCfg = configFile >> "CfgMovesBasic" >> "Actions" >> getText
TRACE_2("Animation/Action",configName _unitAnimationCfg,configName _unitActionsCfg);
if (vehicle _unit != _unit) then {
if (!isNull objectParent _unit) then {
private _interpolateArray = getArray (_unitAnimationCfg >> "interpolateTo");
for "_index" from 0 to (count _interpolateArray - 1) step 2 do {

View File

@ -17,7 +17,7 @@
params ["_unit"];
private _anim = toLower animationState _unit;
private _anim = toLowerANSI animationState _unit;
// stance is broken for some animations.
private _stance = stance _unit;

View File

@ -19,7 +19,7 @@
params [["_vehicle", objNull, [objNull]], ["_weapon", "", [""]]];
// on foot
if (gunner _vehicle == _vehicle && {_weapon in weapons _vehicle || {toLower _weapon in ["throw", "put"]}}) exitWith {gunner _vehicle};
if (gunner _vehicle == _vehicle && {_weapon in weapons _vehicle || {toLowerANSI _weapon in ["throw", "put"]}}) exitWith {gunner _vehicle};
// inside vehicle
private _gunner = objNull;

View File

@ -23,7 +23,7 @@
params ["_unit", "_vehicle", "_position", ["_index", -1]];
_position = toLower _position;
_position = toLowerANSI _position;
// general
if (!alive _vehicle || {locked _vehicle > 1}) exitWith {false};

View File

@ -67,7 +67,7 @@ switch (true) do {
case (_type == TYPE_UNIFORM): {["item", "uniform"]};
case (_type == TYPE_BINOCULAR_AND_NVG): {
switch (toLower _simulation) do {
switch (toLowerANSI _simulation) do {
case ("weapon"): {["weapon", "binocular"]};
case ("binocular"): {["weapon", "binocular"]};
case ("nvgoggles"): {["item", "nvgoggles"]};
@ -78,7 +78,7 @@ switch (true) do {
case (_type == TYPE_WEAPON_VEHICLE): {["weapon", "vehicle"]};
case (_type == TYPE_ITEM): {
switch (toLower _simulation) do {
switch (toLowerANSI _simulation) do {
case ("itemmap"): {["item", "map"]};
case ("itemgps"): {["item", "gps"]};
case ("itemradio"): {["item", "radio"]};

View File

@ -16,7 +16,7 @@
*/
params ["_map"];
_map = toLower _map;
_map = toLowerANSI _map;
// [latitude, altitude]

View File

@ -43,8 +43,8 @@ private _stepY = 1e10;
private _letterGrid = false;
if (toLower _formatX find "a" != -1) then {_letterGrid = true};
if (toLower _formatY find "a" != -1) then {_letterGrid = true};
if (toLowerANSI _formatX find "a" != -1) then {_letterGrid = true};
if (toLowerANSI _formatY find "a" != -1) then {_letterGrid = true};
if (_letterGrid) exitWith {
WARNING_3("Map Grid Warning (%1) - Map uses letter grids [%2, %3]",worldName,_formatX,_formatY);

View File

@ -29,7 +29,7 @@ private _crew = [];
};
} else {
// otherwise check if we search for that type. toLower, because fullCrew returns "driver" vs. "Turret".
if (toLower (_x select 1) in _types) then {
if (toLowerANSI (_x select 1) in _types) then {
_crew pushBack (_x select 0);
};
};

View File

@ -32,7 +32,7 @@ if (isNil "_cachedValue") then {
private _vehicleIconValue = getText (configfile >> "CfgVehicleIcons" >> _vehicleValue);
if (_vehicleIconValue == "") then {
if (_vehicleValue != "" && {((toLower _vehicleValue) find ".paa") > -1}) then {
if (_vehicleValue != "" && {((toLowerANSI _vehicleValue) find ".paa") > -1}) then {
_cachedValue = _vehicleValue;
} else {
_cachedValue = DEFAULT_TEXTURE;

View File

@ -18,7 +18,7 @@
params ["_unit"];
// Animation changes even inside vehicle post-1.60
if (stance _unit == "PRONE" || {vehicle _unit != _unit} || {_unit call EFUNC(common,isSwimming)}) exitWith {};
if (stance _unit == "PRONE" || {!isNull objectParent _unit} || {_unit call EFUNC(common,isSwimming)}) exitWith {};
[
_unit,

View File

@ -35,7 +35,7 @@ ISNILS(_distance,_cfgDistance);
_fileName = _fileName select [1];
// add file extension .wss as default
if !(toLower (_fileName select [count _fileName - 4]) in [".wav", ".ogg", ".wss"]) then {
if !(toLowerANSI (_fileName select [count _fileName - 4]) in [".wav", ".ogg", ".wss"]) then {
ADD(_fileName,".wss");
};
TRACE_5("vars",_fileName,_posASL,_volume,_pitch,_distance);

View File

@ -17,7 +17,7 @@
params ["_conditionName"];
_conditionName = toLower _conditionName;
_conditionName = toLowerANSI _conditionName;
private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]];

View File

@ -30,7 +30,7 @@ private _bottomRightY = 1;
private _return = [];
switch (toLower _func) do {
switch (toLowerANSI _func) do {
case ("2d"): {
_array params ["_pointX", "_z", "_pointY"];

View File

@ -32,6 +32,6 @@ GVAR(statusEffect_sendJIP) pushBack _sendJIP;
//We add reasons at any time, but more efficenet to add all common ones at one time during init
if (isServer && {_commonReasonsArray isNotEqualTo []}) then {
//Switch case to lower:
_commonReasonsArray = _commonReasonsArray apply { toLower _x };
_commonReasonsArray = _commonReasonsArray apply { toLowerANSI _x };
missionNamespace setVariable [(format [QGVAR(statusEffects_%1), _name]), _commonReasonsArray, true];
};

View File

@ -32,7 +32,7 @@ if (isNull _object) exitWith {TRACE_1("null",_object);};
[_object, true] call FUNC(statusEffect_resetVariables); //Check for mismatch, and set object ref
//check ID case and set globally if not already set:
_ID = toLower _ID;
_ID = toLowerANSI _ID;
private _statusReasons = missionNamespace getVariable [(format [QGVAR(statusEffects_%1), _effectName]), []];
private _statusIndex = _statusReasons find _ID;
if (_statusIndex == -1) then {

View File

@ -17,12 +17,12 @@
private _baseline = 1;
if (GVAR(swayFactorsBaseline) isNotEqualTo []) then {
_baseline = 1 max ([missionNamespace, "ACE_setCustomAimCoef_baseline", "max"] call EFUNC(common,arithmeticGetResult));
_baseline = 1 max ([missionNamespace, "ACE_setCustomAimCoef_baseline", "max"] call FUNC(arithmeticGetResult));
};
private _multiplier = 1;
if (GVAR(swayFactorsMultiplier) isNotEqualTo []) then {
_multiplier = [missionNamespace, "ACE_setCustomAimCoef_multiplier", "product"] call EFUNC(common,arithmeticGetResult);
_multiplier = [missionNamespace, "ACE_setCustomAimCoef_multiplier", "product"] call FUNC(arithmeticGetResult);
};
ACE_player setCustomAimCoef (_baseline * _multiplier);

View File

@ -1,37 +1,84 @@
#include "..\script_component.hpp"
/*
* Author: mharis001
* Returns list of unique items in a unit's inventory.
* Items are cached if unit is ACE_player.
* Author: mharis001, Blue, Brett Mayson
* Returns list of unique items in the target's inventory.
*
* Arguments:
* 0: Unit <OBJECT>
* 0: Target <OBJECT>
* 1: Include magazines <NUMBER>
* 0: No (default)
* 1: Yes
* 2: Only magazines
*
* Return Value:
* Items <ARRAY>
*
* Example:
* [player] call ace_common_fnc_uniqueItems
* [player, 2] call ace_common_fnc_uniqueItems
*
* Public: No
*/
params ["_unit"];
params ["_target", ["_includeMagazines", 0]];
private _fnc_getItems = {
private _items = (getItemCargo uniformContainer _unit) select 0;
_items append ((getItemCargo vestContainer _unit) select 0);
_items append ((getItemCargo backpackContainer _unit) select 0);
private _items = [];
private _inventoryItems = (getItemCargo uniformContainer _target) select 0;
_inventoryItems append ((getItemCargo vestContainer _target) select 0);
_inventoryItems append ((getItemCargo backpackContainer _target) select 0);
_items set [0, _inventoryItems];
_items set [1, magazines _target];
_items arrayIntersect _items
};
// Use cached items list if unit is ACE_player
if (_unit isEqualTo ACE_player) then {
// Cache items list if unit is ACE_player
if (_target isEqualTo ACE_player) then {
if (isNil QGVAR(uniqueItemsCache)) then {
GVAR(uniqueItemsCache) = call _fnc_getItems;
};
+GVAR(uniqueItemsCache)
switch (_includeMagazines) do {
case 0: {
GVAR(uniqueItemsCache) select 0
};
case 1: {
(GVAR(uniqueItemsCache) select 1) + (GVAR(uniqueItemsCache) select 0)
};
case 2: {
GVAR(uniqueItemsCache) select 1
};
};
} else {
call _fnc_getItems;
if (_target isKindOf "CAManBase") then {
private _items = call _fnc_getItems;
switch (_includeMagazines) do {
case 0: {
_items select 0
};
case 1: {
(_items select 1) + (_items select 0)
};
case 2: {
_items select 1
};
};
} else {
private _items = switch (_includeMagazines) do {
case 0: {
itemCargo _target
};
case 1: {
(magazineCargo _target) + (itemCargo _target)
};
case 2: {
magazineCargo _target
};
};
_items arrayIntersect _items
};
};

View File

@ -1,5 +1,6 @@
private _category = format ["ACE %1", LLSTRING(DisplayName)];
private _categoryColors = [_category, format ["| %1 |", LLSTRING(subcategory_colors)]];
private _categoryColors = [_category, LSTRING(subcategory_colors)];
private _categorySway = [_category, LSTRING(subcategory_sway)];
[
QGVAR(checkPBOsAction),
@ -87,7 +88,7 @@ private _categoryColors = [_category, format ["| %1 |", LLSTRING(subcategory_col
QGVAR(epilepsyFriendlyMode),
"CHECKBOX",
[LSTRING(EpilepsyFriendlyMode), LSTRING(EpilepsyFriendlyModeTooltip)],
format ["ACE %1", localize LSTRING(DisplayName)],
_category,
false,
2
] call CBA_fnc_addSetting;
@ -96,7 +97,45 @@ private _categoryColors = [_category, format ["| %1 |", LLSTRING(subcategory_col
QGVAR(progressBarInfo),
"LIST",
[LSTRING(progressBarInfoName), LSTRING(progressBarInfoDesc)],
format ["ACE %1", localize LSTRING(DisplayName)],
_category,
[[0, 1, 2], [LSTRING(None), LSTRING(progressBarInfoPercentage), LSTRING(progressBarInfoTime)], 2],
0
] call CBA_fnc_addSetting;
[
QGVAR(enableSway),
"CHECKBOX",
[LSTRING(enableSway), LSTRING(enableSway_Description)],
_categorySway,
true,
1,
{},
true
] call CBA_fnc_addSetting;
[
QGVAR(swayFactor),
"SLIDER",
[LSTRING(SwayFactor), LSTRING(SwayFactor_Description)],
_categorySway,
[0, 5, 1, 2],
1
] call CBA_fnc_addSetting;
[
QGVAR(restedSwayFactor),
"SLIDER",
[LSTRING(RestedSwayFactor), LSTRING(RestedSwayFactor_Description)],
_categorySway,
[0, 5, 1, 2],
1
] call CBA_fnc_addSetting;
[
QGVAR(deployedSwayFactor),
"SLIDER",
[LSTRING(DeployedSwayFactor), LSTRING(DeployedSwayFactor_Description)],
_categorySway,
[0, 5, 1, 2],
1
] call CBA_fnc_addSetting;

View File

@ -5,7 +5,7 @@ private _aceWhitelist = missionNamespace getVariable ["ACE_Version_Whitelist", [
private _files = CBA_common_addons select {
(_x select [0,3] != "a3_") &&
{_x select [0,4] != "ace_"} &&
{!((toLower _x) in _aceWhitelist)}
{!((toLowerANSI _x) in _aceWhitelist)}
};
private _versions = [];

View File

@ -1828,5 +1828,90 @@
<Chinese>下方</Chinese>
<Turkish>Alt</Turkish>
</Key>
<Key ID="STR_ACE_Common_subcategory_sway">
<English>Weapon Sway</English>
<Japanese>手ぶれ</Japanese>
<Korean>무기 흔들림</Korean>
</Key>
<Key ID="STR_ACE_Common_EnableSway">
<English>Enable Weapon Sway</English>
<Japanese>手ぶれを有効化</Japanese>
<Korean>무기 흔들림 추가</Korean>
</Key>
<Key ID="STR_ACE_Common_EnableSway_Description">
<English>Enables weapon sway influenced by sway factors, such as stance, fatigue and medical condition.\nDisabling this setting will defer sway to vanilla or other mods.</English>
<Japanese>姿勢、疲労、負傷状態などの手ぶれ要因に影響を受ける武器照準の揺れを有効にします。\nこの設定を無効にすると、手ぶれの揺れはバニラまたは他のMODの処理に任されます。</Japanese>
<Korean>흔들림 계수, 자세, 피로도, 건강 상태 등의 요인에 영향을 받는 무기 흔들림을 활성화합니다.\n이 설정을 비활성화하면 바닐라 또는 다른 모드의 흔들림으로 대체됩니다.</Korean>
</Key>
<Key ID="STR_ACE_Common_SwayFactor">
<English>Sway factor</English>
<Spanish>Factor de balanceo de mira</Spanish>
<German>Verwacklungsfaktor</German>
<Japanese>手ぶれ因数</Japanese>
<Chinesesimp>抖动系数</Chinesesimp>
<Chinese>抖動因素</Chinese>
<French>Facteur de tremblement</French>
<Italian>Fattore di Oscillazione</Italian>
<Polish>Czynnik kołysania</Polish>
<Russian>Фактор колебания прицела</Russian>
<Portuguese>Fator de Balanço de Mira</Portuguese>
<Czech>Faktor kývání</Czech>
<Korean>손떨림 정도</Korean>
</Key>
<Key ID="STR_ACE_Common_SwayFactor_Description">
<English>Influences the amount of weapon sway. Higher means more sway.</English>
<Spanish>Afecta al la estabilidad de la mira. Más alto significa más balanceo</Spanish>
<German>Beeinflusst, wie ruhig man eine Waffe halten kann. Ein höherer Wert bedeutet weniger Stabilisierung.</German>
<Japanese>武器の手ぶれの大きさに影響します。値が高いほど、手ぶれが強くなります。</Japanese>
<Chinesesimp>影响手持武器的晃动程度,数值越高,抖动的越厉害。</Chinesesimp>
<Chinese>影響手持武器晃動程度,數值越高抖動越厲害</Chinese>
<French>Influe sur l'amplitude du tremblement de l'arme. Une valeur plus élevée signifie plus de tremblement.</French>
<Italian>Influenza l'aumento di oscillazione dell'arma quando affaticato. Maggiore significa più oscillazione.</Italian>
<Polish>Wpływa na poziom kołysania broni. Większa ilość znaczy większe kołysanie.</Polish>
<Russian>Влияет на колебания прицела оружия. Чем выше - тем больше.</Russian>
<Portuguese>Influencia a quantidade de balanço da mira da arma. Quanto maior, mais balanço.</Portuguese>
<Czech>Ovlivňuje množství kývání zbraní. Vyšší znamená více kývání.</Czech>
<Korean>손떨림의 정도를 정합니다. 높을 수록 많이 휘적입니다.</Korean>
</Key>
<Key ID="STR_ACE_Common_RestedSwayFactor">
<English>Rested sway factor</English>
<French>Facteur de balancement au repos</French>
<Korean>휴식 시 손떨림 정도</Korean>
<Portuguese>Fator de balanço de mira em repouso</Portuguese>
<German>Verwacklungsfaktor, wenn aufgelegt</German>
<Italian>Fattore di Oscillazione Appoggiato</Italian>
<Japanese>静止依託時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания прицела в состоянии покоя</Russian>
</Key>
<Key ID="STR_ACE_Common_RestedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is rested.</English>
<French>Influence le degré de balancement de l'arme au repos.</French>
<Korean>무기가 아무런 행동도 하지 않는 동안 무기가 흔들리는 정도를 정합니다.</Korean>
<Portuguese>Influencia a quantidade de balanço de mira enquanto a arma está em repouso.</Portuguese>
<German>Beeinflusst, wie ruhig man die Waffe hält, während sie aufgelegt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è appoggiata.</Italian>
<Japanese>静止し壁などに依託している時の武器の手ぶれの大きさに影響します。</Japanese>
<Russian>Влияет на величину колебания прицела оружия в состоянии покоя.</Russian>
</Key>
<Key ID="STR_ACE_Common_DeployedSwayFactor">
<English>Deployed sway factor</English>
<French>Facteur de balancement déployé</French>
<Korean>거치 시 손떨림 정도</Korean>
<Portuguese>Fator de balanço de mira em posição de tiro</Portuguese>
<German>Verwacklungsfaktor, wenn Zweibein aufgestellt ist.</German>
<Italian>Fattore di Oscillazione su Bipode</Italian>
<Japanese>接地展開時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания прицела при развертывании</Russian>
</Key>
<Key ID="STR_ACE_Common_DeployedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is deployed.</English>
<French>Influence le degré de balancement de l'arme déployée.</French>
<Korean>무기를 거치하는 동안 무기를 흔드는 정도를 정합니다.</Korean>
<Portuguese>Influencia a quantidade de balanço de mira enquanto a arma está em posição de tiro.</Portuguese>
<German>Beeinflusst, wie ruhig man die Waffen hält, während das Zweibein aufgestellt ist.</German>
<Italian>Determina la quantità di oscillazione dell'arma quando questa è stabilizzata usando il bipode.</Italian>
<Japanese>武器の接地展開時の武器の手ぶれの大きさに影響します。</Japanese>
<Russian>Влияет на величину колебания прицела оружия при его развертывании.</Russian>
</Key>
</Package>
</Project>

View File

@ -128,8 +128,8 @@ class CfgVehicles {
};
};
class AT_01_base_F;
class CUP_Metis_Base: AT_01_base_F {
class StaticATWeapon;
class CUP_Metis_Base: StaticATWeapon {
class ace_csw {
enabled = 1;
proxyWeapon = "CUP_proxy_AT13";
@ -142,7 +142,6 @@ class CfgVehicles {
};
};
class StaticATWeapon;
class CUP_TOW_TriPod_base: StaticATWeapon {
class ace_csw {
enabled = 1;

View File

@ -4,70 +4,104 @@
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_AGS30_displayName">
<English>[CSW] AGS30 Belt</English>
<Japanese>[CSW] AGS30 ベルト</Japanese>
<Russian>[CSW] Лента AGS 30</Russian>
<Korean>[CSW] AGS-30 벨트</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_MK19_displayName">
<English>[CSW] MK19 Belt</English>
<Japanese>[CSW] Mk19 ベルト</Japanese>
<Russian>[CSW] Лента Mk19</Russian>
<Korean>[CSW] Mk.19 벨트</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_TOW_displayName">
<English>[CSW] TOW Tube</English>
<Japanese>[CSW] TOW チューブ</Japanese>
<Russian>[CSW] Туба TOW</Russian>
<Korean>[CSW] TOW 튜브</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_TOW2_displayName">
<English>[CSW] TOW2 Tube</English>
<Japanese>[CSW] TOW2 チューブ</Japanese>
<Russian>[CSW] Туба TOW-2</Russian>
<Korean>[CSW] TOW2 튜브</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_PG9_displayName">
<English>[CSW] PG-9 Round</English>
<Japanese>[CSW] PG-9 砲弾</Japanese>
<Russian>[CSW] Снаряд ПГ-9</Russian>
<Korean>[CSW] PG-9 대전차고폭탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_OG9_displayName">
<English>[CSW] OG-9 Round</English>
<Japanese>[CSW] OG-9 砲弾</Japanese>
<Russian>[CSW] Снаряд OГ-9</Russian>
<Korean>[CSW] OG-9 고폭파편탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M1HE_displayName">
<English>[CSW] M1 HE</English>
<Japanese>[CSW] M1 榴弾</Japanese>
<Russian>[CSW] M1 HE</Russian>
<Korean>[CSW] M1 고폭탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M84Smoke_displayName">
<English>[CSW] M84 Smoke</English>
<Japanese>[CSW] M84 白煙弾</Japanese>
<Russian>[CSW] M84 Дымовая</Russian>
<Korean>[CSW] M84 연막탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M60A2_displayName">
<English>[CSW] M60A2 WP</English>
<Japanese>[CSW] M60A2 白リン弾</Japanese>
<Russian>[CSW] M60A2 WP</Russian>
<Korean>[CSW] M60A2 백린연막탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M67AT_displayName">
<English>[CSW] M67 AT Laser Guided</English>
<Japanese>[CSW] M67 対戦車レーザー誘導弾</Japanese>
<Russian>[CSW] M67 AT Laser Guided</Russian>
<Korean>[CSW] M67 레이저유도 대전차탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M314Illum_displayName">
<English>[CSW] M314 Illumination</English>
<Japanese>[CSW] M314 照明弾</Japanese>
<Russian>[CSW] M314 Осветительная</Russian>
<Korean>[CSW] M314 조명탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_3OF56_displayName">
<English>[CSW] 3OF56 HE</English>
<Japanese>[CSW] 3OF56 榴弾</Japanese>
<Russian>[CSW] 3OF56 HE</Russian>
<Korean>[CSW] 3OF56 고폭탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_3OF69M_displayName">
<English>[CSW] 3OF69M Laser Guided</English>
<Japanese>[CSW] 3OF69M レーザー誘導弾</Japanese>
<Russian>[CSW] 3OF69M Laser Guided</Russian>
<Korean>[CSW] 3OF69M 레이저유도탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmWP_displayName">
<English>[CSW] 122mm WP</English>
<Japanese>[CSW] 122mm 白リン弾</Japanese>
<Russian>[CSW] 122mm WP</Russian>
<Korean>[CSW] 122mm 백린탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmSmoke_displayName">
<English>[CSW] D-462 Smoke</English>
<Japanese>[CSW] D-462 白煙弾</Japanese>
<Russian>[CSW] D-462 Дымовая</Russian>
<Korean>[CSW] D-462 연막탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmIllum_displayName">
<English>[CSW] S-463 Illumination</English>
<Japanese>[CSW] S-463 照明弾</Japanese>
<Russian>[CSW] S-463 Осветительная</Russian>
<Korean>[CSW] S-463 조명탄</Korean>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmAT_displayName">
<English>[CSW] BK-6M HEAT</English>
<Japanese>[CSW] BK-6M HEAT弾</Japanese>
<Russian>[CSW] BK-6M HEAT</Russian>
<Korean>[CSW] BK-6M 대전차고폭탄</Korean>
</Key>
</Package>
</Project>

View File

@ -1,64 +1,118 @@
#define NVG_MACRO_GREEN_GEN3 \
#define NVG_BINO_PRESET \
ace_nightvision_bluRadius = 0.13; \
ace_nightvision_border = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); \
ace_nightvision_colorPreset[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.3, 1.2, 0.0, 0.9}, {6, 1, 1, 0.0}}; \
ace_nightvision_generation = 3; \
EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa); \
EGVAR(nightvision,generation) = 3; \
modelOptics = ""
#define NVG_MACRO_GREEN_GPNVG \
ace_nightvision_bluRadius = 0.13; \
ace_nightvision_border = "z\ace\addons\nightvision\data\nvg_mask_quad_4096.paa"; \
ace_nightvision_colorPreset[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.3, 1.2, 0.0, 0.9}, {6, 1, 1, 0.0}}; \
ace_nightvision_generation = 4; \
#define NVG_MONO_PRESET(GEN) \
EGVAR(nightvision,eyeCups) = 1; \
EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); \
EGVAR(nightvision,bluRadius) = 0.13; \
EGVAR(nightvision,generation) = GEN; \
modelOptics = ""
#define NVG_GPNVG_PRESET \
EGVAR(nightvision,bluRadius) = 0.13; \
EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_quad_4096.paa); \
EGVAR(nightvision,generation) = 4; \
modelOptics = ""
#define NVG_GREEN_PRESET EGVAR(nightvision,colorPreset)[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.3, 1.2, 0.0, 0.9}, {6, 1, 1, 0}}
#define NVG_WP_PRESET EGVAR(nightvision,colorPreset)[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.1, 0.8, 1.9, 0.9}, {1, 1, 6, 0}}
class CfgWeapons {
class NVGoggles;
// Monocular
class CUP_NVG_PVS7: NVGoggles {
modelOptics = "";
ace_nightvision_border = QPATHTOEF(nightvision,data\nvg_mask_4096.paa);
ace_nightvision_bluRadius = 0;
ace_nightvision_eyeCups = 1;
ace_nightvision_generation = 3;
ace_nightvision_colorPreset[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.3, 1.2, 0.0, 0.9}, {6, 1, 1, 0.0}};
NVG_MONO_PRESET(3);
NVG_GREEN_PRESET;
};
class CUP_NVG_HMNVS: NVGoggles {
NVG_MACRO_GREEN_GEN3;
NVG_MONO_PRESET(3);
NVG_GREEN_PRESET;
};
// Binocular
class CUP_NVG_PVS14: NVGoggles {
NVG_MACRO_GREEN_GEN3;
NVG_BINO_PRESET;
NVG_GREEN_PRESET;
};
class CUP_NVG_PVS15_black: NVGoggles {
NVG_MACRO_GREEN_GEN3;
};
class CUP_NVG_PVS15_tan: NVGoggles {
NVG_MACRO_GREEN_GEN3;
NVG_BINO_PRESET;
NVG_GREEN_PRESET;
};
class CUP_NVG_PVS15_green: NVGoggles {
NVG_MACRO_GREEN_GEN3;
NVG_BINO_PRESET;
NVG_GREEN_PRESET;
};
class CUP_NVG_PVS15_tan: NVGoggles {
NVG_BINO_PRESET;
NVG_GREEN_PRESET;
};
class CUP_NVG_PVS15_winter: NVGoggles {
NVG_MACRO_GREEN_GEN3;
NVG_BINO_PRESET;
NVG_GREEN_PRESET;
};
// White Phosphor NVGs
class CUP_NVG_PVS14_WP: CUP_NVG_PVS14 {
displayName = SUBCSTRING(CUP_NVG_PVS14_WP);
NVG_WP_PRESET;
};
class CUP_NVG_PVS15_black_WP: CUP_NVG_PVS15_black {
displayName = SUBCSTRING(CUP_NVG_PVS15_black_WP);
NVG_WP_PRESET;
};
class CUP_NVG_PVS15_green_WP: CUP_NVG_PVS15_green {
displayName = SUBCSTRING(CUP_NVG_PVS15_green_WP);
NVG_WP_PRESET;
};
class CUP_NVG_PVS15_tan_WP: CUP_NVG_PVS15_tan {
displayName = SUBCSTRING(CUP_NVG_PVS15_tan_WP);
NVG_WP_PRESET;
};
class CUP_NVG_PVS15_winter_WP: CUP_NVG_PVS15_winter {
displayName = SUBCSTRING(CUP_NVG_PVS15_winter_WP);
NVG_WP_PRESET;
};
// Gen4s
class CUP_NVG_1PN138: NVGoggles {
ace_nightvision_bluRadius = 0.13;
ace_nightvision_border = QPATHTOEF(nightvision,data\nvg_mask_4096.paa);
ace_nightvision_colorPreset[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.3, 1.2, 0.0, 0.9}, {6, 1, 1, 0.0}};
ace_nightvision_generation = 4;
modelOptics = "";
NVG_MONO_PRESET(4);
NVG_GREEN_PRESET;
};
class CUP_NVG_GPNVG_black: NVGoggles {
NVG_MACRO_GREEN_GPNVG;
NVG_GPNVG_PRESET;
NVG_GREEN_PRESET;
};
class CUP_NVG_GPNVG_tan: NVGoggles {
NVG_MACRO_GREEN_GPNVG;
NVG_GPNVG_PRESET;
NVG_GREEN_PRESET;
};
class CUP_NVG_GPNVG_green: NVGoggles {
NVG_MACRO_GREEN_GPNVG;
NVG_GPNVG_PRESET;
NVG_GREEN_PRESET;
};
class CUP_NVG_GPNVG_winter: NVGoggles {
NVG_MACRO_GREEN_GPNVG;
NVG_GPNVG_PRESET;
NVG_GREEN_PRESET;
};
// White Phosphor NVGs
class CUP_NVG_GPNVG_black_WP: CUP_NVG_GPNVG_black {
displayName = SUBCSTRING(CUP_NVG_GPNVG_black_WP);
NVG_WP_PRESET;
};
class CUP_NVG_GPNVG_tan_WP: CUP_NVG_GPNVG_tan {
displayName = SUBCSTRING(CUP_NVG_GPNVG_tan_WP);
NVG_WP_PRESET;
};
class CUP_NVG_GPNVG_green_WP: CUP_NVG_GPNVG_green {
displayName = SUBCSTRING(CUP_NVG_GPNVG_green_WP);
NVG_WP_PRESET;
};
class CUP_NVG_GPNVG_winter_WP: CUP_NVG_GPNVG_winter {
displayName = SUBCSTRING(CUP_NVG_GPNVG_winter_WP);
NVG_WP_PRESET;
};
};

View File

@ -4,7 +4,10 @@ class CfgPatches {
class SUBADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
weapons[] = {
"CUP_NVG_PVS14_WP", "CUP_NVG_PVS15_black_WP", "CUP_NVG_PVS15_green_WP", "CUP_NVG_PVS15_tan_WP", "CUP_NVG_PVS15_winter_WP",
"CUP_NVG_GPNVG_black_WP", "CUP_NVG_GPNVG_tan_WP", "CUP_NVG_GPNVG_green_WP", "CUP_NVG_GPNVG_winter_WP"
};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {
"CUP_Weapons_LoadOrder",

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Compat_CUP_Weapons_nightvision">
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS14_WP">
<English>AN/PVS-14 (WP)</English>
<Japanese>AN/PVS-14 (白色蛍光)</Japanese>
<Italian>AN/PVS-14 (FB)</Italian>
<Polish>AN/PVS-14 (WP)</Polish>
<German>AN/PVS-14 (WP)</German>
<Korean>AN/PVS-14 (백색광)</Korean>
<French>AN/PVS-14 (WP)</French>
<Russian>AN/PVS-14 (БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_black_WP">
<English>AN/PVS-15 (Black, WP)</English>
<Japanese>AN/PVS-15 (グリーン, 白色蛍光)</Japanese>
<Italian>AN/PVS-15 (Verde, FB)</Italian>
<Polish>AN/PVS-15 (Zielone, WP)</Polish>
<German>AN/PVS-15 (grün, WP)</German>
<Korean>AN/PVS-15 (녹색, 백색광)</Korean>
<French>AN/PVS-15 (vertes, WP)</French>
<Russian>AN/PVS-15 (Чёрный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_green_WP">
<English>AN/PVS-15 (Green, WP)</English>
<Japanese>AN/PVS-15 (ブラック、白色蛍光)</Japanese>
<Italian>AN/PVS-15 (Nero, FB)</Italian>
<Polish>AN/PVS-15 (Czarne, WP)</Polish>
<German>AN/PVS-15 (Schwarz, WP)</German>
<Korean>AN/PVS-15 (검정, 백색광)</Korean>
<French>AN/PVS-15 (noires, WP)</French>
<Russian>AN/PVS-15 (Зелёный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_tan_WP">
<English>AN/PVS-15 (Tan, WP)</English>
<Japanese>AN/PVS-15 (タン, 白色蛍光)</Japanese>
<Italian>AN/PVS-15 (Marroncina, FB)</Italian>
<Polish>AN/PVS-15 (jasnobrązowa, WP)</Polish>
<German>AN/PVS-15 (hellbraun, WP)</German>
<Korean>AN/PVS-15 (황갈색, 백색광)</Korean>
<French>AN/PVS-15 (marron clair, WP)</French>
<Russian>AN/PVS-15 (Желтовато-коричневый, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_winter_WP">
<English>AN/PVS-15 (Winter, WP)</English>
<Japanese>AN/PVS-15 (冬季迷彩, WP)</Japanese>
<Korean>AN/PVS-15 (설상, 백색광)</Korean>
<Russian>AN/PVS-15 (Белый, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_black_WP">
<English>GPNVG (Black, WP)</English>
<Japanese>GPNVG (グリーン, 白色蛍光)</Japanese>
<Italian>GPNVG (Verde, FB)</Italian>
<Polish>GPNVG (Zielone, WP)</Polish>
<German>GPNVG (grün, WP)</German>
<Korean>GPNVG (녹색, 백색광)</Korean>
<French>GPNVG (vertes, WP)</French>
<Russian>GPNVG (Чёрный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_tan_WP">
<English>GPNVG (Tan, WP)</English>
<Japanese>GPNVG (タン, 白色蛍光)</Japanese>
<Italian>GPNVG (Marroncina, FB)</Italian>
<Polish>GPNVG (jasnobrązowa, WP)</Polish>
<German>GPNVG (hellbraun, WP)</German>
<Korean>GPNVG (황갈색, 백색광)</Korean>
<French>GPNVG (marron clair, WP)</French>
<Russian>GPNVG (Желтовато-коричневый, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_green_WP">
<English>GPNVG (Green, WP)</English>
<Japanese>GPNVG (ブラック、白色蛍光)</Japanese>
<Italian>GPNVG (Nero, FB)</Italian>
<Polish>GPNVG (Czarne, WP)</Polish>
<German>GPNVG (Schwarz, WP)</German>
<Korean>GPNVG (검정, 백색광)</Korean>
<French>GPNVG (noires, WP)</French>
<Russian>GPNVG (Зелёный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_winter_WP">
<English>GPNVG (Winter, WP)</English>
<Japanese>GPNVG (冬季迷彩, WP)</Japanese>
<Korean>GPNVG (설상, 백색광)</Korean>
<Russian>AN/PVS-15 (Белый, БФ)</Russian>
</Key>
</Package>
</Project>

View File

@ -10,4 +10,4 @@ GVAR(deployPFH) = -1;
};
}] call CBA_fnc_addEventHandler;
[QGVAR(vehicleDamage), {_this call FUNC(vehicleDamage)}] call CBA_fnc_addEventHandler;
[QGVAR(vehicleDamage), LINKFUNC(vehicleDamage)] call CBA_fnc_addEventHandler;

View File

@ -1,15 +1,15 @@
#include "script_component.hpp"
[QGVAR(engineFire), FUNC(engineFire)] call CBA_fnc_addEventHandler;
[QGVAR(engineFire), LINKFUNC(engineFire)] call CBA_fnc_addEventHandler;
[QGVAR(cookOff), {
params ["_vehicle"];
if (local _vehicle) then {
_this call FUNC(cookOff);
};
}] call CBA_fnc_addEventHandler;
[QGVAR(cookOffEffect), FUNC(cookOffEffect)] call CBA_fnc_addEventHandler;
[QGVAR(smoke), FUNC(smoke)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffBox), FUNC(cookOffBox)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffEffect), LINKFUNC(cookOffEffect)] call CBA_fnc_addEventHandler;
[QGVAR(smoke), LINKFUNC(smoke)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffBox), LINKFUNC(cookOffBox)] call CBA_fnc_addEventHandler;
// handle cleaning up effects when vehicle is deleted mid-cookoff
[QGVAR(addCleanupHandlers), {

View File

@ -77,7 +77,7 @@ private _spawnProjectile = {
};
private _speed = random (_speedOfAmmo / 10) max 1;
_simType = toLower _simType;
_simType = toLowerANSI _simType;
switch (_simType) do {
case ("shotbullet"): {
[QGVAR(playCookoffSound), [_vehicle, _simType]] call CBA_fnc_globalEvent;

View File

@ -27,7 +27,7 @@ if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith {
private _hitpoint = "#structural";
if (_hitIndex != -1) then {
_hitpoint = toLower ((getAllHitPointsDamage _vehicle param [0, []]) select _hitIndex);
_hitpoint = toLowerANSI ((getAllHitPointsDamage _vehicle param [0, []]) select _hitIndex);
};
// get change in damage

View File

@ -38,14 +38,14 @@
private _weaponDir = getDir _staticWeapon;
private _carryWeaponMag = "";
private _carryWeaponMags = getArray (configFile >> "CfgWeapons" >> _carryWeaponClassname >> "magazines") apply {toLower _x};
private _carryWeaponMags = getArray (configFile >> "CfgWeapons" >> _carryWeaponClassname >> "magazines") apply {toLowerANSI _x};
LOG("remove ammo");
{
_x params ["_xMag", "", "_xAmmo"];
if (_xAmmo == 0) then {continue};
private _carryMag = _xMag call FUNC(getCarryMagazine);
if (_carryWeaponMag isEqualTo "" && {toLower _carryMag in _carryWeaponMags}) then {
if (_carryWeaponMag isEqualTo "" && {toLowerANSI _carryMag in _carryWeaponMags}) then {
TRACE_3("Adding mag to secondary weapon",_xMag,_xAmmo,_carryMag);
_carryWeaponMag = _carryMag;
DEC(_xAmmo);

View File

@ -179,7 +179,7 @@
<Italian>Scorta di munizioni</Italian>
<Korean>탄약 보관</Korean>
<Polish>Magazyn amunicji</Polish>
<Japanese>弾薬の格納場所</Japanese>
<Japanese>弾薬保管位置</Japanese>
<Chinesesimp>弹药存储</Chinesesimp>
<Russian>Хранилище боеприпасов</Russian>
<Spanish>Almacenamiento de munición</Spanish>
@ -192,7 +192,7 @@
<Italian>Determina se ulteriori caricatori verranno stoccati sul suolo o in una cassa di munizioni.</Italian>
<Korean>여분의 탄약을 지면 또는 탄약 상자에 넣을 지 결정합니다.</Korean>
<Polish>Decyduje, czy dodatkowe magazynki przechowywane są na ziemi, czy w skrzynce z amunicją.</Polish>
<Japanese>追加の弾倉を地面に配置するか、弾薬箱内に保管するかを設定します。</Japanese>
<Japanese>追加の弾倉を地面に直接配置するか、弾薬箱内に保管するかを設定します。</Japanese>
<Chinesesimp>设置多余的弹夹是存放在地面上还是弹药箱内</Chinesesimp>
<Russian>Определяет будут ли дополнительные магазины лежать на земле или внутри хранилища</Russian>
<Spanish>Determina si los cargadores extra son almacenados en el suelo o en una caja de munición</Spanish>

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