Merge branch 'master' into BFT

This commit is contained in:
Magnetar 2019-03-27 11:23:48 +01:00
commit 4d2692dc50
629 changed files with 17883 additions and 6746 deletions

View File

@ -10,3 +10,6 @@ trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab

View File

@ -1,56 +0,0 @@
stages:
mark_for_closing:
days: 30
labels:
- status/need more info
- status/invalid
- status/can't reproduce
- status/wontfix
exclude:
- status/marked for cleanup
- status/accepting-pr
comment:
- 'Hello @{author}! There has been no activity on this ticket for over a period of {days} days. I am automatically replying to let you know we will close this ticket within 1 week due to inactivity and consider this resolved.'
- 'If you believe this is in error, please reply with the requested information.'
- 'Thank you. :robot:'
action:
close: false
comment: true
assign_label:
- status/marked for cleanup
clean_up:
days: 7
labels:
- status/marked for cleanup
comment:
- 'Hello @{author}! We have detected no activity for {days} days on this ticket. We therefore assume that the original reporter has lost interest or the issue has been resolved.'
- 'Since we have marked this ticket for deletion, we will be closing it.'
- 'If this has been closed in error, please create a comment below and we can reopen this issue. Note that you may need to provide additional information that was requested.'
- 'Thank you. :robot:'
action:
close: true
comment: true
assign_label:
- status/closed by bot
remove_label:
- status/marked for cleanup
remind_about_old_ticket:
days: 365
labels:
- kind/bug
- kind/critical bug
exclude:
- status/need more info
- status/invalid
- status/can't reproduce
- status/wontfix
- status/marked for cleanup
- status/inactive
- status/stale
- status/accepting-pr
comment:
- 'Hello @acemod/maintainers. This ticket has been open for over {days} days without any activity.'
action:
comment: true
assign_label:
- status/inactive

View File

@ -27,3 +27,24 @@ Please refrain from making requests for any planned or existing features from ei
In order to avoid duplicates and keep the issue tracker organized, we have created a common issue for [ACE3 Feature requests](https://github.com/acemod/ACE3/issues/3594). Any and all relevant requests should be submitted there, where they will also get discussed and evaluated. Before adding a new one, make sure to check the previous entries from the thread and do a quick search for similar suggestions; please don't reiterate requests for features that had already been accepted for inclusion, or those which were disregarded earlier.
Following their approval, feature requests may be moved by moderators to a separate issue for further discussion.
# Contributing to the project
We welcome anyone to contribute to this repository. Issues that we are actively seeking help with, are marked as [`help wanted`](https://github.com/acemod/ACE3/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22). Feel free to pick up any of those issues.
## Pull Request process
When contributing to this repository, please first discuss the change you wish to make via issue or [Slack](https://slackin.ace3mod.com/) with the [ACE3 project maintainers](https://ace3mod.com/team.html) before making a change. This may not be necessary if you are contributing for something which has an existing issue in our repository already.
1. Please make a pull request (PR) as early as possible. This lets use help you in the proces of developing it. When opening a work in progress pull request, mark your PR with a `WIP:` prefix.
2. Describe what this pull request will do and how it solves this in the description of your PR. A clear intent and description of the way the issue is resolved will help us to review the PR more efficiently.
3. Please follow our [Development Guidelines](https://ace3mod.com/wiki/development/).
### Notes
Please note that all contributors to this project are volunteers and do this in their own time. This means that issues and/or PRs may be open for a long time before being picked up and reviewed. We try to keep this time as short as possible, but some times things may fall short. If you feel that an issue or PR has not received attention, please comment asking for a review using the mention `@acemod/maintainers`.
## Assistance with contributing
If you require assistance with contributing, check out the #dev channel on our [Slack](https://slackin.ace3mod.com/). Additional documentation can be found on our [Development wiki](https://ace3mod.com/wiki/development/).

View File

@ -17,8 +17,8 @@
**Where did the issue occur?**
- Dedicated / Self-Hosted Multiplayer / Singleplayer / Editor (Singleplayer) / Editor (Multiplayer) / Virtual Arsenal
**Placed Modules:**
- Add the list of modules you have placed on the map. Use 'None' if the error occurs without any modules.
**Additional information:**
- Provide any additional information that will help us solve this issue.
**RPT log file:**
- Add a link ([gist](https://gist.github.com) or [pastebin](http://pastebin.com)) to the client and/or server RPT file. An instruction to find your RPT files can be found [here](https://community.bistudio.com/wiki/Crash_Files#Arma_3).

47
.github/stale.yml vendored Normal file
View File

@ -0,0 +1,47 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 180
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 14
# Issues with these labels will never be considered stale
exemptLabels:
- impact/large
- kind/critical bug
- kind/bug
- kind/Focus Feature
- status/accepting-pr
- status/cherrypick
- status/merge on release
- sticky
# Label to use when marking an issue as stale
staleLabel: status/stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: >
This issue has been automatically closed due to inactivity.
If this is still an issue, please feel free to re-open this. If necessary, provide any additional details to help us solve this issue.
If you wish to assist us resolving this issue,
please re-open or create a new issue stating you wish to help us out.
Thank you for your contributions.
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
# Limit to only `issues` or `pulls`
only: issues
# Set to true to ignore issues in a project (defaults to false)
exemptProjects: true
# Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: true

3
.gitignore vendored
View File

@ -1,5 +1,8 @@
@*
*.zip
release/*
tools/temp
tools/armake.exe
*.cache
*.pbo
texHeaders.bin

View File

@ -61,10 +61,13 @@ Coren <coren4@gmail.com>
Crusty
Dharma Bellamkonda <dharma.bellamkonda@gmail.com>
Dimaslg <dimaslg@telecable.es>
diwako
dixon13 <dixonbegay@gmail.com>
Drill <drill87@gmail.com>
Dudakov aka [OMCB]Kaban <dudakov.s@gmail.com>
Drofseh <drofseh@gmail.com>
Dslyecxi <dslyecxi@gmail.com>
Eclipser <jms@modeemi.fi>
ElTyranos
eRazeri
evromalarkey <evromalarkey@gmail.com>
@ -114,6 +117,7 @@ OnkelDisMaster <onkeldismaster@gmail.com>
Orbis2358 <mgkid3310@naver.com>
oscarmolinadev
PaxJaromeMalues <seemax1991@gmail.com>
PiZZADOX <509thParachuteInfantry@gmail.com>
Phyma <sethramstrom@gmail.com>
pokertour
Professor <lukas.trneny@wo.cz>

91
Makefile Normal file
View File

@ -0,0 +1,91 @@
VERSION = $(shell cat "VERSION")
PREFIX = ace
BIN = @ace
ZIP = ace3
FLAGS = -i include -w unquoted-string -w redefinition-wo-undef
VERSION_FILES = README.md docs/README_DE.md docs/README_PL.md mod.cpp
MAJOR = $(word 1, $(subst ., ,$(VERSION)))
MINOR = $(word 2, $(subst ., ,$(VERSION)))
PATCH = $(word 3, $(subst ., ,$(VERSION)))
BUILD = $(word 4, $(subst ., ,$(VERSION)))
VERSION_S = $(MAJOR).$(MINOR).$(PATCH)
GIT_HASH = $(shell git log -1 --pretty=format:"%H" | head -c 8)
ifeq ($(OS), Windows_NT)
ARMAKE = ./tools/armake.exe # Downloaded via make.ps (rename armake_wXY.exe otherwise)
else
ARMAKE = armake
endif
$(BIN)/addons/$(PREFIX)_%.pbo: addons/%
@mkdir -p $(BIN)/addons
@echo " PBO $@"
@${ARMAKE} build ${FLAGS} -f -e "version=$(GIT_HASH)" $< $@
$(BIN)/optionals/$(PREFIX)_%.pbo: optionals/%
@mkdir -p $(BIN)/optionals
@echo " PBO $@"
@${ARMAKE} build ${FLAGS} -f -e "version=$(GIT_HASH)" $< $@
# Shortcut for building single addons (eg. "make <component>.pbo")
%.pbo:
"$(MAKE)" $(MAKEFLAGS) $(patsubst %, $(BIN)/addons/$(PREFIX)_%, $@)
all: $(patsubst addons/%, $(BIN)/addons/$(PREFIX)_%.pbo, $(wildcard addons/*)) \
$(patsubst optionals/%, $(BIN)/optionals/$(PREFIX)_%.pbo, $(wildcard optionals/*))
filepatching:
"$(MAKE)" $(MAKEFLAGS) FLAGS="-w unquoted-string -p"
$(BIN)/keys/%.biprivatekey:
@mkdir -p $(BIN)/keys
@echo " KEY $@"
@${ARMAKE} keygen -f $(patsubst $(BIN)/keys/%.biprivatekey, $(BIN)/keys/%, $@)
$(BIN)/addons/$(PREFIX)_%.pbo.$(PREFIX)_$(VERSION)-$(GIT_HASH).bisign: $(BIN)/addons/$(PREFIX)_%.pbo $(BIN)/keys/$(PREFIX)_$(VERSION).biprivatekey
@echo " SIG $@"
@${ARMAKE} sign -f -s $@ $(BIN)/keys/$(PREFIX)_$(VERSION).biprivatekey $<
$(BIN)/optionals/$(PREFIX)_%.pbo.$(PREFIX)_$(VERSION)-$(GIT_HASH).bisign: $(BIN)/optionals/$(PREFIX)_%.pbo $(BIN)/keys/$(PREFIX)_$(VERSION).biprivatekey
@echo " SIG $@"
@${ARMAKE} sign -f -s $@ $(BIN)/keys/$(PREFIX)_$(VERSION).biprivatekey $<
signatures: $(patsubst addons/%, $(BIN)/addons/$(PREFIX)_%.pbo.$(PREFIX)_$(VERSION)-$(GIT_HASH).bisign, $(wildcard addons/*)) \
$(patsubst optionals/%, $(BIN)/optionals/$(PREFIX)_%.pbo.$(PREFIX)_$(VERSION)-$(GIT_HASH).bisign, $(wildcard optionals/*))
extensions: $(wildcard extensions/*/*)
cd extensions/build && cmake .. && make
find ./extensions/build/ \( -name "*.so" -o -name "*.dll" \) -exec cp {} ./ \;
extensions-win64: $(wildcard extensions/*/*)
cd extensions/build && CXX=$(eval $(which g++-w64-mingw-i686)) cmake .. && make
version:
@echo " VER $(VERSION)"
$(shell sed -i -r -s 's/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/$(VERSION)/g' $(VERSION_FILES))
$(shell sed -i -r -s 's/[0-9]+\.[0-9]+\.[0-9]+/$(VERSION_S)/g' $(VERSION_FILES))
@echo -e "#define MAJOR $(MAJOR)\n#define MINOR $(MINOR)\n#define PATCHLVL $(PATCH)\n#define BUILD $(BUILD)" > "addons/main/script_version.hpp"
$(shell sed -i -r -s 's/ACE_VERSION_MAJOR [0-9]+/ACE_VERSION_MAJOR $(MAJOR)/g' extensions/CMakeLists.txt)
$(shell sed -i -r -s 's/ACE_VERSION_MINOR [0-9]+/ACE_VERSION_MINOR $(MINOR)/g' extensions/CMakeLists.txt)
$(shell sed -i -r -s 's/ACE_VERSION_REVISION [0-9]+/ACE_VERSION_REVISION $(PATCH)/g' extensions/CMakeLists.txt)
commit:
@echo " GIT commit release preparation"
@git add -A
@git diff-index --quiet HEAD || git commit -am "Prepare release $(VERSION_S)" -q
push: commit
@echo " GIT push release preparation"
@git push -q
release: clean version commit
@"$(MAKE)" $(MAKEFLAGS) signatures
@echo " ZIP $(ZIP)_$(VERSION_S).zip"
@cp *.dll mod.cpp README.md docs/README_DE.md docs/README_PL.md AUTHORS.txt LICENSE logo_ace3_ca.paa meta.cpp $(BIN)
@zip -qr $(ZIP)_$(VERSION_S).zip $(BIN)
clean:
rm -rf $(BIN) $(ZIP)_*.zip
.PHONY: all filepatching signatures extensions extensions-win64 version commit push release clean

View File

@ -4,7 +4,7 @@
<p align="center">
<a href="https://github.com/acemod/ACE3/releases/latest">
<img src="https://img.shields.io/badge/Version-3.12.3-blue.svg?style=flat-square" alt="ACE3 Version">
<img src="https://img.shields.io/badge/Version-3.12.6-blue.svg?style=flat-square" alt="ACE3 Version">
</a>
<a href="https://github.com/acemod/ACE3/issues">
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat-square&label=Issues" alt="ACE3 Issues">
@ -21,8 +21,8 @@
<a href="https://slackin.ace3mod.com/">
<img src="https://slackin.ace3mod.com/badge.svg?style=flat-square&label=Slack" alt="ACE3 Slack">
</a>
<a href="https://travis-ci.org/acemod/ACE3">
<img src="https://img.shields.io/travis/acemod/ACE3.svg?style=flat-square&label=Build" alt="ACE3 Build Status">
<a href="https://circleci.com/gh/acemod/ACE3">
<img src="https://circleci.com/gh/acemod/ACE3.svg?style=svg" alt="ACE3 Build Status">
</a>
</p>

1
VERSION Normal file
View File

@ -0,0 +1 @@
3.12.6.43

View File

@ -7,12 +7,12 @@ class Extended_PreStart_EventHandlers {
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE( call COMPILE_FILE(XEH_preInit) );
init = QUOTE(call COMPILE_FILE(XEH_preInit));
};
};
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE( call COMPILE_FILE(XEH_postInit) );
init = QUOTE(call COMPILE_FILE(XEH_postInit));
};
};

View File

@ -12,7 +12,7 @@
* muzzle velocity shift - m/s <NUMBER>
*
* Example:
* [[], 5] call ace_advanced_ballistics_fnc_calcilateAmmoTemperatureVelocityShift
* [[], 5] call ace_advanced_ballistics_fnc_calculateAmmoTemperatureVelocityShift
*
* Public: No
*/

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Advanced_Ballistics">
<Key ID="STR_ACE_Advanced_Ballistics_WindInfoKey">
@ -90,6 +90,7 @@
<Chinese>啟用槍口初速變化</Chinese>
<Chinesesimp>启用枪口初速变化</Chinesesimp>
<French>Activer les variations de la vitesse initiale</French>
<Polish>Aktywuj wariację prędkości wylotowej</Polish>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_muzzleVelocityVariationEnabled_Description">
<English>Simulates slight variations in muzzle velocity between each shot</English>
@ -100,6 +101,7 @@
<Chinese>模擬每發子彈的槍口初速都略有不同</Chinese>
<Chinesesimp>模拟每发子弹的枪口初速都略有不同</Chinesesimp>
<French>Simule les légères variations</French>
<Polish>Symuluje lekkie zmiany w prędkości wylotowej między każdym strzałem</Polish>
</Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_DisplayName">
<English>Enable Ammo Temperature Simulation</English>

View File

@ -4,7 +4,9 @@
[LSTRING(Enabled), LSTRING(Enabled_Description)],
LSTRING(DisplayName),
true,
true
true,
{[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
true // Needs mission restart
] call CBA_Settings_fnc_init;
[

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Advanced_Fatigue">
<Key ID="STR_ACE_Advanced_Fatigue_DisplayName">
@ -9,6 +9,8 @@
<Japanese>ACE アドバンスド ファティーグ</Japanese>
<Italian>ACE Fatica Avanzata</Italian>
<Korean>ACE 고급 피로도</Korean>
<French>ACE Fatigue Avancée</French>
<Polish>ACE Zaawansowane Zmęczenie</Polish>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_PerformanceFactor">
<English>Performance Factor</English>
@ -114,12 +116,18 @@
<Japanese>手ぶれ因数</Japanese>
<Chinesesimp>抖动因数</Chinesesimp>
<Chinese>抖動因素</Chinese>
<French>Facteur de stabilisation</French>
<Italian>Fattore di oscillazione</Italian>
<Polish>Czynnik kołysania</Polish>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_SwayFactor_Description">
<English>Influences the amount of weapon sway. Higher means more sway.</English>
<Japanese>武器を持つ手のぶれ度合いを設定します。 値が高ければ高いほど、手ぶれが強くなります。</Japanese>
<Chinesesimp>影响手持武器的晃动程度,数值越高,抖动的越厉害.</Chinesesimp>
<Chinese>影響手持武器晃動程度,數值越高抖動越厲害</Chinese>
<French>Influence les mouvements de l'arme, une valeur plus élevée signifie plus de mouvements</French>
<Italian>Influenza l'ammontare di oscillazione dell'arma. Maggiore significa più oscillazione.</Italian>
<Polish>Wpływa na poziom kołysania broni. Większa ilość znaczy większe kołysanie.</Polish>
</Key>
<Key ID="STR_ACE_Advanced_Fatigue_Enabled">
<English>Enabled</English>

View File

@ -31,7 +31,7 @@ GVAR(enabled) &&
{_unit getVariable [QGVAR(lastThrownTime), CBA_missionTime - 3] < CBA_missionTime - 2} && // Prevent throwing in quick succession
#endif
{!(call EFUNC(common,isFeatureCameraActive))} &&
{(call CBA_fnc_getActiveFeatureCamera) isEqualTo ""} &&
{[_unit, objNull, ["isNotInside", "isNotSwimming", "isNotSitting"/*, "isNotOnLadder"*/]] call EFUNC(common,canInteractWith)} && // Ladder needs positioning fixes on throw
{_unit call CBA_fnc_canUseWeapon} && // Disable in non-FFV seats due to surface detection issues
{"" == currentWeapon _unit || {currentWeapon _unit != secondaryWeapon _unit}} &&

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Advanced_Throwing">
<Key ID="STR_ACE_Advanced_Throwing_Category">

View File

@ -16,3 +16,9 @@ class Extended_PostInit_EventHandlers {
init = QUOTE(call COMPILE_FILE(XEH_postInit));
};
};
class Extended_DisplayLoad_EventHandlers {
class RscDisplayCurator {
ADDON = QUOTE(call FUNC(drawCuratorGarrisonPathing));
};
};

View File

@ -1,3 +1,4 @@
PREP(drawCuratorGarrisonPathing);
PREP(garrison);
PREP(unGarrison);
PREP(garrisonMove);

View File

@ -68,42 +68,3 @@
params ["_unit", "_mode"];
_unit enableGunLights _mode;
}] call CBA_fnc_addEventHandler;
#ifdef DEBUG_MODE_FULL
addMissionEventHandler ["Draw3D", {
private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
{
_x params ["_unit", "_pos"];
switch (true) do {
case (surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLtoASL _pos), [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
};
case (!surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisual [0,0,1], _pos, [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
};
case (!surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisual [0,0,1], (AGLToASL _pos), [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
};
case (surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], _pos, [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
};
};
} forEach _unitMoveList;
}];
#endif

View File

@ -0,0 +1,54 @@
#include "script_component.hpp"
/*
* Author: alganthe
* Add draw3D eh to the curator interface.
*
* Arguments:
* None
*
* Return value:
* None
*
* Public: No
*/
addMissionEventHandler ["Draw3D", {
if (findDisplay 312 isEqualTo displayNull) exitWith {
removeMissionEventHandler ["Draw3D", _thisEventHandler];
};
private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
{
_x params ["_unit", "_pos"];
switch (true) do {
case (surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLtoASL _pos), [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
};
case (!surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisual [0,0,1], _pos, [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
};
case (!surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisual [0,0,1], (AGLToASL _pos), [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
};
case (surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisualWorld [0,0,1], _pos, [1,0,0,1]];
};
drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], _pos, 0.75, 0.75, 0.75];
};
};
} forEach _unitMoveList;
}];

View File

@ -26,6 +26,7 @@ params [["_startingPos",[0,0,0], [[]], 3], ["_buildingTypes", ["Building"], [[]]
TRACE_6("fnc_garrison: Start",_startingPos,_buldingTypes,count _unitsArray,_fillingRadius,_fillingTYpe,_topDownFilling);
_unitsArray = _unitsArray select {alive _x && {!isPlayer _x}};
private _currentUnitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
if (_startingPos isEqualTo [0,0,0]) exitWith {
TRACE_1("fnc_garrison: StartingPos error",_startingPos);
@ -79,11 +80,9 @@ if (_topDownFilling) then {
//Remove positions units are already pathing to
_buildingsIndex = _buildingsIndex apply {
private _testedBuilding = _x;
_testedBuilding select {
_x select {
private _testedPos = _x;
(({(_x select 1) isEqualTo _testedPos} count (missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []])) == 0)
({(_x select 1) isEqualTo _testedPos} count (missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []])) == 0
}
};
@ -147,6 +146,8 @@ switch (_fillingType) do {
_unit setPosATL _pos;
};
_currentUnitMoveList deleteAt (_currentUnitMoveList findIf {_x select 0 == _unit});
} else {
_unitMoveList pushBack [_unit,[_pos, AGLToASL _pos] select (_posSurface)];
};
@ -194,6 +195,8 @@ switch (_fillingType) do {
_unit setPosATL _pos;
};
_currentUnitMoveList deleteAt (_currentUnitMoveList findIf {_x select 0 == _unit});
} else {
_unitMoveList pushBack [_unit,[_pos, AGLToASL _pos] select (_posSurface)];
};
@ -239,6 +242,8 @@ switch (_fillingType) do {
_unit setPosATL _pos;
};
_currentUnitMoveList deleteAt (_currentUnitMoveList findIf {_x select 0 == _unit});
} else {
_unitMoveList pushBack [_unit,[_pos, AGLToASL _pos] select (_posSurface)];
};

View File

@ -53,10 +53,41 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
{
_x params ["_unit", "_pos"];
// Check if unit is alive or even existing
if (!alive _unit) then {
private _fnc_attemptFailed = {
if (_failSafeRemainingAttemps == 0 ) then {
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
[QGVAR(unGarrison), [[_unit]], _unit] call CBA_fnc_targetEvent;
_unitMoveList deleteAt (_unitMoveList find _x);
LOG("garrisonMove PFH: all moving commands failed | restoring AI capabilities");
} else {
_unit setVariable [QGVAR(garrisonMove_failSafe), [_failSafeTimer + 15, _failSafeRemainingAttemps - 1]];
[QGVAR(doMove), [[[_unit, _pos]]], _unit] call CBA_fnc_targetEvent;
LOG("garrisonMove PFH unitReady: unit not close enough | Sending another doMove command");
};
};
private _fnc_attemptSuccessful = {
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
_unit setVariable [QGVAR(garrisonned), true, true];
_unitMoveList deleteAt (_unitMoveList find _x);
LOG(format [ARR_2("garrisonMove PFH: unit dead or deleted | %1 units left", count _unitMoveList)]);
[QGVAR(AISection), [[_unit], ["PATH"], false], _unit] call CBA_fnc_targetEvent;
[QGVAR(AISection), [[_unit], ["FSM"], true], _unit] call CBA_fnc_targetEvent;
if ({(_x select 0) in units _unit && {!isPlayer (_x select 0)}} count _unitMoveList == 0) then {
[QGVAR(enableAttack), [[_unit], true], _unit] call CBA_fnc_targetEvent;
};
LOG(format [ARR_2("garrisonMove PFH: unit in position | %1 units left", count _unitMoveList)]);
};
// Check if unit is alive or even existing
if (!alive _unit || {_unit getVariable [QGVAR(garrisoned), false]}) then {
_unitMoveList deleteAt (_unitMoveList find _x);
LOG(format [ARR_2("garrisonMove PFH: unit dead, deleted or garrisoned via TP | %1 units left", count _unitMoveList)]);
} else {
private _unitPos = getPos _unit;
@ -68,38 +99,15 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
if (unitReady _unit) then {
// Check for distance, doMove and AI are moody and may stop for no reason, within 6 meters and ready should be fine
if (_unitPos distance _pos < 3) then {
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
_unit setVariable [QGVAR(garrisonned), true, true];
_unitMoveList deleteAt (_unitMoveList find _x);
[QGVAR(AISection), [[_unit], ["PATH"], false], _unit] call CBA_fnc_targetEvent;
[QGVAR(AISection), [[_unit], ["FSM"], true], _unit] call CBA_fnc_targetEvent;
if ({(_x select 0) in units _unit && {!isPlayer (_x select 0)}} count _unitMoveList == 0) then {
[QGVAR(enableAttack), [[_unit], true], _unit] call CBA_fnc_targetEvent;
};
LOG(format [ARR_2("garrisonMove PFH: unit in position | %1 units left", count _unitMoveList)]);
if (_unitPos distance _pos < 1.5) then {
call _fnc_attemptSuccessful;
} else {
// Tell the unit to move if an order wasn't given within 30s, avoid doMove spam
(_unit getVariable [QGVAR(garrisonMove_failSafe), [CBA_missionTime, 5]]) params ["_failSafeTimer", "_failSafeRemainingAttemps"];
if (_failSafeTimer <= CBA_missionTime) then {
if (_failSafeRemainingAttemps == 0 ) then {
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
[QGVAR(unGarrison), [[_unit]], _unit] call CBA_fnc_targetEvent;
_unitMoveList deleteAt (_unitMoveList find _x);
LOG("garrisonMove PFH unitReady: all moving commands failed | restoring AI capabilities");
} else {
_unit setVariable [QGVAR(garrisonMove_failSafe), [_failSafeTimer + 15, _failSafeRemainingAttemps - 1]];
[QGVAR(doMove), [[[_unit, _pos]]], _unit] call CBA_fnc_targetEvent;
LOG("garrisonMove PFH unitReady: unit not close enough | Sending another doMove command");
};
call _fnc_attemptFailed;
};
};
} else {
@ -107,30 +115,12 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
// AI may sometimes not be able to report unitReady, this is to avoid the PFH running forever
switch true do {
case ((_unitPosTimer + 15) < CBA_missionTime && {(_unitPos distance _pos) < 3}) : {
TRACE_1("case 1",_unit);
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
_unit setVariable [QGVAR(garrisonned), true, true];
_unitMoveList deleteAt (_unitMoveList find _x);
[QGVAR(AISection), [[_unit], ["PATH"], false], _unit] call CBA_fnc_targetEvent;
[QGVAR(AISection), [[_unit], ["FSM"], true], _unit] call CBA_fnc_targetEvent;
if ({(_x select 0) in units _unit && {!isPlayer (_x select 0)}} count _unitMoveList == 0) then {
[QGVAR(enableAttack), [[_unit], true], _unit] call CBA_fnc_targetEvent;
};
LOG(format [ARR_2("garrisonMove PFH unitNotReady: unit in position | %1 units left", count _unitMoveList)]);
case ((_unitPos distance _pos) < 1.5) : {
call _fnc_attemptSuccessful;
};
case ((_unitPosTimer + 15) < CBA_missionTime && {_unitOldPos distance _unitPos < 0.5}) : {
TRACE_3("case 2",_unit, ((_unitPosTimer + 15) < CBA_missionTime), (_unitOldPos distance _unitPos < 0.5));
_unit setVariable [QGVAR(garrisonMove_failSafe), nil, true];
_unit setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
[QGVAR(unGarrison), [[_unit]], _unit] call CBA_fnc_targetEvent;
_unitMoveList deleteAt (_unitMoveList find _x);
LOG("garrisonMove PFH unitNotReady: all moving commands failed | restoring AI capabilities");
case ((_unitPosTimer + 5) < CBA_missionTime && {_unitOldPos distance _unitPos < 0.5}) : {
call _fnc_attemptFailed;
};
case (_unitOldPos distance _unitPos < 0.5) : {};

View File

@ -21,37 +21,31 @@ params [["_units", [], [[]]]];
_units = _units select {local _x};
{
if (!isPlayer _x && {local _x}) then {
_x enableAI "PATH";
_x enableAI "FSM";
private _unit = _x;
if (!isPlayer _unit && {local _unit}) then {
_unit enableAI "PATH";
_unit enableAI "FSM";
private _leader = leader _x;
private _leader = leader _unit;
TRACE_3("fnc_ungarrison: unit and leader",_x , _leader, (_leader == _x));
TRACE_3("fnc_ungarrison: unit and leader",_unit , _leader, (_leader == _unit));
_x setVariable [QGVAR(garrisonned), false, true];
_unit setVariable [QGVAR(garrisonned), false, true];
if (_leader != _x) then {
doStop _x;
_x doFollow _leader;
private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
_unitMoveList deleteAt (_unitMoveList findIf {_x select 0 == _unit});
if (_leader != _unit) then {
doStop _unit;
_unit doFollow _leader;
} else {
_x doMove ((nearestBuilding (getPos _x)) buildingExit 0);
_unit doMove ((nearestBuilding (getPos _unit)) buildingExit 0);
};
private _fnc_countGarrisonnedUnits = {
params ["_unit", "_bool"];
if (_bool) then {
({(_x getVariable [QGVAR(garrisonned), false]) && {!isPlayer _x}} count units _unit)
} else {
({!(_x getVariable [QGVAR(garrisonned), false]) && {!isPlayer _x}} count units _unit)
};
};
if ([_x, true] call _fnc_countGarrisonnedUnits == ({!isPlayer _x} count (units _x)) - 1 || {[_x, false] call _fnc_countGarrisonnedUnits == {!isPlayer _x} count (units _x)}) then {
if ((units _unit) findif {(_x getVariable [QGVAR(garrisonned), false]) && !isPlayer _x} == -1) then {
LOG("fnc_ungarrison: enableAttack true");
(group _x) enableAttack true;
(group _unit) enableAttack true;
};
};
} foreach _units;

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="ai">
<Key ID="STR_ACE_ai_GarrisonInvalidPosition">
@ -9,6 +9,7 @@
<Chinese>提供的位置無效</Chinese>
<Chinesesimp>提供的位置无效。</Chinesesimp>
<Korean>위치가 잘못되었습니다.</Korean>
<Polish>Podano błędną pozycję.</Polish>
</Key>
<Key ID="STR_ACE_ai_GarrisonNoUnits">
<English>No units provided.</English>
@ -18,6 +19,7 @@
<Chinese>找不到可用的單位</Chinese>
<Chinesesimp>找不到可用的单位。</Chinesesimp>
<Korean>병력이 없습니다.</Korean>
<Polish>Nie podano żadnych jednostek.</Polish>
</Key>
<Key ID="STR_ACE_ai_GarrisonNotEnoughPos">
<English>There aren't enough positions to place all units.</English>
@ -27,6 +29,7 @@
<Chinese>沒有足夠的位置能擺放所有單位</Chinese>
<Chinesesimp>没有足够的位置能摆放所有单位。</Chinesesimp>
<Korean>모든 병력을 배치 할 공간이 없습니다.</Korean>
<Polish>Nie ma wystarczającej ilości pozycji, aby umieścić wszystkie jednostki.</Polish>
</Key>
<Key ID="STR_ACE_ai_GarrisonNoBuilding">
<English>No building found.</English>
@ -36,6 +39,7 @@
<Chinese>沒找到建築物</Chinese>
<Chinesesimp>没找到建筑物。</Chinesesimp>
<Korean>건물이 없습니다.</Korean>
<Polish>Nie znaleziono budynku.</Polish>
</Key>
</Package>
</Project>

View File

@ -17,4 +17,12 @@ class CfgModels {
sections[] = {"camo"};
skeletonName = "";
};
class ace_entrchtool: Default {};
class ace_envelope_big: Default {};
class ace_envelope_big4: Default {};
class ace_envelope_big4_nogeo: Default {};
class ace_envelope_small: Default {};
class ace_envelope_small4: Default {};
class ace_envelope_small4_nogeo: Default {};
class LWTS_optic: Default {};
};

View File

@ -74,6 +74,14 @@ class GVAR(stats) {
textStatement = QUOTE(call FUNC(statTextStatement_scopeMag));
tabs[] = {{}, {0}};
};
class ACE_scopeVisionMode: statBase {
scope = 2;
priority = 1;
displayName = CSTRING(statVisionMode);
showText = 1;
textStatement = QUOTE(call FUNC(statTextStatement_scopeVisionMode));
tabs[] = {{}, {0}};
};
class ACE_ballisticProtection: statBase {
scope = 2;
priority = 5;
@ -101,4 +109,14 @@ class GVAR(stats) {
barStatement = QUOTE([ARR_3((_this select 0) select 0, _this select 1, [ARR_3([ARR_2(0, 500)], [ARR_2(0.01, 1)], false)])] call FUNC(statBarStatement_default));
tabs[] = {{3,4,5}, {}};
};
class ACE_smokeChemTTL: statBase {
scope = 2;
priority = 3;
stats[] = {"ammo"};
displayName = CSTRING(statTTL);
showText = 1;
textStatement= QUOTE(call FUNC(statTextStatement_smokeChemTTL));
condition = QUOTE((configName (_this select 1)) isKindOf [ARR_2('smokeShell', configFile >> 'CfgMagazines')]);
tabs[] = {{}, {5}};
};
};

View File

@ -8,7 +8,7 @@ class Cfg3DEN {
class GVAR(DefaultLoadoutsListAttribute) {
property = QGVAR(DefaultLoadoutsListAttribute);
value = 0;
expression = QUOTE(if (!is3DEN) then {GVAR(defaultLoadoutsList) = _value};);
expression = QUOTE(if (!is3DEN) then {GVAR(defaultLoadoutsList) = _value});
defaultValue = "[]";
validate = "none";
wikiType = "[[Array]]";
@ -55,7 +55,7 @@ class Cfg3DEN {
};
class Category: ctrlToolboxPictureKeepAspect {
idc = IDC_ATTRIBUTE_CATEGORY;
onToolBoxSelChanged = QUOTE([ctrlParentControlsGroup (_this select 0)] call FUNC(attributeAddItems));
onToolBoxSelChanged = QUOTE([ARR_2(ctrlParentControlsGroup (_this select 0), _this select 1)] call FUNC(attributeCategory));
x = QUOTE(5 * ATTRIBUTE_W);
y = QUOTE(15 * ATTRIBUTE_H);
w = QUOTE(125 * ATTRIBUTE_W);
@ -102,6 +102,8 @@ class Cfg3DEN {
idcLeft = IDC_ATTRIBUTE_LIST_LEFT;
idcRight = IDC_ATTRIBUTE_LIST_RIGHT;
onLBDblClick = QUOTE(_this call FUNC(attributeDblClick));
onSetFocus = QUOTE(SETUVAR(QGVAR(attributeFocus),ctrlParentControlsGroup (_this select 0)));
onKillFocus = QUOTE(SETUVAR(QGVAR(attributeFocus),nil));
x = QUOTE(5 * ATTRIBUTE_W);
y = QUOTE(35.83 * ATTRIBUTE_H);
w = QUOTE(125 * ATTRIBUTE_W);
@ -127,7 +129,14 @@ class Cfg3DEN {
};
class SearchButton: ctrlButtonPicture {
idc = IDC_ATTRIBUTE_SEARCH_BUTTON;
onButtonClick = QUOTE(((ctrlParentControlsGroup (_this select 0)) controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR) ctrlSetText ''; [ctrlParentControlsGroup (_this select 0)] call FUNC(attributeAddItems));
onButtonClick = QUOTE( \
params ['_searchButton']; \
private _controlsGroup = ctrlParentControlsGroup _searchButton; \
private _searchBar = _controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR; \
_searchBar ctrlSetText ''; \
ctrlSetFocus _searchBar; \
[_controlsGroup] call FUNC(attributeAddItems); \
);
text = "\a3\Ui_f\data\GUI\RscCommon\RscButtonSearch\search_start_ca.paa";
x = QUOTE(5 * ATTRIBUTE_W);
y = QUOTE(101.83 * ATTRIBUTE_H);
@ -138,9 +147,16 @@ class Cfg3DEN {
class SearchBar: ctrlEdit {
idc = IDC_ATTRIBUTE_SEARCHBAR;
onKeyUp = QUOTE([ctrlParentControlsGroup (_this select 0)] call FUNC(attributeAddItems));
onMouseButtonClick = QUOTE( \
params [ARR_2('_searchBar','_button')]; \
if (_button != 1) exitWith {}; \
_searchBar ctrlSetText ''; \
ctrlSetFocus _searchBar; \
[ctrlParentControlsGroup _searchBar] call FUNC(attributeAddItems); \
);
x = QUOTE(11 * ATTRIBUTE_W);
y = QUOTE(101.83 * ATTRIBUTE_H);
w = QUOTE(55 * ATTRIBUTE_W);
w = QUOTE(40 * ATTRIBUTE_W);
h = QUOTE(5 * ATTRIBUTE_H);
};
class ClearButton: ctrlButton {
@ -160,6 +176,27 @@ class Cfg3DEN {
tooltip = CSTRING(AttributeExport_Tooltip);
x = QUOTE(79 * ATTRIBUTE_W);
};
class ImportButton: ClearButton {
idc = IDC_ATTRIBUTE_IMPORT_BUTTON;
onButtonClick = QUOTE([ctrlParentControlsGroup (_this select 0)] call FUNC(attributeImport));
text = CSTRING(buttonImportText);
tooltip = CSTRING(AttributeImport_Tooltip);
x = QUOTE(53 * ATTRIBUTE_W);
};
class AddCompatible: ctrlButton {
idc = IDC_ATTRIBUTE_ADD_COMPATIBLE;
style = ST_CENTER;
onButtonClick = QUOTE([ctrlParentControlsGroup (_this select 0)] call FUNC(attributeAddCompatible));
text = CSTRING(AttributeAddCompatible_DisplayName);
tooltip = CSTRING(AttributeAddCompatible_Tooltip);
font = "RobotoCondensedLight";
x = QUOTE(98.75 * ATTRIBUTE_W);
y = QUOTE(10.5 * ATTRIBUTE_H);
w = QUOTE(31.25 * ATTRIBUTE_W);
h = QUOTE(4 * ATTRIBUTE_H);
sizeEx = QUOTE(4 * ATTRIBUTE_H);
colorBackground[] = {0, 0, 0, 0.5};
};
};
};
};

View File

@ -0,0 +1,34 @@
class Display3DEN {
class ContextMenu: ctrlMenu {
class Items {
class Arsenal {
items[]= {"aceArsenal", "virtualArsenal"};
};
class virtualArsenal {
text = "BI Virtual Arsenal";
action = QUOTE(['arsenal'] call bis_fnc_3DENEntityMenu);
value = 0;
data = "Arsenal";
opensNewWindow = 1;
};
class aceArsenal: virtualArsenal {
text = "ACE Arsenal";
action = QUOTE(call DFUNC(open3DEN));
};
};
};
class Controls {
class MenuStrip: ctrlMenuStrip {
class Items {
class Tools {
items[] += {QGVAR(portVALoadouts)};
};
class GVAR(portVALoadouts) {
text = CSTRING(portLoadoutsText);
picture = QPATHTOEF(common,data\logo_ace3_ca.paa);
action = QUOTE(call DFUNC(portVALoadouts););
};
};
};
};
};

View File

@ -2,10 +2,14 @@ PREP(addDefaultLoadout);
PREP(addListBoxItem);
PREP(addStat);
PREP(addVirtualItems);
PREP(attributeAddCompatible);
PREP(attributeAddItems);
PREP(attributeCategory);
PREP(attributeClear);
PREP(attributeDblClick);
PREP(attributeImport);
PREP(attributeInit);
PREP(attributeKeyDown);
PREP(attributeLoad);
PREP(attributeMode);
PREP(attributeSelect);
@ -63,6 +67,8 @@ PREP(statTextStatement_accuracy);
PREP(statTextStatement_mass);
PREP(statTextStatement_rateOfFire);
PREP(statTextStatement_scopeMag);
PREP(statTextStatement_scopeVisionMode);
PREP(statTextStatement_smokeChemTTL);
PREP(updateCamPos);
PREP(updateRightPanel);
PREP(updateUniqueItemsList);

View File

@ -15,6 +15,7 @@ class CfgPatches {
};
#include "ui\RscAttributes.hpp"
#include "Display3DEN.hpp"
#include "Cfg3DEN.hpp"
#include "CfgEventHandlers.hpp"
#include "RscDisplayMain.hpp"

View File

@ -162,6 +162,8 @@
#define IDC_ATTRIBUTE_SEARCHBAR 8106
#define IDC_ATTRIBUTE_CLEAR_BUTTON 8107
#define IDC_ATTRIBUTE_EXPORT_BUTTON 8108
#define IDC_ATTRIBUTE_IMPORT_BUTTON 8109
#define IDC_ATTRIBUTE_ADD_COMPATIBLE 8110
#define SYMBOL_ITEM_NONE ""
#define SYMBOL_ITEM_REMOVE "×"
@ -362,7 +364,8 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
{(_accsArray select 2) findIf {_x == _item} > -1} ||\
{(_accsArray select 3) findIf {_x == _item} > -1}
#define CHECK_ASSIGNED_ITEMS\
// PboProject 2.45 has problems with these macros for some reason, adding a single space before the \ fixes
#define CHECK_ASSIGNED_ITEMS \
(GVAR(virtualItems) select 10) findIf {_x == _item} > -1 ||\
{(GVAR(virtualItems) select 11) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 12) findIf {_x == _item} > -1} ||\
@ -370,7 +373,7 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
{(GVAR(virtualItems) select 14) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 8) findIf {_x == _item} > -1}
#define CHECK_CONTAINER\
#define CHECK_CONTAINER \
(GVAR(virtualItems) select 4) findIf {_x == _item} > -1 ||\
{(GVAR(virtualItems) select 5) findIf {_x == _item} > -1} ||\
{(GVAR(virtualItems) select 6) findIf {_x == _item} > -1}
@ -381,7 +384,7 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
{isClass (_glassesCfg >> _item)} ||\
{isClass (_magCfg >> _item)}
#define CHECK_CONTAINER_ITEMS\
#define CHECK_CONTAINER_ITEMS \
(GVAR(virtualItems) select 3) findIf {_x == _item} > -1 ||\
{(_accsArray select 0) findIf {_x == _item} > -1} ||\
{(_accsArray select 1) findIf {_x == _item} > -1} ||\

View File

@ -193,7 +193,8 @@ if (_items isEqualType true) then {
switch true do {
// Rifle, handgun, secondary weapons mags
case (
(getNumber (configFile >> "CfgMagazines" >> _x >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW,TYPE_MAGAZINE_SECONDARY_AND_PUT,1536,TYPE_MAGAZINE_HANDGUN_AND_GL]) &&
((getNumber (configFile >> "CfgMagazines" >> _x >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW,TYPE_MAGAZINE_SECONDARY_AND_PUT,1536,TYPE_MAGAZINE_HANDGUN_AND_GL]) ||
{(getNumber (configFile >> "CfgMagazines" >> _x >> QGVAR(hide))) == -1}) &&
{!(_x in _grenadeList)} &&
{!(_x in _putList)}
): {

View File

@ -0,0 +1,75 @@
#include "script_component.hpp"
#include "..\defines.hpp"
/*
* Author: mharis001
* Adds compatible attachments or magazines for all weapons in 3DEN attribute.
*
* Arguments:
* 0: Attribute controls group <CONTROL>
*
* Return Value:
* None
*
* Example:
* [CONTROL] call ace_arsenal_fnc_attributeAddCompatible
*
* Public: No
*/
params ["_controlsGroup"];
private _category = lbCurSel (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY);
// Exit if selected category is not attachments or magazines
if !(_category in [4, 5, 6, 7, 8]) exitWith {};
private _configItems = +(uiNamespace getVariable [QGVAR(configItems), []]);
private _attributeValue = uiNamespace getVariable [QGVAR(attributeValue), [[], 0]];
_attributeValue params ["_attributeItems"];
// Get list of all weapons in attribute items
(_configItems select 0) params ["_primaryWeapons", "_secondaryWeapons", "_handgunWeapons"];
private _attributeWeapons = _attributeItems select {_x in _primaryWeapons || {_x in _secondaryWeapons} || {_x in _handgunWeapons}};
// Add compatible attachments or magazines to attribute
private _cfgWeapons = configFile >> "CfgWeapons";
private _itemsToAdd = [];
if (_category == 8) then {
private _magazineGroups = uiNamespace getVariable QGVAR(magazineGroups);
private _cfgMagazines = configFile >> "CfgMagazines";
{
private _weaponConfig = _cfgWeapons >> _x;
{
private _muzzleConfig = if (_x == "this") then {_weaponConfig} else {_weaponConfig >> _x};
// Only add existent magazines and ensure correct classname case
private _magazines = getArray (_muzzleConfig >> "magazines") select {isClass (_cfgMagazines >> _x)};
_magazines = _magazines apply {configName (_cfgMagazines >> _x)};
_itemsToAdd append _magazines;
{
_itemsToAdd append ([_magazineGroups, toLower _x] call CBA_fnc_hashGet);
} forEach getArray (_muzzleConfig >> "magazineWell");
} forEach getArray (_weaponConfig >> "muzzles");
} forEach _attributeWeapons;
} else {
private _attachmentCategory = _category - 4;
private _filter = ["optic", "pointer", "muzzle", "bipod"] select _attachmentCategory;
{
_itemsToAdd append ([_x, _filter] call CBA_fnc_compatibleItems);
} forEach _attributeWeapons;
// Only add items with scope of 2 and ensure correct classname case
_itemsToAdd = _itemsToAdd select {getNumber (_cfgWeapons >> _x >> "scope") == 2};
_itemsToAdd = _itemsToAdd apply {configName (_cfgWeapons >> _x)};
};
_attributeItems append _itemsToAdd;
_attributeValue set [0, _attributeItems arrayIntersect _attributeItems];
// Refresh the list for new items
[_controlsGroup] call FUNC(attributeAddItems);

View File

@ -11,7 +11,7 @@
* None
*
* Example:
* [CONTROL, 0] call ace_arsenal_fnc_attributeAddItems
* [CONTROL] call ace_arsenal_fnc_attributeAddItems
*
* Public: No
*/

View File

@ -0,0 +1,32 @@
#include "script_component.hpp"
#include "..\defines.hpp"
/*
* Author: mharis001
* Handles changing the category in 3DEN attribute.
*
* Arguments:
* 0: Attribute controls group <CONTROL>
* 1: Category <NUMBER>
*
* Return Value:
* None
*
* Example:
* [CONTROL, 0] call ace_arsenal_fnc_attributeCategory
*
* Public: No
*/
params ["_controlsGroup", "_category"];
// Store selected category
uiNamespace setVariable [QGVAR(attributeCategory), _category];
// Show add compatible items button when category is attachments or magazines
private _compatibleButton = _controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_ADD_COMPATIBLE;
private _enable = _category in [4, 5, 6, 7, 8];
_compatibleButton ctrlEnable _enable;
_compatibleButton ctrlShow _enable;
// Refresh the list for selected category
[_controlsGroup] call FUNC(attributeAddItems);

View File

@ -0,0 +1,49 @@
#include "script_component.hpp"
/*
* Author: mharis001
* Handles importing items list from clipboard into 3DEN attribute.
*
* Arguments:
* 0: Attribute controls group <CONTROL>
*
* Return Value:
* None
*
* Example:
* [CONTROL] call ace_arsenal_fnc_attributeImport
*
* Public: No
*/
params ["_controlsGroup"];
private _importList = call compile copyFromClipboard;
// Verify import list is in correct format
if (isNil "_importList" || {!(_importList isEqualType [])} || {!(_importList isEqualTypeAll "")}) exitWith {
playSound ["3DEN_notificationWarning", true];
};
// Ensure imported items are in scanned config array and classname case is correct
private _configItems = +(uiNamespace getVariable [QGVAR(configItems), []]);
private _configItemsFlat = _configItems select [2, 16];
_configItemsFlat append (_configItems select 0);
_configItemsFlat append (_configItems select 1);
private _filteredList = [];
{
private _item = _x;
{
private _index = _x findIf {_x == _item};
if (_index > -1) then {
_filteredList pushBackUnique (_x select _index);
};
} forEach _configItemsFlat;
} forEach _importList;
private _attributeValue = uiNamespace getVariable [QGVAR(attributeValue), [[], 0]];
_attributeValue set [0, _filteredList];
// Refresh the list for new items
[_controlsGroup] call FUNC(attributeAddItems);

View File

@ -21,9 +21,16 @@ _value params ["_items", "_mode"];
TRACE_2("Initializing object with attribute",_object,_value);
if (_mode > 0) then {
// Blacklist: all full arsenal and take items away
// Blacklist: add full arsenal and take items away
[_object, true, true] call FUNC(initBox);
[_object, _items, true] call FUNC(removeVirtualItems);
// Need to delay removal by 2 frames
[{
[{
params ["_object", "_items"];
[_object, _items, true] call FUNC(removeVirtualItems);
}, _this] call CBA_fnc_execNextFrame;
}, [_object, _items]] call CBA_fnc_execNextFrame;
} else {
// Exit on whitelist mode with no items
if (_items isEqualTo []) exitWith {};

View File

@ -0,0 +1,39 @@
#include "script_component.hpp"
#include "\a3\ui_f\hpp\defineDIKCodes.inc"
/*
* Author: mharis001
* Handles keyboard input for the 3DEN attribute.
*
* Arguments:
* 0: Display <DISPLAY>
* 1: Key code <NUMBER>
*
* Return Value:
* Handled <BOOL>
*
* Example:
* [DISPLAY, 0] call ace_arsenal_fnc_attributeKeyDown
*
* Public: No
*/
params ["_display", "_keyCode"];
TRACE_2("Attribute key down",_display,_keyCode);
// Exit if attribute is not in focus
private _controlsGroup = uiNamespace getVariable QGVAR(attributeFocus);
if (isNil "_controlsGroup") exitWith {false};
switch (_keyCode) do {
case DIK_LEFT;
case DIK_NUMPADMINUS: {
[_controlsGroup, false] call FUNC(attributeSelect);
true
};
case DIK_RIGHT;
case DIK_NUMPADPLUS: {
[_controlsGroup, true] call FUNC(attributeSelect);
true
};
default {false};
};

View File

@ -23,10 +23,19 @@ TRACE_1("Initializing 3DEN attribute",_value);
// Store working attribute value
uiNamespace setVariable [QGVAR(attributeValue), _value];
// Add keyDown EH to display
// Does not work properly when added to controls group
private _display = ctrlParent _controlsGroup;
_display displayAddEventHandler ["KeyDown", {call FUNC(attributeKeyDown)}];
// Handle selected mode
if (_value select 1 > 0) then {
(_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_MODE) lbSetCurSel 1;
(_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_LIST_RIGHT) ctrlSetText SYMBOL_ITEM_REMOVE;
};
[_controlsGroup] call FUNC(attributeAddItems);
// Trigger category selection for last selected category to populate list
private _category = uiNamespace getVariable [QGVAR(attributeCategory), 0];
(_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY) lbSetCurSel _category;
[_controlsGroup, _category] call FUNC(attributeCategory);

View File

@ -124,7 +124,17 @@ switch (GVAR(currentLoadoutsTab)) do {
};
};
if (_loadoutIndex == -1) then {
if (GVAR(shiftState) && {is3DEN} && {!(_loadoutName isEqualTo "")} && {_cursSelRow != -1} && {!(_loadoutIndex isEqualto -1)}) exitwith {
private _defaultLoadoutsSearch = GVAR(defaultLoadoutsList) findIf {(_x select 0) == _loadoutName};
if (_defaultLoadoutsSearch isEqualto -1) then {
GVAR(defaultLoadoutsList) pushBack [_loadoutName, _curSelLoadout];
} else {
GVAR(defaultLoadoutsList) set [_defaultLoadoutsSearch , [ _loadoutName, _curSelLoadout]];
};
set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]];
};
if (_loadoutIndex isEqualto -1) then {
_data pushBack [_editBoxContent, _loadout];
} else {
_data set [_loadoutIndex, [[_editBoxContent, _loadoutName] select (_loadoutName isEqualTo _editBoxContent), _loadout]];

View File

@ -30,7 +30,7 @@ if (_global && {isMultiplayer} && {{_object in _x} count GVAR(EHIDArray) == 0})
private _ID = [QGVAR(initBox), [_object, _items, false]] call CBA_fnc_globalEventJIP;
[_ID, _object] call CBA_fnc_removeGlobalEventJIP;
GVAR(EHIDArray) pushBack [_ID, _object];
publicVariable QGVAR(EHIDArray);
} else {
@ -38,19 +38,19 @@ if (_global && {isMultiplayer} && {{_object in _x} count GVAR(EHIDArray) == 0})
if ({(_x select 0) select 0 isEqualTo QGVAR(interaction)} count (_object getVariable [QEGVAR(interact_menu,actions), []]) == 0) then {
private _action = [
QGVAR(interaction),
QGVAR(interaction),
localize "STR_A3_Arsenal",
"",
"",
{
params ["_target", "_player"];
[_target, _player] call FUNC(openBox);
},
},
{
params ["_target", "_player"];
[_player, _target] call EFUNC(common,canInteractWith)
},
},
{},
[]
] call EFUNC(interact_menu,createAction);

View File

@ -48,6 +48,7 @@ switch (ctrlIDC _control) do {
case IDC_buttonMyLoadouts: {
_centerBoxTitleCtrl ctrlSetText (localize LSTRING(tabMyLoadoutsText));
if (is3den) then { _saveButtonCtrl ctrlSetTooltip format ["%1\n%2", localize LSTRING(buttonSaveTooltip), localize LSTRING(buttonSaveTooltip_shiftClick)]; };
_saveButtonCtrl ctrlEnable true;
_saveButtonCtrl ctrlCommit 0;
};
@ -55,6 +56,7 @@ switch (ctrlIDC _control) do {
case IDC_buttonDefaultLoadouts: {
_centerBoxTitleCtrl ctrlSetText (localize LSTRING(tabDefaultLoadoutsText));
if (is3den) then { _saveButtonCtrl ctrlSetTooltip localize LSTRING(buttonSaveTooltip); };
_saveButtonCtrl ctrlEnable (is3DEN);
_saveButtonCtrl ctrlCommit 0;
};
@ -62,6 +64,7 @@ switch (ctrlIDC _control) do {
case IDC_buttonSharedLoadouts: {
_centerBoxTitleCtrl ctrlSetText (localize LSTRING(tabSharedLoadoutsText));
if (is3den) then { _saveButtonCtrl ctrlSetTooltip localize LSTRING(buttonSaveTooltip); };
_saveButtonCtrl ctrlEnable false;
_saveButtonCtrl ctrlCommit 0;
};

View File

@ -66,6 +66,11 @@ if (is3DEN) then {
deleteVehicle GVAR(cameraHelper);
camDestroy GVAR(camera);
if (!isNil QGVAR(moduleUsed)) then {
GVAR(moduleUsed) = nil;
objNull remoteControl GVAR(center);
};
if (isMultiplayer) then {
[QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(center) + "_face"] call CBA_fnc_globalEventJIP;

View File

@ -296,6 +296,10 @@ if (is3DEN) then {
} else {
GVAR(centerNotPlayer) = (GVAR(center) != player);
if (currentVisionMode ACE_Player == 1) then {
GVAR(center) action ["NVGogglesOff", GVAR(center)];
};
{
private _ctrl = _display displayCtrl _x;
_ctrl ctrlEnable GVAR(enableIdentityTabs);

View File

@ -1,6 +1,6 @@
#include "script_component.hpp"
#include "..\defines.hpp"
#include "\A3\ui_f\hpp\defineDIKCodes.inc"
#include "\a3\ui_f\hpp\defineDIKCodes.inc"
/*
* Author: Alganthe
* Handles keyboard inputs in arsenal.

View File

@ -57,7 +57,7 @@ switch (GVAR(currentLeftPanel)) do {
call _fnc_clearPreviousWepMags;
private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x};
GVAR(center) addWeaponGlobal _item;
GVAR(center) addWeapon _item;
GVAR(center) addWeaponItem [_item, [(getArray (configfile >> "cfgweapons" >> _item >> "magazines")) select 0]];
{
@ -95,7 +95,7 @@ switch (GVAR(currentLeftPanel)) do {
call _fnc_clearPreviousWepMags;
private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x};
GVAR(center) addWeaponGlobal _item;
GVAR(center) addWeapon _item;
GVAR(center) addWeaponItem [_item, [(getArray (configfile >> "cfgweapons" >> _item >> "magazines")) select 0]];
{
@ -132,7 +132,7 @@ switch (GVAR(currentLeftPanel)) do {
call _fnc_clearPreviousWepMags;
private _compatibleItems = (_item call bis_fnc_compatibleItems) apply {tolower _x};
GVAR(center) addWeaponGlobal _item;
GVAR(center) addWeapon _item;
GVAR(center) addWeaponItem [_item, [(getArray (configfile >> "cfgweapons" >> _item >> "magazines")) select 0]];
{
@ -295,7 +295,7 @@ switch (GVAR(currentLeftPanel)) do {
GVAR(currentItems) set [9, _item];
} else {
if ((GVAR(currentItems) select 9) != _item) then {
GVAR(center) addWeaponGlobal _item;
GVAR(center) addWeapon _item;
GVAR(currentItems) set [9, _item];
call FUNC(showItem);
ADDBINOCULARSMAG

View File

@ -57,7 +57,7 @@ private _configCfgWeapons = configFile >> "CfgWeapons"; //Save this lookup in va
case (_itemInfoType == TYPE_HEADGEAR): {
(_cargo select 3) pushBackUnique _className;
};
/* Uniform */\
/* Uniform */
case (_itemInfoType == TYPE_UNIFORM): {
(_cargo select 4) pushBackUnique _className;
};
@ -142,7 +142,8 @@ private _putList = [];
switch true do {
// Rifle, handgun, secondary weapons mags
case (
(getNumber (_x >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW,TYPE_MAGAZINE_SECONDARY_AND_PUT,1536,TYPE_MAGAZINE_HANDGUN_AND_GL]) &&
((getNumber (_x >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW,TYPE_MAGAZINE_SECONDARY_AND_PUT,1536,TYPE_MAGAZINE_HANDGUN_AND_GL]) ||
{(getNumber (_x >> QGVAR(hide))) == -1}) &&
{!(_className in _grenadeList)} &&
{!(_className in _putList)}
): {

View File

@ -18,14 +18,18 @@
params ["_stat", "_config", "_args"];
_args params ["_statMinMax", "_barLimits"];
TRACE_4("statBarStatement_accuracy",_stat,_config,_statMinMax,_barLimits);
private _fireModes = getArray (_config >> "modes");
private _dispersion = [];
{
_dispersion pushBackUnique log (getNumber (_config >> _x >> "dispersion"));
private _n = log (getNumber (_config >> _x >> "dispersion"));
if (!finite _n) then {_n = 0;};
_dispersion pushBackUnique _n;
} foreach _fireModes;
_dispersion sort true;
TRACE_1("",_dispersion);
linearConversion [_statMinMax select 0, _statMinMax select 1, _dispersion param [0, 0], _barLimits select 0, _barLimits select 1]

View File

@ -23,7 +23,9 @@ private _fireModes = getArray (_config >> "modes");
private _fireRate = [];
{
_fireRate pushBackUnique log (getNumber (_config >> _x >> "reloadTime"));
private _n = log (getNumber (_config >> _x >> "reloadTime"));
if (!finite _n) then {_n = 0;};
_fireRate pushBackUnique _n;
} foreach _fireModes;
_fireRate sort true;

View File

@ -11,7 +11,7 @@
* 2.2: Evaluate as a logarithmic number (BOOL)
*
* Return Value:
* Number
* String
*
* Public: No
*/
@ -29,4 +29,5 @@ private _fireRate = [];
_fireRate sort true;
_fireRate = _fireRate param [0, 0];
if (_fireRate == 0) exitWith {"PEWPEWPEW"};
format ["%1 rpm", round (60 / _fireRate)]

View File

@ -0,0 +1,68 @@
#include "script_component.hpp"
/*
* Author: Dedmen
* Text statement for the scope Night vision support stat.
*
* Arguments:
* 0: not used
* 1: item config path (CONFIG)
*
* Return Value:
* String to display
*
* Public: No
*/
params ["", "_config"];
TRACE_1("statTextStatement_scopeVisionMode",_config);
private _opticsModes = ("true" configClasses (_config >> "ItemInfo" >> "OpticsModes")) apply {
private _visionMode = getArray (_x >> "visionMode");
[
getNumber (_x >> "useModelOptics") == 1, //is in optics
_visionMode isEqualTo [], //optional NVG
"NVG" in _visionMode, //Integrated NVG
"Ti" in _visionMode //Integrated Thermal
]
};
private _primaryNVGIntegrated = false;
private _primaryNVGSupported = false;
private _primaryTiIntegrated = false;
private _secondaryNVGSupported = false;
{
_x params ["_isPrimary", "_optionalNvg", "_integratedNVG", "_integratedTi"];
if (_isPrimary) then {
if (_integratedNVG) then {
_primaryNVGIntegrated = true;
};
if (_optionalNvg) then {
_primaryNVGSupported = true;
};
if (_integratedTi) then {
_primaryTiIntegrated = true;
};
} else {
if (_optionalNvg) then {
_secondaryNVGSupported = true;
}
}
} forEach _opticsModes;
//Detecting Primary by useModelOptics works in 99.9% of cases.
//But on some scopes (from one specific mod) even the primary mode has useModelOptics=false
//So we have this workaround
if (
count _opticsModes == 1 || //If we only have a single mode. And it's a secondary, then consider it primary.
{{_x select 1} count _opticsModes == count _opticsModes} //If every mode supports it. Then then the primary also supports it
) then {
_primaryNVGSupported = _secondaryNVGSupported;
};
if (_primaryNVGIntegrated) exitWith {LLSTRING(statVisionMode_IntPrim)};
if (_primaryNVGSupported) exitWith {LLSTRING(statVisionMode_supPrim)};
if (_secondaryNVGSupported) exitWith {LLSTRING(statVisionMode_supSec)};
LLSTRING(statVisionMode_NoSup)

View File

@ -0,0 +1,40 @@
#include "script_component.hpp"
/*
* Author: Alganthe
* Text statement for the smoke / chemlight time to live stat.
*
* Arguments:
* 0: not used
* 1: item config path (CONFIG)
*
* Return Value:
* String to display
*
* Public: No
*/
params ["", "_config"];
private _TTL = getNumber (configFile >> "CfgAmmo" >> getText (_config >> "ammo") >> "timeToLive");
if (_TTL > 3600) then {
_TTL = _TTL / 60^2;
_TTL = str _TTL splitString ".";
if (count _TTL > 1) then {
format [
"%1h %2m",
parseNumber (_TTL select 0),
round (60 * parseNumber ("0." + (_TTL select 1)))
]
} else {
format [
"%1h",
parseNumber (_TTL select 0)
]
};
} else {
format ["%1m", round (_TTL / 60)];
};

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Arsenal">
<Key ID="STR_ACE_Arsenal_buttonHideText">
@ -100,6 +100,11 @@
<Chinese>保存當前的裝備</Chinese>
<Chinesesimp>保存当前的装备</Chinesesimp>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSaveTooltip_shiftClick">
<English>[Shift+Click to save to mission defaults]</English>
<Japanese>[Shift + クリック] でミッション標準として保存します</Japanese>
<Polish>Shift + Klik aby zapisac jako domyślne dla misji </Polish>
</Key>
<Key ID="STR_ACE_Arsenal_buttonRenameText">
<English>Rename</English>
<French>Renommer</French>
@ -604,6 +609,7 @@
<Korean>ACE 아스날을 열 수 없음</Korean>
<Chinese>無法開啟ACE虛擬軍火庫</Chinese>
<Chinesesimp>无法开启ACE虚拟军火库</Chinesesimp>
<Polish>Nie można otworzyć arsenału ACE</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_portLoadoutsText">
<English>Import BI VA loadouts to ACE Arsenal</English>
@ -614,6 +620,7 @@
<Chinese>匯入BI原廠虛擬軍火庫的裝備到ACE虛擬軍火庫中</Chinese>
<Chinesesimp>汇入BI原厂虚拟军火库的装备到ACE虚拟军火库中</Chinesesimp>
<Italian>Importa l'arsenale virtuale BI nell'arsenale ACE</Italian>
<Polish>Importuj zestawy wyposażenia z wirtualnego arsenału BI do arsenału ACE</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_portLoadoutsPlayerError">
<English>No player unit available! Place a unit and mark it as "Player".</English>
@ -624,6 +631,7 @@
<Chinese>沒有可用的玩家單位!請擺放一個單位並設定成"玩家"</Chinese>
<Chinesesimp>没有可用的玩家单位!请摆放一个单位并设定成"玩家"。</Chinesesimp>
<Italian>Non ci sono giocatori! Poisziona una unità e impostala come "Giocatore".</Italian>
<Polish>Brak dostępnych jednostek gracza! Postaw jednostkę i oznacz ją jako "Gracz".</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_portLoadoutsLoadoutError">
<English>No loadouts to import.</English>
@ -634,6 +642,7 @@
<Chinese>沒有裝備被匯入</Chinese>
<Chinesesimp>没有装备被汇入。</Chinesesimp>
<Italian>Non ci sono equipaggiamenti da importare.</Italian>
<Polish>Brak zestawów wyposażenia do zaimportowania.</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_Mission">
<English>ACE Arsenal</English>
@ -643,6 +652,7 @@
<Chinese>ACE虛擬軍火庫</Chinese>
<Chinesesimp>ACE虚拟军火库</Chinesesimp>
<Italian>Arsenale ACE</Italian>
<Polish>Arsenał ACE</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_ReturnToArsenal">
<English>Return to ACE Arsenal.</English>
@ -652,24 +662,27 @@
<Chinese>返回到ACE虛擬軍火庫</Chinese>
<Chinesesimp>返回到ACE虚拟军火库。</Chinesesimp>
<Italian>Torna all'arsenale ACE</Italian>
<Polish>Wróć do arsenału ACE.</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_Mission_tooltip">
<English>Use ACE Arsenal to try out different weapons and equipment.</English>
<German>Verwende ACE-Arsenal und sieh dir verschiedene Waffen und Ausrüstung an und probiere sie aus.</German>
<Japanese>さまざまな武器と装備を試せるよう ACE 武器庫を使用します。</Japanese>
<Japanese>様々な武器と装備を試せるよう ACE 武器庫を使用します。</Japanese>
<Korean>ACE Arsenal을 사용하여 다른 무기와 장비를 시험해보십시오.</Korean>
<Chinese>使用ACE虛擬軍火庫來嘗試不同的武器與裝備</Chinese>
<Chinesesimp>使用ACE虚拟军火库来尝试不同的武器与装备。</Chinesesimp>
<Italian>Usa l'arsenale ACE per provare armi ed equipaggiamenti vari.</Italian>
<Polish>Skorzystaj z arsenału ACE by wypróbować broń i ekwipunek.</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_Mission_overview">
<English>Try weapons and equipment and create your own loadouts.</English>
<German>Probiere verschiedene Waffen und Ausrüstung aus und stelle dir eigene Ausrüstungsprofile zusammen.</German>
<Japanese>さまざまな武器と装備を試して、あなただけの装備を作成してください。</Japanese>
<Japanese>様々な武器と装備を試して、あなただけの装備を作成してください。</Japanese>
<Korean>무기와 장비를 사용해보고 자신의 로드아웃을 만듭니다.</Korean>
<Chinese>嘗試不同的武器與裝備來組合你個人的裝備配置</Chinese>
<Chinesesimp>尝试不同的武器与装备来组合你个人的装备配置。</Chinesesimp>
<Italian>Prova armi ed equipaggiamenti e creai i tuoi equipaggiamenti personalizzati.</Italian>
<Polish>Wypróbuj broń i ekwipunek i stwórz swoje własne zestawy wyposażenia.</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_buttonLoadoutsTooltip">
<English>Open the loadouts screen</English>
@ -678,6 +691,7 @@
<Chinesesimp>开启装备选单</Chinesesimp>
<Japanese>装備画面を開く</Japanese>
<Italian>Apri la pagina degli equipaggiamenti</Italian>
<Polish>Otwórz ekran zestawów</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_buttonExportTooltip">
<English>Export current / default loadouts</English>
@ -686,6 +700,7 @@
<Chinesesimp>汇出当前/预设的装备</Chinesesimp>
<Japanese>現在 / 標準装備を出力</Japanese>
<Italian>Esporta l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base</Italian>
<Polish>Eksportuj obecne / domyślne zestawy wyposażenia </Polish>
</Key>
<Key ID="STR_ACE_Arsenal_buttonImportTooltip">
<English>Import current / default loadouts</English>
@ -694,6 +709,7 @@
<Chinesesimp>汇入当前/预设的装备</Chinesesimp>
<Japanese>現在 / 標準装備を取込</Japanese>
<Italian>Importa l'equipaggiamento attuale oppure la lista degli equipaggiamenti di base</Italian>
<Polish>Importuj obecne / domyślne zestawy wyposażenia</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_statPotassium">
<English>Potassium levels</English>
@ -702,6 +718,7 @@
<Chinesesimp>钾水平</Chinesesimp>
<Chinese>鉀水平</Chinese>
<Italian>Ilvello di potassio</Italian>
<Polish>Poziomy potasu</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_statMagnification">
<English>Magnification</English>
@ -719,6 +736,41 @@
<Japanese>拡大倍率</Japanese>
<Turkish>Büyütme</Turkish>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode">
<English>Nightvision Support</English>
<German>Nachtsicht Unterstützung</German>
<Japanese>暗視装置に対応</Japanese>
<Polish>Wsparcie noktowizyjne</Polish>
<Italian>Supporto visore notturno</Italian>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_supPrim">
<English>Primary supported</English>
<German>Primär unterstützt</German>
<Japanese>プライマリが対応</Japanese>
<Polish>Wspierane przez broń główną</Polish>
<Italian>Primario supportato</Italian>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_supSec">
<English>Secondary supported</English>
<German>Sekundär unterstützt</German>
<Japanese>セカンダリが対応</Japanese>
<Polish>Wspierane przez broń drugorzędną</Polish>
<Italian>Secondario supportato</Italian>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_IntPrim">
<English>Primary integrated</English>
<German>Primär Integriert</German>
<Japanese>プライマリに内蔵</Japanese>
<Polish>Zintegrowane z bronią główną</Polish>
<Italian>Primario integrato</Italian>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_NoSup">
<English>Not Supported</English>
<German>Nicht unterstützt</German>
<Japanese>セカンダリに内蔵</Japanese>
<Polish>Nie wspierane</Polish>
<Italian>Non supportato</Italian>
</Key>
<Key ID="STR_ACE_Arsenal_page">
<English>Page</English>
<French>Page</French>
@ -726,6 +778,7 @@
<Chinesesimp>页面</Chinesesimp>
<Chinese>頁面</Chinese>
<Italian>Pagina</Italian>
<Polish>Strona</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_enableIdentityTabsSettings">
<English>Enable the faces / voices / insignias tabs</English>
@ -734,6 +787,7 @@
<Chinesesimp>启用脸谱/声音/徽章/选项 </Chinesesimp>
<Chinese>啟用臉譜/聲音/徽章選項</Chinese>
<Italian>Abilita volti, voci e insegne</Italian>
<Polish>Aktywuj zakładki twarz / głos / insygnia</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_buttonClearContainerTooltip">
<English>Empty the selected container</English>
@ -742,6 +796,7 @@
<Chinesesimp>选择的箱子是空的</Chinesesimp>
<Chinese>清空選擇的箱子</Chinese>
<Italian>Svuota il contenitore selezionato</Italian>
<Polish>Opróżnij wybrany pojemnik</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_exportedClassnameText">
<English>Exported class name to clipboard</English>
@ -750,6 +805,7 @@
<Chinesesimp>将种类复制到剪贴板</Chinesesimp>
<Chinese>輸出 class name 到剪貼簿上</Chinese>
<Italian>Copiato il nome della classe negli appunti</Italian>
<Polish>Wyeksportowano nazwę klasy do schowka</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_Mode">
<English>Mode</English>
@ -769,7 +825,7 @@
</Key>
<Key ID="STR_ACE_Arsenal_Whitelist">
<English>Whitelist</English>
<Polish>Biała lista</Polish>
<Polish>Biała lista (lista wybranych)</Polish>
<Spanish>Lista blanca</Spanish>
<German>Whitelist</German>
<Czech>Seznam povolených</Czech>
@ -786,6 +842,8 @@
<Key ID="STR_ACE_Arsenal_Blacklist">
<English>Blacklist</English>
<Japanese>禁止リスト</Japanese>
<Italian>Lista Nera</Italian>
<Polish>Czarna lista (lista wykluczeń)</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_Items">
<English>Items</English>
@ -806,6 +864,27 @@
<Key ID="STR_ACE_Arsenal_AttributeExport_Tooltip">
<English>Export current items list as an array for use in scripts</English>
<Japanese>スクリプト用に現在のアイテム リストをアレイで出力します</Japanese>
<Italian>Esporta l'attuale lista di elementi come un array, per essere usati negli script</Italian>
<Polish>Eksportuj obecną listę przedmiotów jako tablicę do wykorzystania w skryptach</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_AttributeImport_Tooltip">
<English>Import items list array from clipboard (should be the same format as export)</English>
<Polish>Zaimportuj listę przedmiotów ze schowka (lista musi być w tym samym formacie jak przy exporcie)</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_AttributeAddCompatible_DisplayName">
<English>Add Compatible Items</English>
<Polish>Dodaj kompatybilne przedmioty</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_AttributeAddCompatible_Tooltip">
<English>Will automatically add compatible attachments or magazines (based on selected category) for all weapons in current items list</English>
<Polish>Automatycznie doda kompatybilne dodatki oraz magazynki (odpowiednio do każdej kategorii) dla wszystkich broni na liście</Polish>
</Key>
<Key ID="STR_ACE_Arsenal_statTTL">
<English>Time to live</English>
<French>Durée de vie</French>
<Japanese>生存時間</Japanese>
<Polish>Czas by żyć</Polish>
<Italian>Scadenza (TTL)</Italian>
</Key>
</Package>
</Project>

View File

@ -266,38 +266,3 @@ class ctrlMapEmpty;
class ctrlMapMain;
class ctrlListNBox;
class ctrlCheckboxToolbar;
class Display3DEN {
class ContextMenu :ctrlMenu {
class Items {
class Arsenal {
items[]= {"aceArsenal", "virtualArsenal"};
};
class virtualArsenal {
text = "BI Virtual Arsenal";
action= QUOTE(['arsenal'] call bis_fnc_3DENEntityMenu);
value=0;
data="Arsenal";
opensNewWindow=1;
};
class aceArsenal: virtualArsenal {
text = "ACE Arsenal";
action= QUOTE(call FUNC(open3DEN));
};
};
};
class Controls {
class MenuStrip: ctrlMenuStrip {
class Items {
class Tools {
items[] += {"ACE_arsenal_portVALoadouts"};
};
class ACE_arsenal_portVALoadouts {
text = CSTRING(portLoadoutsText);
picture = QPATHTOEF(common,data\logo_ace3_ca.paa);
action = "call ace_arsenal_fnc_portVALoadouts;";
};
};
};
};
};

View File

@ -7,12 +7,12 @@ class Extended_PreStart_EventHandlers {
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE( call COMPILE_FILE(XEH_preInit) );
init = QUOTE(call COMPILE_FILE(XEH_preInit));
};
};
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE( call COMPILE_FILE(XEH_postInit) );
init = QUOTE(call COMPILE_FILE(XEH_postInit));
};
};
};

View File

@ -12,7 +12,7 @@ class Extended_PreInit_EventHandlers {
};
class Extended_PostInit_EventHandlers {
class ADDON {
clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) );
clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit));
};
};
class Extended_GetIn_EventHandlers {

View File

@ -77,17 +77,12 @@ class CfgVehicles {
simulation = "nvmarker";
class NVGMarker {
diffuse[] = {0.006, 0.006, 0.006, 1};
ambient[] = {0.005, 0.005, 0.005, 1};
brightness = 0.1;
diffuse[]={0.015,0.015,0.015};
ambient[]={0.001,0.001,0.001};
brightness=0.45;
name = "pozicni blik";
drawLightSize = 0.1;
drawLightCenterSize = 0.003;
activeLight = 0;
blinking=1;
blinkingStartsOn=1;
blinkingPattern[] = {2,2};
blinkingPatternGuarantee = false;
dayLight = 0;
onlyInNvg = 1;
useFlare = 0;

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Attach">
<Key ID="STR_ACE_Attach_AttachDetach">

View File

@ -53,7 +53,7 @@ class EGVAR(arsenal,stats) {
stats[] = {"initSpeed"};
displayName= CSTRING(statMuzzleVelocity);
showText= 1;
textStatement = QUOTE(params[ARR_2('_stat', '_config')]; private _initSpeed = getNumber (_config >> _stat select 0); format [ARR_3('%1 m/s (%2 ft/s)', _initSpeed, (_initSpeed * 3.28084) toFixed 0)]);
textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_magazineMuzzleVelocity));
condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0);
tabs[] = {{}, {4}};
};

View File

@ -603,6 +603,17 @@ class CfgAmmo {
ACE_muzzleVelocities[]={510, 550, 596};
ACE_barrelLengths[]={304.8, 406.4, 609.6};
};
class B_570x28_Ball: BulletBase {
ACE_caliber = 5.7;
ACE_bulletLength = 21.6; // http://blog.thejustnation.org/2011/04/5-7x28mm-ammo-review/
ACE_bulletMass = 2; // based on the SS190
ACE_ballisticCoefficients[] = {0.177}; //http://m.delphiforums.com/autogun/messages/5267/7
ACE_velocityBoundaries[] = {};
ACE_standardAtmosphere = "ASM"; // 50/50 chance to get it right
ACE_dragModel = 7;
ACE_muzzleVelocities[] = {716,776};
ACE_barrelLengths[] = {264,407};
};
class B_19mm_HE: BulletBase {
tracerScale = 1;
};

View File

@ -0,0 +1,190 @@
class CfgMagazineWells {
class CBA_65x39_MX {
ADDON[] = {
"ACE_30Rnd_65x39_caseless_mag_Tracer_Dim",
"ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim"
};
};
class CBA_65x39_MX_XL {
ADDON[] = {
"ACE_100Rnd_65x39_caseless_mag_Tracer_Dim"
};
};
class CBA_65x39_Mk200 {
ADDON[] = {
"ACE_200Rnd_65x39_cased_Box_Tracer_Dim"
};
};
class CBA_556x45_STANAG {
ADDON[] = {
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
};
};
class STANAG_556x45 { //Vanilla magwell
ADDON[] = {
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
};
};
class CBA_762x51_M14 {
ADDON[] = {
"ACE_20Rnd_762x51_Mag_Tracer",
"ACE_20Rnd_762x51_Mag_Tracer_Dim",
"ACE_20Rnd_762x51_Mag_SD",
"ACE_10Rnd_762x51_M118LR_Mag",
"ACE_10Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_10Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_10Rnd_762x51_M993_AP_Mag",
"ACE_20Rnd_762x51_M118LR_Mag",
"ACE_20Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_20Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_20Rnd_762x51_M993_AP_Mag"
};
};
class CBA_762x51_HK417 {
ADDON[] = {
"ACE_20Rnd_762x51_Mag_Tracer",
"ACE_20Rnd_762x51_Mag_Tracer_Dim",
"ACE_20Rnd_762x51_Mag_SD",
"ACE_10Rnd_762x51_M118LR_Mag",
"ACE_10Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_10Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_10Rnd_762x51_M993_AP_Mag",
"ACE_20Rnd_762x51_M118LR_Mag",
"ACE_20Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_20Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_20Rnd_762x51_M993_AP_Mag"
};
};
class CBA_762x51_SR25 {
ADDON[] = {
"ACE_20Rnd_762x51_Mag_Tracer",
"ACE_20Rnd_762x51_Mag_Tracer_Dim",
"ACE_20Rnd_762x51_Mag_SD",
"ACE_10Rnd_762x51_M118LR_Mag",
"ACE_10Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_10Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_10Rnd_762x51_M993_AP_Mag",
"ACE_20Rnd_762x51_M118LR_Mag",
"ACE_20Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_20Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_20Rnd_762x51_M993_AP_Mag"
};
};
class CBA_762x51_G3 {
ADDON[] = {
"ACE_20Rnd_762x51_Mag_Tracer",
"ACE_20Rnd_762x51_Mag_Tracer_Dim",
"ACE_20Rnd_762x51_Mag_SD",
"ACE_10Rnd_762x51_M118LR_Mag",
"ACE_10Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_10Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_10Rnd_762x51_M993_AP_Mag",
"ACE_20Rnd_762x51_M118LR_Mag",
"ACE_20Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_20Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_20Rnd_762x51_M993_AP_Mag"
};
};
//Missing in CBA
//ACE_20Rnd_762x67_Mk248_Mod_0_Mag
//ACE_20Rnd_762x67_Mk248_Mod_1_Mag
//ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag
class CBA_65C_AR10 {
ADDON[] = {
"ACE_30Rnd_65_Creedmor_mag",
"ACE_20Rnd_65_Creedmor_mag",
"ACE_30Rnd_65x47_Scenar_mag",
"ACE_20Rnd_65x47_Scenar_mag"
};
};
class CBA_338LM_AI { //338 Lapua Magnum Accuracy International
ADDON[] = {
"ACE_10Rnd_338_300gr_HPBT_Mag",
"ACE_10Rnd_338_API526_Mag"
};
};
class CBA_408CT_Inter {
ADDON[] = {
"ACE_7Rnd_408_305gr_Mag"
};
};
class CBA_50BMG_M107 {
ADDON[] = {
"ACE_5Rnd_127x99_Mag",
"ACE_5Rnd_127x99_API_Mag",
"ACE_5Rnd_127x99_AMAX_Mag"
};
};
class CBA_9x19_P226 { // SIG P226
ADDON[] = {
"ACE_16Rnd_9x19_mag"
};
};
class CBA_9x19_P228 { // SIG P228
ADDON[] = {
"ACE_16Rnd_9x19_mag"
};
};
class CBA_9x19_P239 { // SIG P239
ADDON[] = {
"ACE_16Rnd_9x19_mag"
};
};
class CBA_9x19_HiPower {
ADDON[] = {
"ACE_16Rnd_9x19_mag"
};
};
class SVD_762x54R { //Vanilla
ADDON[] = {
"ACE_10Rnd_762x54_Tracer_mag"
};
};
class CBA_762x54R_SVD {
ADDON[] = {
"ACE_10Rnd_762x54_Tracer_mag"
};
};
class CBA_762x54R_Mosin {
ADDON[] = {
"ACE_10Rnd_762x54_Tracer_mag"
};
};
class CBA_762x54R_SVT {
ADDON[] = {
"ACE_10Rnd_762x54_Tracer_mag"
};
};
class CBA_762x54R_DPM {
ADDON[] = {
"ACE_10Rnd_762x54_Tracer_mag"
};
};
class CBA_762x54R_DT {
ADDON[] = {
"ACE_10Rnd_762x54_Tracer_mag"
};
};
class CBA_762x54R_Maxim {
ADDON[] = {
"ACE_10Rnd_762x54_Tracer_mag"
};
};
};

View File

@ -28,6 +28,8 @@ class CfgWeapons {
// MX
class arifle_MX_Base_F: Rifle_Base_F {
magazineWell[] = {"CBA_65x39_MX", "CBA_65x39_MX_XL"};
class Single: Mode_SemiAuto {
dispersion = MOA_TO_RAD(0.90);
};
@ -58,7 +60,7 @@ class CfgWeapons {
dispersion = MOA_TO_RAD(1.12);
};
};
// F2000
class mk20_base_F: Rifle_Base_F {
class Single: Mode_SemiAuto {
@ -70,6 +72,18 @@ class CfgWeapons {
};
};
// P90 (1.86)
class SMG_03_TR_BASE: Rifle_Base_F {
ACE_barrelTwist = 228.6; // 1:9 inch twist
ACE_barrelLength = 407;
ACE_twistDirection = 1;
modes[] = {"Single"};
};
class SMG_03C_BASE: SMG_03_TR_BASE {
ACE_barrelLength = 264;
modes[] = {"Single", "FullAuto"};
};
// Noreen "Bad News" ULR
class DMR_02_base_F: Rifle_Long_Base_F {
class Single: Mode_SemiAuto {
@ -116,7 +130,7 @@ class CfgWeapons {
dispersion = MOA_TO_RAD(1.0);
};
};
// Cyrus
class DMR_05_base_F: Rifle_Long_Base_F {
class Single: Mode_SemiAuto {

View File

@ -1 +1,2 @@
PREP(statTextStatement_weaponMuzzleVelocity);
PREP(statTextStatement_magazineMuzzleVelocity);

View File

@ -17,6 +17,7 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgAmmo.hpp"
#include "CfgMagazines.hpp"
#include "CfgMagazineWells.hpp"
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"
#include "ACE_Arsenal_Stats.hpp"

View File

@ -0,0 +1,48 @@
#include "script_component.hpp"
/*
* Author: Alganthe
* Text statement for the magazine ammo muzzle velocity stat.
*
* Arguments:
* 0: Type what it is here <TYPE> (unused)
* 1: Item config path <CONFIG>
*
* Return Value:
* Display text <STRING>
*
* Public: No
*/
params ["", "_config"];
if (EGVAR(arsenal,currentLeftPanel) == 2002) then {
private _primaryMag = primaryWeaponMagazine EGVAR(arsenal,center);
[primaryWeapon EGVAR(arsenal,center), configName _config]
} else {
private _primaryMag = handgunMagazine EGVAR(arsenal,center);
[handgunWeapon EGVAR(arsenal,center), configName _config]
} params ["_weapon", "_magazine"];
if (_magazine isEqualTo "") then {
localize "str_empty";
} else {
private _weaponCfg = configFile >> "CfgWeapons" >> _weapon;
private _ammoCfg = (configFile >> "CfgAmmo" >> (getText (configFile >> "CfgMagazines" >> _magazine >> "ammo")));
private _barrelLength = getNumber (_weaponCfg >> "ACE_barrelLength");
private _muzzleVelocityTable = getArray (_ammoCfg >> "ACE_muzzleVelocities");
private _barrelLengthTable = getArray (_ammoCfg >> "ACE_barrelLengths");
if (_barrelLength != 0 && {count _muzzleVelocityTable > 0} && {count _barrelLengthTable > 0}) then {
private _muzzleVelocity = if (["ace_advanced_ballistics"] call EFUNC(common,isModLoaded)) then {
[_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
} else {
getNumber (_config >> "initSpeed")
};
format ["%1 m/s (%2 ft/s)", _muzzleVelocity toFixed 0, (_muzzleVelocity * 3.28084) toFixed 0]
} else {
localize "str_empty";
};
};

View File

@ -1,14 +1,14 @@
#include "script_component.hpp"
/*
* Author: Alganthe
* Text statement for the weapon muzzle velocity stat
* Text statement for the weapon muzzle velocity stat.
*
* Arguments:
* 0: Not used
* 1: item config path (CONFIG)
* 0: Type what it is here <TYPE> (unused)
* 1: Item config path <CONFIG>
*
* Return Value:
* String to display
* Display text <STRING>
*
* Public: No
*/
@ -34,7 +34,11 @@ if (_magazine isEqualTo "") then {
private _barrelLengthTable = getArray (_ammoCfg >> "ACE_barrelLengths");
if (_barrelLength != 0 && {count _muzzleVelocityTable > 0} && {count _barrelLengthTable > 0}) then {
private _muzzleVelocity = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
private _muzzleVelocity = if (["ace_advanced_ballistics"] call EFUNC(common,isModLoaded)) then {
[_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
} else {
getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed")
};
format ["%1 m/s (%2 ft/s)", _muzzleVelocity toFixed 0, (_muzzleVelocity * 3.28084) toFixed 0]
} else {

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Ballistics">
<!-- QBU -->
@ -2286,6 +2286,8 @@
<Japanese>銃身の転度</Japanese>
<Chinesesimp>膛线缠距</Chinesesimp>
<Chinese>膛線扭度</Chinese>
<Italian>Rigatura della canna</Italian>
<Polish>Gwintowanie lufy</Polish>
</Key>
<Key ID="STR_ACE_Ballistics_statBarrelLength">
<English>Barrel length</English>
@ -2293,6 +2295,8 @@
<Japanese>銃身長</Japanese>
<Chinesesimp>身管长度</Chinesesimp>
<Chinese>槍管長度</Chinese>
<Italian>Lunghezza della canna</Italian>
<Polish>Długość lufy</Polish>
</Key>
<Key ID="STR_ACE_Ballistics_statBallisticCoef">
<English>Ballistic coefficient</English>
@ -2300,6 +2304,8 @@
<Japanese>弾道係数</Japanese>
<Chinesesimp>弹道系数</Chinesesimp>
<Chinese>彈道係數</Chinese>
<Italian>Coefficente balistico</Italian>
<Polish>Współczynnik balistyczny</Polish>
</Key>
<Key ID="STR_ACE_Ballistics_statBulletMass">
<English>Bullet mass</English>
@ -2307,6 +2313,8 @@
<Japanese>弾丸重量</Japanese>
<Chinesesimp>弹头重量</Chinesesimp>
<Chinese>彈頭重量</Chinese>
<Italian>Massa del proiettile</Italian>
<Polish>Masa pocisku</Polish>
</Key>
<Key ID="STR_ACE_Ballistics_statMuzzleVelocity">
<English>Muzzle velocity</English>
@ -2314,6 +2322,8 @@
<Japanese>銃口初速</Japanese>
<Chinesesimp>枪口初速</Chinesesimp>
<Chinese>槍口初速</Chinese>
<Italian>Velocità iniziale</Italian>
<Polish>Prędkość wylotowa</Polish>
</Key>
</Package>
</Project>

View File

@ -1,7 +1,6 @@
PREP(addLoadCaptiveActions);
PREP(canApplyHandcuffs);
PREP(canEscortCaptive);
PREP(canFriskPerson);
PREP(canLoadCaptive);
PREP(canRemoveHandcuffs);
PREP(canStopEscorting);
@ -9,7 +8,6 @@ PREP(canSurrender);
PREP(canUnloadCaptive);
PREP(doApplyHandcuffs);
PREP(doEscortCaptive);
PREP(doFriskPerson);
PREP(doLoadCaptive);
PREP(doRemoveHandcuffs);
PREP(doUnloadCaptive);

View File

@ -1,5 +1,5 @@
#include "script_component.hpp"
#include "\a3\editor_f\Data\Scripts\dikCodes.h"
#include "\a3\ui_f\hpp\defineDIKCodes.inc"
["ace_settingsInitialized", {
// Hold on a little bit longer to ensure anims will work
@ -44,7 +44,7 @@ if (!hasInterface) exitWith {};
if ((_target distance ACE_player) > getNumber (configFile >> "CfgVehicles" >> "CAManBase" >> "ACE_Actions" >> "ACE_ApplyHandcuffs" >> "distance")) exitWith {false};
if ([ACE_player, _target] call FUNC(canApplyHandcuffs)) exitWith {
[QGVAR(setHandcuffed), [_target, true], _target] call CBA_fnc_targetEvent;
[ACE_player, _target] call FUNC(doApplyHandcuffs);
true
};
false

View File

@ -6,7 +6,7 @@ class CfgPatches {
units[] = {QGVAR(ModuleSettings), QGVAR(ModuleSurrender), QGVAR(ModuleHandcuffed)};
weapons[] = {"ACE_CableTie"};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ACE_Interaction"};
requiredAddons[] = {"ace_interaction"};
author = ECSTRING(common,ACETeam);
authors[] = {"commy2", "KoffeinFlummi"};
url = ECSTRING(main,URL);

View File

@ -1,24 +0,0 @@
#include "script_component.hpp"
/*
* Author: bux578
* Checks the conditions for being able to frisk a unit
*
* Arguments:
* 0: caller (player) <OBJECT>
* 1: target <OBJECT>
*
* Return Value:
* The return value <BOOL>
*
* Example:
* [player, bob] call ACE_captives_fnc_canFriskPerson
*
* Public: No
*/
params ["_unit", "_target"];
_target getVariable [QGVAR(isHandcuffed), false]
|| {_target getVariable [QGVAR(isSurrendering), false]}
|| {_target getVariable ["ACE_isSearchable", false]}
|| {_target getVariable ["ACE_isUnconscious", false]}

View File

@ -1,67 +0,0 @@
#include "script_component.hpp"
/*
* Author: bux578
* Open the select menu with the "personal" items of a frisked unit. It only shows "handgunWeapon", "uniformItems", "vestItems", "backpackItems" and "assignedItems" because every other item is visible on the character
*
* Arguments:
* 0: player unit <OBJECT>
* 1: unit <OBJECT>
*
* Return Value:
* None
*
* Example:
* [player, bob] call ACE_captives_fnc_doFristPerson;
*
* Public: No
*/
params ["_player", "_unit"];
private _weapon = currentWeapon _player;
if (_weapon == primaryWeapon _player && {_weapon != ""}) then {
[_player, "AmovPercMstpSlowWrflDnon", 0] call EFUNC(common,doAnimation);
};
private _listedItemClasses = [];
private _actions = [localize LSTRING(FriskMenuHeader), ""] call ACE_Interaction_fnc_prepareSelectMenu;
private _allGear = [];
if ((handgunWeapon _unit) != "") then {
_allGear pushBack (handgunWeapon _unit);
};
if (count (uniformItems _unit) > 0) then {
_allGear = _allGear + (uniformItems _unit);
};
if (count (vestItems _unit) > 0) then {
_allGear = _allGear + (vestItems _unit);
};
if (count (backpackItems _unit) > 0) then {
_allGear = _allGear + (backpackItems _unit);
};
if (count (assignedItems _unit) > 0) then {
_allGear = _allGear + (assignedItems _unit);
};
// Handgun
// Uniform Items
// Vest Items
// Backpack Items
// Assigned Items
{
if (!(_x in _listedItemClasses)) then {
private _item = configFile >> "CfgMagazines" >> _x;
if (isNil "_item" || str _item == "") then { //str _item ?
_item = configFile >> "CfgWeapons" >> _x;
};
_actions = [_actions, getText(_item >> "displayName"), getText(_item >> "picture"), _x] call ACE_Interaction_fnc_addSelectableItem;
_listedItemClasses pushBack _x;
};
} forEach (_allGear);
[_actions, {call ACE_Interaction_fnc_hideMenu;}, {call ACE_Interaction_fnc_hideMenu;}] call ACE_Interaction_fnc_openSelectMenu;
// don't need an "Ok" Button
ctrlShow [8860, false];

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Captives">
<Key ID="STR_ACE_Captives_DisplayName">
@ -9,6 +9,7 @@
<Chinesesimp>俘虏</Chinesesimp>
<Japanese>捕虜</Japanese>
<Korean>포로설정</Korean>
<Polish>Jeńcy</Polish>
</Key>
<Key ID="STR_ACE_Captives_SetCaptive">
<English>Take Prisoner</English>
@ -154,38 +155,6 @@
<Chinese>束線帶可以綁住俘虜</Chinese>
<Chinesesimp>束线带可以绑住俘虏</Chinesesimp>
</Key>
<Key ID="STR_ACE_Captives_FriskMenuHeader">
<English>Inventory of frisked person</English>
<German>Inventar der durchsuchten Person</German>
<French>Inventaire de la personne fouillé</French>
<Spanish>Inventario de la persona cacheada</Spanish>
<Hungarian>Motozott személy felszerelése</Hungarian>
<Czech>Inventář prohledávané osoby</Czech>
<Polish>Ekwipunek rewidowanej osoby</Polish>
<Russian>Инвентарь обысканного человека</Russian>
<Portuguese>Inventário da pessoa revistada</Portuguese>
<Italian>Inventario della persona perquisita</Italian>
<Japanese>捕虜の持ち物を確認する</Japanese>
<Korean>검문당한 사람의 소지품</Korean>
<Chinese>搜身選單</Chinese>
<Chinesesimp>搜身选单</Chinesesimp>
</Key>
<Key ID="STR_ACE_Captives_FriskPerson">
<English>Frisk person</English>
<German>Person durchsuchen</German>
<French>Fouiller la personne</French>
<Spanish>Cachear</Spanish>
<Czech>Prohledávaná osoba</Czech>
<Polish>Rewiduj osobę</Polish>
<Hungarian>Motozás</Hungarian>
<Russian>Обыскать человека</Russian>
<Portuguese>Revistar</Portuguese>
<Italian>Perquisisci la persona</Italian>
<Japanese>捕虜の持ち物</Japanese>
<Korean>검문당한사람</Korean>
<Chinese>搜身</Chinese>
<Chinesesimp>搜身</Chinesesimp>
</Key>
<Key ID="STR_ACE_Captives_StartSurrendering">
<English>Surrender</English>
<French>Se rendre</French>
@ -444,6 +413,7 @@
<Chinese>設置在游標下的單位成俘虜狀態</Chinese>
<Chinesesimp>设置在游标下的单位成俘虏状态。</Chinesesimp>
<Korean>커서의 병력을 포박합니다.</Korean>
<Polish>Ustawia jednostkę pod kursorem jako jeniec.</Polish>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_requireSurrenderAi_name">
<English>Require AI surrendering</English>
@ -453,6 +423,7 @@
<Chinese>需要AI先行投降</Chinese>
<Chinesesimp>需要AI先行投降</Chinesesimp>
<Korean>AI 항복 필요</Korean>
<Polish>Wymaga poddania się przez SI</Polish>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_requireSurrenderAi_description">
<English>Require AI to surrender before they can be arrested</English>
@ -462,6 +433,7 @@
<Chinese>在逮捕AI之前該AI必須先進入投降狀態</Chinese>
<Chinesesimp>在逮捕AI之前该AI必须先进入投降状态。</Chinesesimp>
<Korean>포박하기 전에 먼저 AI가 투항해야만 합니다.</Korean>
<Polish>Wymaga poddania się przez SI zanim aresztowanie będzie możliwe</Polish>
</Key>
</Package>
</Project>

View File

@ -94,58 +94,35 @@ GVAR(objectAction) = [
{locked _target < 2} &&
{alive _target} &&
{[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)} &&
{0 < {
private _type = typeOf _x;
private _hasCargoPublic = _x getVariable [QGVAR(hasCargo), false];
private _hasCargoConfig = getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) == 1;
(_hasCargoPublic || _hasCargoConfig) && {_x != _target} &&
{([_target, _x] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}
} count (nearestObjects [_player, GVAR(cargoHolderTypes), (MAX_LOAD_DISTANCE + 10)])}
{((nearestObjects [_target, GVAR(cargoHolderTypes), (MAX_LOAD_DISTANCE + 10)]) findIf {
private _hasCargoConfig = 1 == getNumber (configFile >> "CfgVehicles" >> typeOf _x >> QGVAR(hasCargo));
private _hasCargoPublic = _x getVariable [QGVAR(hasCargo), false];
(_hasCargoConfig || {_hasCargoPublic}) && {_x != _target} && {alive _x} && {locked _x < 2} &&
{([_target, _x] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}
}) > -1}
},
LINKFUNC(addCargoVehiclesActions)
] call EFUNC(interact_menu,createAction);
// find all remaining configured classes and init them, see XEH_preStart.sqf
private _vehicleClassesAddAction = call (uiNamespace getVariable [QGVAR(initializedVehicleClasses), {[]}]);
{
[_x, 0, ["ACE_MainActions"], GVAR(vehicleAction)] call EFUNC(interact_menu,addActionToClass);
} forEach _vehicleClassesAddAction;
GVAR(initializedVehicleClasses) append _vehicleClassesAddAction;
private _initVehicleClasses = ["ThingX", "LandVehicle", "Air", "Ship_F"];
private _initObjectClasses = ["ThingX", "StaticWeapon"];
private _objectClassesAddAction = call (uiNamespace getVariable [QGVAR(initializedItemClasses), {[]}]);
{
[_x, 0, ["ACE_MainActions"], GVAR(objectAction)] call EFUNC(interact_menu,addActionToClass);
} forEach _objectClassesAddAction;
GVAR(initializedItemClasses) append _objectClassesAddAction;
private _vehicleClassesAddClassEH = call (uiNamespace getVariable [QGVAR(vehicleClasses_classEH), {[]}]);
{
[_x, "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler;
} forEach _initVehicleClasses;
} forEach _vehicleClassesAddClassEH;
private _objectClassesAddClassEH = call (uiNamespace getVariable [QGVAR(objectClasses_classEH), {[]}]);
{
[_x, "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler;
} forEach _initObjectClasses;
// find all remaining configured classes and init them
{
private _class = configName _x;
// init vehicle
if (
1 == getNumber (_x >> QGVAR(hasCargo))
&& {{if (_class isKindOf _x) exitWith {false}; true} forEach _initVehicleClasses}
) then {
if (_class isKindOf "Static") then {
if (2 == getNumber (_x >> "scope")) then {
[_class, 0, ["ACE_MainActions"], GVAR(vehicleAction)] call EFUNC(interact_menu,addActionToClass);
GVAR(initializedVehicleClasses) pushBack _class;
};
} else {
[_class, "initPost", DFUNC(initVehicle), nil, nil, true] call CBA_fnc_addClassEventHandler;
_initVehicleClasses pushBack _class;
};
};
// init object
if (
1 == getNumber (_x >> QGVAR(canLoad))
&& {{if (_class isKindOf _x) exitWith {false}; true} forEach _initObjectClasses}
) then {
if (_class isKindOf "Static") then {
if (2 == getNumber (_x >> "scope")) then {
[_class, 0, ["ACE_MainActions"], GVAR(objectAction)] call EFUNC(interact_menu,addActionToClass);
GVAR(initializedItemClasses) pushBack _class;
};
} else {
[_class, "initPost", DFUNC(initObject), nil, nil, true] call CBA_fnc_addClassEventHandler;
_initObjectClasses pushBack _class;
};
};
} forEach ("true" configClasses (configFile >> "CfgVehicles"));
} forEach _objectClassesAddClassEH;

View File

@ -1,3 +1,49 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"
//See XEH_postInit.sqf
private _vehicleClasses_addClassEH = ["ThingX", "LandVehicle", "Air", "Ship_F"];
private _objectClasses_addClassEH = ["ThingX", "StaticWeapon"];
private _vehicleClasses_addAction = [];
private _itemClasses_addAction = [];
// find all remaining configured classes and init them
{
private _class = configName _x;
// init vehicle
if (
1 == getNumber (_x >> QGVAR(hasCargo))
&& {-1 == _vehicleClasses_addClassEH findIf {_class isKindOf _x}}
) then {
if (_class isKindOf "Static") then {
if (2 == getNumber (_x >> "scope")) then {
_vehicleClasses_addAction pushBackUnique _class;
};
} else {
_vehicleClasses_addClassEH pushBackUnique _class;
};
};
// init object
if (
1 == getNumber (_x >> QGVAR(canLoad))
&& {-1 == _objectClasses_addClassEH findIf {_class isKindOf _x}}
) then {
if (_class isKindOf "Static") then {
if (2 == getNumber (_x >> "scope")) then {
_itemClasses_addAction pushBackUnique _class;
};
} else {
_objectClasses_addClassEH pushBackUnique _class;
};
};
} forEach ("true" configClasses (configFile >> "CfgVehicles"));
uiNamespace setVariable [QGVAR(vehicleClasses_classEH), compileFinal str _vehicleClasses_addClassEH];
uiNamespace setVariable [QGVAR(objectClasses_classEH), compileFinal str _objectClasses_addClassEH];
uiNamespace setVariable [QGVAR(initializedVehicleClasses), compileFinal str _vehicleClasses_addAction];
uiNamespace setVariable [QGVAR(initializedItemClasses), compileFinal str _itemClasses_addAction];
TRACE_4("compiled",count _vehicleClasses_addClassEH,count _objectClasses_addClassEH,count _vehicleClasses_addAction,count _itemClasses_addAction);

View File

@ -25,7 +25,7 @@ private _statement = {
private _vehicles = (nearestObjects [_target, GVAR(cargoHolderTypes), (MAX_LOAD_DISTANCE + 10)]) select {
private _hasCargoConfig = 1 == getNumber (configFile >> "CfgVehicles" >> typeOf _x >> QGVAR(hasCargo));
private _hasCargoPublic = _x getVariable [QGVAR(hasCargo), false];
(_hasCargoConfig || {_hasCargoPublic}) && {_x != _target} &&
(_hasCargoConfig || {_hasCargoPublic}) && {_x != _target} && {alive _x} && {locked _x < 2} &&
{([_target, _x] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}
};

View File

@ -6,7 +6,7 @@
* Arguments:
* 0: Item <OBJECT or STRING>
* 1: Holder Object (Vehicle) <OBJECT>
* 2: Ignore interaction distance <BOOL>
* 2: Ignore interaction distance and stability checks <BOOL>
*
* Return Value:
* Can load in <BOOL>
@ -19,7 +19,7 @@
params [["_item", "", [objNull,""]], "_vehicle", ["_ignoreInteraction", false]];
if (speed _vehicle > 1 || {((getPos _vehicle) select 2) > 3}) exitWith {TRACE_1("vehicle not stable",_vehicle); false};
if ((!_ignoreInteraction) && {speed _vehicle > 1 || {((getPos _vehicle) select 2) > 3}}) exitWith {TRACE_1("vehicle not stable",_vehicle); false};
if (_item isEqualType objNull && {{alive _x && {getText (configFile >> "CfgVehicles" >> typeOf _x >> "simulation") != "UAVPilot"}} count crew _item > 0}) exitWith {
TRACE_1("item is occupied",_item);

View File

@ -7,7 +7,7 @@
* Arguments:
* 0: Item <OBJECT or STRING>
* 1: Vehicle <OBJECT>
* 2: Ignore interaction distance <BOOL>
* 2: Ignore interaction distance and stability checks <BOOL>
*
* Return Value:
* Object loaded <BOOL>

View File

@ -6,6 +6,7 @@
* Arguments:
* 0: Object <OBJECT>
* 1: Vehicle <OBJECT>
* 2: Show Hint <BOOL> (default: true)
*
* Return Value:
* Object unloaded <BOOL>
@ -16,7 +17,7 @@
* Public: No
*/
params ["_item", "_vehicle"];
params ["_item", "_vehicle", ["_showHint", true]];
TRACE_2("params",_item,_vehicle);
private _loaded = _vehicle getVariable [QGVAR(loaded), []];
@ -90,14 +91,16 @@ _itemObject setVelocity ((velocity _vehicle) vectorAdd ((vectorNormalized (vecto
}, 1, [_itemObject]] call CBA_fnc_addPerFrameHandler;
[
if (_showHint) then {
[
LSTRING(UnloadedItem),
getText (configFile >> "CfgVehicles" >> typeOf _itemObject >> "displayName"),
getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName")
],
3
] call EFUNC(common,displayTextStructured);
[
LSTRING(UnloadedItem),
getText (configFile >> "CfgVehicles" >> typeOf _itemObject >> "displayName"),
getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName")
],
3
] call EFUNC(common,displayTextStructured);
};
// Invoke listenable event
["ace_cargoUnloaded", [_item, _vehicle, "paradrop"]] call CBA_fnc_globalEvent;

View File

@ -39,22 +39,30 @@ if ([_object, _vehicle] call FUNC(canLoadItemIn)) then {
private _size = [_object] call FUNC(getSizeItem);
[
5 * _size,
GVAR(loadTimeCoefficient) * _size,
[_object, _vehicle],
{
TRACE_1("load finish",_this);
[objNull, _this select 0 select 0, true] call EFUNC(common,claim);
["ace_loadCargo", _this select 0] call CBA_fnc_localEvent;
},
{[objNull, _this select 0 select 0, true] call EFUNC(common,claim)},
{
TRACE_1("load fail",_this);
[objNull, _this select 0 select 0, true] call EFUNC(common,claim)
},
localize LSTRING(LoadingItem),
{true},
{
(_this select 0) params ["_item", "_target"];
(alive _target) && {locked _target < 2} && {alive _item}
&& {([_item, _target] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}
},
["isNotSwimming"]
] call EFUNC(common,progressBar);
_return = true;
} else {
private _displayName = getText (configFile >> "CfgVehicles" >> typeOf _object >> "displayName");
[[LSTRING(LoadingFailed), _displayName], 3.0] call EFUNC(common,displayTextStructured);
[[LSTRING(LoadingFailed), _displayName], 3] call EFUNC(common,displayTextStructured);
};
_return

View File

@ -70,17 +70,24 @@ if ([_item, GVAR(interactionVehicle), ACE_player] call FUNC(canUnloadItem)) then
private _size = [_item] call FUNC(getSizeItem);
[
5 * _size,
GVAR(loadTimeCoefficient) * _size,
[_item, GVAR(interactionVehicle), ACE_player],
{["ace_unloadCargo", _this select 0] call CBA_fnc_localEvent},
{},
{TRACE_1("unload finish",_this); ["ace_unloadCargo", _this select 0] call CBA_fnc_localEvent},
{TRACE_1("unload fail",_this);},
localize LSTRING(UnloadingItem),
{true},
{
(_this select 0) params ["_item", "_target", "_player"];
(alive _target)
&& {locked _target < 2}
&& {([_player, _target] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}
&& {_item in (_target getVariable [QGVAR(loaded), []])}
},
["isNotSwimming"]
] call EFUNC(common,progressBar);
} else {
private _itemClass = if (_item isEqualType "") then {_item} else {typeOf _item};
private _displayName = getText (configFile >> "CfgVehicles" >> _itemClass >> "displayName");
[[LSTRING(UnloadingFailed), _displayName], 3.0] call EFUNC(common,displayTextStructured);
[[LSTRING(UnloadingFailed), _displayName], 3] call EFUNC(common,displayTextStructured);
};

View File

@ -1,19 +1,26 @@
// CBA Settings [ADDON: ace_cargo]:
[
QGVAR(enable), "CHECKBOX",
[LSTRING(ModuleSettings_enable), LSTRING(ModuleSettings_enable_Description)],
[localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(openMenu)],
true, // default value
true, // isGlobal
[LELSTRING(OptionsMenu,CategoryLogistics), LLSTRING(openMenu)],
true,
true,
{[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)}
] call CBA_settings_fnc_init;
[
QGVAR(loadTimeCoefficient), "SLIDER",
[LSTRING(loadTimeCoefficient), LSTRING(loadTimeCoefficient_description)],
[LELSTRING(OptionsMenu,CategoryLogistics), LLSTRING(openMenu)],
[0, 10, 5, 1],
true,
{[QGVAR(loadTimeCoefficient), _this, true] call EFUNC(common,cbaSettings_settingChanged)}
] call CBA_settings_fnc_init;
[
QGVAR(paradropTimeCoefficent), "SLIDER",
[LSTRING(paradropTimeCoefficent), LSTRING(paradropTimeCoefficent_description)],
[localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(openMenu)],
[0,10,2.5,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)]
true, // isGlobal
{[QGVAR(paradropTimeCoefficent), _this] call EFUNC(common,cbaSettings_settingChanged)}
[LELSTRING(OptionsMenu,CategoryLogistics), LLSTRING(openMenu)],
[0, 10, 2.5, 1],
true,
{[QGVAR(paradropTimeCoefficent), _this, true] call EFUNC(common,cbaSettings_settingChanged)}
] call CBA_settings_fnc_init;

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Cargo">
<Key ID="STR_ACE_Cargo_loadObject">
@ -262,7 +262,7 @@
<English>The cargo space required to hold this object (-1 for unloadable)</English>
<German>Frachtraumgröße, welche zum Einladen dieses Objektes benötigt wird (-1 nicht einladbar)</German>
<Italian>Lo spazio del cargo necessita di mantenere questo oggetto (-1 per scaricabile)</Italian>
<Japanese>このオブジェクトを積載するのに必要なカーゴ スペース (-1 で積載不可)</Japanese>
<Japanese>オブジェクトを積載するのに必要なカーゴ スペース (-1 で積載不可)</Japanese>
<Chinese>此貨物會佔掉多少空間(設定-1的話此貨物就不能被裝載)</Chinese>
<Chinesesimp>此货物会占掉多少空间(设定-1的话此货物就不能被装载)</Chinesesimp>
<Polish>Wymagana przestrzeń ładunkowa dla tego obiektu (-1 dla niemożliwych do załadowania)</Polish>
@ -291,7 +291,7 @@
<Chinesesimp>此架飞机并无保持水平飞行</Chinesesimp>
</Key>
<Key ID="STR_ACE_Cargo_paradropTimeCoefficent">
<English>Paradrop Time Coffecient</English>
<English>Paradrop Time Coefficient</English>
<German>Türlast Zeitfaktor</German>
<Japanese>空中投下までの時間係数</Japanese>
<Italian>Coefficente Tempo Lancio Paracadute</Italian>
@ -312,5 +312,17 @@
<Polish>Modyfikator wskazujący jak dużo czasu potrzeba by zrzucić przedmiot na spadochronie.</Polish>
<Korean>화물을 공중 투하 하는데 얼마나 걸리는 시간 설정</Korean>
</Key>
<Key ID="STR_ACE_Cargo_loadTimeCoefficient">
<English>Load Time Coefficient</English>
<Japanese>積載時間の係数</Japanese>
<Polish>Współczynnik czasu załadowania</Polish>
<Italian>Coefficente Tempo Caricamento</Italian>
</Key>
<Key ID="STR_ACE_Cargo_loadTimeCoefficient_description">
<English>Modifies how long it takes to load/unload items.\nTime, in seconds, is the size of the item multiplied by this value.</English>
<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 quanto tempo ci impiega a caricare o scaricare gli oggetti.\n Tempo, in secondi, è la dimensione dell'oggetto moltiplicata per questo valore</Italian>
</Key>
</Package>
</Project>

View File

@ -4,23 +4,23 @@ class CfgAmmo {
class Chemlight_base;
class Chemlight_Blue: Chemlight_base {
timeToLive = 1500;
timeToLive = 28800; // 8h as per cyalume website
};
class Chemlight_Red: Chemlight_base {
timeToLive = 1800;
timeToLive = 43200; // 12h as per cyalume website
};
class Chemlight_Green: Chemlight_base {
timeToLive = 1800;
timeToLive = 43200;
};
class Chemlight_Yellow: Chemlight_base {
timeToLive = 1800;
timeToLive = 43200;
};
class ACE_G_Chemlight_Orange: Chemlight_base {
timeToLive = 1800;
timeToLive = 43200;
effectsSmoke = "ACE_ChemlightEffect_Orange";
model = "\A3\Weapons_f\chemlight\chemlight_yellow_lit";
};
@ -30,7 +30,7 @@ class CfgAmmo {
};
class ACE_G_Chemlight_White: Chemlight_base {
timeToLive = 1500;
timeToLive = 28800;
effectsSmoke = "ACE_ChemlightEffect_White";
model = "\A3\Weapons_f\chemlight\chemlight_yellow_lit";
};
@ -41,7 +41,7 @@ class CfgAmmo {
class ACE_G_Chemlight_HiRed: Chemlight_Red {
effectsSmoke = "ACE_ChemlightEffect_HiRed";
timeToLive = 300;
timeToLive = 1800;
};
class ACE_G_Chemlight_HiRed_Infinite: ACE_G_Chemlight_HiRed {
@ -50,35 +50,53 @@ class CfgAmmo {
class ACE_G_Chemlight_HiYellow: Chemlight_Yellow {
effectsSmoke = "ACE_ChemlightEffect_HiYellow";
timeToLive = 300;
timeToLive = 1800;
};
class ACE_G_Chemlight_HiYellow_Infinite: ACE_G_Chemlight_HiYellow {
timeToLive = 1e10;
};
class ACE_G_Chemlight_HiOrange: ACE_G_Chemlight_Orange {
effectsSmoke = "ACE_ChemlightEffect_HiOrange";
timeToLive = 300;
};
class ACE_G_Chemlight_HiOrange_Infinite: ACE_G_Chemlight_HiOrange {
timeToLive = 1e10;
};
class ACE_G_Chemlight_HiWhite: ACE_G_Chemlight_White {
effectsSmoke = "ACE_ChemlightEffect_HiWhite";
timeToLive = 1800;
};
class ACE_G_Chemlight_HiWhite_Infinite: ACE_G_Chemlight_HiWhite {
timeToLive = 1e10;
};
class ACE_G_Chemlight_HiBlue: Chemlight_Blue {
effectsSmoke = "ACE_ChemlightEffect_HiBlue";
timeToLive = 1800;
};
class ACE_G_Chemlight_HiBlue_Infinite: ACE_G_Chemlight_HiBlue {
timeToLive = 1e10;
};
class ACE_G_Chemlight_HiGreen: Chemlight_Green {
effectsSmoke = "ACE_ChemlightEffect_HiGreen";
timeToLive = 1800;
};
class ACE_G_Chemlight_HiGreen_Infinite: ACE_G_Chemlight_HiGreen {
timeToLive = 1e10;
};
class ACE_G_Chemlight_UltraHiOrange: ACE_G_Chemlight_Orange {
effectsSmoke = "ACE_ChemlightEffect_UltraHiOrange";
timeToLive = 300;
};
class ACE_G_Chemlight_HiWhite_Infinite: ACE_G_Chemlight_HiWhite {
class ACE_G_Chemlight_UltraHiOrange_Infinite: ACE_G_Chemlight_UltraHiOrange {
timeToLive = 1e10;
};
class ACE_G_Chemlight_IR: Chemlight_base {
ACE_Chemlight_IR = "ACE_Chemlight_IR_Dummy";
effectsSmoke = "ACE_ChemlightEffect_IR";
timeToLive = 1500;
model = "\A3\Weapons_f\chemlight\chemlight_blue_lit";
timeToLive = 28800;
model = "\A3\Weapons_f\chemlight\chemlight_blue_lit";
};
};

View File

@ -9,6 +9,15 @@
};
#define HI_ATTENUATION \
class Attenuation { \
constant = 0; \
linear = 0; \
quadratic = 20; \
hardLimitStart = 2.1; \
hardLimitEnd = 2.8; \
};
#define ULTRA_HI_ATTENUATION \
class Attenuation { \
constant = 0; \
linear = 0; \
@ -27,65 +36,73 @@ class CfgLights {
drawLight = 0;
intensity = 4000;
position[] = {0,0,0};
BASE_ATTENUATION
};
class ChemLight_Blue: ChemLight_Green {
color[] = {0,0.6,1,1};
diffuse[] = {0,0.6,1};
BASE_ATTENUATION
};
class ChemLight_Red: ChemLight_Green {
color[] = {1,0.1,0.1,1};
diffuse[] = {1,0.1,0.1};
BASE_ATTENUATION
};
class ChemLight_Yellow: ChemLight_Green {
color[] = {1,1,0.1,1};
diffuse[] = {1,1,0.1};
BASE_ATTENUATION
};
class ACE_ChemlightLight_Orange: ChemLight_Green {
color[] = {1,0.64,0,1};
diffuse[] = {1,0.4,0};
};
class ACE_ChemlightLight_White: ChemLight_Green {
color[] = {1,1,1,1};
diffuse[] = {1,1,1};
};
class ACE_ChemlightLight_HiRed: ChemLight_Red {
intensity = 12000;
intensity = 9000;
HI_ATTENUATION
};
class ACE_ChemlightLight_HiYellow: ChemLight_Yellow {
intensity = 12000;
intensity = 9000;
HI_ATTENUATION
};
class ACE_ChemlightLight_HiOrange: ACE_ChemlightLight_Orange {
intensity = 12000;
HI_ATTENUATION
};
class ACE_ChemlightLight_HiWhite: ACE_ChemlightLight_White {
intensity = 12000;
intensity = 9000;
HI_ATTENUATION
};
class ACE_ChemlightLight_HiBlue: ChemLight_Blue {
intensity = 9000;
HI_ATTENUATION
};
class ACE_ChemlightLight_HiGreen: ChemLight_Green {
intensity = 9000;
HI_ATTENUATION
};
class ACE_ChemlightLight_UltraHiOrange: ACE_ChemlightLight_Orange {
intensity = 12000;
ULTRA_HI_ATTENUATION
};
class ACE_ChemlightLight_IR: ChemLight_Green {
intensity = 0;
};

View File

@ -1,24 +1,23 @@
class CfgMagazines {
class SmokeShell;
class Chemlight_Green: Smokeshell {
ACE_Chemlight_Shield = "ACE_Chemlight_Shield_Green";
};
class Chemlight_Blue: Chemlight_Green {
ACE_Chemlight_Shield = "ACE_Chemlight_Shield_Blue";
};
class Chemlight_Red: Chemlight_Green {
ACE_Chemlight_Shield = "ACE_Chemlight_Shield_Red";
};
class Chemlight_Yellow: Chemlight_Green {
ACE_Chemlight_Shield = "ACE_Chemlight_Shield_Yellow";
};
class ACE_Chemlight_Orange: Chemlight_Green {
ACE_Attachable = "ACE_G_Chemlight_Orange";
ACE_Chemlight_Shield = "ACE_Chemlight_Shield_Orange";
@ -30,7 +29,7 @@ class CfgMagazines {
model = "\A3\Weapons_f\chemlight\chemlight_yellow";
picture = QPATHTOF(UI\ace_chemlight_orange_x_ca.paa);
};
class ACE_Chemlight_White: Chemlight_Green {
ACE_Attachable = "ACE_G_Chemlight_White";
ACE_Chemlight_Shield = "ACE_Chemlight_Shield_White";
@ -42,7 +41,7 @@ class CfgMagazines {
model = "\A3\Weapons_f\chemlight\chemlight_yellow";
picture = QPATHTOF(UI\ace_chemlight_white_x_ca.paa);
};
class ACE_Chemlight_HiRed: Chemlight_Red {
ACE_Attachable = "ACE_G_Chemlight_HiRed";
ACE_Chemlight_Shield = "";
@ -53,7 +52,7 @@ class CfgMagazines {
descriptionShort = CSTRING(HiRed_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_hired_x_ca.paa);
};
class ACE_Chemlight_HiYellow: Chemlight_Yellow {
ACE_Attachable = "ACE_G_Chemlight_HiYellow";
ACE_Chemlight_Shield = "";
@ -64,18 +63,7 @@ class CfgMagazines {
descriptionShort = CSTRING(HiYellow_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_hiyellow_x_ca.paa);
};
class ACE_Chemlight_HiOrange: ACE_Chemlight_Orange {
ACE_Attachable = "ACE_G_Chemlight_HiOrange";
ACE_Chemlight_Shield = "";
author = ECSTRING(common,ACETeam);
ammo = "ACE_G_Chemlight_HiOrange";
displayName = CSTRING(HiOrange_DisplayName);
displayNameShort = CSTRING(HiOrange_DisplayNameShort);
descriptionShort = CSTRING(HiOrange_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_hiorange_x_ca.paa);
};
class ACE_Chemlight_HiWhite: ACE_Chemlight_White {
ACE_Attachable = "ACE_G_Chemlight_HiWhite";
ACE_Chemlight_Shield = "";
@ -86,7 +74,48 @@ class CfgMagazines {
descriptionShort = CSTRING(HiWhite_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_hiwhite_x_ca.paa);
};
class ACE_Chemlight_HiBlue: Chemlight_Blue {
ACE_Attachable = "ACE_G_Chemlight_HiBlue";
ACE_Chemlight_Shield = "";
author = ECSTRING(common,ACETeam);
ammo = "ACE_G_Chemlight_HiBlue";
displayName = CSTRING(HiBlue_DisplayName);
displayNameShort = CSTRING(HiBlue_DisplayNameShort);
descriptionShort = CSTRING(HiBlue_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_hiblue_x_ca.paa);
};
class ACE_Chemlight_HiGreen: Chemlight_Green {
ACE_Attachable = "ACE_G_Chemlight_HiGreen";
ACE_Chemlight_Shield = "";
author = ECSTRING(common,ACETeam);
ammo = "ACE_G_Chemlight_HiGreen";
displayName = CSTRING(HiGreen_DisplayName);
displayNameShort = CSTRING(HiGreen_DisplayNameShort);
descriptionShort = CSTRING(HiGreen_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_higreen_x_ca.paa);
};
class ACE_Chemlight_UltraHiOrange: ACE_Chemlight_Orange {
ACE_Attachable = "ACE_G_Chemlight_UltraHiOrange";
ACE_Chemlight_Shield = "";
author = ECSTRING(common,ACETeam);
ammo = "ACE_G_Chemlight_UltraHiOrange";
displayName = CSTRING(UltraHiOrange_DisplayName);
displayNameShort = CSTRING(UltraHiOrange_DisplayNameShort);
descriptionShort = CSTRING(UltraHiOrange_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_ultrahiorange_x_ca.paa);
};
// Backwards compatibility
// has been removed in v3.12.4
class ACE_Chemlight_HiOrange: ACE_Chemlight_UltraHiOrange {
author = ECSTRING(common,ACETeam);
scope = 1;
scopeArsenal = 1;
};
class ACE_Chemlight_IR: Chemlight_Green {
ACE_Attachable = "ACE_Chemlight_IR_Dummy";
ACE_Chemlight_Shield = "";
@ -95,6 +124,6 @@ class CfgMagazines {
displayName = CSTRING(IR_DisplayName);
displayNameShort = CSTRING(IR_DisplayNameShort);
descriptionShort = CSTRING(IR_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_ir_x_ca.paa);
picture = QPATHTOF(UI\ace_chemlight_ir_x_ca.paa);
};
};

View File

@ -33,9 +33,9 @@ class CfgVehicles {
nvTarget = 1;
brightness = 0.2;
class NVGMarker {
diffuse[] = {0.1,0.1,0.1};
ambient[] = {0.01,0.01,0.01};
brightness = 0.015;
diffuse[] = {0.04,0.04,0.04};
ambient[] = {0.0001,0.0001,0.0001};
brightness = 0.12;
name = "pozicni blik";
drawLight = 0;
drawLightSize = 0;
@ -228,8 +228,10 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_Chemlight_White,20);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiRed,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiYellow,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiOrange,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiBlue,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiGreen,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiWhite,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_UltraHiOrange,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_IR,20);
};
};
@ -258,8 +260,10 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_Chemlight_White,20);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiRed,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiYellow,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiOrange,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiBlue,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiGreen,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_HiWhite,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_UltraHiOrange,10);
MACRO_ADDMAGAZINE(ACE_Chemlight_IR,20);
};
@ -286,4 +290,104 @@ class CfgVehicles {
};
};
};
class Module_F;
class ModuleChemlight_F: Module_F {
class Arguments {
class Type {
class values {
class Orange {
name= CSTRING(Orange_DisplayName);
value="ACE_G_Chemlight_Orange";
};
class White {
name= CSTRING(White_DisplayName);
value="ACE_G_Chemlight_White";
};
class HiRed {
name= CSTRING(HiRed_DisplayName);
value="ACE_G_Chemlight_HiRed";
};
class HiYellow {
name= CSTRING(HiYellow_DisplayName);
value="ACE_G_Chemlight_HiYellow";
};
class HiWhite {
name= CSTRING(HiWhite_DisplayName);
value="ACE_G_Chemlight_HiWhite";
};
class HiBlue {
name= CSTRING(HiBlue_DisplayName);
value="ACE_G_Chemlight_HiBlue";
};
class HiGreen {
name= CSTRING(HiGreen_DisplayName);
value="ACE_G_Chemlight_HiGreen";
};
class UltraHiOrange {
name= CSTRING(UltraHiOrange_DisplayName);
value="ACE_G_Chemlight_UltraHiOrange";
};
};
};
};
};
class ModuleChemlightBlue_F;
class ModuleChemlightOrange: ModuleChemlightBlue_F {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightOrange";
displayName = CSTRING(Orange_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_orange_x_ca.paa);
ammo = "ACE_G_Chemlight_Orange";
};
class ModuleChemlightWhite: ModuleChemlightOrange {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightWhite";
displayName = CSTRING(White_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_white_x_ca.paa);
ammo = "ACE_G_Chemlight_White";
};
class ModuleChemlightHiRed: ModuleChemlightOrange {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightHiRed";
displayName = CSTRING(HiRed_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_hired_x_ca.paa);
ammo = "ACE_G_Chemlight_HiRed";
};
class ModuleChemlightHiYellow: ModuleChemlightOrange {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightHiYellow";
displayName = CSTRING(HiYellow_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_hiyellow_x_ca.paa);
ammo = "ACE_G_Chemlight_HiYellow";
};
class ModuleChemlightHiWhite: ModuleChemlightOrange {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightHiWhite";
displayName = CSTRING(HiWhite_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_hiwhite_x_ca.paa);
ammo = "ACE_G_Chemlight_HiWhite";
};
class ModuleChemlightHiBlue: ModuleChemlightOrange {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightHiBlue";
displayName = CSTRING(HiBlue_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_hiblue_x_ca.paa);
ammo = "ACE_G_Chemlight_HiBlue";
};
class ModuleChemlightHiGreen: ModuleChemlightOrange {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightHiGreen";
displayName = CSTRING(HiGreen_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_higreen_x_ca.paa);
ammo = "ACE_G_Chemlight_HiGreen";
};
class ModuleChemlightUltraHiOrange: ModuleChemlightOrange {
author = ECSTRING(common,ACETeam);
_generalMacro = "ModuleChemlightUltraHiOrange";
displayName = CSTRING(UltraHiOrange_DisplayName);
portrait = QPATHTOF(UI\ace_chemlight_ultrahiorange_x_ca.paa);
ammo = "ACE_G_Chemlight_UltraHiOrange";
};
};

View File

@ -3,7 +3,7 @@ class CfgWeapons {
class GrenadeLauncher;
class Throw: GrenadeLauncher {
muzzles[] += {"ACE_Chemlight_OrangeMuzzle","ACE_Chemlight_WhiteMuzzle","ACE_Chemlight_HiRedMuzzle","ACE_Chemlight_HiYellowMuzzle","ACE_Chemlight_HiOrangeMuzzle","ACE_Chemlight_HiWhiteMuzzle","ACE_Chemlight_IRMuzzle"};
muzzles[] += {"ACE_Chemlight_OrangeMuzzle","ACE_Chemlight_WhiteMuzzle","ACE_Chemlight_HiRedMuzzle","ACE_Chemlight_HiYellowMuzzle","ACE_Chemlight_HiWhiteMuzzle", "ACE_Chemlight_HiBlueMuzzle", "ACE_Chemlight_HiGreenMuzzle","ACE_Chemlight_UltraHiOrangeMuzzle","ACE_Chemlight_IRMuzzle"};
class ThrowMuzzle;
@ -23,13 +23,22 @@ class CfgWeapons {
magazines[] = {"ACE_Chemlight_HiYellow"};
};
class ACE_Chemlight_HiOrangeMuzzle: ThrowMuzzle {
magazines[] = {"ACE_Chemlight_HiOrange"};
};
class ACE_Chemlight_HiWhiteMuzzle: ThrowMuzzle {
magazines[] = {"ACE_Chemlight_HiWhite"};
};
class ACE_Chemlight_HiBlueMuzzle: ThrowMuzzle {
magazines[] = {"ACE_Chemlight_HiBlue"};
};
class ACE_Chemlight_HiGreenMuzzle: ThrowMuzzle {
magazines[] = {"ACE_Chemlight_HiGreen"};
};
class ACE_Chemlight_UltraHiOrangeMuzzle: ThrowMuzzle {
magazines[] = {"ACE_Chemlight_UltraHiOrange"};
};
class ACE_Chemlight_IRMuzzle: ThrowMuzzle {
magazines[] = {"ACE_Chemlight_IR"};
};
@ -65,6 +74,7 @@ class CfgWeapons {
ACE_Flashlight_Colour = "green";
ACE_Flashlight_Beam = QPATHTOF(UI\chemlight_shield_beam_green_ca.paa);
ACE_Flashlight_Size = 0.8;
ACE_Flashlight_Sound = 0;
};
};
};
@ -74,12 +84,10 @@ class CfgWeapons {
displayName = CSTRING(Shield_Red_DisplayName);
descriptionShort = CSTRING(Shield_Red_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_shield_red_x_ca.paa);
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
class FlashLight {
class ItemInfo: ItemInfo {
class FlashLight: FlashLight {
ACE_Flashlight_Colour = "red";
ACE_Flashlight_Beam = QPATHTOF(UI\chemlight_shield_beam_red_ca.paa);
ACE_Flashlight_Size = 0.8;
};
};
};
@ -89,12 +97,10 @@ class CfgWeapons {
displayName = CSTRING(Shield_Blue_DisplayName);
descriptionShort = CSTRING(Shield_Blue_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_shield_blue_x_ca.paa);
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
class FlashLight {
class ItemInfo: ItemInfo {
class FlashLight: FlashLight {
ACE_Flashlight_Colour = "blue";
ACE_Flashlight_Beam = QPATHTOF(UI\chemlight_shield_beam_blue_ca.paa);
ACE_Flashlight_Size = 0.8;
};
};
};
@ -104,12 +110,10 @@ class CfgWeapons {
displayName = CSTRING(Shield_Yellow_DisplayName);
descriptionShort = CSTRING(Shield_Yellow_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_shield_yellow_x_ca.paa);
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
class FlashLight {
class ItemInfo: ItemInfo {
class FlashLight: FlashLight {
ACE_Flashlight_Colour = "yellow";
ACE_Flashlight_Beam = QPATHTOF(UI\chemlight_shield_beam_yellow_ca.paa);
ACE_Flashlight_Size = 0.8;
};
};
};
@ -119,12 +123,10 @@ class CfgWeapons {
displayName = CSTRING(Shield_Orange_DisplayName);
descriptionShort = CSTRING(Shield_Orange_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_shield_orange_x_ca.paa);
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
class FlashLight {
class ItemInfo: ItemInfo {
class FlashLight: FlashLight {
ACE_Flashlight_Colour = "orange";
ACE_Flashlight_Beam = QPATHTOF(UI\chemlight_shield_beam_orange_ca.paa);
ACE_Flashlight_Size = 0.8;
};
};
};
@ -134,12 +136,10 @@ class CfgWeapons {
displayName = CSTRING(Shield_White_DisplayName);
descriptionShort = CSTRING(Shield_White_DescriptionShort);
picture = QPATHTOF(UI\ace_chemlight_shield_white_x_ca.paa);
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
class FlashLight {
class ItemInfo: ItemInfo {
class FlashLight: FlashLight {
ACE_Flashlight_Colour = "white";
ACE_Flashlight_Beam = QPATHTOF(UI\chemlight_shield_beam_white_ca.paa);
ACE_Flashlight_Size = 0.8;
};
};
};

View File

@ -27,13 +27,6 @@ class ACE_ChemlightEffect_HiYellow {
};
};
class ACE_ChemlightEffect_HiOrange {
class Light1 {
simulation = "light";
type = "ACE_ChemlightLight_HiOrange";
};
};
class ACE_ChemlightEffect_HiWhite {
class Light1 {
simulation = "light";
@ -41,6 +34,27 @@ class ACE_ChemlightEffect_HiWhite {
};
};
class ACE_ChemlightEffect_HiBlue {
class Light1 {
simulation = "light";
type = "ACE_ChemlightLight_HiBlue";
};
};
class ACE_ChemlightEffect_HiGreen {
class Light1 {
simulation = "light";
type = "ACE_ChemlightLight_HiGreen";
};
};
class ACE_ChemlightEffect_UltraHiOrange {
class Light1 {
simulation = "light";
type = "ACE_ChemlightLight_UltraHiOrange";
};
};
class ACE_ChemlightEffect_IR {
class Light1 {
simulation = "light";

Binary file not shown.

Binary file not shown.

View File

@ -3,7 +3,7 @@
class CfgPatches {
class ADDON {
units[] = {"ACE_Box_Chemlights","ACE_Item_Chemlight_Shield","ACE_Item_Chemlight_Shield_Green","ACE_Item_Chemlight_Shield_Red","ACE_Item_Chemlight_Shield_Blue","ACE_Item_Chemlight_Shield_Yellow","ACE_Item_Chemlight_Shield_Orange","ACE_Item_Chemlight_Shield_White"};
units[] = {"ACE_Box_Chemlights","ACE_Item_Chemlight_Shield","ACE_Item_Chemlight_Shield_Green","ACE_Item_Chemlight_Shield_Red","ACE_Item_Chemlight_Shield_Blue","ACE_Item_Chemlight_Shield_Yellow","ACE_Item_Chemlight_Shield_Orange","ACE_Item_Chemlight_Shield_White","ModuleChemlightOrange","ModuleChemlightWhite","ModuleChemlightHiRed","ModuleChemlightHiYellow","ModuleChemlightHiWhite","ModuleChemlightHiBlue","ModuleChemlightHiGreen","ModuleChemlightUltraHiOrange"};
weapons[] = {"ACE_Chemlight_Shield", "ACE_Chemlight_Shield_Green","ACE_Chemlight_Shield_Red","ACE_Chemlight_Shield_Blue","ACE_Chemlight_Shield_Yellow","ACE_Chemlight_Shield_Orange","ACE_Chemlight_Shield_White"};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Chemlights">
<Key ID="STR_ACE_Chemlights_Action_Chemlights">
@ -14,7 +14,7 @@
</Key>
<Key ID="STR_ACE_Chemlights_Action_Prepare">
<English>Prepare %1</English>
<Japanese>%1 をつか</Japanese>
<Japanese>%1 を使</Japanese>
<Polish>Przygotuj %1</Polish>
<German>%1 vorbereiten</German>
<Korean>%1 준비</Korean>
@ -25,7 +25,7 @@
</Key>
<Key ID="STR_ACE_Chemlights_Action_Prepare_Done">
<English>%1&lt;br/&gt;Prepared</English>
<Japanese>%1&lt;br/&gt;つかった</Japanese>
<Japanese>%1&lt;br/&gt;使った</Japanese>
<Polish>%1&lt;br/&gt;Przygotowany</Polish>
<German>%1&lt;br/&gt;vorbereitet</German>
<Korean>%1&lt;br/&gt;준비됨</Korean>
@ -150,15 +150,15 @@
<Chinesesimp>超亮红色光</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiRed_DescriptionShort">
<English>Type: Light - Red Hi (5 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<Japanese>種類: 照明 - 高輝度 赤 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe czerwone (5 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<German>Typ: Licht - rot, hell (5 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Korean>종류: 밝은 빨간색 (5분)&lt;br /&gt;수량: 1&lt;br /&gt;사용처: 손</Korean>
<French>Type: Lumière - rouge Hi (5 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Italian>Tipo: Luce - Rossa Hi (5 minuti)&lt;br /&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
<Chinese>類型: 光 - 超亮紅色 (5分鐘)&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 手</Chinese>
<Chinesesimp>类型: 光 - 超亮红色 (5分钟)&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 手</Chinesesimp>
<English>Type: Light - Red Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<Japanese>種類: 照明 - 高輝度 赤 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe czerwone (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<German>Typ: Licht - rot, hell (30 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Korean>종류: 밝은 빨간색 (30분)&lt;br /&gt;수량: 1&lt;br /&gt;사용처: 손</Korean>
<French>Type: Lumière - rouge Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Italian>Tipo: Luce - Rossa Hi (30 minuti)&lt;br /&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
<Chinese>類型: 光 - 超亮紅色 (30分鐘)&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 手</Chinese>
<Chinesesimp>类型: 光 - 超亮红色 (30分钟)&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 手</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiYellow_DisplayName">
<English>Chemlight (Hi Yellow)</English>
@ -183,48 +183,15 @@
<Chinesesimp>超亮黄色光</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiYellow_DescriptionShort">
<English>Type: Light - Yellow Hi (5 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<Japanese>種類: 照明 - 高輝度 黄 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe żółte (5 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<German>Typ: Licht - gelb, hell (5 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Korean>종류:밝은 노란색 (5분)&lt;br /&gt;수량: 1&lt;br /&gt;사용처: Hand</Korean>
<French>Type: Lumière - Jaune Hi (5 minutes)Nbre: 1&lt;br /&gt; À main</French>
<Italian>Tipo: Luce - Gialla Hi (5 minuti)&lt;br /&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
<Chinese>類型: 光 - 超亮黃色 (5分鐘)&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 手</Chinese>
<Chinesesimp>类型: 光 - 超亮黄色 (5分钟)&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 手</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiOrange_DisplayName">
<English>Chemlight (Hi Orange)</English>
<Japanese>ケミライト (高輝度 オレンジ)</Japanese>
<Polish>Świetlik (jaskrawy pomarańczowy)</Polish>
<German>Knicklicht (orange, hell)</German>
<Korean>켐라이트 (밝은 주황색)</Korean>
<French>Cyalume (Hi orange)</French>
<Italian>Luce chimica (Hi Arancione)</Italian>
<Chinese>螢光棒 (超亮橘色)</Chinese>
<Chinesesimp>萤光棒 (超亮橘色)</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiOrange_DisplayNameShort">
<English>Orange Hi Light</English>
<Japanese>高輝度のオレンジ</Japanese>
<Polish>Jaskrawe pomarańczowe światło</Polish>
<German>Helles, oranges Knicklicht</German>
<Korean>밝은 주황색</Korean>
<French>Lum. orange haute intensité</French>
<Italian>Luce Hi Arancione</Italian>
<Chinese>超亮橘色光</Chinese>
<Chinesesimp>超亮橘色光</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiOrange_DescriptionShort">
<English>Type: Light - Orange Hi (5 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<Japanese>種類: 照明 - 高輝度 オレンジ (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe pomarańczowe (5 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<German>Typ: Licht - orange, hell (5 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Korean>종류: 밝은 주황색 (5분)&lt;br /&gt;수량: 1&lt;br /&gt;사용처: 손</Korean>
<French>Type: Lumière - orange Hi (5 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Italian>Tipo: Luce - Arancione Hi (5 minuti)&lt;br /&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
<Chinese>類型: 光 - 超亮橘色 (5分鐘)&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 手</Chinese>
<Chinesesimp>类型: 光 - 超亮橘色 (5分钟)&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 手</Chinesesimp>
<English>Type: Light - Yellow Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<Japanese>種類: 照明 - 高輝度 黄 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe żółte (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<German>Typ: Licht - gelb, hell (30 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Korean>종류:밝은 노란색 (30분)&lt;br /&gt;수량: 1&lt;br /&gt;사용처: Hand</Korean>
<French>Type: Lumière - Jaune Hi (30 minutes)Nbre: 1&lt;br /&gt; À main</French>
<Italian>Tipo: Luce - Gialla Hi (30 minuti)&lt;br /&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
<Chinese>類型: 光 - 超亮黃色 (30分鐘)&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 手</Chinese>
<Chinesesimp>类型: 光 - 超亮黄色 (30分钟)&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 手</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiWhite_DisplayName">
<English>Chemlight (Hi White)</English>
@ -249,15 +216,78 @@
<Chinesesimp>超亮白色光</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiWhite_DescriptionShort">
<English>Type: Light - White Hi (5 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<Japanese>種類: 照明 - 高輝度 白 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe białe (5 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<German>Typ: Licht - weiß, hell (5 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Korean>종류: 밝은 하얀색 (5분)&lt;br /&gt;수량: 1&lt;br /&gt;사용처: 손</Korean>
<French>Type: Lumière - blanche Hi (5 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Italian>Tipo: Luce - Bianca Hi (5 minuti)&lt;br /&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
<Chinese>類型: 光 - 超亮白色 (5分鐘)&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 手</Chinese>
<Chinesesimp>类型: 光 - 超亮白色 (5分钟)&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 手</Chinesesimp>
<English>Type: Light - White Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<Japanese>種類: 照明 - 高輝度 白 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe białe (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<German>Typ: Licht - weiß, hell (30 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Korean>종류: 밝은 하얀색 (30분)&lt;br /&gt;수량: 1&lt;br /&gt;사용처: 손</Korean>
<French>Type: Lumière - blanche Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Italian>Tipo: Luce - Bianca Hi (30 minuti)&lt;br /&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
<Chinese>類型: 光 - 超亮白色 (30分鐘)&lt;br /&gt;發數: 1&lt;br /&gt;使用於: 手</Chinese>
<Chinesesimp>类型: 光 - 超亮白色 (30分钟)&lt;br /&gt;发数: 1&lt;br /&gt;使用于: 手</Chinesesimp>
</Key>
<Key ID="STR_ACE_Chemlights_HiBlue_DisplayName">
<English>Chemlight (Hi Blue)</English>
<French>Cyalume (Hi Bleu)</French>
<Japanese>ケミライト (高輝度 青)</Japanese>
<Polish>Świetlik (jaskrawy niebieski)</Polish>
<Italian>Luce chimica (Hi Blu)</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_HiBlue_DisplayNameShort">
<English>Blue Hi Light</English>
<French>Lum. bleue haute intensité</French>
<Japanese>高輝度の青色</Japanese>
<Polish>Jaskrawe niebieskie światło</Polish>
<Italian>Luce Hi Blu</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_HiBlue_DescriptionShort">
<English>Type: Light - Blue Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<French>Type: Lumière - bleue Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Japanese>種類: 照明 - 高輝度 青 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe niebieskie (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<Italian>Tipo: Luce - Hi blu (30 minuti)&lt;br/&gt;Rimanenti:1 &lt;br/&gt;Usata in: Mano</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_HiGreen_DisplayName">
<English>Chemlight (Hi Green)</English>
<French>Cyalume (Hi Vert)</French>
<Japanese>ケミライト (高輝度 緑)</Japanese>
<Polish>Świetlik (jaskrawy zielony)</Polish>
<Italian>Luce chimica (Hi Verde)</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_HiGreen_DisplayNameShort">
<English>Green Hi Light</English>
<French>Lum. verte haute intensité</French>
<Japanese>高輝度の青色</Japanese>
<Polish>Jaskrawe zielone światło</Polish>
<Italian>Luce Hi Verde</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_HiGreen_DescriptionShort">
<English>Type: Light - Green Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<French>Type: Lumière - verte Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Japanese>種類: 照明 - 高輝度 緑 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe zielone (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<Italian>Tipo: Luce - Hi verde (30 minuti)&lt;br/&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_UltraHiOrange_DisplayName">
<English>Chemlight (Ultra-Hi Orange)</English>
<French>Cyalume (Ultra-Hi orange)</French>
<Japanese>ケミライト (高輝度 オレンジ)</Japanese>
<Polish>Świetlik (ultra-jaskrawy pomarańczowy)</Polish>
<Italian>Luce chimica (Ultra-Hi Arancione)</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_UltraHiOrange_DisplayNameShort">
<English>Orange Ultra-Hi Light</English>
<French>Lum. orange ultra haute intensité</French>
<Japanese>ウルトラ高輝度のオレンジ色</Japanese>
<Polish>Ultra-jaskrawe pomarańczowe światło</Polish>
<Italian>Luce Ultra-Hi Arancione</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_UltraHiOrange_DescriptionShort">
<English>Type: Light - Orange Ultra-Hi (5 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<French>Type: Lumière - Orange Ultra-Hi (5 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<Japanese>種類: 照明 - ウルトラ高輝度 オレンジ (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - ultra-jaskrawe pomarańczowe (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<Italian>Tipo: Luce - Ultra-Hi (5 minuti)&lt;br/&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
</Key>
<Key ID="STR_ACE_Chemlights_IR_DisplayName">
<English>Chemlight (IR)</English>
@ -437,7 +467,7 @@
</Key>
<Key ID="STR_ACE_Chemlights_Shield_White_DescriptionShort">
<English>White reading light.</English>
<Japanese>白の照明。</Japanese>
<Japanese>の照明。</Japanese>
<Polish>Biała lampka.</Polish>
<German>Weißes Leselicht.</German>
<Korean>주황색 조명</Korean>

View File

@ -6,7 +6,7 @@ class RscInGameUI {
};
class RscUnitInfoSoldier: RscUnitInfo {
onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgSoldier', _this select 0)];);
onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgSoldier', _this select 0)]; [ARR_2('ace_infoDisplayChanged', [ARR_2(_this select 0, 'Soldier')])] call CBA_fnc_localEvent;);
};
class RscUnitInfoTank: RscUnitInfo {
@ -94,7 +94,7 @@ class RscInGameUI {
};
class RscUnitInfoParachute: RscUnitInfo {
onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgParachute', _this select 0)];);
onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscUnitInfo"",'IGUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable [ARR_2('ACE_dlgParachute', _this select 0)]; [ARR_2('ace_infoDisplayChanged', [ARR_2(_this select 0, 'Parachute')])] call CBA_fnc_localEvent;);
};
class RscUnitVehicle {

View File

@ -65,6 +65,7 @@ PREP(getFirstObjectIntersection);
PREP(getFirstTerrainIntersection);
PREP(getGunner);
PREP(getInPosition);
PREP(getLocalUnits);
PREP(getMapData);
PREP(getMapGridData);
PREP(getMapGridFromPos);
@ -156,6 +157,7 @@ PREP(setPitchBankYaw);
PREP(setPlayerOwner);
PREP(setProne);
PREP(setSetting);
PREP(setupLocalUnitsHandler);
PREP(setVariableJIP);
PREP(setVariablePublic);
PREP(setVolume);

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